方案:
corosync + pacemaker 提供HA的解决方案。
使用NFS共享服务器导出的共享文件系统做为数据目录;
拓扑图如下:
一、配置HA高可用集群的各节点间能够基于主机名通讯。
1、设置主机名
(1)、在 192.168.60.128 主机设置
编辑/etc/sysconfig/network文件,使得主机名永久有效
1
2
|
[root@www ~]
# vim /etc/sysconfig/network
HOSTNAME=node2.9527du.com
|
使用hostname命令设置主机名,让它即时生效
1
|
[root@www ~]
# hostname node2.9527du.com
|
(2)、在 192.168.60.22 主机设置
编辑/etc/sysconfig/network文件,使得主机名永久有效
1
2
|
[root@stu13 ~]
# vim /etc/sysconfig/network
HOSTNAME=node1.9527du.com
|
使用hostname命令设置主机名,让它即时生成
1
|
[root@stu13 ~]
# hostname node1.9527du.com
|
2、为了,操作方便设置节点之间能够基于密钥通讯。也就是所谓的建立信任主机。
1
2
3
4
|
[root@node1 ~]
# ssh-keygen -t rsa
[root@node1 ~]
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.60.128
[root@node2 ~]
# ssh-keygen -t rsa
[root@node2 ~]
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.60.22
|
3、节点之间基于主机名通讯,要能够解析主机名才可以。解析主机名有两种方式:
(1)、使用DNS地址解析服务器;
(2)、使用本地hosts文件解析
基于效率和安全方面考虑,这里使用hosts文件解析主机名。
1
2
3
|
[root@node1 ~]
# vim /etc/hosts
192.168.60.22 node1.9527du.com node1
192.168.60.128 node2.9527du.com node2
|
把/etc/hosts文件复制到node2节点
1
2
|
[root@node1 ~]
# scp /etc/hosts node2:/etc/
hosts 100% 78 0.1KB
/s
00:00
|
4、测试两个节点能够实现基于密钥的方式进行通讯和能否基于主机名进行通讯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
root@node2 ~]
# ssh node1 'hostname'
node1.9527du.com
[root@node1 ~]
# ssh node2 'hostname'
node2.9527du.com
[root@node1 ~]
# ssh node2 'ping -c 1 node2.9527du.com'
PING node2.9527du.com (192.168.60.128) 56(84) bytes of data.
64 bytes from node2.9527du.com (192.168.60.128): icmp_seq=1 ttl=64
time
=0.061 ms
--- node2.9527du.com
ping
statistics ---
1 packets transmitted, 1 received, 0% packet loss,
time
0ms
rtt min
/avg/max/mdev
= 0.061
/0
.061
/0
.061
/0
.000 ms
[root@node1 ~]
# ping -c 1 node1.9527du.com
PING node1.9527du.com (192.168.60.22) 56(84) bytes of data.
64 bytes from node1.9527du.com (192.168.60.22): icmp_seq=1 ttl=64
time
=0.069 ms
--- node1.9527du.com
ping
statistics ---
1 packets transmitted, 1 received, 0% packet loss,
time
0ms
rtt min
/avg/max/mdev
= 0.069
/0
.069
/0
.069
/0
.000 ms
|
说明:
从上述可以看出,两个节点已经能够实现基于主机名的方式进行通讯。
二、配置NFS服务器
1、提供NFS服务器共享的文件系统
使用LVM逻辑卷做为数据库的数据目录,为了使用逻辑卷的快照功能备份数据。
(1)、创建分区
1
2
|
[root@nsf ~]
# fdisk -l /dev/sda | grep "/dev/sda3"
/dev/sda3
7859 9164 10489446 8e Linux LVM
|
(2)、把该分区做成pv
1
2
|
[root@nsf ~]
# pvcreate /dev/sda3
Physical volume
"/dev/sda3"
successfully created
|
(3)、创建逻辑卷组myvg,PE大小为8E.
1
2
|
[root@nsf ~]
# vgcreate -s 8M myvg /dev/sda3
Volume group
"myvg"
successfully created
|
(4)、创建lvm,大小为:2G
1
2
3
4
5
|
[root@nsf ~]
# lvcreate -L 2G -n sharedir myvg
Logical volume
"sharedir"
created
[root@nsf ~]
# mke2fs -t ext4 /dev/myvg/sharedir
[root@nsf ~]
# echo $?
0
|
(5)、创建挂载点
1
|
[root@nsf ~]
# mkdir /mydata
|
(6)、编辑/etc/fstab文件,实现开机可以自动挂载“/dev/myvg/sharedir”
1
2
|
[root@nsf ~]
# vim /etc/fstab
/dev/mapper/myvg-sharedir
/mydata
ext4 defaults,acl 0 0
|
(7)、挂载
1
|
[root@nsf ~]
# mount -a
|
查看是否挂载
1
2
|
[root@nsf ~]
# mount | grep "mydata"
/dev/mapper/myvg-sharedir
on
/mydata
type
ext4 (rw,acl)
|
2、配置挂载NFS服务器共享的文件系统的客户端中的数据库服务进程(mysql)具有共享文件系统(目录)的读写权限。
把NFS服务器导出的文件系统中,作为数据库的数据目录,根据NFS服务器的工作原理,NFS的客户端可以往NFS服务器导出的文件系统(目录)写数据要满足两个条件:
(A)、在NFS服务器级别,做访问控制时候是否授写NFS客户端写(w)的权限;
(B)、在NFS客户端发起写(W)操作的进程的属主对应的UID,在NFS服务器端所在的主机是否该UID
对应的用户。
1)、如果有的话,那么就检查该用户是否有NFS服务器导出的文件系统(目录)的写权限。如果有
写权限的话,那么NFS客户端的进程就可以往NFS服务器导出的文件系统发起写操作了。否则
的话NFS客户端是无权限往NFS服务器导出的文件系统写数据的。
2)、如果没有的话,那就就检查nobody用户是否有NFS服务器导出的文件系统(目录)的写权限。
不过在Linux系统上,nobody用户的权限是最小。
因为,在MySQL数据库中,接收客户端SQL操作请求的进程的属主是:mysql. 所以,我们要配置该用户的UID号在NFS服务器所在的主机上有对应的用户名,且要求该用户有NFS服务器导出的文件系统(目录),有读写权限。对HA高可用节点和NFS服务器,三台主机添加下述用户:
规划在三台主机都使用系统用户,且UID都为:404;GID都为:404.
(1)、在三台主机设置用户
(A)、在node1 主机创建mysql用户
1
2
3
4
|
[root@node1
local
]
# useradd -r -u 404 -g 404 -s /sbin/nologin mysql
[root@node1
local
]
# id mysql
uid=404(mysql) gid=404(mysql)
groups
=404(mysql)
[root@node1
local
]
# groupadd -r -g 404 mysql
|
(B)、在node2 主机创建mysql用户
1
2
3
4
|
[root@node2 ~]
# groupadd -r -g 404 mysql
[root@node2 ~]
# useradd -r -u 404 -g 404 -s /sbin/nologin mysql
[root@node2 ~]
# id mysql
uid=404(mysql) gid=404(mysql)
groups
=404(mysql)
|
(C)、在NFS服务器也创建UID、GID都为:404的用户;
1
2
3
4
|
[root@nsf ~]
# groupadd -g 404 -r usenfs
[root@nsf ~]
# useradd -r -u 404 -g 404 -s /sbin/nologin usenfs
[root@nsf ~]
# id usenfs
uid=404(usenfs) gid=404(usenfs)
groups
=404(usenfs)
|
(2)、授权
(A)、在文件系统级别授权;使用控制列表方式,授权UID为:404的用户usenfs有NFS服务器导出的文件系统的读写权限。
1
2
3
4
5
6
7
8
9
10
11
|
[root@nsf /]
# setfacl -m u:usenfs:rwx /mydata
[root@nsf /]
# getfacl /mydata
getfacl: Removing leading
'/'
from absolute path names
# file: mydata
# owner: root
# group: root
user::rwx
user:usenfs:rwx ----> 表示:usenfs用户有读写执行权限。
group::r-x
mask::rwx
other::r-x
|
(B)、设置NFS服务器导出的文件系统,在NFS级别做访问控制。
1
2
|
[root@nsf /]
# vim /etc/exports
/mydata
192.168.60.0
/24
(rw)
|
启动NFS服务器
1
2
3
4
5
6
7
|
[root@nsf /]
# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Stopping RPC idmapd: [ OK ]
Starting RPC idmapd: [ OK ]
Starting NFS daemon: [ OK ]
|
(3)、查看NFS服务器导出的文件系统
1
2
3
|
[root@nsf /]
# showmount -e 192.168.60.40
Export list
for
192.168.60.40:
/mydata
192.168.60.0
/24
|
(4)、创建MariDB数据库的数据目录
1
|
[root@nsf /]
mkdir
/mydata/mysql
|
使用控制列表方式授与 usefs 用户有该目录的读写执行权限。
1
2
3
4
5
6
7
8
9
10
11
|
[root@nsf mysql]
# setfacl -m u:usenfs:rwx /mydata/mysql/
[root@nsf mysql]
# getfacl /mydata/mysql/
getfacl: Removing leading
'/'
from absolute path names
# file: mydata/mysql/
# owner: root
# group: root
user::rwx
user:usenfs:rwx ----> usenfs用户的权限
group::r-x
mask::rwx
other::r-x
|
三、分别在两个节点安装数据库软件:
两个节点使用的数据库软件的版本要求是一致的。因为,两个节点的数据库软件使用的是同一份数据集。由于不同版本的数据库,它的元数据有差异。会造成无法启动数据库服务的。
这里两个节点都使用二进制版本的MariaDB数据库软件。
1
|
mariadb-5.5.36-linux-x86_64.
tar
.gz
|
1、在 node1(192.168.60.22)安装数据库软件
(1)、在node1挂载并测试NFS服务器导出的文件系统
查看NFS服务器导出的文件系统
1
2
3
|
[root@node1 ~]
# showmount -e 192.168.60.40
Export list
for
192.168.60.40:
/mydata
192.168.60.0
/24
|
创建挂载点
1
|
[root@node1 /]
# mkdir mysqldata
|
挂载NFS寻出的文件系统
1
2
3
|
[root@node1 /]
# mount -t nfs 192.168.60.40:/mydata /mysqldata
[root@node1 /]
# mount | grep mysqldata
192.168.60.40:
/mydata
on
/mysqldata
type
nfs (rw,vers=4,addr=192.168.60.40,clientaddr=192.168.60.22)
|
(2)、安装: MariaDB 数据库
使用的是二进制包安装数据包的方式。
(A)、初始化数据前的准备工作
解压到指定目录下
1
2
|
[root@node1 admin]
# tar -xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/
[root@node1 admin]
# cd /usr/local/
|
为了以后维护方便不直接修改目录名称,使用软连接的方式
1
2
3
|
[root@node1
local
]
# ln -sv mariadb-5.5.36-linux-x86_64 mysql
[root@node1
local
]
# ll mysql
lrwxrwxrwx 1 root root 27 Sep 12 21:23 mysql -> mariadb-5.5.36-linux-x86_64
|
由于初始化数据库的时候,要以mysql用户的身份运行一些脚本来完成数据库的初始化工作。所以。修改数据库的程序文件的属主为mysql
1
2
3
4
5
6
7
8
|
[root@node1 mysql]
# chown -R mysql:mysql ./*
[root@node1 mysql]
# ll
total 212
drwxr-xr-x 2 mysql mysql 4096 Sep 12 21:22 bin
-rw-r--r-- 1 mysql mysql 17987 Feb 24 2014 COPYING
-rw-r--r-- 1 mysql mysql 26545 Feb 24 2014 COPYING.LESSER
drwxr-xr-x 3 mysql mysql 4096 Sep 12 21:22 data
....
|
(B)、初始化数据库,指定数据目录的位置和初始化数据库使用的用户
1
2
3
4
5
|
[root@node1 mysql]
# ./scripts/mysql_install_db --datadir=/mysqldata/mysql/ --user=mysql
Installing MariaDB
/MySQL
system tables
in
'/mysqldata/mysql/'
...
OK
Filling help tables...
OK
|
说明:
从上述可以看出,初始化数据库已经OK!
(3)、为启动 MariaDB 数据库做准备
提供数据库提供配置文件
1
|
[root@node1 mysql]
# cp support-files/my-large.cnf /etc/my.cnf
|
由于,修改了数据库的数据目录,所以要在配置文件中指定数据库的数据目录
1
2
3
|
[root@node1 mysql]
# vim /etc/my.cnf
thread_concurrency = 2
datadir =
/mysqldata/mysql/
|
提供LSB风格的启动脚本,管理 MariaDB 的启动、停止、重启、重新加裁配置文件等操作
1
2
3
|
[root@node1 mysql]
# cp support-files/mysql.server /etc/init.d/mysqld
[root@node1 mysql]
# ll /etc/init.d/mysqld
-rwxr--r-- 1 root root 11844 Sep 12 21:39
/etc/init
.d
/mysqld
|
为了安全考虑把数据库的程序目录的属主修改为:root
1
2
3
4
5
6
7
8
9
10
11
|
[root@node1 mysql]
# chown -R root:mysql ./*
[root@node1 mysql]
# ll
total 212
drwxr-xr-x 2 root mysql 4096 Sep 12 21:22 bin
-rw-r--r-- 1 root mysql 17987 Feb 24 2014 COPYING
-rw-r--r-- 1 root mysql 26545 Feb 24 2014 COPYING.LESSER
drwxr-xr-x 3 root mysql 4096 Sep 12 21:22 data
drwxr-xr-x 2 root mysql 4096 Sep 12 21:23 docs
drwxr-xr-x 3 root mysql 4096 Sep 12 21:23 include
-rw-r--r-- 1 root mysql 8694 Feb 24 2014 INSTALL-BINAR
......
|
(4)、启动MariaDB数据库并测试
启动 MariaDB 数据库
1
2
|
[root@node1 mysql]
# service mysqld start
Staring mysqld [ OK ]
|
连接测试数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@node1 mysql]
# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection
id
is 3
......
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
|
test
|
+--------------------+
4 rows
in
set
(0.01 sec)
|
测试在该节点是否能够创建数据库和删除数据库,来检测mysql用户是否有NFS共享文件系统的读写权限的。
创建数据库
1
2
|
MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.03 sec)
|
删除数据库
1
2
|
MariaDB [(none)]> drop database testdb;
Query OK, 0 rows affected (0.00 sec)
|
说明:
在node1节点数据库已经安装成功!
(5)、配置成HA高可用服务的资源不能让它开机自动启动
停止node1节点的数据库服务
1
2
|
[root@node1 mysql]
# service mysqld stop
Shutting down MySQL.. [ OK ]
|
卸载nfs文件系统
1
|
[root@node1 mysql]
# umount /mysqldata/
|
由于是提供数据库的高可用的,是不允许开机自动启用数据库服务的。保证开机不会自动启用高可用服务
1
2
3
|
[root@node1 ~]
# chkconfig mysqld off
[root@node1 ~]
# chkconfig --list mysqld
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
|
2、在node2(192.168.60.128)节点安装数据库
(1)、在node1挂载并测试NFS服务器导出的文件系统
创建挂载点
1
|
[root@node2 /]
# mkdir mysqldata
|
查看NFS服务器导出的共享文件系统
1
2
3
|
[root@node2 /]
# showmount -e 192.168.60.40
Export list
for
192.168.60.40:
/mydata
192.168.60.0
/24
|
挂载NFS服务器导出的共享文件系统
1
|
root@node2 /]
# mount -t nfs 192.168.60.40:/mydata /mysqldata/
|
查看是否挂载成功
1
2
|
[root@node2 /]
# mount | grep "\/mysqldata"
192.168.60.40:
/mydata
on
/mysqldata
type
nfs (rw,vers=4,addr=192.168.60.40,clientaddr=192.168.60.128)
|
(2)、安装: MariaDB 数据库
解压到指定目录下
1
|
[root@node2 admin]
# tar -xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/
|
为了日后操作维护方便,不直接修改目标名称,给该目录创建一个软链接
1
2
3
4
5
|
[root@node2 admin]
# cd /usr/local/
[root@node2
local
]
# ln -sv mariadb-5.5.36-linux-x86_64 mysql
`mysql
' -> `mariadb-5.5.36-linux-x86_64'
[root@node2
local
]
# ll mysql
lrwxrwxrwx 1 root root 27 Sep 12 22:27 mysql -> mariadb-5.5.36-linux-x86_64
|
由于在node1节点已经初始化过数据库了,该节点无需再次初始化数据库了。
修改数据库程序的属主属组为:root:mysql
1
2
3
4
5
6
7
8
9
|
[root@node2 mysql]
# chown -R root:mysql ./*
[root@node2 mysql]
# ll
total 212
drwxr-xr-x 2 root mysql 4096 Sep 12 21:53 bin
-rw-r--r-- 1 root mysql 17987 Jul 22 2013 COPYING
-rw-r--r-- 1 root mysql 26545 Jul 22 2013 COPYING.LESSER
drwxr-xr-x 3 root mysql 4096 Sep 12 21:53 data
drwxr-xr-x 2 root mysql 4096 Sep 12 21:53 docs
drwxr-xr-x 3 root mysql 4096 Sep 12 21:53 include
|
(3)、为启动服务库服务准备条件;
为了保证两个节点的数据库的配置一样,从node1节点分别拷贝:配置文件和启动脚本 到node2节点
1
2
3
4
|
[root@node1 mysql]
# scp /etc/my.cnf node2:/etc/
my.cnf 100% 4929 4.8KB
/s
00:00
[root@node1 mysql]
# scp -p /etc/init.d/mysqld node2:/etc/init.d/
mysqld 100% 12KB 11.6KB
/s
00:00
|
(4)、启动 MariDB 数据库并测试
启动数据库服务
1
2
|
[root@node2 mysql]
# service mysqld start
Starting MySQL... [ OK ]
|
连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@node2 mysql]
# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
......
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.06 sec)
|
说明:
可以连接数据库
测试在该节点是否能够创建数据库和删除数据库,来检测mysql用户是否有NFS共享文件系统的读写权限的。
创建数据库
1
2
|
MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.03 sec)
|
删除数据库
1
2
|
MariaDB [(none)]> drop database testdb;
Query OK, 0 rows affected (0.03 sec)
|
说明:
从上述操作及结果可以得出结论。在node2节点可以正常操作数据库。
(5)、做数据库服务做一些初始化工作;
由于安装数据库的时候会默认添加了一些用户且是没有密码,按照实际情况删除不需要的用户
给保留的用户设置密码,为了管理数据库方便是,设置远程管理数据库的用户。
删除数据库一些默认添加的的用户
1
2
3
4
5
|
MariaDB [(none)]> drop user
'root'
@
'node1.9527du.com'
;
MariaDB [(none)]> drop user
'root'
@
'::1'
;
MariaDB [(none)]> drop user
''
@
'localhost'
;
MariaDB [(none)]> drop user
''
@
'node1.9527du.com'
;
Query OK, 0 rows affected (0.00 sec)
|
给保留的用户添加密码
1
2
3
4
5
|
MariaDB [(none)]>
set
password
for
'root'
@
'localhost'
= password(
'root'
);
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]>
set
password
for
'root'
@
'127.0.0.1'
= password(
'root'
);
Query OK, 0 rows affected (0.00 sec)
|
添加能够远程管理数据库的用户
1
2
|
MariaDB [(none)]> grant all on *.* to
'admin'
@
'%.%.%.%'
identified by
'admin'
;
Query OK, 0 rows affected (0.00 sec)
|
修改后的 MariaDB数据库的用户如下:
1
2
3
4
5
6
7
8
9
|
MariaDB [(none)]>
select
user,host,password from mysql.user;
+-------+-----------+-------------------------------------------+
| user | host | password |
+-------+-----------+-------------------------------------------+
| root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| admin | %.%.%.% | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+-------+-----------+-------------------------------------------+
3 rows
in
set
(0.00 sec)
|
刷新授权表
1
2
|
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
|
(6)、配置成HA高可用服务的资源不能让它开机自动启动
停止数据库服务
1
2
|
[root@node2 mysql]
# service mysqld stop
Shutting down MySQL. [ OK ]
|
卸载挂载的NFS文件系统
1
|
[root@node2 mysql]
# umount /mysqldata/
|
设置不能开机启动数据库服务
1
2
3
|
[root@node2 mysql]
# chkconfig mysqld off
[root@node2 mysql]
# chkconfig --list mysqld
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
|
四、配置 corosync 提供数据库服务的高可用;
1、提供HA高可用集群的节点通信的密钥;
节点间的心跳信息和集群事务信息要加密传输的,不允许主机随便加入HA高可用集群的。
使用corosync提供的命令【corosync-keygen】生成该HA高可用集群的认证密钥。持有该解密的节点才属于该HA高可用集群的成员。
在node1节点生成密钥,生成的密钥是默认保存在/etc/corosync目录中的
生成密钥
1
|
[root@node1 corosync]
# corosync-keygen
|
为corosync提供配置文件
2、提供配置文件
1
|
[root@node1 corosync]
# cp corosync.conf.example corosync.conf
|
配置文件设置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
[root@haproxy ~]
# cat /etc/corosync/corosync.conf
# Please read the corosync.conf.5 manual page
compatibility: whitetank
totem {
version: 2
secauth: on
threads: 0
interface {
ringnumber: 1 ----> 指定多播使用的网卡
bindnetaddr: 192.168.0.0
mcastaddr: 226.94.10.10 ----> 组播地址
mcastport: 5405
ttl: 1
}
}
logging { -----> 日志信息的配置
fileline: off
to_stderr: no
to_logfile:
yes
to_syslog: no
logfile:
/var/log/cluster/corosync
.log
debug: off ------> 关闭调试日志
timestamp: on
logger_subsys
{
subsys: AMF
debug: off
}
}
service { ---------> pacemaker以做了corosync的一个模块工作
ver: 0
name: pacemaker
}
amf {
mode: disabled
}
|
复制配置文件和密钥文件到node2节点,保证HA高可用节点的配置是一样的。
1
2
3
|
[root@node1 corosync]
# scp -p corosync.conf authkey node2:/etc/corosync/
corosync.conf 100% 497 0.5KB
/s
00:00
authkey 100% 128 0.1KB
/s
00:00
|
3、启动node1节的 corosync 服务
(1)、在node1节点启动corosync服务
1
2
|
[root@node1 corosync]
# service corosync start
Starting Corosync Cluster Engine (corosync): [ OK ]
|
(2)、检测在该节点启动的corosync是否正常
由于HA高可用集群的核心层是:
1
2
|
Message Layer 心跳信息和集群事务信息层
Cluster Resource Manager 资源管理层
|
corosync 自己实现 Message Layer 层的功能,使用 pacemaker 做为HA的资源管理器(corosync 2.0 版本以前,是做为corosync的一个模块工作的),
从而提供一个完成的HA高可用解决方案。为了保证 corosync 能够正常工作,通过日志查看HA的核心层的工作状况。
(A)、查看 Message Layer 层的运行状况
查看corosync引擎是否正常启动
1
2
|
[root@node1 ~]
# grep -e "Corysync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
Sep 13 17:02:56 corosync [MAIN ] Successfully
read
main configuration
file
'/etc/corosync/corosync.conf'
.
|
查看初始化成员节点通知是否正常发出:
1
2
3
4
5
6
7
|
[root@node1 ~]
# grep TOTEM /var/log/cluster/corosync.log
Sep 13 17:02:56 corosync [TOTEM ] Initializing transport (UDP
/IP
Multicast).
Sep 13 17:02:56 corosync [TOTEM ] Initializing transmit
/receive
security: libtomcrypt SOBER128
/SHA1HMAC
(mode 0).
Sep 13 17:02:56 corosync [TOTEM ] The network interface [192.168.60.22] is now up.
Sep 13 17:02:57 corosync [TOTEM ] Process pause detected
for
594 ms, flushing membership messages.
Sep 13 17:02:57 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
Sep 13 17:04:29 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
|
(B)、查看 Manager Resource Manager 资源管理层的工作状况
查看资源管理器pacemaker是否正常启动:
1
2
3
4
5
6
|
[root@node1 ~]
# grep "pcmk_startup" /var/log/cluster/corosync.log
Sep 13 17:02:56 corosync [pcmk ] info: pcmk_startup: CRM: Initialized
Sep 13 17:02:56 corosync [pcmk ] Logging: Initialized pcmk_startup
Sep 13 17:02:56 corosync [pcmk ] info: pcmk_startup: Maximum core
file
size is: 18446744073709551615
Sep 13 17:02:56 corosync [pcmk ] info: pcmk_startup: Service: 9
Sep 13 17:02:56 corosync [pcmk ] info: pcmk_startup: Local
hostname
: node1.9527du.com
|
(C)、检查启动过程中是否有错误产生
1
2
3
|
[root@node1 ~]
# grep ERROR: /var/log/cluster/corosync.log
Sep 13 17:02:56 corosync [pcmk ] ERROR: process_ais_conf: You have configured a cluster using the Pacemaker plugin
for
Corosync. The plugin is not supported
in
this environment and will be removed very soon.
Sep 13 17:02:56 corosync [pcmk ] ERROR: process_ais_conf: Please see Chapter 8 of
'Clusters from Scratch'
(http:
//www
.clusterlabs.org
/doc
)
for
details on using Pacemaker with CMAN
|
说明:
在 corosync 2.0版本,packmaker是作为 corosync 的插件运行的。
上述的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务;此处可安全忽略。
从查看corosync的日志可以得知,node2节点的corosync已经运行正常。
4、启动node2节的 corosync 服务
node1 节点的 corosync 运行正常了,就可以启动 node2 节点的 corosyn 服务器。
(1)、通过远程方式启动corosync服务
1
2
|
[root@node1 corosync]
# ssh node2 "service corosync start"
Starting Corosync Cluster Engine (corosync): [ OK ]
|
(2)、同样,也像查看 node1 节点那样,查看 node2 节点的 corosync 的运行状况:
(A)、查看 Message Layer 的运行状况
查看corosync引擎是否正常启动
1
2
|
[root@node2 ~]
# grep "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
/var/log/cluster/corosync
.log:Sep 13 17:14:22 corosync [MAIN ] Successfully
read
main configuration
file
'/etc/corosync/corosync.conf'
.
|
查看初始化成员节点通知是否正常发出
1
2
3
4
5
|
[root@node2 ~]
# grep "TOTEM" /var/log/cluster/corosync.log
Sep 13 17:14:22 corosync [TOTEM ] Initializing transport (UDP
/IP
Multicast).
Sep 13 17:14:22 corosync [TOTEM ] Initializing transmit
/receive
security: libtomcrypt SOBER128
/SHA1HMAC
(mode 0).
Sep 13 17:14:22 corosync [TOTEM ] The network interface [192.168.60.128] is now up.
Sep 13 17:14:23 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
|
(B)、查看 Cluser Resource Manager 层的工作状况
查看资源管理器pacemaker是否正常启动
1
2
3
4
5
6
|
[root@node2 ~]
# grep "pcmk_startup" /var/log/cluster/corosync.log
Sep 13 17:14:22 corosync [pcmk ] info: pcmk_startup: CRM: Initialized
Sep 13 17:14:22 corosync [pcmk ] Logging: Initialized pcmk_startup
Sep 13 17:14:22 corosync [pcmk ] info: pcmk_startup: Maximum core
file
size is: 18446744073709551615
Sep 13 17:14:22 corosync [pcmk ] info: pcmk_startup: Service: 9
Sep 13 17:14:22 corosync [pcmk ] info: pcmk_startup: Local
hostname
: node2.9527du.com
|
(C)、查看 corosync 启动过程中是否有错误信息。
1
2
3
|
[root@node2 ~]
# grep ERROR: /var/log/cluster/corosync.log
ep 13 17:14:22 corosync [pcmk ] ERROR: process_ais_conf: You have configured a cluster using the Pacemaker plugin
for
Corosync. The plugin is not supported
in
this environment and will be removed very soon.
Sep 13 17:14:22 corosync [pcmk ] ERROR: process_ais_conf: Please see Chapter 8 of
'Clusters from Scratch'
(http:
//www
.clusterlabs.org
/doc
)
for
details on using Pacemaker with CMAN
|
说明:
上述的错误信息可以忽略。
从上述的日志分析,corosync 服务已经运行正常。
到此为止,两个节点的 corosync 服务都运行OK!!!
五、配置HA高可用集群的资源:
1、分析提供高可用数据库服务需要哪些资源?
1
2
3
4
|
(1)、IP 地址
(2)、启动数据库服务的进程 mysqld
(3)、挂载NFS共享的文件系统
因为,使用NFS共享的文件系统存放数据库的数据目录的
|
2、由上述的3个资源一起才能够提供数据库服务,所以在HA高可用集群服务中,要对资源做一些约束。
(1)、保证无论何时,这三个资源都始终运行在同一个HA节点
解决方案:
1
2
|
A、设置一个资源组,这三个资源都属于该组
B、排列约束colocation:定义资源彼此间是否在一起的倾向性。
|
(2)、提供数据库服务必须的3资源,要有启动的先后顺序。
原因1、由于使用NFS共享文件系统做为数据库的数据目录,挂载nfs共享文件系统成功之后才可以启用数据库服务进程。
原因2、即使数据库服务启动成功,没有IP地址。启动成功数据库服务也没有用。
所以,在配置资源时,要对资源的启动顺序做一些限制。方案:
使用资源约束中的顺序约束:order
(3)、考滤HA节点的硬件资源能力和备用节点运行资源时是否压力过大
可以使用位置约束location: 资源对某节点运行的倾向性(负无穷--正无穷)
注意:资源的流转必然会导致服务暂时的中断。
3、使用pacemaker 提供的资源代理来管理提供数据库服务的三个资源的:启动、关闭、监控,从而实现数据库服务的高可用。
说明:
这里使用crm 文本接口配置HA高可用的集群
4、查看启动的HA集群的各项信息
(1)、查看集群状态
1
2
3
4
5
6
7
8
9
10
11
|
[root@node1 ~]
# crm status
Last updated: Sat Sep 13 17:49:38 2014
Last change: Sat Sep 13 17:04:29 2014 via crmd on node1.9527du.com
Stack: classic openais (with plugin)
Current DC: node1.9527du.com - partition with quorum ------> DC 所在的节点和该集群是否拥有法定票数
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes -----> 集群的票数
0 Resources configured ----> 该集群的资源
Online: [ node1.9527du.com node2.9527du.com ] ----> 两个节点都在线
|
(2)、查看,pacemaker提供资源管理层(Cluster Resources Manager)的各个组件:
1
2
3
4
5
6
7
8
9
|
[root@node1 ~]
# ps auxf | grep -e "corosync" -e "pacemaker"
root 2468 0.4 0.9 545128 4608 ? Ssl 17:02 0:13 corosync
189 2473 0.0 1.9 94024 9768 ? S 17:02 0:02 \_
/usr/libexec/pacemaker/cib
----> 集群信息库。HA高可用集群的资源配置都存放在这里。
------> 在一个节点通过CRM命令行接口连接到资源管理层,就可以配置集群了。配置好资源后,借助message layer层,自动把配置好的数据同步到各个节点。
root 2474 0.0 0.7 94372 3520 ? S 17:02 0:01 \_
/usr/libexec/pacemaker/stonithd
----> 管理stonithd 的
root 2475 0.0 0.5 76088 2664 ? S 17:02 0:00 \_
/usr/libexec/pacemaker/lrmd
189 2476 0.0 0.5 89628 2952 ? S 17:02 0:01 \_
/usr/libexec/pacemaker/attrd
189 2477 0.0 3.7 117264 18416 ? S 17:02 0:00 \_
/usr/libexec/pacemaker/pengine
----> 策略引擎,根据HA集群的资源运行情况,制定策略的。
189 2478 0.0 0.8 147784 4012 ? S 17:02 0:00 \_
/usr/libexec/pacemaker/crmd
|
5、配置资源
一般HA高可用集群的节点不止两个。当某个节点故障了,该节点的资源就需要在运行正常的节点启动,是在每个正常的节点都启动呢,还是在其中的某个节点启动呢?
这是通过资源的类型来定义的。所以在配置HA高可用集群资源时,要指定资源的类型的。那么HA高可用集群的资源类型有那些?
1
2
3
4
|
(A)、primitive,native 主资源,其仅能运行某一节点
(B)、clone 克隆资源,一个资源可以运行于多个节点;
应该指定:最大克隆的份数,每个节点最多可以运行的克隆。
(C)、master
/slave
主从资源,特殊的克隆资源。
|
(1)、由于提供的两个节点的HA高可用集群,只要有一个节点故障集群都不能满足法定票数,该HA集群就不能工作了。所以,要设置当法定票数不满足时,集群还可以正常工作。如果不提供stonith,是不允许启动corosync 的。所以,还需要关闭stonith
(A)、设置HA高可用集群不满足法定票数时的策略
1
|
crm(live)configure
# no-quorum-policy=ignore
|
(B)、关闭stonith
1
|
crm(live)configure
# property stonith-enabled= false
|
(2)、添加资源
(A)、配置流动IP资源
1
|
crm(live)configure
# primitive myIP ocf:heartbeat:IPaddr params ip=192.168.60.56 op monitor timeout=20 interval=10s op start timeout=20s op stop timeout=20s op status timeout=20s interval=10s
|
说明:
primitive 指定该资源为主资源
使用的资源代理(Resource Agent)为:IPaddr
(B)、配置挂载nfs共享文件系统的资源
1
|
crm(live)configure
# primitive nfsshare ocf:heartbeat:Filesystem params device=192.168.60.40:/mydata directory=/mysqldata fstype=nfs op monitor timeout=40s interval=20s op start timeout=60s op stop timeout=60s op notify timeout=60s
|
(C)、配置启动数据库服务的进程资源
1
|
crm(live)configure
# primitive mysqlserver lsb:mysqld op monitor timeout=15s interval=15s op start timeout=15s op stop timeout=15s op status timeout=15s op restart timeout=15s
|
(3)、设置资源的约束
(A)、使用排列约束(colocation),限定提供数据库服务的三个资源一定必须运行在同一个节点
1
|
crm(live)configure
# colocation mysqlserver_with_nfsshare_with_myIP inf: mysqlserver nfsshare myIP
|
(B)、使用顺序约束(order),指定提供数据库服务的三个资源的先后启动顺序(关闭资源的顺序是一个相反的过程,所以不会造成卸载NFS文件系统再关闭数据库服务的情况)
1
|
crm(live)configure
# order myIP_before_nfsshare_before_mysqlserver inf: myIP nfsshare mysqlserver
|
(C)、使用位置约束(location),限定资源倾向于运行在那个节点。
1
|
crm(live)configure
# location myIP_on_node1 myIP inf: node1.9527du.com
|
(4)、配置好后的处理
(A)、检验配置是否有错误
1
|
crm(live)configure
# verify
|
(B)、没有错误就提交
1
2
|
crm(live)configure
# commit
crm(live)configure
# cd ../
|
(C)、查看提供数据库高可用集群的运行状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
crm(live)
# status
Last updated: Mon Sep 15 20:05:50 2014
Last change: Mon Sep 15 20:04:58 2014 via cibadmin on node1.9527du.com
Stack: classic openais (with plugin)
Current DC: node1.9527du.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes -----> 该集群有2个节点,当前票数为2
3 Resources configured ------> 该集群有3个资源
Online: [ node1.9527du.com node2.9527du.com ] -----> HA高可用集群的节点运行状态
----------下面就是该HA高可用集群的资源的运行状态----------------------------------
myIP (ocf::heartbeat:IPaddr): Started node1.9527du.com
nfsshare (ocf::heartbeat:Filesystem): Started node1.9527du.com
mysqlserver (lsb:mysqld): Started node1.9527du.com
crm(live)
#
|
说明:
从上述信息得出结论,提供数据库服务的HA高可用集群已经配置成功。
六、测试提供数据库服务的HA高可用集群是否成功?
测试节点的高可用,可以理解为是否能够提供节点的冗余
1、检查资源
(1)、流动IP
1
2
3
|
[root@node1 ~]
# ip add show | grep "[[:space:]]*inet\>[[:space:]]*[1][9][2]"
inet 192.168.60.22
/24
brd 192.168.60.255 scope global eth0
inet 192.168.60.56
/24
brd 192.168.60.255 scope global secondary eth0
|
(2)、是否挂载nfs共享文件系统
1
2
|
[root@node1 ~]
# mount | grep "mysqldata"
192.168.60.40:
/mydata
on
/mysqldata
type
nfs (rw,vers=4,addr=192.168.60.40,clientaddr=192.168.60.22)
|
(3)、查看mysqld进程
1
2
3
|
root@node1 ~]
# ps aux | grep mysqld
root 52041 0.0 0.3 108332 1504 ? S 20:04 0:00
/bin/sh
/usr/local/mysql/bin/mysqld_safe
--datadir=
/mysqldata/mysql/
--pid-
file
=
/mysqldata/mysql//node1
.9527du.com.pid
mysql 52375 0.5 21.3 857644 105640 ? Sl 20:04 0:01
/usr/local/mysql/bin/mysqld
--basedir=
/usr/local/mysql
--datadir=
/mysqldata/mysql/
--plugin-
dir
=
/usr/local/mysql/lib/plugin
--user=mysql --log-error=
/mysqldata/mysql//node1
.9527du.com.err --pid-
file
=
/mysqldata/mysql//node1
.9527du.com.pid --socket=
/tmp/mysql
.sock --port=3306
|
2、远程连接测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
C:\>mysql -uadmin -h192.168.60.56 -p
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection
id
is 2
Server version: 5.5.36-MariaDB-log MariaDB Server
。。。。。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
|
test
|
+--------------------+
4 rows
in
set
(0.07 sec)
mysql> create database testdata;
Query OK, 1 row affected (0.02 sec)
|
说明:
数据库服务工作正常。
3、模拟节点故障测试服务是否可以转移
(1)、让 node1 下线
1
|
crm(live)
# node standby node1.9527du.com
|
(2)、查看HA高可用集群的运行状况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
crm(live)
# status
Last updated: Mon Sep 15 20:19:27 2014
Last change: Mon Sep 15 20:19:22 2014 via crm_attribute on node1.9527du.com
Stack: classic openais (with plugin)
Current DC: node1.9527du.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
3 Resources configured
Node node1.9527du.com: standby
Online: [ node2.9527du.com ] ----> 该HA高可用集群只有node2节点在线
-------------查看提供数据库服务的资源的运行状况--------------------------
myIP (ocf::heartbeat:IPaddr): Started node2.9527du.com
nfsshare (ocf::heartbeat:Filesystem): Started node2.9527du.com
mysqlserver (lsb:mysqld): Started node2.9527du.com
|
说明:
三个资源立即转移到node2.9527du.com 节点
(3)、查看 node2的资源情况
1
2
3
4
5
6
7
8
|
[root@node2 ~]
# ip add show | grep "[[:space:]]*inet\>[[:space:]]*[1][9][2]"
inet 192.168.60.128
/24
brd 192.168.60.255 scope global eth1
inet 192.168.60.56
/24
brd 192.168.60.255 scope global secondary eth1
[root@node2 ~]
# ps aux | grep mysqld
root 13352 0.0 0.3 108332 1572 ? S 23:46 0:00
/bin/sh
/usr/local/mysql/bin/mysqld_safe
--datadir=
/mysqldata/mysql/
--pid-
file
=
/mysqldata/mysql//node2
.9527du.com.pid
mysql 13655 0.2 21.3 857644 105632 ? Sl 23:46 0:00
/usr/local/mysql/bin/mysqld
--basedir=
/usr/local/mysql
--datadir=
/mysqldata/mysql/
--plugin-
dir
=
/usr/local/mysql/lib/plugin
--user=mysql --log-error=
/mysqldata/mysql//node2
.9527du.com.err --pid-
file
=
/mysqldata/mysql//node2
.9527du.com.pid --socket=
/tmp/mysql
.sock --port=3306
[root@node2 ~]
# netstat -anptl | grep mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 13655
/mysqld
|
说明:
提供数据库服务的3个资源在node2节点都工作正常。
4、访问mysql并删除testdb数据库
(1)、远程连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
C:\>mysql -uadmin -h192.168.60.56 -p
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection
id
is 3
Server version: 5.5.36-MariaDB-log MariaDB Server
......
Type
'help;'
or
'\h'
for
help. Type
'\c'
to
clear
the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
|
test
|
| testdata |
+--------------------+
5 rows
in
set
(0.01 sec)
|
(2)、执行删除数据库操作
1
2
|
mysql> drop database testdata;
Query OK, 0 rows affected (0.16 sec)
|
说明:
在node2也可以操作数据库。资源转移到node2节点,一样可以操作数据库。
5、让 node1上线,再测试
(1)、让node1节点上线
1
|
crm(live)
# node online node1.9527du.com
|
(2)、查看HA高可用集群的运行状况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
crm(live)
# status
Last updated: Mon Sep 15 20:21:06 2014
Last change: Mon Sep 15 20:21:03 2014 via crm_attribute on node1.9527du.com
Stack: classic openais (with plugin)
Current DC: node1.9527du.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
3 Resources configured
Online: [ node1.9527du.com node2.9527du.com ] ------> 两个节点都在线
------------------查看提供数据库服务的三个资源的运行状态-----------------------
myIP (ocf::heartbeat:IPaddr): Started node1.9527du.com
nfsshare (ocf::heartbeat:Filesystem): Started node1.9527du.com
|
说明:
从上述可以看出资源立即流转回node1节点。因为定义了位置约束。
提供数据库服务的HA高可用集群是正常工作的。
测试服务的高可用,意思是说,停止某个资源后,corosync的资源代理监控该该资源故障了,通告资源管理器。资源管理器理是否会指挥资源代理重新启动该资源。
1、停止 mysqld 进程
1
2
3
|
[root@node1 ~]
# date;service mysqld stop
Mon Sep 15 20:36:03 CST 2014
Shutting down MySQL. [ OK ]
|
2、查看自动启动服务
1
2
|
[root@node1 ~]
# date ;netstat -anptl | grep mysqld
Mon Sep 15 20:36:09 CST 2014
|
再查看
1
2
3
|
[root@node1 ~]
# date ;netstat -anptl | grep mysqld
Mon Sep 15 20:36:17 CST 2014
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 14973
/mysqld
|
说明:
20:36:03 关闭mysqld 进程
20:36:17 mysql数据库又重新提供服务了。
资源的高可用已经实现。
数据库服务的高可用已经OK。。。。