一、DRBD概述
1、DRBD簡單介紹
DRBD的全稱爲:Distributed ReplicatedBlock Device(DRBD)分佈式塊設備複製,DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。其實現方式是通過網絡來鏡像整個設備。你可以把它看作是一種網絡RAID。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。
2、DRBD工作原理
每個設備(drbd 提供了不止一個設備)都有一個狀態,可能是‘主’狀態或‘從’狀態。在主節點上,應用程序應能運行和訪問drbd設備(/dev/drbd*)。每次寫入都會發往本地磁盤設備和從節點設備中。從節點只能簡單地把數據寫入它的磁盤設備上。 讀取數據通常在本地進行。 如果主節點發生故障,心跳(heartbeat或corosync)將會把從節點轉換到主狀態,並啓動其上的應用程序。(如果您將它和無日誌FS 一起使用,則需要運行fsck)。如果發生故障的節點恢復工作,它就會成爲新的從節點,而且必須使自己的內容與主節點的內容保持同步。當然,這些操作不會干擾到後臺的服務。
3、DRBD與HA 集羣
大部分現行高可用性集羣(如:惠普、IBM、Dell)使用的是共享存儲器,因此存儲器連接多個節點(用共享的SCSI 總線或光纖通道就可以做到)。DRBD 也可以作爲一個共享的設備,但是它並不需要任何不常見的硬件。它在IP 網絡中運行,而且在價格上IP 網絡要比專用的存儲網絡經濟的多。
目前,DRBD 每次只允許對一個節點進行讀寫訪問,這對於通常的故障切換高可用性集羣來講已經足夠用了。現在的版本將支持兩個節點同時進行讀寫存取。這很有用,比如對GFS 來講就是如此。兼容性DRBD可以在IDE、SCSI 分區和整個驅動器之上運行,但不能在迴路模塊設備上運行。(如果您硬要這樣做,它就會發生死鎖)。DRBD 也不能在回送網絡設備中運行。(因爲它同樣會發生死鎖:所有請求都會被髮送設備佔用,發送流程也會阻塞在sock_sendmsg()中。有時,接收線程正從網絡中提取數據塊,並試圖把它放在高速緩存器中;但系統卻要把一些數據塊從高速緩存器中取到磁盤中。這種情況往往會在接收器的環境下發生,因爲所有的請求都已經被接收器塊佔用了。
4、DRBD複製模式
協議A:異步複製協議。本地寫成功後立即返回,數據放在發送buffer中,可能丟失。
協議B:內存同步(半同步)複製協議。本地寫成功並將數據發送到對方後立即返回,如果雙機掉電,數據可能丟失。
協議C:同步複製協議。本地和對方寫成功確認後返回。如果雙機掉電或磁盤同時損壞,則數據可能丟失。
一般用協議C,但選擇C協議將影響流量,從而影響網絡時延。爲了數據可靠性,我們在生產環境中還是用C協議。
5、DRBD 配置工具
drbdadm:高級管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta發送指令。
drbdsetup:配置裝載進kernel的DRBD模塊,平時很少直接用。
drbdmeta:管理META數據結構,平時很少直接用。
6、DRBD配置文件
DRBD的主配置文件爲/etc/drbd.conf;爲了管理的便捷性,目前通常會將些配置文件分成多個部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。通常,/etc/drbd.d目錄中的配置文件爲global_common.conf和所有以.res結尾的文件。其global_common.conf中主要定義global段和common段,而每一個.res的文件用於定義一個資源。
在配置文件中,global段僅能出現一次,且如果所有的配置信息都保存至同一個配置文件中而不分開爲多個文件的話,global段必須位於配置文件的最開始處。目前global段中可以定義的參數僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段則用於定義被每一個資源默認繼承的參數,可以在資源定義中使用的參數都可以在common段中定義。實際應用中,common段並非必須,但建議將多個資源共享的參數定義爲common段中的參數以降低配置文件的複雜度。
resource段則用於定義drbd資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須爲其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數均可以從common段或drbd的默認中進行繼承而無須定義。
二、實驗環境的搭建:
節點服務器域名 | IP地址 | 操作系統 | 軟件版本 |
node1.gulong.com | 172.16.8.5 | Centos6.5 | corosync-1.4.1-17.el6.x86_64 pacemaker-1.1.10-14.el6.x86_64 |
node2.gulong.com | 172.16.8.8 | Centos6.5 | corosync-1.4.1-17.el6.x86_64 pacemaker-1.1.10-14.el6.x86_64 |
注:本實驗基於上篇博客http://584014981.blog.51cto.com/8605371/1398761 構建好2個高可用節點,分別安裝好corosync,pacemaker,crmsh軟件!具體步驟就不詳述了。
三、DRBD的安裝
1.下載
drbd共有兩部分組成:內核模塊和用戶空間的管理工具。其中drbd內核模塊代碼已經整合進Linux內核2.6.33以後的版本中,因此,如果您的內核版本高於此版本的話,你只需要安裝管理工具即可;否則,您需要同時安裝內核模塊和管理工具兩個軟件包,並且此兩者的版本號一定要保持對應。
目前適用CentOS 5的drbd版本主要有8.0、8.2、8.3三個版本,其對應的rpm包的名字分別爲drbd, drbd82和drbd83,對應的內核模塊的名字分別爲kmod-drbd, kmod-drbd82和kmod-drbd83。而適用於CentOS 6的版本爲8.4,其對應的rpm包爲drbd和drbd-kmdl,但在實際選用時,要切記兩點:drbd和drbd-kmdl的版本要對應;另一個是drbd-kmdl的版本要與當前系統的內容版本(#uname -r)相對應。各版本的功能和配置等略有差異;我們實驗所用的平臺爲x86_64且系統爲CentOS 6.5,因此需要同時安裝內核模塊和管理工具。
Centos6.5下載地址:
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
2、安裝,由於drbd包沒有依賴關係,可以直接使用rpm安裝
[root@node2 ~]# rpm -ivh drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm [root@node1 ~]# rpm -ivh drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm
3、修改配置文件
我們先在node1上面來修改配置
編輯/etc/drbd.d/global_common.conf配置文件如下:
global { usage-count no; //讓linbit公司收集目前drbd的使用情況,yes爲參加,我們這裏不參加設置爲no # minor-count dialog-refresh disable-ip-verification } common { //提供共享配置 protocol C; //協議版本 C爲同步複製 handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. 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 } options { //可以不配置,使用默認即可 # cpu-mask on-no-data-accessible } disk { # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout on-io-error detach; //同步錯誤的做法是分離 } net { # protocol timeout max-epoch-size max-buffers unplug-watermark # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle cram-hmac-alg "sha1"; //設置加密算法sha1 shared-secret "mydrbdlab"; //設置加密key } }
4、準備磁盤設備,雙方節點都需要準備
# fdisk /dev/sdb
使用此分區命令分別在2個節點上創建2個大小爲4G的分區sdb2!
注:如果發現不了新增分區,可以使用以下命令來探測:
# partx -a /dev/sdb
5、添加資源
資源格式說明:
Resource name:可以是除了空白字符的任意的ACSII碼字符
DRBD device:在雙方節點上,此DRBD設備的設備文件;一般爲/dev/drbdN,其主設備號147
Disk configuration:在雙方節點上,各自提供的存儲設備
[root@node1 ~]# vim /etc/drbd.d/web.res //添加如下內容 resource web { //資源名爲“web” on node1.gulong.com { //設置節點 device /dev/drbd0; //指出drbd的標示名 disk /dev/sdb2; //指出作爲drbd的設備 address 172.16.8.5:7789; //指定ip和端口號 meta-disk internal; //網絡通信屬性,指定drbd的元數據在本機 } on node2.gulong.com { device /dev/drbd0; disk /dev/sdb2; address 172.16.8.8:7789; meta-disk internal; } }
6、同步配置文件到node2
[root@node1 drbd.d]# scp global_common.conf web.res node2.gulong.com:/etc/drbd.d/
7、node1與node2上初始化資源
[root@node1 ~]# drbdadm create-md web [root@node2 ~]# drbdadm create-md web //出現以下信息就表示成功 Writing meta data... initializing activity log NOT initializing bitmap New drbd meta data block successfully created.
8、啓動DRBD
[root@node1 ~]# service drbd start [root@node2 ~]# service drbd start
9、查看一下狀態
[root@node1 ~]# drbd-overview //此命令查看狀態 0:web/0Connected Secondary/SecondaryInconsistent/InconsistentC r----- //2個節點都是從節點
10、設置node1爲主節點
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary web [root@node1 ~]# drbd-overview #node1爲主節點 0:web/0 SyncSource Primary/Secondary UpToDate/Inconsistent C r---n- [>...................] sync'ed: 5.1% (19440/20476)M //注:大家可以看到正在同步數據,得要一段時間 [root@node2 ~]# drbd-overview #node2爲從節點 0:web/0 SyncTarget Secondary/Primary Inconsistent/UpToDate C r----- [==>.................] sync'ed: 17.0% (17016/20476)M //同步完成後,查看一下 [root@node1 ~]# drbd-overview 0:web/0 Connected Primary/Secondary UpToDate/UpToDate C r----- [root@node2 ~]# drbd-overview 0:web/0 Connected Secondary/Primary UpToDate/UpToDate C r-----
11、格式化並掛載
[root@node1 ~]# mke2fs -j /dev/drbd [root@node1 ~]# mkdir /mydata //創建mysql的數據目錄 [root@node1 ~]# mount /dev/drbd0 /mydata
四、MariaDB的配置
1、下載mariaDB:
//創建mysql用戶與數據目錄 [root@node1 ~]# groupadd -g 3306 mysql [root@node1 ~]# useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node1 ~]# cd /mydata/ [root@node1 mydata]# mkdir data [root@node1 mydata]# chown -R mysql.mysql /mydata/data/ //編譯安裝MariaDB [root@node1 ~]# tar xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local [root@node1 ~]# cd /usr/local/ [root@node1 local]# ln -sv mariadb-10.0.10-linux-x86_64 mysql [root@node1 ~]# chown -R root:mysql /usr/local/mysql/* [root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql
2、提供配置文件:
[root@node1 ~]# cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf [root@node1 ~]# vim /etc/my.cnf //增加一行 datadir = /mydata/data
3、提供服務腳本:
[root@node1 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [root@node1 ~]# chmod +x /etc/init.d/mysqld
4、修改PATH環境變量
# vim /etc/profile.d/mysql.sh //添加如下內容: export PATH=/usr/local/mysql/bin:$PATH
5、關閉mysql並設置開機不啓動
[root@node1 ~]# service mysqld stop [root@node1 data]# chkconfig mysqld off
在node2上也這樣安裝好MariaDB!
五、crmsh 資源管理
1、關閉drbd並設置開機不啓動
//node1上的設置 [root@node1 ~]# service drbd stop [root@node1 ~]# chkconfig drbd off //node2上的設置 [root@node2 ~]# service drbd stop [root@node2 ~]# chkconfig drbd off
2、增加drbd資源
[root@node1 ~]# crm crm(live)# configure crm(live)configure# property stonith-enabled=false crm(live)configure# property no-quorum-policy=ignore crm(live)configure# rsc_defaults resource-stickiness=100 crm(live)configure# verify crm(live)configure# commit //以上參數設置了就不要設置了 crm(live)configure# primitive mysqldrbd ocf:linbit:drbd params drbd_resource=web op start timeout=240 op stop timeout=100 op monitor role=Master interval=20 timeout=30 op monitor role=Slave interval=30 timeout=30 crm(live)configure# ms ms_mysqldrbd mysqldrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true crm(live)configure# verify crm(live)configure# commit
查看狀態:
3.增加文件系統資源
crm(live)configure# primitive drbd ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60 crm(live)configure# verify crm(live)configure# colocation drbd_with_ms_mysqldrbd inf: drbd ms_mysqldrbd:Master crm(live)configure# order drbd_after_ms_mysqldrbd inf: ms_mysqldrbd:promote drbd:start crm(live)configure# verify crm(live)configure# commit
查看狀態:
我們去node2上看看有沒有掛載上:
4.增加mysql資源
crm(live)configure# primitive mysqld lsb:mysqld crm(live)configure# colocation mysqld_with_drbd inf: mysqld drbd crm(live)configure# verify crm(live)configure# order mysqld_after_mystore inf: drbd mysqld crm(live)configure# verify crm(live)configure# show crm(live)configure# commit
正常狀態:
在node2上查看mysql是否自動啓動!
5.增加vip資源
crm(live)# configure crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=172.16.8.1 nic=eth0 cidr_netmask=16 op monitor interval=20 timeout=30 crm(live)configure# colocation vip_with_ms_mysqldrbd inf: ms_mysqldrbd:Master vip crm(live)configure# order vip_before_ms_mysqldrbd inf: vip ms_mysqldrbd:promote crm(live)configure# verify crm(live)configure# show
查看狀態:
在node1上看看ip狀態
六、遠程測試高可用mysql
(1).新增授權
[root@node1 ~]# mysql MariaDB [(none)]> grant all on *.* to root@"172.16.8.%" identified by "123456"; MariaDB [(none)]> flush privileges;
(2).遠程測試
[root@station142 ~]# mysql -uroot -p123456 -h 172.16.8.1
如圖:
(3).模擬一下故障
[root@node1 ~]# crm crm(live)# node crm(live)node# standby
(4).再進行遠程測試
MariaDB [(none)]>create database testdb; No connection. Trying to reconnect... Connection id: 1 Current database: *** NONE *** Query OK, 1 row affected (0.42 sec) MariaDB [(none)]> show databases; +---------------------+ | Database | +---------------------+ | #mysql50#lost+found | | OMG | | hellodb | | information_schema | | mysql | | performance_schema | | t1 | | t3 | | t5 | | test | | wowo | | testdb | +---------------------+ 12 rows in set (0.78 sec)
大家可以看到依然可以訪問,因此基於drbd的高可用mysql已經配置完成!