數據庫性能優化方案(2)--keepalived、haproxy、mycat的高可用

本文的前提是Mycat已經安裝並配置完畢,Mycat已實現對MySQL的讀寫分離、主從切換,其對應服務器IP分佈為172.19.166.238和172.19.166.239。在此基礎上,本文繼續講解Keepalived+Haproxy+Mycat的高可用方案,利用Haproxy實現Mycat集群負載均衡,Keepalived保證Haproxy高可用。

數據庫性能優化方案(2)--keepalived、haproxy、mycat的高可用

Haproxy作為專門的負載均衡軟件,可以工作在四層和七層,相比Nginx而言,HAProxy負載均衡策略更多,負載均衡速度更出色。

所謂的四到七層負載均衡,就是在對後臺的服務器進行負載均衡時,依據四層的信息或七層的信息來決定怎麼樣轉發流量。四層負載均衡主要是通過分析IP層及TCP/UDP層的流量實現的基於IP+端口的負載均衡。七層負載均衡位於OSI的最高層,主要考慮應用層的特徵,可根據七層的URL、瀏覽器類別等來決定怎麼進行負載均衡。

1、Haproxy安裝配置

1.1、解壓安裝haproxy

解壓haproxy-1.8.12.tar.gz

# cd /mnt/benz4s
# tar -zxvf haproxy-1.8.12.tar.gz

編譯安裝,安裝目錄安裝在/usr/local/haproxy下

# cd haproxy-1.8.12
# make TARGET=linux26 PREFIX=/usr/local/haproxy ARCH=x86_64
# make install PREFIX=/usr/local/haproxy

參數說明

TARGET=linux26 #內核版本,使用uname -r查看內核,linux2.6以上的版本,TARGET=linux26;

ARCH=x86_64 #系統位數;

PREFIX=/usr/local/haprpxy #/usr/local/haprpxy為haprpxy安裝路徑;

1.2、配置haproxy

創建配置文件(更詳細配置文件參數附錄部分)

# vim /usr/local/haproxy/haproxy.cfg
......
listen allmycat_service
bind 0.0.0.0:8096 #設置監聽端口,即haproxy提供的web服務端口,和lvs的vip類似
log global #應用全局的日誌設置
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\\r\\nHost:\\ www #通過http檢測的方式進行服務的檢測
balance roundrobin
server mycat_238 172.19.166.238:8066 check port 47700 inter 5s rise 2 fall 3
server mycat_239 172.19.166.239:8066 check port 47700 inter 5s rise 2 fall 3
timeout server 20000

listen allmycat_admin
bind 0.0.0.0:8097 #轉發到mycat的9066端口,即mycat的管理控制檯端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\\r\\nHost:\\ www #通過http檢測的方式進行服務的檢測
balance roundrobin
server mycat_238 172.19.166.238:9066 check port 47700 inter 5s rise 2 fall 3
server mycat_239 172.19.166.239:9066 check port 47700 inter 5s rise 2 fall 3
timeout server 20000
......

1.3、配置haproxy日誌輸出

Haproxy採用rsyslog的方式進行日誌配置,通過rpm -qa|grep rsyslog 命令判斷有沒有安裝,如果沒有安裝通過yum自行安裝即可。

找到rsyslog的配置文件

# find / -name 'rsyslog.conf'
/usr/lib/dracut/modules.d/98syslog/rsyslog.conf
/etc/rsyslog.conf
# vim /etc/rsyslog.conf

將下面兩行註釋放開
#$ModLoad imudp
#$UDPServerRun 514
找到Save boot messages also to boot.log並在這一行下面加入
local2.* /var/log/haproxy.log
重啟rsyslog
# service rsyslog restart

1.4、啟動關閉haproxy

啟動haproxy

# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

關閉haproxy

# pkill haproxy 或 killall haproxy

2、xinetd安裝配置

通過xinetd提供的http服務mycatstatus來讓Haproxy進行Mycat服務檢測,即檢測Mycat存活狀態。Haproxy通過調用該http服務獲取Mycat運行狀態。

2.1、安裝xinetd

在Mycat服務器上安裝xinetd,安裝命令yum install xinetd*

