Keepalived+LVS
Keepalived原理
1、Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能
2、VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务3、Keepalived案例讲解 Keepalived可实现多机热备,每个热备组可有多台服务器
双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
Keepalived工具介绍(作用)
1.专为LVS和HA设计的一款健康检查工具
2.支持故障自动切换(Failover)
3.支持节点健康状态检查(Health Checking)
LVS+Keepalived高可用群集
1、Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器、管理服务器池,而不仅仅用做双击热备
2、使用Keepalived构建LVS群集更加简便易用
3、主要优势
对LVS负载调度器实现热备切换,提高可用性
对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入
项目环境
配置步骤
主LVS
[root@lvs1 ~]# modprobe ip_vs ###加载ip_vs模块
[root@lvs1 ~]# yum -y install ipvsadm-1.27-7.el7.x86_64 ###安装管理软件ipvsadm
[root@lvs1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@lvs1 ~]# tar zxf keepalived-2.0.13.tar.gz
[root@lvs1 ~]# cd keepalived-2.0.13/
[root@lvs1 keepalived-2.0.13]# ./configure --prefix=/
[root@lvs1 keepalived-2.0.13]# make && make install
[root@lvs1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d ###加入系统管理服务
[root@lvs1 keepalived-2.0.13]# systemctl enable keepalived.service ###设置开机自启动
[root@lvs1 ~]# vi /etc/keepalived/keepalived.conf ###编辑配置文件
删除原有配置,重新添加:
! Configuration File for keepalived
global_defs { #全局参数
router_id LVS_01 #指定名称,各个服务器名称要不一样
}
vrrp_instance VI_1 { #指定vrrp热备参数
state MASTER #服务器角色是master,备份服务器设置为BACKUP
interface ens33 #修改物理网卡名称,默认是centos6的eth0
virtual_router_id 10 #组号相同
priority 110 #优先级,主服务器设置要大于备服务器
advert_int 1
authentication {
auth_type PASS #验证类型和密码,不建议修改
auth_pass 123
}
virtual_ipaddress {
192.168.100.100 #漂移地址(VIP)地址,可以有多个
}
}
virtual_server 192.168.100.100 80 { #配置虚拟服务器
delay_loop 6
lb_algo rr #调度算法为轮询
lb_kind DR #LVS的工作模式为DR(直连路由)
persistence_timeout 6
protocol TCP #健康检查用的是TCP还是UDP
real_server 192.168.100.20 80 {
weight 1
TCP_CHECK { #健康检查参数
connect_port 80 #检查80端口连接是否正常
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.30 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@lvs1 ~]# systemctl start keepalived
[root@lvs1 ~]# ip addr
备LVS
[root@lvs2 ~]# modprobe ip_vs ###加载ip_vs模块
[root@lvs2 ~]# yum -y install ipvsadm-1.27-7.el7.x86_64 ###安装管理软件ipvsadm
[root@lvs2 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@lvs2 ~]# tar zxf keepalived-2.0.13.tar.gz
[root@lvs2 ~]# cd keepalived-2.0.13/
[root@lvs2 keepalived-2.0.13]# ./configure --prefix=/
[root@lvs2 keepalived-2.0.13]# make && make install
[root@lvs2 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d ###加入系统管理服务
[root@lvs2 keepalived-2.0.13]# systemctl enable keepalived.service ###设置开机自启动
[root@lvs2 ~]# vi /etc/keepalived/keepalived.conf ###编辑配置文件
删除原有配置,重新添加:
! Configuration File for keepalived
global_defs { #全局参数
router_id LVS_02 #指定名称,各个服务器名称要不一样
}
vrrp_instance VI_1 { #指定vrrp热备参数
state BACKUP #服务器角色是master,备份服务器设置为BACKUP
interface ens33 #修改物理网卡名称,默认是centos6的eth0
virtual_router_id 10 #组号相同
priority 105 #优先级,主服务器设置要大于备服务器
advert_int 1
authentication {
auth_type PASS #验证类型和密码,不建议修改
auth_pass 123
}
virtual_ipaddress {
192.168.100.100 #漂移地址(VIP)地址,可以有多个
}
}
virtual_server 192.168.100.100 80 { #配置虚拟服务器
delay_loop 6
lb_algo rr #调度算法为轮询
lb_kind DR #LVS的工作模式为DR(直连路由)
persistence_timeout 6
protocol TCP #健康检查用的是TCP还是UDP
real_server 192.168.100.20 80 {
weight 1
TCP_CHECK { #健康检查参数
connect_port 80 #检查80端口连接是否正常
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.30 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@lvs1 ~]# systemctl start keepalived
[root@lvs1 ~]# ip addr
主LVS和备LVS配置文件区别
以主服务器为例,先修改keepalived master服务器配置文件,备服务器只需在keepalived master服务器配置文件的基础上修改router_id、state、priority三个参数即可
NFS共享目录配置
[root@nfs ~]# systemctl stop firewalld ###关闭防火墙
[root@nfs ~]# setenforce 0
[root@nfs ~]# yum -y install rpcbind nfs-utils ###安装rpcbind和nfs-utils软件包(默认安装)
[root@nfs ~]# mkdir /opt/web1 /opt/web2 ###创建共享目录
[root@nfs ~]# vi /opt/web1/index.html
添加:<h1>Hello</h1>
[root@nfs ~]# vi /opt/web2/index.html
添加:<h1>Word</h1>
[root@nfs ~]# vi /etc/exports
添加:
/opt/web1 192.168.100.20/24(ro)
/opt/web2 192.168.100.30/24(ro)
[root@nfs ~]# systemctl restart nfs ###重启服务
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# showmount -e
Export list for nfs:
/opt/web2 192.168.100.30/24
/opt/web1 192.168.100.20/24
Web1 配置
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# setenforce 0
[root@web1 ~]# vi web1.sh
添加:
#!/bin/bash
ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up
route add -host 192.168.100.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
[root@web1 ~]# sh web.sh
[root@web1 ~]# ifconfig ###查看是否有虚拟路由生成
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.20 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::e98d:5e18:5e52:25ca prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ae:cb:b0 txqueuelen 1000 (Ethernet)
RX packets 6599 bytes 1664134 (1.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2671 bytes 333575 (325.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 264 bytes 29384 (28.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 264 bytes 29384 (28.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.100.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:a5:8f:c7 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# showmount -e 192.168.100.40
Export list for 192.168.100.40:
/opt/web2 192.168.100.30/24
/opt/web1 192.168.100.20/24
[root@web1 ~]# mount 192.168.100.40:/opt/web1 /var/www/html
[root@web1 ~]# systemctl start httpd
Web2 配置
[root@web2 ~]# systemctl stop firewalld
[root@web2 ~]# setenforce 0
[root@web2 ~]# vi web2.sh
添加:
#!/bin/bash
ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up
route add -host 192.168.100.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null
[root@web2 ~]# sh web2.sh
[root@web2 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.30 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::a84d:dfac:ebd3:131a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c9:b5:bf txqueuelen 1000 (Ethernet)
RX packets 3601 bytes 1432053 (1.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2553 bytes 307718 (300.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 336 bytes 36680 (35.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 336 bytes 36680 (35.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.100.100 netmask 255.255.255.255
loop txqeuelen 1 (Local Loopback)
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:02:2f:b3 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# showmount -e 192.168.100.40
Export list for 192.168.100.40:
/opt/web2 192.168.100.30/24
/opt/web1 192.168.100.20/24
[root@web2 ~]# mount 192.168.100.40:/opt/web2 /var/www/html
[root@web2 ~]# systemctl start httpd
测试验证
浏览器输入:http://192.168.100.100