corosync+pacemaker and drbd實現mysql高可用集羣

DRBD:Distributed Replicated Block Device 分佈式複製塊設備,原理圖如下

image_thumb3

DRBD有主雙架構和雙主架構的,當處於主從架構時,這個設備一定只有一個節點是可以讀寫的,另外的節點是不可讀的,連掛載都不可能,只有一個節點是主的,其它節點都是從的。當做爲主主架構時,需要達到幾個條件,1.在高可用集羣中啓用DRBD;  2. 啓用分佈式文件鎖功能,即需要把磁盤格式化爲集羣文件系統(如GFS2,OCFS2等);3. 把DRBD做成資源。

數據的存儲過程:當某個進程存儲數據時在內核中通過DRBD模塊複製一分通過TCP/IP套接字發送到從節點上去,從節點的DRBD在套接字上接收數據並通過DRBD模塊存儲到磁盤,並把結果返回給主節點 。但是內核傳輸的速度很快,而TCP報文的傳輸速度相對來說要慢得多,於是會把數據存入TCP協議棧的發送緩衝區,然後從緩衝區慢慢傳遞到從節點上。這個數據傳輸過程有三個模型:

           A : 異步模型,當內核把DRBD模塊中複製的數據已經以報文方式發送到本地的TCP協議棧的緩衝區,至是從節點的數據是否已經傳送到,保存是否完整,無法保證;

           B : 半同步模型,報文已經發送到從節點的套接字上,已經接收,併發往內核,但從節點的存儲過程沒有迴應過程。

           C:同步模型,報文發往從節點,從節點已經接收,併發往內核,內核已經把數據報文存儲到磁盤,並把結果返回給主節點,這個是默認的數據傳輸模型,可以保證數據的完整性。

 

安裝環境:

centos6.5,安裝corosync和pacemaker過程請參見上一篇博客,上一個環境安裝的配置接口是crmsh,這裏安裝的是pcs,安裝pcs比較簡單,#yum install pcs –y  即可

安裝完成後集羣狀態如下:

image_thumb4

現在看到兩個集羣節點mysql1 mysql2在線,pacemaker是做爲插件在使用的,沒有stonith設備,只有兩個節點,所以quorum也要忽略

#pcs property set stonith-enabled=false 

# pcs property set no-quorum-policy=ignore

#pcs config show                                               查看配置文件

image_thumb5

顯示錯誤還沒有集羣配置文件,stonith已經禁用,quorum已經忽略

安裝drbd:

根據官方文檔,drbd在內核2.6.33版本以後就已經裝載進了內核,不需要再額外安裝drbd,只需要安裝drbdadm管理軟件就行,我這裏用的是centos6.5,內核版本是2.6.32,所以還需要安裝

image_thumb7

drbd版本有8.1 8.2 8.3 8.4,我這裏用的是已經做好的rpm包進行安裝,下載目錄:ftp://rpmfind.net/linux/atrpms/

把drbd的兩個rpm包放在/root目錄下,然後執行# yum --nogpgcheck localinstall *.rpm

--nogpgcheck 不執行gpg檢測,因爲在centos裏面沒有認證文件

image_thumb8

在兩個節點上安裝完成。加載DRBD模塊

[root@mysql1 ~]# modprobe drbd
[root@mysql1 ~]# lsmod | grep drbd
drbd                  325978  0 
libcrc32c               1246  1 drbd
創建一個新的磁盤分區做爲DRBD的共享磁盤,我這裏是xen虛擬機添加的一個磁盤/dev/xvdb,創建的磁盤爲/dev/xvdb1
[root@mysql1 drbd.d]# fdisk /dev/xvdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x218cde3e.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610

Command (m for help): p

Disk /dev/xvdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x218cde3e

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdb1               1        2610    20964793+  83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

在mysql2節點上執行同樣的操作。

