一、Keepalived
1.带健康检查的LVS工具
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉.Keepalived自带健康检查,LVS自带的ipvsdm软件不具备健康检查功能.
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
2.Keepalived工作层
Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及会话层,原理分别如下:
Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。
补充:MD5算法虽然是个加密算法,但是它也可以用于检测文件是否变化,我们将某个文件通过md5算法加密后得到一串密文,我们改变了文件的内容再做md5加密后又会得到一串密文,如果第二次密文不等于第一串密文可以反推出文件内容发生变化.
五层正是利用这个特性做的检查,如果一个服务器是健康的我们要求它的文件内容不被篡改,否则Keepalived将它从服务池中删除.
二、使用Keepalived
1.拓扑图
准备三台Linux服务器,两台做Web服务器,并部署Keepalived高可用软件.这个实验用web1作为主服务器,用web2作为备份服务器,但是他们两者也是Web服务器,没有在他们的前面加入一个调度服务器,下一个实验将会补充
- 使用Keepalived实现web服务器的高可用
- Web服务器IP地址分别为192.168.4.100和192.168.4.200
- Web服务器的浮动VIP地址(vrrp)为192.168.4.80
- 客户端通过访问VIP地址访问Web页面
2.Web服务器配置
1)创建Web服务
- [root@web1 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.100/24 connection.autoconnect yes
- [root@web1 ~]# nmcli connection up eth0 //配置并激活ip地址
- [root@web1 ~]# yum -y install httpd //装web服务用于测试访问效果哦
- [root@web1 ~]# echo "192.168.4.100" > /var/www/html/index.html
- [root@web1 ~]# systemctl restart httpd
2)修改Keepalived配置文件
keepalived文件分为3个部分,第一部分是定义了收发邮件人 global_defs{...}
第二部分定义了vrrp虚拟接口 vrrp_instance xx{..}
第三部分定义了虚拟服务器virtual_server x.x.x.x {...}
标注了实验需要修改的须修改
web1:
- [root@web1 ~]#yum install -y keepalived //装服务
- [root@web1 ~]# vim /etc/keepalived/keepalived.conf //修改配置文件
- //第一部分
- global_defs {
- notification_email {
- root@localhost #设置报警收件人邮箱
- }
- notification_email_from root@localhost #设置发件人
- smtp_server 127.0.0.1 #定义邮件服务器,为本机
- smtp_connect_timeout 30
- router_id web1 #设置路由ID号(实验需要修改),修改成本机主机名
- }
- //第二部分
- vrrp_instance VI_1 {
- state MASTER #主服务器为MASTER(备服务器web2需要修改为BACKUP)
- interface eth0 # 定义网络接口,默认是本机第一张网卡
- virtual_router_id 51 #主备服务器VRID号必须一致
- priority 100 #服务器优先级,优先级高优先获取VIP,Web2需要调低这个优先级
- advert_int 1
- authentication {
- auth_type pass
- auth_pass 1111 #主备服务器密码必须一致
- }
- virtual_ipaddress { #为这个网络接口(网卡)配置VIP(实验需要修改)
- 192.168.4.80
- }
- }
web2:
- [root@web2 ~]#yum install -y keepalived //装服务
- [root@web2 ~]# vim /etc/keepalived/keepalived.conf //修改配置文件
- //第一部分
- global_defs {
- notification_email {
- root@localhost #设置报警收件人邮箱
- }
- notification_email_from root@localhost #设置发件人
- smtp_server 127.0.0.1 #定义邮件服务器
- smtp_connect_timeout 30
- router_id web2 #设置路由ID号(实验需要修改),修改成本机主机名
- }
- //第二部分
- vrrp_instance VI_1 {
- state BACKUP #备服务器web2需要修改为BACKUP
- interface eth0 #定义网络接口,默认是本机第一张网卡
- virtual_router_id 51 #主备服务器VRID号必须一致
- priority 80 #服务器优先级,优先级高优先获取VIP,Web2需要调低这个优先级
- advert_int 1
- authentication {
- auth_type pass
- auth_pass 1111 #主备服务器密码必须一致
- }
- virtual_ipaddress { #为这个网络接口(网卡)配置VIP(实验需要修改)
- 192.168.4.80
- }
- }
3)启动并测试
- [root@web1 ~]# systemctl start keepalived
- [root@web2 ~]# systemctl start keepalived
- [root@web1 ~]# iptables -F //启动keepalived会自动添加一个drop的防火墙规则,需要清空!
- [root@web1 ~]# setenforce 0
- [root@web2 ~]# iptables -F
- [root@web1 ~]# setenforce 0
- [root@web1 ~]# ip addr show eth0 //查看一下 红色标记的就是VIP 确认你修改的是哪一张网卡
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:24:81:b8 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.100/24 brd 192.168.4.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 192.168.4.80/32 scope global eth0
valid_lft forever preferred_lft forever - [root@web1~]# ip addr show eth0
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:24:81:b8 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.200/24 brd 192.168.4.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 192.168.4.80/32 scope global eth0
valid_lft forever preferred_lft forever
4)客户端访问
客户端使用curl命令连接http://192.168.4.80,查看Web页面;关闭Web1服务器的网卡,客户端再次访问http://192.168.4.80,验证是否可以正常访问服务。若关闭Web1后仍然可以访问,说明实验成功