MySQL高可用性之MySQL+DRBD+Heartbeat

李振良發表於2016-05-05

一、環境介紹

130606428.jpg

1、DRDB儲存軟體

DRBD是一個軟體來實現資料實時、同步、非同步的資料映象塊儲存複製解決方案,主要功能是通過Linux核心實現。

DRBD類似網路RAID-1功能寫入本地的檔案會通過網路以相同方式寫在另一檔案系統。

對於實現Mysql高可用,DRBD效能比較差,因為每次更新的資料,都會全部同步一次。

三種模式:

單主模式:具有故障轉移功能,高可用叢集方式採用。

雙主模式:需要採用共享cluster檔案系統,如GFS和OCFS2。用於需要從2個節點併發訪問資料的場合,需要特別配置。

複製模式:有三種不同複製方式,協議A、協議B、協議C,一般使用協議C,只有在本地和遠端節點的磁碟已經確認了寫操作完成,寫才會被認為完成,沒有任何資料丟失。

2、Heartbeat叢集系統軟體

heartbeatLinux-HA)的工作原理heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網路鏈路和串列埠進行,而且支援冗餘鏈路,它們之間相互傳送報文來告訴對方自己當前的狀態,如果在指定的時間內未受到對方傳送的報文,那麼就認為對方失效,這時需啟動資源接管模組來接管運 行在對方主機上的資源或者服務。

Heartbeat:(心跳檢測)本身是整個叢集的基礎(cluster messaging layer),負責維護叢集各節點的資訊以及它們之前通訊;只提供主從備份功能,並不能對各個節點進行監控,需要安裝ldirectord

Resource-agent:(資源代理)就是各種的資源的ocf指令碼,這些指令碼將被LRM呼叫從而實現各種資源啟動、停止、監控等等。

Cluster-glue:相當於一箇中間層,可以將heartbeat和crm(pacemaker)聯絡起來,主要包含2個部分,LRM和STONITH;

Ldirectord:主要配合LVS使用,負責real-server健康檢查,自動將real-server中當機的機器移除,不再分配請求。

3、IP分配

系統:CentOS6.4_x64

主機名 角色
IP地址
db-master
主MySQL

eth0:192.168.0.10/24

eth0:172.0.0.1/24

db-backup 備MySQL

eth0:192.168.0.20/24

eth0:172.0.0.2/24


VIP 192.168.0.100/24

4、配置兩臺節點解析主機名

vi /etc/hosts

192.168.0.202   db-master

192.168.0.203   db-backup

二、安裝MySQL

1
2
3
4
[root@db-master ~]# yum install -y mysql mysql-server  #兩個節點簡單安裝,僅做測試用
[root@db-master ~]# vi /etc/my.cnf
datadir=/data  #修改後的資料庫存放目錄
[root@db-master ~]# /etc/init.d/mysqld start

三、安裝DRBD(兩個節點配置是完全一樣的)

drbd軟體下載:http://oss.linbit.com/drbd/

1、下載並安裝對應的drbd內件:

http://mirror.symnds.com/distributions/elrepo/elrepo/el6/x86_64/RPMS/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@db-master ~]# yum install -y gcc gcc-c++ make perl kernel-devel kernel-headers flex #安裝依賴包
[root@db-master ~]# rpm -vih drbd84-utils-8.4.4-2.el6.elrepo.x86_64.rpm kmod-drbd84-8.4.4-1.el6.elrepo.x86_64.rpm
[root@db-master ~]# tar zxvf drbd-8.4.4.tar.gz
[root@db-master ~]# cd drbd-8.4.4
[root@db-master drbd-8.4.4]# ./configure --prefix=/usr/local/drbd --with-km #--with-km,啟用核心模組
[root@db-master drbd-8.4.4]# make KDIR=/usr/src/kernels/2.6.32-358.23.2.el6.x86_64/ #指定核心原始碼路徑,根據自己系統來
[root@db-master drbd-8.4.4]# make install
[root@db-master drbd-8.4.4]# chkconfig --add drbd
[root@db-master drbd-8.4.4]# chkconfig drbd on
[root@db-master drbd-8.4.4]# cp drbd/drbd.ko /lib/modules/`uname -r`/kernel/lib/   #載入DRBD模組到核心中
[root@db-master ~]# modprobe drbd
[root@db-master ~]# lsmod | grep drbd  #由此檢視drbd模組已經載入
drbd                  333755  0
libcrc32c               1246  1 drbd

