简介:
keepalived服务是一个高可用服务,用于解决服务器单点故障,保证服务器能执行高可用。一般keepalived于lvs一起使用,本身其就有检查lvs的状态功能。
keepalived基于VRRP协议,VRRP是虚拟路由器冗余协议,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
keepalived配置完毕以后,根据配置文件内容,会将多个服务器定义为一组实例,生成一个或多个虚拟IP和虚拟MAC地址,一般为一个主节点和一个(或多个)备用节点,正常情况下其VIP(虚拟IP)和对应MAC地址会在主节点中监听并向外提供服务,当主节点出现故障时,其备用节点就会监听其IP代替主节点提供服务(如有多个备用节点会根据其优先级大小对比)。所以对用户来说,即使挂掉一个或多个服务器仍能正常访问到,也就实现了高可用。
1.安装
安装一般有两种方式,yum或者源码安装,yum安装的话阿里云或者国内常见源都有keepalived的包,如果是源码安装就需要去官方下载
官方地址:https://keepalived.org/
yum安装:
1 2 3
| yum list keepalived
yum -y install keepalived
|
源码安装:
1 2 3 4 5 6 7
| tar -xvf keepalived-2.2.1.tar.gz
cd keepalived-2.2.1
./configure --prefix=/usr/local/keepalived
make&&make install
|
2.keepalived配置文件
/etc/keepalived/keepalived.conf (源码安装一般在自身目录下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from test0@163.com smtp_server smtp.163.com smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script enable_script_security } vrrp_sync_group { group{ VI_1 VI_2 } } vrrp_script chk_nginx_service { script "/etc/keepalived/chk_nginx.sh" interval 3 weight -20 fall 3 rise 2 user keepalived_script }
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.119.130 } track_script { chk_nginx_service } notify_master "/etc/keepalived/start_haproxy.sh start" notify_backup "/etc/keepalived/start_haproxy.sh stop" notify_fault "/etc/keepalived/start_haproxy.sh stop" }
virtual_server 192.168.119.130 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.119.120 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.119.121 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } }
vrrp_instance VI_2 { state BACKUP interface ens33 virtual_router_id 52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.119.131 } }
virtual_server 192.168.119.131 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.119.120 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.119.121 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } }
|
配置段分为几大块:
global_def:
该配置段为全局配置段,一般用于配置邮件发送或keepalived协议相关配置。
这个配置段可不配置,一般不会影响正常使用
vrrp_script:
用于定义检测脚本,定义了以后需在vrrp_instance中指定该脚本。
vrrp_instance:
定义一个虚拟路由器实例,在其中需定义该服务器的实例状态(master or backup),路由器id,绑定的网卡等信息,多个服务器就是通过该配置段来判断是否为同一个虚拟路由器,是主还备。
virtual_server:
定义了lvs的相关配置,
real_server则是定义了lvs对应的后端服务器的配置信息
tcp_check是keepalived对后端的健康检查方式
vrrp_sync_group :
group模块将多实例绑定起来,当其中一个实例挂掉时,另一个实例也会随之挂掉。
3.实例
一共有四台服务器
其中两台服务器是lvs+keepalived
还有两台服务器是web服务器(nginx)
这里要实现的效果为前端两台lvs调度器实现高可用,通过lvs调度器分发到后端web服务器上。
实验拓扑图及服务器ip如下:

