高可用Mysql架構_Mycat叢集部署(HAProxy + 兩臺Mycat+Mysql雙主雙從)

OldBoy~發表於2018-01-18

既然大家都知道了Mysql分散式在大型網站架構中的作用,在這裡就不再闡述。本片部落格文章是基於我曾經搭建過的一個Mysql叢集基礎上實現的,實現過雙主熱備、讀寫分離、分庫分表。

部落格連結:http://www.cnblogs.com/wt645631686/p/6868766.html

環境

centos6.4版本系統下,192.168.9.169(第一臺mycat)、192.168.9.170(第二臺mycat),這裡的兩臺mycat配置一致,我是為了快速完成搭建直接clone的,192.168.9.172(haproxy伺服器),另外的mysql雙主熱備和雙主雙從架構在基礎部落格連結裡有詳細配置。

HAProxy負責將請求分發到Mycat上,起到負載均衡的作用,同時HAProxy也能檢測到Mycat是否存活,HAProxy只會將請求轉發到存活的Mycat上。如果一臺Mycat伺服器當機,HAPorxy轉發請求時不會轉發到當機的Mycat上,所以Mycat依然可用。

在每臺mycat上配置mycat狀態檢查服務

Mycat服務主機(liuyazhuang133、liuyazhuang134)上需要增加Mycat服務的狀態檢測指令碼,並開放相應的檢測埠,以提供給HAProxy對Mycat的服務狀態進行檢測判斷。可以使用xinetd來實現,通過xinetd,HAProxy可以用httpchk來檢測Mycat的存活狀態。(xinetd即extended internet daemon,xinetd是新一代的網路守護程式服務程式,又叫超級Internet伺服器。經常用來管理多種輕量級Internet服務。xinetd提供類似於inetd+tcp_wrapper的功能,但是更加強大和安全。xinetd為linux系統的基礎服務)

1、安裝xinetd

# yum -y install xinetd

2、新增 includedir /etc/xinetd.d

# vi /etc/xinetd.conf
# Generally, banners are not used. This sets up their
global defaults # # banner = # banner_fail = # banner_success = } includedir /etc/xinetd.d //檢查/etc/xinetd.conf的末尾是否有 includedir /etc/xinetd.d ,沒有就加上。目的是去配置目錄下面增加我們的自定義配置檔案,沒有的話必須新增。

3、檢查 /etc/xinetd.d 目錄是否存在,不存在則建立

4、配置自定義Mycat存活狀態檢測服務

# vim /etc/xinetd.d/mycat_status //建立mycat_status檔案,新增如下編輯內容
service mycat_status 
{ 
    flags = REUSE 
    ## 使用該標記的socket_type為stream,需要設定wait為no 
    socket_type = stream ## 封包處理方式,Stream為TCP資料包 
    port = 48700 ## 服務監聽埠 
    wait = no ## 表示不需等待,即服務將以多執行緒的方式執行 
    user = root ## 執行此服務程式的使用者 
    server =/usr/local/bin/Mycat_status ## 需要啟動的服務指令碼 ,也就是        xinetd通過48700埠呼叫這個指令碼監聽mycat狀態 
    log_on_failure += USERID ## 登入失敗記錄的內容 
    disable = no ## 要啟動服務,將此引數設定為no 
}

5、新增 /usr/local/bin/mycat_status服務指令碼(監聽mycat的狀態),並賦予許可權

