Corosync+Pacemaker+DRBD实现MySQL的高可用
高可用集群方案简介:
corosync是高可用集群中基础事务层 (Messaging Layer)的一个实现方案与heartbeat的功能类似,主要用来传递集群的事务信息,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。Corosync识别节点是通过authkey来实现的,不同于heartbeat v1 v2,Corosync的authkey是通过corosync-keygen命令生成的,具有更高的安全性。
pacemaker是一个集群资源管理器,从heartbeat v3版本中分裂出来。它利用集群事务层提供的组件对各节点进行资源管理及监控并从节点或资源级别的故障中恢复,以实现群集服务的最大可用性。
DRBD简介:
DRBD:Distributed Replicated Block Device,分布式复制快设备;DRBD是由内核模块和相关脚本而构成,无共享的、服务器之间镜像块设备内容的存储复制解决方案。
为什么使用DRBD:以之前的博文中介绍的共享存储NFS服务为例,当前端都是高可用或冗余,但是后端只有NFS服务为其做共享存储,那么存储本身属于单点故障,如果其节点一旦故障,可导致整个架构的瘫痪;所以此时需要对共享存储做高可用。
工作方式:在每个节点上预留出块级别的存储设备,而后能够实现在节点内核当中启动一个内核模块“drbd”模块,这个模块能够监听在套接字上,这样之后在某个节点中的某个进程试图在drbd的分区中写入数据的时候,这个数据一定会流进内核debd模块之后内核会将数据复制一份并通过本地的tcp/ip协议栈发往另外一个节点的drbd进程,其收到请求后将数据默默的存放在本地的dbd的存储空间中,从而达到一致,所以当写入数据的时候首先会流进本地内核中的drbd模块,其会被分为数据流 一个继续往下存储一个则通过网络发送给另外的drbd节点从而达成数据的冗余。
两种工作模式:
primary/secondary:主备节点
primary:读写
secondary:不允许挂载
Traditional Filesystem
primary/primary:双主模型
primary:读写
Cluster FileSystem
3种复制模式:
protocol A:异步复制,数据在本地写成功之后立即返回,数据在发送过程中可能丢失(可靠性最低,性能最好)。
protocol B:内存同步复制,数据成功发送至从节点后返回,数据尚在从节点的内存中。
protocol C:同步复制,数据成功发送至从节点,同步到磁盘后才返回(可靠性最高,性能最差)。
配置DRBD本身并不依赖于其他高可用服务,可以完全手动,只有想让其自动完成提供或降级才需要依赖高可用集群套件,一般来讲DRBD可以与heartbeat 、cman 、crorsync等结合使用。
实验拓扑:
实验环境:
OS:CentOS_6.7-x86_64
Kernel:2.6.32-431
注意:drbd服务可通关编译或rpm包安装;本次实验drbd服务通过rpm包安装,由于rpm包最新版本支持内核版本为2.6.32-431,所以实验环境CentOS6.7内核需额外安装;
DRBD,rpm包下载地址:
ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/
CentOS_6,2.6.32-431内核下载地址:
http://vault.centos.org/6.5/os/x86_64/Packages/
Noode1:
IP:eth0,192.168.1.4
VIP:eth0:0,192.168.1.3
Noode2:
IP:eth0,192.168.1.5
VIP:eth0:0,192.168.1.3
NTP:
IP:eth0,192.168.1.4
集群所需资源:VIP、mysqld、DRBD
实验流程:
配置高可用集群的前提:
1、时间必须保持同步:使用ntp服务器;
[root@node0 ~]# yum install ntp
[root@node0 ~]# vim /etc/ntp.conf
restrict 192.168.1.0 mask 255.255.255.0 nomodify
server 127.127.1.0
fudge 127.127.1.0 stratum 1
启动服务:
[root@node0 ~]# chkconfig ntpd on
[root@node0 ~]# service ntpd start
各节点添加对时任务:
[root@node1 ~]# crontab -e
*/5 * * * * /usr/sbin/ntpdate 192.168.1.4 &> /dev/null
2、节点必须名称互相通信:
编辑/etc/host 解析节点名称:
[root@node0 ~]# vim /etc/hosts
192.168.1.4 node0.chencer.org node0
192.168.1.5 node1.chencer.org node1
3、ssh密钥认证进行通信;
节点间ssh互信认证:
[root@node0 ~]# ssh-keygen -t rsa
[root@node0 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
配置drbd:
两个节点上提供相同的硬盘分区:
安装drbd:
[root@node0 drbd]# yum install drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm
编辑配置文件:
drbd的配置有三段:
全局段(global):
通用配置段(common):为各res提供共享配置;
资源专用配置段(通过定义资源进行):为特定的res提供专用配置;
[root@node0 ~]# vim /etc/drbd.d/global_common.con
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;
handlers {
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 120;
# degr-wfc-timeout 120;
}
disk {
on-io-error detach;
# fencing resource-only;
}
net {
cram-hmac-alg "sha1";
shared-secret "mydrbdlab";
}
syncer {
rate 1000M;
}
}
定义资源:
[root@node0 ~]# vim /etc/drbd.d/data.res
resource data {
on node0.chencer.org {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.4:7789;
meta-disk internal;
}
on node1.chencer.org {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.5:7789;
meta-disk internal;
}
}
将以上两文件复制到另一节点:
[root@node0 ~]# scp /etc/drbd.d/* node1:/etc/drbd.d/
确保两节点drbd服务不会开机自动启动:
[root@node0 ~]# chkconfig drbd off
初始化资源并启动服务:
[root@node0 ~]# drbdadm create-md data
同步资源:
[root@node0 ~]# drbdadm primary --force data
[root@node0 ~]# watch ‘drbd-overview’
此时在主节点创建文件系统并挂载:
[root@node0 ~]# mke2fs -t ext4 -b 4096 /dev/drbd0
[root@node0 ~]# mkdir /data
[root@node0 ~]# mount /dev/drbd0 /data/
二进制格式安装Mysql-5.5:
解决软件依赖关系:
[root@node0 ]# yum install libaio
创建mysql用户:
[root@node0 ~]# groupadd -g 306 -r mysql
[root@node0 ~]# useradd -u 306 -g 306 -r mysql
[root@node0 mysql]# mkdir /data/mydata
[root@node0 mysql]# chown -R mysql.mysql /data/mydata
二进制安装设置:
[root@node0 ~]# tar xf mysql-5.5.47-linux2.6-x86_64.tar.gz -C /usr/local/
[root@node0 ~]# cd /usr/local/
[root@node0 local]# ln -sv mysql-5.5.47-linux2.6-x86_64 mysql
"mysql" -> "mysql-5.5.47-linux2.6-x86_64"
[root@node0 local]# cd mysql/
[root@node0 mysql]# chown -R root.mysql ./*
导出头文件、库文件、man手册:
[root@node0 mysql]# ln -sv /usr/local/mysql/include /usr/include/mysql
"/usr/include/mysql" -> "/usr/local/mysql/include"
[root@node0 mysql]# vim /etc/ld.so.conf.d/mysql-5.5-x86_64.conf
/usr/local/mysql/lib
[root@node0 mysql]# ldconfig
[root@node0 mysql]# vim /etc/man.config
MANPATH /usr/local/mysql/man
添加并重读环境变量:
[root@node0 mysql]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@node0 mysql]# source /etc/profile.d/mysql.sh
提供配置文件和服务启动脚本:
[root@node0 mysql]# mkdir /etc/mysql
[root@node0 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
[root@node0 mysql]# vim /etc/mysql/my.cnf
[mysqld]
datadir = /data/mydata
thread_concurrency = 2
[root@node0 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node0 mysql]# chmod +x /etc/rc.d/init.d/mysqld
加入服务列表,保证开机不自动启动:
[root@node0 mysql]# chkconfig --add mysqld
[root@node0 mysql]# chkconfig mysqld off
在drbd主节点初始化数据:
[root@node0 mysql]# scripts/mysql_install_db --user=mysql --datadir=/data/mydata/
测试启动数据库:
[root@node0 mysql]# service mysqld start
Starting MySQL... SUCCESS!
为数据库创建并授权测试用户:
[root@node0 mysql]# mysql
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on *.* to root@'192.168.1.%' identified by 'rootroot';
Query OK, 0 rows affected (1.65 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
切换至另一节点测试:
[root@node0 mysql]# service mysqld stop
Shutting down MySQL. SUCCESS!
[root@node0 mysql]# umount /data/
[root@node0 mysql]# drbdadm secondary data
[root@node1 mysql]# drbdadm primary data
[root@node1 mysql]# drbd-overview
0:data/0 Connected Primary/Secondary UpToDate/UpToDate C r-----
挂载并启动服务:
[root@node1 mysql]# mkdir /data
[root@node1 mysql]# mount /dev/drbd0 /data/
[root@node1 mysql]# service mysqld start
Starting MySQL... SUCCESS!
连接测试数据库:
[root@node1 mysql]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.34 sec)
停止服务,并卸载存储:
[root@node1 mysql]# service mysqld stop
Shutting down MySQL. SUCCESS!
[root@node1 mysql]# umount /data/
[root@node1 mysql]# service drbd status
[root@node0 mysql]# service drbd stop
安装配置corosync+pacemaker+crmsh:
注意:RHEL自6.4起不再提供集群的命令行配置工具crmsh,转而使用pcs;可添加以下repo源,下载并安装crmsh;crmsh依赖于corosync和pacemaker,所以要先安装corosync和pacemaker;注意同时配置好epel源。
[root@node0 ~]# cat /etc/yum.repos.d/networkha-clusteringStable.repo
[network_ha-clustering_Stable]
name=Stable High Availability/Clustering packages (CentOS_CentOS-6)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/
enabled=1
gpgcheck=0
gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/repodata/repomd.xml.key
安装corosync+pacemaker+crmsh:
[root@node0 ~]# yum install corosync pacemaker crmsh
[root@node0 ~]# rpm -ql corosync | less
/etc/corosync \\:配置文件目录;
/etc/corosync/corosync.conf.example.udpu \\:配置文件模板
生成认证文件:
[root@node0 corosync]# corosync-keygen
编辑配置文件:
[root@node0 ~]# cd /etc/corosync/
[root@node0 corosync]# cp corosync.conf.example.udpu corosync.conf
[root@node0 corosync]# vim corosync.conf
compatibility: whitetank
totem {
version: 2
secauth: off
interface {
member {
memberaddr: 192.168.1.4
}
member {
memberaddr: 192.168.1.5
}
ringnumber: 0
bindnetaddr: 192.168.1.0
mcastaddr: 239.255.1.1
mcastport: 5405
ttl: 1
}
transport: udpu
}
logging {
fileline: off
to_logfile: no
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
为pacemaker提供配置文件:
[root@node0 corosync]# vim service.d/pcmk
service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 1
}
将以上文件复制给另一节点:
[root@node0 corosync]# scp -r authkey corosync.conf service.d node1:/etc/corosync/
两节点启动corosync和pacemaker服务:
[root@node0 corosync]# service corosync start;service pacemaker start;ssh node1 'service corosync start;service pacemaker start'
查看当前状态:
[root@node0 corosync]# crm status
Last updated: Sun Jan 24 17:36:46 2016
Last change: Sun Jan 24 17:36:34 2016
Stack: classic openais (with plugin)
Current DC: node1.chencer.org - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
0 Resources configured
Online: [ node0.chencer.org node1.chencer.org ]
配置集群的工作属性:
而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用;并且因为双节点,所以忽略法定数:
[root@node0 ~]# crm \\:进入交互式命令界面;
crm(live)# configure \\:进入configure模式;
crm(live)configure# property stonith-enabled=false \\:禁用stonith
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# verify \\:检查配置;
crm(live)configure# commit \\:保存配置;
添加资源:
配置DRBD资源:
crm(live)configure# primitive drbd ocf:linbit:drbd params drbd_resource=data op monitor role=Master interval=10s timeout=20s op monitor role=Slave interval=20s timeout=30s op start timeout=240s op stop timeout=100s
crm(live)configure# master ms_drbd drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
crm(live)configure# verify
添加资源:VIP、Filesystem、mysqlserver
crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=192.168.1.3 op monitor interval=10s timeout=20s
crm(live)configure# primitive data ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/data" fstype="ext4" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s
crm(live)configure# primitive mysql lsb:mysqld op monitor interval=20s timeout=30s
crm(live)configure# verify
定义各种资源约束:
crm(live)configure# colocation data_with_ms_drbd inf: data ms_drbd:Master
crm(live)configure# colocation vip_with_data inf: vip data
crm(live)configure# colocation mysql_with_data inf: mysql data
crm(live)configure# order data_after_ms_drbd inf: ms_drbd:promote data:start
crm(live)configure# order vip_after_data inf: data vip
crm(live)configure# order mysql_after_vip inf: vip mysql
crm(live)configure# verify
crm(live)configure# commit
查看所有资源:
crm(live)configure# show
node node0.chencer.org
node node1.chencer.org
primitive data Filesystem \
params device="/dev/drbd0" directory="/data" fstype=ext4 \
op monitor interval=20s timeout=40s \
op start timeout=60s interval=0 \
op stop timeout=60s interval=0
primitive drbd ocf:linbit:drbd \
params drbd_resource=data \
op monitor role=Master interval=10s timeout=20s \
op monitor role=Slave interval=20s timeout=30s \
op start timeout=240s interval=0 \
op stop timeout=100s interval=0
primitive mysql lsb:mysqld \
op monitor interval=20s timeout=30s
primitive vip IPaddr \
params ip=192.168.1.3 \
op monitor interval=10s timeout=20s
ms ms_drbd drbd \
meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
colocation data_with_ms_drbd inf: data ms_drbd:Master
colocation mysql_with_data inf: mysql data
colocation vip_with_data inf: vip data
order data_after_ms_drbd inf: ms_drbd:promote data:start
order mysql_after_vip inf: vip mysql
order vip_after_data inf: data vip
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
启动资源组,查看资源状态:
crm(live)# resource start mysqlservice
crm(live)# status
连接数据库测试:
[root@node2 ~]# mysql -h192.168.1.3 -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database tdb;
Query OK, 1 row affected (0.03 sec)
转移资源,测试链接数据库:
crm(live)# node standby
crm(live)# status
![enter description here][6]
[root@node2 ~]# mysql -h192.168.1.3 -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| tdb |
| test |
| testdb |
+--------------------+
6 rows in set (0.06 sec)
数据同步成功。