小阿轩yx-LVS+Keepalived群集
Keepalived 双机热备份基础知识
- 起初是专门针对 LVS 设计的一款强大的辅助工具
- 主要用来提供故障切换(Failover)和健康检査(HealthChecking)功能—判断LVS 负载调度器、节点服务器的可用性
- 当 master 主机出现故障及时切换到backup 节点保证业务正常
- 当master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点
Keepalived 概述及安装
官方网站 http://www.keepalived.org/
- 非 LVS 群集环境中使用时,Keepalived 也可以作为热备软件使用
Keepalived 的热备方式
- 采用 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现Linux服务器的多机热备功能。
- VRRP是针对路由器的一种备份解决方案—由多台路由器组成一个热备组,通过共用的虚拟 IP地址对外提供服务;
- 每个热备组内同一时刻只有一台主路由器提供服务,其他路由器处于冗余状态。
- 若当前在线的路由器失效,则其他路由器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务
- 热备组内的每台路由器都可能成为主路由器,虚拟路由器的IP地址(VIP)可以在热备组内的路由器之间进行转移,别称:漂移 IP地址。
- 使用 Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件(如 ens33:0),而是由Keepalived 根据配置文件自动管理。
Keepalived 的安装与服务控制
安装 Keepalived
首先关闭防火墙、内核机制,还要再关闭网络软件包
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
安装 Keepalived ipvsadm 所需软件包
[root@localhost ~]# yum -y install keepalived ipvsadm
安装之后设置开机启动
[root@localhost ~]# systemctl enable keepalived
使用 Keepalived 实现双机热备
- 基于 VRRP的热备方式,Keepalived可以用作服务器的故障切换
- 每个热备组可以有多台服务器—最常用的就是双机热备。
- 双机热备方案中,故障切换主要针对虚拟 IP地址的漂移来实现,因此能够适用于各种应用服务器(不管是 Web、FTP、Mail,还是 SSH、DNS……)。
- 主、备服务器中都需要安装Keepalived,使用 YUM 方式安装 httpd 提供 Web 服务。
主服务器的配置
- Keepalived 服务的配置目录位于/etc/keepalived/。
- keepalived.conf 是主配置文件。
- 另外包括一个子目录 samples/
- 在 Keepalived 的配置文件中,使用“global defs {…}”区段指定全局参数,使用vrrp_instance 实例名称{…}”区段指定 VRRP 热备参数,注释文字以“!”符号开头。
关闭防火墙
[root@localhost ~]# systemctl stop firewalld
进入keepalived文件
[root@localhost ~]# cd /etc/keepalived/
复制keepalived文件
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
全局定义又包括两个子配置
[root@localhost keepalived]# vim keepalived.conf
//全局定义
global_defs {//本路由器(服务器)的名称router_id HA_TEST_R1notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_01vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}//定义 VRRP 热备实例
vrrp_instance VI_1 {//热备状态,MASTER 表示主服务器state MASTER//承载 VIP 地址的物理接口interface ens33//虚拟路由器的ID号,每个热备组保持一致virtual_router_id 1//优先级,数值越大优先级越高priority 100//通告间隔秒数(心跳频率)advert_int 1//认证信息,每个热备组保持一致authentication {//认证类型auth_type PASS//密码字串auth_pass 1111}//指定漂移地址(VIP),可以有多个virtual_ipaddress {192.168.10.172}
}
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播,如果配置了此参数,vip可以漂移到这台服务器,但是ping vip不通,因此需要将此参数去掉
notification_email: 表示keepalived在发生诸如切换操作时需要发送email通知以及email发送给哪些邮件地址邮件地址可以多个每行一个
notification_email_from admin@example.com: 表示发送通知邮件时邮件源地址是谁
smtp_server 127.0.0.1: 表示发送email时使用的smtp服务器地址这里可以用本地的sendmail来实现
smtp_connect_timeout 30: 连接smtp连接超时时间
router_id node1: 机器标识,fa
启动 Keepalived 服务
[root@localhost keepalived]# systemctl start keepalived
用 ip 命令查看自动添加 VIP 地址
[root@localhost keepalived]# ip a
2: ns33: <BROADCAST,MULTICAST,UP, LOWER UP>mtu 1500 qdisc pfifo fast state UP qlen1000link/ether 00:0c:29:93 :80:fb brd ff:ff:ff:ff:ff:ffinet 172.16.16.173/24 brd 172.16.16.255 scope global ens33valid lft forever preferred lft forever//自动设置的 VIP 地址inet 172.16.16.172/32 scope global ens33valid lft forever preferred lft foreverinet6 fe80::56be:f27:2b9b:823e/64 scope linkvalid lft forever preferred lft forever
备用服务器的配置
同一个 Keepalived 热备组中,所有服务器 Keepalived 配置文件基本相同,包括虚拟路由器
- ID 号
- 认证信息
- 漂移地址
- 心跳频率
不同之处主要在于
- 路由器名称
- 热备状态
- 优先级
路由器名称
- 建议为每个参与热备的服务器指定不同的名称
热备状态
- 至少应有一台主服务器,将状态设为MASTER;可以有多台备用的服务器,将状态设为 BACKUP
优先级
- 数值越大则取得 VIP 控制权的优先级越高,因此主服务器的优先级应设为最高;其他备用服务器的优先级可依次递减,但不要相同,以免在争夺 VIP 控制权时发生冲突
配置备用服务器(可以有多台)时,可以参考主服务器的keepalived.conf 配置文件内容
只需修改
- 路由器名称
- 热备状态
- 优先级
关闭防火墙、内核机制,还要再关闭网络软件包
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
进入 keepalived
[root@localhost ~]# cd /etc/keepalived/
复制 keepalived 文件
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
修改 keepalived 文件
[root@localhost keepalived]# vi keepalived.conf
global_defs {//本路由器(服务器)的名称router_id HA_TEST_R2
}notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc#vrrp_strictsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_02
}vrrp_instance VI_1 {//热备状态,BACKUP表示备用服务器state BACKUPinterface ens33virtual_router_id 1//优先级,数值应低于主服务器priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.172}
}
启动 Keepalived 服务
[root@localhost ~]# systemctl start keepalived
使用 ip 命令查看地址
[root@localhost keepalived]# ip a
2: ns33: <BROADCAST,MULTICAST,UP, LOWER UP>mtu 1500 qdisc pfifo fast state UP qlen1000link/ether 00:0c:29:93 :80:fb brd ff:ff:ff:ff:ff:ffinet 172.16.16.174/24 brd 172.16.16.255 scope global ens33valid lft forever preferred lft foreverinet6 fe80::56be:f27:2b9b:823e/64 scope linkvalid lft forever preferred lft forever
使用 curl 命令测试虚拟 ip 连通性
[root@localhost ~]# curl 192.168.10.172
测试双机热备功能
Keepalived 的日志消息保存在/var/log/messages 文件中,在测试主、备故障自动切换功能时,可以跟踪此日志文件来观察热备状态的变化。以针对连通性和 Web 服务的测试为例
连通性测试
- 在客户机中执行“ping-t 172.16.16.172”命令,能够正常、持续 ping通,根据以下操作继续观察测试结果。
- 停止启用主服务器的 Keepalived 服务,发现 ping 测试只中断了1或2个包即恢复正常,说明己有其他服务器接替 VIP地址,并及时响应客户机请求。
- 重新启用主服务器的 Keepalived 服务,发现 ping 测试再次中断1或2个包即恢复正常,说明主服务器已恢复正常,并夺回 VIP 地址的控制权。
web访问测试
- 客户机中访问 http://172.16.16.172/,将看到由主服务器 172.16.16.173 提供的网页文档
- 停止启用主服务器的Keepalived 服务,再次访问上述 Web 服务,将看到由备用服务器 172.16.16.174 提供的网页文档,说明 VIP 地址已切换至备用服务器
- 重新启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到重新由主服务器 172.16.16.173 提供的网页文档,说明主服务器已重新夺取 VIP 地址
查看日志记录
- 在执行主、备服务器故障切换的过程中,分别观察各自的/var/log/messages 日志文件,可以看到 MASTER、SLAVE 状态的迁移记录。
- 主服务器中,Keepalived 服务状态先变为“stop”,移除 VIP 地址,恢复后重新变为 MASTER
- 备用服务器中,状态先切换为 MASTER,待主服务器恢复后再交回控制权
LVS+Keepalived 高可用群集
- Keepalived 的设计目标是构建高可用的 LVS 负载均衡群集
- 可以调用 ipvsadm 工具来创建虚拟服务器、管理服务器池,而不仅仅用作双机热备。
- 使用Keepalived 构建 LVS 群集更加简便易用
主要优势体现
- 对LVS负载调度器实现热备切换,提高可用性;
- 对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入。
- 使用 Keepalived 构建 LVS 群集时,也需要用到 ipvsadm 管理工具
- 但大部分工作会由 Keepalived 自动完成
配置主调度器
全局配置、热备配置
关闭防火墙、内核机制,还要关闭网络软件包
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
安装 Keepalived ipvsadm 软件包
[root@localhost ~]# yum -y install keepalived ipvsadm
启动 Keepalived 服务
[root@localhost ~]# systemctl start keepalived
进入 Keepalived 目录并复制 Keepalived 文件
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
主服务器 Keepalived 配置
[root@localhost keepalived]# vim keepalived.conf
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc//注释掉#vrrp_strictsmtp_server 192.168.200.1smtp_connect_timeout 30//主调度器的名称router_id LVS_01
}vrrp_instance VI_1 {//主调度器的热备状态state MASTERinterface ens33virtual_router_id 51//主调度器的优先级priority 100advert_int 1authentication {//主、从热备认证信息auth_type PASSauth_pass 1111}virtual_ipaddress {//指定群集 VIP 地址192.168.10.172}
}virtual_server 192.168.10.172 80 {delay_loop 6lb_algo rrlb_kind DRnat_mask 255.255.255.0
! persistence_timeout 50protocol TCPreal_server 192.168.10.103 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.104 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}
persistence_timeout 50:这个参数的意义是保持客户端的请求在这个时间段内全部发到同一个真实服务器
主服务器内核参数配置
[root@localhost ~]# vim /etc/sysctl.conf
//在末尾添加
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
重载
[root@localhost ~]# sysctl -p
重启 Keepalived 服务
[root@localhost keepalived]# systemctl restart keepalived
[root@localhost keepalived]# ip add show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:ae:7f:64 brd ff:ff:ff:ff:ff:ffinet 192.168.10.101/24 brd 172.16.16.255 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.10.172/32 scope global ens33valid_lft forever preferred_lft forever
配置从调度器
与主调度器基本相同,也包括
- 全局配置
- 热备配置
- 服务器池配置
只需调整下面参数
- router_id
- state
- priority
关闭防火墙、内核机制,还要关闭 NetworkManager
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
安装 Keepalived 服务
[root@localhost ~]# yum -y install keepalived ipvsadm
启动服务
[[root@localhost ~]# systemctl start keepalived
进入 Keepalived 目录
[root@localhost ~]# cd /etc/keepalived/
复制 Keepalived 文件
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
修改 Keepalived 文件
[root@localhost keepalived]# vim keepalived.conf
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc#vrrp_strictsmtp_server 192.168.200.1smtp_connect_timeout 30//从调度器名称router_id LVS_02
}vrrp_instance VI_1 {//从调度器热备状态state BACKUPinterface ens33virtual_router_id 51//从调度器优先级priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.172}
}virtual_server 192.168.10.172 80 {delay_loop 6lb_algo rrlb_kind DRnat_mask 255.255.255.0
! persistence_timeout 50protocol TCPreal_server 192.168.10.101 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.102 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}
从调度器内核参数的配置
[root@localhost ~]# vim /etc/sysctl.conf
//在末尾添加
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
重载
[root@localhost ~]# sysctl -p
重启 Keepalived 服务
[root@localhost keepalived]# systemctl restart keepalived
服务器池配置
web01 服务器配置
关闭防火墙
[root@localhost ~]# systemctl stop firewalld
安装 httpd 服务
[root@localhost ~]# yum -y install httpd
进入网络目录
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
复制 lo 文件
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
修改 lo:0 文件
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.172
NETMASK=255.255.255.255
ONBOOT=yes
添加配置文件
[root@localhost network-scripts]# vim /etc/rc.local
/sbin/route add -host 192.168.10.172 dev lo:0
添加路由
[root@localhost network-scripts]# route add -host 192.168.10.172 dev lo:0
内核参数设置
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
添加测试页面
[root@localhost ~]# vim /var/www/html/index.html
test web01
重启网络服务
[root@localhost network-scripts]# systemctl restrt network
web02 服务配置
关闭防火墙
[root@localhost ~]# systemctl stop firewalld
安装 httpd 服务
[root@localhost ~]# yum -y install httpd
进入 network 目录
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
复制 lo 文件
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
修改 lo:0 文件
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.172
NETMASK=255.255.255.255
ONBOOT=yes
添加配置文件
[root@localhost network-scripts]# vim /etc/rc.local
/sbin/route add -host 192.168.10.172 dev lo:0
内核参数设置
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
添加测试页面
[root@localhost ~]# vim /var/www/html/index.html
test web02
添加路由
[root@localhost network-scripts]# route add -host 192.168.10.172 dev lo:0
重启服务
[root@localhost network-scripts]# systemctl restrt network
测试LVS+Keepalived高可用性
客户端访问网站
[root@localhost ~]# curl 192.168.10.172
刷新页面并观察网页的变化
客户端使用脚本测试
[root@localhost ~]# for i in $(seq 10);do curl http://192.168.10.172;done
生产环境中可以使用NFS服务器保证网站代码的一致性,在测试环境中为了观察效果,web服务器池中的网站代码可以不一样,更加便于观察实验效果。
测试计算机不要使用master调度器,在master调度器上访问VIP时,调度器不会将访问的请求调度到web服务器,而是自己尝试解析;在web服务器上测试时只能访问到自己的网页,无法实现调度。所以客户端一定要使用独立的测试计算机,或者使用处于BACKUP状态的调度器。
小阿轩yx-LVS+Keepalived群集