因为有四台服务器,这里就称为server1-server4
server1和server2是lvs+keepalived的服务器,所以有两张网卡,一张是外网网卡,一张是内网网卡,用于与用户通信和转发到后端web服务器
server3和server4是web服务器,只有一张网卡,为内网网卡
这里因为机器较多,就采用ansible批量部署了,ansible可以使用yum直接安装(epel源)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| yum -y install epel-release yum -y install ansible vim /etc/ansible/hosts
[lvs] 10.10.10.105 10.10.10.187 [lvs:vars] ansible_ssh_pass=admin [ngx] 192.168.34.137 192.168.34.136 [ngx:vars] ansible_ssh_pass=admin
sed -i 's/^
ansible准备工作就做好,下面开始用ansible安装服务器需要用到的软件 ansible lvs -m yum -a "state=installed name=ipvsadm" ansible lvs -m yum -a "state=installed name=keepalived" ansible ngx -m yum -a "state=installed name=nginx" ansible 192.168.34.136 -m shell -a "echo 192.168.34.136 > /usr/share/nginx/html/index.html" ansible 192.168.34.137 -m shell -a "echo 192.168.34.137 > /usr/share/nginx/html/index.html" ansible ngx -m systemd -a "name=nginx enabled=yes state=started"
此时开始配置keepalived 编辑配置文件vim /etc/keepalived/ansible.cfg
global_defs { router_id 99 } vrrp_sync_group 145 { group { VI_1 VI_2 } } vrrp_instance VI_1 { state MASTER priority 150 advert_int 1 authentication { } virtual_ipaddress { 10.10.10.106 vrrp_instance VI_2 { state MASTER interface ens37 advert_int 1 authentication { ! Configuration File for keepalived
global_defs { router_id 99 } vrrp_sync_group 145 { group { VI_1 VI_2 } } vrrp_instance VI_1 { state MASTER priority 150 advert_int 1 authentication { } virtual_ipaddress { 10.10.10.106 vrrp_instance VI_2 { state MASTER priority 150 interface ens37 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.34.145 } } virtual_server 10.10.10.106 80 { delay_loop 6 lb_algo rr lb_kind NAT protocol TCP real_server 192.168.34.137 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.34.136 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } }
10.10.10.187的配置于105大致相似,只需要改一下几个点 vrrp_instance VI_1和VI_2 state=MASTER改为state=BACKUP priority=150改为priority=100 改完后keepalived就配置完毕了,lvs安装即可,无需手动配置lvs的配置都会通过virtual_server和real_server自动配置上。 此时重启keepalived即可(如没启动便直接启动) systemctl restart keepalived 最后因为nat的lvs需要后端服务器将其默认路由指定到前端lvs的DIP上,所以还需要写一条路由 ansible ngx -m shell -a "route add default gw 192.168.34.145" 此时便配置完成了。
|
测试:
然后是测试环节,首先是访问测试


访问没有问题说明lvs负载均衡和后端nginx是正常运行且能正常访问的
这时再测试keepalived
在10.10.10.105(MASTER)服务器上关闭一块网卡或关闭keepalived
nmcli c down ens33
此时,其虚拟ip就飘逸到BACKUP服务器上去了

此时再访问测试

还是可以访问说明keepalived的ip飘逸成功了。关闭一个lvs+keepalived服务器时,另一个会直接替代其对外提供服务器,也就实现了高可用服务器。
需要注意的点:
1.在keepalived中配置lvs时(virtual_server 和 real_server),指定的lvs模式(NAT,TUNL,DR)的准备工作需要提前做好,例如nat需要调度器有内外两个网卡且后端服务器默认路由地址要指定到DIP。因其keepalived仅仅只会将ipvsadm配置上,其lvs相关环境以及必要配置还是需要手动去配置。
2.在抢占模式中可以通过检测脚本(需手动写)来控制其实例的优先级数值,在非抢占模式中需要加上nopreempt的配置,且非抢占模式中不需要priority优先级配置。
抢占模式与非抢占模式的区别为:
在抢占模式中当主节点挂掉以后备用节点会立刻顶替主节点的位置,而当主节点又重新正常上线后主节点会将备用节点的虚拟ip抢占过来,而非抢占模式时当备用节点顶替主节点后,主节点再上线时其主节点这时并不会去抢占其虚拟ip。
非抢占模式要求:
- 两个节点的state都必须配置为BACKUP
- 两个节点都必须加上配置 nopreempt