3 高可用集群
3.1 高可用集群说明
高可用的目的:尽可能的提高服务的可用性。
- 99:最基本的可用性标准,999:是软件级别可以实现,9999:需要硬件的辅助参与,99999:则需要整个IDC,网络供应商,整个集群和开发的配合,
实现原理:心跳检测。
高可用集群是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。高可用集群的应用系统有多样化发展趋势,用途也越来越多样化,同时带来了配置及可操作性方面的复杂性,因此选择好的高可用软件至关重要。
Keepalived 简介
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived 将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来 Keepalived 又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此 Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有 HAcluster 功能。
Keepalived 软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写.VRRP出现的目的就是为了解决静态路由单点故障问题的
VRRP 简介
虚拟路由器冗余协议(VRRP)是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。使用 VRRP 的好处是有更高的默认路径的可用性而无需在每个终端主机上配置动态路由或路由发现协议。 VRRP 包封装在 IP 包中发送。
keepalived主要功能
对RealServer进行健康状态检查,支持3层、4层、7层协议进行健康检查;并支持VRRP冗余协议,所以keepalived两个功能是监控检查,VRRP冗余协议;
keepalived的作用
检查web服务器的状态,如果有一台web服务器/mysql服务器宕机或故障,keepalived将故障节点从系统中剔除,当故障恢复的时候自动加入服务器集群中,非常智能化,只需要手动修复坏的节点即可。
keepalived的 layer3、4、7 层分别是IP层、传输层、应用层的实现原理如下:
layer3: keepalived定期向集群中服务器发送ICMP的包,如果发现哪台ping不通,便报告这台服务器失效,并将其剔除集群;(判断标准为IP是否有效)
layer4: 主要以TCP端口(也可以是udp)状态来决定服务器工作是否正常,如web服务器的80端口如果没有工作,则将其剔除集群(判断标准为端口)
layer7: 应用层,keepalived将根据用户的设定,检查服务器程序的运行是否正常,如果不是设定值,则将其剔除集群(判断标准为程序是否正常)
官方网站:https://www.keepalived.org/
范例:LVS 健康检测 Shell 脚本
#可以使用 Python 或者 Go进行编写。Go 则天生支持多线程
$ vim check_lvs_real.sh
#!/bin/bash
#检测lvs集群节点是否正常,不正常则踢出集群
VIP=20.20.20.11
#集群虚拟IP
CPORT=80
#定义集群端口
FAIL_BACK=127.0.0.1
#本机回环地址
RS=("10.10.10.12" "10.10.10.13")
#编写集群地址
declare -a RSSTATUS
#变量RSSTATUS定义为数组态
RW=("2" "1")
RPORT=80
#定义集群端口
TYPE=g
#制定LVS工作模式:g=DR m=NAT
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
#添加RS,添加成功返回0,否则返回1
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
#删除RS,删除成功返回0,否则返回1
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
#检测RS服务是否在线,注意一下这里面指的RS的服务,如果连续三次都监测不通,则返回1,否则返回0
checkrs() {
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
#初始化RS在线状态,如果在线,设置节点初始化状态为1,否则为0
initstatus() {
local I
local COUNT=0;
for I in ${RS[*]}; do
if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
fi
let COUNT++
done
}
#进行初始化
initstatus
#监测rs是否加入到ipvs中。如果未添加并且在线则添加;如果已添加并且不在线,则删除
while :; do
let COUNT=0
for I in ${RS[*]}; do
if checkrs $I; then
if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
fi
else
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done
范例:将 LVS 进行高可用
服务:
- 有状态服务:MySQL,Redis
- 无状态服务:Apache,Nginx,LVS
3.2 Keepalived 原理
Keepalived 的热备方式
一主 + 多备,共用同一个 IP 地址,但优先级不同
图中的四个路由器对应在逻辑上划分在同一个组里。注意:只有在同一组里才会相互竞争对 VIP漂移地址 的使用权。
当组内有一个 Master 主路由器时,就会将 VIP 漂移到 Master 路由器上;当 Master 宕机了,就会将 VIP 漂移到新选举出的 Master 路由器中。
漂移地址: 主机地址会发生切换。
Keepalived VRRP原理
VRRP 协议一开始使用在网络设备上进行高可用的解决方案。
(1) 虚拟路由器中的路由器根据优先级选举出 Master。 Master 路由器通过发送免费 ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;
(2) Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工作状况;
(3) 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级重新选举新的 Master;
(4) 虚拟路由器状态切换时, Master 路由器由一台设备切换为另外一台设备,新的 Master 路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP地址信息的ARP 报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到 Master 路由器已经切换为另外一台设备。
(5) Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举 Master。
VRRP优先级的取值范围为0到255(数值越大表明优先级越高)
keepalived的三个核心模块
core核心模块 chech健康监测 vrrp虚拟路由冗余协议
案例环境专为LVS和HA设计的一款健康检查工具
支持故障自动切换(Failover)
支持节点健康状态检查(Health Checking)
3.3 LVS + DR + Keepalived
3.3.1 LVS + DR + Keepalived 步骤1
所有机器执行
#关闭NetworkManager网卡守护进程,负责无线网卡的启用,不安全的网络策略会强制关闭
#如果是最精简版的CentOS系统则不会安装 NetworkManager 服务
systemctl stop NetworkManager
systemctl disable --now NetworkManager
#CentOS6的操作
service NetworkManager stop
chkconfig NetworkManager off
在 LVS-1 中添加一块子网卡
$ cp -av /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0
$ cat > /etc/sysconfig/network-scripts/ifcfg-eth0:0 <<EOF
TYPE="Ethernet"
PROXY_METHOD="none"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="eth0:0"
DEVICE="eth0:0"
ONBOOT="yes"
IPADDR="10.10.10.100"
PREFIX="32"
EOF
$ ifup eth0:0
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:73:35 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.11/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.10.10.100/24 brd 10.10.10.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe16:7335/64 scope link
valid_lft forever preferred_lft forever
#设置内核参数
$ cat >> /etc/sysctl.conf <<EOF
#LVS-DR Kernel BEGIN
##禁止转发重定向报文
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
#LVS-DR Kernel END
EOF
#刷新内核参数
$ sysctl -p
#ipvsadm是一个工具,同时它也是一条命令,用于管理LVS的策略规则。
$ modprobe ip_vs
$ yum install -y ipvsadm &> /dev/null
#查看ipvs的信息
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#添加 LVS 集群
$ ipvsadm -A -t 10.10.10.100:80 -s rr
$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g
$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.14:80 -g
#使其 ipvsadm 配置永久生效(CentOS 7使用)
ipvsadm -Sn > /etc/sysconfig/ipvsadm
#ipvsadm-save > /etc/sysconfig/ipvsadm
#清楚ipvs规则
#ipvsadm -C
#恢复命令:
#ipvsadm-restore < /etc/sysconfig/ipvsadm
#启动ipvsadm服务,并设置为开机启动
$ systemctl enable --now ipvsadm.service
#查看服务状态
$ systemctl status ipvsadm.service
#重启服务
$ systemctl restart ipvsadm.service
#开机自动加载集群规则
$ echo "/usr/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" >> /etc/rc.local
#查看ipvs状态
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.11:80 0 0 0 0 0
-> 10.10.10.12:80 0 0 0 0 0
-> 10.10.10.13:80 0 0 0 0 0
后台的真实服务器配置
$ yum install -y httpd
$ systemctl enable --now httpd &
#分别配置网页信息
##RS1
$ echo "This is the real server1" > /var/www/html/index.html
##RS2
$ echo "This is the real server2" > /var/www/html/index.html
#配置启动回环网卡
$ cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF
DEVICE=lo:0
#配置虚拟IP地址
IPADDR=10.10.10.100
NETMASK=255.255.255.255
EOF
$ ifup lo:0
#配置内核参数
$ cat >> /etc/sysctl.conf <<EOF
#LVS-DR Kernel BEGIN
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 = 1
#LVS-DR Kernel END
EOF
$ sysctl -p
#配置路由信息
$ route add -host 10.10.10.100 dev lo:0
$ route -n
$ echo >> "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
测试访问:
查看LVS 的入站出站流量情况:
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 2 14 0 1818 0
-> 10.10.10.13:80 1 6 0 736 0
-> 10.10.10.14:80 1 8 0 1082 0
3.3.2 LVS + DR + Keepalived 步骤2
在 LVS-1 机器中操作执行:
- 安装 Keepalived 软件
#CentOS 7光盘镜像自带有 Keepalived 直接安装即可
$ yum install -y kernel-devel openssl-devel popt-devel gcc*
$ yum install -y keepalived
### ------------------------------------------------------------------------------- ###
#CentOS 6操作:
#所需软件百度网盘
#链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA #提取码:ton9
#上传Keepalived,然后挂载
$ yum -y install lrzsz #方便把软件直接拖到xshell里面
#上传Keepalived.iso 镜像文件到家目录
#由于 keepalived是一个镜像文件,所以创建一个目录,方便挂载
$ mkdir /mnt/iso1
#挂载
$ mount -o loop Keepalived.iso /mnt/iso1
$ cp -a /mnt/iso1/* .
#安装 Keepalived
# 安装相关 keepalived 依赖
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ tar -zxvf keepalived-1.2.2.tar.gz && cd keepalived-1.2.2
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
#编译安装
$ make && make install
$ chkconfig --add keepalived
# 设置 Keepalived 开机自启
$ chkconfig keepalived on
- 配置 Keepalived 软件信息
#修改配置
$ vim /etc/keepalived/keepalived.conf
global_defs {
router_id R1 #命名主机名,同一个组名称不能一致
}
#VRRP相关设置
vrrp_instance VI_1 {
state MASTER # 设置服务类型主/从(MASTER/SLAVER)
interface eth0 # 指定那块网卡用来监听
virtual_router_id 66 # 设置组号, 如果是一组就是相同的 ID 号, 一个主里面只能有一个主 服务器和多个从服务器
priority 80 # 服务器优先级, 主服务器优先级高 ,主从差距最好是50
advert_int 1 # 心跳时间, 检测对方存活
authenticetion { # 存活验证密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.100 #设置集群地址,vip(虚拟ip地址)
}
}
#虚拟服务
virtual_server 10.10.10.100 80 {# 设置集群地址 以及端口号
delay_loop 6 # 健康检查间隔
lb_algorr # 使用轮询调度算法
lb_kind DR # DR 模式的群集
#net_mask 255.255.255.0 #子网掩码
#persisitence_timeout 50 #持久化
protocol TCP # 使用的协议
#真实服务器健康状态监测,几个真实服务器就写几个real_server
real_server 10.10.10.13 80 { # 管理的网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
#真实服务器健康状态监测
real_server 10.10.10.14 80 { # 管理的第二个网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
}
# 多余删除 dG 删除光标之后的所有内容
#CentOS 7启动 keepalived 服务
$ systemctl enable --now keepalived
$ cat /var/log/messages
#CentOS 6启动 keepalived 服务
$ service keepalived start
$ cat /var/log/messages
在 LVS-2 机器中操作执行:
- 配置网络
问题:LVS-2 如果创建一个 ifcfg-eth0:0 绑定 10.10.10.100 地址,请问可以正常起来的嘛?
正常情况下是肯定不能起来的,判断能不能起来其实是通过网卡的启动脚本实现的,将参数改为拒绝即可。在同一个局域网内两个 10.10.10.100 地址会发生一会访问这一台机器,一会访问另一台机器的情况。
Keepalived 会绑定 机器的ARP权限,这样就能确保局域网只能拥有一个 10.10.10.100 的地址。
关闭网卡启动脚本的拒绝,就能启动这个网卡,局域网两个相同的ip,请求会平均分发,keepalived会绑定vrrp权限,如果主或者,从的不会使用,主挂了,才会使用从
$ systemctl stop NetworkManager
$ systemctl disable --now NetworkManager
$ cd /etc/sysconfig/network-scripts
$ cp ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="eth0:0"
DEVICE="eth0:0"
ONBOOT="yes"
IPADDR="10.10.10.100"
PREFIX="32"
$ ifup eth0:0
ERROR : [/etc/sysconfig/network-scripts/ifup-eth] Error, some other host (00:0C:29:16:73:35) already uses address 10.10.10.100.
#修改网卡的启动脚本
$ vim /etc/sysconfig/network-scripts/ifup-eth
#大概在280行,各版本的Linux系统的行数不同,要进行一定的调整
# if [ $? = 1 ]; then
# ARPINGMAC=$(echo $ARPING | sed -ne 's/.*\[\(.*\)\].*/\1/p')
# net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."
# exit 1
# fi
$ ifup eth0:0
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:70:8a:d6 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.12/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.10.10.100/32 brd 10.10.10.100 scope global eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe70:8ad6/64 scope link
valid_lft forever preferred_lft forever
- 关闭网卡重定向功能
$ cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
EOF
#重新加载配置文件
$ sysctl -p
- 安装 Keepalived 软件
#CentOS 7光盘镜像自带有 Keepalived 直接安装即可
$ yum install -y kernel-devel openssl-devel popt-devel gcc*
$ yum install -y keepalived
### ------------------------------------------------------------------------------- ###
#CentOS 6操作:
#所需软件百度网盘
#链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA #提取码:ton9
#上传Keepalived,然后挂载
$ yum -y install lrzsz #方便把软件直接拖到xshell里面
#上传Keepalived.iso 镜像文件到家目录
#由于 keepalived是一个镜像文件,所以创建一个目录,方便挂载
$ mkdir /mnt/iso1
#挂载
$ mount -o loop Keepalived.iso /mnt/iso1
$ cp -a /mnt/iso1/* .
#安装 Keepalived
# 安装相关 keepalived 依赖
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ tar -zxvf keepalived-1.2.2.tar.gz && cd keepalived-1.2.2
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
#编译安装
$ make && make install
$ chkconfig --add keepalived
# 设置 Keepalived 开机自启
$ chkconfig keepalived on
- 配置 Keepalived 软件信息
#把远程服务器的keepalived.conf 下载到本地/etc/keepalived目录下
$ scp root@10.10.10.11:/etc/keepalived/keepalived.conf /etc/keepalived/
#修改配置
$ vim /etc/keepalived/keepalived.conf
#修改 1:router_id R1 修改为 router_id R2
#修改 2:state MASTER 修改至 state SLAVER
#修改 3:priority 100 修改至 priority 47 一般建议与主服务器差值为 50
global_defs {
router_id R2 #命名主机名,同一个组名称不能一致
}
#VRRP相关设置
vrrp_instance VI_1 {
state SLAVER # 设置服务类型主/从(MASTER/SLAVER)
interface eth0 # 指定那块网卡用来监听
virtual_router_id 66 # 设置组号, 如果是一组就是相同的 ID 号, 一个主里面只能有一个主 服务器和多个从服务器
priority 60 # 服务器优先级, 主服务器优先级高 ,主从差距最好是50
advert_int 1 # 心跳时间, 检测对方存活
authenticetion { # 存活验证密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.100 #设置集群地址,vip(虚拟ip地址)
}
}
#虚拟服务
virtual_server 10.10.10.100 80 {# 设置集群地址 以及端口号
delay_loop 6 # 健康检查间隔
lb_algorr # 使用轮询调度算法
lb_kind DR # DR 模式的群集
#net_mask 255.255.255.0 #子网掩码
#persisitence_timeout 50 #持久化
protocol TCP # 使用的协议
#真实服务器健康状态监测,几个真实服务器就写几个real_server
real_server 10.10.10.13 80 { # 管理的网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
#真实服务器健康状态监测
real_server 10.10.10.14 80 { # 管理的第二个网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
}
# 多余删除 dG 删除光标之后的所有内容
#CentOS 7启动 keepalived 服务
$ systemctl enable --now keepalived
$ cat /var/log/messages
#CentOS 6启动 keepalived 服务
$ service keepalived start
$ cat /var/log/messages
注意:先安装 Keepalived ,不用配置 LVS了,Keepalived 可以管理!!!
- 配置 LVS 信息
$ yum install -y ipvsadm
#等待Keepalived 同步数据,即可查到相关的配置信息
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 rr
-> 10.10.10.13:80 Route 1 0 0
-> 10.10.10.14:80 Route 1 0 0
#使其 ipvsadm 配置永久生效(CentOS 7使用)
ipvsadm -Sn > /etc/sysconfig/ipvsadm
#ipvsadm-save > /etc/sysconfig/ipvsadm
#清楚ipvs规则
#ipvsadm -C
#恢复命令:
#ipvsadm-restore < /etc/sysconfig/ipvsadm
#启动ipvsadm服务,并设置为开机启动
$ systemctl enable --now ipvsadm.service
#查看服务状态
$ systemctl status ipvsadm.service
#重启服务
$ systemctl restart ipvsadm.service
#开机自动加载集群规则
$ echo "/usr/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" >> /etc/rc.local
3.3.3 测试访问
访问:http://10.10.10.100
查看到此的连接数情况,在LVS-1机器上执行
#在LVS1上操作
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 48 277 0 40177 0
-> 10.10.10.13:80 24 147 0 22834 0
-> 10.10.10.14:80 24 130 0 17343 0
#将LVS1机器关机,或者将网线拔掉进行实验操作
$ ifdown eth0
再次进行访问: http://10.10.10.100 (访问刷新一次)
依旧可以正常访问。查看到此的连接数情况,在LVS-2机器上执行
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 2 14 0 2256 0
-> 10.10.10.13:80 1 7 0 1128 0
-> 10.10.10.14:80 1 7 0 1128 0
Keepalived 还会对后台的真实服务器进行健康性检测,例如将 10.10.10.13 Web 机器停止服务
#将 10.10.10.13 Web 机器停止服务
$ systemctl stop httpd
#在LVS-2机器上进行查看,自动进行剔除停止服务的机器
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 rr
-> 10.10.10.14:80 Route 1 0 2
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 6 42 0 6768 0
-> 10.10.10.14:80 3 21 0 3384 0
#将 10.10.10.13 Web 机器开启服务
$ systemctl start httpd
#在LVS-2机器上进行查看,自动添加开启服务的机器
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 rr
-> 10.10.10.13:80 Route 1 0 0
-> 10.10.10.14:80 Route 1 0 0
$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 6 42 0 6768 0
-> 10.10.10.13:80 0 0 0 0 0
-> 10.10.10.14:80 3 21 0 3384 0
3.4 Heartbeat + Nginx
3.4.1 Heartbeat 简介
Heartbeat 是一款开源提供高可用(Highly-Available)服务的软件,通过 heartbeat 可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务。
Heartbeat是Linux-HA项目中的一个组件,也是当前开源HA项目中最成功的一个例子,它提供了所有HA软件所需要的基本功能,如心跳检测和资源接管、监测群集中的系统服务、在群集中的节点间转移共享IP地址的所有者等。heartbeat最核心的功能包括两个部分,心跳监测和资源接管。心跳监测可以通过网络链路和串口进行,而且支持冗 余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
Heartbeat 是 Linux-HA 工程的一个组件,自 1999 年开始到现在,发布了众多版本,是目前开源 Linux-HA 项目中最成功的一个例子,在行业内得到了广泛的应用。
3.4.2 Heartbeat 工作原理
通过修改配置文件,指定哪一台Heartbeat服务器作为主服务器,则另一台将自动成为备份服务器。然后在指定备份服务器上配置Heartbeat守护进程来监听来自主服务器的心跳。如果备份服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务所有权,接替主服务器继续不间断的提供服务,从而达到资源服务高可用性的目的。
以上描述的是Heartbeat主备的模式,Heartbeat还支持主主模式,即两台服务器互为主备,这时它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内为收到对方发送的心跳报文,那么久认为对方失效或者宕机了,这时就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续对用户提供服务。正常情况下,可以较好的实现主机故障后,业务仍不间断的持续运行。
keepalived主要控制IP飘移,配置应用简单,而且分层,layer3,4,5,各自配置极为简单。heartbeat不但可以控制IP飘移,更擅长对资源服务的控制,配置,应用比较复杂。lvs的高可用建议用keepavlived;业务的高可用用heartbeat。
3.4.3 Heartbeat + Nginx 构建
基础环境搭建
如果使用其它版本可以配置 eperl 源下载安装。环境准备
- 配置时间同步服务
- 配置主机名解析
两台nginx服务器:10.10.10.11、10.10.10.12
所需软件百度网盘
链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA
提取码:ton9
3.4.3.1 两台 Nginx Web服务器需要安装 Nginx 软件
#CentOS 7通过在 nginx 官网进行下载
#http://nginx.org/ | http://nginx.org/en/download.html | http://nginx.org/download/nginx-1.22.0.tar.gz
$ tar -zxvf nginx-1.22.0.tar.gz -C /opt/
$ cd /opt/nginx-1.22.0
$ useradd -s /sbin/nologin -M nginx
$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
$ make && make install
#在代码块下面会进行网页配置
#CentOS 6通过所需的软件进行源码包安装
#挂载yum光盘
$ mount -t iso9660 /dev/cdrom /mnt/cdrom
#方便把软件直接拖到xshell里面
$ yum -y install lrzsz
$ tar -zxvf nginx-1.2.6.tar.gz && cd nginx-1.2.6
#安装依赖
$ yum -y install pcre pcre-devel zlib zlib-devel
$ useradd -s /sbin/nologin -M nginx
#不允许远程登陆,-M 不创建家目录
$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
#编译安装
$ make && make install
### ---------------------------------------------------------------------- ###
#生产环境网页内容是一致的
$ echo "This is the nginx1" > /usr/local/nginx/html/index.html
#10.10.10.11服务器
$ echo "This is the nginx2" > /usr/local/nginx/html/index.html
#10.10.10.12服务器
$ /usr/local/nginx/sbin/nginx
#启动nginx
$ curl 127.0.0.1
#测试访问
$ netstat -auntlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10875/nginx: master
#查看端口
###CentOS 6 Nginx服务操作
service nginx start
service nginx stop
### 两台服务器均执行 ###
3.4.3.2 配置主机名解析
#CentOS 7的配置
$ hostnamectl set-hostname www.centos1.com
$ hostnamectl set-hostname www.centos2.com
$ cat >> /etc/hosts <<EOF
#Nginx Config BEGIN
10.10.10.11 www.centos1.com
10.10.10.12 www.centos2.com
#Nginx Config END
EOF
#CentOS 6的配置
$ vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=www.centos1.com
#另台的HOSTNAME=www.centos2.com
$ cat >> /etc/hosts <<EOF
#Nginx Config BEGIN
10.10.10.11 www.centos1.com
10.10.10.12 www.centos2.com
#Nginx Config END
EOF
3.4.3.3 配置时间同步服务
#安装 ntp 时间同步软件
$ yum install -y ntp
#配置 ntp 配置文件
$ vim /etc/ntp.conf
...省略部分输出...
#配置当前网段
restrict 10.10.10.0 mask 255.255.255.0 nomodify notrap
...
#server全部注释,不采用官方
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
fudge 127.127.1.0 stratum 10
...省略部分输出...
#CentOS 7启动时间同步服务
$ systemctl enable --now ntpd.service
#CentOS 6启动时间同步服务
$ service ntpd start && chkconfig ntpd on
#客户端配置时间同步
$ yum install -y ntp
$ ntpdate -u 10.10.10.11
3.4.3.4 Heartbeat 配置(主服务器)
(1)安装 Heartbeat 软件
#所需软件百度网盘
#链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA
#提取码:ton9
###该适用于CentOS 6安装部署
tar -zxvf heartbeat.tar.gz -C /opt/
cd /opt/heartbeat && yum localinstall -y *
###该适用于CentOS 7安装部署
###若受不了依赖,则可以使用添加网卡后,设置成外网可以访问
###这里我使用外网的方式进行安装
#测试可否访问外网
$ ping -c 1 -W 1 www.baidu.com
PING www.baidu.com (183.232.231.172) 56(84) bytes of data.
64 bytes from 183.232.231.172: icmp_seq=1 ttl=128 time=16.8 ms
--- www.baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 16.880/16.880/16.880/0.000 ms
#下载阿里云的EPEL源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#1.安装基础环境包
yum install -y gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc
#2.创建用户和组
groupadd haclient
useradd -g haclient hacluster
#3.下载软件包:Reusable-Components-glue、resource-agents、heartbeat
wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2
wget http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2
wget https://github.com/ClusterLabs/resource-agents/archive/v3.9.6.tar.gz
#4.安装glub
tar xf 0a7add1d9996.tar.bz2
cd Reusable-Cluster-Components-glue--0a7add1d9996/
./autogen.sh
./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
make && make install
echo $?
cd ..
#5.安装Resource Agents
tar xf v3.9.6.tar.gz
cd resource-agents-3.9.6/
./autogen.sh
./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
make && make install
echo $?
cd ..
#6.安装HeartBeat
tar xf 958e11be8686.tar.bz2
cd Heartbeat-3-0-958e11be8686/
./bootstrap
export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
make && make install
echo $?
#7.配置网卡支持插件文件
mkdir -pv /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
cp /usr/lib/ocf/lib/heartbeat/ocf-* /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
#注意:一般启动时会报错因为 ping和ucast这些配置都需要插件支持
#需要将lib64下面的插件软连接到lib目录 才不会抛出异常
ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/
ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/
#### Heartbeat 从服务器安装也是一样的 ####
(2)配置 Heartbeat 软件
#拷贝三个模版配置文件到 /usr/local/heartbeat/etc/ha.d 目录下
cd /usr/local/heartbeat/share/doc/heartbeat
cp ha.cf haresources authkeys /usr/local/heartbeat/etc/ha.d/
cd /usr/local/heartbeat/etc/ha.d/
(3)配置认证服务,节点之间的认证配置,修改 /usr/local/heartbeat/etc/ha.d/authkeys ,在主上修改
#生成密钥随机数
$ dd if=/dev/random bs=512 count=1 | openssl md5
0+1 records in
0+1 records out
115 bytes (115 B) copied, 0.000184164 s, 624 kB/s
(stdin)= 3530ba6f2c7d15fb93dc5b438c22f4a7
#修改配置文件
$ vim authkeys
auth 1
1 md5 3530ba6f2c7d15fb93dc5b438c22f4a7
#配置权限
$ chmod 600 authkeys
(4)heartbeat 主配置文件,修改 /usr/local/heartbeat/etc/ha.d/ha.cf ,在主上修改
$ vim ha.cf
bcast eth0
#一主一备节点,需要注意能够被两台主机之间解析
node www.centos1.com
node www.centos2.com
(5)配置 /usr/local/heartbeat/etc/ha.d/haresources 文件,在主上修改
$ vim haresources
www.centos1.com IPaddr::10.10.10.100/24/eth0:0
#相当于ifocnfig eth0:0 10.10.10.100 netmask 255.255.255.0
(6)将主三个配置文件拷贝到从服务器上
scp ha.cf haresources authkeys root@10.10.10.12:/usr/local/heartbeat/etc/ha.d/
(7)启动服务
#启动每个节点上heartbeat服务
systemctl enable heartbeat
systemctl start heartbeat
3.4.3.5 测试
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:73:35 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.11/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.10.10.100/24 brd 10.10.10.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe16:7335/64 scope link
valid_lft forever preferred_lft forever
##注意:Heartbeat 启动并加载配置要一定的时间
#查看日志情况
tail -f /var/log/message
在浏览器在访问 http://10.10.10.100 进行测试
在将主服务器的网线断开(或者将 heartbeat 服务停止),进行测试。在从服务器在实时观察
$ watch -n1 ipaddr show
#查看到eth0已经出现了eth0:0 子接口
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:70:8a:d6 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.12/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.10.10.100/24 brd 10.10.10.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe70:8ad6/64 scope link
valid_lft forever preferred_lft forever
再次浏览器在访问 http://10.10.10.100 进行测试
当主服务器的网线重新恢复(或者将 heartbeat 服务启动成功),主服务器会将VIP进行抢占
#主服务器的VIP地址出现
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:73:35 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.11/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.10.10.100/24 brd 10.10.10.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe16:7335/64 scope link
valid_lft forever preferred_lft forever
#从服务器的VIP地址消失
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:70:8a:d6 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.12/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe70:8ad6/64 scope link
valid_lft forever preferred_lft forever
推荐使用 keepalived VRRP技术进行实现高可用,技术比较成熟。
Heartbeat v2 会有一个资源控制器,可以自动调整对应服务的状态,自动进行服务的监控和服务的启停。而 Heartbeat v3 则将该功能剥离出去了,所以如果是网络不通了,Heartbeat 服务关了,服务器宕机了,那这种情况是可以实现对应服务的切换。但是有一天是将 Heartbeat 机器上的应用服务关闭了,那么Heartbeat 是无法检测的。
关闭其中一个服务器,就可以自动切换,HeartBeat 检测的是网络通信的能力,而不是提供应用服务是否存活。需要脚本来配合 HeartBeat 的启停服务。
$ mkdir /usr/local/script && cd /usr/local/script
$ vim 80.sh
#!/bin/bash
PWD=/usr/local/script/
URL="http://10.10.10.11/index.html"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
if [ $HTTP_CODE != 200 ]
then
service heartbeat stop
fi
#添加定时检测
$ crontab -e
*/1 * * * * bash /usr/local/script/80.sh
#CentOS 7的crond 服务操作
systemctl enable --now crond
#CentOS 6的crond 服务操作
service crond restart
chkconfig --add crond && chkconfig crond on