兩台ibm x3650m3,作業系統centos5.9 x64 ,連接配接一台ibm ds3400存儲,系統底層采用gfs檔案系統實作檔案共享,資料庫是另一套獨立的oracle rac叢集,本架構無需考慮資料庫的問題。
ibm x3650m3+gfs+ipmi fence生産環境配置一例
<a href="http://koumm.blog.51cto.com/703525/1544971" target="_blank">http://koumm.blog.51cto.com/703525/1544971</a>
架構圖如下:
說明:ibm伺服器需要将專用imm2口或标注有system mgmt網口接入交換機, 與本地ip位址同段。
ipmi: 10.10.10.85/24
eth1: 192.168.233.83/24
eth1:0 10.10.10.87/24
ipmi: 10.10.10.86/24
eth1: 192.168.233.84/24
eth1:0 10.10.10.88/24
# cat /etc/hosts
192.168.233.83 node01
192.168.233.84 node02
192.168.233.90 vip
10.10.10.85 node01_ipmi
10.10.10.86 node02_ipmi
實作一個vip出現,出例采用vip位址是192.168.233.90。
說明:keepalive-1.2.12經過安裝沒有問題。
1
2
3
4
5
6
7
8
9
<code>wget http:</code><code>//www</code><code>.keepalived.org</code><code>/software/keepalived-1</code><code>.2.12.</code><code>tar</code><code>.gz </code>
<code>tar</code> <code>zxvf keepalived-1.2.12.</code><code>tar</code><code>.gz </code>
<code>cd</code> <code>keepalived-1.2.12 </code>
<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/keepalived</code>
<code>make</code> <code>&& </code><code>make</code> <code>install</code>
<code>cp</code> <code>/usr/local/keepalived/sbin/keepalived</code> <code>/usr/sbin/</code>
<code>cp</code> <code>/usr/local/keepalived/etc/sysconfig/keepalived</code> <code>/etc/sysconfig/</code>
<code>cp</code> <code>/usr/local/keepalived/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/keepalived</code> <code>/etc/init</code><code>.d/ </code>
<code>mkdir</code> <code>/etc/keepalived</code>
修改配置檔案, 綁定的網卡是eth1
說明: 從機就是優先級與本機ip不一樣外,其它都是一樣。
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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_instance vi_1 {</code>
<code> </code><code>state master </code>
<code> </code><code>interface eth1</code>
<code> </code><code>virtual_router_id 51</code>
<code> </code><code>mcast_src_ip 192.168.233.83 </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.233.90 </code>
<code> </code><code>mcast_src_ip 192.168.233.84</code>
<code> </code><code>priority 99 </code>
<code> </code><code>192.168.233.90 </code>
<code>service keepalived start </code>
<code>chkconfig --add keepalived </code>
<code>chkconfig keepalived on</code>
主機: 觀察vip位址如下:
<code>[root@node01 /]</code><code># service keepalived start </code>
<code>starting keepalived: [ ok ][root@node01 /]</code><code># ip a </code>
<code>1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue </code>
<code>link</code><code>/loopback</code> <code>00:00:00:00:00:00 brd 00:00:00:00:00:00 </code>
<code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo </code>
<code>2: eth0: <broadcast,multicast> mtu 1500 qdisc noop qlen 1000 </code>
<code>link</code><code>/ether</code> <code>e4:1f:13:65:0e:a0 brd ff:ff:ff:ff:ff:ff </code>
<code>3: eth1: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 1000 </code>
<code>link</code><code>/ether</code> <code>e4:1f:13:65:0e:a2 brd ff:ff:ff:ff:ff:ff </code>
<code>inet 192.168.233.83</code><code>/24</code> <code>brd 192.168.230.255 scope global eth1 </code>
<code>inet 10.10.10.87</code><code>/24</code> <code>brd 10.10.10.255 scope global eth1:0 </code>
<code>inet 192.168.233.85</code><code>/32</code> <code>scope global eth1 </code>
<code>4: usb0: <broadcast,multicast> mtu 1500 qdisc pfifo_fast qlen 1000 </code>
<code>link</code><code>/ether</code> <code>e6:1f:13:57:0e:a3 brd ff:ff:ff:ff:ff:ff </code>
<code>[root@node01 /]</code><code>#</code>
注:可以關閉keepalived服務,通過cat /var/log/messages觀察vip移動情況。
node01, node02配置操作
<code># vi /etc/sysctl.conf </code>
<code>net.ipv4.ip_nonlocal_bind = 1</code>
<code># sysctl –p</code>
<code># tar zxvf haproxy-1.4.25.tar.gz </code>
<code># cd haproxy-1.4.25 </code>
<code># make target=linux26 prefix=/usr/local/haproxy </code>
<code># make install prefix=/usr/local/haproxy </code>
<code># cd /usr/local/haproxy </code>
<code># mkdir conf</code>
<code># wget http://www.dest-unreach.org/socat/download/socat-2.0.0-b5.tar.gz </code>
<code># tar zxvf socat-2.0.0-b5.tar.gz </code>
<code># ./configure --disable-fips </code>
<code># make && make install</code>
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<code># vi /usr/local/haproxy/conf/haproxy.cfg</code>
<code>global </code>
<code>log 127.0.0.1 local0 </code>
<code>maxconn 65535 </code>
<code>chroot </code><code>/usr/local/haproxy</code>
<code>uid 99 </code>
<code>gid 99 </code>
<code>stats socket </code><code>/usr/local/haproxy/haproxsocket</code> <code>level admin </code>
<code>daemon </code>
<code>nbproc 1 </code>
<code>pidfile </code><code>/usr/local/haproxy/haproxy</code><code>.pid </code>
<code>#debug</code>
<code>defaults </code>
<code>log 127.0.0.1 local3 </code>
<code>mode http </code>
<code>option httplog </code>
<code>option httpclose </code>
<code>option dontlognull </code>
<code>option forwardfor </code>
<code>option redispatch </code>
<code>retries 2 </code>
<code>maxconn 2000 </code>
<code>balance </code><code>source</code>
<code>#balance roundrobin </code>
<code>stats uri </code><code>/haproxy-stats</code>
<code>contimeout 5000 </code>
<code>clitimeout 50000 </code>
<code>srvtimeout 50000</code>
<code>listen web_proxy 0.0.0.0:80 </code>
<code>option httpchk get </code><code>/test</code><code>.html http</code><code>/1</code><code>.0\r\nhost:192.168.233.90 </code>
<code>server node01 192.168.233.83:8000 weight 3 check inter 2000 rise 2 fall 1 </code>
<code>server node02 192.168.233.84:8000 weight 3 backup check inter 2000 rise 2 fall 1</code>
<code>listen stats_auth 0.0.0.0:91 </code>
<code>stats </code><code>enable</code>
<code>stats uri </code><code>/admin</code>
<code>stats realm </code><code>"admin console"</code>
<code>stats auth admin:123456 </code>
<code>stats hide-version </code>
<code>stats refresh 10s </code>
<code>stats admin </code><code>if</code> <code>true</code>
<code>server node01 192.168.233.83:8000 weight 3 backup check inter 2000 rise 2 fall 1 </code>
<code>server node02 192.168.233.84:8000 weight 3 check inter 2000 rise 2 fall 1</code>
<code>stats realm </code><code>"admin_console"</code>
說明:兩節點互為主備模式,均優化将本機的節點應用做為主節點,也可以為負載均衡模式。
<code># vi /etc/syslog.conf </code>
<code>local3.* </code><code>/var/log/haproxy</code><code>.log </code>
<code>local0.* </code><code>/var/log/haproxy</code><code>.log </code>
<code>*.info;mail.none;authpriv.none;</code><code>cron</code><code>.none;local3.none </code><code>/var/log/messages</code>
說明: 第三行是去掉在/var/log/message再記錄haproxy.log日志的功能的。
<code># vi /etc/sysconfig/syslog </code>
<code>syslogd_options=</code><code>"-r -m 0"</code>
直接手動執行
<code>service syslog restart </code>
<code>touch</code> <code>/var/log/haproxy</code><code>.log </code>
<code>chown</code> <code>nobody:nobody </code><code>/var/log/haproxy</code><code>.log</code>
<code>注:99預設是nobody使用者 </code>
<code>chmod</code> <code>u+x </code><code>/var/log/haproxy</code><code>.log</code>
<code># vi /root/system/cut_log.sh </code>
<code>#!/bin/bash </code>
<code># author: koumm </code>
<code># desc: </code>
<code># date: 2014-08-28 </code>
<code># version: v1.0 </code>
<code># modify:</code>
<code># cut haproxy log </code>
<code>if</code> <code>[ -e </code><code>/var/log/haproxy</code><code>.log ]; </code><code>then</code>
<code>mv</code> <code>/var/log/haproxy</code><code>.log </code><code>/var/log/haproxy</code><code>.log.bak </code>
<code>fi</code>
<code>if</code> <code>[ -e </code><code>/var/log/haproxy</code><code>.log.bak ]; </code><code>then</code>
<code>logrotate -f </code><code>/etc/logrotate</code><code>.conf </code>
<code>chown</code> <code>nobody:nobody </code><code>/var/log/haproxy</code><code>.log </code>
<code>chmod</code> <code>+x </code><code>/var/log/haproxy</code><code>.log </code>
<code>sleep</code> <code>1</code>
<code>rm</code> <code>-rf </code><code>/var/log/haproxy</code><code>.log.bak </code>
注:root權限執行腳本。
# crontab -e
59 23 * * * su - root -c '/root/system/cut_log.sh'
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<code># vi /etc/init.d/haproxy</code>
<code>#!/bin/sh </code>
<code># chkconfig: 345 85 15 </code>
<code># description: haproxy is a tcp/http reverse proxy which is particularly suited for high availability environments.</code>
<code># source function library. </code>
<code>if</code> <code>[ -f </code><code>/etc/init</code><code>.d</code><code>/functions</code> <code>]; </code><code>then</code>
<code>. </code><code>/etc/init</code><code>.d</code><code>/functions</code>
<code>elif</code> <code>[ -f </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code> <code>] ; </code><code>then</code>
<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>
<code>else</code>
<code>exit</code> <code>0 </code>
<code># source networking configuration. </code>
<code>. </code><code>/etc/sysconfig/network</code>
<code># check that networking is up. </code>
<code>[ ${networking} = </code><code>"no"</code> <code>] && </code><code>exit</code> <code>0 </code>
<code>[ -f </code><code>/usr/local/haproxy/conf/haproxy</code><code>.cfg ] || </code><code>exit</code> <code>1</code>
<code>retval=0</code>
<code>start() { </code>
<code>/usr/local/haproxy/sbin/haproxy</code> <code>-c -q -f </code><code>/usr/local/haproxy/conf/haproxy</code><code>.cfg</code>
<code>if</code> <code>[ $? -</code><code>ne</code> <code>0 ]; </code><code>then</code>
<code>echo</code> <code>"errors found in configuration file."</code>
<code>return</code> <code>1 </code>
<code>echo</code> <code>-n </code><code>"starting haproxy: "</code>
<code>daemon </code><code>/usr/local/haproxy/sbin/haproxy</code> <code>-d -f </code><code>/usr/local/haproxy/conf/haproxy</code><code>.cfg -p </code><code>/var/run/haproxy</code><code>.pid </code>
<code>retval=$?</code>
<code>echo</code>
<code>[ $retval -</code><code>eq</code> <code>0 ] && </code><code>touch</code> <code>/var/lock/subsys/haproxy</code>
<code>return</code> <code>$retval </code>
<code>stop() { </code>
<code>echo</code> <code>-n </code><code>"shutting down haproxy: "</code>
<code>killproc haproxy -usr1 </code>
<code>retval=$? </code>
<code>[ $retval -</code><code>eq</code> <code>0 ] && </code><code>rm</code> <code>-f </code><code>/var/lock/subsys/haproxy</code>
<code>[ $retval -</code><code>eq</code> <code>0 ] && </code><code>rm</code> <code>-f </code><code>/var/run/haproxy</code><code>.pid </code>
<code>restart() { </code>
<code>/usr/local/haproxy/sbin/haproxy</code> <code>-c -q -f </code><code>/usr/local/haproxy/conf/haproxy</code><code>.cfg </code>
<code>echo</code> <code>"errors found in configuration file, check it with 'haproxy check'."</code>
<code>fi</code>
<code>stop </code>
<code>start </code>
<code>check() { </code>
<code>/usr/local/haproxy/sbin/haproxy</code> <code>-c -q -v -f </code><code>/usr/local/haproxy/conf/haproxy</code><code>.cfg </code>
<code>rhstatus() { </code>
<code>status haproxy </code>
<code>condrestart() { </code>
<code>[ -e </code><code>/var/lock/subsys/haproxy</code> <code>] && restart || : </code>
<code># see how we were called.</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code>start) </code>
<code>;; </code>
<code>stop) </code>
<code>restart) </code>
<code>restart </code>
<code>reload) </code>
<code>condrestart) </code>
<code>condrestart </code>
<code>status) </code>
<code>rhstatus </code>
<code>check) </code>
<code>check </code>
<code>*) </code>
<code>echo</code> <code>$</code><code>"usage: haproxy {start|stop|restart|reload|condrestart|status|check}"</code>
<code>retval=1 </code>
<code>esac</code>
<code>exit</code> <code>$retval</code>
<code>chmod</code> <code>+x </code><code>/etc/init</code><code>.d</code><code>/haproxy</code>
<code>chkconfig --add haproxy </code>
<code>chkconfig haproxy on </code>
<code>service haproxy start</code>
因為沒有應用,代理會出現503報錯。
在應用程式中配置會話複制
# vi /cluster/zhzxxt/deploy/app.war/web-inf/web.xml
直接在<web-app>下加入一行<distributable/>
<code><!doctype web-app </code>
<code>public "-//sun microsystems, inc.//dtd web application 2.3//en" </code>
<code>"http://java.sun.com/dtd/web-app_2_3.dtd"> </code>
<code><</code><code>web-app</code><code>> </code>
<code><</code><code>distributable</code><code>/></code>
# vi /cluster/jboss4/server/node01/deploy/jboss-web-cluster.sar/meta-inf/jboss-service.xml
# vi /cluster/jboss4/server/node02/deploy/jboss-web-cluster.sar/meta-inf/jboss-service.xml
<attribute name="clustername">tomcat-app-cluster</attribute>
<code><</code><code>config</code><code>> </code>
<code><</code><code>tcp</code> <code>bind_addr</code><code>=</code><code>"192.168.233.83"</code> <code>start_port</code><code>=</code><code>"7810"</code> <code>loopback</code><code>=</code><code>"true"</code>
<code>tcp_nodelay</code><code>=</code><code>"true"</code>
<code>recv_buf_size</code><code>=</code><code>"20000000"</code>
<code>send_buf_size</code><code>=</code><code>"640000"</code>
<code>discard_incompatible_packets</code><code>=</code><code>"true"</code>
<code>enable_bundling</code><code>=</code><code>"true"</code>
<code>max_bundle_size</code><code>=</code><code>"64000"</code>
<code>max_bundle_timeout</code><code>=</code><code>"30"</code>
<code>use_incoming_packet_handler</code><code>=</code><code>"true"</code>
<code>use_outgoing_packet_handler</code><code>=</code><code>"false"</code>
<code>down_thread</code><code>=</code><code>"false"</code> <code>up_thread</code><code>=</code><code>"false"</code>
<code>use_send_queues</code><code>=</code><code>"false"</code>
<code>sock_conn_timeout</code><code>=</code><code>"300"</code>
<code>skip_suspected_members</code><code>=</code><code>"true"</code><code>/> </code>
<code><</code><code>tcpping</code> <code>initial_hosts</code><code>=</code><code>"192.168.233.83[7810],192.168.233.84[7810]"</code> <code>port_range</code><code>=</code><code>"3"</code>
<code>timeout</code><code>=</code><code>"3000"</code>
<code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code>
<code>num_initial_members</code><code>=</code><code>"3"</code><code>/> </code>
<code><</code><code>merge2</code> <code>max_interval</code><code>=</code><code>"100000"</code>
<code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code> <code>min_interval</code><code>=</code><code>"20000"</code><code>/> </code>
<code><</code><code>fd_sock</code> <code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code><code>/> </code>
<code><</code><code>fd</code> <code>timeout</code><code>=</code><code>"10000"</code> <code>max_tries</code><code>=</code><code>"5"</code> <code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code> <code>shun</code><code>=</code><code>"true"</code><code>/> </code>
<code><</code><code>verify_suspect</code> <code>timeout</code><code>=</code><code>"1500"</code> <code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code><code>/> </code>
<code><</code><code>pbcast.nakack</code> <code>max_xmit_size</code><code>=</code><code>"60000"</code>
<code>use_mcast_xmit</code><code>=</code><code>"false"</code> <code>gc_lag</code><code>=</code><code>"0"</code>
<code>retransmit_timeout</code><code>=</code><code>"300,600,1200,2400,4800"</code>
<code>discard_delivered_msgs</code><code>=</code><code>"true"</code><code>/> </code>
<code><</code><code>pbcast.stable</code> <code>stability_delay</code><code>=</code><code>"1000"</code> <code>desired_avg_gossip</code><code>=</code><code>"50000"</code>
<code><pbcast.gms </code><code>print_local_addr</code><code>=</code><code>"true"</code> <code>join_timeout</code><code>=</code><code>"3000"</code>
<code>join_retry_timeout</code><code>=</code><code>"2000"</code> <code>shun</code><code>=</code><code>"true"</code>
<code>view_bundling</code><code>=</code><code>"true"</code><code>/> </code>
<code><</code><code>fc</code> <code>max_credits</code><code>=</code><code>"2000000"</code> <code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code>
<code>min_threshold</code><code>=</code><code>"0.10"</code><code>/> </code>
<code><</code><code>frag2</code> <code>frag_size</code><code>=</code><code>"60000"</code> <code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code><code>/> </code>
<code><</code><code>pbcast.state_transfer</code> <code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code> <code>use_flush</code><code>=</code><code>"false"</code><code>/> </code>
<code></</code><code>config</code><code>></code>
整個架構配置完畢,實際在測試過程中穩定可靠。