2.2、服務配置

從xinetd的配置文件/etc/xinetd.conf 找到 includedir /etc/xinetd.d,進入該目錄cd /etc/xinetd.d創建服務腳本。

# cd /etc/xinetd.d
# vim mycatstatus
service mycatstatus
{
flags = REUSE
socket_type = stream # socket連接方式
port = 47700 # 服務監聽的端口
wait = no # 是否併發
user = root # 以什麼用戶進行啟動
server =/usr/local/bin/mycatstatus # 被託管服務的啟動腳本
log_on_failure += USERID # 設置失敗時,UID添加到系統登記表
log_type = FILE /var/log/telnet.log #自定義日誌文件路徑
disable = no #是否禁用託管服務,no表示開啟託管服務
}

xinetd服務mycat_status的監聽端口為47700,執行腳本為/usr/local/bin/mycatstatus,當xinetd啟動時,默認對外提供了一個mycatstatus服務。

2.3、創建託管服務啟動腳本

# cd /usr/local/bin
# vim /usr/local/bin/mycatstatus
#!/bin/bash
mycat=`/mnt/benz4s/mycat/bin/mycat status |grep 'not running'| wc -l`
if [ "$mycat" = "0" ];
then
/bin/echo -e "HTTP/1.1 200 OK\\r\\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\\r\\n"
fi
# chmod +x /usr/local/bin/mycatstatus #賦予執行權限
# sh /usr/local/bin/mycatstatus #驗證腳本的正確性

該腳本檢測Mycat服務是否存活,當Mycat正在運行時,向前端返回HTTP/1.1 200 OK,表明Mycat運行正常,否則返回HTTP/1.1 503 Service Unavailable,Mycat服務異常。

2.4、添加mycatstatus服務

# vim /etc/services
mycatstatus 47700/tcp # mycatstatus
# service xinetd restart #重啟xinetd服務

3、Keepalived+Haproxy的高可用方案

如何保證Haproxy提供穩定服務,不出現單點故障情況,這裡採用Keepalived+Haproxy的高可用方案。Keepalived基於VRRP協議實現,VRRP(Virtual Router Redundancy Protocol)即虛擬路由冗餘協議,VRRP通過將一組路由器組成一個虛擬路由器(生成一個虛擬IP即VIP),這組路由器稱之為備份組,一般會從備份組中選舉一個節點作為master路由器,其餘為backup路由器。VRRP的工作過程如下:

(1)備份組在啟用時會選舉優先級高的路由節點作為主路由,優先級低的作為備用路由;

(2)主路由會發送VRRP通告報文給備用節點,報告自己是活著的,備份路由器會開啟定時器接收通告報文。VRRP發送通告報文一般是通過組播模式進行;

(3)關於主備節點的切換有兩種模式:搶佔模式下,主備通過比對權重確定路由組內的主備角色;非搶佔模式,指定你是什麼就是什麼,即便備用節點的權重比主節點高。

數據庫性能優化方案(2)--keepalived、haproxy、mycat的高可用

3.1、Keepalived安裝配置

# yum install keepalived
# find / -name 'keepalived.conf'
/etc/keepalived/keepalived.conf
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_instance VI_1 {
\tstate MASTER #172.19.166.239上改為 BACKUP
\tinterface ens0 #對外提供服務的網絡接口,ifconfig
\tvirtual_router_id 100 #VRRP 組名,兩個節點的設置必須一樣,以指明各個節點屬於同一 VRRP 組
\tpriority 150 #數值愈大,優先級越高,172.19.166.239上改為比150小的正整數
\tadvert_int 1 #同步通知間隔
\tauthentication { #包含驗證類型和驗證密碼。類型主要有 PASS、AH 兩種,通常使用的類型為 PASS,據說AH 使用時有問題
\t\tauth_type PASS
\t\tauth_pass 1111
\t}
\tvirtual_ipaddress { #vip 地址 ens0 通過ifconfig獲取
\t\t172.19.166.100 dev ens0 scope global
\t}
}
啟動keepalived
# service keepalived start

3.2、crontab定時任務

