------本文大綱
簡介
DRBD資源屬性
原理
安裝DRDB
DRDB實作高可用
============
一、簡介
DRBD是一種塊裝置,可以被用于高可用(HA)之中。它類似于一個網絡RAID-1功能。當你将資料寫入本地檔案系統時,資料還将會被發送到網絡中另一台主機上。以相同的形式記錄在一個檔案系統中。本地(主節點)與遠端主機(備節點)的資料可以保證明時同步。當本地系統出現故障時,遠端主機上還會保留有一份相同的資料,可以繼續使用。在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣。因為資料同時存在于本地主機和遠端主機上。切換時,遠端主機隻要使用它上面的那份備份資料,就可以繼續進行服務了。
二、DRBD資源屬性
resource name
可以使用除空白字元外的任意ACSII表中的字元;
drbd裝置
drbd的裝置的通路路徑,裝置檔案/dev/drbd#;
disk
各節點為組成此drbd裝置所提供的塊裝置,通常是一個磁盤分區;
網絡屬性
節點間為了實作跨主機磁盤鏡像而使用的網絡配置;
注意:使用者空間工具與drdb與核心中使用的子產品版本要保持一緻,隻有在使用drbdadm工具時才會讀取配置檔案,對多個資源的公共配置,可以提取出來隻配置一次,通常儲存在Common中,此外還有global配置,這種配置跟資源本身沒有關系的;
三、原理
<a href="http://s3.51cto.com/wyfs02/M02/25/80/wKiom1NhbnjyRON3AAF1bsI5qmM739.jpg" target="_blank"></a>
需要知道,DRBD是工作在系統核心空間,而不是使用者空間,它直接複制的是二進制資料,這是它速度快的根本原因。
其次,DRBD至少需要兩個節點來工作,一主一次。
DRBD的檔案同步過程和普通複制過程的不同:
DRBD在資料進入Buffer Cache時,先經過DRBD這一層,複制一份資料經過TCP/IP協定封裝,發送到另一個節點上,另一個節點通過TCP/IP協定來接受複制過來的資料,同步到次節點的DRBD裝置上。
DRBD底層裝置支援
DRBD需要建構在底層裝置之上,然後建構出一個塊裝置出來。對于使用者來說,一個DRBD裝置,就像是一塊實體的磁盤,可以在上面内建立檔案系統。DRBD所支援的底層裝置有以下這些類:
1、一個磁盤,或者是磁盤的某一個分區;
2、一個soft raid 裝置;
3、一個LVM的邏輯卷;
DRBD在遠端傳輸上支援三種模式:
協定A:異步複制協定
隻要主節點完成本地寫操作就認為寫操作完成,并且需要複制的資料包會被存放本地TCP發送緩存中,當發生failover故障,資料可能會丢失。
協定B:記憶體同步(半同步,semi-synchronous)複制協定
當本地磁盤的寫己經完成,并且複制資料包己經到達對應從節點,此時主節點才認為磁盤寫入己經完成,failover不會導緻資料丢失,但當所有節點同時出現故障時,主節點上多數最新寫入的資料可能丢失。
協定C:同步複制
隻有在本地和遠端磁盤都确定寫入己完成後,主節點才會認為寫入完成。這樣可確定發生單點故障時不會導緻任何資料丢失,如果發生資料丢失,那也隻會在所有節點同時存在錯誤存儲時才會發生這種情況
角色、模式
角色
在drbd構造的叢集中,資源具有角色的概念,分别為primary和secondary。
所有設為primary的資源将不受限制進行讀寫操作。可以建立檔案系統,可以使用裸裝置,甚至直接io。所有設為secondary的裝置中不能挂載,不能讀寫
模式
drbd也有drbd mode:單主模型(主從),雙主模型
在單主模型下drbd可以使用任意的檔案系統
單在雙主模型下隻能使用叢集檔案系統,常用的開源的叢集檔案系統有:ocfs2和gfs2
四、安裝DRDB
前提:
設定主機名(要與uname -n一緻,主機名可解析)
時間同步
無密鑰登入
本機環境
系統
主機名
ip位址
Centos6.5 x86_64
essun.node1.com
192.168.1.109
essun.node2.com
192.168.1.108
注:
核心子產品程式包一定要跟你的系統核心保持一緻,uname -r檢視你的核心版本,核心子產品的版本必須要嚴格對應,而使用者空間的子產品就不那麼嚴格要求了,兩個節點的時間也需要保持一緻性;
第一步、下載下傳與核心版本相應的核心子產品與使用者空間工具(位址:http://packages.atrpms.net/dist/el6/drbd/)
1
2
3
4
5
<code>[root@essun download]</code><code># uname -r</code>
<code>2.6.32-431.el6.x86_64</code>
<code>[root@essun download]</code><code># ls</code>
<code>drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm</code>
<code>[root@essun download]</code><code># yum isntall drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm -y</code>
修改配置檔案(/etc/drbd.d/global_common.conf)
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<code>[root@essun drbd.d]</code><code># vim global_common.conf</code>
<code>[root@essun drbd.d]</code><code># cat global_common.conf</code>
<code>global {</code>
<code> </code><code>usage-count no;</code>
<code># 是否參加DRBD使用者統計.預設是yes</code>
<code> </code><code># minor-count dialog-refresh disable-ip-verification</code>
<code>}</code>
<code> </code>
<code>common {</code>
<code> </code><code>handlers {</code>
<code> </code><code># These are EXAMPLE handlers only.</code>
<code> </code><code># They may have severe implications,</code>
<code> </code><code># like hard resetting the node under certain circumstances.</code>
<code> </code><code># Be careful when chosing your poison.</code>
<code> </code><code>pri-on-incon-degr </code><code>"/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"</code><code>;</code>
<code> </code><code>pri-lost-after-sb </code><code>"/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"</code><code>;</code>
<code> </code><code>local</code><code>-io-error </code><code>"/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"</code><code>;</code>
<code> </code><code># fence-peer "/usr/lib/drbd/crm-fence-peer.sh";</code>
<code> </code><code># split-brain "/usr/lib/drbd/notify-split-brain.sh root";</code>
<code> </code><code># out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";</code>
<code> </code><code># before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";</code>
<code> </code><code># after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;</code>
<code> </code><code>}</code>
<code> </code><code>startup {</code>
<code> </code><code># wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb</code>
<code> </code>
<code> </code><code>#wfc-timeout 120;</code>
<code> </code><code>#(等待另一個節點上線的逾時時長)</code>
<code> </code><code># degr-wfc-timeout 240;</code>
<code> </code><code>#(等待逾時後做降級處理)</code>
<code> </code><code>#outdated-wfc-timeout</code>
<code> </code><code>#(過期的等待逾時)</code>
<code> </code>
<code> </code><code># wait-after-sb</code>
<code> </code><code>#(腦裂之後等待多長時長)</code>
<code> </code><code>options {</code>
<code> </code><code># cpu-mask on-no-data-accessible</code>
<code> </code><code>disk {</code>
<code> </code><code># size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes</code>
<code> </code><code>on-io-error detach;</code>
<code> </code><code># 同步錯誤的做法是分離</code>
<code> </code><code># disk-drain md-flushes resync-rate resync-after al-extents</code>
<code> </code><code># c-plan-ahead c-delay-target c-fill-target c-max-rate</code>
<code> </code><code># c-min-rate disk-timeout</code>
<code> </code><code>net {</code>
<code> </code><code>protocol C;</code>
<code> </code><code># 使用協定C.表示收到遠端主機的寫入确認後,則認為寫入完成.</code>
<code> </code><code>cram-hmac-alg </code><code>"sha1"</code><code>;</code>
<code> </code><code>shared-secret </code><code>"drdb.essun.drdb.org"</code><code>;</code>
<code> </code><code># 設定主備機之間通信使用的資訊算法.</code>
<code> </code><code># protocol timeout max-epoch-size max-buffers unplug-watermark</code>
<code> </code><code># connect-int ping-int sndbuf-size rcvbuf-size ko-count</code>
<code> </code><code># allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri</code>
<code> </code><code># after-sb-1pri after-sb-2pri always-asbp rr-conflict</code>
<code> </code><code># ping-timeout data-integrity-alg tcp-cork on-congestion</code>
<code> </code><code># congestion-fill congestion-extents csums-alg verify-alg</code>
<code> </code><code># use-rle</code>
<code> </code><code>syncer {</code>
<code> </code><code>rate 1000M;</code>
<code> </code><code># 設定主備節點同步時的網絡速率最大值,機關是位元組.</code>
提供實體塊裝置(兩個節點的分區号最好相同),不需要格式化
<code>[root@essun drbd.d]</code><code># fdisk -cu /dev/s</code>
<code>scd0 sda1 sg0 shm/ snd/ stderr stdout</code>
<code>sda sda2 sg1 snapshot sr0 stdin systty</code>
<code>[root@essun drbd.d]</code><code># fdisk -cu /dev/sda</code>
<code>Command (m </code><code>for</code> <code>help): p</code>
<code>Disk </code><code>/dev/sda</code><code>: 128.8 GB, 128849018880 bytes</code>
<code>255 heads, 63 sectors</code><code>/track</code><code>, 15665 cylinders, total 251658240 sectors</code>
<code>Units = sectors of 1 * 512 = 512 bytes</code>
<code>Sector size (logical</code><code>/physical</code><code>): 512 bytes / 512 bytes</code>
<code>I</code><code>/O</code> <code>size (minimum</code><code>/optimal</code><code>): 512 bytes / 512 bytes</code>
<code>Disk identifier: 0x0006c47d</code>
<code> </code><code>Device Boot Start End Blocks Id System</code>
<code>/dev/sda1</code> <code>* 2048 411647 204800 83 Linux</code>
<code>/dev/sda2</code> <code>411648 126240767 62914560 8e Linux LVM</code>
<code>Command (m </code><code>for</code> <code>help): n</code>
<code>Command action</code>
<code> </code><code>e extended</code>
<code> </code><code>p primary partition (1-4)</code>
<code>p</code>
<code>Partition number (1-4): 3</code>
<code>First sector (126240768-251658239, default 126240768):</code>
<code>Using default value 126240768</code>
<code>Last sector, +sectors or +size{K,M,G} (126240768-251658239, default 251658239): +10G</code>
<code>Command (m </code><code>for</code> <code>help): w</code>
<code>The partition table has been altered!</code>
<code>Calling ioctl() to re-</code><code>read</code> <code>partition table.</code>
<code>WARNING: Re-reading the partition table failed with error 16: Device or resource busy.</code>
<code>The kernel still uses the old table. The new table will be used at</code>
<code>the next reboot or after you run partprobe(8) or kpartx(8)</code>
<code>Syncing disks.</code>
<code>[root@essun drbd.d]</code><code># partx -a /dev/sda</code>
<code>BLKPG: Device or resource busy</code>
<code>error adding partition 1</code>
<code>error adding partition 2</code>
<code>error adding partition 3</code>
定義DRBD磁盤資源
<code>[root@essun drbd.d]</code><code># vim dbresouce.res</code>
<code>resource dbresource {</code>
<code> </code><code>on essun.node1.com { </code><code>#on說明在哪個節點上,跟uname -n保持一緻</code>
<code> </code><code>device </code><code>/dev/drbd0</code><code>; </code><code>#在磁盤上表現的drbd叫什麼名;</code>
<code> </code><code>disk </code><code>/dev/sda3</code><code>; </code><code>#所使用的實體磁盤裝置是哪個;</code>
<code> </code><code>address 192.168.1.109:7789; </code><code>#在node1這個節點上監聽的套接字,預設監聽在7789端口上;</code>
<code> </code><code>meta-disk internal; </code><code>#儲存drbd源資料資訊,表示就放在自己的磁盤區分上,也可以放在外部的磁盤上;</code>
<code> </code><code>}</code>
<code> </code><code>on essun.node2.com{</code>
<code> </code><code>device </code><code>/dev/drbd0</code><code>;</code>
<code> </code><code>disk </code><code>/dev/sda3</code><code>;</code>
<code> </code><code>address 192.168.1.108:7789;</code>
<code> </code><code>meta-disk internal;</code>
<code> </code><code>} </code>
将這兩個檔案拷貝到node1中的相同目錄下
<code>[root@essun drbd.d]</code><code># scp dbresouce.res global_common.conf essun.node1.com:/etc</code>
<code>/drbd</code><code>.d/</code>
<code>dbresouce.res 100% 259 0.3KB</code><code>/s</code> <code>00:00</code>
<code>global_common.conf 100% 2044 2.0KB</code><code>/s</code> <code>00:00</code>
<code>[root@essun drbd.d]</code><code>#</code>
在各自的節點上初始化資源
<code>[root@essun drbd.d]</code><code># drbdadm create-md dbresource</code>
<code>#初始化資源清單</code>
<code>Writing meta data...</code>
<code>initializing activity log</code>
<code>NOT initializing bitmap</code>
<code>lk_bdev_save(</code><code>/var/lib/drbd/drbd-minor-0</code><code>.lkbd) failed: No such </code><code>file</code> <code>or directory</code>
<code>New drbd meta data block successfully created.</code>
<code>[root@essun drbd.d]</code><code># service drbd start</code>
<code>#啟動服務</code>
<code>Starting DRBD resources: [</code>
<code> </code><code>create res: dbresource</code>
<code> </code><code>prepare disk: dbresource</code>
<code> </code><code>adjust disk: dbresource</code>
<code> </code><code>adjust net: dbresource</code>
<code>]</code>
<code>.</code>
<code>[root@essun drbd.d]</code><code># drbd-overview</code>
<code>#檢視drbd的狀态</code>
<code> </code><code>0:dbresource</code><code>/0</code> <code>Connected Secondary</code><code>/Secondary</code> <code>Inconsistent</code><code>/Inconsistent</code> <code>C r-----</code>
<code>[root@essun drbd.d]</code><code># watch -n 1 'cat /proc/drbd'</code>
<code>#實時檢視drbd的狀态</code>
<code>Every 1.0s: </code><code>cat</code> <code>/proc/drbd</code> <code>Thu May 1 08:48:23 2014</code>
<code>version: 8.4.3 (api:1</code><code>/proto</code><code>:86-101)</code>
<code>GIT-</code><code>hash</code><code>: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00</code>
<code> </code><code>0: cs:Connected ro:Secondary</code><code>/Secondary</code> <code>ds:Inconsistent</code><code>/Inconsistent</code> <code>C r-----</code>
<code> </code><code>ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10485404</code>
上面表示兩個節點的drbd都是從的,這是因為我們并沒有對其中任何一個提升主的。
将其中一個節點的DRBD資源提升為主資源
<code>[root@essun drbd.d]</code><code># drbdadm primary --force dbresource</code>
<code>#将目前節點的drbd資源提升為主資源</code>
<code>[root@essun drbd.d]</code><code># drbd</code>
<code> </code><code>0:dbresource</code><code>/0</code> <code>SyncSource Primary</code><code>/Secondary</code> <code>UpToDate</code><code>/Inconsistent</code> <code>C r---n-</code>
<code> </code><code>[>...................] </code><code>sync</code><code>'ed: 6.1% (9624</code><code>/10236</code><code>)M</code>
初始化之後(角色己經發生改變了)
<code> </code><code>0:dbresource</code><code>/0</code> <code>Connected Primary</code><code>/Secondary</code> <code>UpToDate</code><code>/UpToDate</code> <code>C r-----</code>
格式化DRBD
<code>[root@essun drbd.d]</code><code># mke2fs -t ext4 /dev/drbd0</code>
<code>mke2fs 1.41.12 (17-May-2010)</code>
<code>Filesystem label=</code>
<code>OS </code><code>type</code><code>: Linux</code>
<code>Block size=4096 (log=2)</code>
<code>Fragment size=4096 (log=2)</code>
<code>Stride=0 blocks, Stripe width=0 blocks</code>
<code>655360 inodes, 2621351 blocks</code>
<code>131067 blocks (5.00%) reserved </code><code>for</code> <code>the super user</code>
<code>First data block=0</code>
<code>Maximum filesystem blocks=2684354560</code>
<code>80 block </code><code>groups</code>
<code>32768 blocks per group, 32768 fragments per group</code>
<code>8192 inodes per group</code>
<code>Superblock backups stored on blocks:</code>
<code> </code><code>32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632</code>
<code>Writing inode tables: </code><code>done</code>
<code>Creating journal (32768 blocks): </code><code>done</code>
<code>Writing superblocks and filesystem accounting information: </code><code>done</code>
<code>This filesystem will be automatically checked every 28 mounts or</code>
<code>180 days, whichever comes first. Use tune2fs -c or -i to override.</code>
<code>[root@essun drbd.d]</code><code># mount /dev/drbd0 /mnt</code>
<code>[root@essun drbd.d]</code><code># cd mnt</code>
<code>-</code><code>bash</code><code>: </code><code>cd</code><code>: mnt: No such </code><code>file</code> <code>or directory</code>
<code>[root@essun drbd.d]</code><code># cd /mnt</code>
<code>[root@essun mnt]</code><code># ls</code>
<code>lost+found</code>
<code>[root@essun mnt]</code><code># cp /etc/inittab .</code>
<code>inittab lost+found</code>
<code>[root@essun mnt]</code><code>#</code>
提升另一個節點的DRBD資源
<code>[root@essun /]# umount /mnt</code>
<code>#解除安裝drbd</code>
<code>[root@essun /]# drbdadm secondary dbresource</code>
<code># 降級DRBD資源</code>
<code>[root@essun /]# drbd-overview</code>
<code> </code><code>0</code><code>:dbresource/</code><code>0</code> <code>Connected Secondary/Secondary UpToDate/UpToDate C r-----</code>
<code>#以下是在另一個節點操作</code>
<code>[root@essun ~]# drbdadm primary dbresource</code>
<code>[root@essun ~]# mount /dev/drbd0 /mnt</code>
<code>[root@essun ~]# cd /mnt</code>
<code>[root@essun mnt]# ls</code>
如果想讓DRBD能夠自動切換的話,就要借助于messages layer程式了。
首先在對DRBD降級,停止服務,禁止開機自動啟動
<code>[root@essun /]</code><code># umount /mnt</code>
<code>[root@essun /]</code><code># drbdadm secondary dbresource</code>
<code>[root@essun /]</code><code># drbd-overview</code>
<code> </code><code>0:dbresource</code><code>/0</code> <code>Connected Secondary</code><code>/Secondary</code> <code>UpToDate</code><code>/UpToDate</code> <code>C r-----</code>
<code>[root@essun /]</code><code># service drbd stop</code>
<code>Stopping all DRBD resources: .</code>
<code>[root@essun /]</code><code># chkconfig drbd off</code>
<code>[root@essun /]</code><code># chkconfig --list drbd</code>
<code>drbd 0:off 1:off 2:off 3:off 4:off 5:off 6:off</code>
第二步、安裝mariadb
<code>[root@essun download]</code><code># tar xf mariadb-10.0.10-linux-x86_64.tar.gz</code>
<code>[root@essun download]</code><code># mv mariadb-10.0.10-linux-x86_64 /usr/local</code>
<code>[root@essun download]</code><code># cd /usr/local/</code>
<code>[root@essun </code><code>local</code><code>]</code><code># ln -s mariadb-10.0.10-linux-x86_64 mysql</code>
<code>[root@essun </code><code>local</code><code>]</code><code># groupadd -r mysql</code>
<code>[root@essun </code><code>local</code><code>]</code><code># useradd -r -g mysql mysql</code>
<code>[root@essun </code><code>local</code><code>]</code><code># chown -R mysql.mysql mari/</code>
啟動DRBD服務,提升主資源
<code>[root@essun ~]</code><code># service drbd start</code>
<code>[root@essun </code><code>local</code><code>]</code><code># drbd-overview</code>
挂載資料目錄
<code>[root@essun </code><code>local</code><code>]</code><code># mkdir /mariadb</code>
<code>[root@essun </code><code>local</code><code>]</code><code># mount /dev/drbd0 /mariadb/</code>
<code>[root@essun </code><code>local</code><code>]</code><code># cd /mariadb/</code>
<code>[root@essun mariadb]</code><code># mkdir {data,logs}</code>
<code>[root@essun mariadb]</code><code># ls</code>
<code>data logs lost+found</code>
<code>[root@essun /]</code><code># chown -R mysql.mysql /mariadb/</code>
<code>[root@essun /]</code><code># ll /mariadb/</code>
<code>total 24</code>
<code>drwxr-xr-x 2 mysql mysql 4096 May 1 11:09 data</code>
<code>drwxr-xr-x 2 mysql mysql 4096 May 1 11:09 logs</code>
<code>drwx------ 2 mysql mysql 16384 May 1 09:42 lost+found</code>
此目錄在另一個節點上也要一樣。
修改配置檔案與添加啟動腳本
<code>[root@essun mari]</code><code># cp support-files/my-large.cnf /etc/cnf</code>
<code>[root@essun mari]</code><code># vim /etc/my.cnf</code>
<code>[root@essun mari]</code><code># grep -v "^#" /etc/my.cnf |grep -v "</code>
<code>[client]</code>
<code>port = 3306</code>
<code>socket = </code><code>/tmp/mysql</code><code>.sock</code>
<code>[mysqld]</code>
<code>skip-external-locking</code>
<code>key_buffer_size = 256M</code>
<code>max_allowed_packet = 1M</code>
<code>table_open_cache = 256</code>
<code>sort_buffer_size = 1M</code>
<code>read_buffer_size = 1M</code>
<code>read_rnd_buffer_size = 4M</code>
<code>myisam_sort_buffer_size = 64M</code>
<code>thread_cache_size = 8</code>
<code>query_cache_size= 16M</code>
<code>thread_concurrency = 8</code>
<code>datadir=</code><code>/mariadb/data</code>
<code>log-bin=</code><code>/mariadb/logs/mysql-bin</code>
<code>binlog_format=mixed</code>
<code>server-</code><code>id</code> <code>= 1</code>
<code>[mysqldump]</code>
<code>quick</code>
<code>max_allowed_packet = 16M</code>
<code>[mysql]</code>
<code>no-auto-rehash</code>
<code>[myisamchk]</code>
<code>key_buffer_size = 128M</code>
<code>sort_buffer_size = 128M</code>
<code>read_buffer = 2M</code>
<code>write_buffer = 2M</code>
<code>[mysqlhotcopy]</code>
<code>interactive-timeout</code>
<code>[root@essun mari]</code><code># cp support-files/mysql.server /etc/rc.d/init.d/mari</code>
<code>[root@essun mari]</code><code># chmod +x /etc/rc.d/init.d/mari</code>
<code>[root@essun mari]</code><code># chkconfig --add mari</code>
<code>[root@essun mari]</code><code># chkconfig mari off</code>
初始化資料庫,并登入測試
<code>[root@essun mari]</code><code># scripts/mysql_install_db --user=mysql --datadir=/mariadb/data/</code>
<code>Installing MariaDB</code><code>/MySQL</code> <code>system tables </code><code>in</code> <code>'/mariadb/data/'</code> <code>...</code>
<code>140501 11:22:15 [Note] InnoDB: The InnoDB memory heap is disabled</code>
<code>140501 11:22:15 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins</code>
<code>140501 11:22:15 [Note] InnoDB: Compressed tables use zlib 1.2.3</code>
<code>........省略中........</code>
<code>Please report any problems at http:</code><code>//mariadb</code><code>.org</code><code>/jira</code>
<code>The latest information about MariaDB is available at http:</code><code>//mariadb</code><code>.org/.</code>
<code>You can </code><code>find</code> <code>additional information about the MySQL part at:</code>
<code>http:</code><code>//dev</code><code>.mysql.com</code>
<code>Support MariaDB development by buying support</code><code>/new</code> <code>features from</code>
<code>SkySQL Ab. You can contact us about this at [email protected].</code>
<code>Alternatively consider joining our community based development effort:</code>
<code>http:</code><code>//mariadb</code><code>.com</code><code>/kb/en/contributing-to-the-mariadb-project/</code>
<code>[root@essun </code><code>local</code><code>]</code><code># service mari start</code>
<code>Starting MySQL........ [ OK ]</code>
<code>[root@essun </code><code>local</code><code>]</code><code># /usr/local/mysql/bin/mysql</code>
<code>Welcome to the MariaDB monitor. Commands end with ; or \g.</code>
<code>Your MariaDB connection </code><code>id</code> <code>is 4</code>
<code>Server version: 10.0.10-MariaDB-log MariaDB Server</code>
<code>Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.</code>
<code>Type </code><code>'help;'</code> <code>or </code><code>'\h'</code> <code>for</code> <code>help. Type </code><code>'\c'</code> <code>to </code><code>clear</code> <code>the current input statement.</code>
<code>MariaDB [(none)]> show databases;</code>
<code>+--------------------+</code>
<code>| Database |</code>
<code>| information_schema |</code>
<code>| mysql |</code>
<code>| performance_schema |</code>
<code>| </code><code>test</code> <code>|</code>
<code>4 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
<code>MariaDB [(none)]></code>
到另一個節點測試一下,先停止服務,解除安裝、降級
<code>[root@essun </code><code>local</code><code>]</code><code># service mari stop</code>
<code>Shutting down MySQL.. [ OK ]</code>
<code>[root@essun </code><code>local</code><code>]</code><code># umount /mariadb/</code>
<code>[root@essun </code><code>local</code><code>]</code><code># drbdadm secondary dbresource</code>
<code>[root@essun </code><code>local</code><code>]</code><code># scp /etc/my.cnf essun.node1.com:/etc/</code>
<code>my.cnf 100% 4936 4.8KB</code><code>/s</code> <code>00:00</code>
<code>[root@essun </code><code>local</code><code>]</code><code># scp -p /etc/rc.d/init.d/mari essun.node1.com:/etc/rc.d/init.d/</code>
<code>mari 100% 11KB 11.4KB</code><code>/s</code> <code>00:00</code>
<code>[root@essun </code><code>local</code><code>]</code><code>#</code>
<code>==============以下是另一個節點的操作</code>
<code>[root@essun ~]</code><code># mkdir /mariadb</code>
<code>[root@essun ~]</code><code># drbdadm primary dbresource</code>
<code>[root@essun ~]</code><code># drbd-overview</code>
<code>[root@essun ~]</code><code># chown -R mysql.mysql /mariadb/</code>
<code>[root@essun ~]</code><code># mount /dev/drbd0 /mariadb/</code>
<code>[root@essun ~]</code><code># cd /mariadb/</code>
<code>[root@essun mariadb]</code><code># ll</code>
<code>drwxr-xr-x 5 mysq mysql 4096 May 1 11:29 data</code>
<code>drwxr-xr-x 2 mysq mysql 4096 May 1 11:29 logs</code>
<code>drwx------ 2 mysq mysql 16384 May 1 09:42 lost+found</code>
<code>[root@essun /]</code><code># service mari start</code>
<code>Starting MySQL....... [ OK ]</code>
<code>[root@essun /]</code><code># /usr/local/mysql/bin/mysql</code>
<code>4 rows </code><code>in</code> <code>set</code> <code>(0.03 sec)</code>
兩個節點都要停止服務
<code>[root@essun /]</code><code># service mari stop</code>
<code>[root@essun /]</code><code># chkconfig mari off</code>
<code>[root@essun /]</code><code># chkconfig --list mari</code>
<code>mari 0:off 1:off 2:off 3:off 4:off 5:off 6:off</code>
<code>Stopping all DRBD resources:</code>
第三步、安裝corosync、pacemaker
<code>[root@essun download]</code><code># yum install corosync pacemaker -y</code>
<code>[root@essun download]</code><code># yum install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm -y</code>
修改配置檔案,生成密鑰
<code>[root@essun /]</code><code># cd /etc/corosync/</code>
<code>[root@essun corosync]</code><code># ls</code>
<code>corosync.conf.example service.d</code>
<code>corosync.conf.example.udpu uidgid.d</code>
<code>[root@essun corosync]</code><code># cp corosync.conf.example corosync.conf</code>
<code>[root@essun corosync]</code><code># vim corosync.conf</code>
<code>[root@essun corosync]</code><code># cat corosync.conf</code>
<code># Please read the corosync.conf.5 manual page</code>
<code>compatibility: whitetank</code>
<code>totem {</code>
<code> </code><code>version: 2</code>
<code> </code><code>secauth: off</code>
<code> </code><code>threads: 0</code>
<code> </code><code>interface {</code>
<code> </code><code>ringnumber: 0</code>
<code> </code><code>bindnetaddr: 192.168.1.1</code>
<code> </code><code>mcastaddr: 226.94.1.1</code>
<code> </code><code>mcastport: 5405</code>
<code> </code><code>ttl: 1</code>
<code>logging {</code>
<code> </code><code>fileline: off</code>
<code> </code><code>to_stderr: no</code>
<code> </code><code>to_logfile: </code><code>yes</code>
<code> </code><code>to_syslog: no</code>
<code> </code><code>logfile: </code><code>/var/log/cluster/corosync</code><code>.log</code>
<code> </code><code>debug: off</code>
<code> </code><code>timestamp: on</code>
<code> </code><code>logger_subsys {</code>
<code> </code><code>subsys: AMF</code>
<code> </code><code>debug: off</code>
<code>amf {</code>
<code> </code><code>mode: disabled</code>
<code>service {</code>
<code> </code><code>name: pacemaker</code>
<code> </code><code>ver: 0</code>
<code>aisexce {</code>
<code> </code><code>user: root</code>
<code> </code><code>group: root</code>
<code>[root@essun corosync]</code><code># mv /dev/random /dev/x</code>
<code>[root@essun corosync]</code><code># mv /dev/urandom /dev/random</code>
<code>[root@essun corosync]</code><code># corosync-keygen</code>
<code>Corosync Cluster Engine Authentication key generator.</code>
<code>Gathering 1024 bits </code><code>for</code> <code>key from </code><code>/dev/random</code><code>.</code>
<code>Press keys on your keyboard to generate entropy.</code>
<code>Writing corosync key to </code><code>/etc/corosync/authkey</code><code>.</code>
<code>[root@essun corosync]</code><code># mv /dev/random /dev/urandom</code>
<code>[root@essun corosync]</code><code># mv /dev/x /dev/random</code>
将這兩個檔案複制到另一個節點上一份
<code>[root@essun corosync]</code><code># scp authkey corosync.conf essun.node1.com:/etc/corosync/</code>
<code>authkey 100% 128 0.1KB</code><code>/s</code> <code>00:00</code>
<code>corosync.conf 100% 554 0.5KB</code><code>/s</code> <code>00:00</code>
<code>[root@essun corosync]</code><code>#</code>
啟動服務(兩個節點都要啟動服務)
<code>[root@essun corosync]</code><code># service corosync start</code>
<code>Starting Corosync Cluster Engine (corosync): [ OK ]</code>
<code>[root@essun corosync]</code><code># crm status</code>
<code>Last updated: Thu May 1 10:05:25 2014</code>
<code>Last change: Thu May 1 10:05:21 2014 via crmd on essun.node2.com</code>
<code>Stack: classic openais (with plugin)</code>
<code>Current DC: essun.node2.com - partition with quorum</code>
<code>Version: 1.1.10-14.el6_5.3-368c726</code>
<code>2 Nodes configured, 2 expected votes</code>
<code>0 Resources configured</code>
<code>Online: [ essun.node1.com essun.node2.com ]</code>
禁用stonith裁決,忽略投票規則
<code>crm(live)configure# property stonith-enabled=</code><code>false</code>
<code>crm(live)configure# property no-quorum-policy=ignore</code>
<code>crm(live)configure# verify</code>
<code>crm(live)configure# commit</code>
<code>crm(live)configure# show</code>
<code>node essun.node1.com</code>
<code>node essun.node2.com</code>
<code>property $id=</code><code>"cib-bootstrap-options"</code> <code>\</code>
<code> </code><code>dc-version=</code><code>"1.1.10-14.el6_5.3-368c726"</code> <code>\</code>
<code> </code><code>cluster-infrastructure=</code><code>"classic openais (with plugin)"</code> <code>\</code>
<code> </code><code>expected-quorum-votes=</code><code>"2"</code> <code>\</code>
<code> </code><code>stonith-enabled=</code><code>"false"</code> <code>\</code>
<code> </code><code>no-quorum-policy=</code><code>"ignore"</code>
定義VIP,mariadb服務
<code>crm(live)configure</code><code># primitive vip ocf:heartbeat:IPaddr params ip=192.168.1.150 op monitor interval=20s timeout=20s on-fail=restart</code>
<code>crm(live)configure</code><code># verify</code>
<code>crm(live)configure</code><code># primitive myserver lsb:mari op monitor interval=20s timeout=20s on-fail=restart</code>
<code>crm(live)configure</code><code># commit</code>
<code>crm(live)configure</code><code># show</code>
<code>node essun.node1.com \</code>
<code> </code><code>attributes standby=</code><code>"off"</code>
<code>primitive myserver lsb:mari \</code>
<code> </code><code>op</code> <code>monitor interval=</code><code>"20s"</code> <code>timeout=</code><code>"20s"</code> <code>on-fail=</code><code>"restart"</code>
<code>primitive vip ocf:heartbeat:IPaddr \</code>
<code> </code><code>params ip=</code><code>"192.168.1.150"</code> <code>\</code>
<code>property $</code><code>id</code><code>=</code><code>"cib-bootstrap-options"</code> <code>\</code>
<code> </code><code>dc</code><code>-version=</code><code>"1.1.10-14.el6_5.3-368c726"</code> <code>\</code>
配置drdb叢集資源
<code>crm(live)configure</code><code># primitive dbdrbd ocf:linbit:drbd params drbd_resource=dbresource op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s op start timeout=240s interval=0 op stop timeout=100s interval=0</code>
<code> </code><code>attributes standby=</code><code>"off"</code>
<code>primitive dbdrbd ocf:linbit:drbd \</code>
<code> </code><code>params drbd_resource=</code><code>"dbresource"</code> <code>\</code>
<code> </code><code>op</code> <code>monitor role=</code><code>"Master"</code> <code>interval=</code><code>"50s"</code> <code>timeout=</code><code>"30s"</code> <code>\</code>
<code> </code><code>op</code> <code>monitor role=</code><code>"Slave"</code> <code>interval=</code><code>"60s"</code> <code>timeout=</code><code>"30s"</code> <code>\</code>
<code> </code><code>op</code> <code>start timeout=</code><code>"240s"</code> <code>interval=</code><code>"0"</code> <code>\</code>
<code> </code><code>op</code> <code>stop timeout=</code><code>"100s"</code> <code>interval=</code><code>"0"</code>
<code> </code><code>op</code> <code>monitor interval=</code><code>"20s"</code> <code>timeout=</code><code>"20s"</code> <code>on-fail=</code><code>"restart"</code>
<code> </code><code>params ip=</code><code>"192.168.1.150"</code> <code>\</code>
<code> </code><code>dc</code><code>-version=</code><code>"1.1.10-14.el6_5.3-368c726"</code> <code>\</code>
<code> </code><code>cluster-infrastructure=</code><code>"classic openais (with plugin)"</code> <code>\</code>
<code> </code><code>expected-quorum-votes=</code><code>"2"</code> <code>\</code>
<code> </code><code>stonith-enabled=</code><code>"false"</code> <code>\</code>
<code> </code><code>no-quorum-policy=</code><code>"ignore"</code>
drbd需要同時運作在兩個節點上,但隻能有一個節點(primary/secondary模型)是Master,而另一個節點為Slave;是以,它是一種比較特殊的叢集資源,其資源類型為多态(Multi-state)clone類型,即主機節點有Master和Slave之分,且要求服務剛啟動時兩個節點都處于slave狀态,一般來說,隻要是定義克隆資源,首先其本身必須是主資源
<code>crm(live)configure# ms ms_dbdrdb dbdrbd meta master-max=</code><code>1</code> <code>master-node-max=</code><code>1</code> <code>clone-max=</code><code>2</code> <code>clone-node-max=</code><code>1</code> <code>notify=</code><code>true</code>
<code>crm(live)configure# show ms_dbdrdb</code>
<code>ms ms_dbdrdb dbdrbd \</code>
<code> </code><code>meta master-max=</code><code>"1"</code> <code>master-node-max=</code><code>"1"</code> <code>clone-max=</code><code>"2"</code> <code>clone-node-max=</code><code>"1"</code> <code>notify=</code><code>"true"</code>
到node1驗證一下,看看是不是變成了主資源
<code>[root@essun /]</code><code># ip addr show</code>
<code>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN</code>
<code> </code><code>link</code><code>/loopback</code> <code>00:00:00:00:00:00 brd 00:00:00:00:00:00</code>
<code> </code><code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo</code>
<code> </code><code>inet6 ::1</code><code>/128</code> <code>scope host</code>
<code> </code><code>valid_lft forever preferred_lft forever</code>
<code>2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>
<code> </code><code>link</code><code>/ether</code> <code>00:0c:29:bf:c2:82 brd ff:ff:ff:ff:ff:ff</code>
<code> </code><code>inet 192.168.1.109</code><code>/24</code> <code>brd 255.255.255.255 scope global eth0</code>
<code> </code><code>inet 192.168.1.150</code><code>/24</code> <code>brd 255.255.255.255 scope global secondary eth0</code>
<code> </code><code>inet6 fe80::20c:29ff:febf:c282</code><code>/64</code> <code>scope link tentative dadfailed</code>
定義檔案系統資源(以便挂載DRBD的主資源,此處挂載的是mariadb的資料目錄)
<code>crm(live)configure</code><code># primitive dbstore ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mariadb fstype=ext4 op monitor interval40s timeout=40s op start timeout=60s interval=0 op stop timeout=60 interval=0</code>
<code>WARNING: CIB changed </code><code>in</code> <code>the meantime: won't </code><code>touch</code> <code>it!</code>
<code>Do you still want to commit? y</code>
<code>crm(live)configure</code><code># show dbstore</code>
<code>primitive dbstore ocf:heartbeat:Filesystem \</code>
<code> </code><code>params device=</code><code>"/dev/drbd0"</code> <code>directory=</code><code>"/mariadb"</code> <code>fstype=</code><code>"ext4"</code> <code>\</code>
<code> </code><code>op</code> <code>monitor timeout=</code><code>"40s"</code> <code>interval=</code><code>"0"</code> <code>interval40s \</code>
<code> </code><code>op</code> <code>start timeout=</code><code>"60s"</code> <code>interval=</code><code>"0"</code> <code>\</code>
<code> </code><code>op</code> <code>stop timeout=</code><code>"60"</code> <code>interval="0</code>
結合drbd的特性,隻能在drbd服務将某節點設定為Primary以後方可啟動。是以,還需要為這兩個資源建立排列限制和順序限制。
<code>colocation vip_with_myserver inf: vip myserver</code>
<code>crm(live)configure</code><code># colocation myserver_with_dbststore inf: myserver</code>
<code>dbstore</code>
<code>crm(live)configure</code><code># colocation dbstore_with_ms_dbdrbd inf: dbstore ms_dbdrdb:Master</code>
<code>crm(live)configure</code><code># order ms_dbdrbd_before_dbstore inf: ms_dbdrdb:promote dbstore:start</code>
<code>crm(live)configure</code><code># order vip_before_myserver inf: vip myserver</code>
<code>crm(live)configure</code><code># order dbstore_before_myserver inf: dbstore:start myserver:start</code>
<code>crm(live)</code><code># status</code>
<code>Last updated: Thu May 1 15:29:04 2014</code>
<code>Last change: Thu May 1 15:28:55 2014 via crmd on essun.node2.com</code>
<code>5 Resources configured</code>
<code> </code><code>vip (ocf::heartbeat:IPaddr): Started essun.node1.com</code>
<code> </code><code>myserver (lsb:mari): Started essun.node1.com</code>
<code> </code><code>Master</code><code>/Slave</code> <code>Set: ms_dbdrdb [dbdrbd]</code>
<code> </code><code>Masters: [ essun.node1.com ]</code>
<code> </code><code>Slaves: [ essun.node2.com ]</code>
<code> </code><code>dbstore (ocf::heartbeat:Filesystem): Started essun.node1.com</code>
到節點node1上看一下maridb下是否己經挂載DRBD的主資源
<code>[root@essun mariadb]</code><code># hostname</code>
<code>essun.node1.com</code>
<code>data logs lost+found</code>
這己表示在DRBD己經挂載到node1的mariadb目下
第四步、測試高可用mariadb
授權測試使用者
<code>MariaDB [(none)]> grant all on *.* to root@</code><code>'192.168.1.%'</code> <code>identified by </code><code>'mari'</code><code>;</code>
<code>Query OK, 0 rows affected (0.00 sec)</code>
使用vip登入測試
<code>essun.node2.com</code>
<code>[root@essun mariadb]</code><code># /usr/local/mysql/bin/mysql -uroot -p -h192.168.1.150</code>
<code>Enter password:</code>
<code>Your MariaDB connection </code><code>id</code> <code>is 6</code>
<code>4 rows </code><code>in</code> <code>set</code> <code>(0.08 sec)</code>
模拟節點node1故障
<code>crm(live)node# standby essun.node1.com</code>
<code>[root@essun ~]# crm status</code>
<code>Last updated: Thu May </code><code>1</code> <code>16</code><code>:</code><code>28</code><code>:</code><code>59</code> <code>2014</code>
<code>Last change: Thu May </code><code>1</code> <code>16</code><code>:</code><code>27</code><code>:</code><code>34</code> <code>2014</code> <code>via crmd on essun.node2.com</code>
<code>Stack: classic openais (</code><code>with</code> <code>plugin)</code>
<code>Current DC: essun.node1.com - partition </code><code>with</code> <code>quorum</code>
<code>Version: </code><code>1.1</code><code>.</code><code>10</code><code>-</code><code>14</code><code>.el6_5.</code><code>3</code><code>-368c726</code>
<code>2</code> <code>Nodes configured, </code><code>2</code> <code>expected votes</code>
<code>5</code> <code>Resources configured</code>
<code>Node essun.node1.com: standby</code>
<code>Online: [ essun.node2.com ]</code>
<code> </code><code>vip (ocf::heartbeat:IPaddr): Started essun.node2.com</code>
<code> </code><code>myserver (lsb:mari): Started essun.node2.com</code>
<code> </code><code>Master/Slave Set: ms_dbdrdb [dbdrbd]</code>
<code> </code><code>Masters: [ essun.node2.com ]</code>
<code> </code><code>Stopped: [ essun.node1.com ]</code>
<code> </code><code>dbstore (ocf::heartbeat:Filesystem): Started essun.node2.com</code>
再次使用vip登入測試
<code>Your MariaDB connection </code><code>id</code> <code>is 9</code>
<code>4 rows </code><code>in</code> <code>set</code> <code>(1.28 sec)</code>
<code></code>
本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1405326,如需轉載請自行聯系原作者