海量資料架構下如何保證Mycat的高可用?

冰河團隊發表於2020-12-11

寫在前面

在《冰河,能講講Mycat如何實現MySQL的讀寫分離嗎?》一文中,我們實現了使用Mycat實現MySQL的讀寫分離。然而,此時的Mycat只有一個節點,如果Mycat節點當機了,則整個MySQL叢集將不可用,所以,我們有必要保證Mycat節點的高可用。那如何保證Mycat節點的高可用呢?今天,我們就一起來聊聊這個話題。一起搭建一套Mycat的高可用叢集。

目前,我也在業餘時間開發和維護Mycat原始碼,小夥伴們在學習和使用Mycat時,遇到問題也可以加我微信【sun_shine_lyz】共同交流哦!

注:文章已經收錄到:

GitHub:https://github.com/sunshinelyz/technology-binghe

Gitee:https://gitee.com/binghe001/technology-binghe

軟體版本

  • 作業系統:CentOS-6.8-x86_64
  • JDK版本:jdk1.8
  • HAProxy版本:haproxy-1.5.19.tar.gz
  • Mycat版本:Mycat-server-1.6 (自行下載原始碼編譯)
  • MySQL版本:mysql-5.7

部署規劃

Mycat叢集架構圖

圖解說明:

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

Mycat節點2的部署

Mycat主機2(liuyazhuang134,192.168.209.134)請參考《冰河,能講講Mycat如何實現MySQL的讀寫分離嗎?

注意:liuyazhuang133(192.168.209.133)和 liuyazhuang134(192.168.209.134) 中都要加上(或更新)主機名對映配置。

# 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節點主機上配置。

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

如果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介紹

HAProxy官網:http://www.haproxy.org/
HAProxy各版本的官方文件:http://cbonte.github.io/haproxy-dconv/index.html

HAProxy 是一款提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理軟體,支援虛擬主機,它是免費、快速並且可靠的一種解決方案。

HAProxy目前主要有三個版本:1.4、1.5、1.6、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的高可用負載均衡代理。

HAProxy的安裝

在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

搭建Mycat負載均衡叢集

這裡,我們使用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配置檔案要求做以下配置

  • 新增haproxy使用者組和使用者
groupadd haproxy
useradd -g haproxy haproxy
  • 建立chroot執行的路徑
mkdir /usr/share/haproxy
  • 防火牆中開啟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 ## 沒安裝的情況下執行安裝
vi /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服務會來此目錄載入配置
touch haproxy.conf ## 建立haproxy的日誌配置檔案
vi /etc/rsyslog.d/haproxy.conf

增加以下內容:

local0.* /var/log/haproxy.log

&~

如果不加上面的的"&~"配置則除了在/var/log/haproxy.log中寫入日誌外,也會寫入/var/log/message檔案中配置儲存後重啟rsyslog服務

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,後續我都會持續更新和維護,感謝大家長期以來對冰河的支援!!

相關文章