kylin-Nginx高可用--keepalived
keepalived高可用
一、基本概述
- 什么是高可用?
一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。
- keepalived是如何实现高可用的?
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题
二、环境准备
两台负载均衡机器:lb01 lb02-backup
两台负载均衡的配置一模一样,地址池指向两台已经部署了WordPress业务的web服务器
三、部署keepalived(默认为抢占式)
| 作用 | IP | 角色 |
|---|---|---|
| node1 | 10.0.0.5 | Master |
| node2 | 10.0.0.6 | Backup |
| VIP | 10.0.0.3 | 虚拟IP |
lb01(主)部署
第一步:下载keepalived服务
[root@lb01 ~]# yum install -y keepalived
第二步:编辑配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
第三步:启动服务
[root@lb01 ~]# systemctl restart keepalived.service
[root@lb01 ~]# systemctl enable keepalived.service
lb02(备)部署
第一步:下载keepalived服务
[root@lb02 ~]# yum install -y keepalived
第二步:编辑配置文件
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb02 #标识身份->名称
}
vrrp_instance VI_1 {
state BACKUP #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 100 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
第三步:启动服务
[root@lb02 ~]# systemctl restart keepalived.service
[root@lb02 ~]# systemctl enable keepalived.service
对比master与Backup的keepalived配置区别
| Keepalived配置区别 | Master节点配置 | Backup节点配置 |
|---|---|---|
| route_id(唯一标识) | lb01 | lb02 |
| state(角色状态) | MASTER | BACKUP |
| priority(竞选优先级) | 150 | 100 |
测试
1.在上述配置中由于lb1的优先级高于lb2,所以VIP在节点1上面
[root@lb01 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
[root@lb02 ~]# ip addr | grep 10.0.0.3
[root@lb02 ~]#
2.测试lb1的keepalived服务down掉,lb02会自动接管
[root@lb01 ~]# systemctl stop keepalived.service
[root@lb01 ~]# ip addr | grep 10.0.0.3
[root@lb01 ~]#
[root@lb02 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
3.重新启动lb1的keepalived服务,VIP会被抢占
[root@lb01 ~]# systemctl restart keepalived.service
[root@lb01 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
[root@lb02 ~]# ip addr | grep 10.0.0.3
[root@lb02 ~]#
四、keepalived非抢占式配置
| Keepalived配置 | Master节点配置 | Backup节点配置 |
|---|---|---|
| route_id(唯一标识) | lb01 | lb02 |
| state(角色状态) | BACKUP | BACKUP |
| priority(竞选优先级) | 150 | 100 |
| nopreempt | vrrp_instance VI_1中配置 | vrrp_instance VI_1中配置 |
lb01配置文件
#其余配置不变
#修改、添加一下内容
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
lb02配置文件
#其余配置不变
#修改、添加一下内容
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
测试
1.Linux中查看VIP Windows中查看arp表10.0.0.3的mac地址
#Linux:
[root@lb01 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
[root@lb02 ~]# ip addr | grep 10.0.0.3
[root@lb02 ~]#
#Windows(此处mac地址与应与lb01的ens33网卡的mac地址相同)
接口: 10.0.0.1 --- 0x6
Internet 地址 物理地址 类型
10.0.0.3 00-0c-29-db-90-e8 动态
2.停用lb1的keepalived服务,继续查看
[root@lb01 ~]# systemctl stop keepalived.service
#Linux:
[root@lb01 ~]# ip addr | grep 10.0.0.3
[root@lb01 ~]#
[root@lb02 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
#Windows(此处mac地址与应与lb02的ens33网卡的mac地址相同)
接口: 10.0.0.1 --- 0x6
Internet 地址 物理地址 类型
10.0.0.3 00-0c-29-e0-dd-99 动态
五、keepalived故障:脑裂
脑裂故障原因
1.服务器网线松动等网络故障
2.服务器硬件故障发生损坏现象而崩溃
3.主备都开启firewalld防火墙
解决脑裂故障方案
- 如果发生闹裂,则随机kill掉一台即可
- 在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
ping -c 2 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 5
done
六、Keepalived结合Nginx
为什么域名解析到VIP就可以访问nginx?
Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,所以可以访问到nginx所在机器
但是…..如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill掉keepalive
如何配置?
抢占式:仅需在master配置即可
非抢占式:两台服务器都要配置
第一步:编写脚本
[root@lb01 ~]# cat check_web.sh
#!/bin/bash
Nginx=`netstat -tanulp|grep 80|wc -l`
if [ $Nginx -eq 0 ];then
systemctl restart nginx
Nginx=`netstat -tanulp|grep 80|wc -l`
if [ $Nginx -eq 0 ];then
systemctl stop keepalived
fi
fi
第二步:执行权限给脚本
[root@lb01 ~]# chmod +x check_web.sh
第三步:将脚本写入到角色为MASTER的keepalived配置文件中
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_script check_web { #配置脚本
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
……
track_script {
check_web
}
}
第四步:重启服务
[root@lb01 ~]# systemctl restart keepalived
七、实现keepalived双主架构
1.规划
假设我们有两套业务(WordPress和phpmyadmin),配置完keepalived后,我们发现,如果主lb01一直没有down机,那么另一台备lb02一直处于闲置状态,浪费资源;
为了节省合理运用资源,我们将做出如下规划:
| 主机名 | WordPress | phpmyadmin |
|---|---|---|
| lb01 | MASTER | BACKUP |
| lb02 | BACKUP | MASTER |
2.具体配置
具体配置如下:
#lb01配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_script check_web { #配置脚本
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id,每个实例定义块id不能相同!
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3/24 dev ens33 label ens33:1
}
track_script { #引用脚本
check_web
}
}
vrrp_instance VI_2 {
state BACKUP #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 51 #虚拟路由id,每个实例定义块id不能相同!
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.2/24 dev ens33 label ens33:2
}
}
------------------------------------------------------------
#lb02配置
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb02 #标识身份->名称
}
vrrp_script check_web { #配置脚本
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 100 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3/24 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state MASTER #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 51 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.2/24 dev ens33 label ens33:2
}
track_script { #引用脚本
check_web
}
}
3.配置区别
| 主机名 | 实例定义块 | 对应业务 | 角色状态 | 虚拟路由id | virtual_ipaddress |
|---|---|---|---|---|---|
| lb01 | vrrp_instance VI_1 | WordPress主 | MASTER | 50 | 10.0.0.3/24 dev ens33 label ens33:1 |
| lb01 | vrrp_instance VI_2 | phpmyadmin备 | BACKUP | 51 | 10.0.0.2/24 dev ens33 label ens33:2 |
| lb02 | vrrp_instance VI_1 | WordPress备 | MASTER | 50 | 10.0.0.3/24 dev ens33 label ens33:1 |
| lb02 | vrrp_instance VI_2 | phpmyadmin主 | BACKUP | 51 | 10.0.0.2/24 dev ens33 label ens33:2 |
4.检查
[root@lb01 ~]# ifconfig | grep -A 2 ens33:1:
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.3 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:db:90:e8 txqueuelen 1000 (Ethernet)
[root@lb01 ~]# ifconfig | grep -A 2 ens33:2:
-----------------------------------------------------------------
[root@lb02 ~]# ifconfig | grep -A 2 ens33:1:
[root@lb02 ~]# ifconfig | grep -A 2 ens33:2:
ens33:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.2 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:e0:dd:99 txqueuelen 1000 (Ethernet)
5.Windows做本地解析模拟
10.0.0.2 php.dezyan.com
10.0.0.3 wp.dezyan.com
6.浏览器访问测试
访问php.dezyan.com---> F12查看来源应是10.0.0.2
访问wp.dezyan.com----> F12查看来源应是10.0.0.3
本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18784460

浙公网安备 33010602011771号