天天看點

DRDB實作mariadb高可用

------本文大綱

簡介

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 &gt; /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 &gt; /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 &gt; /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>[&gt;...................] </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)]&gt; 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)]&gt;</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: &lt;LOOPBACK,UP,LOWER_UP&gt; 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: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; 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)]&gt; 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,如需轉載請自行聯系原作者

繼續閱讀