高可用集群实现方案
一、Keepalived环境专为LVS 和 HA 设计的一款健康检查工具,使用成熟的 VRRP 协议
支持故障自动切换( Failover )
支持节点健康状态检查( Health Checking )
官方网站:http://www.keepalived.org/
高可用集群:尽可能提高服务可用性
宕机标准:1 ~ 5个9标准:99%~99.999%
原理:心跳检测
问题:脑分裂
解决方案:
心跳线冗余
多次间歇心跳检测
电源交换机
检测脚本:针对服务的可用性进行探测
切换 Master 以及 切换至 backup 状态的运行脚本
集群启动前的操作:挂载共享存储 数据恢复
集群可用性退出:解除挂载 保留恢复数据
二、VRRP(虚拟路由冗余协议)相关概念
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qlg1T6hQ-1615908358514)(C:\Users\taoxiaobing\AppData\Roaming\Typora\typora-user-images\image-20210109150346904.png)]
1、虚拟设备:由一个“主( Master )”设备和多个“备( Backup )"设备组成的一个虚拟网关
主设备( Master ):负责转发数据报文和周期性向备设备发送 VRRP 协议报文
备设备( Backup ):不负责转发数据报文,在 Master 设备发生故障的时候会通过选举形式成为新的 Master 设备,该角色会接收来自 Master 设备的 VRRP 报文并加以分析
2、VRID:用来表示一个 VRRP 组
3、虚拟IP:配置在虚拟设备上的虚拟IP地址,一个虚拟设备可以拥有一个或者多个虚拟IP地址。
4、IP 地址拥有者:分配给虚拟设备的虚拟 IP 的真实拥有者,IP 拥有者会直接跳过选举成为 Master,并且是不可抢占的
5、虚拟 MAC 地址:由虚拟设备生成的虚拟 MAC 地址,每一个虚拟设备都会自动生成一个虚拟 MAC 地址,这个 MAC 地址是用于虚拟设备处理 ARP 报文的
6、优先级:用于表示物理设备的优先级,这个参数用于 Master 的选举,取值范围是 1-254,这个有优先级有两个比较特殊的值,分别是 0 和 255,优先级 0 是由原来 Master 设备发送的,这个优先级是声明此设备不再参与 VRRP 组。优先级为 255 的是 IP 拥有者的优先级,拥有这个优先级会直接成为 Master。(优先级数值越高优先级则越高,差值一般大于40)
7、抢占模式:当 Backup 设备接收到的 VRRP 报文通过分析得出当前 Master 设备的优先级低于 Backup 设备,则 Backup 设备会切换为 Master 设备。
8、VRRP 一共有三种状态,分别是:初始状态( Initialize )、活动状态( Master )、备份状态( Backup )
初始状态:在这个状态下 VRRP 是不可用的,在这个状态下的设备是不会处理 VRRP 报文的,通常是刚配置 VRRP 时和检测到故障是会是这个状态
活动状态: 定期发送 VRRP 报文
以虚拟 MAC 地址响应对虚拟 IP 地址的 ARP 请求
转发目的 MAC 地址为虚拟 MAC 地址的 IP 报文
如果它是这个虚拟 IP 地址的拥有者,则接收目的 IP 地址为这个虚拟 IP 地址的 IP 报文。否则,丢弃这个 IP 报文
如果收到比自己优先级大的报文则转为 Backup 状态
如果收到优先级和自己相同的报文,并且发送端的 IP 地址比自己的 IP 地址大,则转为 Backup 状态
当接收到接口的 Shutdown 事件时,转为Initialize
备份状态: 接收 Master 发送的 VRRP 报文,判断 Master 的状态是否正常
对虚拟 IP 地址的 ARP 请求,不做响应
丢弃目的 MAC 地址为虚拟 MAC 地址的 IP 报文
丢弃目的 IP 地址为虚拟 IP 地址的IP报文
Backup 状态下如果收到比自己优先级小的报文时,丢弃报文,立即切换为 Master( 仅在抢占模式下生效 )
如果收到优先级和自己相同或者比自己高的报文,则重置定时器,不进一步比较 IP 地址
当接收到接口的 Shutdown 事件时,转为 Initialize
如果 MASTER_DOWN_INTERVAL 定时器超时,则切换为 Master
三、工作模式
主备备份模式:一主一从,所有请求发送至主,若主不能工作,切换至从,同一时间点只有一台机器承担压力。
负载分担模式:数据包按照轮询方案,让两个路由器轮流处理对虚拟IP发起的请求。但VRRP协议这个功能落实到Keepalived上无法实现。
方案一 Keepalived
1、所需虚拟机
服务器1、服务器2、调度器主1、调度器从2
2、构建 DR 模式
服务器(1.2配置相同,网页内容不同)
$ service NetworkManager stop && chkconfig NetworkManager off
$ cd /etc/sysconfig/network-scripts/
$ cp ifcfg-lo ifcfg-lo:0
$ vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=虚拟IP
NETMASK=255.255.255.255
$ vim /etc/sysctl.conf # 在文件尾部添加下面内容
#lvs arp
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
$ sysctl -p
$ ifup lo:0
$ /sbin/route add -host 192.168.1.100 dev lo:0
# route add -host 虚拟IP dev lo:0
$ echo "/sbin/route add -host 192.168.1.100 dev lo:0" >> /etc/rc.local
$ route -n
$ yum -y install httpd
$ echo "1111111111111" >> /var/www/html/index.html
$ service httpd start
$ chkconfig httpd on
$ curl localhost #本机访问验证网页内容
负载调度器 —— 主
$ service NetworkManager stop && chkconfig NetworkManager off
$ cd /etc/sysconfig/network-scripts/
$ cp ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
DEVICE=eth0:0
IPADDR=虚拟IP
NETMASK=255.255.255.0
$ ifup eth0:0
$ vim /etc/sysctl.conf
# lvs send_redirects
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
$ sysctl -p
$ yum -y install ipvsadm
$ ipvsadm -A -t 192.168.1.100:80 -s rr
# ipvsadm -A -t 虚拟IP:80 -s rr
$ ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.40:80 -g
# ipvsadm -a -t 虚拟IP:80 -r 网站1:80 -g(LVS-DR模式)
$ ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.50:80 -g
# ipvsadm -a -t 虚拟IP:80 -r 网站2:80 -g(LVS-DR模式)
$ ipvsadm -Ln
$ service ipvsadm save
$ chkconfig ipvsadm on
$ ipvsadm -Ln --stats #查看出入站信息
Windows 浏览器 VIP 访问
再刷新
编译安装 keepalived
$ yum -y install lrzsz #上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
$ make && make install
$ chkconfig --add keepalived
$ chkconfig keepalived on
修改 Keepalived 配置文件:vim /etc/keepalived/keepalived.conf
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id R1 #命名主机名
}
vrrp_instance VI_1 {
state MASTER # 设置服务类型主/从( MASTER/SLAVE )
interface eth0 # 指定那块网卡用来监听
virtual_router_id 51 # 设置组号,如果是一组就是相同的ID号,一个主里面只能有一个主服务器和多个从服务器
priority 100 # 服务器优先级, 主服务器优先级高
advert_int 1 # 心跳时间, 检测对方存活
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 80 {
delay_loop 1 # 健康检查间隔
lb_algo rr # 使用轮询调度算法
lb_kind DR # DR模式的群集
protocol TCP # 使用的协议
real_server 192.168.1.10 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.1.20 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
$ /etc/init.d/keepalived start
$ ipvsadm -Ln
$ ip addr show #出现 ip/32 表示成功
负载调度器——从
$ service NetworkManager stop && chkconfig NetworkManager off
$ cd /etc/sysconfig/network-scripts/
$ cp ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
DEVICE=eth0:0
IPADDR=虚拟IP
NETMASK=255.255.255.0
$ vim /etc/sysconfig/network-scripts/ifup-eth
$ 注释掉247-251行内容
$ ifup eth0:0
$ vim /etc/sysctl.conf
# lvs send_redirects
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
$ sysctl -p
$ yum -y install ipvsadm
安装keepalived
$ yum -y install lrzsz
$ rz #上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/ && make && make install
$ chkconfig --add keepalived
$ chkconfig keepalived on
修改配置文件
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id R2
}
vrrp_instance VI_1 {
state SLAVE
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 80 {
delay_loop 1
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.1.10 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.1.20 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
$ /etc/init.d/keepalived start
$ ipvsadm -Ln
$ ip addr show #出现 ip/32 表示成功
测试
关闭主调度器,浏览器可以正常访问,开启主调度器,浏览器可以正常访问,使用命令查看访问被切换到哪台调度器
$ ipvsadm -Ln --stats
keepalived 其他选项
非抢占模式:如果两个节点性能一致,可以减少用户的连接丢失
安装 keepalived
服务器+调度器 1
$ yum -y install lrzsz #上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
$ make
$ make install
$ chkconfig --add keepalived
$ chkconfig keepalived on
$ rz keepalived-all.tar
$ tar -xf keepalived-all.tar.gz
$ cd keepalived-all.tar.gz
$ cd etc/keepalived/
$ rm -rf /etc/keepalived/*
$ mv * /etc/keepalived/
$ cd /etc/keepalived/
$ rm -rf stop_keepalived.log
$ vim check-server.sh #此步骤主要是修改脚本的ip地址
#!/bin/bash
URL="http://192.168.1.40/index.html"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
if [ $HTTP_CODE != 200 ]
then
/etc/init.d/keepalived stop &> /etc/keepalived/logs/stop_keepalived.log
echo `date` >> /etc/keepalived/logs/stop_keepalived.log
fi
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "111111111111" >> /var/www/html/index.html
$ vim keepalived.conf #注意修改 ip、vip
$ /etc/init.d/keepalived start
$ ip a
#inet 192.168.1.100/32 scope global eth0 ip/32 表示成功
服务器+调度器 2
$ yum -y install lrzsz #上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
$ make
$ make install
$ chkconfig --add keepalived
$ chkconfig keepalived on
$ rz # keepalived-all.tar
$ tar -xf keepalived-all.tar.gz
$ cd etc/keepalived/
$ rm -rf /etc/keepalived/*
$ mv * /etc/keepalived/
$ cd /etc/keepalived/
$ rm -rf stop_keepalived.log
$ cd script/
$ vim check-server.sh #此步骤主要是修改脚本的ip地址
#!/bin/bash
URL="http://192.168.1.40/index.html"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
if [ $HTTP_CODE != 200 ]
then
/etc/init.d/keepalived stop &> /etc/keepalived/logs/stop_keepalived.log
echo `date` >> /etc/keepalived/logs/stop_keepalived.log
fi
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "aaaaaaaaaaa" >> /var/www/html/index.html
$ cd ..
$ vim keepalived.conf #注意修改 ip、vip、权重不能一样priority 80、router_id不能一样、state SLAVE
$ /etc/init.d/keepalived start
$ ip a
#inet 192.168.1.100/32 scope global eth0 ip/32 表示成功
测试
1、断开主的网卡,模拟服务器失效,从服务器开始生效;开启主的网卡并启动keepalived,主开启抢占模式,再访问浏览器会访问到主的服务器网页
2、模拟web服务器死亡,主关闭httpd,从开启服务;主开启httpd 和 keepalived,主抢占服务
设置非抢占模式
主:
$ vim /etc/keepalived/keepalived.conf
# 在vrrp_instance VI_1 标签内添加
nopreempt
state SLAVE # MASTER 改为 SLAVE
$ /etc/init.d/keepalived restart
从:
$ vim /etc/keepalived/keepalived.conf
# 在vrrp_instance VI_1 标签内添加
nopreempt
$ /etc/init.d/keepalived restart
测试
网页访问 VIP ,访问到主界面,因为主的权重高,关闭主的 httpd ,访问到从的网页,再开启主 httpd,这时不会再访问到主界面