在《冰河,能講講Mycat如何實現MySQL的讀寫分離嗎?》一文中,咱們實現了使用Mycat實現MySQL的讀寫分離。然而,此時的Mycat只有一個節點,若是Mycat節點宕機了,則整個MySQL集羣將不可用,因此,咱們有必要保證Mycat節點的高可用。那如何保證Mycat節點的高可用呢?今天,咱們就一塊兒來聊聊這個話題。一塊兒搭建一套Mycat的高可用集羣。html
目前,我也在業餘時間開發和維護Mycat源碼,小夥伴們在學習和使用Mycat時,遇到問題也能夠加我微信【sun_shine_lyz】共同交流哦!前端
注:文章已經收錄到:node
GitHub:https://github.com/sunshinelyz/technology-binghemysql
圖解說明:c++
HAProxy負責將請求分發到Mycat上,起到負載均衡的做用,同時HAProxy也能檢測到Mycat是否存活,HAProxy只會將請求轉發到存活的Mycat上。若是一臺Mycat服務器宕機,HAPorxy轉發請求時不會轉發到宕機的Mycat上,因此Mycat依然可用。git
Mycat主機2(liuyazhuang134,192.168.209.134)請參考《冰河,能講講Mycat如何實現MySQL的讀寫分離嗎?》程序員
注意:liuyazhuang133(192.168.209.133)和 liuyazhuang134(192.168.209.134) 中都要加上(或更新)主機名映射配置。github
# vi /etc/hosts 192.168.209.131 liuyazhuang131 192.168.209.132 liuyazhuang132 192.168.209.133 liuyazhuang133 192.168.209.134 liuyazhuang134 192.168.209.135 liuyazhuang135
注意:須要在Mycat節點主機上配置。面試
Mycat服務主機(liuyazhuang13三、liuyazhuang134)上須要增長Mycat服務的狀態檢測腳本,並開放相應的檢測端口,以提供給HAProxy對Mycat的服務狀態進行檢測判斷。可使用xinetd來實現,經過xinetd,HAProxy能夠用httpchk來檢測Mycat的存活狀態。(xinetd即extended internet daemon,xinetd是新一代的網絡守護進程服務程序,又叫超級Internet服務器。常常用來管理多種輕量級Internet服務。xinetd提供相似於inetd+tcp_wrapper的功能,可是更增強大和安全。xinetd爲linux系統的基礎服務)
(1)安裝xinetd
若是xinetd尚未安裝,可以使用以下命令安裝:
yum install xinetd
(2)添加 includedir /etc/xinetd.d
檢查/etc/xinetd.conf的末尾是否有 includedir /etc/xinetd.d ,沒有就加上
vim /etc/xinetd.conf
(3)建立/etc/xinetd.d 目錄
檢查 /etc/xinetd.d 目錄是否存在,不存在則建立
mkdir /etc/xinetd.d/
(4)增長Mycat存活狀態檢測服務配置
touch /etc/xinetd.d/mycat_status vi /etc/xinetd.d/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 ## 須要啓動的服務腳本 log_on_failure += USERID ## 登陸失敗記錄的內容 disable = no ## 要啓動服務,將此參數設置爲no }
(5)添加 /usr/local/bin/Mycat_status 服務腳本
touch /usr/local/bin/mycat_status vim /usr/local/bin/mycat_status
增長如下內容:
#!/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=`/usr/local/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
(6)給新增腳本賦予可執行權限
chmod a+x /usr/local/bin/mycat_status
(7)在 /etc/services 中加入 mycat_status 服務
vi /etc/services
在末尾加入:
mycat_status 48700/tcp # mycat_status
保存後,重啓xinetd服務
service xinetd restart
(8)驗證mycat_status服務是否成功啓動
netstat -antup|grep 48700
能看到上圖這樣的信息,說明服務配置成功。
(9)Mycat服務主機的防火牆上打開 48700端口
vi /etc/sysconfig/iptables
增長:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 48700 -j ACCEPT
保存後重啓防火牆
service iptables restart
腳本測試:
/usr/local/bin/mycat_status
HAProxy官網:http://www.haproxy.org/
HAProxy各版本的官方文檔:http://cbonte.github.io/haproxy-dconv/index.html
HAProxy 是一款提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理軟件,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。
HAProxy目前主要有三個版本:1.四、1.五、1.六、1.7,CentOS6.6自帶的RPM包爲1.5的。
HAProxy1.5版開始,支持SSL、DDoS防禦等功能,可看官網說明:
version 1.5 : the most featureful version, supports SSL, IPv6, keep-alive, DDoS protection, etc...
Mycat官方推薦使用HAProxy作MyCat的高可用負載均衡代理。
在192.168.209.135服務器上進行安裝。
(1)下載(或上傳) haproxy-1.5.19.tar.gz 到 /usr/local/src,解壓安裝
cd /usr/local/src/ wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.19.tar.gz tar -zxvf haproxy-1.5.19.tar.gz cd haproxy-1.5.19
(2)如需瞭解安裝注意點,可查看HAProxy的軟件說明
less README
(3)安裝編譯所需的依賴包
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
(4)編譯
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 這三個包須要安裝否則不支持
(5)建立安裝目錄 /usr/local/haproxy
mkdir /usr/local/haproxy
(6)執行安裝
make install PREFIX=/usr/local/haproxy install -d "/usr/local/haproxy/sbin" install haproxy "/usr/local/haproxy/sbin" install -d "/usr/local/haproxy/share/man"/man1 install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1 install -d "/usr/local/haproxy/doc/haproxy" for x in configuration architecture haproxy-en haproxy-fr; do \ install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ; \ done
(7)建立配置文件目錄
mkdir -p /usr/local/haproxy/conf mkdir -p /etc/haproxy/
(8)從配置文件模版複製配置文件,並添加配置文件軟鏈接
cp /usr/local/src/haproxy-1.5.19/examples/haproxy.cfg /usr/local/haproxy/conf/ ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
(9)拷貝錯誤頁面,並添加目錄軟鏈接(HTTP模式選配)
cp -r /usr/local/src/haproxy-1.5.19/examples/errorfiles /usr/local/haproxy/ ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
(10)拷貝開機啓動文件,並賦予可執行權限
cp /usr/local/src/haproxy-1.5.19/examples/haproxy.init /etc/rc.d/init.d/haproxy chmod +x /etc/rc.d/init.d/haproxy
(11)添加haproxy命令腳本軟鏈接
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
(12)設置HAProxy開機啓動
chkconfig --add haproxy chkconfig haproxy on
這裏,咱們使用HAProxy來搭建Mycat負載均衡集羣。HAProxy支持TCP(第四層)和HTTP(第七層)應用的代理,本節課程咱們使用HAProxy來作MyCat的負載均衡代理使用的是TCP模式。在4層模式下HAProxy僅在客戶端和服務器之間轉發雙向流量。HAProxy配置簡單,擁有很是不錯的服務器健康檢查功能,當其代理的後端服務器出現故障,HAProxy會自動將該服務器摘除,故障恢復後會自動將該服務器加入進來。
(1)修改haproxy.cfg 配置文件
具體參數說明可參考官方配置文檔 /usr/local/haproxy/doc/haproxy/configuration.txt或GitHub鏈接:http://cbonte.github.io/haproxy-dconv/configuration-1.5.html
vi /usr/local/haproxy/conf/haproxy.cfg
編輯後的文件內容以下所示。
## 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 liuyazhuang135 ## 定義當前節點的名稱,用於HA場景中多haproxy進程共享同一個IP地址時 description liuyazhuang135 ## 當前實例的描述信息 ## 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 ##統計頁面 stats auth admin:admin ## 設置統計頁面認證的用戶和密碼,若是要設置多個,另起一行寫入便可 mode http option httplog ## 啓用日誌記錄HTTP請求 ## listen: 用於定義經過關聯「前端」和「後端」一個完整的代理,一般只對TCP流量有用 listen mycat_servers bind :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.209.133:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10 server mycat_02 192.168.209.134:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10 ## 格式: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:指定此服務器接受的最大併發鏈接數,若是發往此服務器的鏈接數目高於此處指定的值, #####其將被放置於請求隊列,以等待其餘鏈接被釋放
注意:多節點部署時node 、 description的值要作相應調整。
(2)根據以上HAProxy配置文件要求作如下配置
groupadd haproxy useradd -g haproxy haproxy
mkdir /usr/share/haproxy
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 ## 沒安裝的狀況下執行安裝 vi /etc/rsyslog.conf
把 $ModLoad imudp 和 $UDPServerRun 514前面的 # 去掉
$ModLoad imudp ## 是模塊名,支持UDP協議
$UDPServerRun 514
確認 #### GLOBAL DIRECTIVES #### 段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf沒有則增長上此配置,增長後的效果:
cd /etc/rsyslog.d/ ## rsyslog服務會來此目錄加載配置 touch haproxy.conf ## 建立haproxy的日誌配置文件 vi /etc/rsyslog.d/haproxy.conf
增長如下內容:
local0.* /var/log/haproxy.log &~
service rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ]
等到HAProxy服務啓動後,就能在/var/log/haproxy.log中看到日誌了
(4)配置系統內核的IP包轉發功能
vi /etc/sysctl.conf net.ipv4.ip_forward = 1
使配置生效
sysctl -p
(5)啓動HAProxy
service haproxy start ps -ef | grep haproxy haproxy 23921 1 0 23:27 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid root 23924 23179 0 23:27 pts/1 00:00:00 grep haproxy
(6)使用MySQL客戶端經過HAProxy鏈接Mycat
mysql -ulyz -plyz.123 -h192.168.209.135 -P3307 mysql> show databases; mysql> lyz_schema1; mysql> show tables; mysql> select * from lyz_user;
寫數據測試
insert into lyz_user (userName, pwd) values ('lyz6'666666');
查詢後的結果以下:
(7)登陸HAProxy的狀態信息統計頁面
http://192.168.209.135:48800/admin-status
用戶名和密碼都是admin,對應的haproxy.cfg配置片斷
## HAProxy的狀態信息統計頁面 listen admin_stats bind :48800 ## 綁定端口 stats uri /admin-status ##統計頁面 stats auth admin:admin ## 設置統計頁面認證的用戶和密碼,若是要設置多個,另起一行寫入便可 mode http option httplog ## 啓用日誌記錄HTTP請求
統計頁面以下圖所示:
好了,今天就到這兒吧,我是冰河,咱們下期見~~
微信搜一搜【冰河技術】微信公衆號,關注這個有深度的程序員,天天閱讀超硬核技術乾貨,公衆號內回覆【PDF】有我準備的一線大廠面試資料和我原創的超硬核PDF技術文檔,以及我爲你們精心準備的多套簡歷模板(不斷更新中),但願你們都能找到心儀的工做,學習是一條時而鬱鬱寡歡,時而開懷大笑的路,加油。若是你經過努力成功進入到了心儀的公司,必定不要懈怠放鬆,職場成長和新技術學習同樣,不進則退。若是有幸咱們江湖再見!
另外,我開源的各個PDF,後續我都會持續更新和維護,感謝你們長期以來對冰河的支持!!