## 拓扑图
下载安装软件
下载
官网 下载软件
我这里使用的是 keepalived-2.1.3.tar.gz
安装
1.解压
tar -zxvf keepalived-2.1.3.tar.gz
2.配置
cd keepalived-2.1.3
./configure --prefix=/opt/keepalived
3.编译和安装
make && make install
服务及配置文件
移动配置文件位置
将安装包下的服务文件移动到/etc/init.d目录下
cp /opt/keepalived-2.1.3/keepalived/etc/init.d/keepalived /etc/init.d
mkdir /etc/keepalived
在安装目录下,将配置文件移动到上面创建的配置文件
cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
修改配置文件
vi /etc/keepalived/keepalived.conf
global_defs {
router_id 41 #服务器的路由标识,每台机器不同不要重复
}
vrrp_instance VI_1 {
state BACKUP #路由状态,主服务器为MASTER,备份服务器为BACKUP
interface enp0s3 #服务器绑定的网卡,查看本机的网卡 ip a
mcast_src_ip 10.150.132.100 #广播源ip,就是服务器的实际ip地址
virtual_router_id 43 #虚拟路由标识,两台服务器必须一样,而且得是0~255之间的数字
priority 90 #优先级,数字越大优先级越高,根据这个在N个备份服务器里选举谁来临时当主服务器
advert_int 5 #集群监控时间,单位为秒,默认1秒. 当超过这个时间如果收不到MASTER还活着的消息,那么就要选举一个新的MSATER
authentication {
auth_type PASS #集群间通信用来验证身份的,配置成一样即可
auth_pass 1111
}
virtual_ipaddress {
10.150.132.102 #统一对外提供的虚拟地址,即外部通过这个虚拟ip来访问实际ip的服务器
10.150.132.101
}
}
启动服务
systemctl start keepalived.service
查看服务
ps -ef| grep keep*
测试
使用虚拟IP就可以访问到实际服务器的服务
其他配置
端口
keepalived使用 112 端口
日志配置
centos6
修改/etc/sysconfig/keepalived 文件
#KEEPALIVED_OPTIONS="-D"
KEEPALIVED_OPTIONS="-D -d -S 0"
修改/etc/rsyslog.conf 文件
local0.* /opt/keepalived/log/keepalived.log
这里要注意,在keepalived目录下创建log目录
centos7
除了以上修改,还需要在/lib/systemd/system/keepalived.service 修改配置信息
将里面的:
EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
修改成:
EnvironmentFile=/etc/sysconfig/keepalived
ExecStart=/sbin/keepalived $KEEPALIVED_OPTIONS
然后重新加载service:
systemctl daemon-reload
如果没有配置日志,可以使用 tail -f /var/log/message 查看日志
邮件配置
1.安装
yum install mailx -y
2.配置邮件
vim /etc/mail.rc
set from=youremail@sina.com #发件人邮箱地址(sina设置在sina邮箱中开启允许代理)
set smtp=smtp.sina.com #smtp地址
set smtp-auth-user=youremail@sina.com #邮箱用户名,不用加域名
set smtp-auth-password=****** #邮箱密码(邮件密码是smtp代理授权码)
set smtp-auth=login #邮箱验证方式
3.测试发送邮件
echo "hello world" | mail -s "hello" test@qq.com
4.编写脚本
vim /etc/keepalived/mail_notify.sh
#!/bin/bash
echo "192.168.1.203 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" youreamil@qq.com
5.授权
chmod 777 /etc/keepalived/mail_notify.sh
6.修改keepalived配置
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
#Keepalived进入MASTER状态执行脚本
notify_master "/etc/keepalived/mail_notify.sh master"
#Keepalived进入BACKUP状态执行脚本
notify_backup "/etc/keepalived/mail_notify.sh backup"
#Keepalived进入FAULT状态执行脚本
notify_fault "/etc/keepalived/mail_notify.sh fault"
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.200.203
}
}
7.重启服务
systemctl restart keepalived.service
服务高可用
编写服务检测脚本,交给keepalived定时执行即可。详情见最后的配置。
多组keepalived在同一个局域网内
此时的解决办法是,在同组的Keepalived服务器所有的配置文件里指定独一无二的多播地址
global_defs { #全局配置
router_id LVS_19 #服务标识
vrrp_mcast_group4 224.0.0.19 #这个就是指定多播地址的配置
}
#提示:
1)不同实例的通信认证密码也最好不同,以确保接管正常。
2)另一款高可用软件Heartbeat,如果采用多播方式实现主备通信,同样会有多播地址冲突问题。
检测脑裂
在备节点上执行脚本,如果可以ping通主节点并且备节点有VIP就报警,让人员介入检查是否裂脑
#!/bin/bash
lb01_vip=192.168.0.240
lb01_ip=192.168.0.221
while true
do
ping -c 2 -W 3 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is OK"
fi
sleep 5
done
宕机服务重启
在主VIP漂移到备份服务器后,处理完问题之后,重启主服务器,漂移到备份服务器的连接重新转移到主服务器上。这里要注意,最后启动keepalived,先启动相关服务。
服务器切换时,执行脚本没有执行
chcon -t keepalived_unconfined_script_exec_t /opt/keepalived/shell/mail_notify.sh
给文件添加selinux权限
备注
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置警报邮箱
acassen@firewall.loc #邮箱
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #设置发件人地址
smtp_server 192.168.50.1 #设置smtp server地址
smtp_connect_timeout 30 #设置smtp超时连接时间 以上参数可以不配置
router_id LVS_DEVEL #是Keepalived服务器的路由标识在一个局域网内,这个标识(router_id)是唯一的
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
vrrp_script check_redis {
script "
interval 2 #检查脚本的频率,单位(秒)
weight -30 #端口检查失败,优先级减少30,默认减少2[注意:两台主机配置的weight相同时候必须保证weight的值大于priority差值]
}
vrrp_instance VI_1 { #VRRP实例定义区块名字是VI_1
state MASTER #表示当前实例VI_1的角色状态这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符ASTER为正式工作的状态,BACKUP为备用的状态
interface eth0
virtual_router_id 51 #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的.
priority 100 #priority为优先级 越大越优先
advert_int 1 #为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1.
authentication { #authentication为权限认证配置不要改动,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
auth_type PASS
auth_pass 1111
}
## 将 track_script 块加入 instance 配置块
track_script {
chk_nginx ## 执行 Nginx 监控的服务
} #
virtual_ipaddress { #设置虚拟IP地址
192.168.50.16 #此格式ip a显示 ifconfig不显示
192.168.50.17/24 dev eth0 label eth0:1 #绑定接口为eth0,别名为eth0:1
}
#至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除
#以下为虚拟服务器定义部分
virtual_server 192.168.50.16 80 { #设置虚拟服务器,指定虚拟IP和端口
delay_loop 6 #健康检查时间为6秒
lb_algo rr #设置负载调度算法 rr算法
lb_kind NAT #设置负载均衡机制 #有NAT,TUN和DR三种模式可选
nat_mask 255.255.255.0 #非NAT模式注释掉此行 注释用!号
persistence_timeout 50 #连接保留时间,50秒无响应则重新分配节点
protocol TCP #指定转发协议为TCP
real_server 192.168.5.150 80 { #RS节点1
weight 1 #权重
TCP_CHECK { #节点健康检查
connect_timeout 8 #延迟超时时间
nb_get_retry 3 #重试次数
delay_before_retry 3 #延迟重试次数
connect_port 80 #利用80端口检查
}
}
real_server 192.168.50.149 80 { #RS节点2
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
vi /etc/keepalived/nginx_check.sh
# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
#或者
#!/bin/bash
set -e
if [ `ps -ef | grep nginx | wc -l` -lt 2 ];then
systemctl stop keepalived
echo "nginx is down"
exit 0
fi
更多配置参考官网说明
参考网址:
https://www.codercto.com/a/33207.html
https://blog.csdn.net/xianghanscce/article/details/88794346
https://www.cnblogs.com/ywrj/p/9483427.html
https://blog.csdn.net/l1028386804/article/details/72801492