天天看点

Haproxy+Keepalived+Jboss集群实施架构一例一、基础环境二、双机Keepalived配置三、HAproxy反向代理配置四、Jboss-EAP-4.3集群配置

两台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>

架构图如下:

Haproxy+Keepalived+Jboss集群实施架构一例一、基础环境二、双机Keepalived配置三、HAproxy反向代理配置四、Jboss-EAP-4.3集群配置

说明: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>&amp;&amp; </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: &lt;loopback,up,lower_up&gt; 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: &lt;broadcast,multicast&gt; 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: &lt;broadcast,multicast,up,lower_up&gt; 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: &lt;broadcast,multicast&gt; 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 &amp;&amp; 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>] &amp;&amp; </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 ] &amp;&amp; </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 ] &amp;&amp; </code><code>rm</code> <code>-f </code><code>/var/lock/subsys/haproxy</code> 

<code>[ $retval -</code><code>eq</code> <code>0 ] &amp;&amp; </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>] &amp;&amp; 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

直接在&lt;web-app&gt;下加入一行&lt;distributable/&gt;   

<code>&lt;!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"&gt; </code>

<code>&lt;</code><code>web-app</code><code>&gt; </code>

<code>&lt;</code><code>distributable</code><code>/&gt;</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    

&lt;attribute name="clustername"&gt;tomcat-app-cluster&lt;/attribute&gt;

<code>&lt;</code><code>config</code><code>&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</code><code>fd_sock</code> <code>down_thread</code><code>=</code><code>"true"</code> <code>up_thread</code><code>=</code><code>"true"</code><code>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</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>&lt;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>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;</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>/&gt; </code>

<code>&lt;/</code><code>config</code><code>&gt;</code>

整个架构配置完毕,实际在测试过程中稳定可靠。

继续阅读