天天看點

nginx+keepalived建構主備負載均衡代理伺服器

一、架構

<a href="http://s3.51cto.com/wyfs02/M02/46/41/wKiom1Pw4VeguISrAAXfAzjemJ0744.jpg" target="_blank"></a>

二、唠叨一會原理:

1、nginx

Nginx程序基于于Master+Slave(worker)多程序模型,自身具有非常穩定的子程序管理功能。在Master程序配置設定模式下,Master程序永遠不進行業務處理,隻是進行任務分發,

進而達到Master程序的存活高可靠性,Slave(worker)程序所有的業務信号都 由主程序發出,Slave(worker)程序所有的逾時任務都會被Master中止,屬于非阻塞式任務模型。

2、keepalived

Keepalived是Linux下面實作VRRP 備份路由的高可靠性運作件。基于Keepalived設計的服務模式能夠真正做到主伺服器和備份伺服器故障時IP瞬間無縫交接,作用:

主要用作RealServer的健康狀态檢查以及LoadBalance主機和BackUP主機之間failover的實作

3、單點故障

Nginx有很強代理功能,但是一台nginx就形成了單點,現在使用keepalived來解決這個問題,keepalived的故障轉移時間很短.

Nginx+keepalived雙機實作nginx反向代理服務的高可用,一台nginx挂掉之後不影響應用也不影響内網通路外網.

4、此架構需要考慮的問題

1) Master沒挂,則Master占有vip且nginx運作在Master上

2) Master挂了,則backup搶占vip且在backup上運作nginx服務

3) 如果master伺服器上的nginx服務挂了,則vip資源轉移到backup伺服器上

4) 檢測後端伺服器的健康狀态

5、叙述

Master和Backup兩邊都開啟nginx服務,無論Master還是Backup,當其中的一個keepalived服務停止後,vip都會漂移到keepalived服務還在的節點上,

如果要想使nginx服務挂了,vip也漂移到另一個節點,則必須用腳本或者在配置檔案裡面用shell指令來控制。

首先必須明确後端伺服器的健康狀态檢測keepalived在這種架構上是無法檢測的,後端伺服器的健康狀态檢測是有nginx來判斷的,但是nginx的檢測機制有一定的缺陷,後端伺服器某一個當機之後,nginx還是會分發請求給它,在一定的時間内後端服務響應不了,nginx則會發給另外一個伺服器,然後當客戶的請求來了,nginx會一段時間内不會把請求分發給已經當機的伺服器,但是過一段時間後,nginx還是會把分發請求發給當機的伺服器上。

三、準備工作

1

2

3

4

5

6

7

8

9

<code>1、環境</code>

<code>系統版本:CentOS 6.4 64bit</code>

<code>nginx版本:nginx-1.4.7.tar.gz</code>

<code>keepalived版本:keepalived-1.2.7.tar.gz</code>

<code>2、位址規劃</code>

<code>nginx+keepalived主      192.168.0.189     master</code>

<code>nginx+keepalived輔      192.168.0.200     badkup</code>

<code>vip                 192.168.0.250     vip</code>

四、安裝nginx和keepalived服務

1、安裝nginx服務[分别在master機器和backup機器安裝nginx服務]

10

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

38

39

40

41

42

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

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

<code>#!/bin/bash</code>

<code># time 2014-08-18</code>

<code># Allentuns</code>

<code>#安裝依賴環境包</code>

<code>yum -y install gcc gcc-c++ make unzip wget vim openssh-clients</code>

<code>#支援重寫rewrite,正規表達式</code>

<code>unzip pcre-8.33.zip</code>

<code>cd pcre-8.33</code>

<code>./configure --prefix=/usr/local/pcre</code>

<code>make &amp;&amp; make install</code>

<code>cd ..</code>

<code>#支援網頁壓縮</code>

<code>tar xf zlib-1.2.8.tar.gz</code>

<code>cd zlib-1.2.8</code>

<code>./configure  --prefix=/usr/local/zlib</code>

<code>#支援https</code>

<code>tar xf openssl-1.0.0l.tar.gz</code>

<code>cd openssl-1.0.0l</code>

<code>./config --prefix=/usr/local/openssl</code>

<code>#安裝mp4和flv子產品</code>

<code>tar xf nginx_mod_h264_streaming-2.2.7_update.tar.gz</code>

<code>#建立運作nginx服務的賬号群組</code>

<code>groupadd -r nginx</code>

<code>useradd -g nginx -r -s /sbin/nologin nginx</code>