2、配置DRBD

1
2
3
4
[root@db-master drbd-8.4.4]# cd /usr/local/drbd/
[root@db-master drbd]# cat etc/drbd.conf #主配置是載入全域性配置檔案和資源配置檔案
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@db-master drbd]# vi etc/drbd.d/global_common.conf  #全域性配置檔案
global {
    usage-count yes#參加DRBD使用者統計
    }
common {
    protocol C;      #使用同步協議C,收到寫入確認就認為完成了寫入操作
disk {
    on-io-error detach;  #當磁碟錯誤時,不連線
    }
syncer
    {
    rate 100M;       #設定主裝置節點同步時的網路速率最大值,預設最大1G
    }
 }
resource mysql {   #mysql定義資源的名字
          on  db-master {             #on開頭,後面是主機名稱
          device    /dev/drbd0;       #drbd裝置名稱
          disk      /dev/sdb1;        #drbd0使用的磁碟分割槽為sdb1
          address  192.168.0.10:7789; #設定drbd監聽地址與埠
          meta-disk  internal;
      }
          on  db-backup {             #on開頭,後面是主機名稱
          device    /dev/drbd0;       #drbd裝置名稱
          disk      /dev/sdb1;        #drbd0使用的磁碟分割槽為sdb1
          address  192.168.0.20:7789; #設定drbd監聽地址與埠
          meta-disk  internal;
      }
}

3、建立供DRBD記錄資訊資料塊

1
2
3
4
5
6
[root@db-master ~]# drbdadm create-md mysql
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
1
[root@db-backup ~]# drbdadm create-md mysql

#啟動兩臺DRBD

1
2
3
4
5
[root@db-master~]# mkdir -p /usr/local/drbd/var/run/drbd  #建立資源目錄
[root@db-master drbd]# service drbd start
[root@db-master drbd]# netstat -tuplna | grep 7789 #檢視已經啟動drbd
tcp  0  0 192.168.0.10:7789    192.168.0.203:33216  ESTABLISHED -
tcp  0  0 192.168.0.10:7789    192.168.0.203:44977

4、預設沒有分主備節點的,需要設定

1
2
3
4
[root@db-master drbd]# cat /proc/drbd #檢視drbd狀態,顯示兩個節點預設都處於Secondary狀態
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C

說明:
cs:兩臺資料連線狀態

ro:兩臺主機的狀態

ds:磁碟狀態是“UpToDate/UpToDate”,同步狀態。

#初始化裝置並設定主備節點

1
2
3
4
[root@db-master drbd]# drbdadm primary mysql #指定本機為主節點
/dev/drbd0: State change failed: (-2) Need access to UpToDate data   #報錯,執行下條命令
[root@db-master drbd]# drbdadm -- --overwrite-data-of-peer primary all
[root@db-backup ~]# drbdadm secondary mysql   #本機設定從節點

 #再檢視狀態

1
2
[root@masternfs ~]# drbd-overview  
  0:mysql/0  Connected Primary/Secondary UpToDate/UpToDate C r-----

5、格式化並掛載分割槽到/data目錄

1
2
3
[root@db-master drbd]# mkfs.ext3 /dev/drbd0
[root@db-master drbd]# mkdir /data
[root@db-master drbd]# mount /dev/drbd0 /data/

