KeepAlived 搭建高可用的HAProxy集群
-
KeepAlived 简介
Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx、Haproxy等反向代理的负载均衡服务器配合实现web服务端的高可用。Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA).VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。
-
KeepAlived 的安装
#安装所需软件包 yum install -y openssl openssl-devel #下载安装包 wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz #解压、编译、安装 tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/ cd /usr/local/keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived make && make install # 将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作 #首先创建文件夹,将keepalived配置文件进行复制: mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ #然后复制keepalived脚本文件: cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ # 设置的过程中如果出现已经存在则删除原有的文件,重新创建 ln -s -f /usr/local/sbin/keepalived /usr/sbin/ ln -s -f /usr/local/keepalived/sbin/keepalived /sbin/ #可以设置开机启动:chkconfig keepalived on,到此我们安装完毕! chkconfig keepalived on
-
KeepAlived 的配置
[root@nacos keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { router_id other ##标识节点的字符串,通常为本机hostname } vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" ##执行脚本位置 interval 2 ##检测时间间隔 weight -20 ##如果条件成立则权重减20 } vrrp_instance VI_1 { state BACKUP ## 主节点为MASTER,备份节点为BACKUP-该配置非常重要 interface ens192 ## 绑定虚拟IP的网络接口(网卡可以使用ifconfig查看) virtual_router_id 110 ## 虚拟路由ID号(主备节点一定要相同)-该配置非常重要 mcast_src_ip 192.168.1.118 ## 本机ip地址 priority 150 ##优先级配置(0-254的值),一般主节点的权重大于备份节点 nopreempt advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s authentication { ## 认证匹配 auth_type PASS auth_pass dalianpai } track_script { chk_haproxy } virtual_ipaddress { 192.168.1.199 ## 虚拟ip,可以指定多个,以后连接mq就使用该虚拟ip进行连接 } } [root@nacos keepalived]#
4.编写执行脚本(一定要赋权否则不能执行)
[root@nacos keepalived]# cat haproxy_check.sh
#!/bin/bash
COUNT=`ps -C haproxy --no-header |wc -l`
if [ $COUNT -eq 0 ];then
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
sleep 2
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
[root@nacos keepalived]#
-
启动
[root@other keepalived]# chmod +x /etc/keepalived/haproxy_check.sh [root@other keepalived]# service keepalived start Starting keepalived (via systemctl): [ OK ] [root@other keepalived]# ps -ef | grep haproxy nobody 2143 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2144 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2145 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2146 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2147 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2148 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2149 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2150 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2151 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2152 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2153 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2154 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2155 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2156 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2157 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2158 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2159 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2160 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2161 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg nobody 2162 1 0 Jul08 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg root 3713 1754 0 02:45 pts/0 00:00:00 grep --color=auto haproxy [root@other keepalived]# ps -ef | grep keepalived root 3669 1 0 02:44 ? 00:00:00 keepalived -D root 3670 3669 0 02:44 ? 00:00:00 keepalived -D root 3671 3669 0 02:44 ? 00:00:00 keepalived -D root 3718 1754 0 02:45 pts/0 00:00:00 grep --color=auto keepalived [root@other keepalived]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:50:56:b4:2f:fe brd ff:ff:ff:ff:ff:ff inet 192.168.1.121/24 brd 192.168.1.255 scope global noprefixroute ens192 valid_lft forever preferred_lft forever inet 192.168.1.199/32 scope global ens192 valid_lft forever preferred_lft forever inet6 fe80::c1bd:70bd:56f9:d8f5/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::2e50:2dd3:3d4d:2c2e/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::68b:4e0e:e486:8dd8/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:2a:41:5e:74 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever [root@other keepalived]# service keepalived stop Stopping keepalived (via systemctl): [ OK ] [root@other keepalived]# systemctl start keepalived [root@other keepalived]# systemctl status keepalived ● keepalived.service - SYSV: Start and stop Keepalived Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled) Active: active (running) since Thu 2020-07-09 02:54:17 EDT; 6s ago Docs: man:systemd-sysv-generator(8) Process: 3869 ExecStop=/etc/rc.d/init.d/keepalived stop (code=exited, status=0/SUCCESS) Process: 3888 ExecStart=/etc/rc.d/init.d/keepalived start (code=exited, status=0/SUCCESS) Main PID: 3895 (keepalived) Tasks: 3 Memory: 904.0K CGroup: /system.slice/keepalived.service ├─3895 keepalived -D ├─3896 keepalived -D └─3897 keepalived -D Jul 09 02:54:17 other Keepalived_vrrp[3897]: Opening file '/etc/keepalived/keepalived.conf'. Jul 09 02:54:17 other Keepalived_vrrp[3897]: Truncating auth_pass to 8 characters Jul 09 02:54:17 other Keepalived_vrrp[3897]: Configuration is using : 67374 Bytes Jul 09 02:54:17 other Keepalived_vrrp[3897]: Using LinkWatch kernel netlink reflector... Jul 09 02:54:17 other Keepalived_vrrp[3897]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)] Jul 09 02:54:17 other Keepalived_healthcheckers[3896]: Using LinkWatch kernel netlink reflector... Jul 09 02:54:17 other Keepalived_vrrp[3897]: VRRP_Script(chk_haproxy) succeeded Jul 09 02:54:18 other Keepalived_vrrp[3897]: VRRP_Instance(VI_1) Transition to MASTER STATE Jul 09 02:54:18 other Keepalived_vrrp[3897]: VRRP_Instance(VI_1) Received higher prio advert Jul 09 02:54:18 other Keepalived_vrrp[3897]: VRRP_Instance(VI_1) Entering BACKUP STATE [root@other keepalived]#
停止主节点的keepalived查看我们的虚拟ip是否漂移到了从节点