keepalived高可用部署
测试使用5台
cat /etc/hosts
192.168.40.20 ? lb01 ?# 主
192.168.40.21 ? lb02 ?# 从
192.168.40.22 ? web01
192.168.40.23 ? web02
192.168.40.24 ? web03
1 修改ip 主机名
# 其他主机设置相同略
hostnamectl set-hostname lb01
nmcli c mod eth1 ipv4.addr "192.168.40.20/24"
nmcli d reapply eth1
ifconfig
# 系统优化,请参考:https://blog.51cto.com/lehappy/2781516
# nginx负载均衡部署,请参考: https://blog.51cto.com/lehappy/2936456
2 安装 keepalived (lb01 lb02)都要操作
[root@lb01 ~]#yum -y install keepalived
3 编写配置文件 (lb01 lb02)都要操作
[root@lb01 ~]#cat /etc/keepalived/keepalived.conf?
# 分为三部分 ? global--全局 ?vrrp--实例配置 lvs--lvs服务
# 配置详细说明
global_defs { ? ? ? ? ? ? ?# 全局
? ?notification_email { ? ?# 设置发送邮件的收件人
? ? ?acassen@firewall.loc
? ? ?failover@firewall.loc
? ? ?sysadmin@firewall.loc
? ?}
? ?notification_email_from Alexandre.Cassen@firewall.loc ?# 设置连接邮件服务器信息
? ?smtp_server 192.168.200.1
? ?smtp_connect_timeout 30
? ?router_id LVS_DEVEL ? ? # 主机身份标识,名称必须唯一 ***
? ?vrrp_skip_check_adv_addr
? ?vrrp_strict
? ?vrrp_garp_interval 0
? ?vrrp_gna_interval 0
} ? ? ? ? ? ? ? ? ? ? ? ? ?# 邮件可切换为微信或监控软件,但router_id信息必须要设置
vrrp_instance VI_1 { ? ? ? # vrrp实例配置,名称为VI_1
? ? state MASTER ? ? ? ? ? # 当前角色(MASTER,BACKUP)必须大写
? ? interface eth0 ? ? ? ? # 对外提供的网络接口,一般服务器有2至4个接口,不要选择错误
? ? virtual_router_id 51 ? # 虚拟路由id标识(最好是数字),并且在一个keepalived.conf文件中必须一致,否则出现脑裂
? ? priority 100 ? ? ? ? ? # 优先级,数字越大优先级越高,MASTER要高于BACKUP,建议间隔为50
? ? advert_int 1 ? ? ? ? ? # 同步通知间隔,MASTER与BACKUP通信检查时间间隔,单位秒
? ? authentication { ? ? ? #?
? ? ? ? auth_type PASS ? ? # 认证,官方推荐使用类型为PASS,长度不要超过8个字符,建议用4位数字,
? ? ? ? auth_pass 1111 ? ? # 相同vrrp_instance实例的MASTER与BACKUP使用相同密码才能正常通信
? ? }
? ? virtual_ipaddress { ? ?# 为虚拟ip,可配置多个,每个ip占一行,配置时最好指定子网以及虚拟ip绑定的网络接口
? ? ? ? 192.168.200.16 ? ? # 这个虚拟ip就是在工作中需要和域名绑定的ip,即和配置高可用服务监听的ip要保持一致
? ? ? ? 192.168.200.17
? ? ? ? 192.168.200.18
? ? }
}
...后面是lvs服务,略
# lb01?
[root@lb01 /etc/keepalived]#cat keepalived.conf
! Configuration File for keepalived
global_defs {
? ?router_id lb01
}
vrrp_instance web { ? # 实例名称为 web
? ? state MASTER
? ? interface eth1
? ? virtual_router_id 51
? ? priority 150
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.40.254
? ? ? ? # 192.168.40.254/24 dev eth1 label eth1:1 # 配置时最好指定子网以及虚拟ip绑定的网络接口
? ? }
}
# lb02
[root@lb02 /etc/keepalived]#cat keepalived.conf
! Configuration File for keepalived
global_defs {
? ?router_id lb02 ? ? ? ? # 不同lb01
}
vrrp_instance web {
? ? state BACKUP ? ? ? ? ?# 不同lb01 ? ??
? ? interface eth1
? ? virtual_router_id 51
? ? priority 100 ? ? ? ? ?# 不同lb01
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.40.254
? ? ? ? # 192.168.40.254/24 dev eth1 label eth1:1 # 配置时最好指定子网以及虚拟ip绑定的网络接口
? ? }
}
4 设置开机启动并测试(lb01 lb02)都要操作
[root@lb01 /etc/keepalived]#systemctl start keepalived
[root@lb01 /etc/keepalived]#systemctl enable keepalived ?
4.1 测试lb01为主,lb02为从
[root@lb01 /etc/keepalived]#ip a | grep 192.168.40
? ? inet 192.168.40.20/24 brd 192.168.40.255 scope global noprefixroute eth1
? ? inet 192.168.40.254/32 scope global eth1 ? ? ? # lb01 有虚拟ip
[root@lb02 /etc/keepalived]#ip a|grep 192.168.40
? ? inet 192.168.40.21/24 brd 192.168.40.255 scope global noprefixroute eth1 ?# lb02 没有虚拟ip
? ??
4.2 测试停止lb01的keepalived服务,lb02为变为主
[root@lb01 /etc/keepalived]#systemctl stop keepalived
[root@lb01 /etc/keepalived]#ip a | grep 192.168.40
? ? inet 192.168.40.20/24 brd 192.168.40.255 scope global noprefixroute eth1 # lb01 没有虚拟ip
[root@lb02 /etc/keepalived]#ip a|grep 192.168.40
? ? inet 192.168.40.21/24 brd 192.168.40.255 scope global noprefixroute eth1
? ? inet 192.168.40.254/32 scope global eth1 ? ? ?# lb02 有虚拟ip
4.3 测试开启lb01的keepalived服务,lb01为主,lb02为从
[root@lb01 /etc/keepalived]#systemctl start keepalived
[root@lb01 /etc/keepalived]#ip a | grep 192.168.40
? ? inet 192.168.40.20/24 brd 192.168.40.255 scope global noprefixroute eth1
? ? inet 192.168.40.254/32 scope global eth1 ? # lb01 有虚拟ip
[root@lb02 /etc/keepalived]#ip a|grep 192.168.40
? ? inet 192.168.40.21/24 brd 192.168.40.255 scope global noprefixroute eth1
5 修改客户端hosts文件(lb01 lb02)都要操作?
# windows路径为 c:\windows\system32\drivers\etc\hosts
[root@lb02 /etc/keepalived]#vi /etc/hosts
192.168.40.254 ?www.jjyy.com jjyy.com
# 测试负载均衡正常
[root@lb01 /etc/keepalived]#curl jjyy.com
web03
[root@lb01 /etc/keepalived]#curl jjyy.com
web01
[root@lb01 /etc/keepalived]#curl jjyy.com
web02
6 脑裂问题
# 检测思路:在备节点上执行脚本,如果可以ping通主节点且备节点有VIP就报警,缺点网络故障无法ping通
# 脚本在备节点执行
[root@lb02 /scripts]vi check_split_brain.sh
#!/bin/bash
master_vip=192.168.40.254
while :;do
? ? ping -c2 -W3 $master_vip &>/dev/null
? ? if [ $? -eq 0 -a `ip add|grep "$master_vip"|wc -l` -eq 1 ];then
? ? ? ? echo "ha is split brain. waring."
? ? fi
? ? sleep 5
done
[root@lb02 /scripts]chmod +x chk_split_brain.sh
[root@lb02 /scripts]vi /etc/rc.local
/bin/sh /scripts/chk_split_brain.sh &
7 解决keepalived服务自动释放vip地址
# 默认情况下keepalived软件仅在对方机器宕机或keepalived停掉的时候才会接管业务。但在实际工作中,有业务服务
# 停止(nginx)而keepalived服务还在工作的情况,这就会导致用户访问VIP无法找到对应的服务。那么,如何解决业务服务宕机
# 可以将IP漂移到备节点使这接管提供服务。
7.1 脚本解决keepalived服务自动释放vip地址
[root@lb01 /scripts]vi check_web.sh
#!/bin/bash
while :;do
? ? if [ `ss -lntup|grep nginx|wc -l` -lt 1 ];then
? ? ? ? systemctl stop keepalived?
? ? fi
? ? sleep 5
done
############################## 两个脚本任意选择一个
#!/bin/bash
while :;do
? ? if [ `ps -ef|grep -c` -le 1 ];then
? ? ? ? systemctl stop keepalived?
? ? fi
? ? sleep 5
done
###############################
[root@lb01 /scripts]chmod +x check_web.sh
[root@lb01 /scripts]vi /etc/rc.local
/bin/sh /scripts/check_web.sh &
7.2 使用keepalived的配置文件参数触发写好的监测脚本
[root@lb01 /scripts]vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
? ? ? router_id lb01
}
vrrp_script chk_nginx_proxy { ? ? ? ? ?# 定义监测脚本
? ? script "/scripts/check_web.sh" ? ? # 执行脚本,当业务服务有问题,就停掉keepalived服务
? ? interval 2 ? ? ? ? ? ? ? ? ? ? ? ? # 间隔2秒
? ? weight 2
}
vrrp_instance web {
? ? state MASTER
? ? interface eth1
? ? virtual_router_id 51
? ? priority 150
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.40.254
? ? }
? ? track_script { ? ? ? ? ? # 跟踪
? ? ? ? chk_nginx_proxy ? ? ?# 触发监测脚本
? ? }
}
8 高可用双主配置
# 前面的实例中lb01为主lb02为备,只要主无故障备等于闲置
# 如果业务不断扩大有web服务集群、bbs服务集群等,都要按照lb01为主lb02为备配置,资源浪费
# 想一下如果把lb01为主lb02为备用于web服务集群,而把lb02为主lb01为备用于bbs服务集群,这样多好
8.1 编写配置文件
# lb01?
[root@lb01 /etc/keepalived]#cat keepalived.conf
! Configuration File for keepalived
global_defs {
? ?router_id lb01
}
vrrp_instance web { ? # 实例名称为 web
? ? state MASTER
? ? interface eth1
? ? virtual_router_id 51
? ? priority 150
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.40.254
? ? }
}
# 上面内容不需要修改
#-----------------------------------------------
# 下面是增加部分
vrrp_instance bbs { ? ? ?# 增加实例名称为 bbs
? ? state BACKUP ? ? ? ? # 修改为备份
? ? interface eth1
? ? virtual_router_id 52 # 修改为 52
? ? priority 100 ? ? ? ? # 修改优先级
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.40.253 ?# 修改vip
? ? }
}
# lb02
[root@lb02 /etc/keepalived]#cat keepalived.conf
! Configuration File for keepalived
global_defs {
? ?router_id lb02 ? ? ? ??
}
vrrp_instance web { ? # 实例名称为 web
? ? state BACKUP ? ? ? ? ? ? ??
? ? interface eth1
? ? virtual_router_id 51
? ? priority 100 ? ? ? ??
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.40.254
? ? }
}
# 上面内容不需要修改
#-----------------------------------------------
# 下面是增加部分
vrrp_instance bbs { ? ? ?# 增加实例名称为 bbs
? ? state MASTER ? ? ? ? # 修改为主
? ? interface eth1
? ? virtual_router_id 52 # 修改为 52
? ? priority 150 ? ? ? ? # 修改优先级
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.40.253 ?# 修改vip
? ? }
}
8.2 重启lb01 lb02
[root@lb01 /etc/keepalived]#systemctl restart keepalived ?
8.3 修改客户端hosts文件(lb01 lb02)都要操作?
# windows路径为 c:\windows\system32\drivers\etc\hosts
[root@lb02 /etc/keepalived]#vi /etc/hosts
192.168.40.254 ?www.jjyy.com jjyy.com
192.168.40.253 ?bbs.jjyy.com
9 配置高可用服务安全(负载均衡服务)
# 在实际中服务器最少有两个网卡(一个外网,一个内网),而vip就是在工作中需要和域名绑定的ip,
# 外网用户就可能通过高可用服务器访问到内网,不安全
9.1 配置nginx负载均衡服务(lb01 lb02)都要操作
[root@lb01 /etc/nginx/conf.d]#vi lb.conf?
server {
? ? listen ? ? 192.168.40.254:80; ? # 这里增加vip地址
...略
[root@lb01 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] bind() to 192.168.40.254:80 failed (99: Cannot assign requested address) ?# 报错
nginx: configuration file /etc/nginx/nginx.conf test failed
[root@lb01 /etc/nginx/conf.d]#systemctl restart nginx ??
Job for nginx.service failed because the control process exited with error code.?
See "systemctl status nginx.service" and "journalctl -xe" for details. ? # 报错
# 报错:原因是监听网卡上没有192.168.40.254这个地址
9.2 处理方法(lb01 lb02)都要操作
[root@lb01 /etc/nginx/conf.d]#echo ‘net.ipv4.ip_nonlocal_bind = 1‘ >>/etc/sysctl.conf?
[root@lb01 /etc/nginx/conf.d]#sysctl -p
net.ipv4.ip_nonlocal_bind = 1
[root@lb01 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok ? ?# 正常
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx/conf.d]#systemctl restart nginx ?
?
参考文献:
https://keepalived.org/manpage.html ?官网
跟老男孩学Linux运维 Web集群实战
?