天天看点

Centos6下haproxy+keepalived构建高可用web集群

1)实验拓扑信息

<a href="http://s5.51cto.com/wyfs02/M01/89/A1/wKioL1gYoFjzQr9jAAEd09D24eo089.png" target="_blank"></a>

说明:

c、10.10.10.129和10.10.10.130两台负载均衡器,其中某一台出现故障均不影响整个系统运行

2)haproxy的安装与启动脚本配置

3)haproxy的配置(两台负载均衡器10.10.10.129/10.10.10.130均需配置)

<code>[root@mysql-master ~]</code><code># adduser haproxy -s /sbin/nologin -M</code>

<code>[root@mysql-master ~]</code><code># cd /usr/local/haproxy/conf/</code>

<code>[root@mysql-master conf]</code><code># cat haproxy.cfg</code>

<code>global</code>

<code>        </code><code>log 127.0.0.1 local0 info</code>

<code>        </code><code>maxconn 4096</code>

<code>        </code><code>user haproxy</code>

<code>        </code><code>group haproxy</code>

<code>        </code><code>daemon</code>

<code>        </code><code>nbproc 1</code>

<code>        </code><code>pidfile </code><code>/usr/local/haproxy/logs/haproxy</code><code>.pid</code>

<code>defaults</code>

<code>        </code><code>mode http</code>

<code>        </code><code>retries 3</code>

<code>        </code><code>timeout connect 10s</code>

<code>        </code><code>timeout client 20s</code>

<code>        </code><code>timeout server 30s</code>

<code>        </code><code>timeout check 5s</code>

<code>frontend www</code>

<code>         </code><code>bind *:80</code>

<code>         </code><code>mode   http</code>

<code>         </code><code>option  httplog</code>

<code>         </code><code>option  forwardfor</code>

<code>         </code><code>option  httpclose</code>

<code>         </code><code>log     global</code>

<code>#来自www.wanwan.com的请求,均交给htmpool进行处理,来自img.wanwan.com的请求,则提交给imgpool进行处理。默认不指定的话,交给htmpool进行处理</code>

<code>        </code><code>acl host_www           hdr_dom(host)    -i      www.wanwan.com</code>

<code>        </code><code>acl host_img           hdr_dom(host)    -i      img.wanwan.com</code>

<code>        </code><code>use_backend htmpool    </code><code>if</code>      <code>host_www</code>

<code>        </code><code>use_backend imgpool    </code><code>if</code>      <code>host_img</code>

<code>        </code><code>default_backend  htmpool</code>

<code>backend htmpool</code>

<code>        </code><code>mode    http</code>

<code>        </code><code>option   redispatch</code>

<code>        </code><code>option   abortonclose</code>

<code>        </code><code>balance  static-rr</code>

<code>        </code><code>cookie   SERVERID</code>

<code>        </code><code>option   httpchk GET </code><code>/index</code><code>.html</code>

<code>        </code><code>server  web01 10.10.10.128:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3</code>

<code>        </code><code>server  web02 10.10.10.132:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3</code>

<code>backend imgpool</code>

<code>        </code><code>server  img1 10.10.10.131:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3</code>

<code>        </code><code>server  img2 10.10.10.133:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3</code>

<code># 配置haproxy的web监控界面</code>

<code>listen admin_stats</code>

<code>        </code><code>bind 0.0.0.0:9188</code>

<code>        </code><code>log 127.0.0.1 local0 err</code>

<code>        </code><code>stats refresh 30s</code>

<code>        </code><code>stats uri </code><code>/haproxy-status</code>

<code>        </code><code>stats realm welcome login\ Haproxy</code>

<code>        </code><code>stats auth admin:admin~!@</code>

<code>        </code><code>stats hide-version</code>

<code>        </code><code>stats admin </code><code>if</code> <code>TRUE</code>

4)keepalived的配置

负载均衡器配置两个vip:10.10.10.188以及10.10.10.189(在两台负载均衡器上互为主备)

<code>[root@mysql-master conf]</code><code># cat /etc/keepalived/keepalived.conf</code>

<code>! Configuration File </code><code>for</code> <code>keepalived</code>