配置drbd:

      在/etc目錄下有一個文件drbd.conf 主配置文件,裏面主要調用了/etc/drbd.d/目錄下的配置文件

 image_thumb9

配置/etc/drbd.d/global_common.conf

global {
	usage-count no;
	# minor-count dialog-refresh disable-ip-verification
}

common {
        protocol C;
	handlers {
                pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
                 #fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                 #split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                 #out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                 #before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                 #after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
	}#這個配置文件主要是防止腦裂的發生

	startup {
		# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
                wfc-timeout 120;
                degr-wfc-timeout 120;  	
}

	options {
		# cpu-mask on-no-data-accessible
	}

	disk {
	        on-io-error detach;
                #fencing resource-only;
        }

	net {
                cram-hmac-alg "sha1";
                shared-secret "drbd1";
	}
        syncer {
                rate 1000M;
        }
}

在/etc/drbd.d/目錄下再創建一個磁盤的資源

#vim /etc/drbd.d/stone.res

resource mysql{
  on mysql1 {
    device    /dev/drbd0;
    disk      /dev/xvdb1;
    address   10.204.80.86:7789;
    meta-disk internal;
  }
  on mysql2 {
    device    /dev/drbd0;
    disk      /dev/xvdb1;
    address   10.204.80.85:7789;
    meta-disk internal;
  }
}

把這兩個文件複製到mysql2節點上

然後在兩個節點上初始化資源,分別執行

#drbdadm create-md mysql                                                           --這個資源是在stone.res文件中定義的資源

image_thumb10

顯示初始化成功

啓動drbd服務

#service drbd start

查看drbd狀態

#cat /proc/drbd

image_thumb11

上面的信息兩個節點都處於Secondary 狀態,將mysql1節點設置爲Primary

#drbdadm  primary  --force mysql

image_thumb13

如上所示,數據同步過程已經開始,過一段時間後查看drbd狀態

image_thumb14

顯示資源已經是主從狀態

創建文件系統:

#mke2fs –t ext4 –L drbd /dev/drbd0                  #格式化爲ext4文件系統,並指定label名爲drbd

image_thumb15

創建/data目錄,並掛載分區

#mkdir /data

#mount /dev/drbd0 /data

image_thumb16

掛載成功

在/data目錄中創建 a,b,c,d四個文件,然後再手動切換Primary/Secondary節點

在節點mysql1上執行

#cd /data && touch {a,b,c,d}

#umount /data

#drbdadm secondary mysql

image_thumb17

可以看到drbd的狀態又重新變爲secondary /secondary狀態

在mysql2節點上把drbd節點設置爲Primary 狀態,創建/data 目錄 ,並掛載

#drbdadm primary mysql

#cat /proc/drbd

#mkdir /data

#mount /dev/drbd0 /data

#ls /data

  image_thumb18

可以看到在mysql1節點上創建的a,b,c,d四個文件在mysql2節點上依然存在,drbd共享存儲已經Ok

 

安裝mysql,創建集羣資源,安裝mysql過程略

配置資源資源

pcs創建資源可以用 #pcs ? 可以查看幫助信息

# pcs resource create mysqlip ipaddr ip=10.204.80.89 cidr_netmask=24 nic=eth0      

添加DRBD資源,提供drbd的RA目前由OCF歸類爲linbit,其路徑爲/usr/lib/ocf/resource.d/linbit/drbd。drbd 需要同時運行在兩個節點上,但只能有一個節點(primary/secondary模型)是Master,而另一個節點爲Slave;因此,它是一種比較特殊的集羣資源,其資源類型爲多狀態(Multi-state)clone類型,即主機節點有Master和Slave之分,且要求服務剛啓動時兩個節點都處於slave狀態。

#pcs resource create  primitive mysqldrbd ocf:linbit:drbd params drbd_resource=mysql op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s  op start timeout=240 op stop timeout=100

