主机名修改之后最好重启一下
查看主机 server1 和 server2 的IP:
配置两台主机的 hosts 文件:
yum 这个命令要 root 用户才有权限
配置 drbd
一般只需要添加红色字体部分
global {
usage-count yes;
}
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 {
}
net {
protocol C;
}
}
resource r0 {
on server1 {
device /dev/drbd1;
disk /dev/sda2;
address 192.168.1.123:77; # 主机 server1 的ip
meta-disk internal;
}
on server2 {
device /dev/drbd1;
disk /dev/sda2;
address 192.168.1.129:77; # 主机 server2 的ip
meta-disk internal;
}
}
Drbd 管理:
两台主机启动 drbd
两台主机查看 drbd 状态:
设置 server1 为主节点,并格式化和挂载目录
配置 heartbeat
主要有三个配置文件:
ha.cf 主配置文件
haresource 资源管理文件
authkeys 心跳加密文件
配置主机其中一张网卡的静态IP:
配置 ha.cf
debugfile /var/log/ha-debug //调试日志位置
logfacility local0
keepalive 2 //2秒检测一次心跳连接
deadtime 30 //多长时间检测不到主服务器心跳为有问题,不要设置太低
warntime 10 //警告时间(最好在2-10秒)
initdead 120 //初始化启动时,120秒内无链接为正常
udpport 694 //使用udp 694做为bcast/ucast通讯端口
ucast eth3 10.0.0.201 //单播方式连接,eth1是本身对应的心跳网卡 主从都写对方的心跳ip
auto_failback on //开启自动切换,主服恢复后,自动切换回来
node server1 //申明主服,注意是uname -n的完全限定域名
node server2 //申明备服,注意是uname -n的完全限定域名
ping 192.168.1.254 // ping 的是网关
crm respawn
apiauth mgmtd uid=hacluster
respawn root /usr/lib/heartbeat/mgmtd -v
配置 authkeys
auth 1
1 crc
chmod 600 authkeys 命令设置 authkeys 权限 (authkeys 的权限一定要设置,不然日志报错)
配置 haresources
注:该文件内IPaddr,Filesystem等脚本存放路径在/etc/ha.d/resource.d/下,也可在该目录下存放服务启动脚本(例如:mysqld),将相同脚本名称添到/etc/ha.d/haresources内容中,从而跟随heartbeat启动而启动该脚本。
IPaddr::192.168.1.100/24/eth2:用IPaddr脚本配置浮动VIP
drbddisk::r0:用drbddisk脚本实现DRBD主从节点资源组的挂载和卸载
Filesystem::/dev/drbd0::/data::ext4:用Filesystem脚本实现磁盘挂载和卸载
二、安装 MYSQL
以下方法是解决上上面报错问题的方法:
登录 mysql
注意:@ 左边是用户名,右边是域名、IP或%,表示可以访问 mysql 的域名和IP,% 表示外部任何地址都能访问。
修改 mysql 的默认引擎为 InnoDB
停止 mysql,命令 service mysqld stop
编辑 my.cnf
配置好heartbeat之后,因为主heartbeat启动的时候会挂载drdb文件系统以及启动mysql,切换的时候会将主上的mysql停止并卸载文件系统,从上会挂载文件系统,并启动mysql。因此需要做如下操作(两台服务器):
到这里heartbeat+drbd+mysql高可用环境就搭建结束了。接下来进行测试。
高可用测试:
启动 server1 主机上的 mysql
查看 data 目录发现只有存放数据的 mysqldata 目录
启动 drbd (两台服务器):
查看 drbd 的状态:
设置 server1 为主机,并挂载
启动 heartbeat(两台服务器):
查看非心跳网卡的IP:
可以看见虚拟ip 192.168.1.100已经存在了。说明成功了。我们看看heartbeat的日志就能发现。
先看看两台服务器的状态:
可以看见挂载在server1服务器。
测试方法:
1.停掉master上的mysqld,看看是否切换(因为heartheat不检查服务的可用性,因此需要通过而外的脚本来实现)。
2.停掉master的heartheat看看是否能正常切换。
3.停掉master的网络或者直接将master系统shutdown,看看能否正常切换。
4.启动master的heartbeat看看是否能正常切换回来。
5.重新启动master看看能否切换过程是否OK。
注意:这里说的切换是不是已经将mysql停掉、是否卸载了文件系统等等。
我就停止server1上的heartbeat来测试是否会自动切换,这里除了第一条无法实现,其他的都可以切换:
可以看见已经切换了,我们看 server2的情况:
查看 server2 的ip 和 浮动IP:
查看日志,查看发生的情况:
对于mysqld服务挂掉的情况无法实现自动切换,所以需要一个脚本来帮助我们完成,我这里有个简单的脚本,能实现当mysqld服务不可用时进行自动切换,当进行切换时发送邮件等。该脚本放在主服务器执行,也就是运行mysqld服务的服务器上执行。
脚本存在灵活性所以不建议使用脚本(可以直接跳过这一段,阅读下面的 HA 图形界面的安装和配置部分):
Mysqlmon.sh 的内容如下:
#!/bin/bashtrap 'echo PROGRAM INTERRUPTED; exit 1' INTusername=rootpassword=123456n=0log='/var/log/mysqlmon.log'
while true
do if /usr/local/mysql/bin/mysql -u${username} -p${password} -e "use test" >&/dev/null; then echo "`date +"%Y-%m-%d %H:%M:%S"` mysqld is alive!" >> ${log} n=0 else echo "`date +"%Y-%m-%d %H:%M:%S"` mysqld cannot be connected!" >> ${log} n=$[n + 1] if [ $n -eq 3 ]; then /etc/init.d/heartbeat stop echo "`date +"%Y-%m-%d %H:%M:%S"` mysqld switched to backup!" >> ${log} echo "`date +"%Y-%m-%d %H:%M:%S"` mysqld switched to backup" | mutt -s "mysqld switched to backup" saltstack@163.com break fi fi sleep 10
done
说明:mysql 编译安装的路径和yum 命令安装mysql的路径是不一样的,所以 /usr/local/mysql/bin/mysql 根据安装方式的不一样具体修改
Mutt 是发送邮件命令,通过 rpm -qa | grep -e mutt 查看 mutt 是否安装,如果没有安装,那么需要安装
通过 nohup mysqlmon.sh & 挂在后台执行,但是报错如下:
分析和解决办法:
因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。从你的脚本及报告的错误看来, 很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\\r\\n来标识, 其ASCII码分别是0x0D, 0x0A.
可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的
(1). vi filename
然后用命令
:set ff?
可以看到dos或unix的字样. 如果的确是dos格式的, 那么你可以用set ff=unix把它强制为unix格式的, 然后存盘退出. 再运行一遍看.ok了。
希望遇到类似问题的同学能够如此解决。
解决方法:
打开 mysqlmon.sh
打开之后按一下键盘上 Esc 键,随后输入 :set ff? 回车
将文件格式转换为 unix 之后需要修改 mysqlmon.sh 文件的权限
重新将 mysqlmon.sh 挂在后台执行,执行的时候 mysqlmon.sh 最好是绝对路径:
另外一个脚本:
#!/bin/sh
cat << EOF
+-----------------------------------------------------------------------------+
| === Welcome to LinuxTone=== |
|---------------------[url]http://www.linuxtone.org[/url]-------------------------|
+-------------------------------By:hamgua--------------------------------+
EOF
MYPORT=`netstat -na|grep "tcp"|grep "3306"|awk -F[:" "]+ '{print $5}'`
HAPORT=`netstat -na|grep "udp"|grep "694"|awk -F[:" "]+ '{print $5}'`
PING=`ping -c 5 www.linuxtone.org|awk -F, '/packets/{print $3}'|cut -c 2-|awk '{print $1}'`
DB1IP=`ifconfig eth0|awk '/inet/{print $2}'|cut -c 6-`
#DB2IP is your next mysqlserver and haserver IP,According to it own IP to fill
log='/var/log/mysqlmon.log'
while [ "$PING" != "100\\%" ]
do
if [ "$MYPORT" == "3306"];then
if [ "$HAPORT" == "694" ];then
echo "$DB1IP mysql and ha is running......"
else
echo "$DB1IP mysql is running,but ha is down,start ha now"
/etc/init.d/heartbeat start
if [ "$HAPORT" == "694"];then
echo "$DB1IP ha start successful,mysql and ha all running......"
else
echo "$DB1IP ha is down,let (DB2IP) to take over mysql,please start ha now!" > ${log}
fi
fi
else
if [ "$HAPORT" == "694" ];then
echo "$DB1IP mysql is down,but ha is runing,now shutdown ha,let (DB2IP) to take over mysql,then restart mysql....." > ${log}
/etc/init.d/heartbeat stop
/etc/init.d/mysqld start
if [ "$MYPORT" == "3306"];then
/etc/init.d/heartbeat start
echo "$DB1IP$mysql restart successful,now mysql and ha all running......"
fi
else
echo "$DB1IPmysql and ha all down,first restart msyql,when mysql is run,restart ha"
/etc/init.d/mysqld start
if [ "$MYPORT" == "3306"];then
/etc/init.d/heartbeat start
if [ "$HAPORT" == "694" ];then
echo "$DB1IPmysql and ha all running......"
else
echo "$DB1IPmysql is running,ha is down,please restart ha" > ${log}
fi
else
echo "$DB1IPmysql and ha all down,let (DB2IP) to take over mysql,please restart mysql" > ${log}
fi
fi
fi
sleep 10
done
要在 /etc/sysconfig/iptables 文件中添加如下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -p udp -m --udp --dport 694 -d 10.0.0.201 -j ACCEPT
在 server1 上将 mysqlmon.sh 挂在后台执行:
三、安装、配置 HA-GUI :
网上下载 pacemaker-mgmt-master.zip ,下载路径如下:
https://github.com/ClusterLabs/pacemaker-mgmt 如下图所示:
下载下来的 zip 包不要放置在挂载的网络磁盘上,要将它放置在主机本身的磁盘上,我是将磁盘拷贝在 home/用户名目录/Downloads 目录下
使用 unzip 命令解压 zip 包:
然后通过 cd 命令打开解压的文件
编译安装:
第一步:
./ConfigureMe configure
有可能会报错,错误如下:
那么需要安装一下依赖包:
yum install perl-TimeDate OpenIPMI-libs lm_sensors libxslt libibverbs librdmacm pkgconfig libtool intltool gettext-devel glib2-devel python-devel libxml2-devel pam-devel ncurses-devel pygtk2 libtool-ltdl libqb clusterlib libtool-ltdl-devel swig gnutls-devel -y
第二部编译:
Make
第三步安装:
Make install
打开 ha 的图形界面
用命令 ha_gui & 打开图形界面
如果 IP(主机名)、用户名、密码 都是正确的,但是不可以连接,那么可能是主机上的 pacemaker 或者 corosync 没有启动(因为我这里将 pacemaker 作为 corosync 的插件使用,所以只需要启动 corosync 即可),启动 corosync:
登录后的默认界面:
关闭 STONITH 支持
默认的情况下pacemaker中启用了stonith,但是我们实际部署集群时可能一般都不会用到stonith资源。当启用了stonith而集群中又没有stonith资源时,集群中的资源都是无法启动的。在启动资源时会报错:
引用
Jul 15 02:01:19 drbd1 mgmtd: [25127]: ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
Jul 15 02:01:19 drbd1 mgmtd: [25127]: ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
Jul 15 02:01:19 drbd1 mgmtd: [25127]: ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
解决办法,就是把stonith-enabled选项禁用。
有如下两种方式:
a、crm shell 方式
在pacemaker 包中提供crm shell 方式。
其中,crm 是一个非常友好的,同时支持交互和非交互两种模式的集成命令;此外,还有一些按功能划分的命令,例如:crm_mon、crm_resource、cibadmin等(可参考heartbeat 2.x)。
下面两条命令都能关闭STONITH:
# crm_attribute -t crm_config -n stonith-enabled -v false
# crm configure property stonith-enabled="false"
若要进入crm 的交互模式,可直接运行crm 即可:
引用
# crm
crm(live)#
在该环境下,敲入help 可获取帮助信息。敲入对应的命令,可进入下一层菜单,用cd、或end、up都可以返回上一层,exit 退出。
※ 注意,的管理命令及非交互模式下的crm,在输入命令后会马上生效;而交互默认下的crm,必须手动用commit 命令提交后,配置才能生效。因crm 使用方便,在管理时经常使用。
b、hb_gui 方式
这是在Xwin下面的GUI 管理方式,从heartbeat 2.x就已经提供。在heartbeat 3中必须安装pacemaker-mgmt和pacemaker-mgmt-client才能用到,并且,需要在ha.cf中打开mgmtd 支持。
以关闭STONITH为例,可在下面的窗口中修改:
在pacemaker-mgmt 提供了新的管理界面,并且可以跨机器登陆管理。远程管理时,必须使用远端机器上的hacluster用户,或属于haclinet组的管理账号(heartbeat 2.x 只能在本机127.0.0.1上登陆管理)。另外,若当前连接的是本地,而手动把heartbeat 服务关闭时,hb_gui 会通过相同的用户名和密码尝试连接到集群节点中的其他机器上,继续追踪集群状态。
hb_gui 的设定,在点击“应用”或“确认”后会马上生效。
4、使用pacemaker进行配置(图形界面运用不熟,所以最后选择的是CRM命令的方式配置)
1、清空旧的配置文件
执行:
# crm configure erase
或者以crm 交互方式提交:
引用
# crm
crm(live)# configure
crm(live)configure# erase
crm(live)configure# commit
crm(live)configure# exit
bye
2、关闭 quorum
pacemaker中有quorum的概念,即集群中必须有一半的节点处于online的状态,则集群被认为是have quorum(可以认为是达到合法节点数要求)。如果少于一半的节点在线,那么pacemaker认为集群达不到节点数要求,从而拒绝启动集群中的资源。但是这种策略对于2个节点的集群明显是不合理的,所以就会发生当2个节点的集群其中一个节点失效时所有的集群都无法启动的情况。
同样的,也关闭STONITH,执行:
# crm configure property no-quorum-policy=ignore
# crm configure property stonith-enabled="false"
3、配置 vip 、drbd、 mysql、 配置共享存储等
(1)、配置虚拟 ip (浮动ip)
crm configure primitive myip ocf:heartbeat:IPaddr params ip="192.168.1.100" nic="eth0" cidr_netmask="24" op monitor interval=20s timeout=30s
表示定义一个主资源 myip, ocf:heartbeat:IPaddr表示资源代理的类型为ocf,提供者是heartbeat,具体的代理为IPaddr,params表示代理IPaddr的参数为ip="192.168.0.100" nic="eth0" cidr_netmask="24"等,op表示对此资源的操作,有monitor、start、stop、status等。interval表示每隔20s对资源的健康状态进行一次检查,如果检测不成功,30s后就超时了。
(2)、配置 mysqld 服务
使用LSB方式
crm configure primitive mysql lsb:mysql op monitor interval="20s" timeout="30s" op start interval="0" timeout="180s" op stop interval="0" timeout="240s"
使用OCF方式(推荐使用)
crm configure primitive mysql ocf:heartbeat:mysql params binary="/usr/local/mysql/bin/mysqld_safe" config="/etc/my.cnf" user="mysql" group="mysql" log="/var/lib/mysql/mysql_error.log" pid="/var/lib/mysql/mysql.pid" socket="/var/lib/mysql/mysql.sock" datadir="/drbd/data" op monitor interval="60s" timeout="60s" op start timeout="180s" op stop timeout="240s"
(3)、配置共享存储
crm configure primitive fs ocf:heartbeat:Filesystemparams device="/dev/drbd1" directory="/drbd" fstype="ext4" op start interval=0 timeout=60s op stop interval=0 timeout=60s meta target-role=Started
(4)、配置 DRBD 资源
crm configure primitive drbd_r0 ocf:linbit:drbd params drbd_resource="r0" op monitor interval="15s" op start timeout="240s" op stop timeout="100s"
(5)、配置 DRBD 资源主从关系(定义中只有一个 Master 节点)
crm configure ms ms_drbd_mysql drbd_r0 meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
(6)、组资源和约束
说明:通过 “组” 确保 DRBD、MySQL和VIP 是在同一个节点(Master) 并且确定资源的启动/停止顺序。
启动: fs -->myip -->mysql
停止: mysql -->myip -->fs
crm configure group mysqlservice fs myip mysql
组 mysqlservice 永远只在 Master 节点:
crm configure colocation fs_with_drbd_r0 inf: mysqlservice ms_drbd_mysql:Master
MySQL 的启动永远是在 DRBD Master 之后:
-----第一种写法:
crm configure order o_drbd_before_mysql inf: ms_drbd_mysql:promote g_mysql:start
-----第二种写法:
crm configure order fs_after_drbd inf: ms_drbd_mysql:promote fs:start
crm configure order mysql_after_fs inf: fs:start mysql:start
查看配置(与以上的配置有一点的差别,但是没有问题)
以下是配置的有效内容:
查看集群状态:
Failover 测试:
将 server2 主机设置为 Standby 状态:
将 server2 恢复 online 状态:
“断网”即停止Master服务
避免因”断网”而发生”split brain”(“裂脑”)
利用Pacemaker去ping一个的网络(比如网络路由),当发现主机网络断网(被隔离)的时候,即阻止该主机为DRBD master.
[root@centos1 ~]# crm configurecrm(live)configure# primitive p_ping ocf:pacemaker:ping params name="ping" multiplier="1000" host_list="192.168.1.1" op monitor interval="15s" timeout="60s" op start interval="0" timeout="60s"
op stop interval="0" timeout="120s"
由于两台主机需要运行ping去检查他们的网络连接,需要创建一个clone (cl_ping),让ping资源可以运行在集群所有的主机上.
crm(live)configure# clone cl_ping p_ping meta interleave="true"
告诉Pacemaker如何处理ping的结果:
crm(live)configure# location l_drbd_master_on_ping ms_drbd_mysql rule $role="Master" -inf: not_defined ping or ping number:lte 0
上面的例子表示:当主机没有ping的服务或是无法ping通至少一个节点的时候,就为该主机设置一个偏好分数(preference score)为负无穷大 (-inf),
从而让location约束(l_drbd_master_on_ping)控制DRBD master的资源地址.
验证和提交配置:
crm(live)configure# verifyWARNING: p_drbd_mysql: action monitor not advertised in meta-data, it may not be supported by the RAcrm(live)configure# commitcrm(live)configure# quit
检查 ping 服务是否已经在运行:
断网测试
- 在当前Master停止网络服务:
说明:通过以上断网实验发现并没有到达理想效果,之前的配置有待研究
停止 Masters 上的 mysql 服务:
说明: pacemkaer 能够对主机上出了故障的服务进行健康检查,并且重新启动
从”Split-Brain”中恢复
DRBD的Active/Standby架构设计的两主机的数据因为某些原因也可能发生不一致.假如这种情况发生的话,
DRBD两主机之间将会中断连接(可以通过/etc/init.d/drbd status或drbd-overview查看他们的关系状态).
如果查看日志(/var/log/messages)确定造成DRBD连接中断的原因是”Split-Brain”的话,那么就需要找出/确定拥有正确的数据的主机,然后让DRBD重新同步数据.
- 查看DRBD主机状态及查看日志:
[root@centos1 ~]# cat /proc/drbd version: 8.4.2 (api:1/proto:86-101)GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@BuildR6, 2012-09-06 08:16:10 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----- ns:32948 nr:0 dw:4 dr:34009 al:1 bm:9 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0[root@centos1 ~]# cat /var/log/messages | grep Split-BrainMar 14 21:11:48 node1 kernel: block drbd0: Split-Brain detected but unresolved, dropping connection!
[root@centos193 drbd.d]# cat /proc/drbd version: 8.4.2 (api:1/proto:86-101)GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@BuildR6, 2012-09-06 08:16:10 0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r----- ns:0 nr:32948 dw:32948 dr:0 al:0 bm:9 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
- 手动解决”Split-Brain”:
这里找到的”好数据”数据的主机为centos1.出现”坏数据”的主机为centos193.
在”坏数据”主机centos193上:
[root@centos193 ~]# drbdadm disconnect dbcluster[root@centos193 ~]# cat /proc/drbd version: 8.4.2 (api:1/proto:86-101)GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@BuildR6, 2012-09-06 08:16:10 0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown r----- ns:0 nr:32948 dw:32948 dr:0 al:0 bm:9 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0[root@centos193 ~]# drbdadm secondary dbcluster[root@centos193 ~]# drbdadm connect --discard-my-data dbcluster
在”好数据”的主机centos1上(如果下面的cs:状态为WFConnection,则无需下面操作.)
[root@centos1 ~]# cat /proc/drbd version: 8.4.2 (api:1/proto:86-101)GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@BuildR6, 2012-09-06 08:16:10 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----- ns:32948 nr:0 dw:4 dr:34009 al:1 bm:9 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0[root@centos1 ~]# drbdadm connect dbcluster[root@centos1 ~]# /etc/init.d/drbd statusdrbd driver loaded OK; device status:version: 8.4.2 (api:1/proto:86-101)GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@BuildR6, 2012-09-06 08:16:10m:res cs ro ds p mounted fstype0:dbcluster Connected Primary/Secondary UpToDate/UpToDate C /var/lib/mysql_drbd ext4