寫在前面
隨著互聯網的高速發(fā)展,企業(yè)中沉淀的數據也越來越多,這就對數據存儲層的擴展性要求越來越高。當今互聯網企業(yè)中,大部分企業(yè)使用的是MySQL來存儲關系型數據。如何實現MySQL數據存儲層的高度可擴展性成為了互聯網企業(yè)必須要解決的問題。那么,如何實現真正意義上的MySQL無限擴容呢?今天,冰河就來以實戰(zhàn)的角度為大家講講如何實現MySQL數據庫的無限擴容。
概述
本文是在《海量數據架構下如何保證Mycat的高可用?》一文的基礎上進一步擴展,從而實現數據存儲層每一個環(huán)節(jié)的高可用,從而實現MySQL的無限擴容。
要解決的問題
在《海量數據架構下如何保證Mycat的高可用?》一文中,我們的架構圖如下:
由上圖可以看出,HAProxy存在單點隱患,一旦這個HAProxy服務宕機,那么整個服務架構將不可用。那么,如何解決HAProxy存在的單點隱患問題呢?這就是這篇博文要解決的問題。
軟件版本
- 操作系統(tǒng):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
部署規(guī)劃
高可用負載均衡集群部署架構
上圖中簡化了數據存儲部分的架構細節(jié)。例如,其中對于架構中的每一個部分,我們都可以單獨進行擴展,獨立成集群對外提供服務,而不會存在單點故障的問題。
圖解說明:
(1) HAProxy 實現了 Mycat 多節(jié)點的集群高可用和負載均衡, 而 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 有優(yōu)先級, 在 keepalived.conf 配置中的 priority 屬性決定。但是一般哪臺主機上的 Keepalived服務先啟動就會搶占到 vip,即使是 slave,只要先啟動也能搶到(要注意避免 Keepalived的資源搶占問題)。
(3) HAProxy 負責將對 vip 的請求分發(fā)到 Mycat 集群節(jié)點上, 起到負載均衡的作用。同時 HAProxy 也能檢測到 Mycat 是否存活, HAProxy 只會將請求轉發(fā)到存活的 Mycat 上。
(4) 如果 Keepalived+HAProxy 高可用集群中的一臺服務器宕機, 集群中另外一臺服務器上的 Keepalived會立刻搶占 vip 并接管服務, 此時搶占了 vip 的 HAProxy 節(jié)點可以繼續(xù)提供服務。
(5) 如果一臺 Mycat 服務器宕機, HAPorxy 轉發(fā)請求時不會轉發(fā)到宕機的 Mycat 上,所以 Mycat 依然可用。
綜上:Mycat 的高可用及負載均衡由 HAProxy 來實現,而 HAProxy 的高可用,由 Keepalived 來實現。
HAProxy 節(jié)點 2 的部署
HAProxy 主機 2(liuyazhuang136, 192.168.209.136)的安裝部署請參考博文《海量數據架構下如何保證Mycat的高可用?》,注意配置文件的調整:多節(jié)點部署時 haproxy.cfg 配置文件中的 node 、 description 配置的值要做相應調整。
HAProxy 主機 2(liuyazhuang136, 192.168.209.136)上的HAProxy配置如下:
## global配置中的參數為進程級別的參數,通常與其運行的操作系統(tǒng)有關
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的工作目錄至指定的目錄并在放棄權限之前執(zhí)行
### chroot() 操作,可以提升 haproxy 的安全級別
group haproxy ## 同gid,不過這里為指定的用戶組名
user haproxy ## 同uid,但這里使用的為用戶名
daemon ## 設置haproxy后臺守護進程形式運行
nbproc 1 ## 指定啟動的haproxy進程個數,
### 只能用于守護進程模式的haproxy;默認為止啟動1個進程,
### 一般只在單進程僅能打開少數文件描述符的場中中才使用多進程模式
maxconn 4096 ## 設定每個haproxy進程所接受的最大并發(fā)連接數,
### 其等同于命令行選項"-n","ulimit-n"自動計算的結果正式參照從參數設定的
# pidfile /var/run/haproxy.pid ## 進程文件(默認路徑 /var/run/haproxy.pid)
node liuyazhuang136 ## 定義當前節(jié)點的名稱,用于HA場景中多haproxy進程共享同一個IP地址時
description liuyazhuang136 ## 當前實例的描述信息
## defaults:用于為所有其他配置段提供默認參數,這默認配置參數可由下一個"defaults"所重新設定
defaults
log global ## 繼承global中l(wèi)og的定義
mode http ## mode:所處理的模式 (tcp:四層 , http:七層 , health:狀態(tài)檢查,只會返回OK)
### tcp: 實例運行于純tcp模式,在客戶端和服務器端之間將建立一個全雙工的連接,
#### 且不會對7層報文做任何類型的檢查,此為默認模式
### http:實例運行于http模式,客戶端請求在轉發(fā)至后端服務器之前將被深度分析,
#### 所有不與RFC模式兼容的請求都會被拒絕
### health:實例運行于health模式,其對入站請求僅響應“OK”信息并關閉連接,
#### 且不會記錄任何日志信息 ,此模式將用于相應外部組件的監(jiān)控狀態(tài)檢測請求
option httplog
retries 3
option redispatch ## serverId對應的服務器掛掉后,強制定向到其他健康的服務器
maxconn 2000 ## 前端的最大并發(fā)連接數(默認為2000)
### 其不能用于backend區(qū)段,對于大型站點來說,可以盡可能提高此值以便讓haproxy管理連接隊列,
### 從而避免無法應答用戶請求。當然,此最大值不能超過“global”段中的定義。
### 此外,需要留心的是,haproxy會為每個連接維持兩個緩沖,每個緩存的大小為8KB,
### 再加上其他的數據,每個連接將大約占用17KB的RAM空間,這意味著經過適當優(yōu)化后 ,
### 有著1GB的可用RAM空間時將維護40000-50000并發(fā)連接。
### 如果指定了一個過大值,極端場景中,其最終所占據的空間可能會超過當前主機的可用內存,
### 這可能會帶來意想不到的結果,因此,將其設定一個可接受值放為明智絕對,其默認為2000
timeout connect 5000ms ## 連接超時(默認是毫秒,單位可以設置us,ms,s,m,h,d)
timeout client 50000ms ## 客戶端超時
timeout server 50000ms ## 服務器超時
## HAProxy的狀態(tài)信息統(tǒng)計頁面
listen admin_stats
bind :48800 ## 綁定端口
stats uri /admin-status ##統(tǒng)計頁面
stats auth admin:admin ## 設置統(tǒng)計頁面認證的用戶和密碼,如果要設置多個,另起一行寫入即可
mode http
option httplog ## 啟用日志記錄HTTP請求
## listen: 用于定義通過關聯“前端”和“后端”一個完整的代理,通常只對TCP流量有用
listen mycat_servers
bind :3307 ## 綁定端口
mode tcp
option tcplog ## 記錄TCP請求日志
option tcpka ## 是否允許向server和client發(fā)送keepalive
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ## 后端服務狀態(tài)檢測
### 向后端服務器的48700端口(端口值在后端服務器上通過xinetd配置)發(fā)送 OPTIONS 請求
### (原理請參考HTTP協(xié)議) ,HAProxy會根據返回內容來判斷后端服務是否可用.
### 2xx 和 3xx 的響應碼表示健康狀態(tài),其他響應碼或無響應表示服務器故障。
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 [:[port]] [param*]
### serser 在后端聲明一個server,只能用于listen和backend區(qū)段。
### 為此服務器指定的內部名稱,其將會出現在日志及警告信息中
###
此服務器的IPv4地址,也支持使用可解析的主機名,但要在啟動時需要解析主機名至響應的IPV4地址
### [:[port]]指定將客戶端連接請求發(fā)往此服務器時的目標端口,此為可選項
### [param*]為此server設定的一系列參數,均為可選項,參數比較多,下面僅說明幾個常用的參數:
#### weight:權重,默認為1,最大值為256,0表示不參與負載均衡
#### backup:設定為備用服務器,僅在負載均衡場景中的其他server均不可以啟用此server
#### check:啟動對此server執(zhí)行監(jiān)控狀態(tài)檢查,其可以借助于額外的其他參數完成更精細的設定
#### inter:設定監(jiān)控狀態(tài)檢查的時間間隔,單位為毫秒,默認為2000,
##### 也可以使用fastinter和downinter來根據服務器端專題優(yōu)化此事件延遲
#### rise:設置server從離線狀態(tài)轉換至正常狀態(tài)需要檢查的次數(不設置的情況下,默認值為2)
#### fall:設置server從正常狀態(tài)轉換至離線狀態(tài)需要檢查的次數(不設置的情況下,默認值為3)
#### cookie:為指定server設定cookie值,此處指定的值將會在請求入站時被檢查,
##### 第一次為此值挑選的server將會被后續(xù)的請求所選中,其目的在于實現持久連接的功能
#### maxconn:指定此服務器接受的最大并發(fā)連接數,如果發(fā)往此服務器的連接數目高于此處指定的值,
#####其將被放置于請求隊列,以等待其他連接被釋放
HAProxy 節(jié)點 1 的狀態(tài)信息頁:http://192.168.209.135:48800/admin-status
HAProxy 節(jié)點 2 的狀態(tài)信息頁:http://192.168.209.136:48800/admin-status
Keepalived 介紹
Keepalived 是一種高性能的服務器高可用或熱備解決方案, Keepalived 可以用來防止服務器單點故障的發(fā)生,通過配合 Haproxy 可以實現 web 前端服務的高可用。Keepalived 以 VRRP 協(xié)議為實現基礎,用 VRRP 協(xié)議來實現高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)協(xié)議是用于實現路由器冗余的協(xié)議, VRRP 協(xié)議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER,或者是通過算法選舉產生。MASTER 實現針對虛擬路由器 IP 的各種網絡功能,如 ARP 請求, ICMP,以及數據的轉發(fā)等;其他設備不擁有該虛擬 IP,狀態(tài)是 BACKUP,除了接收 MASTER 的VRRP 狀態(tài)通告信息外,不執(zhí)行對外的網絡功能。當主機失效時, BACKUP 將接管原先 MASTER 的網絡功能。VRRP 協(xié)議使用多播數據來傳輸 VRRP 數據, VRRP 數據使用特殊的虛擬源 MAC 地址發(fā)送數據而不是自身網卡的 MAC 地址, VRRP 運行時只有 MASTER 路由器定時發(fā)送 VRRP 通告信息,表示 MASTER 工作正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 數據,不發(fā)送數據,如果一定時間內沒有接收到 MASTER 的通告信息,各 BACKUP 將宣告自己成為 MASTER,發(fā)送通告信息,重新進行 MASTER 選舉狀態(tài)。
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 系統(tǒng)服務
因為沒有使用 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 節(jié)點配置文件(192.168.209.135)
! Configuration File for keepalived
global_defs {
## keepalived 自帶的郵件提醒需要開啟 sendmail 服務。建議用獨立的監(jiān)控或第三方 SMTP
router_id liuyazhuang135 ## 標識本節(jié)點的字條串,通常為 hostname
}
## keepalived 會定時執(zhí)行腳本并對腳本執(zhí)行的結果進行分析,動態(tài)調整 vrrp_instance 的優(yōu)先級。
## 如果腳本執(zhí)行結果為 0,并且 weight 配置的值大于 0,則優(yōu)先級相應的增加。
## 如果腳本執(zhí)行結果非 0,并且 weight 配置的值小于 0,則優(yōu)先級相應的減少。
## 其他情況,維持原本配置的優(yōu)先級,即配置文件中 priority 對應的值。
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態(tài)的腳本路徑
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 號,兩個節(jié)點設置必須一樣,可選 IP 最后一段使用,
## 相同的 VRID 為一個組,他將決定多播的 MAC 地址
priority 120 ## 節(jié)點優(yōu)先級,值范圍 0-254, MASTER 要比 BACKUP 高
nopreempt ## 主設備(priority 值大的)配置一定要加上 nopreempt,否則非搶占也不起作用
advert_int 1 ## 組播信息發(fā)送間隔,兩個節(jié)點設置必須一樣,默認 1s
## 設置驗證信息,兩個節(jié)點必須一致
authentication {
auth_type PASS
auth_pass 1111 ## 真實生產,按需求對應該過來
}
## 將 track_script 塊加入 instance 配置塊
track_script {
chk_haproxy ## 檢查 HAProxy 服務是否存活
}
## 虛擬 IP 池, 兩個節(jié)點設置必須一樣
virtual_ipaddress {
192.168.209.130 ## 虛擬 ip,可以定義多個,每行一個
}
}
(2)BACKUP 節(jié)點配置文件(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 的故障節(jié)點恢復后會再次導搶占 vip,從而因 vip 切換而閃斷帶來的風險(視頻解說)。按以上配置,配置了 Keepalived 非搶占模式, 配置及注意點如下:(1) 主設備、 從設備中的 state 都設置為 BACKUP (2) 主設備、從設備中都不要配置 mcast_src_ip (本機 IP 地址) (3) 默認主設備(priority 值大的 Keepalived 節(jié)點) 配置一定要加上 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 為主機的網卡設備名稱,生產環(huán)境服務器可以用獨立網卡來處理組播和心跳檢測等)
# service iptables save
重啟防火墻:
# service iptables restart
編寫 Haproxy 狀態(tài)檢測腳本
我們編寫的腳本為/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
保存后,給腳本賦執(zhí)行權限:
# chmod +x /etc/keepalived/haproxy_check.sh
啟動 Keepalived
# service keepalived start
Starting keepalived: [ OK ]
Keepalived 服務管理命令:
停止:service keepalived stop
啟動:service keepalived start
重啟:service keepalived restart
查看狀態(tài):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 節(jié)點的網絡接口中的 VIP(192.168.209.130) 將消失
此時,由上圖可知:在192.168.209.136節(jié)點的網絡接口中會出現 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 的節(jié)點(192.168.209.136) 中的 HAProxy 故障或啟動失敗
方式:把 192 節(jié)點中的 haproxy.cfg 文件重命名為 haproxy.cfg_bak, 并把 haproxy 服務進行 kill 掉,此時 keepalived 會嘗試去啟動 haproxy,會由于找不到配置文件而啟動失敗,此時就會進行 haproxy_check.sh腳本中的 killall keepalived 命令,結束 keepalived 進行。隨后就是 192.168.209.135 節(jié)點重新搶占 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
特別推薦一個分享架構+算法的優(yōu)質內容,還沒關注的小伙伴,可以長按關注一下:
長按訂閱更多精彩▼
如有收獲,點個在看,誠摯感謝
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!