<code>#安裝nginx</code>

<code>tar xf nginx-1.4.7.tar.gz</code>

<code>cd nginx-1.4.7</code>

<code>#啟用flv和mp4功能</code>

<code>./configure \</code>

<code>--user=nginx \</code>

<code>--group=nginx \</code>

<code>--prefix=/usr/local/nginx \</code>

<code>--with-pcre=../pcre-8.33 \</code>

<code>--with-zlib=../zlib-1.2.8 \</code>

<code>--with-openssl=../openssl-1.0.0l \</code>

<code>--with-http_stub_status_module \</code>

<code>--pid-path=/var/run/nginx/nginx.pid  \</code>

<code>--lock-path=/var/lock/nginx.lock \</code>

<code>--with-http_gzip_static_module \</code>

<code>--http-proxy-temp-path=/var/tmp/nginx/proxy/ \</code>

<code>--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \</code>

<code>--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \</code>

<code>--http-scgi-temp-path=/var/tmp/nginx/scgi \</code>

<code>--with-ipv6 \</code>

<code>--with-http_flv_module \</code>

<code>--with-http_mp4_module</code>

<code>#提供nginx啟動腳本</code>

<code>cat &gt; /etc/init.d/nginx &lt;&lt; EOF</code>

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

<code># </code>

<code># nginx - this script starts and stops the nginx daemin </code>

<code># chkconfig:   - 85 15 </code>

<code># description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ </code>

<code>#               proxy and IMAP/POP3 proxy server </code>

<code># processname: nginx </code>

<code># config:      /usr/local/nginx/conf/nginx.conf </code>

<code># pidfile:     /usr/local/nginx/logs/nginx.pid </code>

<code># Source function library. </code>

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

<code># Source networking configuration. </code>

<code>. /etc/sysconfig/network </code>

<code># Check that networking is up. </code>

<code>[ </code><code>"\$NETWORKING"</code> <code>= </code><code>"no"</code> <code>] &amp;&amp; exit 0 </code>

<code>nginx=</code><code>"/usr/local/nginx/sbin/nginx"</code>

<code>prog=\$(basename \$nginx) </code>

<code>NGINX_CONF_FILE=</code><code>"/usr/local/nginx/conf/nginx.conf"</code>

<code>lockfile=/var/lock/subsys/nginx </code>

<code>start() { </code>

<code>    </code><code>[ -x \$nginx ] || exit 5 </code>

<code>    </code><code>[ -f \$NGINX_CONF_FILE ] || exit 6 </code>

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

<code>    </code><code>daemon \$nginx -c \$NGINX_CONF_FILE </code>

<code>retval=\$? </code>

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

<code>    </code><code>[ \$retval -eq 0 ] &amp;&amp; touch \$lockfile </code>

<code>    </code><code>return \$retval </code>

<code>} </code>

