lvs-dr+keepalived实例架设 一、 实战基于ipvs的集群 集群的拓扑图 node1:17216.100.67 node2:170.16.100.68 VIP:172.16.100.88 RS1:172.16.100.6 RS2:172.16.100.69
1、 检查配置real server1(172.16.100.6)的web服务。 ~] rpm –q httpd
~] echo ‘’RS1 CentOS 6” > /var/www/html/index.html 开启apache服务 ~] service httpd start
2、 检查配置real server2(172.16.100.69)的web服务。 ~] rpm –q httpd
检查到RS2没有安装httpd ~] yum install httpd -y
~] echo ‘’RS2 CentOS 7” > /var/www/html/index.html 开启apache服务 ~] systemctl start httpd.service 查看服务是否启动 ~] ss –tnl
3、 安装director的ipvsadm 确保ipvs功能存在。(此处不用确认,因为内核中有ipvs功能) 安装ipvsadm。 ~] yum install ipvsadm –y
4、 配置director1的vip地址。 ~] ifconfig
~] ip addr add 172.16.100.88/32 dev eno16777736
~] ip addr list
5、 在node2上检查node1(director1)的vip地址是否通。 ~] ping 172.16.100.88
6、 配置real server1的arp_announce,arp_ignore。 在real server1上编辑一个执行脚本(修改arp_announce,arp_ignore两个内核参数脚本)。 ~] vim set.sh
#!/bin/bash case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; stop) echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; esac
执行脚本 ~] bash set.sh start
检查内核参数修改情况。 ~] cat /proc/sys/net/ipv4/conf/all/arp_ignore ~] cat /proc/sys/net/ipv4/conf/all/arp_announce
7、 把set.sh脚本传递给另一个RS2 ~] scp set.sh 172.16.100.69:/root/
8、 在RS2(172.16.100.69)上运行set.sh脚本修改内核参数。 ~] bash set.sh start 验证内核参数修改情况 ~] cat /proc/sys/net/ipv4/conf/all/arp_ignore
9、 配置RS1(172.16.100.6)的ip地址。 ~] ifconfig lo:0 172.16.100.88 netmask 255.255.255.255 broadcast 172.16.100.88 up ~] route add –host 172.16.100.88 dev lo:0
10、 配置RS2(172.16.100.69)的ip地址。 ~] ifconfig lo:0 172.16.100.88 netmask 255.255.255.255 broadcast 172.16.100.88 up ~] route add –host 172.16.100.88 dev lo:0
11、 在node1(172.16.100.67)上添加ipvs规则。(下面的-s是算法,-g指明的是dr类型) ~] ipvsadm –A –t 172.16.100.88:80 –s rr ~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.6 –g –w 1 ~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.69 –g –w 2 查看ipvs规则 ~] ipvsadm –Ln
12、 用node2作为客户端请求vip看结果。 ~] curl http://172.16.100.88 此时证明第一个director1(node1)已经ok。
13、 在node1上清空的ipvs规则,并删除eno16777736的网卡。 ~] ipvsadm -C ~] ip addr del 172.16.100.88/32 dev eno16777736 ~] ip addr list
14、 安装第二个director2(node2)172.16.100.68。 ~] yum –y install ipvsadm
15、 配置node2的vip。 ~] ip addr add 172.16.100.88/32 dev eno16777736
16、 生成ipvs规则。 ~] ipvsadm –A –t 172.16.100.88:80 –s wrr ~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.6 –g –w 1 ~] ipvsadm –a –t 172.16.100.88:80 –r 172.16.100.69 –g –w 2
17、 在node1检查node2(172.16.100.68)的LB功能是够正常。 ~] curl http://172.16.100.88 此时证明director2功能正常。
18、 在node2上清空的ipvs规则,并删除eno16777736的网卡。 ~] ipvsadm –C ~] ip addr del 172.16.100.88/32 dev eno16777736 ~] ip addr list
19、 为了让两个node节点都有sorry server,所以两个节点上安装httpd服务。 ~] yum –y install httpd
20、 在两个node节点上各自给一个sorry页面。 root@node1 ~] echo “Sorry, under maintenance” > /var/www/html/index.html root@node2 ~] echo “Sorry, under maintenance(68)” > /var/www/html/index.html
21、 两个节点上apache服务启动。 node1(172.16.100.67)上执行apache服务启动。 root@node1 ~] systemctl start httpd.service node2(172.16.100.68)上执行apache服务启动。 root@node2 ~] systemctl start httpd.service
22、 两个节点上安装配置keepalived。 root@node1 ~] yum install keepalived –y root@node2 ~] yum install keepalived –y
23、 备份两个节点的keepalived.conf配置文件。 root@node1 ~] cd /etc/keepalived/ root@node1 ~] cp keepalived.conf{,.backup} root@node2 ~] cd /etc/keepalived/ root@node2 ~] cp keepalived.conf{,.backup}
24、 编辑node1节点上的keepalived.conf配置文件和notify.sh脚本。
配置node1节点上的keepalived.conf配置文件。 ! Configuration File for keepalived
global_defs {
notification_email {
linuxedu@foxmail.com
mageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 #检查的时间间隔为1秒 weight -2 #一但-f的down文件存在,weight权重-2 }
vrrp_instance VI_1 {
interface eno16777736
state MASTER # BACKUP for slave routers
priority 101 # 100 for BACKUP
virtual_router_id 51
garp_master_delay 1
advert_int 1
authentication {
auth_type PASS
auth_pass 2231da37af98 #openssl rand –hex 6命令生成随机数
}
virtual_ipaddress {
172.16.100.88/32 dev eno16777736 label eno16777736:1
}
track_script {
chk_mantaince_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 172.16.100.88 80 { delay_loop 6 #检查失败要转6圈 lb_algo wrr lb_kind DR nat_mask 255.255.0.0 persistence_timeout 50 #做持久连接 protocol TCP
sorry_server 127.0.0.1 80 #定义当所有RS挂掉,node的sorry server real_server 172.16.100.6 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } }
real_server 172.16.100.69 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
编辑node1上的/etc/keepalived/notify.sh脚本。 #!/bin/bash
vip=172.16.100.88 contact='root@localhost'
notify() {
mailsubject="hostname
to be $1: $vip floating"
mailbody="date '+%F %H:%M:%S'
: vrrp transition, hostname
changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: basename $0
{master|backup|fault}'
exit 1
;;
esac
给予notify.sh执行权限。 ~] chmod +x notify.sh
25、 编辑node2节点上的keepalived.conf配置文件和notify.sh脚本。 配置node2节点上的keepalived.conf配置文件。 ! Configuration File for keepalived
global_defs {
notification_email {
linuxedu@foxmail.com
mageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 #检查的时间间隔为1秒 weight -2 #一但-f的down文件存在,weight权重-2 }
vrrp_instance VI_1 {
interface eno16777736
state BACKUP # BACKUP for slave routers
priority 100 # 100 for BACKUP
virtual_router_id 51
garp_master_delay 1
advert_int 1
authentication {
auth_type PASS
auth_pass 2231da37af98 #openssl rand –hex 6命令生成随机数
}
virtual_ipaddress {
172.16.100.88/16 dev eno16777736 label eno16777736:1
}
track_script {
chk_mantaince_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 172.16.100.88 80 { delay_loop 6 #检查失败要转6圈 lb_algo wrr lb_kind DR nat_mask 255.255.0.0 persistence_timeout 50 #做持久连接 protocol TCP
sorry_server 127.0.0.1 80 #定义当所有RS挂掉,node的sorry server real_server 172.16.100.6 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } }
real_server 172.16.100.69 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
编辑node2上的/etc/keepalived/notify.sh脚本。 #!/bin/bash
vip=172.16.100.88 contact='root@localhost'
notify() {
mailsubject="hostname
to be $1: $vip floating"
mailbody="date '+%F %H:%M:%S'
: vrrp transition, hostname
changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: basename $0
{master|backup|fault}'
exit 1
;;
esac
给予notify.sh执行权限。 ~] chmod +x notify.sh
26、 启动两个节点上的keepalived服务。 root@node1 ~] systemctl start keepalived.service root@node2 ~] systemctl start keepalived.service
27、 检查node1的keepalived服务生成状况。 在node1(172.16.100.67)节点上执行tcpdump命令。 ~] tcpdump –i eno16777736 –nn host 172.16.100.68
以上可以看到对RS1(172.16.100.6)和RS2(172.16.100.69)做健康状态检查,说明keepalived服务已经启动。
在node1上使用ip addr list查看vip情况。 root@node1 ~] ip addr list 在利用ipvsadm –Ln检查ipvs规则生成情况。 root@node1~] ipvsadm –Ln
28、 检查node2的keepalived生成情况。
在node2上使用ip addr list查看vip情况,ipvs规则情况。 root@node2 ~] ip addr list root@node2 ~] ipvsadm -Ln
29、 利用mail查看自己定义的脚本(notify)邮件传送的情况。 root@node1 ~] mail root@node2 ~] mail 此时看出notify的邮件传送也能实现。
30、 用node2节点来访问vip看集群架设是否正常。 root@node2 ~] crul http://172.16.100.88
31、 此时让RS1(172.16.100.6)下线,看分发情况。 root@RS1 ~] service httpd stop 在node1(MASTER)上查看ipvs规则,是否自动清掉RS1。 root@node1 ~] ipvsadm –Ln 在node2上执行curl命令看访问效果。 root@node2 ~] curl http://172.16.100.88
32、 此时让RS1(172.16.100.6)上线,还在node2上执行curl命令查看RS1是否被重新加入ipvs规则中。 root@node2 ~] curl http://172.16.100.88
33、 当所有的RS挂掉后,node节点上应该有个sorry server提示,sorry server定义在virtual server里面。
34、 关闭一台node1,看vip能否转移。可以stop keepalived服务,也可以在keepalived目录中创建一个/etc/keepalived/down文件让vip从master中转移到backup中;在删除node1的down文件,看vip转移。以此来证明HA的架构是否有问题。
35、 关闭两台node。访问vip(172.16.100.88)看是否有sorry server。