1. 规划环境:
主机名称 | 服务器名称 | IP | 用途 |
centosnode1 | LVS_Master | 192.168.188.223 | 提供负载均衡 |
centosnode2 | LVS_Backup | 192.168.188.226 | 提供负载均衡 |
LVS-DR-VIP | 192.168.188.100 | 网站的VIP地址 | |
centosnode3 | Web1服务器 | 192.168.188.227 | 提供Web服务 |
centosnode4 | Web2服务器 | 192.168.188.228 | 提供Web服务 |
2. 配置LVS_Master的Keepalived实现LVS负载均衡:
- [root@centosnode1 ~]# vim /etc/keepalived/keepalived.conf
-
- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 192.168.200.1
- smtp_connect_timeout 30
- router_id MASTER
- }
-
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
-
- virtual_ipaddress {
- 192.168.188.100 ##设置vip
- }
- }
-
- virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
- delay_loop 6 ##定义RS运行情况监测时间间隔
- lb_algo rr ##设置负载均衡算法
- lb_kind DR ##设置lvs的工作模式
- persistence_timeout 50 ##定义会话保持时间,S为单位
- protocol TCP ##指定转发协议
-
- real_server 192.168.188.227 80 { ##定义真实服务器IP地址和端口
- weight 1 ##定义RS的权重
- TCP_CHECK { ##设置健康检查方式
- connect_timeout 8 ##定义超出8s连接超时
- nb_get_retry 3 ##定义重试次数
- delay_before_retry 3 ##定义重试时间间隔
- connect_port 80 ##定义健康检查端口
- }
- }
- }
-
- virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
- delay_loop 6 ##定义RS运行情况监测时间间隔
- lb_algo rr ##设置负载均衡算法
- lb_kind DR ##设置lvs的工作模式
- persistence_timeout 50 ##定义会话保持时间,S为单位
- protocol TCP ##指定转发协议
-
- real_server 192.168.188.228 80 { ##定义真实服务器IP地址和端口
- weight 1 ##定义RS的权重
- TCP_CHECK { ##设置健康检查方式
- connect_timeout 8 ##定义超出8s连接超时
- nb_get_retry 3 ##定义重试次数
- delay_before_retry 3 ##定义重试时间间隔
- connect_port 80 ##定义健康检查端口
- }
- }
- }
3. 配置LVS_Backup的Keepalived实现LVS负载均衡:
- [root@centosnode2 ~]# vim /etc/keepalived/keepalived.conf
-
- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 192.168.200.1
- smtp_connect_timeout 30
- router_id MASTER
- }
-
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 80
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
-
- virtual_ipaddress {
- 192.168.188.100 ##设置vip
- }
- }
-
- virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
- delay_loop 6 ##定义RS运行情况监测时间间隔
- lb_algo rr ##设置负载均衡算法
- lb_kind DR ##设置lvs的工作模式
- persistence_timeout 50 ##定义会话保持时间,S为单位
- protocol TCP ##指定转发协议
-
- real_server 192.168.188.227 80 { ##配置后端真实服务器
- weight 1
- TCP_CHECK { ##设置健康检查方式
- connect_timeout 8
- nb_get_retry 3
- delay_before_retry 3
- connect_port 80
- }
- }
- }
-
- virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
- delay_loop 6 ##定义RS运行情况监测时间间隔
- lb_algo rr ##设置负载均衡算法
- lb_kind DR ##设置lvs的工作模式
- persistence_timeout 50 ##定义会话保持时间,S为单位
- protocol TCP ##指定转发协议
-
- real_server 192.168.188.228 80 { ##配置后端真实服务器
- weight 1
- TCP_CHECK { ##设置健康检查方式
- connect_timeout 8
- nb_get_retry 3
- delay_before_retry 3
- connect_port 80
- }
- }
- }
4. 后端多台服务器做acl限制,这里通过shell脚本来对后端服务器做acl限制
- [root@centosnode3 ~]# vim /etc/init.d/lvs_rs
-
- #!/bin/bash
- # Startup script handle the initialisation of LVS
- # chkconfig: - 28 72
- # description: Initialise the Linux Virtual Server for DR
- ### BEGIN INIT INFO # Provides: ipvsadm
- # Required-Start: $local_fs $network $named
- # Required-Stop: $local_fs $remote_fs $network
- # Short-Description: Initialise the Linux Virtual Server
- # Description: The Linux Virtual Server is a highly scalable and highly
- # available server built on a cluster of real servers, with the load
- # balancer running on Linux.
- # description: start LVS of DR-RIP
- LOCK=/var/lock/ipvsadm.lock
- VIP=192.168.188.100
- . /etc/rc.d/init.d/functions
- start() {
- PID=`ifconfig | grep lo:10 | wc -l`
- if [ $PID -ne 0 ];
- then
- echo "The LVS-DR-RIP Server is already running !"
- else
- /sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
- /sbin/route add -host $VIP dev lo:10
- 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/eth0/arp_ignore
- echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
- echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
- echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
- /bin/touch $LOCK
- echo "starting LVS-DR-RIP server is ok !"
- fi
- }
-
- stop() {
- /sbin/route del -host $VIP dev lo:10
- /sbin/ifconfig lo:10 down >/dev/null
- echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
- echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
- echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
- echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce
- echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
- echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
- rm -rf $LOCK
- echo "stopping LVS-DR-RIP server is ok !"
- }
-
- status() {
- if [ -e $LOCK ];
- then
- echo "The LVS-DR-RIP Server is already running !"
- else
- echo "The LVS-DR-RIP Server is not running !"
- fi
- }
-
- case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- stop
- start
- ;;
- status)
- status
- ;;
- *)
- echo "Usage: $1 {start|stop|restart|status}"
- exit 1
- esac
- exit 0
-
5. 启动多台后端服务器" /etc/init.d/lvs_rs "脚本:
- ##赋予脚本执行权限
- [root@centosnode3 ~]# chmod +x /etc/init.d/lvs_rs
-
- ##启动脚本
- [root@centosnode3 ~]# /etc/init.d/lvs_rs start
6. 启动centosnode1和centosnode2的lvs和keepalived服务:
- ##启动lvs
- [root@centosnode1 ~]# systemctl start ipvsadm.service
-
- ##启动keepalived
- [root@centosnode1 ~]# systemctl start keepalived.service
7. 开启后端两台web服务器,并设置web页面:
- ##设置web1服务器页面
- [root@centosnode3 ~]# echo "this is page ip : 192.168.188.227" > /var/www/html/index.html
-
- ##启动web1的httpd服务
- [root@centosnode3 ~]# systemctl start httpd
-
- ##设置web2服务器页面
- [root@centosnode3 ~]# echo "this is page ip : 192.168.188.228" > /var/www/html/index.html
-
- ##启动web2的httpd服务
- [root@centosnode3 ~]# systemctl start httpd
8. 查看LVS状态:
- [root@centosnode1 ~]# ipvsadm -ln
- IP Virtual Server version 1.2.1 (size=4096)
- Prot LocalAddress:Port Scheduler Flags
- -> RemoteAddress:Port Forward Weight ActiveConn InActConn
- TCP 192.168.188.100:80 rr persistent 50
- -> 192.168.188.227:80 Route 1 0 0
- -> 192.168.188.228:80 Route 1 0 0
9. 测试LVS负载均衡是否正常:
- [root@centosnode5 ~]# curl 192.168.188.100
- this is page ip : 192.168.188.227
- [root@centosnode5 ~]# curl 192.168.188.100
- this is page ip : 192.168.188.228
10. 测试LVS健康检查:
- ##监控lvs状态
- [root@centosnode1 ~]# watch ipvsadm -ln
当前两台后端服务器都正常运行,使其中一台后端服务器的httpd服务关闭,模拟服务器故障,观察LVS健康检查是否正常。
[root@centosnode3 ~]# systemctl stop httpd
11. 测试keepalived故障转移是否正常,是否会发生ip飘移:
由此可见当前vip地址在centosnode1主机上,然后模拟服务器故障,停掉keepalived服务。
[root@centosnode1 ~]# systemctl stop keepalived.service
再次查看vip,发现vip飘移到了centosnode2主机上。可以将centosnode1主机的keepalived服务再次开启,会发现vip又会飘移到了centosnode1主机上,因为keepalived默认配置抢占主服务器,优先级高的服务器,将抢占到vip。
补充:1. real_server中健康检查的方式:
1>. TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。
2>. HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。
3>. SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连。
4>. MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:
0) 检测成功。
- delay_loop 隔多长时间做一次健康检测,单位为秒
-
- connect_timeout 连接超时时间,单位为秒
-
- nb_get_retry 检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除。
-
- delay_before_retry 失败重试的间隔时间,单位为秒
3. 健康检查的相关配置:
1>. 以上示例就是TCP健康检查。
2>. HTTP_GET|SSL_GET:
- HTTP_GET | SSL_GET
- {
- url {
- path / #HTTP/SSL 检查的url 可以是多个
- 方式一:digest <STRING> #HTTP/SSL 检查后的摘要信息 用工具genhash生成
- 方式二:status_code 200 #HTTP/SSL 检查返回的状态码
- }
- connect_port 80 #连接端口
- bindto <IPADD>
- connect_timeout 3 #连接超时时间
- nb_get_retry 3 #重连次数
- delay_before_retry 2 #连接间隔时间
- }
其中digest的摘要需要通过genhash工具得到:genhash工具使keepalived安装包中自带的。
- ##查看genhash工具版本
- [root@centosnode1 ~]# ./genhash -h
-
- ##生成检查后的摘要信息
-
- 命令格式:genhash -s要生成摘要的后端服务器地址 -p 要生成摘要的端口 -u 检查的url
-
- [root@centosnode1 ~]# genhash -s192.168.188.227 -p 80 -u /index.html
- MD5SUM = ab9d2b22ae01e991a259a08feb1f1629
-
- [root@centosnode1 ~]# genhash -s192.168.188.228 -p 80 -u /index.html
- MD5SUM = 639870c3471db8868e37dcf972ea0df3
示例:
- virtual_server 192.168.188.100 80 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- persistence_timeout 50
- protocol TCP
-
- real_server 192.168.188.227 80 {
- weight 1
-
- HTTP_GET {
- url {
- path /index.html
- digest ab9d2b22ae01e991a259a08feb1f1629
- }
- connect_timeout 8
- nb_get_retry 3
- delay_before_retry 3
- connect_port 80
- }
- }
- }
-
- virtual_server 192.168.188.100 80 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- persistence_timeout 50
- protocol TCP
-
- real_server 192.168.188.228 80 {
- weight 1
-
- HTTP_GET {
- url {
- path /index.html
- digest 639870c3471db8868e37dcf972ea0df3
- }
- connect_timeout 8
- nb_get_retry 3
- delay_before_retry 3
- connect_port 80
- }
- }
- }
-
3>. MISC:
- MISC_CHECK {
- misc_path <STRING>|<QUOTED-STRING> #外部程序或者脚本绝对路径
- misc_timeout <INT> #执行脚本的超时时间
- misc_dynamic #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的 权重(weight).
- #返回0:健康检查OK,权重不被修改
- #返回1:健康检查失败,权重设为0
- #返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253 }