Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。heartbeat的核是心跳监测和资源接管,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
heartbeat+drbd在Linux下创建一个高可用(HA)的集群服务器。DRBD是一种块设备,可以被用于高可用(HA)之中。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。因为数据同时存在于本地主机和远程主机上。切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。
准备三台虚拟机:
172.25.85.2 server2.example.com
172.25.85.3 server3.example.com
172.25.85.4 server4.example.com
1.heartbeat的配置:
在server2和server3上:
yum install heartbeat-3.0.4-2.el6.x86_64.rpm
heartbeat-devel-3.0.4-2.el6.x86_64.rpm
heartbeat-libs-3.0.4-2.el6.x86_64.rpm
ldirectord-3.9.5-3.1.x86_64.rpm
server2:
cd /usr/share/doc/heartbeat-3.0.4
cp ha.cf haresources authkeys /etc/ha.d
cd /etc/ha.d
vim ha.cf
##写在前面的节点,优先级高。
logfacility local0
日志等级,默认值
keepalive 2
心跳频率,自己设定.1:表示 1 秒
deadtime 30
节点死亡时间阀值,就是从节点在过了 30 后还没有收到心跳就认为主节点死亡
warntime 10
发出警告时间
initdead 120
守护进程首次启动后应该等待 120 秒后再启动主服务器上的资源
udpport 694
心跳信息传递的 udp 端口,使用端口 694 进行 bcast 和 ucast 通信
baud 19200
串口波特率,与 serial 一起使用。
serial /dev/ttyS0
采用串口来传递心跳信息。
bcast eth0
采用 udp 广播播来通知心跳
auto_failback on
当主节点恢复后,是否自动切回
stonith baytech /etc/ha.d/conf/stonith.baytech
stonith 用来保证共享存储环境中的数据完整性
watchdog /dev/watchdog
watchdog 能让系统在出现故障 1 分钟后重启该机器,这个功能可以帮助服务器在确实停止心
跳后能够重新恢复心跳。 如果使用该特性,修改系统中/etc/modprobe.conf, 添加如下行
options softdog nowayout=0
这样在系统启动的时候,在内核中装入"softdog"内核模块,用来生成实际的设备文件
/dev/watchdog
node server2.example.com (只能域名)
主节点名称,与 uname –n 保持一致。排在第一的默认为主节点,所以不要搞措顺序
node server3.example.com
副节点名称,与 uname –n 保持一致
ping 172.25.45.250
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
默认 heartbeat 并不检测除本身之外的其他任何服务,也不检测网络状况。
所以当网络中断时,并不会进行 Load Balancer 和 Backup 之间的切换。
可以通过 ipfail 插件,设置'ping nodes'来解决这一问题,但不能使用一个集群节点作为
ping 的节点。
vim haresources
server2.example.com IPaddr::172.25.85.100/24/eth1 mysqld
##172.25.85.100是虚拟ip
这个文件中定义了实现集群所需的各个软件的启动脚本,这些脚本必须放在/etc/init.d 或者
/etc/ha.d/resource.d 目录里 IPaddr 的作用是启动 Virutal IP,它是 HeartBeart 自带的一个
脚本;mysqld 是 mysql服务的启动脚本。
vim authkeys
auth 1 1 crc
chmod 600 authkeys ##仅超级用户可以读写
cd /etc/ha.d
scp ha.cf haresources authkeys 172.25.85.3:/etc/ha.d/
/etc/init.d/heartbeat start
tail -f /var/log/messages
检测:
在server2上:
/etc/init.d/heartbeat start
/etc/init.d/mysqld start
mysql可以登陆
在server2上:
/etc/init.d/heartbeat stop
无法登录mysql:
而server3上可以登陆:
2.heartbeat&磁盘:
建立共享分区:
在server4上:
分配4G的虚拟磁盘
yum install scsi-target-utils-1.0.24-10.el6.x86_64 -y
/etc/init.d/tgtd start
fdisk -l
vim /etc/tgt/targets.conf
<target iqn.2016-06.com.example:server.disk>
backing-store /dev/vdb ##/dev/vdb就是刚刚分出来的新硬盘
initiator-address 172.25.85.2
initiator-address 172.25.85.3
</target>
tgt-admin -s
在server2和server3上:
yum install iscsi-initiator-utils.x86_64 -y
iscsiadm -t st -m discovery -p 172.25.85.4
iscsiadm -m node -l
##共享分区就建立好了,在server2和server3上会出现两个新的磁盘/dev/sda
cat /proc/partitions ##查看分区是否共享
server2:
fdisk -cu /dev/sda ##(删除多于分区,然后创建一个新的2G的主分区)
cat /proc/partition
mkfs.ext4 /dev/sda1
vim haresources
server2.example.com IPaddr::172.25.85.100/24/eth1 Filesystem::/dev/sda1::/var/lib/mysql::ext4 mysqld
scp haresources 172.25.85.3:/etc/ha.d/
/etc/init.d/mysqld stop
mount /dev/sda1 /mnt
cd /var/lib/mysql
cp -rp * /mnt
chown mysql.mysql /mnt
umount /mnt
/etc/init.d/heartbeat stop
tail -f /var/log/messages
在server3上:
partprobe ##会同布出server1上进行的分区
cat /pros/partitions
检测:在server2:
/etc/init.d/heartbeat stop
df ##/dev/sda1自动挂载到了/var/lib/mysql
ip addr show ##虚拟地址出现在server3上
在server3上:/etc/init.d/heartbeat stop
在server2上, /dev/sda1自动挂载到了/var/lib/mysql,虚拟地址出现在server2上
给server2和server3都分配4G虚拟磁盘
3. 编译drbd
因为此次用的是之前的虚拟机,所以需要关闭一些进程: ##如果是新的虚拟机 则不需要
在server2和server3上:
/etc/init.d/iscsi stop
chkconfig --list iscsi ##iscsi的进程都关闭
/etc/init.d/heartbest stop
在server2上:
cd /root
tar zxf drbd-8.4.3.tar.gz
cd drbd-8.4.3
yum install flex gcc rpm-build kernel-devel -y
cp /root/drbd-8.4.3.tar.gz /root/rpmbuild/SOURCES/
./configure --enable-spec --with-km
rpmbuild -bb drbd.spec ##编译drbd要在/root/drbd-8.4.3目录下
rpmbuild -bb drbd-km.spec
cd /root/rpmbuild/RPMS/x86_64
rpm -ivh *
scp * root@172.25.85.3:
cd /etc/drbd.d/
vim example.res ##创建以.res结尾文件
resource sqldata{ meta-disk internal; device /dev/drbd1; syncer{ verify-alg sha1; } on server2.example.com{ disk /dev/vdb; address 172.25.85.2:7789; } on server3.example.com{ disk /dev/vdb; address 172.25.85.3:7789; }
scp example.res root@172.25.85.3:/etc/drbd.d/
drbdadm create-md sqldata
/etc/init.d/drbd start ## server3也进行相同的操作,和server2同时完成
drbdadm primary sqldata --force
cat /proc/drbd
在server3上:
cd /root
yum install drbd-*
drbdadm create-md sqldata ##和server2上的这个步骤同时进行
/etc/init.d/drbd start
cat /proc/drbd
4. server2:
mkfs.ext4 /dev/drbd1
mount /dev/drbd1 /mnt/
cd /var/lib/mysql/
cp -rp * /mnt
chown mysql.mysql /mnt
cp /etc/passwd /mnt
umount /mnt
drbdadm secondary sqldata
cat /proc/drbd
cd /etc/ha.d/
vim haresources
server1.example.com IPaddr::172.25.85.100/24/eth1 drbddisk::sqldata Filesystem::/dev/drbd1::/var/lib/mysql::ext4 mysqld
scp /etc/ha.d/haresources root@172.25.85.3:/etc/ha.d/
/etc/init.d/heartbeat start
tail -f /var/log/messages
cat /prpc/drbd
发现,172.25.85.100出现在server2上
/dev/drbd1 自动挂载到/var/lib/mysql
server3:
mkfs.ext4 /dev/drbd1
drbdadm primary sqldata
mount /dev/drbd1 /mnt
cd /mnt
/etc/init.d/heartbeat start