HA专题: Corosync+Pacemaker+drbd实现MySQL高可用
大纲
前言
实验拓扑
实验环境
实验步骤
安装前准备工作
配置DRBD
配置MySQL
配置Corosync+Pacemaker
测试
我遇到的问题
总结
前言
上篇文章我们介绍了
drbd
的相关原理、编译安装、简单的实现.drbd
虽然可以保证数据的可靠性但是我们上次的实现还有很多的缺陷,这次我们将drbd
定义为HA集群的一个资源,可以实现让多个节点自动切换drbd
的主从模式并结合MySQL
实现其数据的高可用
实验拓扑
实验环境
实验步骤
安装前准备工作
配置一个HA集群的前提需要配置时间同步, 双机互信, 主机名解析
由于我们以前的博文已经讲解过如何配置:可以查看HA配置准备工作
配置DRBD
过程不做说明, 看我的上篇博客HA专题: 编译安装并配置DRBD
做成DRBD的设备为/dev/sdb1, 两个节点sdb1都为10G
这里教大家一个小技巧, 使用fdisk非交互分区
1. 创建一个分区文件如下, 输入交互式分区按顺序的命令
[root@node1 ~]# cat sdb
n
p
1
1
10G
w
2. 使用输入重定向, 如下即可完成
[root@node1 ~]# fdisk /dev/sdb < sdb
[root@node1 ~]# yum groupinstall "Development Tools" "Server Platform Development" --nogpgcheck -y
[root@node1 ~]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.4.tar.gz
[root@node1 ~]# tar xf drbd-8.4.4.tar.gz -C /usr/src/
[root@node1 ~]# cd /usr/src/drbd-8.4.4/
[root@node1 drbd-8.4.4]# ./configure --prefix=/usr/local/drbd --sysconf=/etc/ --with-km
[root@node1 drbd-8.4.4]# make KDIR=/usr/src/kernels/2.6.32-573.el6.x86_64/
[root@node1 drbd-8.4.4]# make install
[root@node1 drbd-8.4.4]# cp drbd/drbd.ko /lib/modules/2.6.32-573.el6.x86_64/kernel/lib/
[root@node1 drbd-8.4.4]# depmod
[root@node1 drbd-8.4.4]# modprobe drbd
drbd配置文件如下, 仅供参考
[root@node1 drbd-8.4.4]# grep -v "[[:space:]]#" /etc/drbd.d/global_common.conf
global {
usage-count yes;
}
common {
handlers {
}
startup {
}
options {
}
disk {
on-io-error detach;
}
net {
cram-hmac-alg "sha1";
shared-secret "anyisalin.com";
}
syncer {
rate 1000M;
}
}
资源配置文件如下
[root@node1 drbd-8.4.4]# cat /etc/drbd.d/data.res
resource data {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
on node1.anyisalin.com {
address 172.16.1.2:7789;
}
on node2.anyisalin.com {
address 172.16.1.3:7789;
}
}
node2将以上操作重复一遍后, 进行如下操作
[root@node1 drbd-8.4.4]# drbdadm create-md data #node1上操作
[root@node2 drbd-8.4.4]# drbdadm create-md data #node2上操作
[root@node1 drbd-8.4.4]# service drbd start #node1上操作
[root@node2 drbd-8.4.4]# service drbd start #node2上操作
[root@node1 drbd-8.4.4]# cat /proc/drbd #查看进度, 等待同步完成
[root@node1 drbd-8.4.4]# drbdadm primary --force data #node1设置为Primary
[root@node1 drbd-8.4.4]# mkfs.ext4 /dev/drbd0 #格式化文件系统为ext4
配置MySQL
这里通过通用二进制格式进行安装
[root@node1 ~]# service drbd start
[root@node1 ~]# mount /dev/drbd0 /data/ #挂载dbrd设备到/data下
[root@node1 ~]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/
[root@node1 local]# ln -sv mysql-5.5.33-linux2.6-x86_64/ mysql
[root@node1 local]# groupadd -r -g 3306 mysql
[root@node1 local]# useradd -g mysql -u 3306 -r mysql
[root@node1 local]# cd mysql
[root@node1 mysql]# ./scripts/mysql_install_db --datadir=/data/ --user=mysql
[root@node1 mysql~]# chown mysql:mysql /data/
[root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@node1 mysql]# vim /etc/my.cnf #编辑配置文件, 添加下列字段
datadir = /data
skip_name_resolve = on
innodb_file_per_table = on
测试启动
[root@node1 ~]# service mysqld start
Starting MySQL.. [ OK ]
[root@node1 ~]# /usr/local/mysql/bin/mysql
mysql> GRANT ALL ON *.* TO anyisalin@'%' IDENTIFIED BY 'passwd'; #创建用户
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES ;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE DATABASE TESTDB; #创建测试数据库
Query OK, 1 row affected (0.00 sec)
为node2配置
[root@node1 ~]# service mysqld stop #停止MySQL
Shutting down MySQL. [ OK ]
[root@node1 ~]# umount /data/
[root@node1 ~]# drbdadm secondary data #将drbd设置为从模式
同步MySQL的文件到node2上
[root@node1 local]# rsync -av mysql node2.anyisalin.com:/usr/local/
[root@node1 local]# rsync -av mysql-5.5.33-linux2.6-x86_64 node2.anyisalin.com:/usr/local/
[root@node1 local]# scp /etc/rc.d/init.d/mysqld node2.anyisalin.com:/etc/rc.d/init.d/
[root@node1 local]# scp /etc/my.cnf node2.anyisalin.com:/etc/
注意: 以下操作在node2执行
[root@node2 ~]# drbdadm primary data #将drbd设置为主模式
[root@node2 ~]# mkdir /data
[root@node2 ~]# mount /dev/drbd0 /data #挂载
[root@node2 ~]# groupadd -g 3306 -r mysql #创建MySQL用户
[root@node2 ~]# useradd -u 3306 -g mysql -r mysql #创建MySQL用户
[root@node2 ~]# service mysqld start #启动MySQL
Starting MySQL.. [ OK ]
[root@node2 ~]# mysql -uanyisalin -ppasswd #使用我们刚才创建的用户登录
mysql> SHOW DATABASES; #刚创建的数据库还在
+---------------------+
| Database |
+---------------------+
| information_schema |
| TESTDB |
| #mysql50#lost+found |
| mysql |
| performance_schema |
+---------------------+
5 rows in set (0.00 sec)
以上操作完成后需要关闭MySQL并卸载挂载的文件系统, 并将每个节点的drbd设置为从模式
配置Corosync+Pacemaker
安装及配置过程不做说明, 可以看我以前的文章 AnyISalIn的文章,
crmsh
可去SUSE官方站点下载SUSE Centos HA
[root@node1 ~]# yum install corosync pacemaker crmsh -y --nogpgcheck
[root@node1 ~]# cd /etc/corosync/
[root@node1 corosync]# corosync-keygen
[root@node1 corosync]# chmod 600 authkey
配置文件如下: /etc/corosync/corosync.conf
[root@node1 corosync]# grep -v "[[:space:]]*#" /etc/corosync/corosync.conf
compatibility: whitetank
totem {
version: 2
secauth: on
threads: 0
interface {
ringnumber: 0
bindnetaddr: 172.16.1.0
mcastaddr: 239.255.1.1
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
}
aisexec {
user: root
group: root
}
[root@node2 ~]# yum install corosync pacemaker crmsh -y --nogpgcheck
[root@node2 ~]# scp -p node1.anyisalin.com:/etc/corosync/{authkey,corosync.conf} /etc/corosync/
在两个节点上启动corosync
[root@node1 ~]# service corosync start
[root@node1 ~]# ssh node2.anyisalin.com -- /etc/init.d/corosync start
[root@node1 ~]# crm status #查看节点状态
Last updated: Wed Apr 13 15:07:52 2016
Last change: Wed Apr 13 15:07:22 2016
Stack: classic openais (with plugin)
Current DC: node2.anyisalin.com - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
0 Resources configured
Online: [ node1.anyisalin.com node2.anyisalin.com ]
Full list of resources:
配置资源
crm(live)# configure
crm(live)configure# edit #配置如下, 仅供参考
node node1.anyisalin.com \
attributes standby=on
node node2.anyisalin.com \
attributes standby=off
primitive data_drbd ocf:linbit:drbd \
params drbd_resource=data \
op monitor role=Master interval=10s timoue=20s \
op monitor role=Slave interval=20s timeout=20s \
op start interval=0 timeout=240 \
op stop interval=0 timeout=120
primitive myip IPaddr \
params ip=172.16.1.8
primitive mysql service:mysqld
primitive mysqldatafs Filesystem \
params device="/dev/drbd0" directory="/data" fstype=ext4 \
op start interval=0 timeout=60 \
op stop interval=0 timeout=60
ms MS_data_drbd data_drbd \
meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
colocation myip_with_mysql inf: myip mysql
order mysql_after_mysqldatafs inf: mysqldatafs mysql
colocation mysql_with_mysqldatafs inf: mysql mysqldatafs
order mysqldatafs_afer_MS_data_drbd inf: MS_data_drbd:promote mysqldatafs:start
colocation mysqldatafs_with_MS_data_drbd inf: mysqldatafs MS_data_drbd:Master
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false \
last-lrm-refresh=1460541144 \
no-quorum-policy=ignore
测试
现在node1是Master
连接数据库进行测试
我们先将node1 standby
再次连接数据进行测试
查看drbd的状态
我遇到的问题
这个实验我做了很久, 遇到了很多的问题, 大部分通过自己的排查和Google都解决了, 所以特定写下来希望能够帮助大家排查错误
在CentOS6.X的系统中很可能出现连接不到CIB的问题, 错误提示信息
could not establish cib_ro connection: connection refused (111)
解决方法: 排除是自己的问题之后, 使用互联网上的各种软件仓库之一对
pacemaker
更新后并重启corosync
即可解决在手动配置
DRBD
资源前一定配置好DBRD
, 如果DRBD
的配置有问题会影响整体效果我在这里说一下我的问题, 做
DRBD
的之前我在node2
创建分区, 分完后忘记partx -a /dev/sdb
,但是很奇怪的是,DRBD
竟然配置成功了,并且两个节点都能手动切换主从和挂载, 数据也没问题!!!!, 到了最后做两个节点自动切换资源的时候, 资源总是默认倾向于node1
节点并且不能切换到node2
, 最后才排查出来并解决
总结
这个实验真心累, 做了接近20个小时, 都快没耐心了, 还好昨晚调整好了心态, 但是今天也做了十二个小时左右, 最后得知自己因为这种小错误才失败的时候真是…. 唉大家做实验一定要好好检查错误, 实在不行就重做吧, 也不知道哪里挖了坑. HA专题应该还有两篇左右, 敬请期待
作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~
作者: AnyISaIln QQ: 1449472454
感谢: MageEdu