天天看点

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,如需转载请自行联系原作者

继续阅读