寫在前面
隨著網際網路的高速發展,企業中沉澱的資料也越來越多,這就對資料儲存層的擴充套件性要求越來越高。當今網際網路企業中,大部分企業使用的是MySQL來儲存關係型資料。如何實現MySQL資料儲存層的高度可擴充套件性成為了網際網路企業必須要解決的問題。那麼,如何實現真正意義上的MySQL無限擴容呢?今天,冰河就來以實戰的角度為大家講講如何實現MySQL資料庫的無限擴容。
文章已收錄到:https://github.com/sunshinelyz/technology-binghe 和 https://gitee.com/binghe001/technology-binghe,小夥伴們別忘記給個小星星哦~~
概述
本文是在《海量資料架構下如何保證Mycat的高可用?》一文的基礎上進一步擴充套件,從而實現資料儲存層每一個環節的高可用,從而實現MySQL的無限擴容。
要解決的問題
在《海量資料架構下如何保證Mycat的高可用?》一文中,我們的架構圖如下:
由上圖可以看出,HAProxy存在單點隱患,一旦這個HAProxy服務當機,那麼整個服務架構將不可用。那麼,如何解決HAProxy存在的單點隱患問題呢?這就是這篇博文要解決的問題。
軟體版本
- 作業系統:CentOS-6.8-x86_64
- JDK版本:jdk1.8
- HAProxy版本:haproxy-1.5.19.tar.gz
- Mycat版本:Mycat-server-1.6(自行下載原始碼編譯)
- keepalived版本:keepalived-1.2.18.tar.gz
- MySQL版本:mysql-5.7.tar.gz
部署規劃
高可用負載均衡叢集部署架構
上圖中簡化了資料儲存部分的架構細節。例如,其中對於架構中的每一個部分,我們都可以單獨進行擴充套件,獨立成叢集對外提供服務,而不會存在單點故障的問題。
圖解說明:
(1) HAProxy 實現了 Mycat 多節點的叢集高可用和負載均衡, 而 HAProxy 自身的高可用則可以通過Keepalived 來實現。 因此, HAProxy 主機上要同時安裝 HAProxy 和 Keepalived, Keepalived 負責為該伺服器搶佔 vip(虛擬 ip,圖中的 192.168.209.130),搶佔到 vip 後,對該主機的訪問可以通過原來的 ip(192.168.209.135)訪問,也可以直接通過 vip(192.168.209.130)訪問。
(2) Keepalived 搶佔 vip 有優先順序, 在 keepalived.conf 配置中的 priority 屬性決定。但是一般哪臺主機上的 Keepalived服務先啟動就會搶佔到 vip,即使是 slave,只要先啟動也能搶到(要注意避免 Keepalived的資源搶佔問題)。
(3) HAProxy 負責將對 vip 的請求分發到 Mycat 叢集節點上, 起到負載均衡的作用。 同時 HAProxy 也能檢測到 Mycat 是否存活, HAProxy 只會將請求轉發到存活的 Mycat 上。
(4) 如果 Keepalived+HAProxy 高可用叢集中的一臺伺服器當機, 叢集中另外一臺伺服器上的 Keepalived會立刻搶佔 vip 並接管服務, 此時搶佔了 vip 的 HAProxy 節點可以繼續提供服務。
(5) 如果一臺 Mycat 伺服器當機, HAPorxy 轉發請求時不會轉發到當機的 Mycat 上,所以 Mycat 依然可用。
綜上: Mycat 的高可用及負載均衡由 HAProxy 來實現,而 HAProxy 的高可用,由 Keepalived 來實現。
HAProxy 節點 2 的部署
HAProxy 主機 2(liuyazhuang136, 192.168.209.136)的安裝部署請參考博文《海量資料架構下如何保證Mycat的高可用?》,注意配置檔案的調整:多節點部署時 haproxy.cfg 配置檔案中的 node 、 description 配置的值要做相應調整。
HAProxy 主機 2(liuyazhuang136, 192.168.209.136)上的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 liuyazhuang136 ## 定義當前節點的名稱,用於HA場景中多haproxy程式共享同一個IP地址時
description liuyazhuang136 ## 當前例項的描述資訊
## 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:指定此伺服器接受的最大併發連線數,如果發往此伺服器的連線數目高於此處指定的值,
#####其將被放置於請求佇列,以等待其他連線被釋放
HAProxy 節點 1 的狀態資訊頁:http://192.168.209.135:48800/admin-status
HAProxy 節點 2 的狀態資訊頁:http://192.168.209.136:48800/admin-status
Keepalived 介紹
官網: http://www.keepalived.org/
Keepalived 是一種高效能的伺服器高可用或熱備解決方案, Keepalived 可以用來防止伺服器單點故障的發生,通過配合 Haproxy 可以實現 web 前端服務的高可用。Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。 VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議, VRRP 協議將兩臺或多臺路由器裝置虛擬成一個裝置,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER,或者是通過演算法選舉產生。 MASTER 實現針對虛擬路由器 IP 的各種網路功能,如 ARP 請求, ICMP,以及資料的轉發等;其他裝置不擁有該虛擬 IP,狀態是 BACKUP,除了接收 MASTER 的VRRP 狀態通告資訊外,不執行對外的網路功能。當主機失效時, BACKUP 將接管原先 MASTER 的網路功能。VRRP 協議使用多播資料來傳輸 VRRP 資料, VRRP 資料使用特殊的虛擬源 MAC 地址傳送資料而不是自身網路卡的 MAC 地址, VRRP 執行時只有 MASTER 路由器定時傳送 VRRP 通告資訊,表示 MASTER 工作正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 資料,不傳送資料,如果一定時間內沒有接收到 MASTER 的通告資訊,各 BACKUP 將宣告自己成為 MASTER,傳送通告資訊,重新進行 MASTER 選舉狀態。
Keepalived 的安裝
注意:需要在192.168.209.135、 192.168.209.136兩臺伺服器上安裝Keepalived。
Keepalived (http://www.keepalived.org/download.html )
上傳或下載 keepalived
上傳或下載 keepalived(keepalived-1.2.18.tar.gz) 到 /usr/local/src 目錄
解壓安裝
安裝 keepalived 需要用到 openssl
# yum install gcc gcc-c++ openssl openssl-devel
# cd /usr/local/src
# tar -zxvf keepalived-1.2.18.tar.gz
# cd keepalived-1.2.18
# ./configure --prefix=/usr/local/keepalived
# make && make install
將 keepalived 安裝成 Linux 系統服務
因為沒有使用 keepalived 的預設路徑安裝(預設是/usr/local) ,安裝完成之後,需要做一些工作
複製預設配置檔案到預設路徑
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
複製 keepalived 服務指令碼到預設的地址
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
設定 keepalived 服務開機啟動
# chkconfig keepalived on
修改 Keepalived 配置檔案
(1) MASTER 節點配置檔案(192.168.209.135)
! Configuration File for keepalived
global_defs {
## keepalived 自帶的郵件提醒需要開啟 sendmail 服務。建議用獨立的監控或第三方 SMTP
router_id liuyazhuang135 ## 標識本節點的字條串,通常為 hostname
}
## keepalived 會定時執行指令碼並對指令碼執行的結果進行分析,動態調整 vrrp_instance 的優先順序。
## 如果指令碼執行結果為 0,並且 weight 配置的值大於 0,則優先順序相應的增加。
## 如果指令碼執行結果非 0,並且 weight 配置的值小於 0,則優先順序相應的減少。
## 其他情況,維持原本配置的優先順序,即配置檔案中 priority 對應的值。
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態的指令碼路徑
interval 2 ## 檢測時間間隔
weight 2 ## 如果條件成立,權重+2
}
## 定義虛擬路由, VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
state BACKUP ## 預設主裝置(priority 值大的)和備用裝置(priority 值小的)都設定為 BACKUP,
## 由 priority 來控制同時啟動情況下的預設主備,否則先啟動的為主裝置
interface eth3 ## 繫結虛擬 IP 的網路介面,與本機 IP 地址所在的網路介面相同,我的是 eth3
virtual_router_id 35 ## 虛擬路由的 ID 號,兩個節點設定必須一樣,可選 IP 最後一段使用,
## 相同的 VRID 為一個組,他將決定多播的 MAC 地址
priority 120 ## 節點優先順序,值範圍 0-254, MASTER 要比 BACKUP 高
nopreempt ## 主裝置(priority 值大的)配置一定要加上 nopreempt,否則非搶佔也不起作用
advert_int 1 ## 組播資訊傳送間隔,兩個節點設定必須一樣,預設 1s
## 設定驗證資訊,兩個節點必須一致
authentication {
auth_type PASS
auth_pass 1111 ## 真實生產,按需求對應該過來
}
## 將 track_script 塊加入 instance 配置塊
track_script {
chk_haproxy ## 檢查 HAProxy 服務是否存活
}
## 虛擬 IP 池, 兩個節點設定必須一樣
virtual_ipaddress {
192.168.209.130 ## 虛擬 ip,可以定義多個,每行一個
}
}
(2)BACKUP 節點配置檔案(192.168.209.136)
! Configuration File for keepalived
global_defs {
router_id liuyazhuang136
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth3
virtual_router_id 35
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_haproxy
}
virtual_ipaddress {
192.168.209.130
}
}
特別注意: 如果非搶佔模式不生效, 在 Keepalived 的故障節點恢復後會再次導搶佔 vip,從而因 vip 切換而閃斷帶來的風險(視訊解說)。 按以上配置,配置了 Keepalived 非搶佔模式, 配置及注意點如下:
(1) 主裝置、 從裝置中的 state 都設定為 BACKUP
(2) 主裝置、從裝置中都不要配置 mcast_src_ip (本機 IP 地址)
(3) 預設主裝置(priority 值大的 Keepalived 節點) 配置一定要加上 nopreempt,否則非搶佔不起作用
(4) 防火牆配置允許組播(主、備兩臺裝置上都需要配置, keepalived 使用 224.0.0.18 作為 Master 和Backup 健康檢查的通訊 IP)
# iptables -I INPUT -i eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
(eth3 為主機的網路卡裝置名稱,生產環境伺服器可以用獨立網路卡來處理組播和心跳檢測等)
# service iptables save
重啟防火牆:
# service iptables restart
編寫 Haproxy 狀態檢測指令碼
我們編寫的指令碼為/etc/keepalived/haproxy_check.sh (已在 keepalived.conf 中配置)
指令碼要求:如果 haproxy 停止執行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 程式,keepalied將虛擬 ip 繫結到 BACKUP 機器上。
內容如下:
# mkdir -p /usr/local/keepalived/log
# vi /etc/keepalived/haproxy_check.sh
haproxy_check.sh指令碼內容如下:
#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
HAPS=`ps -C haproxy --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
echo $START_HAPROXY >> $LOG_FILE
$START_HAPROXY >> $LOG_FILE 2>&1
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
fi
fi
儲存後,給指令碼賦執行許可權:
# chmod +x /etc/keepalived/haproxy_check.sh
啟動 Keepalived
# service keepalived start
Starting keepalived: [ OK ]
Keepalived 服務管理命令:
停止: service keepalived stop
啟動: service keepalived start
重啟: service keepalived restart
檢視狀態: service keepalived status
高可用測試
(1)關閉 192.168.209.135 中的 Haproxy, Keepalived 會將它重新啟動
# service haproxy stop
(2)關閉 192.168.209.135 中的 Keepalived, VIP(192.168.209.130) 會被 192.168.209.136 搶佔
# service keepalived stop
由上圖可知:Keepalived 停止後, 192.168.209.135 節點的網路介面中的 VIP(192.168.209.130) 將消失
此時,由上圖可知:在192.168.209.136節點的網路介面中會出現 VIP(192.168.209.130)。
檢視此時 VIP 對應的 MAC, Windows 下使用 CMD 命令檢視:
說明此時 VIP 已經漂移到物理主機 192.168.209.136上了
再通過 VIP(192.168.209.130) 來訪問 Haproxy 叢集, 訪問到的也是 192.168.209.136
(3)重新啟動 192.168.209.135 中的 Keepalived
重新啟動 192.168.209.135 中的 Keepalived, vip(192.168.209.130)保留在 192.168.209.136 主機上, 不會出現 135 啟動搶佔 vip 的情況。
# service keepalived start
(4)模擬搶佔了 vip 的節點(192.168.209.136) 中的 HAProxy 故障或啟動失敗
方式:把 192 節點中的 haproxy.cfg 檔案重新命名為 haproxy.cfg_bak, 並把 haproxy 服務進行 kill 掉,此時 keepalived 會嘗試去啟動 haproxy,會由於找不到配置檔案而啟動失敗,此時就會進行 haproxy_check.sh指令碼中的 killall keepalived 命令,結束 keepalived 進行。隨後就是 192.168.209.135 節點重新搶佔 vip
說明此時 VIP 已經漂移到物理主機 192.168.209.135上了
再通過 VIP(192.168.209.130) 來訪問 Haproxy 叢集, 訪問到的也是 192.168.209.135
驗證資料庫訪問
通過 vip 訪問資料庫、驗證 vip 切換後的資料庫訪問
(1)命令列訪問資料庫
(2)Navicat訪問資料庫
至此,Mycat高可用負載均衡叢集的實現(HAProxy + Keepalived + Mycat)搭建完畢
大家可以到連結http://download.csdn.net/detail/l1028386804/9915621下載搭建Mycat高可用負載均衡叢集的實現(HAProxy + Keepalived + Mycat)使用的Keepalived
其他推薦文章
- 《海量資料架構下如何保證Mycat的高可用?》
- 《冰河,能講講Mycat如何實現MySQL的讀寫分離嗎?》
- 《MySQL如何實現萬億級資料儲存?》
- 《Mycat核心開發者帶你輕鬆掌握Mycat路由轉發!!》
- 《Mycat核心開發者帶你看盡Mycat三大核心配置檔案!!》
- 《作為Mycat核心開發者,怎能不來一波Mycat系列文章?》
重磅福利
微信搜一搜【冰河技術】微信公眾號,關注這個有深度的程式設計師,每天閱讀超硬核技術乾貨,公眾號內回覆【PDF】有我準備的一線大廠面試資料和我原創的超硬核PDF技術文件,以及我為大家精心準備的多套簡歷模板(不斷更新中),希望大家都能找到心儀的工作,學習是一條時而鬱鬱寡歡,時而開懷大笑的路,加油。如果你通過努力成功進入到了心儀的公司,一定不要懈怠放鬆,職場成長和新技術學習一樣,不進則退。如果有幸我們江湖再見!
另外,我開源的各個PDF,後續我都會持續更新和維護,感謝大家長期以來對冰河的支援!!