LVS+Keepalived群集
Keepalived案例分析
■ 企业应用中,单台服务器承担应用存在单点故障的危险
■ 单点故障一旦发生,企业服务将发生中断,造成极大的危害
Keepalived工具介绍
■ 专为LVS和HA设计的一款健康检查工具
作用:
● 支持故障自动切换(Failover)
● 支持节点健康状态检查(Health Checking)
● 官方网站: http://www.keepalived.orgl
Keepalived实现原理剖析
■ Keepalived采用VRRP热备份协议
实现Linux服务器的多机热备功能
● 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
● 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
● 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
Keepalived案例讲解
■ Keepalived可实现多机热备,每个热备组可有多台服务器
■ 实现基于Web服务的双机热备
Keepalived安装与启动
■ 在LVS群集环境中应用时,也需用到ipvsadm管理工具
■ YUM安装Keepalived
■ 启用Keepalived服务
配置Keepalived master服务器
■ Keepalived配置目录位于letc/keepalivedl
■ keepalived.conf提是主配置文件
● global_defs {…}区段指定全局参数
● vrrp_instance 实例名称{…}区段指定VRRP热备参数
●注释文字以"!"符号开头
● 目录samples,提供了许多配置样例作为参考
配置Keepalived master服务器
■ 常用配置选项
● router id HA_TEST_R1:本路由器(服务器)的名称
● vrrp_instance Vl_1∶定义VRRP热备实例
● state MASTER:热备状态,MASTER表示主服务器
● interface ens33:承载VIP地址的物理接口
● virtual_router_id 1:虚拟路由器的ID号,每个热备组保持一致
● priority 100:优先级,数值越大优先级越高
● advert_int 1:通告间隔秒数(心跳频率)
● auth_type PASS:认证类型
● auth_pass 123456:密码字串
● virtual_ipaddress { vip]}:指定漂移地址(VIP),可以有多个
配置Keepalived slave服务器
■ Keepalived备份服务器的配置与master的配置有三选项不同
● router_id:设为自有名称
● state:设为BACKUP
● priority:值低于主服务器
■ 其他选项与master相同
Keepalived双机热备效果测试
■ 测试双机热备的效果
● 主、备机均启用Web服务,设置不同内容
● 先后禁用、启用主服务器的网卡
■ 执行的测试
● 测试1:使用ping虚拟地址检测连通性
● 测试2:在浏览器上访问虚拟地址,确认可用性及内容变化
● 测试3:查看日志文件/var/log/messages中的变化
部署流程
NFS服务器配置
[root@nfs ~]# systemctl stop firewalld
[root@nfs ~]# setenforce 0
[root@nfs ~]# yum -y install nfs-utils
[root@nfs ~]# yum -y install rpcbind
[root@nfs ~]# mkdir /opt/web1
[root@nfs ~]# mkdir /opt/web2
[root@nfs ~]# echo "<h1> this is web1. </h1>" > /opt/web1/index.html
[root@nfs ~]# echo "<h1> this is web2. </h1>" > /opt/web2/index.html
[root@nfs ~]# vi /etc/exports
/opt/web1 192.168.10.30/24 (ro)
/opt/web2 192.168.10.40/24 (ro)
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# showmount -e
Export list for localhost.localdomain:
/opt/web2 192.168.10.40/24
/opt/web1 192.168.10.30/24
Web1服务器配置
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# setenforce 0
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# showmount -e 192.168.10.50
[root@web1 ~]# mount 192.168.10.50:/opt/web1 /var/www/html/
[root@web1 ~]# df -Th
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# netstat -anpt | grep 80
[root@web1 ~]# curl http://localhost
[root@web1 ~]# vi web1.sh
#!/bin/bash
ifconfig lo:0 192.168.10.100 broadcast 192.168.10.100 netmask 255.255.255.255 up
route add -host 192.168.10.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
[root@web1 ~]# sh web1.sh
[root@web1 ~]# ifconfig
[root@web1 ~]# route -n
Web2服务器配置
[root@web2 ~]# systemctl stop firewalld
[root@web2 ~]# setenforce 0
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# mount 192.168.10.50:/opt/web2 /var/www/html
[root@web2 ~]# df -Th
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# curl http://localhost
[root@web2 ~]# vi web2.sh
#!/bin/bash
ifconfig lo:0 192.168.10.100 broadcast 192.168.10.100 netmask 255.255.255.255 up
route add -host 192.168.10.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
[root@web2 ~]# sh web2.sh
[root@web2 ~]# ifconfig
[root@web2 ~]# route -n
lvs1主调度器配置
[root@lvs01 ~]# systemctl stop firewalld
[root@lvs01 ~]# setenforce 0
[root@lvs01 ~]# modprobe ip_vs
[root@lvs01 ~]# cat /proc/net/ip_vs
[root@lvs01 ~]# yum -y install ipvsadm
[root@lvs01 ~]# vi dr1.sh #编写调度脚本
#!/bin/bash
ifconfig ens33:0 192.168.10.100 broadcast 192.168.10.100 netmask 255.255.255.255 up #生成ens33:0端口为VIP地址,广播地址255.255.255.255,为了能让调度器发消息可接收
route add -host 192.168.10.100 dev ens33:0 #给ens33:0添加路由
ipvsadm -C #清除虚拟服务器表中所有记录
ipvsadm -A -t 192.168.10.100:80 -s rr #创建虚拟服务器
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.30:80 -g #添加服务器节点,虚拟地址映射真实web1地址
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.40:80 -g #添加服务器节点,虚拟地址映射真实web2地址
ipvsadm -Ln
[root@lvs01 ~]# sh dr1.sh
[root@lvs01 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@lvs01 ~]# tar zxvf keepalived-2.0.13.tar.gz
[root@lvs01 ~]# cd keepalived-2.0.13/
[root@lvs01 keepalived-2.0.13]# ./configure --prefix=/ #配置文件
[root@lvs01 keepalived-2.0.13]# make && make install
[root@lvs01 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d #把keepalived加入系统管理服务
[root@lvs01keepalived-2.0.13]# cd
[root@lvs01 ~]# systemctl enable keepalived.service #开机自启
[root@lvs01 ~]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id lvs_01 #本服务器名称
}
vrrp_instance vi_1 { #定义VRRP热备实例
state MASTER #热备状态,MASTER表示主服务器,BACKUP表示从服务器
interface ens33 #承载VIP地址的物理接口
virtual_router_id 51 #虚拟路由器的ID号,每个热备组保持一致
priority 110 #优先级,数值越大越优先级越高,默认100
advert_int 1 #通告间隔秒数(心跳频率)
authentication { # 热备认证信息,每个热备组保持一致
auth_type PASS #认证类型(密码认证)
auth_pass 6666 #密码字符串
}
virtual_ipaddress { # 指定漂移地址(VIP),虚拟地址,可以有多个
192.168.10.100
}
}
virtual_server 192.168.10.100 80 { #虚拟服务器地址(VIP),端口
lb_algo rr #轮询(rr)调度算法
lb_kind DR #直接路由(DR)群集工作模式
persistence_timeout 6 #连接保持时间6秒
protocol TCP #应用服务器采用的是TCP协议
real_server 192.168.10.30 80 { #第一个Web服务器节点的地址,端口(真实地址)
weight 1 #节点的权重
TCP_CHECK { # 健康检查方式
connect_port 80 #检查的目标端口
connect_timeout 3 #连接超时(秒)
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 192.168.10.40 80 { #第二个Web服务器节点的地址,端口(真实地址)
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@lvs01 ~]# systemctl start keepalived.service #启动服务
[root@lvs01 ~]# ip addr #查看虚拟地址,存在主调度器上
[root@lvs01 ~]# tail -100 /var/log/messages #查看调度情况
[root@lvs01 ~]# ipvsadm -Ln
lvs2备调度器配置
[root@lvs02 ~]# systemctl stop firewalld
[root@lvs2 ~]# setenforce 0
[root@lvs02 ~]# modprobe ip_vs
[root@lvs02 ~]# cat /proc/net/ip_vs
[root@lvs02 ~]# yum -y install ipvsadm
[root@lvs02 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@lvs02 ~]# tar zxvf keepalived-2.0.13.tar.gz
[root@lvs02 ~]# cd keepalived-2.0.13/
[root@lvs02 keepalived-2.0.13]# ./configure --prefix=/ #配置文件
[root@lvs02 keepalived-2.0.13]# make && make install
[root@lvs02 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d #把keepalived加入系统管理服务
[root@lvs02 keepalived-2.0.13]# cd
[root@lvs02 ~]# systemctl enable keepalived.service
[root@lvs02 ~]# vi dr2.sh #编写调度脚本
#!/bin/bash
ifconfig ens33:0 192.168.10.100 broadcast 192.168.10.100 netmask 255.255.255.255 up #生成ens33:0端口为VIP地址,广播地址255.255.255.255,为了能让调度器发消息可接收
route add -host 192.168.10.100 dev ens33:0 #给ens33:0添加路由
ipvsadm -C #清除虚拟服务器表中所有记录
ipvsadm -A -t 192.168.10.100:80 -s rr #创建虚拟服务器
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.30:80 -g #添加服务器节点,虚拟地址映射真实web1地址
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.40:80 -g #添加服务器节点,虚拟地址映射真实web2地址
ipvsadm -Ln
lvs01设置免密登录
[root@lvs01 ~]# ssh-keygen -t rsa
[root@lvs01 ~]# ssh-copy-id 192.168.10.20
[root@lvs01 ~]# scp /etc/keepalived/keepalived.conf root@192.168.10.20:/etc/keepalived/
在lvs2 服务器上编辑配置文件
[root@lvs02 ~]# vi /etc/keepalived/keepalived.conf
router_id lvs_02 #服务器名称
state BACKUP #热备状态,从服务器
priority 105 # 优先级
[root@lvs02 ~]# systemctl start keepalived.service 启动服务
[root@lvs02 ~]# systemctl status keepalived.service 查看服务状态
验证效果
关闭主调度器查看效果