第十九周

1、運(yùn)用haproxy實(shí)現(xiàn)nginx服務(wù)負(fù)載均衡

測試環(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安裝過程略

2.配置nginx方便測試效果

修改nginx安裝目錄下/html/index.html文件的內(nèi)容,方便測試效果


172.16.100.155--index.html


172.16.100.151--index.html

檢查nginx配置文件,并啟動/重啟

3.安裝haproxy

這里采用的是yum安裝haproxy1.5


haproxy-1.5


4.配置haproxy

Yum安裝haproxy在默認(rèn)目錄/etc/haproxy下,配置文件為haproxy.cfg


修改配置文件端口

修改bind ip:端口


修改backend app地址

修改backend app地址

此處僅做測試,所以backend static沒有做過多修改,直接改為本機(jī)地址。


5.測試負(fù)載

訪問172.16.100.156,可以看到結(jié)果


強(qiáng)制刷新后


反復(fù)刷新可以發(fā)現(xiàn)實(shí)現(xiàn)了輪詢效果

6.測試高可用

保持其他設(shè)置不變,關(guān)掉172.16.100.151的nginx,刷新172.16.100.156發(fā)現(xiàn)頁面停留在172.16.100.155



2、搭建haproxy實(shí)現(xiàn)mysql負(fù)載均衡

1.Mysql安裝過程略過

2.配置mysql

配置172.16.100.151的mysql

編輯/etc/my.cnf文件,在mysqld模塊加入以下內(nèi)容:

server-id=1? ? ? ? ? ? ? ? ? ? ? ? ? ? #server的唯一標(biāo)識

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ù)庫

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)制文件對應(yīng)155的二進(jìn)制文件,master_log_pos對應(yīng)155的position

mysql> start slave;? 開啟主從服務(wù)

mysql> show slave status\G; 查看狀態(tài)

主從同步成功。

配置172.16.100.155的mysql

兩者過程大致相同

編輯/etc/my.cnf文件,在mysqld模塊加入以下內(nèi)容:

server-id=2? ? ? ? ? ? ? ? ? ? ? ? ? #server的唯一標(biāo)識,不可重復(fù)

auto_increment_offset=1? ? ? ? ? ? ? ? ? #自增id起始值

auto_increment_increment=2? ? ? ? ? ? ? ? #每次自增數(shù)字,一共有幾臺mysql則為幾,此處一共兩臺mysql,故而設(shè)為2

log-bin = mysql-bin? ? ? ? ? ? ? ? ? ? ? ? ? #打開二進(jìn)制功能,MASTER主服務(wù)器必須打開此項(xiàng)

max_binlog_size=1024M? ? ? ? ? ? ? ? ? ? ? ? ? #binlog單文件最大值

replicate-ignore-db = mysql? ? ? ? ? ? ? ? ? ? #忽略不同步主從的數(shù)據(jù)庫

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)制文件對應(yīng)151的二進(jìn)制文件,master_log_pos對應(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ù)庫權(quán)限都正常的情況下,一般是由于所要連接的主庫position值發(fā)生變化,導(dǎo)致在建立主從時(shí)沒有對應(yīng)上正確的position,一般原因是主庫數(shù)據(jù)庫存在讀寫過程。

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只會返回OK

? ? ? ? retries 2? ? ? ? ? ? ? #兩次連接失敗就認(rèn)為是服務(wù)器不可用,也可以通過后面設(shè)置

? ? ? ? option redispatch? ? ? #當(dāng)serverId對應(yīng)的服務(wù)器掛掉后,強(qiáng)制定向到其他健康的服務(wù)器

? ? ? ? option abortonclose? ? #當(dāng)服務(wù)器負(fù)載很高的時(shí)候,自動結(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? ? ? #=心跳檢測超時(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配置##############

重新啟動haproxy,連接mysql測試即可

3、搭建tomcat服務(wù)器,并通過nginx反向代理訪問

http://www.itdecent.cn/p/a3713dc1fd38

4、搭建Tomcat,并基于memcached實(shí)現(xiàn)會話共享

Memcached是一款免費(fèi)、開源、分布式的內(nèi)存對象緩存系統(tǒng), 用于減少數(shù)據(jù)庫的負(fù)載, 加快web應(yīng)用程序的訪問. Memcached簡單并且強(qiáng)大, 其簡單的設(shè)計(jì)加快了部署, 易于開發(fā), 緩存解決了面臨的大量數(shù)據(jù)時(shí)很多的問題.

[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


啟動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)程是否起來