<code>stop() { </code>

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

<code>    </code><code>killproc \$prog -QUIT </code>

<code>    </code><code>[ \$retval -eq 0 ] &amp;&amp; rm -f \$lockfile </code>

<code>restart() { </code>

<code>    </code><code>configtest || return \$? </code>

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

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

<code>reload() { </code>

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

<code>    </code><code>killproc \$nginx -HUP </code>

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

<code>force_reload() { </code>

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

<code>configtest() { </code>

<code>  </code><code>\$nginx -t -c \$NGINX_CONF_FILE </code>

<code>rh_status() { </code>

<code>    </code><code>status \$prog </code>

<code>rh_status_q() { </code>

<code>    </code><code>rh_status &gt;/dev/null 2&gt;&amp;1 </code>

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

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

<code>        </code><code>rh_status_q &amp;&amp; exit 0 </code>

<code>        </code><code>\$1 </code>

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

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

<code>        </code><code>rh_status_q || exit 0 </code>

<code>    </code><code>restart|configtest) </code>

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

<code>        </code><code>rh_status_q || exit 7 </code>

<code>    </code><code>force-reload) </code>

<code>        </code><code>force_reload </code>

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

<code>        </code><code>rh_status </code>

<code>    </code><code>condrestart|try-restart) </code>

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

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

<code>        </code><code>echo \$</code><code>"Usage: \$0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"</code> 

<code>        </code><code>exit 2 </code>

<code>esac</code>

<code>EOF</code>

<code>##賦予nginx執行的權限</code>

<code>chmod +x /etc/init.d/nginx</code>

<code>chkconfig --add nginx</code>

<code>#建立檔案</code>

<code>mkdir -p /var/tmp/nginx/proxy</code>

<code>#啟動nginx服務</code>

<code>/etc/init.d/nginx restart</code>

<code>#檢視nginx狀态</code>

<code>/bin/ps -ef |grep nginx</code>

2、分别在兩台機器上建立不同的測試頁面[為了測試]

<code>#在master機器建立index.html頁面</code>

<code>echo </code><code>"Welcome To 192.168.0.189"</code> <code>&gt; /usr/local/nginx/html/index.html</code>

<code>#在backup機器建立index.html頁面</code>

<code>echo </code><code>"Welcome To 192.168.0.200"</code> <code>&gt; /usr/local/nginx/html/index.html</code>

3、安裝keepalived

#至于keepalived的安裝可以選擇源碼編譯安裝或者yum源安裝,都可以;這裡選擇源碼編譯安裝

<code>#安裝keepalived源碼安裝的依賴包</code>

<code>yum -y install openssl openssl-devel</code>

<code>yum -y install popt-devel</code>

<code>#源碼編譯安裝keepalived</code>

<code>tar xf keepalived-1.2.7.tar.gz </code>

<code>cd keepalived-1.2.7</code>

<code>./configure --prefix=/usr/local/keepalived</code>

<code>#拷貝keepavlied的一些檔案到相關目錄中</code>

<code>mkdir /etc/keepalived</code>

<code>cp /usr/local/keepalived/sbin/keepalived /usr/sbin/</code>

<code>cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/</code>

<code>cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/</code>

<code>cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/</code>

修改keepalived配置檔案

keepalived的檔案路徑/etc/keepalived/keepalived.conf 

#####【Master-keepalived】#####

<code>! Configuration File for keepalived   #全局定義  </code>

<code>global_defs {</code>

<code>   </code><code>notification_email {               #指定keepalived在發生事件時(比如切換),需要發送的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              #指定發送email的smtp伺服器</code>

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

<code>   </code><code>router_id LVS_DEVEL                #運作keepalived的機器的一個辨別</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       #主輔virtual_router_id号必須相同</code>

<code>    </code><code>mcast_src_ip=192.168.0.189 #主nginx的ip位址</code>

<code>    </code><code>priority 100               #優先級為100,此值越大優先級越大 就為master 權重值</code>

<code>    </code><code>advert_int 1               #VRRP Multicast 廣播周期秒數;心跳檢測時間,機關秒</code>

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

<code>        </code><code>auth_type PASS         #vrrp認證方式</code>

<code>        </code><code>auth_pass 1111         #vrrp密碼</code>

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

<code>    </code><code>virtual_ipaddress {        #VRRP HA 虛拟位址 如果有多個VIP,繼續換行填寫</code>

<code>        </code><code>192.168.0.250/24 dev eth1</code>

#####【Backup-keepalived】#####

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

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

<code>   </code><code>smtp_server 127.0.0.1</code>

<code>   </code><code>router_id LVS_DEVEL</code>

<code>    </code><code>state BACKUP</code>

<code>    </code><code>interface eth1</code>

<code>    </code><code>virtual_router_id 51</code>

<code>    </code><code>mcast_src_ip=192.168.0.200</code>

<code>    </code><code>priority 99</code>

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

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

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

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

啟動keepalived服務[所有的服務開機啟動]

/etc/init.d/keepalived start

chkconfig nginx on

chkconfig keepalived on

檢視vip狀态

#首先在master節點上檢視vip的狀态

<code>[root@master ~]# ip addr show</code>

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

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

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

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

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

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

<code>    </code><code>link/ether 00:0c:29:59:45:de brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet 192.168.0.189/24 brd 192.168.0.255 scope global eth1</code>

<code>    </code><code>inet 192.168.0.250/32 scope global eth1          #vip位址已經加入到master節點上</code>

<code>    </code><code>inet6 fe80::20c:29ff:fe59:45de/64 scope link </code>

#其次在backup節點上檢視vip的狀态

<code>[root@backup ~]# ip addr show</code>

<code>    </code><code>link/ether 00:0c:29:61:70:d3 brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet 192.168.0.200/24 brd 192.168.0.255 scope global eth1</code>

<code>    </code><code>inet6 fe80::20c:29ff:fe61:70d3/64 scope link </code>

學會看日志輸出

一部分:當啟動keepalived服務的時候,會根據配置檔案的優先級來競選誰為master,從日志來看192.168.0.189競選master

<code>[root@master ~]# /etc/init.d/keepalived start</code>

<code>正在啟動 keepalived:                                      [确定]</code>

<code>[root@master ~]# tail -f /var/log/messages </code>

<code>Aug 16 11:09:48 localhost Keepalived[25707]: Starting Keepalived v1.2.7 (08/16,2014)</code>

<code>Aug 16 11:09:48 localhost Keepalived[25708]: Starting Healthcheck child process, pid=25710</code>

<code>Aug 16 11:09:48 localhost Keepalived[25708]: Starting VRRP child process, pid=25711</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: </code><code>Interface</code> <code>queue is empty</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Netlink reflector reports IP 192.168.0.189 added</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Netlink reflector reports IP fe80::20c:29ff:fe59:45de added</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Registering Kernel netlink reflector</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Registering Kernel netlink command channel</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Registering gratuitous ARP shared channel</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: </code><code>Interface</code> <code>queue is empty</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: Netlink reflector reports IP 192.168.0.189 added</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: Netlink reflector reports IP fe80::20c:29ff:fe59:45de added</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: Registering Kernel netlink reflector</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: Registering Kernel netlink command channel</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Opening file </code><code>'/etc/keepalived/keepalived.conf'.</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Configuration is using : 62766 Bytes</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: Using LinkWatch kernel netlink reflector...</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: Opening file </code><code>'/etc/keepalived/keepalived.conf'.</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: Configuration is using : 7073 Bytes</code>

<code>Aug 16 11:09:48 localhost Keepalived_vrrp[25711]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]</code>

<code>Aug 16 11:09:48 localhost Keepalived_healthcheckers[25710]: Using LinkWatch kernel netlink reflector...</code>

<code>Aug 16 11:09:51 localhost Keepalived_vrrp[25711]: VRRP_Instance(VI_1) Transition to MASTER STATE</code>

<code>Aug 16 11:09:56 localhost Keepalived_vrrp[25711]: VRRP_Instance(VI_1) Entering MASTER STATE</code>

<code>Aug 16 11:09:56 localhost Keepalived_vrrp[25711]: VRRP_Instance(VI_1) setting protocol VIPs.</code>

<code>Aug 16 11:09:56 localhost Keepalived_vrrp[25711]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.0.250</code>

<code>Aug 16 11:09:56 localhost Keepalived_healthcheckers[25710]: Netlink reflector reports IP 192.168.0.250 added</code>

<code>Aug 16 11:10:01 localhost Keepalived_vrrp[25711]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.0.250</code>

<code>[root@backup ~]# tail -f /var/log/messages </code>

<code>Aug 16 11:09:51 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) Received higher prio advert</code>

<code>Aug 16 11:09:51 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) Entering BACKUP STATE</code>

<code>Aug 16 11:09:51 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) removing protocol VIPs.</code>

<code>Aug 16 11:09:51 localhost Keepalived_healthcheckers[26135]: Netlink reflector reports IP 192.168.0.250 removed</code>

<code>[root@master ~]# ip addr show </code>

<code>    </code><code>inet 192.168.0.250/32 scope global eth1</code>

<code>二部分:當我們停掉主keepalived服務的時候,主master的vip會自動切換到輔機器上,看日志</code>

<code>停止主keepalived服務</code>

<code>[root@master ~]# /etc/init.d/keepalived stop</code>

<code>停止 keepalived:                                          [确定]</code>

<code>Aug 16 11:16:14 localhost Keepalived[25708]: Stopping Keepalived v1.2.7 (08/16,2014)</code>

<code>Aug 16 11:16:14 localhost Keepalived_vrrp[25711]: VRRP_Instance(VI_1) sending 0 priority</code>

<code>Aug 16 11:16:14 localhost Keepalived_vrrp[25711]: VRRP_Instance(VI_1) removing protocol VIPs.</code>

<code>Aug 16 11:16:14 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) Transition to MASTER STATE</code>

<code>Aug 16 11:16:19 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) Entering MASTER STATE</code>

<code>Aug 16 11:16:19 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) setting protocol VIPs.</code>

