概述:
上一次所介绍的高可用集群是红帽系列自带的一个套件,具有web界面对于刚接触高可用集群的人有很友好,但也有一个问题,就是当集群出现一些问题无法工作的时候光靠那个web界面一般不能解决什么,所以这次回归本源,纯手动配置这个高可用集群heartbeat。所使用的存储是drbd,搭载服务是mysql,mysql服务和别的服务搭载起来可是有一定不同的。环境:两台rhel6.5
集群拓扑图:
1.安装heartbeat
heartbeat是一个开源项目,我们可以通过他的官网下载源代码包编译,这里我们使用rpm包安装了。如下:
[root@ha1 heartbeat]# ls
heartbeat-3.0.4-2.el6.x86_64.rpm heartbeat-libs-3.0.4-2.el6.x86_64.rpm
heartbeat-devel-3.0.4-2.el6.x86_64.rpm ldirectord-3.9.5-3.1.x86_64.rpm
2.配置heartbeat
heartbeat的配置文件均在/etc/ha.d下,进入这个目录
[root@ha1 ha.d]# ls
harc rc.d README.config resource.d shellfuncs
看到README.config我们一定要看一下,养成遇到README就看的习惯。
You need three configuration files to make heartbeat happy,
and they all go in this directory.
They are:
ha.cf Main configuration file
haresources Resource configuration file
authkeys Authentication information
These first two may be readable by everyone, but the authkeys file
must not be.
上面的话告诉我们这里还需要三个配置文件,而且authkeys的并不是谁都可以看的哦。继续往下看
If you installed heartbeat using rpm packages then
this command will show you where they are on your system:
rpm -q heartbeat -d
上面这句话告诉我们想找到那三个文件需要运行"rpm -q heartbeat -d"这个命令
/usr/share/doc/heartbeat-3.0.4/authkeys
/usr/share/doc/heartbeat-3.0.4/ha.cf
/usr/share/doc/heartbeat-3.0.4/haresources
通过README的提示,我们成功找到了三个配置文件的位置。现在开始配置这三个文件
ha.cf heartbeat的主配置文件
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 10009
bcast eth0 # Linux
auto_failback on
node ha1.mo.com
node ha2.mo.com
ping 172.25.9.250
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
这是需要配置的所有字段,下面我挨个解释下仪式是什么
logfacility local0 #heartbeat服务的日志
keepalive 2 #发送心跳的频率是2s
deadtime 30 #当30s的时候无响应就认为节点挂掉了
warntime 10 #10s无响应的时候就进行警告
initdead 60 #根据配置文件所说明的,就是有一些操作系统开机的时候不会启动网卡,所以要多等这类系统 一点时间设置成60s
udpport 10009 #设这个服务的端口号,在内网不要有和这个端口重复的。
auto_failback on #服务是否自动切换回主服务器
node #代表你的节点,第一个就是主节点
ping #选择一台主机作为测试对象,只要能ping通我所书写的这个第三方节点,就认为自己是好的,而另一台ping不同,如果有fence的话,我就要接管他。
respawn #确定ipfaill脚本的路径
apiauth #api的用户验证。
haresources 集群的资源配置文件
ha1.mo.com IPaddr::172.25.9.200/24/eth0 httpd
我们这里是测试一下这个集群的功能,先使用配置较为简单的http服务。
authkeys 集群的身份验证文件
auth 1
1 crc
这里由于是内网所以选择最简单的crc循环冗余校验即可。
这时heartbeat的配置文件就写好了,现在最重要的一点,我们现在配置的是集群,不是以前的单个服务,要将刚才写好的配置文件分发给其他节点,并且都安装上http服务。现在所以节点启动heartbeat服务。
heartbeat: udpport setting must precede media statementsheartbeat[1356]: 2017/02/16_22:36:43 ERROR: Bad permissions on keyfile [/etc/ha.d//authkeys], 600 recommended.
启动失败发现如上信息,原来忘记修改了authkeys的权限成为600。启动成功,现在通过查看日至,看看服务是否都架设成功。
Feb 16 22:39:36 ha1 /usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_172.25.9.200)[1793]: INFO: Success
Feb 16 22:39:36 ha1 ResourceManager(default)[1674]: info: Running /etc/init.d/httpd start
通过上面两条我们可以看出,我们设置的ip已经分到ha1这台机子上了,http也在这台上启动了。
3.配置drbd存储
DRBD的全称为:Distributed Replicated Block Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。你可以把它看作是一种网络RAID。它允许用户在远程机器上建立一个本地块设备的实时镜像。
DRBD不同于我们之前接触的NFS,ISCSI等C/S结构的存储,他是分布式的,每一台节点上都拥有存储而不是所有节点都都将存储放到一台服务器上,在节点上有primary节点和secondary节点之分,primary节点接受数据,并且把数据同步到secondary节点上,当primary节点故障,服务就会切换到secondary节点上。由于secondary节点上的数据是同步primary节点而来,所以是完全一样的数据。
4.drbd的安装与配置
大家一定知道安装软件一般有两种方式,一种是源代码安装,另一种是rpm包安装,源代码安装方式定执行好,但是不适合大规模布置,所以我们这次将源代码包生成rpm包去布置我们的集群。
[root@ha1 drbd-8.4.2]# ls
autogen.sh documentation filelist-redhat preamble-sles11
benchmark drbd filelist-suse README
ChangeLog drbd_config.h Makefile.in rpm-macro-fixes
configure drbd-kernel.spec.in preamble scripts
configure.ac drbd-km.spec.in preamble-rhel5 user
COPYING drbd.spec.in preamble-sles10
进入源代码包的主目录
运行./configure
[root@ha1 drbd-8.4.2]# ./configure
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/root/drbd-8.4.2':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
发现没有安装gcc,我们安装gcc。
由于我们要创建rpm包,所以还要加上一些参数,而且drbd这个功能在6.5系列的内核中并没有开启,需要加载进来,也需要添加参数。
--with-km Enable kernel module
--enable-spec Rather than creating Makefiles, create an RPM spec file only
[root@ha1 drbd-8.4.2]# ./configure --enable-spec --with-km
输入上面的命令。查看有什么东西缺少
configure: error: Cannot build utils without flex, either install flex or pass the --without-utils option.
缺少flex,那么就安装flex,继续执行配置命令
configure: WARNING: No rpmbuild found, building RPM packages is disabled.
发现缺少rpmbuild,继续安装,执行配置命令,发现已经没有相关的错误了,可以生成rpm包了。执行rpm-build命令。
[root@ha1 drbd-8.4.2]# rpmbuild drbd-kernel.spec
error: File /root/rpmbuild/SOURCES/drbd-8.4.2.tar.gz: No such file or directory
发现这个目录下没有源代码包文件。将源代码包放到这个下面。继续创建rpm-build。
[root@ha1 drbd-8.4.2]# rpmbuild -bb drbd.spec
spec文件就相当于rpm创建的配置文件
接下来创建drbd内核模块的rpm包
[root@ha1 drbd-8.4.2]# rpmbuild -bb drbd-km.spec
error: Failed build dependencies:
kernel-devel is needed by drbd-km-8.4.2-2.el6.x86_64
发现如上错误,我们对内核编译的时候需要内核开发包,继续安装。成功后进入/root/rpmbuild/RPMS。
[root@ha1 x86_64]# ls
drbd-8.4.2-2.el6.x86_64.rpm
drbd-bash-completion-8.4.2-2.el6.x86_64.rpm
drbd-heartbeat-8.4.2-2.el6.x86_64.rpm
drbd-km-2.6.32_431.el6.x86_64-8.4.2-2.el6.x86_64.rpm
drbd-pacemaker-8.4.2-2.el6.x86_64.rpm
drbd-udev-8.4.2-2.el6.x86_64.rpm
drbd-utils-8.4.2-2.el6.x86_64.rpm
drbd-xen-8.4.2-2.el6.x86_64.rpm
这里就是我们部署drbd需要的所有rpm包。接下来只要无脑的yum install *就可以了。
接下来部署drbd。如我们之前所说,drbd是分布式的存储每一个节点都要有存储,而且对于高可用集群所分享的存储的大小一定要是一样的。我们给虚拟机添加一块2G的虚拟硬盘。
编写drbd配置文件
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";
这个文件中定义说drbd.d/*.res可以作为配置文件的信息。
我们就选择在drbd.d下创建一个mo.res,写入如下内容。
resource mo {
meta-disk internal;
device /dev/drbd1;
syncer {
verify-alg sha1;
}
on ha1.mo.com {
disk /dev/vda;
address 172.25.9.30:7789;
}
on ha2.mo.com {
disk /dev/vda;
address 172.25.9.31:7789;
}
}
第一个resource mo定义的是这个资源和名字mo。device定义drbd的设备名字,syncer是同步数据的时候使用的校验方式。接下来是定义两个节点的信息。配置文件写好后,仍然是要切记同步到另一个节点上去。
5.将mysql的存储转移到drbd存储上
现在有了存储我们就可以上真正的主角mysql服务了,因为前面的那些准备工作就是为了让mysql更好的更稳定的运行。首先在各个节点下载mysql。然后开启drbd服务,这个服务和别的服务有所不同,第一次开启的时候要使用一条初始化命令。
[root@ha1 ~]# drbdadm create-md mo
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
启动服务。
在另一边也进行如上同样的操作。使用下面命令可以观察同步。
[root@ha1 ~]# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@ha1.mo.com, 2017-02-17 00:16:09
1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2097052
现在使用硬盘。首先要将ha1节点设置为primary节点
[root@ha1 ~]# drbdadm primary mo --force
第一次要强制让ha1节点为主节点。接下来就可以使用drbd设备了。
[root@ha1 ~]# mkfs.ext4 /dev/drbd1
[root@ha1 ~]# mount /dev/drbd1 /mnt/
[root@ha1 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root 19134332 1202568 16959784 7% /
tmpfs 510120 0 510120 0% /dev/shm
/dev/sda1 495844 33463 436781 8% /boot
/dev/drbd1 2064108 35840 1923416 2% /mnt
而且这个设备有直接格式化使用即可,不用分区。
接下来启动mysql服务,为了创建mysql的存储文件。并且进入mysql创建一个库,作为一会验证使用。之后关闭mysql,将/var/lib/mysql目录下的文件都复制到/mnt下,也就是我们的drbd存储。切记,mysql下不能有sock文件,如果有这个文件,会认为mysql已经开启,会导致服务启动失败。
[root@ha1 mnt]# ls
ibdata1 ib_logfile0 ib_logfile1 mo mysql test
现在就将mysql的存储转移到了drbd下,将/var/lib/mysql的文件删除。并且将drbd下文件的属主属组都变成mysql。
[root@ha1 mnt]# ll
total 20492
-rw-r----- 1 mysql mysql 10485760 Feb 17 01:08 ibdata1
-rw-r----- 1 mysql mysql 5242880 Feb 17 01:08 ib_logfile0
-rw-r----- 1 mysql mysql 5242880 Feb 17 01:08 ib_logfile1
drwx------ 2 mysql mysql 4096 Feb 17 01:08 mo
drwx------ 2 mysql mysql 4096 Feb 17 01:08 mysql
drwx------ 2 mysql mysql 4096 Feb 17 01:08 test
现在将ha1设置为secondary节点,ha2设置为主节点。将/dev/drbd1挂载到/var/lib/mysql上。现在在ha2上开启mysql。发现里面确实有我们刚创建的数据库。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mo |
| mysql |
| test |
+--------------------+
现在drbd和mysql的手动切换已经成功了。接下来关闭mysql服务,卸载/dev/drbd1,让ha2也变成secondary节点。
[root@ha2 ~]# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@ha1.mo.com, 2017-02-17 00:16:09
1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:304 nr:2185208 dw:2185512 dr:4117 al:5 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
两个节点均以变成secondary
6.将drbd,mysql加入heartbeat集群
现在资源都有了,就是没有将资源加入配置文件。首先停掉刚才的heartbeat。然后修改haresources文件。
ha1.mo.com IPaddr::172.25.9.200/24/eth0 drbddisk::mo Filesystem::/dev/drbd1::/var/lib/mysql::ext4 mysqld
上面就是集群服务的配置,分别是ip,drbd,挂在,mysql。启动集群后就会按照这个顺序进行服务的启动。这些服务启动脚本都放在/etc/ha.d/resource.d下面。现在将配置文件同步到另一个节点ha2。ha1,ha2都开启heartbeat。
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:db:73:2d brd ff:ff:ff:ff:ff:ff
inet 172.25.9.30/24 brd 172.25.9.255 scope global eth0
inet 172.25.9.200/24 brd 172.25.9.255 scope global secondary eth0
inet6 fe80::5054:ff:fedb:732d/64 scope link
valid_lft forever preferred_lft forever
通过查看ip可以看到,服务已经在ha1这台机器上起来了。
7.对集群进行一些测试。
(1)内核崩溃
echo c > /proc/sysrq-trigger
Feb 17 01:38:25 ha2 heartbeat: [3247]: WARN: node ha1.mo.com: is dead
Feb 17 01:38:25 ha2 heartbeat: [3247]: WARN: No STONITH device configured.
Feb 17 01:38:25 ha2 heartbeat: [3247]: WARN: Shared disks are not protected.
Feb 17 01:38:25 ha2 heartbeat: [3247]: info: Resources being acquired from ha1.mo.com.
Feb 17 01:38:25 ha2 ipfail: [3272]: info: Status update: Node ha1.mo.com now has status dead
Feb 17 01:38:25 ha2 heartbeat: [3247]: info: Link ha1.mo.com:eth0 dead.
上面就是内核坏掉后,ha2的日志信息,先告诉ha1已经死了,没有fence设备(STONITH),共享存储没有被保护,资源正在从ha1上被获得,ha1的网卡已经死掉。接下来就是接管的信息了。测试一下ha2上mysql服务是否启动正常。
由于没有fence设备,我们不能让ha1自动断电,现在手动让他断电试试。断电后启动发现,heartbeat也都正常启动了。所以这次测试成功。
(2)让备份机器ha2的网卡坏掉
[root@ha1 ~]# ip link set eth0 down
ha2会发现自己无法收到ha1的心跳,他会认为是ha1死掉了,然后想去接管设备,但是无法接管成功,在这期间,eth0会被启动起来。所以就恢复了。ha1会认为收到ha2的接管命令,但是没有成功,所与取消被接管。
但是在测试三次后发现一个,网卡不能再启动了,日志中充斥着如下的信息。
而且将ha2 forceoff掉后再启动会在开启的时候出现如下信息:
(3)让ha1主服务器的网卡坏掉
此时会出现ha1认为ha2坏了,ha2认为ha1坏了的情况,但是服务会正常的切换到ha2上去。