------本文大纲
简介
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,如需转载请自行联系原作者