<code>Aug 16 11:16:19 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.0.250</code>

<code>Aug 16 11:16:19 localhost Keepalived_healthcheckers[26135]: Netlink reflector reports IP 192.168.0.250 added</code>

<code>Aug 16 11:16:24 localhost Keepalived_vrrp[26136]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.0.250</code>

<code>    </code><code>inet 192.168.0.250/32 scope global eth1  輔節點已經成功接管vip</code>

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

<code>測試1:nginx主備切換的時間</code>

<code>C:\Users\Allentuns&gt;ping 192.168.0.250 -t</code>

<code>正在 Ping 192.168.0.250 具有 32 位元組的資料:</code>

<code>來自 192.168.0.250 的回複: 位元組=32 時間&lt;1ms TTL=64</code>

<code>請求逾時。</code>

<code>192.168.0.250 的 Ping 統計資訊:</code>

<code>    </code><code>資料包: 已發送 = 28,已接收 = 26,丢失 = 2 (7% 丢失),</code>

<code>往返行程的估計時間(以毫秒為機關):</code>

<code>    </code><code>最短 = 0ms,最長 = 0ms,平均 = 0ms</code>

<code>Control-C</code>

<code>^C</code>

<code>C:\Users\Allentuns&gt;</code>

以上keepalived的配置檔案并不能滿足整個架構:

