DRBD+MySQL+keepalived高可用MySQL方案1mysql
1、DRBD集羣介紹2linux
1.1 系統介紹2sql
2、實驗目的2性能優化
3、實驗原理3bash
3.1 實驗拓撲3服務器
4、配置步驟3異步
4.1 實驗前準備環境3ide
4.3.2 手動切換DRBD主從,看另一臺服務器是否有相同數據。15
4.5 DRBD+MySQL+keepalived 服務檢查腳本20
5.1 測試MySQL或者keepalived任意服務出現異常後,DRBD主備節點是否支持自動切換29
5.2 當主節點服務器重啓時,DRBD主備節點是否支持自動切換31
DRBD(DistributedReplicatedBlockDevice)是一個基於塊設備級別在遠程服務器直接同步和鏡像數據的軟件,用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲複製解決方案。它能夠實如今網絡中兩臺服務器之間基於塊設備級別的實時鏡像或同步複製(兩臺服務器都寫入成功)/異步複製(本地服務器寫入成功),至關於網絡的RAID1,因爲是基於塊設備(磁盤,LVM邏輯卷),在文件系統的底層,因此數據複製要比cp命令更快DRBD已經被MySQL官方寫入文檔手冊做爲推薦的高可用的方案之一。經過keepalived服務實現高可用集羣的故障轉移集羣。
採用keepalived雙機熱備軟件來保證數據庫的高穩定性和連續性,數據的一致性由DRBD這個工具來保證。默認狀況下只有一臺mysql在工做,當主mysql服務器出現問題後,系統將自動切換到備機上繼續提供服務,當主數據庫修復完畢,又將服務切回繼續由主mysql提供服務。
經過實驗驗證keepalived+DRBD+MySQL的高可用集羣功能,模仿當keepalived或者MySQL服務宕機,熱備服務器是否能繼續提供服務進行測試;當主節點服務器異常重啓或機器故障,熱備服務器是否能繼續提供服務進行測試;經過該實驗驗證keepalived與heartbeat對於DRBD的高可用功能進行對比。
序號 |
設備名稱 |
設備系統 |
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 |
實驗前將兩臺主機的主機名稱進行修改,經過修改/etc/hosts和/etc/sysconfig/network相關的修改內容以下:
4.1.2 關閉防火牆
關閉服務器系統防火牆,並關閉selinux服務。相關服務的關閉操做在此不在作相關操做。
對於高可用集羣服務時間的同步是很關鍵的環節,時間不一樣步將會影響高可用集羣的使用。相關時間同步步驟以下,兩臺機器均作以下操做。
[root@db-server-01 ~]# yum install ntp
[root@db-server-01 ~]# ntpdate 202.120.2.101
注:202.120.2.101爲上海交通大學時間服務器
對於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 啓動腳本。
保證兩臺機器硬盤的型號和性能同樣好,才能保證在切換後secondary節點能完成原來primary節點所承擔的業務負載。同時考慮DB的大小和將來的增加量,可使用LVM進行分區。這裏分配大小爲20GB的/data分區給數據使用,兩臺機器徹底同樣。
[root@db-server-01 ~]# fdisk /dev/sdb # 新建磁盤分區
注:此時不要格式化分區,兩臺主機,建立好磁盤分區報錯便可,無需格式化磁盤。文件系統的掛載只能在Primary節點進行,所以,也只有在設置了主節點後才能對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是磁盤讀操做。
DRBD設備在進行角色切換操做前,須要先在主節點上執行umount命令,先掉對DRBD設備的掛載,而後在另外一臺主機上把DRBD角色修改成Primary。最後在執行掛載。操做以下:
在primary節點上執行如下操做:
在secondary節點上執行以下操做:
這是再次查看DRBD的狀態,確認是否完成切換。
經過以上截圖確認角色切換完成。
還有一種切換策略,先中止primary節點的DRBD服務。
而後在secondary節點上執行以下命令:
# drbdadm -- --overwrite-data-of-peer primary all
# mount /dev/drbd0 /data/
相關操做截圖以下:
再次查看DRBD狀態,當前節點已爲primary節點。
當DRBD出現腦裂後,會致使drbd兩邊的磁盤數據不一致,在肯定要做爲從的節點上切換成secondary,並放棄該資源的數據:
drbdadm secondary r0
drbdadm -- --discard-my-data connect r0
在要做爲primary的節點從新鏈接secondary(若是這個節點當前的鏈接狀態爲WFConnection的話,能夠省略),使用以下命令鏈接:
drbdadm connect r0
能夠考慮如下幾個方面優化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個方面須要特別注意,調整其餘參數影響則較小。
安裝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安裝完成後,分別啓動服務測試,是否能正常啓動。
切換前數據情況和主備狀態
[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
安裝keepalived有多種方法,我這裏爲了簡單直接使用yum安裝.
兩臺主機均須要進行相同安裝過程,並進行配置,配置的過程當中的配置文件不一樣。
[root@db-server-01~]# yum -y install keepalived #兩臺機器分別安裝keepalived軟件。
配置keepalived服務,主備均須要配置,配置信息如在:
注:主備配置都不一樣之處已經標出,注意修改。
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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節點。
測試前VIP狀態:
當主節點keepalived中止後查看VIP狀態是否正常。
測試結果反饋,當主節點keepalived服務中止後,VIP將自動切換到備節點。
注:keepalived+MySQL+DRBD服務在安裝完成後,均不要添加開機啓動項。
腳本檢測的做用:
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
實驗的驗證結果從如下幾個方面進行驗證。
測試結果以下:
服務中止前狀態以下:
Keepalived服務中止後的結果查看:
經過以上截圖測試結果反饋,經過腳本的執行能夠知足當主節點服務宕機後,熱備節點將結果全部服務,保證業務的正常運行。
注:當進行手動中止MySQL或者keepalived服務進行測試時,必定要將服務完全的中止,不然在腳本執行的時候MySQL或者keepalived服務將對經過腳本自動重啓,不能起到測試的過程。
當服務器重啓前的狀態以下:
當主節點服務器
經過已上測試結果反饋當主節點正常關機後,熱備服務器將自動接管全部服務,保證業務的正常運行。
注:服務器關機測試,僅在當服務器正常重啓的狀況下進行,當服務器異常重啓,將會致使服務出現腦裂,異常重啓儘可能避免。