#!/bin/bash
#/usr/local/bin/mycat_status.sh 
# This script checks if a Mycat server is healthy running on localhost. 
# It will return: 
# "HTTP/1.x 200 OK\r" (if Mycat is running smoothly) 
# "HTTP/1.x 503 Internal Server Error\r" (else) 
#對應mycat的安裝目錄啟動程式
Mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l` 
if [ "$Mycat" = "0" ]; then 
#模擬返回http請求資訊
/bin/echo -e "HTTP/1.1 200 OK\r\n" 
else 
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n" 
fi

6、在 /etc/services 中加入 mycat_status 服務,並驗證監聽服務是否開啟成功

# vim /etc/services    //對應好埠號
mycat_status 48700/tcp # mycat_status

# service xinetd restart  //新增好重啟xinetd
# netstat -antup|grep 48700
tcp        0      0 :::48700                    :::*                        LISTEN      1628/xinetd         

7、Mycat服務主機的防火牆上開啟 48700埠

# vim etc/sysconfig/iptables 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 48700 -j ACCEPT
# service iptables restart //儲存後重啟防火牆

8、測試配置結果

# /usr/local/bin/mycat_status 
HTTP/1.1 200 OK //因為mycat是執行的,這裡返回200

在192.168.9.172伺服器安裝haproxy

HAProxy負責將請求分發到Mycat上,起到負載均衡的作用,同時HAProxy也能檢測到Mycat是否存活,HAProxy只會將請求轉發到存活的Mycat上。如果一臺Mycat伺服器當機,HAPorxy轉發請求時不會轉發到當機的Mycat上,所以Mycat依然可用。

1、下載解壓檔案

連結:https://pan.baidu.com/s/1ySv8FU7cGBeBUFtgOHfUJw 密碼:qiqd    //haproxy百度雲連結
# tar -zxvf haproxy-1.5.16.tar.gz 
# cd haproxy-1.5.16

2、安裝編譯所需的依賴包

# yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

3、編譯

# make TARGET=linux2628 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy //TARGET是指定核心版本,高於2.6.28的建議設定為linux2628,Linux作業系統核心版本檢視命令# uname -r, ARCH指定系統架構,openssl pcre zlib 這三個包需要安裝不然不支援

4、建立安裝目錄,然後執行安裝

# mkdir /usr/local/haproxy 
# make install PREFIX=/usr/local/haproxy/

5、建立配置檔案目錄

# mkdir -p /usr/local/haproxy/conf 
# mkdir -p /etc/haproxy/

6、從配置檔案模版複製配置檔案,並新增配置檔案軟連線

# cp /usr/local/src/haproxy-1.5.16/examples/haproxy.cfg /usr/local/haproy/conf/
# ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg

7、拷貝錯誤頁面,並新增目錄軟連線(HTTP模式選配),以後可能會用到

# cp -r /usr/local/src/haproxy-1.5.16/examples/errorfiles/ /usr/local/haproy/
# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles

8、拷貝開機啟動檔案,並賦予可執行許可權

# cp -r /usr/local/src/haproxy-1.5.16/examples/haproxy.init /etc/rc.d/init.d/haproxy
# chmod a+x /etc/rc.d/init.d/haproxy

9、新增haproxy命令指令碼軟連線

# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin

10、設定HAProxy開機啟動

# chkconfig --add haproxy 
# chkconfig haproxy on

接下來就開始配置mycat叢集實現負載均衡

HAProxy支援TCP(第四層)和HTTP(第七層)應用的代理,本節課程我們使用HAProxy來做MyCat的負載均衡代理使用的是TCP模式。在4層模式下HAProxy僅在客戶端和伺服器之間轉發雙向流量。HAProxy配置簡單,擁有非常不錯的伺服器健康檢查功能,當其代理的後端伺服器出現故障,HAProxy會自動將該伺服器摘除,故障恢復後會自動將該伺服器加入進來。

1、修改haproxy.cfg 配置檔案

為了方便大家測試,我把配置檔案上傳到了百度雲,可以下載直接修改完成之後替換即可~

連結:https://pan.baidu.com/s/1MjNoEioB6BrXqohRIb6Txw 密碼:y9c9  //百度雲地址
# vim /usr/local/haproxy/conf/haproxy.cfg  
###################################################################################################
##
## Haproxy 配置檔案
##
###################################################################################################

## global配置中的引數為程式級別的引數,通常與其執行的作業系統有關
global
    log 127.0.0.1    local0    info ## 定義全域性的syslog伺服器,最多可以定義2個
    ### local0是日誌裝置,對應於/etc/rsyslog.conf中的配置,預設回收info的日誌級別
    #log 127.0.0.1    local1 info
    chroot /usr/share/haproxy    ## 修改HAProxy的工作目錄至指定的目錄並在放棄許可權之前執行
                                ### chroot() 操作,可以提升 haproxy 的安全級別
    group    haproxy    ## 同gid,不過這裡為指定的使用者組名
    user    haproxy    ## 同uid,但這裡使用的為使用者名稱
    daemon    ## 設定haproxy後臺守護程式形式執行
    nbproc    1    ## 指定啟動的haproxy程式個數,
                ### 只能用於守護程式模式的haproxy;預設為止啟動1個程式,
                ### 一般只在單程式僅能開啟少數檔案描述符的場中中才使用多程式模式
    maxconn 4096    ## 設定每個haproxy程式所接受的最大併發連線數,
                    ### 其等同於命令列選項"-n""ulimit-n"自動計算的結果正式參照從引數設定的
    # pidfile    /var/run/haproxy.pid    ## 程式檔案(預設路徑 /var/run/haproxy.pid)
    node    edu-haproxy-01    ## 定義當前節點的名稱,用於HA場景中多haproxy程式共享同一個IP地址時
    description    edu-haproxy-01    ## 當前例項的描述資訊

## defaults:用於為所有其他配置段提供預設引數,這預設配置引數可由下一個"defaults"所重新設定
defaults
    log    global    ## 繼承global中log的定義
    mode    http    ## mode:所處理的模式 (tcp:四層 , http:七層 , health:狀態檢查,只會返回OK) 
    ### tcp: 例項執行於純tcp模式,在客戶端和伺服器端之間將建立一個全雙工的連線,
    #### 且不會對7層報文做任何型別的檢查,此為預設模式
    ### http:例項執行於http模式,客戶端請求在轉發至後端伺服器之前將被深度分析,
    #### 所有不與RFC模式相容的請求都會被拒絕
    ### health:例項執行於health模式,其對入站請求僅響應“OK”資訊並關閉連線,
    #### 且不會記錄任何日誌資訊 ,此模式將用於相應外部元件的監控狀態檢測請求
    option    httplog
    retries    3
    option redispatch    ## serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器
    maxconn    2000    ## 前端的最大併發連線數(預設為2000)
    ### 其不能用於backend區段,對於大型站點來說,可以儘可能提高此值以便讓haproxy管理連線佇列,
    ### 從而避免無法應答使用者請求。當然,此最大值不能超過“global”段中的定義。
    ### 此外,需要留心的是,haproxy會為每個連線維持兩個緩衝,每個快取的大小為8KB,
    ### 再加上其他的資料,每個連線將大約佔用17KB的RAM空間,這意味著經過適當優化後 ,
    ### 有著1GB的可用RAM空間時將維護40000-50000併發連線。
    ### 如果指定了一個過大值,極端場景中,其最終所佔據的空間可能會超過當前主機的可用記憶體,
    ### 這可能會帶來意想不到的結果,因此,將其設定一個可接受值放為明智絕對,其預設為2000
    timeout connect    5000ms    ## 連線超時(預設是毫秒,單位可以設定us,ms,s,m,h,d)
    timeout client    50000ms    ## 客戶端超時
    timeout server    50000ms    ## 伺服器超時

## HAProxy的狀態資訊統計頁面
listen admin_stats 
    bind    :48800  ## 繫結埠
    stats    uri /admin-status    ## 統計頁面URI
    stats    auth admin:admin    ## 設定統計頁面認證的使用者和密碼,如果要設定多個,另起一行寫入即可
    mode    http
    option    httplog    ## 啟用日誌記錄HTTP請求

## listen: 用於定義通過關聯“前端”和“後端”一個完整的代理,通常只對TCP流量有用
listen    mycat_servers
    bind    :3307  ## 繫結埠 ---------------------------------------------------------------------這裡一定要注意,在測試連線的時候,埠指定3307
    mode    tcp
    option    tcplog    ## 記錄TCP請求日誌
    option    tcpka    ## 是否允許向server和client傳送keepalive
    option    httpchk OPTIONS * HTTP/1.1\r\nHost:\ www    ## 後端服務狀態檢測
    ### 向後端伺服器的48700埠(埠值在後端伺服器上通過xinetd配置)傳送 OPTIONS 請求
    ### (原理請參考HTTP協議) ,HAProxy會根據返回內容來判斷後端服務是否可用.
    ### 2xx 和 3xx 的響應碼錶示健康狀態,其他響應碼或無響應表示伺服器故障。
    balance    roundrobin    ## 定義負載均衡演算法,可用於"defaults""listen""backend"中,預設為輪詢方式
    server    mycat_01 192.168.9.169:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10  ------------------------------------------------第一臺mycat
    server    mycat_02 192.168.9.170:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10  ------------------------------------------------第二臺mycat
    ## 格式:server <name> <address>[:[port]] [param*]
    ### serser 在後端宣告一個server,只能用於listen和backend區段。
    ### <name>為此伺服器指定的內部名稱,其將會出現在日誌及警告資訊中
    ### <address>此伺服器的IPv4地址,也支援使用可解析的主機名,但要在啟動時需要解析主機名至響應的IPV4地址
    ### [:[port]]指定將客戶端連線請求發往此伺服器時的目標埠,此為可選項
    ### [param*]為此server設定的一系列引數,均為可選項,引數比較多,下面僅說明幾個常用的引數:
    #### weight:權重,預設為1,最大值為256,0表示不參與負載均衡
    #### backup:設定為備用伺服器,僅在負載均衡場景中的其他server均不可以啟用此server
    #### check:啟動對此server執行監控狀態檢查,其可以藉助於額外的其他引數完成更精細的設定
    #### inter:設定監控狀態檢查的時間間隔,單位為毫秒,預設為2000,
    ##### 也可以使用fastinter和downinter來根據伺服器端專題優化此事件延遲
    #### rise:設定server從離線狀態轉換至正常狀態需要檢查的次數(不設定的情況下,預設值為2)
    #### fall:設定server從正常狀態轉換至離線狀態需要檢查的次數(不設定的情況下,預設值為3)
    #### cookie:為指定server設定cookie值,此處指定的值將會在請求入站時被檢查,
    ##### 第一次為此值挑選的server將會被後續的請求所選中,其目的在於實現持久連線的功能
    #### maxconn:指定此伺服器接受的最大併發連線數,如果發往此伺服器的連線數目高於此處指定的值,
    #####其將被放置於請求佇列,以等待其他連線被釋放

2、根據以上HAProxy配置檔案要求做以下配置
(1)新增haproxy使用者組和使用者

# groupadd haproxy 
# useradd -g haproxy haproxy 

(2)建立chroot執行的路徑

# mkdir /usr/share/haproxy 

(3)防火牆中開啟3306埠和48800埠

# vi /etc/sysconfig/iptables ,並重啟防火牆
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 48800 -j ACCEPT 
# service iptables restart

3、開啟rsyslog的haproxy日誌記錄功能

預設情況下 haproxy是不記錄日誌的,如果需要記錄日誌,還需要配置系統的syslog,在linux系統中是rsyslog服務。syslog伺服器可以用作一個網路中的日誌監控中心,rsyslog是一個開源工具,被廣泛用於Linux系統以通過TCP/UDP協議轉發或接收日誌訊息。安裝配置rsyslog服務:

# yum install rsyslog ## 沒安裝的情況下執行安裝 
# vim /etc/rsyslog.conf

把 $ModLoad imudp 和 $UDPServerRun 514前面的 # 去掉

$ModLoad imudp ## 是模組名,支援UDP協議
$UDPServerRun 514 ##允許514埠接收使用UDP和TCP協議轉發過來的日誌,而rsyslog在預設情況下,正是在514埠監聽UDP

確認 #### GLOBAL DIRECTIVES #### 段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf沒有則增加上此配置,增加後的效果:

 

# cd /etc/rsyslog.d/ ## rsyslog服務會來此目錄載入配置 
# vim haproxy.conf ## 建立haproxy的日誌配置檔案 

增加以下內容

local0.* /var/log/haproxy.log 
&~

注意:如果不加上面的的"&~"配置則除了在/var/log/haproxy.log中寫入日誌外,也會寫入/var/log/message檔案中。

# service rsyslog restart  //配置儲存後重啟rsyslog服務(等到HAProxy服務啟動後,就能在/var/log/haproxy.log中看到日誌了)
Shutting down system logger: [ OK ] 
Starting system logger: [ OK ]

4、配置系統核心的IP包轉發功能,因為用到的TCP4層轉發

# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 
# sysctl -p //使配置生效

5、啟動HAProxy並檢視程式

# service haproxy start                   //啟動命令方式一
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg //啟動命令方式二 # ps
-ef | grep haproxy haproxy 3981 1 0 11:10 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg root 4021 3062 0 11:10 pts/1 00:00:00 grep --color haproxy

6、連線測試

mysql -uroot -p123456 -h192.168.9.172 -P3307  //賬號和密碼是mycat server.xml配置的,-P3307是在haproxy.cfg配置的埠,有說明的

同時運算元據表,發現兩臺Mysq互為主從的伺服器和它們的slave資料都發生了變化.

OK~

驗證叢集是否可用

訪問地址:http://192.168.9.172:48800/admin-status,提示需要輸入使用者名稱密碼,使用者名稱密碼已經在配置檔案中配置

## HAProxy的狀態資訊統計頁面  
listen admin_stats  
bind :48800 ## 繫結埠  
stats uri /admin-status ##統計頁面  
stats auth admin:admin ## 設定統計頁面認證的使用者和密碼,如果要設定多個,另起一行寫入即可  
mode http  
option httplog ## 啟用日誌記錄HTTP請求  

 

這裡雖然進來了,但是發現其中一臺mycat狀態有問題,我試了各種方法,包括關閉出問題的mycat伺服器防火牆,經過一個不經意的測試,使用命令列連線形式進入mycat(mysql)終端,發現是mysql連線許可權問題,然後我再在兩臺互為主從的mysql伺服器上分別給那臺安裝mycat的授權,然後重啟,問題解決了~

分別進入不同的終端執行SQL命令發現兩臺mycat都有了新的session連線。

OK~

 

 

相關文章