Loading... <p style="text-indent: 2em"><strong>前言</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">高可用集群,High Availability Cluster,简称HA Cluster,是指以减少服务中断时间为目的的服务器集群技术。通过上文可以看出,LVS集群本身并不能实现高可用,比如Director Server不能检测Real Server的健康度,一旦其中一台或全部Real Server宕机,Director Server还会继续转发请求,导致站点无法访问,同样,如果Director Server宕机站点就更不可能正常运转了。本文将讲解如何基于heartbeat v1实现LVS集群高可用。</p> <p style="text-indent: 2em"><strong>Heartbeat </strong></p> <p style="text-indent: 2em"><strong>简介</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">Heartbeat是Linux-HA工程的一个组件,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用。</p> <p style="text-indent: 2em"><strong>工作原理</strong></p> <p style="text-indent: 2em">Heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。</p> <p style="text-indent: 2em"><strong>基于Heartbeat v1实现LVS集群高可用</strong></p> <p style="text-indent: 2em"><strong>实验拓扑</strong></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-95.jpg" title="1433685312223932.jpg" alt="heartbeat实现lvs高可用.jpg" /></p> <p style="text-indent: 2em"><strong>实验环境</strong></p> <p style="text-indent: 2em">node1:node1.scholar.com 172.16.10.123 CentOS6.6<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">node2:node2.scholar.com 172.16.10.124 CentOS6.6</p> <p style="text-indent: 2em">Real Server1:192.168.1.10(VIP)172.16.10.125(RIP) CentOS6.6</p> <p style="text-indent: 2em">Real Server2:192.168.1.10(VIP)172.16.10.126(RIP) CentOS6.6</p> <p style="text-indent: 2em"><strong>注意事项</strong></p> <p style="text-indent: 2em">配置高可用集群的前提:(以两节点的heartbeat为例)</p> <p style="text-indent: 2em">①时间必须保持同步</p> <p style="text-indent: 2em">使用ntp服务器</p> <p style="text-indent: 2em">②节点必须名称互相通信</p> <p style="text-indent: 2em">解析节点名称</p> <p style="text-indent: 2em">/etc/host</p> <p style="text-indent: 2em">集群中使用的主机名为`uname -n`表示的主机名</p> <p style="text-indent: 2em">③ping node</p> <p style="text-indent: 2em">仅偶数节点才需要</p> <p style="text-indent: 2em">④ssh密钥认证进行通信</p> <p style="text-indent: 2em"><strong>配置过程</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">时间同步</p> <p style="text-indent: 2em">请确保两个节点时间同步,这里不再详细讲述</p> <p style="text-indent: 2em">解析名配置<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# vim /etc/hosts 172.16.10.123 node1.scholar.com node1 172.16.10.124 node2.scholar.com node2 [root@node1 ~]# vim /etc/sysconfig/network HOSTNAME=node1.scholar.com [root@node1 ~]# uname -n node1.scholar.com #两个节点都需如上操作</pre> <p style="text-indent: 2em">ssh密钥配置</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# ssh-keygen -t rsa -P '' [root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2 [root@node2 ~]# ssh-keygen -t rsa -P '' [root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1 [root@node1 ~]# date; ssh node2 'date' #测试 Sun Jun 7 17:46:03 CST 2015 Sun Jun 7 17:46:03 CST 2015</pre> <p style="text-indent: 2em">安装所需软件包</p> <pre class="brush:bash;toolbar:false">#解决依赖关系 [root@node1 ~]# yum install perl-TimeDate net-snmp-libs libnet PyXML -y #需epel源支持 [root@node1 ~]# cd heartbeat2 [root@node1 heartbeat2]# ls heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm [root@node1 heartbeat2]# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm [root@node1 heartbeat2]# yum install heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm -y #两个节点都执行以上操作</pre> <p style="text-indent: 2em">配置heartbeat</p> <p style="text-indent: 2em">准备配置文件<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-27.jpg" title="1433685347654591.jpg" alt="1.jpg" /></p> <p style="text-indent: 2em">配置算法密钥<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# openssl rand -hex 8 4d8fd6cb49d2047b [root@node1 ~]# vim /etc/ha.d/authkeys auth 2 2 sha1 4d8fd6cb49d2047b</pre> <p style="text-indent: 2em">配置主配置文件<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# grep -v "#" /etc/ha.d/ha.cf |grep -v "^$" logfile /var/log/ha-log #日志存放位置 keepalive 2 #指定心跳使用间隔时间 deadtime 30 #指定备用节点接管主节点服务资源超时时间 warntime 10 #指定心跳延迟的时间 initdead 120 #解决网络启动延时 udpport 694 #设置广播通信端口 mcast eth0 225.0.25.1 694 1 0 #定义广播地址 auto_failback on #定义当主节点恢复后,是否将服务自动切回 node node1.scholar.com #主节点 node node2.scholar.com #备用节点 ping 172.16.0.1 #仲裁设备</pre> <p style="text-indent: 2em">配置资源管理器</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# vim /etc/ha.d/haresources node1.scholar.com 192.168.1.10/32/eth0/192.168.1.10 ldirectord::/etc/ha.d/ldirectord.cf</pre> <p style="text-indent: 2em">将配置文件传给备用节点</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-54.jpg" title="1433685370106960.jpg" alt="2.jpg" /></p> <p style="text-indent: 2em">配置ldirectord</p> <p style="text-indent: 2em">准备配置文件并配置<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/ [root@node1 ~]# grep -v ^# /etc/ha.d/ldirectord.cf checktimeout=3 #探测超时时间 checkinterval=1 #探测间隔时间 autoreload=yes #修改配置文件,无需重启服务即可重载 quiescent=yes #real server 宕机后从lvs列表中删除,恢复后自动添加进列表 virtual=192.168.1.10:80 #VIP real=172.16.10.125:80 gate #real server real=172.16.10.126:80 gate #real server fallback=127.0.0.1:80 gate #如果RS节点都宕机,则启用本地环回口地址 service=http #基于http协议探测 request=".health.html" #探测文件 receive="ok" #探测内容,判断RS是否存活 scheduler=rr #调度算法 #persistent=600 #netmask=255.255.255.255</pre> <p style="text-indent: 2em">将配置文件传给备用节点,并禁止各节点ldirectord开启自启<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-96.jpg" title="1433685401294534.jpg" alt="3.jpg" /></p> <p style="text-indent: 2em">准备fallback文件</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-58.jpg" title="1433685422871384.jpg" alt="4.jpg" /></p> <p style="text-indent: 2em">RS设置<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">#两个RS各进行如下配置</pre> <p style="text-indent: 2em">配置内核参数</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-96-1.jpg" title="1433685490595486.jpg" alt="5.jpg" /></p> <p style="text-indent: 2em">准备健康度探测文件和站点文件</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-31.jpg" title="1433685519124925.jpg" alt="6.jpg" /></p> <p style="text-indent: 2em">测试页面<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-24.jpg" title="1433685540934124.jpg" alt="7.jpg" /></p> <p style="text-indent: 2em">启动heartbeat<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-85.jpg" title="1433685578107592.jpg" alt="8.jpg" /></p> <p style="text-indent: 2em">查看资源是否生效</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-75.jpg" title="1433685605245325.jpg" alt="9.jpg" /></p> <p style="text-indent: 2em"><strong>高可用测试</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-64.jpg" title="1433685633503740.jpg" alt="10.jpg" /></p> <p style="text-indent: 2em">刷新页面</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-31-1.jpg" title="1433685656117075.jpg" alt="11.jpg" /></p> <p style="text-indent: 2em">将RS2模拟宕机<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# service httpd stop</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-47.jpg" title="1433685724439230.jpg" alt="12.jpg" /></p> <p style="text-indent: 2em">无论怎么刷新都是RS1的页面<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">接下来我们把RS1也停掉</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-62.jpg" title="1433685812307833.jpg" alt="13.jpg" /></p> <p style="text-indent: 2em">切回fallback页面了</p> <p style="text-indent: 2em">我们将node1停掉,看一下node2是否可以接管资源</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# service heartbeat stop</pre> <p style="text-indent: 2em"></p> <p></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180345-41.jpg" title="1433685837796627.jpg" alt="14.jpg" /></p> <p style="text-indent: 2em">资源成功接管,以上访问也不受任何影响,当然如果在次启动node1资源会被再次抢过去,这里就不再演示</p> <p style="text-indent: 2em">基于heartbeat v1 实现LVS高可用至此完成</p> <p style="text-indent: 2em"><strong>The end</strong></p> <p style="text-indent: 2em">好了,基于heartbeat v1 实现LVS高可用就说到这里了,整个过程还是挺好玩的,配置过程中遇到问题可留言,下篇将会讲解基于heartbeat v2的高可用集群,有兴趣可以继续关注呦。以上仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信