<code>global_defs {</code>

<code>   </code><code>notification_email {</code>

<code>   </code><code>[email protected]</code>

<code>   </code><code>}</code>

<code>   </code><code>notification_email_from [email protected]</code>

<code>   </code><code>smtp_server smtp.qq.com</code>

<code>   </code><code>smtp_connect_timeout 30</code>

<code>   </code><code>router_id LVS_7</code>

<code>}</code>

<code># 配置这个脚本的作用是为了避免haproxy服务停止后,keepalived不释放vip</code>

<code>vrrp_script chk_http_port {</code>

<code>script </code><code>"/opt/check_haproxy.sh"</code>

<code>interval 2</code>

<code> </code><code>weight 2</code>

<code>vrrp_instance VI_188 {</code>

<code>    </code><code>state MASTER    </code><code># 主服务器</code>

<code>    </code><code>interface eth0</code>

<code>    </code><code>virtual_router_id 188</code>

<code>    </code><code>priority 150    </code><code># slave上的数值更小,数值越大,代表优先级越高</code>

<code>    </code><code>advert_int 1</code>

<code>    </code><code>authentication {</code>

<code>        </code><code>auth_type PASS</code>

<code>        </code><code>auth_pass 1111</code>

<code>    </code><code>}</code>

<code>    </code><code>virtual_ipaddress {</code>

<code>        </code><code>10.10.10.188</code><code>/24</code>    <code># vip地址,在系统里面通过ip add list可以查看</code>

<code>vrrp_instance VI_189 {</code>

<code>    </code><code>state BACKUP    </code><code># 从服务器</code>

<code>    </code><code>virtual_router_id 189</code>

<code>    </code><code>priority 100    </code><code># master上的数值更大,数值越大,代表优先级越高</code>

<code>        </code><code>10.10.10.189</code><code>/24</code>    <code># vip地址,在系统里面通过ip add list可以查看</code>

5)keepalived的启动脚本

<code>#!/bin/sh</code>

<code>#</code>

<code># Startup script for the Keepalived daemon</code>

<code># processname: keepalived</code>

<code># pidfile: /var/run/keepalived.pid</code>

<code># config: /etc/keepalived/keepalived.conf</code>

<code># chkconfig: - 21 79</code>

<code># description: Start and stop Keepalived</code>

<code># Source function library</code>

<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>

<code># Source configuration file (we set KEEPALIVED_OPTIONS there)</code>

<code>. </code><code>/etc/sysconfig/keepalived</code>

<code>RETVAL=0</code>

<code>prog=</code><code>"keepalived"</code>

<code>start() {</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Starting $prog: "</code>

<code>    </code><code>daemon keepalived ${KEEPALIVED_OPTIONS}</code>

<code>    </code><code>RETVAL=$?</code>

<code>    </code><code>echo</code>

<code>    </code><code>[ $RETVAL -</code><code>eq</code> <code>0 ] &amp;&amp; </code><code>touch</code> <code>/var/lock/subsys/</code><code>$prog</code>

<code>stop() {</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Stopping $prog: "</code>

<code>    </code><code>killproc keepalived</code>

<code>    </code><code>[ $RETVAL -</code><code>eq</code> <code>0 ] &amp;&amp; </code><code>rm</code> <code>-f </code><code>/var/lock/subsys/</code><code>$prog</code>

<code>reload() {</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Reloading $prog: "</code>

<code>    </code><code>killproc keepalived -1</code>

<code># See how we were called.</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>    </code><code>start)</code>

<code>        </code><code>start</code>

<code>        </code><code>;;</code>

<code>    </code><code>stop)</code>

<code>        </code><code>stop</code>

<code>    </code><code>reload)</code>

<code>        </code><code>reload</code>

<code>    </code><code>restart)</code>

<code>    </code><code>condrestart)</code>

<code>        </code><code>if</code> <code>[ -f </code><code>/var/lock/subsys/</code><code>$prog ]; </code><code>then</code>

<code>            </code><code>stop</code>

<code>            </code><code>start</code>

<code>        </code><code>fi</code>

<code>    </code><code>status)</code>

<code>        </code><code>status keepalived</code>

<code>    </code><code>*)</code>

