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 ] && </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 ] && </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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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,如需转载请自行联系原作者