作業系統: redhat 6.5 x64,本文采用rpm方式安裝haproxy,keepalived。
app1: 192.168.0.24
app1: 192.168.0.25
vip : 192.168.0.26
http1:192.168.0.24:8080 主機配置lap環境。
http2:192.168.0.25:8080 主機配置lap環境。
實作一個vip出現,出例采用vip位址是192.168.0.26。
說明:rhel/centos/oel6.x安裝版本中已經內建了keepalive-1.2.7,以及haproxy軟體包經過安裝沒有問題。
在app1,app2兩個節點上直接采用rpm包安裝。
1
2
3
4
5
6
7
8
9
10
<code># rpm -ivh keepalived-1.2.7-3.el6.x86_64.rpm net-snmp-utils-5.5-49.el6.x86_64.rpm net-snmp-libs-5.5-49.el6.x86_64.rpm lm_sensors-3.1.1-17.el6.x86_64.rpm lm_sensors-</code>
<code>devel-3.1.1-17.el6.x86_64.rpm lm_sensors-libs-3.1.1-17.el6.x86_64.rpm </code>
<code>preparing... </code><code>########################################### [100%] </code>
<code> </code><code>1:lm_sensors-libs </code><code>########################################### [ 17%] </code>
<code> </code><code>2:net-snmp-libs </code><code>########################################### [ 33%] </code>
<code> </code><code>3:keepalived </code><code>########################################### [ 50%] </code>
<code> </code><code>4:net-snmp-utils </code><code>########################################### [ 67%] </code>
<code> </code><code>5:lm_sensors </code><code>########################################### [ 83%] </code>
<code> </code><code>6:lm_sensors-devel </code><code>########################################### [100%] </code>
<code>#</code>
1) 在app1 節點一上配置檔案
說明: 修改配置檔案, 綁定的網卡是eth0,從機就是優先級與本機ip不一樣外,其它都是一樣,相比之前的示例增加了監控腳本。
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<code># vi /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 127.0.0.1 </code>
<code> </code><code>smtp_connect_timeout 30 </code>
<code> </code><code>router_id lvs_devel </code>
<code>}</code>
<code>vrrp_script chk_haproxy { </code>
<code> </code><code>script </code><code>"killall -0 haproxy"</code>
<code> </code><code>interval 1 </code>
<code> </code><code>weight -2 </code>
<code>vrrp_instance vi_1 { </code>
<code> </code><code>state master </code>
<code> </code><code>interface eth0 </code>
<code> </code><code>virtual_router_id 51 </code>
<code> </code><code>mcast_src_ip 192.168.0.24 </code>
<code> </code><code>priority 100 </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 876543 </code>
<code> </code><code>} </code>
<code> </code><code>virtual_ipaddress { </code>
<code> </code><code>192.168.0.26</code><code>/24</code> <code>dev eth0 label eth0:1 </code>
<code> </code><code>track_interface { </code>
<code> </code><code>eth0 </code>
<code> </code><code>track_script { </code>
<code> </code><code>chk_haproxy </code>
2) 在app2節點二上配置檔案
<code> </code><code>script </code><code>"killall -0 haproxy"</code>
<code> </code><code>interval 1 </code>
<code> </code><code>weight -2 </code>
<code> </code><code>mcast_src_ip 192.168.0.25 </code>
<code> </code><code>priority 99 </code>
<code> </code><code>192.168.0.26</code><code>/24</code> <code>dev eth0 label eth0:1 </code>
1) 啟動服務并加為開機啟動:
<code>service keepalived start </code>
<code>chkconfig keepalived on</code>
2) 測試并觀察vip漂移情況
(1) vip位址切換觀察
說明:兩種方式切換vip, 一個是關閉haproxy代理服務,一個是關閉相關節點的keepalived服務。
<code>[root@app1 /]</code><code># service keepalived start </code>
<code>starting keepalived: [ ok ]</code>
<code>[root@app1 keepalived]</code><code># ip a </code>
<code>1: lo: <loopback,up,lower_up> mtu 16436 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:4c:39:43 brd ff:ff:ff:ff:ff:ff </code>
<code> </code><code>inet 192.168.0.24</code><code>/24</code> <code>brd 192.168.0.255 scope global eth0 </code>
<code> </code><code>inet 192.168.0.26</code><code>/24</code> <code>scope global secondary eth0:1 </code>
<code> </code><code>inet6 fe80::20c:29ff:fe4c:3943</code><code>/64</code> <code>scope link </code>
<code>[root@app1 keepalived]</code><code>#</code>
<code>[root@app2 keepalived]</code><code># ip a </code>
<code> </code><code>link</code><code>/ether</code> <code>00:0c:29:cf:05:99 brd ff:ff:ff:ff:ff:ff </code>
<code> </code><code>inet 192.168.0.25</code><code>/24</code> <code>brd 192.168.0.255 scope global eth0 </code>
<code> </code><code>inet6 fe80::20c:29ff:fecf:599</code><code>/64</code> <code>scope link </code>
<code>[root@app2 keepalived]</code><code>#</code>
<code>注:可以關閉keepalived服務,以及關閉haproxy服務,通過</code><code>tail</code> <code>-f </code><code>/var/log/messages</code><code>觀察vip移動情況。</code>
<code>jan 11 12:54:19 app2 keepalived_vrrp[26911]: vrrp_instance(vi_1) received higher prio advert </code>
<code>jan 11 12:54:19 app2 keepalived_vrrp[26911]: vrrp_instance(vi_1) entering backup state </code>
<code>jan 11 12:54:19 app2 keepalived_vrrp[26911]: vrrp_instance(vi_1) removing protocol vips. </code>
<code>jan 11 12:54:19 app2 keepalived_healthcheckers[26910]: netlink reflector reports ip 192.168.0.26 removed</code>
app1, app2配置操作
# vi /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
# sysctl -p
# rpm -ivh haproxy-1.4.24-2.el6.x86_64.rpm
1)app1上建立配置檔案
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<code># vi /usr/local/haproxy/conf/haproxy.cfg</code>
<code>global </code>
<code> </code><code>log 127.0.0.1 local0 </code>
<code> </code><code>maxconn 4000 </code>
<code> </code><code>chroot </code><code>/var/lib/haproxy</code>
<code> </code><code>pidfile </code><code>/var/run/haproxy</code><code>.pid </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>stats socket </code><code>/var/lib/haproxy/stats</code>
<code>defaults </code>
<code> </code><code>log global </code>
<code> </code><code>mode http </code>
<code> </code><code>option httplog </code>
<code> </code><code>option dontlognull </code>
<code> </code><code>option redispatch </code>
<code> </code><code>option httpclose </code>
<code> </code><code>option forwardfor </code>
<code> </code><code>retries 3 </code>
<code> </code><code>maxconn 2000 </code>
<code> </code><code>contimeout 5000 </code>
<code> </code><code>clitimeout 50000 </code>
<code> </code><code>srvtimeout 50000 </code>
<code> </code><code>timeout check 1s </code>
<code> </code><code>timeout http-request 10s </code>
<code> </code><code>timeout queue 1m </code>
<code> </code><code>timeout connect 10s </code>
<code> </code><code>timeout client 1m </code>
<code> </code><code>timeout server 1m </code>
<code> </code><code>timeout http-keep-alive 10s</code>
<code>listen stats </code>
<code> </code><code>mode http </code>
<code> </code><code>bind 0.0.0.0:91 </code>
<code> </code><code>stats </code><code>enable</code>
<code> </code><code>stats uri </code><code>/admin</code>
<code> </code><code>stats realm </code><code>"admin console"</code>
<code> </code><code>stats auth admin:123456 </code>
<code> </code><code>stats hide-version </code>
<code> </code><code>stats refresh 10s </code>
<code> </code><code>stats admin </code><code>if</code> <code>true</code>
<code>frontend web_proxy </code>
<code> </code><code>bind *:80 </code>
<code> </code><code>acl url_dynamic path_end -i .php </code>
<code> </code><code>use_backend phpserver </code><code>if</code> <code>url_dynamic </code>
<code> </code><code>default_backend webservers</code>
<code>backend webservers </code>
<code> </code><code>balance roundrobin </code>
<code> </code><code>option httpchk get </code><code>/test</code><code>.html http</code><code>/1</code><code>.0\r\nhost:192.168.0.26 </code>
<code> </code><code>server node01 192.168.0.24:8080 weight 3 check inter 2000 rise 2 fall 1 </code>
<code> </code><code>server node02 192.168.0.25:8080 weight 3 check inter 2000 rise 2 fall 1</code>
<code>backend phpserver </code>
<code> </code><code>option httpchk get </code><code>/test</code><code>.php </code>
<code> </code><code>server node01 192.168.0.24:8080 weight 3 check inter 2000 rise 2 fall 1</code>
2)app2上建立配置檔案
<code> </code><code>maxconn 4000 </code>
<code> </code><code>option httpchk get </code><code>/test</code><code>.html </code>
說明:兩節點互為主備模式,均優化将本機的節點應用做為主節點,也可以為負載均衡模式, 主例也配置了一個動靜分離的模式。
haproxy日志配置,否則預設是不記haproxy日志的,注意與rhel/centos5.x版本的差別。
<code># vi /etc/rsyslog.conf</code>
<code>$modload imudp </code>
<code>$udpserverrun 514 </code>
<code>$udpserveraddress 127.0.0.1 </code>
<code>local0.* </code><code>/var/log/haproxy</code><code>.log </code>
<code>*.info;mail.none;authpriv.none;</code><code>cron</code><code>.none;local0.none </code><code>/var/log/messages</code>
<code>說明: 第五行是去掉在</code><code>/var/log/message</code><code>再記錄haproxy.log日志的功能的。 </code>
<code>直接手動執行 </code>
<code>service rsyslog restart</code>
注:redhat/centos6.x 預設haproxy服務運作采用haproxy使用者,rpm包安裝haproxy,系統已自動配置日錄檔案輪詢功能。
1,是否有多vip位址,如果有的話,需要配置多個vrrp_instance執行個體,雙機互備。
2,監控腳本,用于監控nginx,或haproxy代理伺服器的存活狀态,用于切換vip位址。
3,兩種方式切換vip,一個是關閉代理服務,一個是關閉相關節點的keepalived伺服器。