<code>        </code><code>echo</code> <code>"Usage: $0 {start|stop|reload|restart|condrestart|status}"</code>

<code>        </code><code>exit</code> <code>1</code>

<code>esac</code>

<code>exit</code> <code>$RETVAL</code>

6)效果测试

a、在客户端测试www.wanwan.com

<a href="http://s3.51cto.com/wyfs02/M02/89/A6/wKiom1gZJxWwuWznAAA8Ah9SF5I775.png-wh_500x0-wm_3-wmp_4-s_1642477365.png" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/89/A4/wKioL1gZJxWB5XzGAABBmmVmU_o912.png-wh_500x0-wm_3-wmp_4-s_791272332.png" target="_blank"></a>

b、测试img.wanwan.com

<a href="http://s5.51cto.com/wyfs02/M00/89/A6/wKiom1gZJxaS9BRsAAA-Tvd59Gw368.png-wh_500x0-wm_3-wmp_4-s_2656105157.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M02/89/A4/wKioL1gZJxbRSm5vAAA534ZI-Jg155.png-wh_500x0-wm_3-wmp_4-s_2744649661.png" target="_blank"></a>

如上:负载均衡调度的作用已经实现,那么我们在测试下keepalived的相关功能

c、测试keepalived的相关功能

<code>[root@mysql-master ~]</code><code># ip add list</code>

<code>1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN </code>

<code>    </code><code>link</code><code>/loopback</code> <code>00:00:00:00:00:00 brd 00:00:00:00:00:00</code>

<code>    </code><code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo</code>

<code>    </code><code>inet6 ::1</code><code>/128</code> <code>scope host </code>

<code>       </code><code>valid_lft forever preferred_lft forever</code>

<code>2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>

<code>    </code><code>link</code><code>/ether</code> <code>00:0c:29:67:b3:45 brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet 10.10.10.129</code><code>/24</code> <code>brd 10.10.10.255 scope global eth0</code>

<code>    </code><code>inet 10.10.10.188</code><code>/24</code> <code>scope global secondary eth0</code>

<code>    </code><code>inet6 fe80::20c:29ff:fe67:b345</code><code>/64</code> <code>scope link </code>

<code>[root@mysql-slave ~]</code><code># ip add list</code>

<code>    </code><code>link</code><code>/ether</code> <code>00:0c:29:53:cf:52 brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet 10.10.10.130</code><code>/24</code> <code>brd 10.10.10.255 scope global eth0</code>

<code>    </code><code>inet 10.10.10.189</code><code>/24</code> <code>scope global secondary eth0</code>

<code>    </code><code>inet6 fe80::20c:29ff:fe53:cf52</code><code>/64</code> <code>scope link </code>

我们可以看到,两个vip地址,10.10.10.188以及10.10.10.189分别在两台负载均衡器上(仔细看下keepalived的配置可以发现,我们配置两台负载均衡互为主从)

模拟10.10.10.129-主负载均衡器宕机,然后观察ip地址切换以及负载均衡是否正常

<code>如上,我们可以观察到vip已经切换到另外一台负载均衡上了,然后我们观察负载均衡器的使用情况</code>

<a href="http://s5.51cto.com/wyfs02/M00/89/A6/wKiom1gZLVejz0BsAAA8v6e5pao217.png-wh_500x0-wm_3-wmp_4-s_2529628401.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M00/89/A4/wKioL1gZLVeBRc95AAA-x-HVzFI895.png-wh_500x0-wm_3-wmp_4-s_2174989764.png" target="_blank"></a>

<code>负载正常,keepalived的功能也实现了,我们重新开启主负载均衡器</code>

<code>[root@mysql-master keepalived]</code><code># ip add list</code>

<code>vip地址10.10.10.188已经切换回来了</code>

到此,keepalived+haproxy的基本功能已经实现了,由于haproxy配置比较多,这里我就不细讲了,后面会整理一篇关于haproxy常用的参数配置。

本文转自 冰冻vs西瓜 51CTO博客,原文链接:http://blog.51cto.com/molewan/1868304,如需转载请自行联系原作者

继续阅读