通过 corosync/pacemaker实现高可用的MariaDB
目的:
通过corosync v1 和pacemaker 提供高可用mariadb,在调度切换RS时,仍能数据库访问及操作不中断。
其中corosyncv1提供底层心跳及事务信息传递功能,pacemaker提供CRM、LRM
试验环境流程:
第一台虚拟机提供nfs文件共享存储;中间两台虚拟机配置相同mariadb服务,数据库存储位置为第四台虚拟机提供的nfs文件系统。对pacemaker的配置操作可以有多种形式,如CLI接口的crmsh和pcs,GUI的 hawk(webgui)和LCMC。其中crmsh功能强大,本次就采用crmsh。由于虚拟机安装的是centos6,不带crmsh,因此需手动安装crmsh,crmsh的安装依赖于pssh
corosync.x86_64 0:1.4.7-1.el6
pacemaker.x86_64 0:1.1.12-4.el6
crmsh-2.1-1.6.x86_64.rpm
pssh-2.3.1-2.el6.x86_64.rpm
mariadb-5.5.43-linux-x86_64.tar.gz(二进制程序包)
架构图:
一、corosync/pacemaker 的安装配置
1、配置HA集群的准备工作:各节点都做如下工作,本次试验是2节点
时间同步、名称访问、ssh 互信、仲裁设备(本次不提供仲裁设备)
(1) 节点间时间必须同步:使用ntp协议实现;
各节点
# crontab -e */3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null
(2) 节点间需要通过主机名互相通信,必须解析主机至IP地址;
(a) 建议名称解析功能使用hosts文件来实现;
# vim /etc/hosts 127.0.0.1 localhost.localdomain localhost.localdomain localhost4 localhost4.localdomain4 localhost ::1 localhost.localdomain localhost.localdomain localhost6 localhost6.localdomain6 localhost 172.16.0.1 server.magelinux.com server 172.16.20.100 node1 172.16.20.200 node2
(b) 通信中使用的名字与节点名字必须保持一致:“uname -n”命令,或“hostname”展示出的名字保持一致;
(3) 考虑仲裁设备是否会用到:
2节点必须得有,以防发生集群分裂发生,超过2 的偶数几点可以没有。
教室环境可以使用 ping node 172.16.0.1
此次试验不考虑仲裁设备。
(4) 建立各节点之间的root用户能够基于密钥认证;
# ssh-keygen -t rsa -P ‘‘ # ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] # ssh node1 ‘ifconfig‘
2、centos6自带了corosync和pacemaker的安装树,可以查询到并直接yum安装
各节点都安装corosync和pacemaker:
# yum install -y corosync …… Installed: corosync.x86_64 0:1.4.7-1.el6 Dependency Installed: corosynclib.x86_64 0:1.4.7-1.el6 libibverbs.x86_64 0:1.1.8-3.el6 librdmacm.x86_64 0:1.0.18.1-1.el6 lm_sensors-libs.x86_64 0:3.1.1-17.el6 net-snmp-libs.x86_64 1:5.5-49.el6_5.3 Complete!
查看生成的文件:
# rpm -ql corosync /etc/corosync /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf.example.udpu /etc/corosync/service.d /etc/corosync/uidgid.d /etc/dbus-1/system.d/corosync-signals.conf /etc/rc.d/init.d/corosync /etc/rc.d/init.d/corosync-notifyd /etc/sysconfig/corosync-notifyd /usr/bin/corosync-blackbox /usr/libexec/lcrso /usr/libexec/lcrso/coroparse.lcrso …… /usr/libexec/lcrso/service_pload.lcrso /usr/libexec/lcrso/vsf_quorum.lcrso /usr/libexec/lcrso/vsf_ykd.lcrso /usr/sbin/corosync /usr/sbin/corosync-cfgtool /usr/sbin/corosync-cpgtool /usr/sbin/corosync-fplay /usr/sbin/corosync-keygen /usr/sbin/corosync-notifyd /usr/sbin/corosync-objctl /usr/sbin/corosync-pload /usr/sbin/corosync-quorumtool /usr/share/doc/corosync-1.4.7 …… /var/log/cluster
# yum install pacemaker -y Installed: pacemaker.x86_64 0:1.1.12-4.el6 Dependency Installed: clusterlib.x86_64 0:3.0.12.1-68.el6 libqb.x86_64 0:0.16.0-2.el6 pacemaker-cli.x86_64 0:1.1.12-4.el6 pacemaker-cluster-libs.x86_64 0:1.1.12-4.el6 pacemaker-libs.x86_64 0:1.1.12-4.el6 perl-TimeDate.noarch 1:1.16-13.el6 resource-agents.x86_64 0:3.9.5-12.el6 Complete!
提供配置文件:
# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf # vim /etc/corosync/corosync.conf
验证网卡是否打开多播功能:
# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:10:05:bf brd ff:ff:ff:ff:ff:ff
如果没有需要使用如下命令打开:
# ip link set eth0 multicast on
生成corosync的密钥文件:
# corosync-keygen
如果熵池中的随机数不够,可以通过从网络上下载打文件或手动敲击键盘生成。
将生成的密钥文件和corosync配置文件保留所有属性复制一份到node2节点,并确保属性符合要求:
# scp -p /etc/corosync/{authkey,corosync.conf} node2:/etc/corosync/ authkey 100% 128 0.1KB/s 00:00 corosync.conf 100% 2754 2.7KB/s 00:00 [root@node2 ~]# ll /etc/corosync/ total 24 -r-------- 1 root root 128 May 30 11:56 authkey -rw-r--r-- 1 root root 2754 May 30 11:48 corosync.conf -rw-r--r-- 1 root root 2663 Oct 15 2014 corosync.conf.example -rw-r--r-- 1 root root 1073 Oct 15 2014 corosync.conf.example.udpu drwxr-xr-x 2 root root 4096 Oct 15 2014 service.d drwxr-xr-x 2 root root 4096 Oct 15 2014 uidgid.d
启动两个节点的corosync:
[root@node1 corosync]# service corosync start ; ssh node2 ‘service corosync start‘ Starting Corosync Cluster Engine (corosync): [ OK ] Starting Corosync Cluster Engine (corosync): [ OK ]
验证corosync引擎是否正常启动:
[root@node1 corosync]# ss -unlp | grep corosync UNCONN 0 0 172.16.20.100:5404 *:* users:(("corosync",3906,13)) UNCONN 0 0 172.16.20.100:5405 *:* users:(("corosync",3906,14)) UNCONN 0 0 239.254.11.11:5405 *:* users:(("corosync",3906,10)) [root@node1 corosync]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log May 30 12:08:44 corosync [MAIN ] Corosync Cluster Engine (‘1.4.7‘): started and ready to provide service. May 30 12:08:44 corosync [MAIN ] Successfully read main configuration file ‘/etc/corosync/corosync.conf‘.
查看初始化成员节点通知是否正常发出:
[root@node1 corosync]# grep TOTEM /var/log/cluster/corosync.log May 30 12:08:44 corosync [TOTEM ] Initializing transport (UDP/IP Multicast). May 30 12:08:44 corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0). May 30 12:08:44 corosync [TOTEM ] The network interface [172.16.20.100] is now up. May 30 12:08:44 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed. May 30 12:08:46 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
检查启动过程中是否有错误产生,下面的错误信息表示pacemaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务,此处可安全忽略:
[root@node1 corosync]# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources May 30 12:23:17 corosync [pcmk ] ERROR: process_ais_conf: You have configured a cluster using the Pacemaker plugin for Corosync. The plugin is not supported in this environment and will be removed very soon. May 30 12:23:17 corosync [pcmk ] ERROR: process_ais_conf: Please see Chapter 8 of ‘Clusters from Scratch‘ (http://www.clusterlabs.org/doc) for details on using Pacemaker with CMAN May 30 12:23:18 corosync [pcmk ] ERROR: pcmk_wait_dispatch: Child process mgmtd exited (pid=4144, rc=100)
查看pacemaker是否正常启动:
[root@node1 corosync]# grep pcmk_startup /var/log/cluster/corosync.log May 30 12:23:17 corosync [pcmk ] info: pcmk_startup: CRM: Initialized May 30 12:23:17 corosync [pcmk ] Logging: Initialized pcmk_startup May 30 12:23:17 corosync [pcmk ] info: pcmk_startup: Maximum core file size is: 18446744073709551615 May 30 12:23:17 corosync [pcmk ] info: pcmk_startup: Service: 9 May 30 12:23:17 corosync [pcmk ] info: pcmk_startup: Local hostname: node1
上面查看都正常就可以在node2上的也查看检查状况是否正常。
安装crmsh及其依赖的pssh包:
从ftp://172.16.0.1下载程序包 :
crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm
一般都只需要在一个节点上安装crmsh即可,但为了使用方便,可以在两个节点上都安装crmsh
# yum install --nogpgcheck -y crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm
安装完后可以查看节点信息并使用了:
# crm status Last updated: Sat May 30 12:48:24 2015 Last change: Sat May 30 12:33:42 2015 Stack: classic openais (with plugin) Current DC: node2 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 0 Resources configured Online: [ node1 node2 ]
二、mariadb的配置使用
mariadb要能使用高可用,为了保证数据读写一致,就必须用到共享存储。这里选用nfs共享存储方式。
共享存储时,需要将数据库所在主机对远程mysql程序所在主机开放读写访问权限(以mysql:mysql 主:组);
做节点访问时需要用mysql用户访问出故障换节点访问时,就需要右几点在访问时仍以mysql用户访问,这时两个节点和共享存储点的都得需要有mysql用户,且id号都得相同;
访问的格式化时只需要在一个节点上初始化就可以,另一节点不需要再初始化了。
(一)准备nfs共享文件存储系统
可以只导出一个文件目录,也可以创建一个新分区作为导出存储空间。
在第三台主机上创建一个新分区,挂载至 /data目录下
[root@aunt-s ~]# fdisk /dev/sda [root@aunt-s ~]# partx -a /dev/sda [root@aunt-s ~]# pvcreate /dev/sda6 [root@aunt-s ~]# vgcreate myvg /dev/sda6 [root@aunt-s ~]# lvcreate -L 4G -n mydata myvg [root@aunt-s ~]# mke2fs -t ext4 /dev/myvg/mydata
编辑/etc/fstab,添加一行,使新分区能开机自动挂载
[root@aunt-s ~]# vim /etc/fstab /dev/myvg/mydata /data ext4 defaults,noatime 0 0 [root@aunt-s ~]# mount -a [root@aunt-s ~]# mount …… /dev/mapper/myvg-mydata on /data type ext4 (rw,noatime) [root@aunt-s data]# mkdir /data/cldata
编辑 /etc/exports ,添加如下行,输出文件系统,因为是共享存储,所以需要能写,且不挤压root权限:
[root@aunt-s ~]# vim /etc/exports /data/cldata 172.16.0.0/16(rw,no_root_squash)
远程节点mysql访问时,是以mysql用户进行访问的,所有需要将文件属主数组改为mysql,且与节点的mysql用户的ID要一致:
[root@aunt-s ~]# groupadd -r -g 492 mysql [root@aunt-s ~]# useradd -r -g 492 -u 492 mysql [root@aunt-s ~]# id mysql uid=492(mysql) gid=492(mysql) groups=492(mysql) [root@aunt-s data]# chown -R mysql:mysql /data/cldata [root@aunt-s data]# ll -d /data/cldata drwxr-xr-x 2 mysql mysql 4096 May 30 15:56 /data/cldata [root@aunt-s data]# exportfs -arv exporting 172.16.0.0/16:/data/cldata
(二)节点配置mysql服务
1、 挂载远程nfs
[root@node1 ~]# showmount -e 172.16.20.150 clnt_create: RPC: Program not registered
解决办法:在服务器上先停止rpcbind,然后在停止nfs
最后在重启rpcbind和nfs,一定要按顺序启动和停止
做完这个动作之后,访问成功
[root@node1 ~]# showmount -e 172.16.20.150 Export list for 172.16.20.150: /data 172.16.0.0/16 [root@node1 ~]# mkdir /mydata ; ssh node2 ‘mkdir /mydata‘ [root@node1 ~]# mount -t nfs 172.16.20.150:/data /mydata [root@node1 ~]# mount …… 172.16.20.150:/data on /mydata type nfs (rw,vers=4,addr=172.16.20.150,clientaddr=172.16.20.100)
创建mysql用户并验证是否对nfs共享存储有写权限
[root@node1 ~]# id mysql id: mysql: No such user [root@node1 ~]# groupadd -r -g 492 mysql [root@node1 ~]# useradd -r -g 492 -u 492 mysql [root@node1 ~]# su - mysql su: warning: cannot change directory to /home/mysql: No such file or directory -bash-4.1$ tree /mydata /mydata ├── cldata └── lost+found [error opening dir] 2 directories, 0 files -bash-4.1$ cd /mydata/cldata/ -bash-4.1$ touch a.txt -bash-4.1$ ls /mydata/cldata/ a.txt -bash-4.1$ rm /mydata/cldata/a.txt -bash-4.1$ exit logout [root@node1 ~]#
在node2上也需要创建相同的mysql用户,并挂载nfs共享目录,然后验证mysql用户是否对其有写权限。过程略。
2、 安装mariadb并初始化
主程序包: mariadb-5.5.43-linux-x86_64.tar.gz
先将二进制程序包解压缩:
[root@node1 ~]# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local [root@node1 ~]# ln -sv mariadb-5.5.43-linux-x86_64/ mysql `mysql‘ -> `mariadb-5.5.43-linux-x86_64/‘ [root@node1 ~]# cd /usr/local/mysql/ [root@node1 mysql]# ls bin COPYING.LESSER EXCEPTIONS-CLIENT INSTALL-BINARY man README share support-files COPYING data include lib mysql-test scripts sql-bench [root@node1 mysql]# chown -R root:mysql ./* [root@node1 mysql]# ll total 220 drwxr-xr-x 2 root mysql 4096 May 30 16:45 bin -rw-r--r-- 1 root mysql 17987 Apr 30 02:55 COPYING …… [root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/cldata/
在第二节点上可以看到初始化已成功:
[root@node2 ~]# ls /mydata/cldata/ aria_log.00000001 aria_log_control mysql performance_schema test
创建完成后,nfs共享存储就不需要管理员操作了,可以将nfs共享修改为 root_squash:
[root@aunt-s data]# vim /etc/exports /data 172.16.0.0/16(rw,root_squash) [root@aunt-s data]# exportfs -arv exporting 172.16.0.0/16:/data
设置好配置文件:
[root@node1 mysql]# ls bin COPYING.LESSER EXCEPTIONS-CLIENT INSTALL-BINARY man README share support-files COPYING data include lib mysql-test scripts sql-bench [root@node1 mysql]# cp support-files/ binary-configure my-innodb-heavy-4G.cnf my-small.cnf mysql.server magic my-large.cnf mysqld_multi.server SELinux/ my-huge.cnf my-medium.cnf mysql-log-rotate
将样本复制到 /etc下,并修改或添加下面四项:
[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf thread_concurrency = 2 datadir = /mydata/cldata innodb_file_per_table = on skip_name_resolve = on [root@node1 mysql]# service mysqld start Starting MySQL. [FAILED] [root@node1 mysql]# service mysqld status MySQL is not running, but lock file (/var/lock/subsys/mysql[FAILED]
如果出现这种情况,是原来的程序没有处理干净,需要将锁文件/var/lock/subsys/mysql删除。如果还是不行,则需要删除所有安装文件及生成的库文件后再启动就可以了。
[root@node1 mysql]# service mysqld start Starting MySQL... [ OK ]
验证mysql能正常使用:
[root@node1 mysql]# /usr/local/mysql/bin/mysql …… MariaDB [(none)]> CREATE DATABASE testclusterdb; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> quit Bye [root@node1 mysql]# service mysqld stop Shutting down MySQL. [ OK ] [root@node1 mysql]# chkconfig mysqld off [root@node1 mysql]# chkconfig | grep mysqld mysqld 0:off1:off2:off3:off4:off5:off6:off
在node2主机上执行上述过程,但不需要执行初始化(# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/cldata/)
mariadb服务安装配置好,停止mysqld服务,并卸载nfs挂载:
[root@node2 ~]# umount /mydata ; ssh node1 ‘umount /mydata‘
三 corosync/pacemaker与mariadb结合构建高可用存储
根据mariadb的高可用存储特点,按如下顺序定义:
① 三种资源定义:
IP、mariadb服务程序、nfs共享存储
② 排列约束定义
这三者之间都是都是具有高粘性的,必须在同一节点上
③ 顺序约束
启动顺序为 IP --> nfs挂载 --> mariadb服务
关闭顺序为 mariadb --> nfs卸载 --> IP
1、定义两个关键全局配置:
stonith-enabled=false
no-quorum-policy=ignore
[root@node1 ~]# crm crm(live)# configure property no-quorum-policy=ignore crm(live)configure# property stonith-enabled=false
2、定义资源
注意:如果是在configure外定义,在定义完无错误时是自动commit的,只有在configure里定义完后,可以做verify和手动commit。
(1)ip资源
[root@node1 ~]# crm crm(live)configure# primitive mdbip ocf:heartbeat:IPaddr params ip=172.16.20.50 nic=eth0 cidr_netmask=16 op monitor interval=10s timeout=20s
(2)nfs挂载
[root@node1 ~]# crm crm(live)# ra info ocf:heartbeat:Filesystem (查看挂载文件系统需要配置的参数) crm(live)# configure primitive mdbstore ocf:heartbeat:Filesystem params device="172.16.20.150:/data" directory="/mydata/" fstype=nfs op monitor interval=10s timeout=40s op start timeout=60s op stop timeout=60
(3)mariadb服务资源
[root@node1 ~]# crm crm(live)configure# primitive maria lsb:mysqld op monitor interval=10s timeout=20s crm(live)configure# show node node1 attributes standby=off node node2 primitive maria lsb:mysqld op monitor interval=10s timeout=20s primitive mdbip IPaddr params ip=172.16.20.50 nic=eth0 cidr_netmask=16 op monitor interval=10s timeout=20s primitive mdbstore Filesystem params device="172.16.20.150:/data" directory="/mydata/" fstype=nfs op monitor interval=10s timeout=40s op start timeout=60s interval=0 op stop timeout=60 interval=0 property cib-bootstrap-options: dc-version=1.1.11-97629de cluster-infrastructure="classic openais (with plugin)" expected-quorum-votes=2 stonith-enabled=false no-quorum-policy=ignore last-lrm-refresh=1432984183 crm(live)configure#
3、定义排列约束
将资源绑定在一个节点上运行有多种方法,一是将资源定义到一个group里,二是定义colocation。这里用group方法
[root@node1 ~]# crm crm(live)configure# group mdbservice mdbip mdbstore maria crm(live)configure# show node node1 attributes standby=off node node2 primitive maria lsb:mysqld op monitor interval=10s timeout=20s primitive mdbip IPaddr params ip=172.16.20.50 nic=eth0 cidr_netmask=16 op monitor interval=10s timeout=20s primitive mdbstore Filesystem params device="172.16.20.150:/data" directory="/mydata/" fstype=nfs op monitor interval=10s timeout=40s op start timeout=60s interval=0 op stop timeout=60 interval=0 group mdbservice mdbip mdbstore maria property cib-bootstrap-options: dc-version=1.1.11-97629de cluster-infrastructure="classic openais (with plugin)" expected-quorum-votes=2 stonith-enabled=false no-quorum-policy=ignore last-lrm-refresh=1432984183
此时,就定义完了mariadb的高可用集群了,可以通过网页进行测试
4、测试高可用
(1)查看几点信息
在node1节点可以看到,三个资源都已经启动,且运行在同一个节点上(node2):
[root@node1 ~]# crm crm(live)# status Last updated: Sat May 30 19:59:49 2015 Last change: Sat May 30 19:59:32 2015 Stack: classic openais (with plugin) Current DC: node1 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 3 Resources configured Online: [ node1 node2 ] Resource Group: mdbservice mdbip(ocf::heartbeat:IPaddr):Started node2 mdbstore(ocf::heartbeat:Filesystem):Started node2 maria(lsb:mysqld):Started node2 crm(live)#
(2)远程第三方主机测试:
用主机172.16.20.96 [root@hot-d ~] 进行远程登录操作测试:
在mysql中授权能远程登录并退出:
[root@node2 ~]# mysql mysql> GRANT ALL ON *.* to tom@‘172.16.20.96‘ IDENTIFIED BY ‘123‘; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) mysql> \q Bye [root@node2 ~]#
在新主机hot-d上登录mysql,并做资源转移测试:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。