本章将实现如何使用keepalived实现双机热备,包括针对IP地址的故障切换,以及在LVS高可用群集中的热备应用。
keepalived双机热备基础知识
keepalived起初是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换和健康检查功能——判断LVS负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集。
keepalived概述及安装
keepalived的官方网站位于Keepalived for Linux。在非LVS群集环境中使用时,keepalived也可以作为热备份软件使用。
- keepalived的热备方式
keepalived采用VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现Linux服务器的多机热备功能。
一主 + 多备,共用同一个IP地址,但优先级不同。
热备组内的每台路由器都可能成为主路由器,虚拟路由器的IP地址(VIP)可以在热备组内的路由器之间进行转移,所以也称为漂移IP地址。使用keepalived时,漂移地址的实现不需要手动建立虚拟接口配置文件(如 ens33:0),而是由keepalived根据配置文件自动管理。
- keepalived的安装与服务控制
(1)安装keepalived
在安装方式中选择YUM安装,会自动安装keepalived所需的软件包,除此之外,在LVS群集环境中也会用到ipvsadm管理工具。
[root@localhost ~]# yum -y install keepalived ipvsadm
(2)控制keepalived服务
1. [root@localhost ~]# systemctl enable keepalived 2. Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
使用keepalived实现双机热备
主、备服务器中都需要安装keepalived。
主服务器的配置
keepalived服务的配置目录位于/etc/keepalived/。其中,keepalived.conf是主配置文件;另外包括一个子目录samples/,提供了许多配置样例作为参考。在keepalived的配置文件中,使用“global_defs {...}”区段指定全局参数,使用“vrrp_instance 实例名称 {...}”区段指定VRRP热备参数,注释文字以“!”符号开头。
1. [root@localhost ~]# systemctl stop firewalld 2. [root@localhost ~]# cd /etc/keepalived/ 3. [root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak //备份主配文件 4. [root@localhost keepalived]# vim keepalived.conf 5. global_defs { 6. ......//省略部分内容 7. router_id LVS_DEVEL //路由器(服务器)名称(建议指定不同的名称区分路由) 8. } 9. 10. vrrp_instance VI_1 { //定义VRRP热备实例 11. state MASTER //热备状态,MASTER表示主服务器 12. interface ens33 //承载VIP地址的物理接口 13. virtual_router_id 51 //虚拟路由器的ID号,每个热备组保持一致 14. priority 100 //优先级,数值越大优先级越高 15. advert_int 1 //通告间隔秒数(心跳频率) 16. authentication { //认证信息,每个热备组保持一致 17. auth_type PASS //认证类型 18. auth_pass 1111 //密码字串 19. } 20. virtual_ipaddress { //指定漂移地址(VIP),可以是多个 21. 200.0.0.100 22. } 23. }
确认上述配置无误,然后启动keepalived服务。实际状态为MASTER的主服务器将为ens33接口自动添加VIP地址,通过IP命令可以查看(注意:ifconfig命令看不到)。
1. [root@localhost keepalived]# systemctl start keepalived 2. [root@localhost keepalived]# ip a show dev ens33 3. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 4. link/ether 00:0c:29:af:af:9d brd ff:ff:ff:ff:ff:ff 5. inet 200.0.0.1/24 brd 200.0.0.255 scope global ens33 6. valid_lft forever preferred_lft forever 7. inet 200.0.0.100/32 scope global ens33 8. valid_lft forever preferred_lft forever 9. inet6 fe80::5f65:9c3d:d218:7cea/64 scope link 10. valid_lft forever preferred_lft forever
备用服务器的配置
在同一个keepalived热备组内,所有服务器的keepalived配置文件基本相同,包括虚拟路由器的ID号、认证信息、漂移地址、心跳频率等。不同之处主要在于路由器名称、热备状态、优先级。
- 路由器名称(router_id):建议为每个参与热备的服务器指定不同的名称。
- 热备状态(state):至少应有一台主服务器,将状态设为MASTER;可以有多台备用的服务器,将状态设为BACKUP。
- 优先级(proiority):数值越大则取得VIP控制权的优先级越高,因此主服务器的优先级应设为最高;其他备用服务器的优先级可依次递减,但不要相同,以免在争夺VIP控制权时发生冲突。
配置备用服务器(可以有多台)时,可以参考主服务器的keepalived.conf配置文件内容,只要修改路由器名称、热备状态、优先级就可以了。
1. [root@localhost ~]# systemctl stop firewalld 2. [root@localhost ~]# cd /etc/keepalived/ 3. [root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak 4. [root@localhost keepalived]# vim keepalived.conf 5. global_defs { 6. ......//省略部分内容 7. router_id LVS_DEVEL2 //修改备份路由名称 8. } 9. 10. vrrp_instance VI_1 { 11. state BACKUP //修改热备状态(备份) 12. interface ens33 //修改承载VIP地址的物理接口 13. virtual_router_id 51 14. priority 90 //优先级,数值应低于主服务器 15. advert_int 1 16. authentication { 17. auth_type PASS 18. auth_pass 1111 19. } 20. virtual_ipaddress { 21. 200.0.0.100 //漂移地址 22. } 23. }
确认配置无误,一样需要启动keepalived服务。此时主服务器仍然在线,VIP地址实际上任然由主服务器控制,其他服务器处于备份状态,因此在备份服务器中将不会为ens33接口添加VIP地址。
1. [root@localhost keepalived]# ip a show dev ens33 2. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 3. link/ether 00:0c:29:3c:d0:8b brd ff:ff:ff:ff:ff:ff 4. inet 200.0.0.2/24 brd 200.0.0.255 scope global ens33 5. valid_lft forever preferred_lft forever 6. inet6 fe80::595f:84d:a379:7b6e/64 scope link 7. valid_lft forever preferred_lft forever
测试双机热备功能
keepalived的日志消息保存在/var/log/messages文件中,在测试主、备故障自动切换功能时,可以跟踪此日志文件来观察热备状态的变化。
- 连通性测试
客户机中执行"ping -t 200.0.0.10"命令,能够正常、持续ping通,根据一下操作继续观察测试结果。
- 停止主服务器的keepalived服务,发现ping测试只中断了1或2个包即恢复正常,说明已有其他服务器接替VIP地址,并及时响应客户机请求。
- 启动主服务器的keepalived服务,发现ping测试只中断了1或2个包即恢复正常,说明主服务器已回复正常,并夺回VIP地址的控制权。
- 查看日志记录
在执行主、备服务器故障切换时的过程中,分别观察各自的/var/log/messages日志文件,可以看到MASTER、SLAVE状态的迁移记录。
通过上述测试过程,可以发现双机热备已经正常。客户机只要通过VIP地址就可以访问服务器所提供的Web等应用,其中任何一台服务器失效,另一台服务器将会立即接替服务,从而实现高可用性。实际应用中,注意主、备服务器所提供的Web服务内容要保持一致。
LVS+Keepalived高可用群集
keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器、管理服务器池,而不仅仅用作双机热备。使用keepalived构建LVS群集更加简便易用,主要有事体现在:对LVS负载调度器实现热备切换,提高可用性;对服务器池中的节点进行健康检查,自动移除失效节点,恢复后在重新加入。
实验准备
根据下图配置IP,关闭防火墙,实现keepalived+LVS-DR高可用的负载均衡web群集。
配置主调度器
- 安装ipvsadm和keepalived包。
1. [root@localhost ~]# yum -y install keepalived ipvsadm 2. [root@localhost ~]# systemctl enable keepalived 3. Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
- 修改内核参数文件,关闭ICMP重定向。
1. [root@localhost ~]# vim /etc/sysctl.conf 2. net.ipv4.conf.all.send_redirects = 0 3. net.ipv4.conf.default.send_redirects = 0 4. net.ipv4.conf.ens33.send_redirects = 0 5. [root@localhost ~]# sysctl -p //设置参数立即生效 6. net.ipv4.conf.all.send_redirects = 0 7. net.ipv4.conf.default.send_redirects = 0 8. net.ipv4.conf.ens33.send_redirects = 0
- keepalived.conf配置
1. [root@localhost ~]# vim /etc/keepalived/keepalived.conf 2. ! Configuration File for keepalived 3. 4. global_defs { 5. ......//省略部分内容 6. router_id R1 //修改名称 7. } 8. 9. vrrp_instance VI_1 { 10. state MASTER //配置热备状态 11. interface ens33 //设置承载VIP的物理接口 12. virtual_router_id 51 13. priority 100 //主服务器优先级设为100 14. advert_int 1 15. authentication { 16. auth_type PASS 17. auth_pass 1111 18. } 19. virtual_ipaddress { 20. 200.0.0.100 //设置群集VIP地址 21. } 22. } 23. virtual_server 200.0.0.100 80 { //配置虚拟服务器地址(VIP)、端口 24. delay_loop 15 //配置健康检查的间隔时间(秒) 25. lb_algo rr 26. lb_kind DR //配置直接路由模式 27. nat_mask 255.255.255.0 28. ! persistence_timeout 50 //连接保持时间(秒),若启用去掉!号 29. protocol TCP 30. 31. real_server 200.0.0.3 80 { //第一个web节点的地址、端口 32. weight 1 33. TCP_CHECK { //健康检查方式 34. connect_port 80 //检查的目标端口 35. connect_timeout 3 36. nb_get_retry 3 37. delay_before_retry 3 38. } 39. } 40. real_server 200.0.0.4 80 { //第二个web节点的地址、端口 41. weight 1 42. TCP_CHECK { 43. connect_port 80 44. connect_timeout 3 45. nb_get_retry 3 46. delay_before_retry 3 47. } 48. } 49. } 50. [root@localhost ~]# systemctl start keepalived 51. [root@localhost ~]# systemctl enable keepalived
配置备调度器
- 安装ipvsadm和keepalived包。
1. [root@localhost ~]# yum -y install keepalived ipvsadm 2. [root@localhost ~]# systemctl enable keepalived 3. Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
- 修改内核参数文件,关闭ICMP重定向。
1. [root@localhost ~]# vim /etc/sysctl.conf 2. net.ipv4.conf.all.send_redirects = 0 3. net.ipv4.conf.default.send_redirects = 0 4. net.ipv4.conf.ens33.send_redirects = 0 5. [root@localhost ~]# sysctl -p //设置参数立即生效 6. net.ipv4.conf.all.send_redirects = 0 7. net.ipv4.conf.default.send_redirects = 0 8. net.ipv4.conf.ens33.send_redirects = 0
- keepalived.conf配置
备份调度器的配置和主调度器的配置基本相同,重点需要修改的有路由器名称、热备状态、优先级。
1. [root@localhost ~]# vim /etc/keepalived/keepalived.conf 2. ! Configuration File for keepalived 3. 4. global_defs { 5. ......//省略部分内容 6. router_id R2 //修改名称 7. } 8. 9. vrrp_instance VI_1 { 10. state BACKUP //配置热备状态 11. interface ens33 //设置承载VIP的物理接口 12. virtual_router_id 51 13. priority 90 //备调度器优先级设为90 14. advert_int 1 15. authentication { 16. auth_type PASS 17. auth_pass 1111 18. } 19. virtual_ipaddress { 20. 200.0.0.100 //设置群集VIP地址 21. } 22. } 23. 24. virtual_server 200.0.0.100 80 { //配置虚拟服务器地址(VIP)、端口 25. delay_loop 15 //配置健康检查的间隔时间(秒) 26. lb_algo rr 27. lb_kind DR //配置直接路由模式 28. nat_mask 255.255.255.0 29. ! persistence_timeout 50 //连接保持时间(秒),若启用去掉!号 30. protocol TCP 31. 32. real_server 200.0.0.3 80 { //第一个web节点的地址、端口 33. weight 1 34. TCP_CHECK { //健康检查方式 35. connect_port 80 //检查的目标端口 36. connect_timeout 3 37. nb_get_retry 3 38. delay_before_retry 3 39. } 40. } 41. real_server 200.0.0.4 80 { //第二个web节点的地址、端口 42. weight 1 43. TCP_CHECK { 44. connect_port 80 45. connect_timeout 3 46. nb_get_retry 3 47. delay_before_retry 3 48. } 49. } 50. } 51. [root@localhost ~]# systemctl start keepalived 52. [root@localhost ~]# systemctl enable keepalived
配置web
- 配置ifcfg-lo:0群集IP。
1. [root@localhost ~]# cd /etc/sysconfig/network-scripts/ 2. [root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0 3. [root@localhost network-scripts]# vim ifcfg-lo:0 4. DEVICE=lo:0 5. IPADDR=200.0.0.100 6. NETMASK=255.255.255.255 7. ONBOOT=yes 8. [root@localhost network-scripts]# ifup lo:0 9. [root@localhost network-scripts]# ifconfig lo:0 10. lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 11. inet 200.0.0.100 netmask 255.255.255.255 12. loop txqueuelen 1 (Local Loopback)
- 修改内核文件,关闭ARP应答。
1. [root@localhost ~]# vim /etc/sysctl.conf 2. net.ipv4.conf.all.arp_ignore = 1 3. net.ipv4.conf.all.arp_announce = 2 4. net.ipv4.conf.default.arp_ignore = 1 5. net.ipv4.conf.default.arp_announce = 2 6. net.ipv4.conf.lo.arp_ignore = 1 7. net.ipv4.conf.lo.arp_announce = 2 8. [root@localhost ~]# sysctl -p
- 添加一条VIP本地访问路由。
1. [root@localhost ~]# vim /etc/rc.local 2. /sbin/route add -host 200.0.0.100 dev lo:0 3. [root@localhost ~]# route add -host 200.0.0.100 dev lo:0
- 启动httpd服务,创建测试网页。
1. [root@localhost ~]# yum -y install httpd 2. [root@localhost ~]# echo 1111111 > /var/www/html/index.html 3. [root@localhost ~]# systemctl start httpd 4. [root@localhost ~]# systemctl enable httpd
web2配置和web1相同,重复操作即可,测试网页可以改成222222用来区分web1和2。
测试负载均衡功能
客户机访问200.0.0.100,断开主调度器的网卡,再次访问查看是否正常
搭建NFS服务器
在nfs主机配置共享存储服务器,提供给两台web服务器的后台网页存储。详情参考LVS。
- 启动nfs-utils、rpcbind软件包
1. [root@localhost ~]# systemctl enable nfs 2. Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. 3. [root@localhost ~]# systemctl enable rpcbind
- 设置共享目录
1. [root@localhost ~]# mkdir -p /opt/wwwroot 2. [root@localhost ~]# vim /etc/exports 3. /opt/wwwroot 200.0.0.0/24(rw,sync,no_root_squash)
- 启动服务并查看本机发布的NFS共享目录。
1. [root@localhost ~]# systemctl restart rpcbind 2. [root@localhost ~]# systemctl restart nfs 3. [root@localhost ~]# showmount -e 4. Export list for localhost.localdomain: 5. /opt/wwwroot 200.0.0.0/24 6. [root@localhost ~]# echo 666 > /opt/wwwroot/index.html
- 两台web挂载共享目录
1. [root@localhost ~]# systemctl enable rpcbind 2. [root@localhost ~]# systemctl restart rpcbind 3. [root@localhost ~]# mount 200.0.0.5:/opt/wwwroot /var/www/html
测试负载均衡功能
客户机访问200.0.0.100,查看网页是否为共享内容。
关闭主调度器和web1的网卡,访问网页是否依然为共享内容,访问成功,实验完成。