因為預設情況下,keepalived工作模式并不能直接監控nginx服務,隻有當keepalived服務挂掉後才能主備切換,nginx服務挂掉後不能實作主備伺服器的切換,但是我們的目的就是要實作nginx服務keepalived挂掉後,都要主備切換。

以上有兩種方法可以實作

keepalived配置檔案中可以支援shell腳本,寫個監聽nginx服務的腳本就可以了

單獨寫個腳本來監聽nginx和keepalived服務

基于第一種情況

<code>vrrp_script </code>

<code>chk_nginx {               #檢測nginx服務是否在運作有很多方式,比如程序,用腳本檢測等等 </code>

<code>   </code><code>script </code><code>"killall -0 nginx"</code>  <code>#用shell指令檢查nginx服務是否存在 </code>

<code>   </code><code>interval 1                 #時間間隔為1秒檢測一次 </code>

<code>   </code><code>weight -2                  #當nginx的服務不存在了,就把目前的權重-2 </code>

<code>   </code><code>fall 2                     #測試失敗的次數 </code>

<code>   </code><code>rise 1                     #測試成功的次數 </code>

<code>    </code><code>track_script { </code>

<code>    </code><code>chk_nginx   #引用上面的vrrp_script定義的腳本名稱 </code>

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

<code> </code> 

<code>#這種情況的監聽腳本是2秒中監聽一次nginx服務,如果程序不存在,則将keepalived的權重減少2,為98,那麼權重為99的為主 自動切換到備用伺服器上</code>

基于第二種情況

<code>#!/bin/bash </code>

<code>while  : </code>

<code>do </code>

<code> </code><code>nginxpid=`ps -C nginx --no-header | wc -l` </code>

<code> </code><code>if [ $nginxpid -eq 0 ];then </code>

<code>  </code><code>/usr/local/nginx/sbin/nginx </code>

<code>  </code><code>sleep 5 </code>

<code>  </code><code>nginxpid=`ps -C nginx --no-header | wc -l` </code>

<code>  </code><code>echo $nginxpid </code>

<code>    </code><code>if [ $nginxpid -eq 0 ];then </code>

<code> </code><code>/etc/init.d/keepalived stop </code>

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

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

<code> </code><code>sleep 5 </code>

<code>done</code>

<code>#這個腳本确實很好用,來自酒哥的博文</code>

至于後端tomcat的負載均衡和主備切換在這裡就不多說了!很簡單。。。。 網上有很多這方面的教程

我會在下周末之前把nginx的雙主架構和hadoop的源碼編譯貢獻給部落格上。

博文的筆記和所有的軟體都已經上傳!期待和大家交流更多linux運維 QQ 467754239

http://yunpan.cn/QaSn4mzCd65YP  通路密碼 06b3

----------補充時間 2015-01-14----------

主Nginx機器之一的Keepalived.conf配置檔案如下:

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

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

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

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

<code>    </code><code>state MASTER</code>

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

<code>    </code><code>priority 100</code>

<code>        </code><code>auth_pass 1paituan.com</code>

<code>        </code><code>192.168.1.8</code>

<code>vrrp_instance VI_2 {</code>

<code>    </code><code>virtual_router_id 52</code>

<code>        </code><code>192.168.1.9</code>

主Nginx之二的keepalivd.conf配置檔案如下:

<code>        </code><code>auth_pass 1paituan</code>

<code>        </code><code>192.168.1.8                 </code>

<code>        </code><code>192.168.1.9                 </code>

二台機器的監控Nginx的程序腳本,腳本内容如下:

<code>#!/bin/bash</code>

<code>while</code>  <code>:</code>

<code>do</code>

<code>nginxpid=`</code><code>ps</code> <code>-C nginx --no-header | </code><code>wc</code> <code>-l`</code>

<code> </code><code>if</code> <code>[ $nginxpid -</code><code>eq</code> <code>0 ];</code><code>then</code>

<code>  </code><code>/usr/local/nginx/sbin/nginx</code>

<code>  </code><code>sleep</code> <code>5</code>

<code>  </code><code>echo</code> <code>$nginxpid</code>

<code>    </code><code>if</code> <code>[ $nginxpid -</code><code>eq</code> <code>0 ];</code><code>then</code>

<code> </code><code>/etc/init</code><code>.d</code><code>/keepalived</code> <code>stop</code>

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

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

<code> </code><code>sleep</code> <code>5</code>

<code>nohup</code> <code>sh </code><code>/root/nginxpid</code><code>.sh &amp;</code>

此腳本我是直接從生産伺服器上下載下傳的,大家不要懷疑它會引起死循環和有效性的問題,我稍為解釋一下,這是一個無限循環的腳本,放在主Nginx機器上(因為目前主要是由它提供服務),每隔5秒執行一次,用ps -C 指令來收集nginx的PID值到底是否為0,如果是0的話(即Nginx程序死掉了),嘗試啟動nginx程序;如果繼續為0,即nginx啟動失改, 則關閉本機的Keeplaived程序,VIP位址則會由備機接管,當然了,整個網站就會由備機的Nginx來提供服務了,這樣保證Nginx程序的高可用。

<a href="http://s3.51cto.com/wyfs02/M01/58/A3/wKiom1S2JGfQRS8LAADrSHOcUpc961.jpg" target="_blank"></a>

最近工作不是很忙,花時間做了個實驗,來驗證vip能不能是公網位址中的一個或者多個。

驗證的結果是這樣的:如果按照上圖來配置設定位址,使用公網位址117.25.36.41和117.25.36.43中的任意一個來充當vip的後果是,實體網卡上eth1上的位址就會失效,導緻無法使用xshell的ssh連接配接伺服器,因為找不到位址了。隻有vip浮動到那個伺服器上才能遠端登入到伺服器上。

建議:vip最好不使用伺服器上綁定的實體網卡,以免影響不必要的麻煩。

時間:2015-04-13 補充

<code>Apr </code><code>13</code> <code>17</code><code>:</code><code>08</code><code>:</code><code>07</code> <code>localhost Keepalived_vrrp[</code><code>2186</code><code>]: bogus VRRP packet received on eth0 !!!</code>

<code>Apr </code><code>13</code> <code>17</code><code>:</code><code>08</code><code>:</code><code>07</code> <code>localhost Keepalived_vrrp[</code><code>2186</code><code>]: VRRP_Instance(VI_1) ignoring received advertisment...</code>

<code>Apr </code><code>13</code> <code>17</code><code>:</code><code>08</code><code>:</code><code>08</code> <code>localhost Keepalived_vrrp[</code><code>2186</code><code>]: ip address associated with VRID </code><code>not</code> <code>present </code><code>in</code> <code>received packet : </code><code>192.168</code><code>.</code><code>0.251</code>

<code>Apr </code><code>13</code> <code>17</code><code>:</code><code>08</code><code>:</code><code>08</code> <code>localhost Keepalived_vrrp[</code><code>2186</code><code>]: one </code><code>or</code> <code>more VIP associated with VRID mismatch actual MASTER advert</code>

<code>Apr </code><code>13</code> <code>17</code><code>:</code><code>08</code><code>:</code><code>08</code> <code>localhost Keepalived_vrrp[</code><code>2186</code><code>]: bogus VRRP packet received on eth0 !!!</code>

<code>Apr </code><code>13</code> <code>17</code><code>:</code><code>08</code><code>:</code><code>08</code> <code>localhost Keepalived_vrrp[</code><code>2186</code><code>]: VRRP_Instance(VI_1) ignoring received advertisment...</code>

解決辦法:

改變配置檔案/etc/keepalived/keepalived.conf 中virtual_route_id的值

比如virtual_router_id 60 主從方都要改,預設為51

     本文轉自zys467754239 51CTO部落格,原文連結:http://blog.51cto.com/467754239/1541421,如需轉載請自行聯系原作者

繼續閱讀