实验环境:三台CentOS6.5虚拟机,功能:
nfs:172.16.103.3 该主机共享的目录用于存储数据库中的数据,而且node1和node2都要能挂载,使用的是同一个数据库目录。
node1:172.16.103.1
node2:172.16.103.2
时间服务器:172.16.0.1
高可用服务中用到的资源有:IP:172.16.103.10,httpd,nfs,mysql。
拓扑图:
配置过程:
一、nfs服务器的配置:
nfs服务器上不需要mysql安装数据库,但需要创建mysql用户和mysql组,而且要手动指定该用户和组的uid以及gid,将共享目录的属主属组都改为mysql,目的是在共享目录时,其他的节点的相同uid的用户可以对这个目录有写权限。nfs共享的目录最好是挂载到LVM格式的逻辑卷上,方便日后扩展空间,创建LVM逻辑卷的过程未给出。
# 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目录 /nfs/shared 172.16.0.0/16(no_root_squash,rw,async) # service nfs start 选项中no_root_squash可以允许管理员root用户登录进共享目录并创建文件,这个选项需要用到,因为后续在高可用服务的节点上会用管理员的身份初始化数据库,rw选项的作用是允许普通用户对数据库目录进行读写操作,async是为了提高性能而设置的。
二、配置node1和node2节点同步时间,基于host文件实现主机名和ssh公钥方式实现通信:
同步时间,指向同一个时间服务器,设置周期性任务计划,自动同步时间。
node1:
# ntpdate 172.16.0.1 # crontab -e */5 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null # vim /etc/sysconfig/network HOSTNAME=node1.cluster.com # vim /etc/hosts 172.16.103.1 node1.cluster.com node1 172.16.103.2 node2.cluster.com node2 # ssh-keygen -t rsa -P ‘‘ # ssh-copy-id -i .ssh/id_rsa.pub node2
node2:
# ntpdate 172.16.0.1 # crontab -e */5 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null # vim /etc/sysconfig/network HOSTNAME=node2.cluster.com # vim /etc/hosts 172.16.103.1 node1.cluster.com node1 172.16.103.2 node2.cluster.com node2 # ssh-keygen -t rsa -P ‘‘ # ssh-copy-id -i .ssh/id_rsa.pub node1
这些基本设置完毕之后再进一步的配置node1和node2。
三、配置node1:
安装httpd:
# yum install -y httpd # cd /var/www/html # vim index.html #编辑默认首页面,为测试使用,内容如下: <h1>node1</h1>
在其他主机端测试一下http服务,然后再将服务停掉。
[root@node1 ~]# service httpd start Starting httpd: [ OK ] [root@node2 ~]# curl http://172.16.103.1 <h1>node1</h1> [root@node1 ~]# service httpd stop Stopping httpd: [ OK ]
安装mysql,这里使用的是通用二进制格式,使用源码编辑的方式也可以。
# groupadd -g 3306 mysql # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node1 ~]# id mysql uid=3306(mysql) gid=3306(mysql) groups=3306(mysql) # mkdir -pv /mydata/data # chown -R mysql.mysql /mydata/data
开始初始化数据库,由于真正要使用的数据库磁盘空间在nfs服务器上,所以要先将nfs服务器的共享目录挂载到/mydata/data下,而且要注意启动数据库之前要先挂载该目录,否则会报错,卸载该目录之前要先停止数据库服务,这些很简单的顺序操作,很可能会实际使用过程中顺序上出问题,提醒朋友们注意。
# mount -t nfs 172.16.103.3:/nfs/shared /mydata/data # tar xf mariadb-5.5.39-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 #添加数据库的数据目录,修改其中的thread_concurrency=8将其默认值设定为合理的数值,不调整也没有问题。另外,实验过程中如果远程连接数据库速度很慢,添加进去skip-name-resolve选项,这样可以避免名称解析,造成很大的延时,这些添加的内容要在mysqld段添加。 skip-name-resolve datadir = /mydata/data thread_concurrency=2 # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
mysql的初始化工作完成了,可以尝试启动mysql,然后注意最好先将挂载目录卸载掉。
# service mysqld start 连入数据库测试是否能正常读写: [root@node1 ~]# /usr/local/mysql/bin/mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 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)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.01 sec) MariaDB [(none)]> CREATE DATABASE tdb; Query OK, 1 row affected (0.01 sec) [root@node1 ~]# service mysqld stop Shutting down MySQL. [ OK ] # umount /mydata/data
为了便于mysql的使用,进一步做的配置如下:
# vim /etc/profile.d/mysql.sh #添加PATH环境变量的路径 export PATH=/usr/local/mysql/bin:$PATH # source /etc/profile.d/mysql.sh # vim /etc/man.config MANPATH /usr/local/mysql/man # ln -sv /usr/local/mysql/include /usr/include/mysql # echo ‘/usr/local/mysql/lib‘ > /etc/ld.so.conf.d/mysql.conf # ldconfig
将配置好的数据库配置文件和脚本文件复制到另外一个节点:
# scp -p /etc/rc.d/init.d/mysqld node2:/etc/rc.d/init.d # scp -p /etc/my.cnf node2:/etc
在node1节点安装heartbeat:
解决依赖关系:
# yum install perl-TimeDate net-snmp-libs libnet PyXML # 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 注意:这几个rpm包版本比较老,在CentOS6.5系统上不能使用yum方式安装。
为heartbeat提供资源文件,节点间通信的秘钥文件以及配置文件:
# cd /usr/share/doc/heartbeat-2.1.4/ # cp -p ha.cf haresources authkeys /etc/ha.d/
修改秘钥文件的属性,原文件go属性中有r属性,不符合要求,要修改为600.
# cd /etc/ha.d # chmod 600 authkeys
修改配置文件的几个参数,示例:
# vim ha.cf logfile /var/log/ha-log #启用日志文件 mcast eth0 225.103.0.1 694 1 0 #设定组播地址 node node1.cluster.com #高可用服务的两个节点,这两行是需要添加上的 node node2.cluster.com ping 172.16.0.1 # 启用Ping设备,在集群节点数为偶数时使用。
配置两个高可用节点之间通信的秘钥:
# openssl rand -hex 8 6f3173070ea11875 # vim authkeys auth 2 2 sha1 6f3173070ea11875
配置资源:
# vim haresources node1.cluster.com 172.16.103.10/16/eth0/172.16.103.255 Filesystem::172.16.103.3:/nfs/shared::/mydata/data::nfs mysqld httpd
注意资源文件中各个资源的定义顺序,nfs资源要定义在mysqld之前,mysqld和httpd倒不一定有前后,不过从服务可用的角度来讲,先启动mysql后启动httpd比较合理。用于高可用集群的3个文件配置完成后,等node2节点上的heartbeat安装完成后,将这3个文件复制到node2节点上。
至此,node1节点的数据库和httpd,heartbeat配置完成。
四、配置node2:
node2上的数据库不需要挂载nfs上的共享目录进行再一次的初始化,不过所需要的二进制安装文件以及配置文件和服务脚本文件都还是需要的,配置文件和脚本文件通过node1节点已经复制过来了,需要做的是二进制安装文件的解压工作。
# mkdir -pv /mydata/data # groupadd -g 3306 mysql # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql # chown -R mysql.mysql /mydata/data # tar xf mariadb-5.5.39-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 root.mysql ./
node2的数据库配置工作完成了,可以尝试挂载nfs共享目录,然后启动数据库:
# mount -t nfs 172.16.103.3:/nfs/shared /mydata/data # service mysqld start
连入数据库测试能否正常读写,一定要注意这时的操作顺序,先挂载目录再启动,要卸载目录就要先停用mysql。
[root@node2 ~]# service mysqld start Starting MySQL... [ OK ] [root@node2 ~]# 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)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | tdb | | test | +--------------------+ 5 rows in set (0.03 sec) MariaDB [(none)]> use tdb Database changed MariaDB [tdb]> CREATE TABLE tb1 (ID INT); Query OK, 0 rows affected (0.02 sec)
node2上安装httpd服务,并在其他主机测试是否可以正常访问
# yum install -y httpd # cd /var/www/html # vim index.html <h1>node2</h1> [root@node1 ~]# curl http://172.16.103.2 <h1>node2</h1>
node2上安装heartbeat:
# yum install perl-TimeDate net-snmp-libs libnet PyXML # 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 在node1上复制之前配置的heartbeat的配置文件,秘钥文件以及资源文件至该节点: [root@node1 ha.d]# scp -p haresources ha.cf authkeys node2:/etc/ha.d
五、在两个节点上启动heartbeat服务并查看启动的效果:
[root@node1 ~]# service heartbeat start Starting High-Availability services: 2014/09/08_19:27:47 INFO: Resource is stopped Done. [root@node2 ~]# service heartbeat start Starting High-Availability services: 2014/09/08_19:28:06 INFO: Resource is stopped Done.
在node1的日志文件中查看服务启动的结果:
[root@node1 ~]# tail /var/log/ha-log ResourceManager[12455]:2014/09/08_19:28:19 info: Running /etc/ha.d/resource.d/IPaddr 172.16.103.10/16/eth0/172.16.103.255 start IPaddr[12578]:2014/09/08_19:28:19 INFO: Using calculated netmask for 172.16.103.10: 255.255.0.0 IPaddr[12578]:2014/09/08_19:28:19 INFO: eval ifconfig eth0:0 172.16.103.10 netmask 255.255.0.0 broadcast 172.16.103.255 IPaddr[12549]:2014/09/08_19:28:19 INFO: Success Filesystem[12677]:2014/09/08_19:28:19 INFO: Resource is stopped ResourceManager[12455]:2014/09/08_19:28:19 info: Running /etc/ha.d/resource.d/Filesystem 172.16.103.3:/nfs/shared /mydata/data nfs start Filesystem[12755]:2014/09/08_19:28:19 INFO: Running start for 172.16.103.3:/nfs/shared on /mydata/data Filesystem[12744]:2014/09/08_19:28:19 INFO: Success ResourceManager[12455]:2014/09/08_19:28:19 info: Running /etc/init.d/mysqld start ResourceManager[12455]:2014/09/08_19:28:22 info: Running /etc/init.d/httpd start
查看资源启动的情况:
[root@node1 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:0E:2D:35 inet addr:172.16.103.1 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fe0e:2d35/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:243547 errors:0 dropped:0 overruns:0 frame:0 TX packets:93261 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:292639466 (279.0 MiB) TX bytes:50676467 (48.3 MiB) eth0:0 Link encap:Ethernet HWaddr 00:0C:29:0E:2D:35 inet addr:172.16.103.10 Bcast:172.16.103.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)
[root@node1 ~]# service mysqld status MySQL running (13172) [ OK ] [root@node1 ~]# service httpd status httpd (pid 13239) is running...
如果停用node1上的服务,资源会自动切换到node2上:
[root@node1 ~]# service heartbeat stop Stopping High-Availability services: Done.
在node2上查看资源配置的情况:
[root@node2 ~]# 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:243742 errors:0 dropped:0 overruns:0 frame:0 TX packets:65339 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:300473835 (286.5 MiB) TX bytes:9136036 (8.7 MiB) eth0:0 Link encap:Ethernet HWaddr 00:0C:29:E1:37:51 inet addr:172.16.103.10 Bcast:172.16.103.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)
[root@node2 ~]# service httpd status httpd (pid 8829) is running... [root@node2 ~]# service mysqld status MySQL running (8763) [ OK ]
至此,基于Heartbeat v1 配置httpd+mysql+nfs模拟实现。