或者#crm configure primitive mysqldrbd ocf:linbit:drbd params drbd_resource=mysql op monitor role=Master interval=10s timeout=20s op monitor role=Slave interval=20s timeout=20s op start timeout=240 op stop timeout=100

#pcs resource master ms_mysqldrbd mysqldrbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

或者#crm configure ms ms_myqldrbd mysqldrbd  meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

把drbd定義爲clone資源,查看資源狀態#pcs resource show

image_thumb27

但做爲文件系統還需要掛載,把drbd掛載到/data目錄

# pcs resource create drbdfs ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/data" fstype="ext4"

查看資源狀態

image_thumb28

文件系統掛載drbdfs必須和Master mysqldrbd在同一節點上,必須先啓動mysqldrbd然後才能掛載drbdfs文件系統,所以必須定義資源約束

# pcs constraint colocation add  drbdfs with master MS_mysqldrbd

# pcs constraint order promote MS_mysqldrbd then drbdfs                    ###drbd的資源添加完成

# pcs resource create MySQLD lsb:mysqld op monitor interval=20 timeout=20 on-fail=restart ###添加MySQLD 服務資源完成,定義MySQLD的資源約束,必須drbdfs文件系統先掛載然後才能啓動MySQLD服務

# pcs constraint order drbdfs then MySQLD

image_thumb22

 

把mysqlip ,drbdfs 和MySQLD服務定義到同一個資源組

# pcs resource group add myservice mysqlip drbdfs MySQLD

查看資源狀態

image_thumb29

定義資源組的約束

#pcs constraint order mysqlip then promote MS_mysqldrbd then drbdfs then MySQLD

查看集羣的配置信息

#pcs config show

root@mysql1 /]# pcs config show
Cluster Name: 
Corosync Nodes:
 
Pacemaker Nodes:
 mysql1 mysql2 

Resources: 
 Master: ms_mysqldrbd
  Meta Attrs: master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true 
  Resource: mysqldrbd (class=ocf provider=linbit type=drbd)
   Attributes: drbd_resource=mysql 
   Operations: monitor interval=50s role=Master timeout=30s (mysqldrbd-monitor-interval-50s-role-Master)
               monitor interval=60s role=Slave timeout=30s (mysqldrbd-monitor-interval-60s-role-Slave)
 Group: myservice
  Resource: mysqlip (class=ocf provider=heartbeat type=IPaddr)
   Attributes: ip=10.204.80.89 
   Operations: monitor interval=60s (mysqlip-monitor-interval-60s)
  Resource: drbdfs (class=ocf provider=heartbeat type=Filesystem)
   Attributes: device=/dev/drbd0 directory=/data fstype=ext4 
   Operations: monitor interval=60s (drbdfs-monitor-interval-60s)
  Resource: MySQLD (class=lsb type=mysqld)
   Operations: monitor on-fail=restart interval=20 timeout=20 (MySQLD-monitor-interval-20)

Stonith Devices: 
Fencing Levels: 

Location Constraints:
Ordering Constraints:
  promote ms_mysqldrbd then start drbdfs (Mandatory) (id:order-ms_mysqldrbd-drbdfs-mandatory)
  start drbdfs then start MySQLD (Mandatory) (id:order-drbdfs-MySQLD-mandatory)
Colocation Constraints:
  drbdfs with ms_mysqldrbd (INFINITY) (rsc-role:Started) (with-rsc-role:Master) (id:colocation-drbdfs-ms_mysqldrbd-INFINITY-1)

Cluster Properties:
 cluster-infrastructure: classic openais (with plugin)
 dc-version: 1.1.10-14.el6_5.3-368c726
 expected-quorum-votes: 2
 no-quorum-policy: ignore
 stonith-enabled: false
資源狀態情況查看
image_thumb
用其他機器連到10.204.80.89的mysql
image_thumb1
已經可以正常連接,把mysql1設置爲standby 
image_thumb2
發現mysql的集羣已經正常轉移,高可用集羣正常
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章