一、drbd简介
drbd即Distributed Replicated Block Device(分布式磁盘块设备),drbd一个基于软件实现的,不共享任何东西,通过复制的方式在存储之间构建所谓镜像模式机制的磁盘,从而使得一个数据可以存储为多份, drbd的核心功能是在内核中实现。
二、drbd原理
每一个主机都提供一个块设备,块的大小是一模一样的,当主机上的进程需要存储数据时,需要向内核申请,任何用户空间的进程都没有直接操作硬件的权限,事实上驱动磁盘是在内核靠驱动程序来实现的,任何一个进程存储数据,都是通过发起系统调用来实现的(这就是IO),对于drbd来讲,它就是在内核中把系统调用与驱动程序之间添加了一个新的层次,在另外一个节点也是一模一样的;当进程需要存储数据时,存储请求发给内核,内核中有一个层,在接受请求以后,本来应该是通过调度器交由驱动程序往磁盘中写数据的,但这时它经由drbd层,drbd不对此数据做任何修改,它只是把数据复制一份副本,完成兵分两路,即drbd将一份数据送往磁盘驱动,由磁盘驱动来完成本地的存储,另一个份将送往本地的网卡,通过网卡发往对端节点,对端节点接收到数据之后,它知道是drbd通信的,由此就送往drbd模块,drbd收到以后,把数据送往驱动程序,驱动程序完成对磁盘的操作。
它不能两边同时的写数据,通常情况下一个为主的,一个为从的,进程也只能运行在一个节点上,完成读写操作;当一个节点出现故障时,可以把另一个节点提升为主节点,同样的可以提供服务,但此时不能往另一个节点同步数据,如果当另一个节点上线时,新上线的只能做为从节点,来完成数据的同步;
如果要想让两个节点同时工作的话,只有构建成高可用集群,使用分布式集群系统,两个节点互为主/主,即为互备;
三、架构布置
服务器:CentOS 6.6 x86_64;
数据库IP地址即VIP:172.16.9.100;
两个节点分别是:node-02、node-03;相应的IP地址分别为:172.16.9.82,172.16.9.83;
网关服务器:提供时间服务器,网关地址为:172.16.0.1
MySQL版本:mariadb-5.5.43-linux-x86_64.tar.gz
corosync版本:corosync-1.4.7-1.el6.x86_64
pacemaker版本:pacemaker-1.1.12-4.el6.x86_64
crmsh版本:crmsh-2.1-1.6.x86_64.rpm
crmsh依赖包:pssh-2.3.1-2.el6.x86_64.rpm
drbd版本:drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm
drbd内核补丁:kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm
四、实验拓扑
使用两台主机分别在两台主机新建一个分区,此分区用于存储MySQL数据库文件,在两个节点分别安装corosync、pacemaker和drbd用于实现MySQL的高可用,通过crmsh程序对pacemaker进行配置,当其中一个节点出现问题时用于前端访问的VIP地址将被移到另一个节点上,并挂载drbd同步的分区数据库存储文件,然后启动MySQL数据库程序,以实现在两个节点上实现MySQL高可用。
现在我们要将drbd配置成corosync集群可用的一个资源,drbd比较的特别它有两个服务,在两个节点上都要运行为主从备份,要把drbd配置成clone资源来进行使用,是一个特殊的clone类型为主从类型。
五、准备工作
在构建高可用集群服务器时需要做四个准备工作,分别是:
①节点间时间必须同步:使用ntp协议实现;
②节点间需要通过主机名互相通信,必须解析主机至IP地址;
(a)建议名称解析功能使用hosts文件来实现;
(b)通信中使用的名字与节点名字必须保持一致:“uname -n”命令,或“hostname”展示出的名字保持一致;
③考虑仲裁设备是否会用到;
④建立各节点之间的root用户能够基于密钥认证;
1)配置节点时间同步
配置时间同步使用ntpdate命令,建立一个定时任务,实现周期性的时间同步
[root@node-02 ~]# ntpdate 172.16.0.1 3Jun 08:56:53 ntpdate[1655]: step time server 172.16.0.1 offset 22520.390088 sec [root@node-02 ~]# crontab -l */3 * * * * /usr/sbin/ntpdate 172.16.0.1&>/dev/null [root@node-03 ~]# /usr/sbin/ntpdate172.16.0.1 3Jun 08:57:50 ntpdate[2094]: step time server 172.16.0.1 offset 23311.837688 sec [root@node-03 ~]# crontab -l */3 * * * * /usr/sbin/ntpdate 172.16.0.1&>/dev/null
2)节点间基于主机名互相通信,在/etc/hosts文件中进行配置
[root@node-02 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.0.1 server.magelinux.com server 172.16.9.82 node-02 node2 172.16.9.83 node-03 node3 [root@node-03 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomainlocalhost6 localhost6.localdomain6 172.16.0.1 server.magelinux.com server 172.16.9.82 node-02 node2 172.16.9.83 node-03 node3
3)节点之间基于root用户的密钥认证
[root@node-02 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key(/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in/root/.ssh/id_rsa. Your public key has been saved in/root/.ssh/id_rsa.pub. The key fingerprint is: 93:c1:f9:42:63:cd:2c:98:b3:a9:ef:7e:02:24:db:f2root@node-02 The key's randomart p_w_picpath is: +--[ RSA 2048]----+ | | | + = | | + O + | | .. * * | | = o S . | | oo. o | | o.. | | E.. . | | o+o | +-----------------+ [root@node-02 ~]# ssh-copy-id -i.ssh/id_rsa.pub node3 Warning: Permanently added 'node3' (RSA) tothe list of known hosts. root@node3's password: Now try logging into the machine, with"ssh 'node3'", and check in: .ssh/authorized_keys to make sure we haven't added extra keysthat you weren't expecting. [root@node-03 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key(/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in/root/.ssh/id_rsa. Your public key has been saved in/root/.ssh/id_rsa.pub. The key fingerprint is: b7:b1:3b:ca:78:9c:bc:72:0e:a0:18:a6:8d:ac:d0:99root@node-03 The key's randomart p_w_picpath is: +--[ RSA 2048]----+ | | | | | | | | |.. . S o | |+* + . . + | |=.E .o .o | |o .+* .. | |. .==o.. | +-----------------+ [root@node-03 ~]# [root@node-03 ~]# ssh-copy-id -i .ssh/id_rsa.pub node2 root@node2's password: Now try logging into the machine, with"ssh 'node2'", and check in: .ssh/authorized_keys to make sure we haven't added extra keysthat you weren't expecting.
测试节点间是否名密钥登陆
[root@node-02 ~]# ssh node3 Last login: Wed Jun 3 12:28:06 2015 from 172.16.9.9 [root@node-03 ~]# exit logout Connection to node3 closed. [root@node-02 ~]# [root@node-03 ~]# ssh node2 Last login: Wed Jun 3 12:41:17 2015 from 172.16.9.9 [root@node-02 ~]# exit logout Connection to node2 closed. [root@node-03 ~]#
六、安装配置HA程序
6.1 安装corosync和pacemaker程序
在配置好yum源之后直接安装corosync和pacemaker程序,分别两个节点上执行yum 命令安装
yum install corosync pacemaker -y
6.2 corosync默认配置文件解释
corosync程序安装后配置文件所在目录为/etc/corosync目录下,启动程序/etc/init.d/corosync.
[root@node-02 ~]# cd /etc/corosync/ [root@node-02 corosync]# ls corosync.conf.example corosync.conf.example.udpu service.d uidgid.d [root@node-02 corosync]# cpcorosync.conf.example corosync.conf [root@node-02 corosync]# egrep -v "#|^$" corosync.conf compatibility: whitetank #是否兼容whitetank totem { #用于定义底层信息层是如何通信的相关属性 version:2 #定义版本号 secauth:off #是否启用安全认证功能,启用后要使用corosync-keygen命令生成密钥 threads:0 #工作时所使用的线程数,“0”表示不基于线程模型,而是进程模型 interface{ #定义多个接口之间,基于哪个地址,哪个多播地址,监听什么端口完成多播通信; ringnumber:0 #环数,有点类型于TTL值对方是否回传 bindnetaddr:192.168.1.0 #多播地址监听的IP网络地址 mcastaddr:239.255.1.1 #多播地址 mcastport:5405 #多播地址监听的端口 ttl:1 #指明TTL值 } } logging { #定义日志相关属性 fileline:off # to_stderr:no #是否把日志输出为标准输出即屏幕 to_logfile:yes #开启记录在日志文件中 logfile:/var/log/cluster/corosync.log to_syslog:yes #是否发往系统的日志文件中 debug:off timestamp:on #是否在日志文件中开启时间戳功能,建议不开启 logger_subsys{ #日志文件是否记录子系统 subsys:AMF debug:off } }
6.3 配置pacemaker
pacemaker与corosync结合运行pacemaker的运行方式有两种,一种是作为corosync的插件运行,另一种是以独立的守护进程运行,以CentOS 6中建议以插件的方式运行,不过这样日志中可能会用警告,可以忽略的。在corosync.conf文件后面添加如下内容:
service { ver: 0 name: pacemaker use_mgmtd:yes } aisexec { user: root grout: root }
6.4 为corosync提供密钥文件,它需要在/dev/random中读取1024个随机数
[root@node-02 corosync]# corosync-keygen Corosync Cluster Engine Authentication keygenerator. Gathering 1024 bits for key from/dev/random. Press keys on your keyboard to generateentropy. Press keys on your keyboard to generateentropy (bits = 176).
#此时已经卡住了,说没有这么多个随机数,可以在打开一个终端,不断的敲击键盘,不过这么有一点的久,你可以在ftp下载一个大的文件,这样会产生大量的IO。
6.5 corosync+pacemaker最终配置文件
[root@node-02 corosync]# egrep -v "#|^$" corosync.conf compatibility: whitetank totem { version:2 secauth:on threads:0 interface{ ringnumber:0 bindnetaddr:172.16.0.0 mcastaddr:239.255.9.9 mcastport:5405 ttl:1 } } logging { fileline:off to_stderr:no to_logfile:yes logfile:/var/log/cluster/corosync.log to_syslog:no debug:off timestamp:on logger_subsys{ subsys:AMF debug:off } } service { ver: 0 name: pacemaker use_mgmtd:yes } aisexec { user: root grout: root }
6.6 将配置文件和密钥文件同步至node3节点
[root@node-02 corosync]# scp authkeycorosync.conf node3:/etc/corosync/ authkey 100% 128 0.1KB/s 00:00 corosync.conf 100% 2794 2.7KB/s 00:00
6.7 启动corosync服务
[root@node-02 corosync]# service corosyncstart;ssh node3 'service corosync start' Starting Corosync Cluster Engine(corosync): [ OK ] Starting Corosync Cluster Engine(corosync): [ OK ]
6.8 安装crmsh
把准备好的程序直接使用yum进行安装,这样可以解决依赖关系,在生产环境中只需要选择一台节点上进行安装,在这里我们在两个节点上都进行安装,以方便测试。
[root@node-02 ~]# yum installcrmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm -y
七、安装配置drbd
安装drbd需要向内核打补丁,所以要下载与内核版本相同的内核补丁,需要在两个节点都进行安装。
7.1 安装drbd程序
这里只演示在节点node2上安装的过程
[root@node-02 ~]# uname -r 2.6.32-504.el6.x86_64 [root@node-02 ~]# rpm -ivhdrbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpmkmod-drbd84-8.4.5-504.1.el6.x86_64.rpm warning: drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm:Header V4 DSA/SHA1 Signature, key ID baadae52: NOKEY Preparing... ########################################### [100%] 1:drbd84-utils ########################################### [ 50%] 2:kmod-drbd84 ########################################### [100%] Working. This may take some time ... Done.
7.2 drbd配置文件global_common.conf解释
drbd安装完成之后将会生成/etc/drbd.conf和/etc/drbd.d/目录,在drbd.conf文件就写了两行包含drbd.d中的文件,所以主配置文件在/etc/drbd.d/目录中。
[root@node-03 ~]# cd /etc/drbd.d/ [root@node-03 drbd.d]# catglobal_common.conf # DRBD is the result of over a decade ofdevelopment by LINBIT. # In case you need professional servicesfor DRBD or have # feature requests visithttp://www.linbit.com global { usage-countyes; #是否启用让drbd官方进行用户使用统计,建议为no #minor-count dialog-refresh disable-ip-verification } common { 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{ #定义drbd启动时双方等待处理的方式 #wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb } options{ #定义同步时属性 #cpu-mask on-no-data-accessible } disk{ #使用的磁盘 #size on-io-error fencing disk-barrier disk-flushes #disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-targetc-fill-target c-max-rate # c-min-rate disk-timeout } 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 } }
7.3 修改global_common.conf文件
[root@node-03 drbd.d]# egrep -v"#|^$" global_common.conf global { usage-countno; } common { handlers{ } startup{ } options{ } disk{ on-io-error detach; #当磁盘IO错误时直接卸载磁盘 } net{ cram-hmac-alg "sha1"; #使用通信的加密算法 shared-secret "3GQ3aD7DSEY"; #通信的加密密钥,建议使用opensslrand -base64 #生成 } syncer{ rate1000M; #数据同步使用的带宽 } }
7.4 创建分区
分别在两个节点上创建两个分区,分区的大小应该保持一致,只用创建分区不用格式化。如新建一个/dev/sda3大小为5G。
[root@node-02 ~]# fdisk -l /dev/sda Disk /dev/sda: 128.8 GB, 128849018880 bytes 255 heads, 63 sectors/track, 15665cylinders Units = cylinders of 16065 * 512 = 8225280bytes Sector size (logical/physical): 512 bytes /512 bytes I/O size (minimum/optimal): 512 bytes / 512bytes Disk identifier: 0x00090ed9 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinderboundary. /dev/sda2 26 7859 62914560 8e Linux LVM /dev/sda3 7859 8512 5252256 83 Linux
7.5 定义drbd的资源文件
样本配置文件解释:
resource web { #定义资源使用resource关键字,web是资源名,不能使用空格字符 onnode1.magedu.com { #指明在每个节点上的设备属性 device /dev/drbd0; #设置名是什么 disk /dev/sda5; #使用哪个磁盘分区设备当作drbd address 172.16.100.7:7789; #此节点将监听的IP地址和端口 meta-disk internal; #指明drbd的源数据存放位置,internal表示磁盘自身 } onnode2.magedu.com { device /dev/drbd0; disk /dev/sda5; address 172.16.100.8:7789; meta-disk internal; } }
drbd的资源文件需要在/etc/drbd.d/*.res结尾的文件,这里定义一个mysql.res的文件
[root@node-03 drbd.d]# cat mysql.res resource mystore { device/dev/drbd0; disk/dev/sda3; meta-diskinternal; onnode-02 { address 172.16.9.82:7789; } onnode-03 { address172.16.9.83:7789; } }
7.6 把配置的文件同步至另一个节点
[root@node-03 drbd.d]# ls global_common.conf mysql.res [root@node-03 drbd.d]# scp -rpglobal_common.conf mysql.res node2:/etc/drbd.d/ global_common.conf 100% 2097 2.1KB/s 00:00 mysql.res 100% 169 0.2KB/s 00:00 [root@node-02 drbd.d]# ls global_common.conf mysql.res
7.7 初始化drbd
初始化drbd需要在每个节点上都要执行一次,以实现节点间的数据一致性。这里在node3节点上演示。
[root@node-03 drbd.d]# drbdadm create-mdmystore initializing activity log NOT initializing bitmap Writing meta data... New drbd meta data block successfullycreated.
7.8 启动drbd
启动drbd时它需要等待对端启动,双方才能启动成功。
[root@node-02 ~]# service drbd start; sshnode3 'service drbd start'
7.9 查看drbd状态
[root@node-02 ~]# cat /proc/drbd version: 8.4.5 (api:1/proto:86-101) GIT-hash:1d360bde0e095d495786eaeb2a1ac76888e4db96 build by [email protected],2015-01-02 12:06:20 0:cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----- 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:5252056
从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
# drbdadm primary --force RESCOURCE
这里将node2设置为主节点,操作如下:
[root@node-02 ~]# drbdadm primary --force mystore [root@node-02 ~]# cat /proc/drbd version: 8.4.5 (api:1/proto:86-101) GIT-hash:1d360bde0e095d495786eaeb2a1ac76888e4db96 build by [email protected],2015-01-02 12:06:20 0:cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n- ns:2867864 nr:0 dw:0 dr:2868896 al:0 bm:0 lo:0 pe:2 ua:1 ap:0 ep:1 wo:foos:2385880 [=========>..........]sync'ed: 54.7% (2328/5128)M finish:0:01:04 speed: 37,088 (36,744) K/sec
#查看状态时发现两分节点上的磁盘分区已经开始同步了,此时需要等待一下,具体的时间将会根据分区大小来定,同步完状态如下:
[root@node-02 ~]# cat /proc/drbd version: 8.4.5 (api:1/proto:86-101) GIT-hash:1d360bde0e095d495786eaeb2a1ac76888e4db96 build by [email protected],2015-01-02 12:06:20 0:cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:5252056 nr:0 dw:0 dr:5252728 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:0
7.10 格式化主节点上的/dev/drbd0
[root@node-02 ~]# mke2fs -t ext4 /dev/drbd drbd/ drbd0 [root@node-02 ~]# mke2fs -t ext4 /dev/drbd0 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 328656 inodes, 1313014 blocks 65650 blocks (5.00%) reserved for the superuser First data block=0 Maximum filesystem blocks=1346371584 41 block groups 32768 blocks per group, 32768 fragments pergroup 8016 inodes per group Superblock backups stored on blocks: 32768,98304, 163840, 229376, 294912, 819200, 884736 Writing inode tables: done
八、安装布置MySQL数据库
MySQL使用的是MairaDB的数据库,只有在两个节点中的其中一个节点初始化数据库就行,因为两个节点都是共享提供的一个数据库文件,如安装初始化数据库在node2上进行操作,在node3节点上不用初始化数据库其它操都是一样的,这里就不给出操作过程。
8.1 创建MariaDB运行的用户
[root@node-02 ~]# useradd -r -u 336 mysql [root@node-02 ~]# id mysql uid=336(mysql) gid=336(mysql)groups=336(mysql)
8.2 挂载/dev/drbd0分区到数据库目录
[root@node-02 ~]# mkdir /data/data -p [root@node-02 ~]# mount /dev/drbd0 /data [root@node-02 ~]# chown -R mysql.mysql /data/data/ #注意:在node3安装MySQL时需要做如下操作: [root@node-02 ~]# drbdadm secondary mystore [root@node-02 ~]# drbd-overview 0:mystore/0 Connected Secondary/Secondary UpToDate/UpToDate 把node-03变成主节点: [root@node-03 ~]# drbdadm primary mystore
然后在进行挂载操作,切记,node3节点上不要初始化数据库,因为两边的数据已经是同步的。
8.3 解压MariaDB程序包到/usr/local目录下
[root@node-2 tools]# tar xfmariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/
8.4 创建软链接
[root@node-2 tools]# cd /usr/local/ [root@node-2 local]# ln -smariadb-5.5.43-linux-x86_64/ mysql
8.5 初始化数据库
[root@node-2 local]# cd mysql [root@node-2 mysql]# chown -R root.mysql ./* [root@node-2 mysql]#scripts/mysql_install_db --datadir=/data/data --user=mysql
8.6 提供MySQL的主配置文件
[root@node-2 mysql]# mkdir /etc/mysql [root@node-2 mysql]# cpsupport-files/my-large.cnf /etc/mysql/my.cnf
8.7 编辑/etc/mysql/my.cnf配置文件
在/etc/mysql/my.cnf配置文件中在[mysqld]标签中添加数据库存放目录。
datadir = /data/data innodb_file_per_table= on skip_name_resolve = on
8.8 为MySQL提供服务脚本
[root@node-2 mysql]# cpsupport-files/mysql.server /etc/rc.d/init.d/mysqld [root@node-2 mysql]# chmod +x/etc/rc.d/init.d/mysqld [root@node-2 mysql]# chkconfig --add mysqld [root@node-2 mysql]# chkconfig mysqld off
8.9 启动MariaDB服务进行测试
[root@node-02 mysql]# service mysqld start Starting MySQL.... [ OK ] [root@node-02 mysql]# bin/mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.43-MariaDB-log MariaDBServer Copyright (c) 2000, 2015, Oracle, MariaDBCorporation Ab and others. Type 'help;' or '\h' for help. Type '\c' toclear the current input statement. MariaDB [(none)]> create database node2; Query OK, 1 row affected (0.03 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | node2 | | performance_schema | | test | +--------------------+ 5 rows in set (0.01 sec) MariaDB [(none)]> exit Bye
8.10 停止MySQL服务,卸载/data
[root@node-02 mysql]# service mysqld stop Shutting down MySQL. [ OK ] [root@node-02 mysql]# umount /data
九、配置高可用的MySQL
9.1 初始化配置
[root@node-02 ~]# crm #切换至crm命令提示符 crm(live)# configure #切换至配置模式 crm(live)configure# property stonith-enabled=false #禁用stonith设备,因为我们这里没有stonith设备所有要禁用 crm(live)configure# propertyno-quorum-policy=ignore #忽略集群中当节点数小于等于quorum,节点数将无法运行,默认是stop crm(live)configure# verify #检验语法 crm(live)configure# commit #提交并保存服务立即生效
9.2 配置VIP资源
crm(live)configure# primitive mysqlipocf:heartbeat:IPaddr \ params ip=172.16.9.100 nic=eth0cidr_netmask=16 \ op monitor interval=10s timeout=20s crm(live)configure# verify #primitive :配置主资源即基本资源 #mysqlip :资源名,为VIP的地址 # ocf:heartbeat:IPaddr :表示为ocf风格的heartbeat中的IPaddr,用于设置IP地址 #parmas :参数,即ocf:heartbeat:IPaddr选项中的要进行配置的值 #ip=172.16.9.100 :设置IP地址为172.6.9.100 #nic :把VIP设置在哪块网卡上,可省 #cidr_netmask=16 :使用cidr风格的子网掩码格式 #op :表示此资源带的选项 #monitor :为监控操作 # interval :每隔多少时间监控一次 # timeout :每次监控超时时间
9.3 配置clone的基本资源
任何一个主从或clone资源都必须先是primitive资源,然后在clone,一份叫master,一份叫slave。
crm(live)configure# primitive mystorocf:linbit:drbd params drbd_resource="mystore" \ op monitor role="Master"interval=10s timeout=20s \ op monitor role="Slave"interval=20s timeout=20s \ op start timeout=240s op stop timeout=100s crm(live)configure# verify
9.4 配置主从资源
crm(live)configure# ms ms_mystor mystormeta clone-max="2" \ clone-node-max="1"master-max="1" master-node-max="1" notify="true" crm(live)configure# verify #clone-max : 最多克隆出的资源份数; #clone-node-max : 在单个节点上最多运行几份克隆; #master-max : 最多启动几份master资源;只能用于在主从资源; #master-node-max : 同一个节点最多运行几份master类型资源;只能用于在主从资源; #notify :当一份克隆资源启动或停止时,是否通知给其它的副本;是布尔值,默认为false;
9.5 配置挂载文件系统系统
挂载的必须是主资源,先定义文件系统,然后定义约束主资源在那里文件系统就在那里,然后在定义顺序约束,只有主节点提升以后才能挂载文件系统.
crm(live)configure# primitive mydataocf:heartbeat:Filesystem \ params device="/dev/drbd0"directory="/data" fstype="ext4" \ op monitor interval=20s timeout=40s opstart timeout=60s \ op stop timeout=60s crm(live)configure# verify
9.6 定义排列约束
文件系统资源mydata必须与主从资源ms_mystor的主节点在一起.
crm(live)configure# colocationmydata_with_ms_mystore inf: mydata ms_mystor:Master crm(live)configure# verify
9.7 定义顺序约束
文件系统资源mydata要在主从资源ms_mystor的主节点启动之后挂载
crm(live)configure# order mydata_after_ms_mystor_masterMandatory: ms_mystor:promote mydata:start crm(live)configure# verify
9.8 定义MySQL资源
crm(live)configure# primitive myserverlsb:mysqld op monitor interval=20s timeout=20s crm(live)configure# verify
9.9 定义约束mysqlip要和主节点在一起
crm(live)configure# colocationmyip_with_ms_mystor_master inf: mysqlip ms_mystor:Master crm(live)configure# verify
9.10 定义约束myserver要和mydata在一起
crm(live)configure# colocationmyserver_with_mydata inf: myserver mydata crm(live)configure# verify
9.11 定义顺序启动约束,myserver要在mydata之后启动
crm(live)configure# ordermyserver_after_mydata Mandatory: mydata:start myserver:start crm(live)configure# verify
9.12 定义顺序启动约束,myserver要在myip之后启动
crm(live)configure# order myserver_after_myip Mandatory: myip:start myserver:start crm(live)configure# verify crm(live)configure# commit
十、测试集群服务
10.1 查看集群状态
[root@node-02 ~]# crm status Last updated: Wed Jun 3 16:45:43 2015 Last change: Wed Jun 3 16:44:22 2015 Stack: classic openais (with plugin) Current DC: node-02 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 5 Resources configured Online: [ node-02 node-03 ] mysqlip (ocf::heartbeat:IPaddr): Started node-03 Master/Slave Set: ms_mystor [mystor] Masters: [ node-03 ] Slaves: [ node-02 ] mydata (ocf::heartbeat:Filesystem): Started node-03 myserver (lsb:mysqld): Started node-03
通过上面的状态查看,我们已经知道所有的服务运行正常,并运行在node3节点上。
10.2 测试node3节点上的MySQL是否可用
[root@node-03 ~]# ss -tanp|grep":3306" LISTEN 0 50 *:3306 *:* users:(("mysqld",4367,15)) [root@node-03 ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.5.43-MariaDB-log MariaDBServer Copyright (c) 2000, 2013, Oracle and/or itsaffiliates. All rights reserved. Oracle is a registered trademark of OracleCorporation and/or its affiliates. Other names may be trademarksof their respective owners. Type 'help;' or '\h' for help. Type '\c' toclear the current input statement. mysql> create database testnode3; Query OK, 1 row affected (0.02 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | testnode3 | +--------------------+ 5 rows in set (0.04 sec) mysql> exit Bye
在node3节点能正常创建数据库,也能正常显示数据库信息。
10.3 将node3下线,测试node2是否能使用
[root@node-03 ~]# crm node standby [root@node-03 ~]# crm node online [root@node-03 ~]# crm status Last updated: Wed Jun 3 16:54:43 2015 Last change: Wed Jun 3 16:54:40 2015 Stack: classic openais (with plugin) Current DC: node-02 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 5 Resources configured Online: [ node-02 node-03 ] mysqlip (ocf::heartbeat:IPaddr): Started node-02 Master/Slave Set: ms_mystor [mystor] Masters: [ node-02 ] Slaves: [ node-03 ] mydata (ocf::heartbeat:Filesystem): Started node-02 myserver (lsb:mysqld): Started node-02
在node2登录mysql查看并创建数据库文件
[root@node-02 ~]# ss -tanp|grep":3306" LISTEN 0 50 *:3306 *:* users:(("mysqld",6141,15)) [root@node-02 ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.5.43-MariaDB-log MariaDBServer Copyright (c) 2000, 2013, Oracle and/or itsaffiliates. All rights reserved. Oracle is a registered trademark of OracleCorporation and/or its affiliates. Other names may be trademarksof their respective owners. Type 'help;' or '\h' for help. Type '\c' toclear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | testnode3 | +--------------------+ 5 rows in set (0.05 sec) mysql> create database testnode2; Query OK, 1 row affected (0.02 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | testnode2 | | testnode3 | +--------------------+ 6 rows in set (0.00 sec) mysql> exit Bye
10.4 测试HA MySQL服务是否具有监控能力
[root@node-03 ~]# ss -tanp|grep":3306" LISTEN 0 50 *:3306 *:* users:(("mysqld",14384,15)) [root@node-03 ~]# killall mysqld [root@node-03 ~]# killall mysqld mysqld: no process killed [root@node-03 ~]# ss -tanp|grep":3306" [root@node-03 ~]# ss -tanp|grep":3306" [root@node-03 ~]# ss -tanp|grep":3306" LISTEN 0 50 *:3306 *:* users:(("mysqld",15471,15))
经过测试MySQL能在意外关闭后几秒中重启被启动。
小结:
一个简单的MySQL高可用就配置完毕,drbd可以通过分布式磁盘块设备提供了共享存储的可用性,甚至也提供了冗余的可用性,drbd的可用性和可靠性还是有待考验的,虽然有中小企业使用了drbd,甚至MySQL官方在实现MySQL高可用都以drbd为案例讲解过drbd;但经过在实际生产环境中的检验的反馈来看,drbd偶尔还是会出问题的,到底用不用还是要考虑衡量可以接受数据的损失,及数据的重要性来进行评估。
不过我们相信drbd会越来越完善、稳定、安全、可靠。。。。。
欢迎各位观客为小乌提出宝贵的意见,小乌等待你。。。。。
没有伞的孩子就必须要努力奔跑。