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



長(zhǎng)按訂閱更多精彩▼

如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!