主机规划:
高可用服务器安装v2版本的heartbeat,同时这两个节点上安装有mysql,运行时只有一个节点可以运行mysql,另外一个节点备用,后端有一个nfs共享存储,用于提供共享目录,用于存储数据库的数据。
IP地址设置为:
HA1:172.16.103.1
HA2:172.16.103.2
NFS:172.16.103.3
实验过程:
一、准备NFS服务器
# mkdir -pv /nfs/shared # groupadd -g 3306 mysql # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql # chown -R mysql.mysql /nfs/shared # vim /etc/exports nfs/shared 172.16.0.0/16(no_root_squash,rw,async) # service nfs start
二、配置HA1和HA2两台服务器,使得它们之间可以基于ssh公钥方式通信,而且数据交互基于hosts文件来解析对方的主机名,并且同步好时间,这些是配置后面步骤的前提。具体步骤,请参考前面的博客内容。
配置HA1:
安装mysql前准备工作:
# groupadd -g 3306 mysql # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql # mkdir -pv /mydata/data # chown -R mysql.mysql /mydata/data
初始化数据库:
# mount -t nfs 172.16.103.3:/nfs/shared /mydata/data # tar xf mariadb-5.5.30-linux-x86_64.tar.gz -C /usr/local/ # cd /usr/local # ln -sv mariadb-5.5.39-linux-x86_64.tar.gz mysql # cd mysql # chown -R mysql.mysql ./ # scripts/mysql_install_db --user=mysql --datadir=/mydata/data # cp support-files/my-large.cnf /etc/my.cnf #添加数据库的数据目录 # vim /etc/my.cnf datadir = /mydata/data # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
尝试启动数据库并测试是否可以正常访问,注意这时已经挂载了nfs,如果以后需要启动或者停用数据库,一定要注意nfs共享目录是否在挂载状态:
# service mysqld start
另外一个高可用的节点HA2的数据库初始化方式和HA1是一致的,就不再重复。
在HA1和HA2两个基点上安装heartbeat:
解决依赖关系:
# yum install perl_TimeData net-snmp-libs libnet PyXML
安装heartbeat:
# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
为heartbeat提供资源文件、秘钥文件以及配置文件:
# cd /usr/share/doc/heartbeat-2.1.4/ # cp -p ha.cf haresources authkeys /etc/ha.d/
修改秘钥文件的属性,因为heartbeat服务启动时会检测这个文件的属性,如果不是600,会报错。
# cd /etc/ha.d # chmod 600 authkeys
修改配置文件添加对应的这两个高可用的节点,添加组播地址和Pingnode设备,其中最重要的一点是要启用heartbeat V2的功能,在配置文件中添加一行内容为crm on即可,同时为两个节点之间创建通信使用的秘钥,这部分内容请参考前面博客的内容。
# vim ha.cf crm on
在两个节点的heartbeat都安装完成后,尝试启动heartbeat,注意启动之前一定要停用与mysql相关的服务,还要卸载掉挂载的nfs磁盘设备。
# service heartbeat start
在服务启动之后,可以查看一下Heartbeat服务监听的端口是否正常。
# ss -tunlp tcp LISTEN 0 10 *:5560 *:*
heartbeat程序为客户端程序连入服务器端配置高可用服务时自动在/etc/passwd文件中创建了一个用户,该用户名为hacluster,不过这个用户创建时没有设置密码,需要为该用户创建一个密码,以便使用。
# passwd hacluster
启动heartbeat的客户端程序,hb_gui,在图形界面下配置高可用服务,在windows中最好装有xmanager等程序,以便启动图形界面。
# hb_gui &
首先,mysql的高可用资源需要3个,IP,mysqld,nfs,这3个资源启动顺序上有限制,这3个资源都要运行在一个节点上,而且mysqld要在nfs启动之后出能启动,ip地址和mysqld服务之间倒没有依赖关系,服务准备好后再启动IP也可以的,高可用的httpd服务是需要先启动IP的,因为服务启动的时候明确需要IP地址的资源。这两类高可用资源之间是不同的。
高可用资源的定义步骤如下,首先定义mysql使用的IP地址:
nfs与mysqld要运行在一个节点上:
mysqlip与mysql-service要运行在一个节点上:
定义好这好Colocation约束后这3个资源会同时运行在同一个节点上。另外很重要的一点是mysqld服务要在nfs分区挂载之后启动,所以要定义资源的顺序约束:
定义好启动顺序的约束之后还可以定义运行在哪个高可用服务节点的倾向性,在Locations约束中定义:
设置好ID及相应的资源之后,需要为该资源添加表达式及对该节点的倾向性:
现在可以尝试启动所有的资源,并查看资源在各个高可用基点间切换的效果,第一次启动时,默认会依据运行在HA1节点上,因为资源约束定义倾向性时定义资源倾向运行在HA1上:
尝试让HA1运行于standby状态,查看服务切换的效果:
现在资源都运行在HA2上。在主机端使用ifconfig等命令查看:
[root@node2 ha.d]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:E1:37:51 inet addr:172.16.103.2 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fee1:3751/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:180619 errors:0 dropped:0 overruns:0 frame:0 TX packets:122944 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:110119869 (105.0 MiB) TX bytes:21043781 (20.0 MiB) eth0:0 Link encap:Ethernet HWaddr 00:0C:29:E1:37:51 inet addr:172.16.103.60 Bcast:172.16.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
配置的IP地址正常的运行在了HA2上。连接数据库测试:
[root@node2 ha.d]# service mysqld status MySQL running (22193) [ OK ] [root@node2 ha.d]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.39-MariaDB-log MariaDB Server Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others. Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. MariaDB [(none)]>
数据库访问也正常。