1宫盔、運(yùn)用haproxy實(shí)現(xiàn)nginx服務(wù)負(fù)載均衡
測(cè)試環(huán)境:
Nginx1: 172.16.100.151 port:80
Nginx2:172.16.100.155 port:80
Haproxy:172.16.100.156
安裝環(huán)境
1.Nginx安裝過(guò)程略
2.配置nginx方便測(cè)試效果
修改nginx安裝目錄下/html/index.html文件的內(nèi)容谴供,方便測(cè)試效果
172.16.100.155--index.html
172.16.100.151--index.html
檢查nginx配置文件,并啟動(dòng)/重啟
3.安裝haproxy
這里采用的是yum安裝haproxy1.5
haproxy-1.5
4.配置haproxy
Yum安裝haproxy在默認(rèn)目錄/etc/haproxy下,配置文件為haproxy.cfg
修改配置文件端口
修改bind ip:端口
修改backend app地址
修改backend app地址
此處僅做測(cè)試锦援,所以backend static沒(méi)有做過(guò)多修改儒恋,直接改為本機(jī)地址。
5.測(cè)試負(fù)載
訪問(wèn)172.16.100.156黄刚,可以看到結(jié)果
強(qiáng)制刷新后
反復(fù)刷新可以發(fā)現(xiàn)實(shí)現(xiàn)了輪詢效果
6.測(cè)試高可用
保持其他設(shè)置不變捎谨,關(guān)掉172.16.100.151的nginx,刷新172.16.100.156發(fā)現(xiàn)頁(yè)面停留在172.16.100.155
2、搭建haproxy實(shí)現(xiàn)mysql負(fù)載均衡
1.Mysql安裝過(guò)程略過(guò)
2.配置mysql
配置172.16.100.151的mysql
編輯/etc/my.cnf文件涛救,在mysqld模塊加入以下內(nèi)容:
server-id=1? ? ? ? ? ? ? ? ? ? ? ? ? ?? #server的唯一標(biāo)識(shí)
auto_increment_offset=1? ? ? ? ? ? ? ? ? #自增id起始值
auto_increment_increment=2? ? ? ? ? ? ? ? #每次自增數(shù)字
log-bin = mysql-bin? ? ? ? ? ? ? ? ? ? ? ? ?? #打開二進(jìn)制功能,MASTER主服務(wù)器必須打開此項(xiàng)
max_binlog_size=1024M? ? ? ? ? ? ? ? ? ? ? ? ? #binlog單文件最大值
replicate-ignore-db = mysql? ? ? ? ? ? ? ? ? ? #忽略不同步主從的數(shù)據(jù)庫(kù)
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
保存修改畏邢,重啟mysql服務(wù),檢查端口检吆,服務(wù)等是否正常
進(jìn)入mysql舒萎,為mysql添加主從同步用賬戶
mysql> grant replication slave on *.* to 'repl'@'172.16.100.155' identified by '123456';
mysql> show master status;? 在172.16.100.151上查看master狀態(tài)
在151機(jī)的mysql內(nèi)再執(zhí)行:
mysql> change master to master_host='172.16.100.155',\
master_port=3306,master_user='repl',master_password='123456',\
master_log_file='mysql-bin.000001',master_log_pos=120;?
Mysql-bin二進(jìn)制文件對(duì)應(yīng)155的二進(jìn)制文件,master_log_pos對(duì)應(yīng)155的position
mysql> start slave;? 開啟主從服務(wù)
mysql> show slave status\G; 查看狀態(tài)
主從同步成功蹭沛。
配置172.16.100.155的mysql
兩者過(guò)程大致相同
編輯/etc/my.cnf文件臂寝,在mysqld模塊加入以下內(nèi)容:
server-id=2? ? ? ? ? ? ? ? ? ? ? ? ?? #server的唯一標(biāo)識(shí),不可重復(fù)
auto_increment_offset=1? ? ? ? ? ? ? ? ? #自增id起始值
auto_increment_increment=2? ? ? ? ? ? ? ? #每次自增數(shù)字摊灭,一共有幾臺(tái)mysql則為幾咆贬,此處一共兩臺(tái)mysql,故而設(shè)為2
log-bin = mysql-bin? ? ? ? ? ? ? ? ? ? ? ? ?? #打開二進(jìn)制功能,MASTER主服務(wù)器必須打開此項(xiàng)
max_binlog_size=1024M? ? ? ? ? ? ? ? ? ? ? ? ? #binlog單文件最大值
replicate-ignore-db = mysql? ? ? ? ? ? ? ? ? ? #忽略不同步主從的數(shù)據(jù)庫(kù)
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
保存修改斟或,重啟mysql服務(wù)素征,檢查端口,服務(wù)等是否正常
進(jìn)入mysql萝挤,為mysql添加主從同步用賬戶
mysql> grant replication slave on *.* to 'repl'@'172.16.100.151' identified by '123456';
mysql> show master status;? 在172.16.100.155上查看master狀態(tài)
在155機(jī)的mysql內(nèi)再執(zhí)行:
mysql> change master to master_host='172.16.100.151',\
master_port=3306,master_user='repl',master_password='123456',\
master_log_file='mysql-bin.000001',master_log_pos=308415;?
Mysql-bin二進(jìn)制文件對(duì)應(yīng)151的二進(jìn)制文件御毅,master_log_pos對(duì)應(yīng)151的position
mysql> start slave;? 開啟主從服務(wù)
mysql> show slave status\G; 查看狀態(tài)
備注:
如果出現(xiàn)slave_IO_running:NO的情況,在確保網(wǎng)絡(luò)怜珍,數(shù)據(jù)庫(kù)權(quán)限都正常的情況下端蛆,一般是由于所要連接的主庫(kù)position值發(fā)生變化,導(dǎo)致在建立主從時(shí)沒(méi)有對(duì)應(yīng)上正確的position酥泛,一般原因是主庫(kù)數(shù)據(jù)庫(kù)存在讀寫過(guò)程今豆。
3.配置haproxy實(shí)現(xiàn)mysql負(fù)載均衡
在haproxy機(jī)172.16.100.156上
修改haproxy配置文件內(nèi)容:global
? ? ? ? daemon
? ? ? ? nbproc 1
? ? ? ? pidfile /var/run/haproxy.pid
defaults
? ? ? ? mode tcp? ? ? ? ? ? ?? #默認(rèn)的模式mode { tcp|http|health },tcp是4層柔袁,http是7層呆躲,health只會(huì)返回OK
? ? ? ? retries 2? ? ? ? ? ? ?? #兩次連接失敗就認(rèn)為是服務(wù)器不可用,也可以通過(guò)后面設(shè)置
? ? ? ? option redispatch? ? ?? #當(dāng)serverId對(duì)應(yīng)的服務(wù)器掛掉后捶索,強(qiáng)制定向到其他健康的服務(wù)器
? ? ? ? option abortonclose? ?? #當(dāng)服務(wù)器負(fù)載很高的時(shí)候插掂,自動(dòng)結(jié)束掉當(dāng)前隊(duì)列處理比較久的鏈接
? ? ? ? maxconn 4096? ? ? ? ? ? #默認(rèn)的最大連接數(shù)
? ? ? ? timeout connect 5000ms? #連接超時(shí)
? ? ? ? timeout client 30000ms? #客戶端超時(shí)
? ? ? ? timeout server 30000ms? #服務(wù)器超時(shí)
? ? ? ? #timeout check 2000? ? ? #=心跳檢測(cè)超時(shí)
? ? ? ? log 127.0.0.1 local0 err #[err warning info debug]
########test1配置#################
listen test1
? ? ? ? bind 0.0.0.0:3306
? ? ? ? mode tcp
? ? ? ? #maxconn 4086
? ? ? ? #log 127.0.0.1 local0 debug
? ? ? ? server s1 172.16.100.151:3306
? ? ? ? server s2 172.16.100.155:3306
########frontend配置##############
重新啟動(dòng)haproxy,連接mysql測(cè)試即可
3腥例、搭建tomcat服務(wù)器辅甥,并通過(guò)nginx反向代理訪問(wèn)
http://www.reibang.com/p/a3713dc1fd38
4、搭建Tomcat燎竖,并基于memcached實(shí)現(xiàn)會(huì)話共享
Memcached是一款免費(fèi)璃弄、開源、分布式的內(nèi)存對(duì)象緩存系統(tǒng), 用于減少數(shù)據(jù)庫(kù)的負(fù)載, 加快web應(yīng)用程序的訪問(wèn). Memcached簡(jiǎn)單并且強(qiáng)大, 其簡(jiǎn)單的設(shè)計(jì)加快了部署, 易于開發(fā), 緩存解決了面臨的大量數(shù)據(jù)時(shí)很多的問(wèn)題.
[root@mem-node1 ~]# yum -y install libevent libevent-devel
[root@mem-node1 ~]# cd /usr/local/src/
[root@mem-node1 src]# ll memcached-1.4.34.tar.gz? ? ? ? ? ? ? ? ? ?
-rw-r--r-- 1 root root 391131 Jun 27 07:41 memcached-1.4.34.tar.gz
[root@mem-node1 src]# tar -zvxf memcached-1.4.34.tar.gz
[root@mem-node1 src]# cd memcached-1.4.34? ? ? ? ? ? ? ?
[root@mem-node1 memcached-1.4.34]# ./configure --prefix=/usr/local/memcached
[root@mem-node1 memcached-1.4.34]# make && make install
啟動(dòng)memcached构回,端口11211可以根據(jù)自己需要修改不同端口
[root@mem-node1 ~]# /usr/local/memcached/bin/memcached -d -m 512 -u root -p 11211 -c 1024 -P /var/lib/memcached.11211pid
查看memcached進(jìn)程是否起來(lái)
[root@mem-node1 ~]# ps -ef|grep memcached
root? ? ? 1340? ?? 1? 0 14:34 ?? ? ? ? 00:00:00 /usr/local/memcached/bin/memcached -d -m 512 -u root -p 11211 -c 1024 -P /var/lib/memcached.11211pid
root? ? ? 1400 16303? 0 14:35 pts/0? ? 00:00:00 grep memcached
[root@mem-node1 ~]# lsof -i:11211
COMMAND? ? PID USER?? FD?? TYPE?? DEVICE SIZE/OFF NODE NAME
memcached 1340 root?? 26u? IPv4 18958545? ? ? 0t0? TCP *:memcache (LISTEN)
memcached 1340 root?? 27u? IPv6 18958546? ? ? 0t0? TCP *:memcache (LISTEN)
memcached 1340 root?? 28u? IPv4 18958549? ? ? 0t0? UDP *:memcache
memcached 1340 root?? 29u? IPv4 18958549? ? ? 0t0? UDP *:memcache
memcached 1340 root?? 30u? IPv4 18958549? ? ? 0t0? UDP *:memcache
memcached 1340 root?? 31u? IPv4 18958549? ? ? 0t0? UDP *:memcache
memcached 1340 root?? 32u? IPv6 18958550? ? ? 0t0? UDP *:memcache
memcached 1340 root?? 33u? IPv6 18958550? ? ? 0t0? UDP *:memcache
memcached 1340 root?? 34u? IPv6 18958550? ? ? 0t0? UDP *:memcache
memcached 1340 root?? 35u? IPv6 18958550? ? ? 0t0? UDP *:memcache
測(cè)試一下memcached連接夏块,如下說(shuō)明成功(輸入quit退出)
[root@mem-node1 ~]# telnet 192.168.10.203 11211
Trying 192.168.10.203...
Connected to 192.168.10.203.
Escape character is '^]'.
[root@Tomcat-node1 ~]# cd /usr/local/src/MSM_Software
[root@Tomcat-node1 MSM_Software]# ll
total 1212
-rw-rw-r--. 1 root root? 53259 Aug 27 09:53 asm-5.2.jar
-rw-rw-r--. 1 root root 323740 Aug 27 09:51 kryo-4.0.0.jar
-rw-rw-r--. 1 root root? 85217 Aug 27 09:51 kryo-serializers-0.38.jar
-rw-rw-r--. 1 root root 152401 Aug 27 09:49 memcached-session-manager-1.9.7.jar
-rw-rw-r--. 1 root root? 10788 Aug 27 09:49 memcached-session-manager-tc8-1.9.7.jar
-rw-rw-r--. 1 root root?? 5711 Aug 27 09:52 minlog-1.3.0.jar
-rw-rw-r--. 1 root root? 37160 Aug 27 09:51 msm-kryo-serializer-1.9.7.jar
-rw-rw-r--. 1 root root? 51287 Aug 27 09:53 objenesis-2.4.jar
-rw-rw-r--. 1 root root? 20883 Aug 27 09:52 reflectasm-1.11.3.jar
-rw-rw-r--. 1 root root 472838 Aug 27 09:50 spymemcached-2.12.2.jar
特別注意:
memcached-session-manager-tc8-1.9.7.jar中的tc8為tomcat的版本號(hào)疏咐。
一定要注意:不同版本號(hào)的tomcat,對(duì)應(yīng)的msm包也不同脐供。此處為tomcat8的jar包凳鬓。
需要把上面這些MSM依賴的jar包下載后全部上傳到兩臺(tái)機(jī)器的tomcat安裝路徑的lib/ 目錄下
[root@Tomcat-node1 MSM_Software]# \cp -rf /usr/local/src/MSM_Software/* /usr/local/tomcat8/lib/
接下來(lái)進(jìn)行序列化tomcat配置,序列化tomcat配置的方法有很多種:
java默認(rèn)序列化tomcat配置患民、javolution序列化tomcat配置、xstream序列化tomcat配置垦梆、flexjson序列化tomcat配置和kryo序列化tomcat配置匹颤。
官網(wǎng)介紹說(shuō) 使用kryo序列化tomcat的效率最高,所以這里只介紹kryo序列化托猩。
在No-Stick模式和Stick模式下context.xml文件配置也有所不同(一般用的是No-Stick模式)
只需要修改conf/context.xml文件:
[root@Tomcat-node1 ~]# cd /usr/local/tomcat8/conf/
[root@Tomcat-node1 conf]# cp context.xml context.xml.bak
a)No-Stick模式
記子”汀:多個(gè)tomcat實(shí)例時(shí) 需要選擇Non-Sticky模式,即sticky="false"
[root@Tomcat-node1 conf]# vim context.xml? ? ? ? ? ? ? ? ? ? ?? #在<Context>和</Context>之間添加下面內(nèi)容.就在底部</Context>之前添加就行
.......
? ? <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
? ? ? ?? memcachedNodes="n1:192.168.10.203:11211,n2:192.168.10.205:11211"
? ? ? ?? lockingMode="auto"
? ? ? ?? sticky="false"
? ? ? ?? sessionBackupAsync="false"
? ? ? ?? sessionBackupTimeout= "1000"?
? ? ? ?? copyCollectionsForSerialization="true"
? ? ? ?? requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
? ? ? ?? transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
? ? />
第一臺(tái)tomcat節(jié)點(diǎn)的congtext.xml配置好之后京腥,再將該文件拷貝到另一臺(tái)tomcat節(jié)點(diǎn)的相同路徑下
b) Stick模式赦肃。
故障轉(zhuǎn)移配置節(jié)點(diǎn)(failoverNodes),不能使用在Non-Sticky模式公浪,多個(gè)使用空格或逗號(hào)分開他宛,配置某個(gè)節(jié)點(diǎn)為備份節(jié)點(diǎn)。
當(dāng)其他節(jié)點(diǎn)都不可用時(shí)才會(huì)存儲(chǔ)到備份節(jié)點(diǎn)欠气,適用于sticky模式(即一臺(tái)tomcat厅各,多臺(tái)memcached)。
[root@Tomcat-node1 conf]# vim context.xml? ? ? ? ? ? ?
......
? ? <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
? ? ? ? ? ?? memcachedNodes="n1:192.168.10.203:11211,n2:192.168.10.205:11211"? ? ? ? ? ? #多個(gè)memcached之間用空格或逗號(hào)隔開都可以的
? ? ? ? ? ?? sticky="true"
? ? ? ? ? ?? failoverNodes="n2"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ?? requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|swf|flv)$"
? ? ? ? ? ?? transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
? ? ? ? ? ?? copyCollectionsForSerialization="true"
? ? />
第一臺(tái)tomcat節(jié)點(diǎn)的congtext.xml配置好之后预柒,再將該文件拷貝到另一臺(tái)tomcat節(jié)點(diǎn)的相同路徑下队塘,并將failoverNodes后面的參數(shù)改為n1
配置好之后,一定要記得重啟兩臺(tái)機(jī)器的tomcat服務(wù)!
[root@Tomcat-node1 ~]# /usr/local/tomcat8/bin/shutdown.sh? ? ? #或者直接使用kill殺死
[root@Tomcat-node1 ~]# lsof -i:8080
[root@Tomcat-node1 ~]# /usr/local/tomcat8/bin/startup.sh
======================================================================================
Manager 各參數(shù)說(shuō)明:
memcachedNodes? ?? 必選項(xiàng),memcached的節(jié)點(diǎn)信息宜鸯,多個(gè)memcached節(jié)點(diǎn),中間需要使用空格
failoverNodes="n2"? 表示當(dāng)前session保持到n1的memcached節(jié)點(diǎn)上
failoverNodes? ? ? 可選項(xiàng)憔古,不能使用在non-sticky sessions模式。故障轉(zhuǎn)移配置節(jié)點(diǎn)淋袖,多個(gè)使用空格或逗號(hào)分開鸿市,配置某個(gè)節(jié)點(diǎn)為備份節(jié)點(diǎn),
當(dāng)其他節(jié)點(diǎn)都不可用時(shí)才會(huì)存儲(chǔ)到備份節(jié)點(diǎn)适贸,官方建議配置為和tomcat同服務(wù)器的節(jié)點(diǎn)灸芳。
理由如下:
假如有兩臺(tái)服務(wù)器m1,m2,其中m1部署tomcat和memcached節(jié)點(diǎn)n1拜姿,m2部署memcached節(jié)點(diǎn)n2烙样。
如果配置tomcat的failoverNodes值為n2或者不配置,則當(dāng)服務(wù)器m1掛掉后n1和tomcat中保存的session會(huì)丟失蕊肥,而n2中未保存或者只保存了部分session谒获,
這就造成 部分用戶狀態(tài)丟失蛤肌。
如果配置tomcat的failoverNodes值為n1,則當(dāng)m1掛掉后因?yàn)閚2中保存了所有的session批狱,所以重啟tomcat的時(shí)候用戶狀態(tài)不會(huì)丟失裸准。
為什么n2中保存了所有的session? 因?yàn)閒ailoverNodes配置的值是n1,只有當(dāng)n2節(jié)點(diǎn)不可用時(shí)才會(huì)把session存儲(chǔ)到n1赔硫,所以這個(gè)時(shí)候n1中是沒(méi)有保存任何session的炒俱。
lockingMode? 可選值,默認(rèn)none爪膊,只對(duì)non-sticky有效权悟。
requestUriIgnorePattern? 可選值,制定忽略那些請(qǐng)求的session操作推盛,一般制定靜態(tài)資源如css,js一類的峦阁。
sessionBackupAsync? ? 可選值,默認(rèn)true耘成,是否異步的方式存儲(chǔ)到memcached榔昔。
sessionBackupTimeout? 可選項(xiàng),默認(rèn)100毫秒瘪菌,異步存儲(chǔ)session的超時(shí)時(shí)間撒会。
如果memcached session manager的會(huì)話共享配置后,重啟tomcat服務(wù)沒(méi)有報(bào)錯(cuò),但是訪問(wèn)頁(yè)面的時(shí)候報(bào)錯(cuò),頁(yè)面訪問(wèn)失敗,如下在logs/catalina.out日志里發(fā)現(xiàn)的錯(cuò)誤:SEVERE [http-nio-8080-exec-1] org.apache.coyote.http11.AbstractHttp11Processor.process Error processing request java.lang.NoSuchFieldError: attributes
5、haproxy開啟日志功能
修改haproxy配置文件
vi /etc/haproxy/haproxy.cfg 可以看到如下行控嗜,把這個(gè)開啟
log 127.0.0.1 local2
沒(méi)有指定端口茧彤,默認(rèn)為udp 514
修改rsyslog配置文件
vi /etc/rsyslog.conf
#啟用在udp 514端口接收日志消息
$ModLoad imudp
$UDPServerRun 514
#在rules(文本最末)節(jié)中添加如下信息
local2.* /var/log/haproxy.log
#表示將發(fā)往facility local2的消息寫入haproxy.log文件中,"local2.* "前面的local2表示facility,預(yù)定義的疆栏。*表示所有等級(jí)的
重啟rsyslog服務(wù)
#重啟 rsyslog
systemctl restart rsyslog
#重啟haproxy
systemctl restart haproxy
查看/var/log/haproxy.log文件應(yīng)該能看到日志信息
查看日志
tail -f /var/log/haproxy.log
syslog 通過(guò) Facility 的概念來(lái)定義日志消息的來(lái)源曾掂,以便對(duì)日志進(jìn)行分類,F(xiàn)acility 的種類有:
類別? 解釋
kern? ? 內(nèi)核消息
user? ? 用戶信息
mail? ? 郵件系統(tǒng)消息
daemon? 系統(tǒng)服務(wù)消息
auth? ? 認(rèn)證系統(tǒng)
authpriv? ? 權(quán)限系統(tǒng)
syslog? 日志系統(tǒng)自身消息
cron? ? 計(jì)劃安排
news? ? 新聞信息
local0~7? ? 由自定義程序使用
而另外一部分 priority 也稱之為 serverity level壁顶,除了日志的來(lái)源以外珠洗,對(duì)統(tǒng)一源產(chǎn)生日志消息還需要進(jìn)行優(yōu)先級(jí)的劃分,而優(yōu)先級(jí)的類別有一下幾種:
類別? 解釋
emergency?? 系統(tǒng)已經(jīng)無(wú)法使用了
alert?? 必須立即處理的問(wèn)題
critical? ? 很嚴(yán)重了
error?? 錯(cuò)誤
warning 警告信息
notice? 系統(tǒng)正常若专,但是比較重要
informational?? 正常
debug?? debug的調(diào)試信息
panic?? 很嚴(yán)重但是已淘汰不常用
none? ? 沒(méi)有優(yōu)先級(jí)许蓖,不記錄任何日志消息
6、開啟haproxy監(jiān)控頁(yè)面
在/etc/haproxy/haproxy.cfg中進(jìn)行配置:
listen admin_stats
? ? ? ? mode? ? http
? ? ? ? stats?? enable
? ? ? ? bind? ? *:8080? // 監(jiān)聽端口
? ? ? ? stats?? refresh 30s
? ? ? ? stats?? uri /admin // 統(tǒng)計(jì)頁(yè)面訪問(wèn)的url
? ? ? ? stats?? realm haproxy
? ? ? ? stats?? auth root:root // 認(rèn)證用戶與密碼
? ? ? ? stats?? hide-version
保存配置调衰,重啟haproxy服務(wù)