[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


測試一下memcached連接,如下說明成功(輸入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的版本號。

一定要注意:不同版本號的tomcat,對應(yīng)的msm包也不同。此處為tomcat8的jar包。

需要把上面這些MSM依賴的jar包下載后全部上傳到兩臺機(jī)器的tomcat安裝路徑的lib/ 目錄下

[root@Tomcat-node1 MSM_Software]# \cp -rf /usr/local/src/MSM_Software/* /usr/local/tomcat8/lib/

接下來進(jìn)行序列化tomcat配置,序列化tomcat配置的方法有很多種:

java默認(rèn)序列化tomcat配置、javolution序列化tomcat配置、xstream序列化tomcat配置、flexjson序列化tomcat配置和kryo序列化tomcat配置。

官網(wǎng)介紹說 使用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"

? ? />

第一臺tomcat節(jié)點(diǎn)的congtext.xml配置好之后,再將該文件拷貝到另一臺tomcat節(jié)點(diǎn)的相同路徑下

b) Stick模式。

故障轉(zhuǎn)移配置節(jié)點(diǎn)(failoverNodes),不能使用在Non-Sticky模式,多個(gè)使用空格或逗號分開,配置某個(gè)節(jié)點(diǎn)為備份節(jié)點(diǎn)。

當(dāng)其他節(jié)點(diǎn)都不可用時(shí)才會存儲到備份節(jié)點(diǎn),適用于sticky模式(即一臺tomcat,多臺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之間用空格或逗號隔開都可以的

? ? ? ? ? ? sticky="true"

? ? ? ? ? ? failoverNodes="n2"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|swf|flv)$"

? ? ? ? ? ? transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

? ? ? ? ? ? copyCollectionsForSerialization="true"

? ? />

第一臺tomcat節(jié)點(diǎn)的congtext.xml配置好之后,再將該文件拷貝到另一臺tomcat節(jié)點(diǎn)的相同路徑下,并將failoverNodes后面的參數(shù)改為n1


配置好之后,一定要記得重啟兩臺機(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ù)說明:

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è)使用空格或逗號分開,配置某個(gè)節(jié)點(diǎn)為備份節(jié)點(diǎn),

當(dāng)其他節(jié)點(diǎn)都不可用時(shí)才會存儲到備份節(jié)點(diǎn),官方建議配置為和tomcat同服務(wù)器的節(jié)點(diǎn)。

理由如下:

假如有兩臺服務(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會丟失,而n2中未保存或者只保存了部分session,

這就造成 部分用戶狀態(tài)丟失。

如果配置tomcat的failoverNodes值為n1,則當(dāng)m1掛掉后因?yàn)閚2中保存了所有的session,所以重啟tomcat的時(shí)候用戶狀態(tài)不會丟失。

為什么n2中保存了所有的session? 因?yàn)閒ailoverNodes配置的值是n1,只有當(dāng)n2節(jié)點(diǎn)不可用時(shí)才會把session存儲到n1,所以這個(gè)時(shí)候n1中是沒有保存任何session的。


lockingMode? 可選值,默認(rèn)none,只對non-sticky有效。


requestUriIgnorePattern? 可選值,制定忽略那些請求的session操作,一般制定靜態(tài)資源如css,js一類的。


sessionBackupAsync? ? 可選值,默認(rèn)true,是否異步的方式存儲到memcached。


sessionBackupTimeout? 可選項(xiàng),默認(rèn)100毫秒,異步存儲session的超時(shí)時(shí)間。

如果memcached session manager的會話共享配置后,重啟tomcat服務(wù)沒有報(bào)錯(cuò),但是訪問頁面的時(shí)候報(bào)錯(cuò),頁面訪問失敗,如下在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

沒有指定端口,默認(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ù)定義的。*表示所有等級的

重啟rsyslog服務(wù)

#重啟 rsyslog

systemctl restart rsyslog

#重啟haproxy

systemctl restart haproxy

查看/var/log/haproxy.log文件應(yīng)該能看到日志信息

查看日志

tail -f /var/log/haproxy.log

syslog 通過 Facility 的概念來定義日志消息的來源,以便對日志進(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,除了日志的來源以外,對統(tǒng)一源產(chǎn)生日志消息還需要進(jìn)行優(yōu)先級的劃分,而優(yōu)先級的類別有一下幾種:

類別? 解釋

emergency? 系統(tǒng)已經(jīng)無法使用了

alert? 必須立即處理的問題

critical? ? 很嚴(yán)重了

error? 錯(cuò)誤

warning 警告信息

notice? 系統(tǒng)正常,但是比較重要

informational? 正常

debug? debug的調(diào)試信息

panic? 很嚴(yán)重但是已淘汰不常用

none? ? 沒有優(yōu)先級,不記錄任何日志消息

6、開啟haproxy監(jiān)控頁面

在/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ì)頁面訪問的url

? ? ? ? stats? realm haproxy

? ? ? ? stats? auth root:root // 認(rèn)證用戶與密碼

? ? ? ? stats? hide-version

保存配置,重啟haproxy服務(wù)

頁面訪問172.16.100.156:8080/admin

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Docker環(huán)境下的前后端分離部署與運(yùn)維》課程腳本 [TOC] 一、Docker虛擬機(jī)常用命令 先更新軟件包yu...
    mingminy閱讀 654評論 0 0
  • 一、MemCache簡介 session MemCache是一個(gè)自由、源碼開放、高性能、分布式的分布式內(nèi)存對象緩存...
    李偉銘MIng閱讀 4,013評論 2 13
  • 點(diǎn)擊這里查看《我不勇敢》完整故事第一章 生活在城市的繁華面孔中 (一)“老孟,找到房子沒啊你?”王曉菜問孟小北?!?..
    孟小北閱讀 658評論 0 1
  • 踏上了去沈陽的火車,唐糖心里開始對她即將生活的大學(xué)充滿了憧憬,可下了校車以后唐糖內(nèi)心幾乎是崩潰的…… ...
    請叫我女王大人0713閱讀 497評論 1 3
  • 張老伯已90歲的高齡了,突發(fā)腦溢血住進(jìn)了神經(jīng)內(nèi)科病房,經(jīng)醫(yī)護(hù)人員的奮力搶救,老人的命保住了,可老人時(shí)而清醒時(shí)而迷糊...
    風(fēng)中白馬閱讀 687評論 3 2

友情鏈接更多精彩內(nèi)容