mysql+drbd实现高可用
dbrd可以实现数据的同步,drbd一般是一主一从,所有的读写操作,挂载只能在主节点上进行。drbd主从节点可以调换。
通过corosync+pacemaker实现drbd主从点挂掉后能自动切换到从节点上,实现故障转移继续提供服务。
因此可以将mysql的数据放置到drbd数据块上。
环境:
系统:centos6.6 x86_64
主机: node3.exmaple.com node4.example.com
IP: node3 eth0:192.168.18.13
eth1:10.0.0.13
node4 eth0:192.168.18.14
eth1:10.0.0.14
VIP eth0:1 192.168.18.144
备注:
eth1用于2个节点间心跳信息的传递
2个节点上各有一块5G的/dev/sdb磁盘用于drbd
软件包:mysql5.6.21通用二进制包,corosync1.4.7,pacemaker1.1.12,crmsh2.1,drbd8.4.3
一、配置环境
备注:在2个节点间进行同样操作
1、 关闭防火墙、selinux
#service iptables stop
#chkconfig iptables off
将selinux改为disabled
2、2个节点间时间同步
#ntpdate ntpdate ntp.sjtu.edu.cn
3、2个节点间建立主机互信
#vim /etc/hosts 添加节点间名称解析
192.168.18.13
node3.example.com
node3
192.168.18.14
node4.example.com
node4
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in y.
Your public key has been saved in y.pub.
The key fingerprint is:
cb:0b:f4:48:bf:4c:86:6d:92:a2:5d:5d:1e:48:cd:59
[email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| E |
| o o |
| . + |
| . . |
| o S o |
| o X + . |
| . B @ . |
| o o B o |
| . . + |
+-----------------+
#ssh-copy-id -i /root/.ssh/id_rsa.pub node4
二、安装配置corosync+pacemaker (2个节点)
1、yum安装corosync、pacemaker、crmsh
#yum -y install corosync pacemaker crmsh
备注:如果想安装更高版本的corosync、pacemaker、crmsh,需要配置yum源
[hacluster]
name=HA cluster
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/
enabled=1
gpgcheck=0
2、配置corosync
#cd /etc/corosync/
#cp corosync.conf.example corosync.conf
#vim corosync.conf
compatibility: whitetank
totem {
//心跳信息传递层
version: 2
//版本
secauth: on
//是否开启集群间安全认证,需要通过corosync-keygen创建密钥
threads: 0
//0表示不限制集群间的线程数
interface {
//定义心跳信息传递的接口
ringnumber: 0
bindnetaddr: 10.0.0.0
//绑定的网络地址,网络号
mcastaddr: 226.95.1.1
//多播地址,采用多播的方式,可以有其他选择,如单播、广播
mcastport: 5405
//端口
ttl: 1
//生存周期
}
}
logging {
//集群信息日志
fileline: off
//常用于debug
to_stderr: no
//是否输出错误到前端显示
to_logfile: yes
//是否启用日志文件
logfile: /var/log/cluster/corosync.log
//集群日志文件
to_syslog: no
//是否启用syslog来记录日志,不用启用,因为上面已经定义了日志文件
debug: off
//debug用途
timestamp: on
//s是否开启时间戳
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode:disabled
}
service {
name: pacemaker
//使pacemaker作为corosync的插件,当corosync启动时pacemaker也会被启用
ver: 0
}
aisexec {
user: root
group: root
}
3、生成集群节点间认证密钥
#mv /dev/random /dev/random.bak
#ln -sv /dev/urandom /dev/random
#corosync-keygen
此时在corosync目录下会生成authkey文件
4、将corosync配置文件及认证密钥传递到另一节点
#scp corosync.conf authkey node4:/etc/corosync/
5、启动corosync查看相关信息
#service corosync start
#ssh node4 'service corosync start'
5.1 查看corosync引擎是否正常启动
#grep -e "Corosync Cluster Engine" -e "Configuration file" /var/log/cluster/corosync.log
5.2 查看初始化成员节点通知是否正常发出
#grep TOTEM /var/log/cluster/corosync.log
5.3 检查启动过程是否有错误产生(可忽略)。
#grep ERROR /var/log/cluster/corosync.log
备注:此时会报有stonith错误,因为corosync默认启动stonith功能,稍后会配置禁用此功能。
5.4 查看pacemaker是否正常启动
#grep pcmk_startup /var/log/cluster/corosync.log
5.5 查看集群状态
#crm_mon 或#crm status
备注:查看节点是否online,并看下DC是哪个节点。另外,会显示 0 resources configured ,因为集群中暂没配置任何资源,接下来使用pacemaker配置资源。
三、安装配置drbd(2个节点)
1、编译安装drbd-8.4.3
#tar xf drbd-8.4.3.tar.gz
#cd drbd-8.4.3
# ./configure --prefix=/usr/local/drbd --with-km
备注:--with-km是启用内核模块
# make KDIR=/usr/src/kernels/2.6.32-504.1.3.el6.x86_64
备注:KDIR,内核源码路径需要根据系统实际情况修改
#make install
#mkdir -p /usr/local/drbd/var/run/drbd
#cp /usr/local/drbd/etc/rc.d/drbd /etc/rc.d/init.d/
#chkconfig --add drbd
#chkconfig drbd off
安装drbd模块
#cd /root/soft/drbd-8.4.3/drbd
#make clean
#make KDIR=/usr/src/kernels/2.6.32-504.1.3.el6.x86_64
#cp drbd.ko /lib/modules/2.6.32-504.1.3.el6.x86_64/kernel/lib/
#modprobe drbd
查看模块是否加载成功
[root@node1 ~]# lsmod |grep drbd
drbd 310236 4
libcrc32c 1246 1 drbd
有这2个说明模块加载成功
备注:在另一节点上进行同样操作
2、配置drbd配置文件
drbd的配置文件在/usr/local/drbd/etc目录下的drbd.conf文件以及drbd.d目录下的global_common.conf配置文件
# cat drbd.conf
//定义drbd启动读取哪些配置文件
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
# grep -v '#' global_common.conf|grep -v '^$'
//定义全局属性
global {
usage-count no;
}
common {
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";
}
startup {
}
options {
}
disk {
on-io-error detach;
//配置IO错误处理策略为分离
}
net {
cram-hmac-alg "sha1";
shared-secret "drbdmysqltest";
}
syncer {
rate 10M;
}
}
# ln -sv /usr/local/drbd/lib/drbd /usr/lib/drbd
添加drbd路径,以便使用drbd-overview命令
#echo "PATH=$PATH:/usr/local/drbd/sbin" >> /etc/profile.d/drbd.sh
#chmod +x /etc/profile.d/drbd.sh
#source /etc/profile.d/drbd.sh
3、准备磁盘
将2个节点上的/dev/sdb进行分区,/dev/sdb1,此时不用格式化
4、定义drbd的mysql资源
在drbd.d目录下新建一个mysql.res文件,如下:
[root@node3 drbd.d]# cat mysql.res
resource mysql {
//资源名为mysql
device /dev/drbd0;
//指定设备文件
disk /dev/sdb1;
//指定磁盘
meta-disk internal;
on node3.example.com {
//定义节点
address 192.168.18.13:7789;
}
on node4.example.com {
address 192.168.18.14:7789;
}
}
5、将dbrd配置文件复制一份到另一节点上
#scp drbd.d/* node4:/usr/local/drbd/etc/drbd.d/
6、分别在节点上初始化资源
#drbdadm create-md mysql
7、在2个节点上分别启动drbd服务
#service drbd start
查看资源同步状态
#drbd-overview
此时2个节点均为secondary级别
选择一个节点,启动初始化,并定义为primary主节点
#drbdadm -- --overwrite-data-of-peer primary mysql
此时查看将会发现node3为主节点,在此节点上格式化/dev/drbd0为mysql做准备
四、安装配置mysql
1、只在drbd主节点上进行格式化操作
#mkfs.ext4 /dev/drbd0
2、分别在2个node上创建/mydata目录
#mkdir /mydata
3、在主节点上挂载/dev/drbd0
#mount /dev/drbd0 /mydata
#mkdir /mydata/data
4、安装mysql5.6.21 (2个节点上)
#tar xf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
#cd /usr/local/
#ln -sv mysql-5.6.21-linux-glibc2.5-x86_64 mysql
# groupadd mysql
#useradd -r -g mysql mysql
创建mysql组,mysql系统用户
#cd mysql
#chown -R mysql.mysql *
初始化mysql
#./scripts/mysql_install_db --no-defaults --datadir=/mydata/data/ --user=mysql
# cp support-files/mysql.server /etc/init.d/mysqld
#chmod +x /etc/init.d/mysqld
#mv my.cnf /mydata/
#chown -R mysql.mysql /mydata
#chgrp root /mydata/my.cnf
#chmod 644 /mydata/my.cnf
#chmod 775/mydata/data
编辑my.cnf
[mysqld]
basedir=/usr/local/mysql
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
server_id=1
log-bin=mysql
binlog_format=mixed
datadir=/mydata/data
socket=/tmp/mysql.sock
innodb_file_per_table=ON
pid_file=/var/run/mysqld.pid
autocommit=OFF
transaction-isolation=REPEATABLE-READ
#touch /var/run/mysqld.pid
#chmod 660 /var/run/mysqld.pid
#chown mysql.mysql /var/run/mysqld.pid
启动mysql服务,查看是否成功
#service mysqld start
#chkconfig mysqld off
#chkconfig drbd off
5、 卸载/dev/drbd0,drbd降级
#service mysqld stop
#drbdadm secondary mysql
6、在另一节点上验证mysqld服务
备注: 在node4节点上安装mysql时,不需要进行mysql初始化操作
#drbd-overview
此时查看会发现2个节点均为secondary。将node4升级为primary。
#drbdadm primary mysql
#mount /dev/drbd0 /mydata
此时查看/mydata目录下是否有my.cnf级data目录
启动mysqld服务进行验证
#service mysqld start
#chkconfig mysqld off
#chkconfig drbd off
停止mysqld,drbd服务
#service mysqld stop
#umount /dev/drbd0
#drbdadm secondary mysql
#service drbd stop
备注: 2个节点此时都需要停止mysqld,drbd服务
五、高可用配置
在任一节点进行配置即可。
1、全局属性配置
#crm configure
crm(live)configure# property stonith-enabled=false
crm(live)configure# property no-quorum-policy=ignore
备注:由于只有2个节点且没有stonith设备,因此需要禁用stonith功能并且忽视投票策略。
2、定义资源
基本内容:
查看集群支持的资源代理类型(ra)
crm(live)ra# classes
lsb
ocf / heartbeat linbit pacemaker
service
stonith
查看ra下支持的资源
crm(live)ra#list lsb|ocf
查看资源定义方法
crm(live)ra#info ocf:heartbeat:IPaddr2
备注:考虑有哪些需要被定义的资源,drbd,mysqld,文件系统,vip,drbd主从资源
2.1 定义VIP基本资源
crm(live)configure#primitive myvip ocf:heartbeat:IPaddr \
params ip=192.168.18.144 cidr_netmask=24 nic="eth0:1" \
op monitor interval=20 timeout=20 on-fail=restart
备注:
nic指定VIP运配置在哪块网卡上,本例中配置在eth0的子网卡上。
op 指定动作
2.2 定义drbd基本资源
crm(live)configure#primitive mysql_drbd ocf:linbit:drbd \
params drbd_resource=mysql drbdconf="/usr/local/drbd/etc/drbd.conf" \
op monitor role=Master interval=10 timeout=20 \
op monitor role=Slave interval=20 timeout=20 \
op start timeout=240 interval=0 \
op stop timeout=100 interval=0
备注:
drbd_resource='mysql' :指定drbd资源名称mysql (drbd中定义的资源)
drbdconf="/usr/local/drbd/etc/drbd.conf": 如果是yum安装的drbd此时需要指定drbd配置文件;由于本环境中drbd是编译安装,此时需要指定配置文件路径
由于drbd资源是主从类型,因此需要定义为ms类型资源
2.3 定义drbd主从资源
crm(live)configure#ms ms_mysql_drbd mysql_drbd \
meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
2.4 定义文件系统基本资源
crm(live)configure#primitive mystore ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/mydata" fstype=ext4 \
op monitor interval=40 timeout=40 \
op start timeout=60 interval=0 \
op stop timeout=60 interval=0
2.5 定义mysqld基本资源
crm(live)configure#primitive mysqld lsb:mysqld \
op monitor interval=20 timeout=20 on-fail=restart
备注:LSB风格的服务均可以使用lsb资源代理(ra)
3、定义约束
crm资源约束有location、colocation、order约束
location:资源对节点的偏好,和资源粘性效果一样
colocation:排序约束,哪些资源运行在一个节点上的可能性
order:顺序约束,资源启动的先后顺序
备注:
资源启动顺序考虑:drbd--->Filesystem--->vip--->mysqld
资源运行同一节点考虑: 所有资源都要运行在一个节点上
3.1 定义位置约束
crm(live)configure#colocation c_mysqld_with_mystore inf: mysqld mystore
crm(live)configure#colocation c_mystore_with_ms_mysql_drbd inf: mystore ms_mysql_drbd:Master
crm(live)configure#colocation c_myvip_with_mysqld inf: myvip mysqld
备注:inf表示正无穷
3.2 定义顺序约束
crm(live)configure#order ms_mysql_drbd_before_mystore Mandatory: ms_mysql_drbd:promote mystore:start
crm(live)configure#order mystore_before_mysqld Mandatory: mystore:start mysqld:start
crm(live)configure#order myvip_before_mysqld Mandatory: myvip mysqld
TPS:
crm(live)configure#verify
//进行配置验证
crm(live)configure#commit
//提交配置
通过心跳信息进行节点间配置同步
crm(live)configure#show
//查看配置
crm(live)configure#edit
//以文本形式显示当前配置,可以再次编辑修改
crm(live)configure#bye
//退出crmsh
六、查看集群节点间资源分配状态
#crm status
如果此时显示节点offline,可以使用下面命令启动节点
#crm node online node3.exmaple.com
查看集群资源
#crm reosurce show
如果有错误,执行下面命令重新分配资源
#crm resource cleanup mysql_drbd 资源名称
七、测试
如果此时资源均运行在node3节点上,手动将node3节点standby,查看节点是否转移到node4节点
#crm node standby node3.exmaple.com
#crm status