一、DRBD概述
1、DRBD简单介绍
DRBD的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。你可以把它看作是一种网络RAID。它允许用户在远程机器上建立一个本地块设备的实时镜像。
2、DRBD工作原理
每个设备(drbd 提供了不止一个设备)都有一个状态,可能是‘主’状态或‘从’状态。在主节点上,应用程序应能运行和访问drbd设备(/dev/drbd*)。每次写入都会发往本地磁盘设备和从节点设备中。从节点只能简单地把数据写入它的磁盘设备上。 读取数据通常在本地进行。 如果主节点发生故障,心跳(heartbeat或corosync)将会把从节点转换到主状态,并启动其上的应用程序。(如果您将它和无日志FS 一起使用,则需要运行fsck)。如果发生故障的节点恢复工作,它就会成为新的从节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。
3、DRBD与HA 集群
大部分现行高可用性集群(如:惠普、IBM、Dell)使用的是共享存储器,因此存储器连接多个节点(用共享的SCSI 总线或光纤通道就可以做到)。DRBD 也可以作为一个共享的设备,但是它并不需要任何不常见的硬件。它在IP 网络中运行,而且在价格上IP 网络要比专用的存储网络经济的多。
目前,DRBD 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。现在的版本将支持两个节点同时进行读写存取。这很有用,比如对GFS 来讲就是如此。兼容性DRBD可以在IDE、SCSI 分区和整个驱动器之上运行,但不能在回路模块设备上运行。(如果您硬要这样做,它就会发生死锁)。DRBD 也不能在回送网络设备中运行。(因为它同样会发生死锁:所有请求都会被发送设备占用,发送流程也会阻塞在sock_sendmsg()中。有时,接收线程正从网络中提取数据块,并试图把它放在高速缓存器中;但系统却要把一些数据块从高速缓存器中取到磁盘中。这种情况往往会在接收器的环境下发生,因为所有的请求都已经被接收器块占用了。
4、DRBD复制模式
协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。
协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。
协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。
一般用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境中还是用C协议。
5、DRBD 配置工具
drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令。
drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用。
drbdmeta:管理META数据结构,平时很少直接用。
6、DRBD配置文件
DRBD的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。
在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。
resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
二、实验环境的搭建:
节点服务器域名 | IP地址 | 操作系统 | 软件版本 |
node1.gulong.com | 172.16.8.5 | Centos6.5 | corosync-1.4.1-17.el6.x86_64 pacemaker-1.1.10-14.el6.x86_64 |
node2.gulong.com | 172.16.8.8 | Centos6.5 | corosync-1.4.1-17.el6.x86_64 pacemaker-1.1.10-14.el6.x86_64 |
注:本实验基于上篇博客http://584014981.blog.51cto.com/8605371/1398761 构建好2个高可用节点,分别安装好corosync,pacemaker,crmsh软件!具体步骤就不详述了。
三、DRBD的安装
1.下载
drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。
目前适用CentOS 5的drbd版本主要有8.0、8.2、8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd, kmod-drbd82和kmod-drbd83。而适用于CentOS 6的版本为8.4,其对应的rpm包为drbd和drbd-kmdl,但在实际选用时,要切记两点:drbd和drbd-kmdl的版本要对应;另一个是drbd-kmdl的版本要与当前系统的内容版本(#uname -r)相对应。各版本的功能和配置等略有差异;我们实验所用的平台为x86_64且系统为CentOS 6.5,因此需要同时安装内核模块和管理工具。
Centos6.5下载地址:
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
drbd-8.4.3-33.el6.x86_64.rpm
2、安装,由于drbd包没有依赖关系,可以直接使用rpm安装
[root@node2 ~]# rpm -ivh drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm [root@node1 ~]# rpm -ivh drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm
3、修改配置文件
我们先在node1上面来修改配置
编辑/etc/drbd.d/global_common.conf配置文件如下:
global { usage-count no; //让linbit公司收集目前drbd的使用情况,yes为参加,我们这里不参加设置为no # minor-count dialog-refresh disable-ip-verification } common { //提供共享配置 protocol C; //协议版本 C为同步复制 handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { //可以不配置,使用默认即可 # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb } options { //可以不配置,使用默认即可 # cpu-mask on-no-data-accessible } disk { # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout on-io-error detach; //同步错误的做法是分离 } net { # protocol timeout max-epoch-size max-buffers unplug-watermark # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle cram-hmac-alg "sha1"; //设置加密算法sha1 shared-secret "mydrbdlab"; //设置加密key } }
4、准备磁盘设备,双方节点都需要准备
# fdisk /dev/sdb
使用此分区命令分别在2个节点上创建2个大小为4G的分区sdb2!
注:如果发现不了新增分区,可以使用以下命令来探测:
# partx -a /dev/sdb
5、添加资源
资源格式说明:
Resource name:可以是除了空白字符的任意的ACSII码字符
DRBD device:在双方节点上,此DRBD设备的设备文件;一般为/dev/drbdN,其主设备号147
Disk configuration:在双方节点上,各自提供的存储设备
[root@node1 ~]# vim /etc/drbd.d/web.res //添加如下内容 resource web { //资源名为“web” on node1.gulong.com { //设置节点 device /dev/drbd0; //指出drbd的标示名 disk /dev/sdb2; //指出作为drbd的设备 address 172.16.8.5:7789; //指定ip和端口号 meta-disk internal; //网络通信属性,指定drbd的元数据在本机 } on node2.gulong.com { device /dev/drbd0; disk /dev/sdb2; address 172.16.8.8:7789; meta-disk internal; } }
6、同步配置文件到node2
[root@node1 drbd.d]# scp global_common.conf web.res node2.gulong.com:/etc/drbd.d/
7、node1与node2上初始化资源
[root@node1 ~]# drbdadm create-md web [root@node2 ~]# drbdadm create-md web //出现以下信息就表示成功 Writing meta data... initializing activity log NOT initializing bitmap New drbd meta data block successfully created.
8、启动DRBD
[root@node1 ~]# service drbd start [root@node2 ~]# service drbd start
9、查看一下状态
[root@node1 ~]# drbd-overview //此命令查看状态 0:web/0Connected Secondary/SecondaryInconsistent/InconsistentC r----- //2个节点都是从节点
10、设置node1为主节点
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary web [root@node1 ~]# drbd-overview #node1为主节点 0:web/0 SyncSource Primary/Secondary UpToDate/Inconsistent C r---n- [>...................] sync'ed: 5.1% (19440/20476)M //注:大家可以看到正在同步数据,得要一段时间 [root@node2 ~]# drbd-overview #node2为从节点 0:web/0 SyncTarget Secondary/Primary Inconsistent/UpToDate C r----- [==>.................] sync'ed: 17.0% (17016/20476)M //同步完成后,查看一下 [root@node1 ~]# drbd-overview 0:web/0 Connected Primary/Secondary UpToDate/UpToDate C r----- [root@node2 ~]# drbd-overview 0:web/0 Connected Secondary/Primary UpToDate/UpToDate C r-----
11、格式化并挂载
[root@node1 ~]# mke2fs -j /dev/drbd [root@node1 ~]# mkdir /mydata //创建mysql的数据目录 [root@node1 ~]# mount /dev/drbd0 /mydata
四、MariaDB的配置
1、下载mariaDB:
MariaDB
//创建mysql用户与数据目录 [root@node1 ~]# groupadd -g 3306 mysql [root@node1 ~]# useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node1 ~]# cd /mydata/ [root@node1 mydata]# mkdir data [root@node1 mydata]# chown -R mysql.mysql /mydata/data/ //编译安装MariaDB [root@node1 ~]# tar xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local [root@node1 ~]# cd /usr/local/ [root@node1 local]# ln -sv mariadb-10.0.10-linux-x86_64 mysql [root@node1 ~]# chown -R root:mysql /usr/local/mysql/* [root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data/ --basedir=/usr/local/mysql --user=mysql
2、提供配置文件:
[root@node1 ~]# cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf [root@node1 ~]# vim /etc/my.cnf //增加一行 datadir = /mydata/data
3、提供服务脚本:
[root@node1 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [root@node1 ~]# chmod +x /etc/init.d/mysqld
4、修改PATH环境变量
# vim /etc/profile.d/mysql.sh //添加如下内容: export PATH=/usr/local/mysql/bin:$PATH
5、关闭mysql并设置开机不启动
[root@node1 ~]# service mysqld stop [root@node1 data]# chkconfig mysqld off
在node2上也这样安装好MariaDB!
五、crmsh 资源管理
1、关闭drbd并设置开机不启动
//node1上的设置 [root@node1 ~]# service drbd stop [root@node1 ~]# chkconfig drbd off //node2上的设置 [root@node2 ~]# service drbd stop [root@node2 ~]# chkconfig drbd off
2、增加drbd资源
[root@node1 ~]# crm crm(live)# configure crm(live)configure# property stonith-enabled=false crm(live)configure# property no-quorum-policy=ignore crm(live)configure# rsc_defaults resource-stickiness=100 crm(live)configure# verify crm(live)configure# commit //以上参数设置了就不要设置了 crm(live)configure# primitive mysqldrbd ocf:linbit:drbd params drbd_resource=web op start timeout=240 op stop timeout=100 op monitor role=Master interval=20 timeout=30 op monitor role=Slave interval=30 timeout=30 crm(live)configure# ms ms_mysqldrbd mysqldrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true crm(live)configure# verify crm(live)configure# commit
查看状态:
3.增加文件系统资源
crm(live)configure# primitive drbd ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60 crm(live)configure# verify crm(live)configure# colocation drbd_with_ms_mysqldrbd inf: drbd ms_mysqldrbd:Master crm(live)configure# order drbd_after_ms_mysqldrbd inf: ms_mysqldrbd:promote drbd:start crm(live)configure# verify crm(live)configure# commit
查看状态:
我们去node2上看看有没有挂载上:
4.增加mysql资源
crm(live)configure# primitive mysqld lsb:mysqld crm(live)configure# colocation mysqld_with_drbd inf: mysqld drbd crm(live)configure# verify crm(live)configure# order mysqld_after_mystore inf: drbd mysqld crm(live)configure# verify crm(live)configure# show crm(live)configure# commit
正常状态:
在node2上查看mysql是否自动启动!
5.增加vip资源
crm(live)# configure crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=172.16.8.1 nic=eth0 cidr_netmask=16 op monitor interval=20 timeout=30 crm(live)configure# colocation vip_with_ms_mysqldrbd inf: ms_mysqldrbd:Master vip crm(live)configure# order vip_before_ms_mysqldrbd inf: vip ms_mysqldrbd:promote crm(live)configure# verify crm(live)configure# show
查看状态:
在node1上看看ip状态
六、远程测试高可用mysql
(1).新增授权
[root@node1 ~]# mysql MariaDB [(none)]> grant all on *.* to root@"172.16.8.%" identified by "123456"; MariaDB [(none)]> flush privileges;
(2).远程测试
[root@station142 ~]# mysql -uroot -p123456 -h 172.16.8.1
如图:
(3).模拟一下故障
[root@node1 ~]# crm crm(live)# node crm(live)node# standby
(4).再进行远程测试
MariaDB [(none)]>create database testdb; No connection. Trying to reconnect... Connection id: 1 Current database: *** NONE *** Query OK, 1 row affected (0.42 sec) MariaDB [(none)]> show databases; +---------------------+ | Database | +---------------------+ | #mysql50#lost+found | | OMG | | hellodb | | information_schema | | mysql | | performance_schema | | t1 | | t3 | | t5 | | test | | wowo | | testdb | +---------------------+ 12 rows in set (0.78 sec)
大家可以看到依然可以访问,因此基于drbd的高可用mysql已经配置完成!