Loading... <p style="text-align: center"><span style="font-size: 24px">keepalived +LVS DR 双主互备模型实验</span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> 实验环境介绍</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> 操作系统:DR:centos 7.2 两个节点,都安装keepalived<br /></span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> Real Server :centos 6.7 两个节点。都安装上httpd<br /></span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> 实验环境拓扑图<br /></span></span></p> <p style="text-align:center"><span style="font-size: 24px"><span style="font-size: 18px"><img src="//cto.wang/usr/uploads/2016/07/20160703161006-57.png" title="1457191421395398.png" alt="blob.png" /></span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> DR1 IP 192.168.36.131/24</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> DR2 IP 192.168.36.132/24</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> VIP1 IP 192.168.36.15/32</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> VIP2 IP 192.168.36.16/32</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> RIP1 IP 192.168.36.133/24</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> RIP2 IP 192.168.36.134/24</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> DR1 hostname:node1.centos7.cn<br /></span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"> DR2 hostname:node2.centos7.cn<br /></span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">实验步骤</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">1、两个DR节点上需要配置host文件。能够以主机名进行通讯。当然也可以使用DNS解析来实现,只是这种方式效率比较低,成本也高些,如果高可用节点不是很多的情况下还是使用host文件比较好。</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">两个节点配置一样,如下所示:</span></span></p> <p>192.168.36.132 node2 centos7.cn</p> <p>192.168.36.131 node1 centos7.cn</p> <p></p> <p><span style="font-size: 18px">2、配置两个节点相互之间的ssh认证:基于密钥的认证。这一步不是必须的,只是方便操作而已</span></p> <p><span style="font-size: 18px">3、两个节点的时间必须同步。centos7 使用chrony这个软件进行时间同步。只需要安装这个软件,并将其启动即可。当然这两个主机要能够上互联网。如果不能就需要在内网搭建一个ntp服务器。centos 7 当然也支持ntp同步时间</span></p> <p><span style="font-size: 18px">4、两个节点上关闭防火墙,Real Server也要关闭防火墙。如果需要都开启,DR 上要放行组播地址224.0.0.18的流量 Real Server上需要放行tcp 80 端口,源地址是任意地址的流量。selinux不关闭似乎没有太大的影响.</span></p> <p><span style="font-size: 18px">5、两个节点上安装keepalived和ipvsadm(这个不是必须的。安装了方便查看ipvs相关的信息)</span></p> <p><span style="font-size: 18px">6、两个Real Server安装httpd。设置arp相关信息。提供Real Server配置脚本如下:两个节点都运行该脚本即可。</span></p> <p>#!/bin/bash</p> <p>VIP1=192.168.36.15</p> <p>VIP2=192.168.36.16</p> <p>case $1 in</p> <p> start_dr)</p> <p> ifconfig lo:0 $VIP1 netmask 255.255.255.255 broadcast $VIP1</p> <p> ifconfig lo:1 $VIP2 netmask 255.255.255.255 broadcast $VIP2</p> <p> echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce</p> <p> echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce</p> <p> echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore</p> <p> echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore</p> <p> ;;</p> <p> stop_dr)</p> <p> ifdown lo</p> <p> ifup lo</p> <p> echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce</p> <p> echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce</p> <p> echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore</p> <p> echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore</p> <p> ;;</p> <p> *)</p> <p> echo "please input parameter:start_dr or stop_dr"</p> <p> ;;</p> <p>esac</p> <p>两个Real Server 上还需要配置httpd服务,centos 6.7上安装完后,需要修改配置文件,否则启动的时候总是警告信息或者直接报错</p> <p>vim /etc/httpd/conf/httpd.conf</p> <p>ServerName 192.168.36.134:80。把这一行前面的"#"去掉,并修改类似这样的即可,即使是不修改只去掉"#",就可以正常启动了</p> <p>给web服务一个测试首页,做实验为了分辨出负载均衡的效果故意提供内容不相同的首页</p> <p>vim /var/www/html/index.html </p> <p><h1> This is webserver1 192.168.36.134 </h></p> <p>另一个节点上</p> <p>vim /var/www/html/index.html </p> <p><h1> This is webserver2 192.168.36.133 </h></p> <p><span style="font-size: 18px">7、两个节点上keepalived的配置如下:</span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">node1 上keepalived 配置文 </span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">vim /etc/keepalived/keepalived.conf</span></span></p> <p>! Configuration File for keepalived</p> <p></p> <p>global_defs {</p> <p> notification_email {</p> <p> root@localhost</p> <p> }</p> <p> notification_email_from keepalived@localhost.cn</p> <p> smtp_server 127.0.0.1</p> <p> smtp_connect_timeout 30</p> <p> router_id LVS_MASTER</p> <p>}</p> <p>vrrp_instance VI_1 {</p> <p> state MASTER</p> <p> interface eno16777736</p> <p> virtual_router_id 51</p> <p> priority 100</p> <p> advert_int 1</p> <p> authentication {</p> <p> auth_type AH</p> <p> auth_pass c87a5ba3176f</p> <p> }</p> <p> virtual_ipaddress {</p> <p> 192.168.36.15 dev eno16777736 label eno16777736:0</p> <p> }</p> <p>}</p> <p>vrrp_instance VI_2 {</p> <p> state BACKUP</p> <p> interface eno16777736</p> <p> virtual_router_id 52</p> <p> priority 99</p> <p> advert_int 1</p> <p> authentication {</p> <p> auth_type AH</p> <p> auth_pass c87a5ba3176f</p> <p> }</p> <p> virtual_ipaddress {</p> <p> 192.168.36.16 dev eno16777736 label eno16777736:1</p> <p> }</p> <p>}</p> <p>virtual_server 192.168.36.15 80 </p> <p>{</p> <p> delay_loop 6</p> <p> lb_algo wrr</p> <p> lb_kind DR</p> <p> nat_mask 255.255.255.255</p> <p> # persistence_timeout 50</p> <p> protocol TCP</p> <p></p> <p> real_server 192.168.36.133 80 </p> <p> {</p> <p> weight 1</p> <p> TCP_CHECK </p> <p> {</p> <p> connect_timeout 3</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> }</p> <p> real_server 192.168.36.134 80 </p> <p> {</p> <p> weight 3</p> <p> HTTP_GET </p> <p> {</p> <p> url {</p> <p> path /</p> <p> status_code 200</p> <p> }</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> </p> <p> }</p> <p>}</p> <p>virtual_server 192.168.36.16 80 </p> <p>{</p> <p> delay_loop 6</p> <p> lb_algo wrr</p> <p> lb_kind DR</p> <p> nat_mask 255.255.255.255</p> <p> # persistence_timeout 50</p> <p> protocol TCP</p> <p></p> <p> real_server 192.168.36.133 80 </p> <p> {</p> <p> weight 1</p> <p> TCP_CHECK </p> <p> {</p> <p> connect_timeout 3</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> }</p> <p> real_server 192.168.36.134 80 </p> <p> {</p> <p> weight 3</p> <p> HTTP_GET </p> <p> {</p> <p> url {</p> <p> path /</p> <p> status_code 200</p> <p> }</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> </p> <p> }</p> <p>}</p> <p><span style="font-size: 24px"><span style="font-size: 18px">node 2</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">vim /etc/keepalived/keepalived.conf</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"></span></span></p> <p>global_defs {</p> <p> notification_email {</p> <p> root@localhost</p> <p> }</p> <p> notification_email_from keepalived@localhost.cn</p> <p> smtp_server 127.0.0.1</p> <p> smtp_connect_timeout 30</p> <p> router_id LVS_BACKUP</p> <p>}</p> <p></p> <p>vrrp_instance VI_1 {</p> <p> state BACKUP</p> <p> interface eno16777736</p> <p> virtual_router_id 51</p> <p> priority 99</p> <p> advert_int 1</p> <p> authentication {</p> <p> auth_type AH</p> <p> auth_pass c87a5ba3176f</p> <p> }</p> <p> virtual_ipaddress {</p> <p> 192.168.36.15 dev eno16777736 label eno16777736:0</p> <p> }</p> <p>}</p> <p></p> <p>vrrp_instance VI_2 {</p> <p> state MASTER</p> <p> interface eno16777736</p> <p> virtual_router_id 52</p> <p> priority 100</p> <p> advert_int 1</p> <p> authentication {</p> <p> auth_type AH</p> <p> auth_pass c87a5ba3176f</p> <p> }</p> <p> virtual_ipaddress {</p> <p> 192.168.36.16 dev eno16777736 label eno16777736:1</p> <p> }</p> <p>}</p> <p>virtual_server 192.168.36.15 80 </p> <p>{</p> <p> delay_loop 6</p> <p> lb_algo wrr</p> <p> lb_kind DR</p> <p> nat_mask 255.255.255.255</p> <p> # persistence_timeout 50</p> <p> protocol TCP</p> <p></p> <p> real_server 192.168.36.133 80 </p> <p> {</p> <p> weight 1</p> <p> TCP_CHECK </p> <p> {</p> <p> connect_timeout 3</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> }</p> <p> real_server 192.168.36.134 80 </p> <p> {</p> <p> weight 3</p> <p> HTTP_GET </p> <p> {</p> <p> url {</p> <p> path /</p> <p> status_code 200</p> <p> }</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> </p> <p> }</p> <p>}</p> <p>virtual_server 192.168.36.16 80 </p> <p>{</p> <p> delay_loop 6</p> <p> lb_algo wrr</p> <p> lb_kind DR</p> <p> nat_mask 255.255.255.255</p> <p> # persistence_timeout 50</p> <p> protocol TCP</p> <p></p> <p> real_server 192.168.36.133 80 </p> <p> {</p> <p> weight 1</p> <p> TCP_CHECK </p> <p> {</p> <p> connect_timeout 3</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> }</p> <p> real_server 192.168.36.134 80 </p> <p> {</p> <p> weight 3</p> <p> HTTP_GET </p> <p> {</p> <p> url {</p> <p> path /</p> <p> status_code 200</p> <p> }</p> <p> }</p> <p> connect_timeout 3</p> <p> nb_get_retry 3</p> <p> delay_before_retry 3</p> <p> </p> <p> }</p> <p>}</p> <p>测试客户端浏览器分别访问http:/192.168.36.15和http:/192.168.36.16</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703161007-63.png" title="1457193637633085.png" alt="blob.png" width="608" height="171" style="width: 608px;height: 171px" />在刷新几次会有下面的结果显示。由于两个Real Server权重不同,两个Real Server服务器访问量比大约3:1.192.168.36.134访问理论概率75%。192.168.36.133 访问的概率理论值25%</p> <p><span style="font-size: 24px"><span style="font-size: 18px"><img src="//cto.wang/usr/uploads/2016/07/20160703161007-53.png" title="1457193661165221.png" alt="blob.png" width="615" height="178" style="width: 615px;height: 178px" /></span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px"><img src="//cto.wang/usr/uploads/2016/07/20160703161007-77.png" title="1457194065411721.png" alt="blob.png" /><img src="//cto.wang/usr/uploads/2016/07/20160703161007-27.png" title="1457194083276201.png" alt="blob.png" /></span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">手动停止node1 节点上的keepalived的服务</span></span></p> <p>[root@node2 keepalived]# ifconfig</p> <p>eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500</p> <p> inet 192.168.36.132 netmask 255.255.255.0 broadcast 192.168.36.255</p> <p> inet6 fe80::20c:29ff:fe2a:96f7 prefixlen 64 scopeid 0x20<link></p> <p> ether 00:0c:29:2a:96:f7 txqueuelen 1000 (Ethernet)</p> <p> RX packets 1628624 bytes 140367911 (133.8 MiB)</p> <p> RX errors 0 dropped 0 overruns 0 frame 0</p> <p> TX packets 29468 bytes 2585699 (2.4 MiB)</p> <p> TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p> <p></p> <p>eno16777736:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500</p> <p> inet 192.168.36.15 netmask 255.255.255.255 broadcast 0.0.0.0</p> <p> ether 00:0c:29:2a:96:f7 txqueuelen 1000 (Ethernet)</p> <p></p> <p>eno16777736:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500</p> <p> inet 192.168.36.16 netmask 255.255.255.255 broadcast 0.0.0.0</p> <p> ether 00:0c:29:2a:96:f7 txqueuelen 1000 (Ethernet)</p> <p></p> <p>lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536</p> <p> inet 127.0.0.1 netmask 255.0.0.0</p> <p> inet6 ::1 prefixlen 128 scopeid 0x10<host></p> <p> loop txqueuelen 0 (Local Loopback)</p> <p> RX packets 52 bytes 3805 (3.7 KiB)</p> <p> RX errors 0 dropped 0 overruns 0 frame 0</p> <p> TX packets 52 bytes 3805 (3.7 KiB)</p> <p> TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</p> <p><span style="font-size: 24px"><span style="font-size: 18px">通过查看node2的IP信息即可看出node2 将node1的地址抢占过来了。通过客户端测试。效果同刚才的一样,两个IP地址都能够访问</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">实际环境中一般是使用域名访问的,由于这里是做实验故使用IP地址访问web服务器。</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">实验总结:</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">1、在centos7中由于使用yum的方式安装keepalived的,日志信息不是很详细,排错不是很友好</span></span></p> <p><span style="font-size: 24px"><span style="font-size: 18px">2、不知道为什么keepalived的服务重启生效比较慢,有时候需要重启好几次,不知道是生效比较慢还是程序有bug,配置文件没有修过,第一次重启<br /></span></span>没有生效,再次重启又生效。很奇怪!!!</p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信