四、安裝Heartbeat(主備節點配置相同

軟體下載:http://www.linux-ha.org/wiki/Downloads

安裝依賴包:

1
yum install-y gcc gcc-c++ autoconf libtool pkgconfig glib2-devel libxslt-devel libxml2-devel bzip2-devel libtool-ltdl-devel libuuid-devel docbook-style-xsl

建立需要的組和使用者

1
2
groupadd haclient
useradd-g haclient -s /sbin/nologin-Mhacluster

1.安裝資源接管服務(要先安裝資源接管服務,否則安裝心跳服務會報錯)

1
2
3
4
5
tar zxvf Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2
cd Reusable-Cluster-Components-glue--glue-1.0.9
./autogen.sh
./configure
make && make install

2.安裝心跳檢測服務

1
2
3
4
tar jxvf Heartbeat-3-0-7e3a82377fa8.tar.bz2
cd Heartbeat-3-0-7e3a82377fa8
./ConfigureMeconfigure
make && make install

3.安裝資源代理服務

1
2
3
4
5
tar jxvf ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz
cd ClusterLabs-resource-agents-b735277
./autogen.sh
./configure
make && make install

4、配置heartbeat

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@db-master ~]# vi /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacility local0 #如果未定義上述日誌,預設寫入/var/log/message
keepalive 2      #心跳間隔
deadtime 30      #死亡閥值
warntime 10      #警告時間
initdead 120     #首次啟動heartbeat,等待多久才啟動主服務資源
udpport 694      #連線埠
ucast eth1 172.0.0.2 #對方IP,採用網路卡的eth1組織心跳,後跟介面IP
auto_failback on #當主節點故障恢復後,自動獲取資源並取代從節點
node master      #主節點主機名
node slave       #備份節點主機名
ping 192.168.0.1 #選擇ping節點,ping的越好對HA叢集越穩定,建議使用閘道器
1
2
3
[root@db-master ~]# vi /etc/ha.d/authkeys
auth 2
2 sha1 HI!

1
2
[root@db-master ~]# vi /etc/ha.d/haresources
db-master IPaddr::192.168.0.100/24/eth0:0 drbddisk::mysql Filesystem::/dev/drbd0::/data::ext4 mysqld

說明:

db-master IPaddr::192.168.0.204/24/eth0:0  #主機名,後跟虛擬IP地址和介面

drbddisk::data  #啟動drbd data資源

Filesystem::/dev/drbd0::/data::ext4  #掛載/dev/drbd0到/data

mysqld   #服務啟動指令碼,相當於/etc/init.d/mysql stop/start

五、測試主從切換

主伺服器

1
2
3
[root@db-master ~]# umount /data
[root@db-master ~]# mkdir /data/test #建立一個測試檔案
[root@db-master ~]# drbdadm secondary r0

備伺服器

1
2
3
[root@db-master ~]# drbdadm primary r0
[root@db-master ~]# mount /dev/drbd0 /data
[root@db-master ~]# ls /data  #檢視test目錄存在

六、DRBD使用中問題解決

1>.伺服器重啟,必須手動執行modprobe drbd才能載入模組

答:這個是可以設定的,如加入rc.local裡面,但不推薦。

主伺服器故障恢復後,DRBD應該保留人工介入啟動,主備切換已經算完成了高可用任務了,所以涉及資料方面還是謹慎為好,修復故障機應該人工來操作的。

2>.主從切換沒問題,master故障後,所有寫的資料都在備機上,當master恢復後,此時,資料會同步過去嗎?試驗說明,資料被master上資料覆蓋,備機新增資料丟失。

情況一:開啟了auto_failback on引數。

主機故障恢復後,先不要啟動heartbeat,先載入DRBD到核心並啟動DRBD資源,確保當前提供服務的備機和故障主機資料一致,可以cat /proc/drbd檢視狀態,如果兩邊不一致,需要把資料推回到故障機,保持兩邊同步,然後再啟動heartbeat完成自動切換。

情況二:沒有開啟或關閉了auto_failback引數

主機故障恢復後,將DRBD載入到核心,啟動heartbeat,正常情況DRBD狀態應該是同步狀態或正在同步狀態。如果未同步,可以先啟動DRBD資源,確保當前提供服務的備機和故障主機資料一致,然後在當前提供服務的備機執行hb_standby命令完成切換。

3>.兩臺資料庫都需要關機,啟動後造成腦裂(這次腦裂原因是開機自動DRBD造成的)

檢視狀態cat /porc/drbd可以看到:

0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C

解決方法:首先在備機節點設定從 drbdadm secondary all

如果主機連線狀態顯示WFConnection則執行drbdadm connect all,再設定主 drbdadm — –overwrite-data-of-peer primary all

最後檢視狀態 cat /porc/drbd已經恢復了主從,資料也是同步狀態。


相關文章