通過上面的配置,我們可以將前端請求172.19.166.100轉到優先級高的物理機172.19.166.238。但此時還沒有監聽haproxy的服務實現VIP虛擬IP漂移,即監聽haproxy服務來進行vip的降級。本文將採用一種定時任務(linux自帶的crontab)的方式來實現VIP降級操作。

(1)創建checkhaproxy.sh 並編輯內容

# vim /usr/local/bin/checkhaproxy.sh
#!/bin/bash
LOGFILE='/root/log/checkHaproxy.log'
date >> $LOGFILE
count=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l`
if [ $count = 0 ];
then
\t\techo 'first check fail , restart haproxy !' >> $LOGFILE
\t\t/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
else
\t\texit 0
fi

sleep 3

count=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l`
if [ $count = 0 ];
then
\t\techo 'second check fail , stop keepalive service !' >> $LOGFILE
\t\tservice keepalived stop
else
\t\techo 'second check success , start keepalive service !' >> $LOGFILE
\t\tkeepalived=` ps aux | grep -v grep | grep /usr/sbin/keepalived | wc -l`
\t\tif [ $count = 0 ];
\t\tthen
\t\t\tservice keepalived start
\t\tfi
\t\texit 0
fi

(2)執行 crontab -e 編輯定時任務 每一分鐘檢測haproxy服務存活,如果服務啟動不了,停掉keepalived服務,VIP即轉發至backup節點(172.19.166.239)的機器

* * * * * sh /usr/local/bin/checkhaproxy.sh

附件

1、Haproxy配置文件(/usr/local/haproxy/haproxy.cfg)

global
log 127.0.0.1 local0 info #[err warning info debug]定義haproxy 日誌級別

pidfile /var/run/haproxy.pid #haproxy的進程PID文件
maxconn 4000
daemon #後臺方式運行
defaults
log global #應用全局的日誌設置
mode tcp #默認的模式mode{tcp|http|health }
option dontlognull #不記錄健康檢查日誌信息
retries 3 #兩次連接失敗就認為是服務器不可用,也可以通過後面設置
option redispatch #當serverId對應的服務器掛掉後,強制定向到其他健康的服務器
maxconn 2000 #默認的最大連接數
timeout connect 5000ms #連接超時
timeout client 30000ms #客戶端超時
timeout server 30000ms #服務器超時

#haproxy帶有監控功能,而且配置簡單,直接在主配置文件中加入一下配置即可
listen admin_status
bind 0.0.0.0:1080
stats uri /admin #haproxy自帶的管理頁面通過http://ip:port/admin訪問
stats auth admin:admin #管理頁面的用戶名和密碼
stats hide-version #隱藏監控頁面的HAproxy版本信息
mode http
option httplog

listen allmycat_service
bind 0.0.0.0:8096 #設置監聽端口,即haproxy提供的web服務端口,和lvs的vip類似
log global #應用全局的日誌設置
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\\r\\nHost:\\ www #通過http檢測的方式進行服務的檢測

balance roundrobin
server mycat_238 172.19.166.238:8066 check port 47700 inter 5s rise 2 fall 3
server mycat_239 172.19.166.239:8066 check port 47700 inter 5s rise 2 fall 3
timeout server 20000

listen allmycat_admin
bind 0.0.0.0:8097 #轉發到mycat的9066端口,即mycat的管理控制檯端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\\r\\nHost:\\ www #通過http檢測的方式進行服務的檢測
balance roundrobin
#定義後端server[ms1.srv1],請求定向到該server時會在響應中寫入cookie值[ms1.srv1]
#針對此server的maxconn設置為300
#應用默認健康檢查策略,健康檢查間隔和超時時間為2000ms,兩次成功視為節點UP,三次失敗視為節點DOWN,這裡haproxy的check借用了超級守護進程xinetd,下節有較詳細的說明。
server mycat_238 172.19.166.238:9066 check port 47700 inter 5s rise 2 fall 3
server mycat_239 172.19.166.239:9066 check port 47700 inter 5s rise 2 fall 3
timeout server 20000

global配置段,用於設定全局配置參數; defaults配置段用於為所有其它配置段提供默認參數,這配置默認配置參數可由下一個“defaults”所重新設定


分享到:


相關文章: