冰河,能不能講講如何實現MySQL資料儲存的無限擴容?
阿新 • • 發佈:2020-12-19
## 寫在前面
> 隨著網際網路的高速發展,企業中沉澱的資料也越來越多,這就對資料儲存層的擴充套件性要求越來越高。當今網際網路企業中,大部分企業使用的是MySQL來儲存關係型資料。如何實現MySQL資料儲存層的高度可擴充套件性成為了網際網路企業必須要解決的問題。那麼,如何實現真正意義上的MySQL無限擴容呢?今天,冰河就來以實戰的角度為大家講講如何實現MySQL資料庫的無限擴容。
>
> 文章已收錄到:[https://github.com/sunshinelyz/technology-binghe](https://github.com/sunshinelyz/technology-binghe) 和 [https://gitee.com/binghe001/technology-binghe](https://gitee.com/binghe001/technology-binghe),小夥伴們別忘記給個小星星哦~~
## 概述
本文是在《[海量資料架構下如何保證Mycat的高可用?](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489096&idx=1&sn=1be285069a2153f494a81dc5f9aef708&chksm=cf55a149f822285f487b47a0bc5a0b421a14cf2dfd4ebdd8ae817167b5ffabe4f45676f65dca&token=420299024&lang=zh_CN#rd)》一文的基礎上進一步擴充套件,從而實現資料儲存層每一個環節的高可用,從而實現MySQL的無限擴容。
## 要解決的問題
在《[海量資料架構下如何保證Mycat的高可用?](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489096&idx=1&sn=1be285069a2153f494a81dc5f9aef708&chksm=cf55a149f822285f487b47a0bc5a0b421a14cf2dfd4ebdd8ae817167b5ffabe4f45676f65dca&token=420299024&lang=zh_CN#rd)》一文中,我們的架構圖如下:
![](https://img-blog.csdnimg.cn/20201219015335645.png)
由上圖可以看出,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
## 部署規劃
![](https://img-blog.csdnimg.cn/20201219015350478.png#pic_center)
## 高可用負載均衡叢集部署架構
![](https://img-blog.csdnimg.cn/20201219015401828.png)
上圖中簡化了資料儲存部分的架構細節。例如,其中對於架構中的每一個部分,我們都可以單獨進行擴充套件,獨立成叢集對外提供服務,而不會存在單點故障的問題。
**圖解說明:**
(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的高可用?](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247489096&idx=1&sn=1be285069a2153f494a81dc5f9aef708&chksm=cf55a149f822285f487b47a0bc5a0b421a14cf2dfd4ebdd8ae817167b5ffabe4f45676f65dca&token=420299024&lang=zh_CN#rd)》,注意配置檔案的調整:多節點部署時 haproxy.cfg 配置檔案中的 node 、 description 配置的值要做相應調整。
HAProxy 主機 2(liuyazhuang136, 192.168.209.136)上的HAProxy配置如下:
```bash
## 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