DRBD+MySQL+keepalived高可用MySQL方案
DRBD+MySQL+keepalived高可用MySQL方案1
4.3.2 手動切換DRBD主從,看另外一臺服務器是否有相同數據。15
4.5 DRBD+MySQL+keepalived 服務檢查腳本20
5.1 測試MySQL或者keepalived任意服務出現異常後,DRBD主備節點是否支持自動切換29
5.2 當主節點服務器重啓時,DRBD主備節點是否支持自動切換31
一、DRBD集羣介紹
1.1 系統介紹
DRBD(DistributedReplicatedBlockDevice)是一個基於塊設備級別在遠程服務器直接同步和鏡像數據的軟件,用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲複製解決方案。它可以實現在網絡中兩臺服務器之間基於塊設備級別的實時鏡像或同步複製(兩臺服務器都寫入成功)/異步複製(本地服務器寫入成功),相當於網絡的RAID1,由於是基於塊設備(磁盤,LVM邏輯卷),在文件系統的底層,所以數據複製要比cp命令更快DRBD已經被MySQL官方寫入文檔手冊作爲推薦的高可用的方案之一。通過keepalived服務實現高可用集羣的故障轉移集羣。
1.2 工作原理及使用場景
採用keepalived雙機熱備軟件來保證數據庫的高穩定性和連續性,數據的一致性由DRBD這個工具來保證。默認情況下只有一臺mysql在工作,當主mysql服務器出現問題後,系統將自動切換到備機上繼續提供服務,當主數據庫修復完畢,又將服務切回繼續由主mysql提供服務。
二、實驗目的
通過實驗驗證keepalived+DRBD+MySQL的高可用集羣功能,模仿當keepalived或者MySQL服務宕機,熱備服務器是否能繼續提供服務進行測試;當主節點服務器異常重啓或機器故障,熱備服務器是否能繼續提供服務進行測試;通過該實驗驗證keepalived與heartbeat對於DRBD的高可用功能進行對比。
三、實驗原理
3.1 實驗拓撲
3.2 實驗環境設備
序號 | 設備名稱 | 設備系統 | IP地址 | 軟件環境 | DRBD磁盤 |
1 | db-server-01 | Centos6.5-64bit | 172.16.200.81 | DRBD+MySQL+keepalived | /dev/sdb1 |
2 | db-server-01 | Centos6.5-64bit | 172.16.200.82 | DRBD+MySQL+keepalived | /dev/sdb1 |
3 | VIP | N/A | 172.16.200.88 | N/A | N/A |
四、配置步驟
4.1 實驗前準備環境
4.1.1 修改主機名稱
實驗前將兩臺主機的主機名稱進行修改,通過修改/etc/hosts和/etc/sysconfig/network相關的修改內容如下:
4.1.2 關閉防火牆
關閉服務器系統防火牆,並關閉selinux服務。相關服務的關閉操作在此不在做相關操作。
4.1.3 同步系統時間
對於高可用集羣服務時間的同步是很關鍵的環節,時間不同步將會影響高可用集羣的使用。相關時間同步步驟如下,兩臺機器均做如下操作。
[root@db-server-01 ~]# yum install ntp
[root@db-server-01 ~]# ntpdate 202.120.2.101
注:202.120.2.101爲上海交通大學時間服務器
4.2 DRBD 部署
4.2.1 DRBD的安裝
對於DRBD的安裝方式可以採用在官方網站下載源碼包來編譯或直接使用yum來安裝。這裏已yum安裝爲例進行安裝配置。
兩臺主機均進行相同配置,這裏已主機db-server-01配置爲例進行配置。
[root@db-server-01~]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm #更新rpm包
[root@db-server-01~]# yum -y install drbd83-utils kmod-drbd83 #安裝drbd83
[root@db-server-01~]# modprobe drbd
[root@db-server-01~]# lsmod |grep drbd #檢查是否加載drbd模塊
安裝完成之後,在/sbin目錄下面有drbdadm、drbdmeta、drbdsetup命令。以及/etc/init.d/drbd 啓動腳本。
4.2.2 DRBD使用磁盤分區
保證兩臺機器硬盤的型號和性能一樣好,才能保證在切換後secondary節點能完成原來primary節點所承擔的業務負載。同時考慮DB的大小和未來的增長量,可以使用LVM進行分區。這裏分配大小爲20GB的/data分區給數據使用,兩臺機器完全一樣。
[root@db-server-01 ~]# fdisk /dev/sdb # 新建磁盤分區
注:此時不要格式化分區,兩臺主機,創建好磁盤分區報錯即可,無需格式化磁盤。文件系統的掛載只能在Primary節點進行,因此,也只有在設置了主節點後才能對drbd設備進行格式化。
4.2.3 DRBD的配置
DRBD的運行需要讀取/etc/drbd.conf配置文件。可以通過以下命令重建這個配置文件,該文件中描述了DRBD設備與硬盤分區的映射關係和DRBD的一些配置參數。(兩臺主機配置相同,這裏已主機配置db-server-01爲例)
[root@db-server-01 ~]# vi /etc/drbd.conf
global { usage-count yes; } # 是否參加DRBD使用者統計
common { syncer { rate 200M; } } #同步速率,視帶寬而定
resource r0 { #創建一個資源,名字叫"r0"
protocol C; #選擇的是drbd的C 協議(數據同步協議,C爲收到數據
並寫入後返回,確認成功)
startup {
}
disk {
on-io-error detach;
}
net {
}
on db-server-01 { #設定一個節點,分別以各自的主機名命名
device /dev/drbd0; #設定資源設備/dev/drbd0 指向實際的物理分區 /dev/sdb1
disk /dev/sdb1;
address 172.16.200.81:7888; #設定監聽地址以及端口,用於與另一臺主機通信。
meta-disk internal;
}
on db-server-02 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.200.82:7888;
meta-disk internal; # drbd的元數據存放方式,internal表示是在同一個局域網內
}
}
Db-server-01配置
Db-server-02配置
4.2.4 DRBD的啓動
啓動DRBD服務之前,首先分別在兩臺主機的/dev/sdb1分區上創建DRBD元數據信息。
執行的命令如下:
[root@db-server-01 ~]# drbdadm create-md all
[root@db-server-02 ~]# drbdadm create-md all
這裏可以使用drbdadm create-md r0 代替drbdadm create-md all,r0是在配置文件中定義的資源名稱。
現在啓動DRBD服務,分別在兩臺主機上執行啓動操作。
注:如果在通過drbdadm create-md all 創建元數據不成功,使用以下方式處理,操作時確認分區上的數據已備份。
[root@db-server-01 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100
[root@db-server-02 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100
執行完“dd”命令後,在執行“drbdadm create-md all”命令。啓動DRBD服務。
設置主節點後格式化主節點的DRBD分區
分別在兩臺服務器上啓動DRBD服務:
[root@db-server-01 ~]# /etc/init.d/drbd start
[root@db-server-02 ~]# /etc/init.d/drbd start
查看DRBD狀態:
[root@db-server-01 ~]# /etc/init.d/drbd status
[root@db-server-02 ~]# /etc/init.d/drbd status
可以看見兩臺主機還都沒有主節點。設置當前節點(db-server-01)爲主節點,並進行格式化和掛載。
注:掛載DRBD分區之前,首先要確認當前主機的DRBD分區是Primary狀態。
執行以下命令:
[root@db-server-01 ~]# drbdadm -- --overwrite-data-of-peer primary all
[root@db-server-01 ~]# mkfs.ext4 /dev/drbd0
[root@db-server-01 ~]# mkdir /data
[root@db-server-01 ~]# mount /dev/drbd0 /data/
在另外一臺主機也創建掛載目錄/data ,注意:不要執行格式化該主機分區,也不要掛載相應的磁盤。
[root@db-server-02 ~]# mkdir /data
磁盤掛載完成後,再次查看DRBD的狀態(可以看見主備各自的節點分爲主備)。
可以使用cat /proc/drbd 和 /etc/init.d/drbd status 命令進行查看。
從輸出的信息可知,磁盤的狀態都是“UpToDate”,表示數據同步完成了。
輸出中的一些參數的含義如下:
ro是角色信息,Primary/Secondary說明了當前主機是primary節點,另外一臺是secondary節點。
ds是磁盤狀態,顯示數據是否一致(如果顯示 UpToDate/UpToDate表明同步沒有延時)
ns是網絡發送的數據包,以K字節計算。
dw是磁盤寫操作。
dr是磁盤讀操作。
4.2.5 DRBD設備角色切換
DRBD設備在進行角色切換操作前,需要先在主節點上執行umount命令,先掉對DRBD設備的掛載,然後在另一臺主機上把DRBD角色修改爲Primary。最後在執行掛載。操作如下:
在primary節點上執行以下操作:
在secondary節點上執行如下操作:
這是再次查看DRBD的狀態,確認是否完成切換。
通過以上截圖確認角色切換完成。
還有一種切換策略,先停止primary節點的DRBD服務。
然後在secondary節點上執行如下命令:
# drbdadm -- --overwrite-data-of-peer primary all
# mount /dev/drbd0 /data/
相關操作截圖如下:
再次查看DRBD狀態,當前節點已爲primary節點。
4.2.6 DRBD腦裂後的處理
當DRBD出現腦裂後,會導致drbd兩邊的磁盤數據不一致,在確定要作爲從的節點上切換成secondary,並放棄該資源的數據:
drbdadm secondary r0
drbdadm -- --discard-my-data connect r0
在要作爲primary的節點重新連接secondary(如果這個節點當前的連接狀態爲WFConnection的話,可以省略),使用如下命令連接:
drbdadm connect r0
4.2.7 DRBD的性能優化
可以考慮以下幾個方面優化DRBD性能。
(1)網絡環境
能使用千兆網卡的不要使用百兆網卡。當前主流服務器都使用千兆網卡,交換機也不例外。同時,DRBD的數據同步使用的網絡最好和提供服務的網絡分開,儘量獨立出來。例如:在兩塊網卡上直接連接一個網線,用做DRBD的數據同步。
(2)用做DRBD分區的磁盤的性能
用做DRBD分區的磁盤的性能儘量好,例如可以考慮通過RAID提高I/O性能,在網絡環境很好的情況下,DRBD分區可能會由於I/O的寫性能而成爲瓶頸。
(3)更新系統
儘量把系統更新成最新的內核以及64位的系統,同時使用最新版本的DRBD。
(4)注意syncer參數設置
Syncer主要用來設置同步相關參數。可以設置“重新”同步(re-synchronization)的速率(rate),當節點間出現不一致的block時,DRBD就需要執行re-synchronization動作,而syncer中的參數rate就是用來設置同步的速率的,rate的設置與網絡和磁盤I/O能力密切相關。
千兆網絡的同步速率大約是125Mbit/s,百兆網絡的同步速率大約是11Mbit/s。用這個同步速率和磁盤寫入速率(hdparm-Tt/dev/drbd0測試結果)中最小者的30%帶寬來設置re-synchronization是比較合適的,這也是官方給出的建議。
例如,同步速率爲125Mbit/s,磁盤寫入速度爲119Mbit/s,應該設置rate爲不能超過33Mbit/s。
(5)注意al-extents參數設置
al-extents控制着一次向磁盤寫入多少個4MB的數據塊。增大這個參數的值有以下幾個好處:
可以減少更新元數據到DRBD設備的頻率。
降低同步數據時對I/O流的中斷數量。
提高修改DRBD設備的速度。
但是同時也存在一個風險:當主節點出現宕機時,所有活動的數據(al-extends的值X 4M的數據塊)需要在同步連接建立後重新同步,即在主節點出現宕機時,備節點出現數據不一致(outdate)的情況。因此,不建議在HA部署上調整這個參數,可以在某些情況下調整這個參數來×××能。
總的來說,以上5個方面需要特別注意,調整其他參數影響則較小。
4.3 MySQL部署
4.3.1 MySQL的安裝與配置
安裝MySQL有多種方法,我這裏爲了簡單直接使用yum安裝。
注:兩臺服務器均需要安裝MySQL,兩臺服務器上的MySQL版本需要一致,對於MySQL的用戶uid和gid均需要相同,否則切換後會導致MySQL數據目錄的屬主不正確而導致啓動失敗。關鍵點:在兩臺服務器的MySQL服務安裝完成後,secondary節點的MySQL不需要初始化(就是不啓動數據庫服務,切記)
我這裏以Primary安裝爲例yum安裝MySQL。
[root@db-server-01 ~]# yum install -y mysql-server mysql-devel mysql mysql-bench mysql-test
按裝完成後,使用如下命令啓動MySQL服務:
[root@db-server-01 ~]# /etc/init.d/mysqld start
將數據文件放到DRBD分區上
[root@db-server-01 ~]# cp -R /var/lib/mysql/ /data/mysql/
[root@db-server-01 ~]# chown -R mysql:mysql /data/mysql/
修改/etc/my.cnf文件,在[mysql]組增加如下配置:
datadir=/data/mysql
待兩臺主機均按以上操作將MySQL安裝完成後,分別啓動服務測試,是否能正常啓動。
4.3.2 手動切換DRBD主從,看另外一臺服務器是否有相同數據。
切換前數據狀況和主備狀態
[root@db-server-01 ~]# ll /data
[root@db-server-02 data]# ll /data
可以看見當前的primary服務器爲db-server-01,也就是數據在這臺服務器上,secondary服務器爲db-server-02是沒有數據的。
下面我們將主切換成從,需要先卸載文件系統,再執行降級爲從的命令:
[root@db-server-01 ~]# /etc/init.d/mysqld stop #先停止文件系統的佔用,即停止MySQL服務
Shutting down MySQL. SUCCESS!
[root@db-server-01 ~]# umount /data/ #卸載文件系統
[root@db-server-01 ~]# drbdadm secondary all #將服務器降級
從切換成主,要先執行升級成主的命令然後掛載文件系統:
[root@db-server-02 ~]# drbdadm primary all #升級爲主
[root@db-server-02 ~]# mount /dev/drbd0 /data/ #掛載文件系統
[root@db-server-02 ~]# ll /data #查看數據是否存在
total 20
drwx------ 2 root root 16384 Sep 3 19:35 lost+found
drwx------ 5 mysql root 4096 Sep 3 23:51 mysql
4.4 keepalived 部署
安裝keepalived有多種方法,我這裏爲了簡單直接使用yum安裝.
兩臺主機均需要進行相同安裝過程,並進行配置,配置的過程中的配置文件不同。
[root@db-server-01~]# yum -y install keepalived #兩臺機器分別安裝keepalived軟件。
配置keepalived服務,主備均需要配置,配置信息如在:
注:主備配置都不同之處已經標出,注意修改。
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from [email protected]
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #備機:BACKUP
interface eth0
virtual_router_id 59
priority 100 #備機:80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.200.88
}
}
配置完成後通過ip addr查看IP漂移信息。
當 MASTER 的keepalived服務出現異常時,VIP將漂移到BACKUP節點。
4.4.1 keepalived的VIP切換測試
測試前VIP狀態:
當主節點keepalived停止後查看VIP狀態是否正常。
測試結果反饋,當主節點keepalived服務停止後,VIP將自動切換到備節點。
注:keepalived+MySQL+DRBD服務在安裝完成後,均不要添加開機啓動項。
4.5 DRBD+MySQL+keepalived 服務檢查腳本
腳本檢測的作用:
1. Check.sh 腳本監測的是當MySQL服務和keepalived服務在主節點服務器的MySQL或者keepalived服務出現異常時,將會將DRBD+MySQL+keepalived服務全部切換到備節點。該腳本的存放目錄自行安排,他的執行需要通過crontab -e任務計劃自動執行。所機器中均加入腳本的執行加入crontab -e 中設置爲每分鐘自動執行。(兩臺機器均添加)
* * * * * sh /root/check.sh &>/tmp/check.log
2.
3. Drbdmanager 腳本檢查當主服務器出現宕機時熱備服務器將接管所有服務,並自行啓動。該腳本存放在/etc/rc.d/init.d路徑下,添加執行權限。並在開機啓動項中添加開機啓動,相關操作如下:
# chkconfig --add drbdmanager
# chkconfig drbdmanager on
Check.sh腳本內容如下:
[root@db-server-01 ~]# cat check.sh
#!/bin/bash
# check drbd mysql
# time:2016.09.07
# organization:Anchnet
i=0
while (( i<=10 ));do
sleep 5
Time=`date`
VIP=172.16.200.88
Mysql=/etc/init.d/mysqld
Mysql_Status=/var/lib/mysql/mysqld.pid
Keepalived_Status=/var/run/keepalived.pid
Keepalived=/etc/init.d/keepalived
DRBD_Status=`/etc/init.d/drbd status | tail -1 | awk '{print $3}' | awk -F/ '{print $1}'`
DRBD=r0
Mount_Poit=/data
DRBD_Data=/dev/drbd0
Command_1=/sbin/drbdadm
Command_2=mount
if [[ -f $Keepalived_Status ]];then
echo "$Time Keepalived OK"
else
$Keepalived restart
fi
if `/sbin/ip addr | grep "$VIP" &>/dev/null`;then
echo "$Time Keepalived MASTER"
if [[ "$DRBD_Status" = "Primary" ]];then
echo "$Time DRBD Primary"
if `$Command_2 | grep $Mount_Poit &>/dev/null`;then
echo "$Time Mount OK."
if [[ -f $Mysql_Status ]];then
echo "$Time Mysql OK"
echo "************華麗的分割線******************"
else
echo "$Time Mysql Fail"
$Mysql restart start
if [[ -f $Mysql_Status ]];then
echo "$Time Mysql OK"
echo "************華麗的分割線******************"
else
$Keepalived stop && sleep 5
fi
fi
else
$Command_2 $DRBD_Data $Mount_Poit
if [[ $? -eq 0 ]];then
echo "$Time mount disk ok"
else
$Keepalived stop && sleep 5
fi
fi
else
$Command_1 primary $DRBD
if [[ $? -eq 0 ]];then
echo "$Time Start drbd Primary"
else
$Keepalived stop && sleep 5
fi
fi
else
if [[ -f $Mysql_Status ]];then
$Mysql stop
if [[ $? -eq 0 ]];then
echo "$Time Stop Mysql OK"
else
/bin/kill -9 mysqld
echo "$Time Stop Mysql OK"
fi
if `$Command_2 | grep $Mount_Poit &>/dev/null`;then
u$Command_2 $DRBD_Data && echo "$Time umount OK"
if [[ "$DRBD_Status" = "Primary" ]];then
$Command_1 secondary $DRBD && echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
else
echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
fi
else
echo "$Time Stop Mysql OK"
if `$Command_2 | grep $Mount_Poit &>/dev/null`;then
u$Command_2 $DRBD_Data && echo "$Time umount OK"
if [[ "$DRBD_Status" = "Primary" ]];then
$Command_1 secondary $DRBD && echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
else
echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
fi
else
if [[ "$DRBD_Status" = "Primary" ]];then
$Command_1 secondary $DRBD && echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
else
echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
fi
fi
fi
else
if `$Command_2 | grep $Mount_Poit &>/dev/null`;then
u$Command_2 $DRBD_Data && echo "$Time umount OK"
if [[ "$DRBD_Status" = "Primary" ]];then
$Command_1 secondary $DRBD && echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
else
echo "$Time Start secondary OK"
fi
else
if [[ "$DRBD_Status" = "Primary" ]];then
$Command_1 secondary $DRBD && echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
else
echo "$Time Start secondary OK"
echo "************華麗的分割線******************"
fi
fi
fi
fi
let "i++"
done
Drbdmanager.sh腳本內容如下:
[root@db-server-01 ~]# cat /etc/rc.c/init.d/drbdmanager
#!/bin/bash
# drbdmanagermanager drbd
# chkconfig: - 75 05
# description:shutdown drbd
Mysql=/var/lib/mysql/mysqld.pid
DRBD_Status=`/etc/init.d/drbd status | tail -1 | awk '{print $3}' | awk -F/ '{print $1}'`
DRBD=r0
Mount_Poit=/data
DRBD_Data=/dev/drbd0
Command_1=/sbin/drbdadm
Command_2=mount
crond=/etc/init.d/crond
. /etc/rc.d/init.d/functions
function stop(){
if [[ "$DRBD_Status" = "Primary" ]];then
/bin/kill crond &>/dev/null && /bin/kill sh && /bin/kill ${`cat $Mysql`} && /bin/umount $DRBD_Data && $Command_1 secondary $DRBD &>/dev/null
else
::
fi
}
function status(){
if [[ $? -eq 0 ]];then
action "Stop DRBD:" /bin/true
else
action "stop DRBD:" /bin/false
fi
}
case "$1" in
stop)
stop
status
;;
start)
action "Start DRBDManager" /bin/true
;;
*)
echo "INPUT STOP"
;;
esac
Exit
五、實驗結果驗證
實驗的驗證結果從以下幾個方面進行驗證。
5.1 測試MySQL或者keepalived任意服務出現異常後,DRBD主備節點是否支持自動切換
測試結果如下:
服務停止前狀態如下:
Keepalived服務停止後的結果查看:
通過以上截圖測試結果反饋,通過腳本的執行可以滿足當主節點服務宕機後,熱備節點將結果所有服務,保證業務的正常運行。
注:當進行手動停止MySQL或者keepalived服務進行測試時,一定要將服務徹底的停止,否則在腳本執行的時候MySQL或者keepalived服務將對通過腳本自動重啓,不能起到測試的過程。
5.2 當主節點服務器重啓時,DRBD主備節點是否支持自動切換
當服務器重啓前的狀態如下:
當主節點服務器
通過已上測試結果反饋當主節點正常關機後,熱備服務器將自動接管所有服務,保證業務的正常運行。
注:服務器關機測試,僅在當服務器正常重啓的情況下進行,當服務器異常重啓,將會導致服務出現腦裂,異常重啓儘量避免。