测试环境:
OS:rhel6.5
node1: 192.168.1.121 corosync pacemaker mysqld drbd crmsh pcs
node2: 192.168.1.122 corosync pacemaker mysqld drbd
VIP:192.168.1.160
软件版本:
corosync-1.4.7-2.el6.x86_64.rpm
pacemaker-1.1.12-8.el6.x86_64.rpm
pcs-0.9.90-1.el6_4.noarch.rpm
python-pssh-2.3.1-4.2.x86_64.rpm
pssh-2.3.1-4.2.x86_64.rpm
crmsh-2.1-1.6.x86_64.rpm
drbd-8.4.3-33.el6.x86_64.rpm
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
mysql-5.7.9-linux-glibc2.5-x86_64.tar
PS:drbd:分布式磁盘块设备,让本身不具备复制能力的数据直接在内核级别完成数据的备份和传输,不再依赖于应用程序;使用drbd的作用是避免后端的nfs服务器出现单点故障的情况;这里需要特别注意的是在内核2.6.33的版本之后就不用手动安装drbd-kmdl模块了,drbd模块被吸纳至linux内核源码树中。
问题:如果是2.6.33之前的版本,如何安装drbd模块
解决方案:
1.给内核打补丁,重新编译drbd模块
2.使用制作好的rpm包
注意:用户空间工具drbdadm与drbd内核中使用的模块版本要保持一致
#uname -r ###查看内核版本
drbd-8.4.3-33.el6.x86_64.rpm
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
一、安装corosync和pacemaker之前的准备工作
1.节点名称(各个节点通过节点名称来通信的)确保集群的每个节点的名称都能互相解析
编辑/etc/sysconfig/network 文件
HOSTNAME=node1.luochen.com
编辑/etc/hosts 文件
192.168.1.121 node1.luochen.com node1
192.168.1.122 node2.luochen.com node2
# sysctl kernel.hostname=node1.luochen.com
PS:必须确保uname -n 命令查看的结果与/etc/hosts 文件中对应ip地址解析的名称一样
2.确保所有节点之间的时间一致(建议使用NTP服务器)
在所有节点里与同一个时间服务器进行时间同步
# ntpdate ntp-server-ip
3.基于ssh实现无密钥认证通信
# ssh-keygen -t rsa -P '' ####生成一对公钥和私钥,id_rsa 私钥id_rsa.pub 公钥
把公钥复制到其他节点上
# ssh-copy-id -i .ssh/id_rsa.pub [email protected] (第一次需要输入密码)
# ssh node2.luochen.com 'date';date ####查看时间是否一致(同时在node1和node2上执行date命令)
PS:如果要实现在node2上实现与node1的无密钥认证通信,则要在node2上执行同样的操作
4.关闭可能会影响测试错误的服务
# service iptables stop
# service NetworkManager stop
# setenforce permissive
# chkconfig NetworkManager off
二、在node1和node2上安装corosync和pacemaker
# yum -y install corosync*
# yum -y install pacemaker*
# rpm -ql corosync
# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf ###提供配置文件
在corosync配置文件中添加service (指定corosync来启动pacemaker)
compatibility: whitetank
totem {
version: 2 ###协议版本
secauth: on ###开启安全认证功能
threads: 0 ###并行的线程数,0代表采用默认的
interface { ###定义在哪个网卡接口发心跳检测信息
ringnumber: 0 ###每块网卡都有独一无二的环号码
bindnetaddr: 192.168.1.0 ###绑定的网络地址
mcastaddr: 226.100.20.121 ###组播地址 224.0.1.0---238.255.255.255
mcastport: 5405 ###组播端口
ttl: 1 ###只发一次
}
}
logging {
fileline: off
to_stderr: no ###错误信息是否发往标准错误输出
to_logfile: yes ###错误信息是否发往日志文件
logfile: /var/log/cluster/corosync.log ###日志文件
to_syslog: no ###错误信息是否发往syslog
debug: off ###是否开启调错模式
timestamp: off ####记录时间戳,如果写入日志文件就不用启用;这里使用no会出现错误,服务启动不了
logger_subsys {
subsys: AMF
debug: off
}
}
####配置corosync启动时自动启动pacemaker
service {
ver: 0
name: pacemaker
#use_mgmtd: yes
}
aisexec {
user: root
group: root
}
三、生成节点间通信时用到的认证密钥文件,会自动在/etc/corosync/目录下生成authkeys文件
# corosync-keygen
# scp -p /etc/corosync/{authkeys,corosync.conf} node2.luochen.com:/etc/corosync/
四、在node1上下载安装crmsh和pcs
# wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/6.4/x86_64/updates/fastbugs/pcs-0.9.90-1.el6_4.noarch.rpm
# wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/pssh-2.3.1-4.2.x86_64.rpm
# wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/crmsh-2.1-1.6.x86_64.rpm
# wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/python-pssh-2.3.1-4.2.x86_64.rpm
# rpm -ivh pcs-0.9.90-1.el6_4.noarch.rpm
# rpm -ivh python-pssh-2.3.1-4.2.x86_64.rpm pssh-2.3.1-4.2.x86_64.rpm
# yum install python-lxml
# rpm crmsh-2.1-1.6.x86_64.rpm -ivh
五、在node1上启动corosync服务
# service corosync start
# ssh node2.luochen.com 'servcie corosync start'
六、查看corosync集群的状态
# crm status
七、在node1和node2上安装drbd
# rpm -ivh drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm
八、在node1上配置drbd
# vim /etc/drbd.d/global_common.conf
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 60; ###等待降级的超时时间
}
disk {
on-io-error detach; ###io错误时拆掉磁盘
#fencing resource-only;
}
net {
cram-hmac-alg "sha1"; ###使用sha1加密算法传输数据
shared-secret "luochen"; ###双方通信共享的密钥
}
syncer {
rate 1000M; ###设置主备节点同步时的数据传输速率
}
}
九、在node1和node2上准备磁盘分区
# fdisk /dev/sda
p
n
3
+5G
w
# partx -a /dev/sda3
十、在node1上定义一个资源/etc/drbd.d/mystore.res,内容如下:
resource mystore {
on node1.luochen.com {
device /dev/drbd0; ###drbd设备文件 默认从0开始
disk /dev/sda3; ###磁盘分区
address 192.168.1.121:7789; ###node1
meta-disk internal; ###使用本地磁盘保存drbd元数据
}
on node2.luochen.com {
device /dev/drbd0;
disk /dev/sda3;
address 192.168.1.122:7789; ###node2
meta-disk internal;
}
}
十一、将node1上的配置文件同步到node2
# scp /etc/drbd.d/* node2.luochen.com:/etc/drbd.d/
十二、在两个节点上初始化已定义的资源并启动服务
# drbdadm create-md mystore
# service drbd start
# cat /proc/drbd 或者 watch -n 1 'cat /proc/drbd' 或者 drbd-overview ###查看drbd的启动状态(两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary)
在要设置为Primary的节点上使用如下命令来设置主节点:
# drbdadm primary --force mystore 或者 # drbdadm -- --overwrite-data-of-peer primary mystore
再次查看drbd的状态,可以发现数据同步过程已经开始:
# drbd-overview
等数据同步完成以后再次查看状态,可以发现节点已经更新实时状态,且节点已经有了主次:
# drbd-overview
十三、只有在主节点上才能对drbd设备进行格式化和挂载
# mke2fs -t ext4 /dev/drbd0
# mkdir /mydata
# mount /dev/drbd0 /mydata
# cd /mydata
# cp /etc/inittab ./ ###添加测试文件,自己修改一部分
# umount /mydata ###再将此节点降级前需要先卸载挂载目录
# drbdadm secondary mystore ###降级
十四、把对方节点提升为主节点
# drbdadm primary mystore (在需要提升级别的节点上执行)
# mkdir /mydata
# mount /dev/drbd0 /mydata
# ls -a ###查看是否有上面添加的文件,并且文件内容是否一致
PS:drbd自身不会完成角色的切换(自动降级和提升为主节点,需要用pacemaker来完成角色的自动切换)
十五、将两个节点都降级并且让其开机不能自动启动
# umount /mydata (只有在主节点上才执行这步操作)
# drbdadm secondary mystore
# chkconfig drbd off
十六、在node1和node2上安装mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz
1.建立mysql用户
# groupadd -r -g 3306 mysql
# useradd -g mysql -r -u 3306 -s /sbin/nologin mysql
2.安装
# tar xf mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv mysql-5.6.26-linux-glibc2.5-x86_64 mysql
# chown -R root:mysql /usr/local/mysql/*
3.将node1提升为主节点并且挂载目录
# drbdadm primary mystore
# mount /dev/drbd0 /mydata
# mkdir /mydata/data
# chown -R mysql.mysql /mydata/data/
# cd /usr/local/mysql/
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data ###完成初始化
# cp support-files/my-default.cnf /etc/my.cnf ###提供配置文件
# vim /etc/my.cnf
datadir = /mydata/data
innodb_file_per_table = ON
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld ###提供sysv服务脚本
# chmod +x /etc/rc.d/init.d/mysqld
# service mysqld start ###启动测试
# /usr/local/mysql/bin/mysql
mysql> show databases;
mysql> \q
# service mysqld stop
# chkconfig mysqld off
# umount /mydata/
# drbdadm secondary mystore ###node1降级
# drbd-overview ###查看node1是否降级成功
4.将node2提升为主节点并且挂载目录
# scp /etc/my.cnf node2.luochen.com:/etc/ ###在node1上复制配置文件到node2上
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld ###提供sysv服务脚本
# chmod +x /etc/rc.d/init.d/mysqld
# drbdadm primary mystore ###node2提升为主节点
# mount /dev/drbd0 /mydata
# cd /mydata ###存在node1上创建的目录文件
# service mysqld start ###启动测试
# /usr/local/mysql/bin/mysql
mysql> show databases;
mysql> \q
# service mysqld stop
# chkconfig mysqld off
# umount /mydata/
# drbdadm secondary mystore ###node2降级
# drbd-overview ###查看node2是否降级成功
5.在node1和node2停止drbd服务
# service drbd stop
十七、在node1上配置集群工作属性和定义资源
crm (live)# configure
crm (live)configure# property stonith-enabled=false ###禁用stonith设备
crm (live)configure# property no-quorum-policy=ignore ###节点不具备法定票数时忽略
crm (live)configure# rsc_defaults resource-stickiness=100 ###定义资源默认黏性值
定义主资源:
crm(live)configure# primitive mysqlstore ocf:linbit:drbd params drbd_resource=mystore op monitor role=Master interval=30s timeout=20s op monitor role=Slave interval=60s timeout=20s op start timeout=240s op stop timeout=100s
定义主从资源:
crm(live)configure# master ms_mysqlstore mysqlstore meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
crm(live)configure# show
crm(live)configure# verify
crm(live)configure# commit
定义文件系统资源:
crm(live)# configure
crm(live)configure# primitive mysqlfs ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext4" op monitor interval=30s timeout=40s op start timeout=60s op stop timeout=60s on-fail=restart
这里一定不能先提交还要定义排列约束和顺序约束:
crm(live)configure# colocation mysqlfs_with_ms_mysqlstore_master inf: mysqlfs ms_mysqlstore:Master
crm(live)configure# order mysqlfs_after_ms_mysqlstore_master inf: ms_mysqlstore:promote mysqlfs:start
crm(live)configure# verify
crm(live)configure# commit
验证:
# mount ##在运行服务的节点上查看文件系统是否挂载
定义mysql服务资源:
crm(live)# configure
crm(live)configure# primitive mysqld lsb:mysqld
crm(live)configure# colocation mysqld_with_mysqlfs inf: mysqld mysqlfs
crm(live)configure# verify
crm(live)configure# commit
定义vip资源:
crm(live)# configure
crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=192.168.1.160 nic=eth0 cidr_netmask=255.255.255.0
crm(live)configure# colocation vip_with_ms_mysqlstore inf: ms_mysqlstore:Master vip
crm(live)configure# verify
crm(live)configure# commit
# crm status
十八、在运行mysqld服务的节点上添加远程测试用户
# /usr/local/mysql/bin/mysql
mysql> GRANT ALL ON *.* TO root@"192.168.1.%" IDENTIFIED BY "luochen";
mysql> FLUSH PRIVILEGES;
十九、在其他的节点上登录试试
# mysql -uroot -h192.168.1.160 -p
mysql> showdatabases;
二十、模以故障
# crm node standby node1.luochen.com
# crm status ###在node2上执行看资源是否都成功转移
PS:drbdadm命令来将集群的节点提升为主节点和降级(在那个节点上执行就操作那个节点)
# drbdadm secondary mystore
# drbdadm primary mystore
注意:只有主节点上才能挂载drbd设备使用;drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多态(Multi-state)clone类型,即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。