corosync 實現 MariaDB 數據庫服務的高可用

方案:

    corosync + pacemaker  提供HA的解決方案。

    使用NFS共享服務器導出的共享文件系統做爲數據目錄;

拓撲圖如下:

wKiom1Qr_BjCyRZJAAJqfTCEF1Y669.jpg

一、配置HA高可用集羣的各節點間能夠基於主機名通訊。

1、設置主機名

(1)、在 192.168.60.128 主機設置

編輯/etc/sysconfig/network文件,使得主機名永久有效

[root@www ~]# vim /etc/sysconfig/network
HOSTNAME=node2.9527du.com

使用hostname命令設置主機名,讓它即時生效

[root@www ~]# hostname node2.9527du.com

(2)、在 192.168.60.22 主機設置

編輯/etc/sysconfig/network文件,使得主機名永久有效

[root@stu13 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.9527du.com

使用hostname命令設置主機名,讓它即時生成

[root@stu13 ~]# hostname node1.9527du.com

2、爲了,操作方便設置節點之間能夠基於密鑰通訊。也就是所謂的建立信任主機。

[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文件解析主機名。

[root@node1 ~]# vim /etc/hosts
192.168.60.22   node1.9527du.com node1
192.168.60.128  node2.9527du.com node2

把/etc/hosts文件複製到node2節點

[root@node1 ~]# scp /etc/hosts node2:/etc/
hosts                                         100%   78     0.1KB/s   00:00

4、測試兩個節點能夠實現基於密鑰的方式進行通訊和能否基於主機名進行通訊

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)、創建分區

[root@nsf ~]# fdisk -l /dev/sda | grep "/dev/sda3"
/dev/sda3            7859        9164    10489446   8e  Linux LVM

(2)、把該分區做成pv 

[root@nsf ~]# pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created

(3)、創建邏輯卷組myvg,PE大小爲8E.

[root@nsf ~]# vgcreate -s 8M myvg /dev/sda3
  Volume group "myvg" successfully created

(4)、創建lvm,大小爲:2G

[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)、創建掛載點

[root@nsf ~]# mkdir /mydata

(6)、編輯/etc/fstab文件,實現開機可以自動掛載“/dev/myvg/sharedir”

[root@nsf ~]# vim /etc/fstab
/dev/mapper/myvg-sharedir /mydata               ext4    defaults,acl    0 0

(7)、掛載

[root@nsf ~]# mount -a

查看是否掛載

[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用戶

[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用戶

[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的用戶;

[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服務器導出的文件系統的讀寫權限。

[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級別做訪問控制。

[root@nsf /]# vim /etc/exports
/mydata 192.168.60.0/24(rw)

啓動NFS服務器

[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服務器導出的文件系統

[root@nsf /]# showmount -e 192.168.60.40
Export list for 192.168.60.40:
/mydata 192.168.60.0/24

(4)、創建MariDB數據庫的數據目錄

[root@nsf /]mkdir /mydata/mysql

使用控制列表方式授與 usefs 用戶有該目錄的讀寫執行權限。

[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數據庫軟件。

mariadb-5.5.36-linux-x86_64.tar.gz

1、在 node1(192.168.60.22)安裝數據庫軟件

(1)、在node1掛載並測試NFS服務器導出的文件系統

查看NFS服務器導出的文件系統

[root@node1 ~]# showmount -e 192.168.60.40
Export list for 192.168.60.40:
/mydata 192.168.60.0/24

創建掛載點

[root@node1 /]# mkdir mysqldata

掛載NFS尋出的文件系統

[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)、初始化數據前的準備工作

解壓到指定目錄下

[root@node1 admin]# tar -xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/
[root@node1 admin]# cd /usr/local/

爲了以後維護方便不直接修改目錄名稱,使用軟連接的方式

[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

[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)、初始化數據庫,指定數據目錄的位置和初始化數據庫使用的用戶

[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 數據庫做準備

提供數據庫提供配置文件

[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf

由於,修改了數據庫的數據目錄,所以要在配置文件中指定數據庫的數據目錄

[root@node1 mysql]# vim /etc/my.cnf
thread_concurrency = 2
datadir = /mysqldata/mysql/

提供LSB風格的啓動腳本,管理 MariaDB 的啓動、停止、重啓、重新加裁配置文件等操作

[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

[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 數據庫

[root@node1 mysql]# service mysqld start
Staring mysqld [ OK ]

連接測試數據庫

[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共享文件系統的讀寫權限的。

創建數據庫

MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.03 sec)

刪除數據庫

MariaDB [(none)]> drop database testdb;
Query OK, 0 rows affected (0.00 sec)

說明:

    在node1節點數據庫已經安裝成功!


(5)、配置成HA高可用服務的資源不能讓它開機自動啓動

停止node1節點的數據庫服務

[root@node1 mysql]# service mysqld stop
Shutting down MySQL..                                      [  OK  ]

卸載nfs文件系統

[root@node1 mysql]# umount /mysqldata/

由於是提供數據庫的高可用的,是不允許開機自動啓用數據庫服務的。保證開機不會自動啓用高可用服務

[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服務器導出的文件系統

創建掛載點

[root@node2 /]# mkdir mysqldata

查看NFS服務器導出的共享文件系統

[root@node2 /]# showmount -e 192.168.60.40
Export list for 192.168.60.40:
/mydata 192.168.60.0/24

掛載NFS服務器導出的共享文件系統

root@node2 /]# mount -t nfs 192.168.60.40:/mydata /mysqldata/

查看是否掛載成功

[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 數據庫

解壓到指定目錄下

[root@node2 admin]# tar  -xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/

爲了日後操作維護方便,不直接修改目標名稱,給該目錄創建一個軟鏈接

[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

[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節點

[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 數據庫並測試

啓動數據庫服務

[root@node2 mysql]# service mysqld start
Starting MySQL...                                          [  OK  ]

連接數據庫

[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共享文件系統的讀寫權限的。

創建數據庫

MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.03 sec)

刪除數據庫

MariaDB [(none)]> drop database testdb;
Query OK, 0 rows affected (0.03 sec)

說明:

    從上述操作及結果可以得出結論。在node2節點可以正常操作數據庫。


(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)

給保留的用戶添加密碼

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)

添加能夠遠程管理數據庫的用戶

MariaDB [(none)]> grant all on *.* to 'admin'@'%.%.%.%' identified by 'admin';
Query OK, 0 rows affected (0.00 sec)

修改後的 MariaDB數據庫的用戶如下:

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)

刷新授權表

MariaDB [(none)]> flush  privileges;
Query OK, 0 rows affected (0.01 sec)

(6)、配置成HA高可用服務的資源不能讓它開機自動啓動

停止數據庫服務

[root@node2 mysql]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]

卸載掛載的NFS文件系統

[root@node2 mysql]# umount /mysqldata/

設置不能開機啓動數據庫服務

[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目錄中的

生成密鑰

[root@node1 corosync]# corosync-keygen

爲corosync提供配置文件

2、提供配置文件

[root@node1 corosync]# cp corosync.conf.example corosync.conf

配置文件設置如下:

[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高可用節點的配置是一樣的。

[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服務

[root@node1 corosync]# service corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]

(2)、檢測在該節點啓動的corosync是否正常

由於HA高可用集羣的核心層是:

                         Message Layer 心跳信息和集羣事務信息層
			 Cluster Resource Manager 資源管理層

corosync 自己實現 Message Layer 層的功能,使用 pacemaker 做爲HA的資源管理器(corosync 2.0 版本以前,是做爲corosync的一個模塊工作的),

從而提供一個完成的HA高可用解決方案。爲了保證 corosync 能夠正常工作,通過日誌查看HA的核心層的工作狀況。

(A)、查看 Message Layer 層的運行狀況

查看corosync引擎是否正常啓動

[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'.

查看初始化成員節點通知是否正常發出:

[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是否正常啓動:

[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)、檢查啓動過程中是否有錯誤產生

[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服務

[root@node1 corosync]# ssh node2 "service corosync start"
Starting Corosync Cluster Engine (corosync): [  OK  ]

(2)、同樣,也像查看 node1 節點那樣,查看 node2 節點的 corosync 的運行狀況:

(A)、查看 Message Layer 的運行狀況

查看corosync引擎是否正常啓動

[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'.

查看初始化成員節點通知是否正常發出

[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是否正常啓動

[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 啓動過程中是否有錯誤信息。

[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)、IP 地址
   (2)、啓動數據庫服務的進程 mysqld
   (3)、掛載NFS共享的文件系統
        因爲,使用NFS共享的文件系統存放數據庫的數據目錄的

2、由上述的3個資源一起才能夠提供數據庫服務,所以在HA高可用集羣服務中,要對資源做一些約束。

   (1)、保證無論何時,這三個資源都始終運行在同一個HA節點

        解決方案:

	        A、設置一個資源組,這三個資源都屬於該組
		B、排列約束colocation:定義資源彼此間是否在一起的傾向性。

   (2)、提供數據庫服務必須的3資源,要有啓動的先後順序。

        原因1、由於使用NFS共享文件系統做爲數據庫的數據目錄,掛載nfs共享文件系統成功之後纔可以啓用數據庫服務進程。

原因2、即使數據庫服務啓動成功,沒有IP地址。啓動成功數據庫服務也沒有用。

所以,在配置資源時,要對資源的啓動順序做一些限制。方案:

使用資源約束中的順序約束:order 

   (3)、考濾HA節點的硬件資源能力和備用節點運行資源時是否壓力過大

        可以使用位置約束location: 資源對某節點運行的傾向性(負無窮--正無窮)

注意:資源的流轉必然會導致服務暫時的中斷。


3、使用pacemaker 提供的資源代理來管理提供數據庫服務的三個資源的:啓動、關閉、監控,從而實現數據庫服務的高可用。

         

說明:

   這裏使用crm 文本接口配置HA高可用的集羣

4、查看啓動的HA集羣的各項信息

(1)、查看集羣狀態

[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)的各個組件:

[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高可用集羣的資源類型有那些?

 (A)、primitive,native 主資源,其僅能運行某一節點
 (B)、clone  克隆資源,一個資源可以運行於多個節點;
          應該指定:最大克隆的份數,每個節點最多可以運行的克隆。
 (C)、master/slave  主從資源,特殊的克隆資源。

(1)、由於提供的兩個節點的HA高可用集羣,只要有一個節點故障集羣都不能滿足法定票數,該HA集羣就不能工作了。所以,要設置當法定票數不滿足時,集羣還可以正常工作。如果不提供stonith,是不允許啓動corosync 的。所以,還需要關閉stonith

(A)、設置HA高可用集羣不滿足法定票數時的策略

crm(live)configure# no-quorum-policy=ignore

(B)、關閉stonith

crm(live)configure# property stonith-enabled= false

(2)、添加資源

(A)、配置流動IP資源

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共享文件系統的資源

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)、配置啓動數據庫服務的進程資源

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),限定提供數據庫服務的三個資源一定必須運行在同一個節點

crm(live)configure# colocation mysqlserver_with_nfsshare_with_myIP inf: mysqlserver nfsshare myIP

(B)、使用順序約束(order),指定提供數據庫服務的三個資源的先後啓動順序(關閉資源的順序是一個相反的過程,所以不會造成卸載NFS文件系統再關閉數據庫服務的情況)

crm(live)configure# order myIP_before_nfsshare_before_mysqlserver inf: myIP nfsshare mysqlserver

(C)、使用位置約束(location),限定資源傾向於運行在那個節點。

crm(live)configure# location myIP_on_node1 myIP  inf: node1.9527du.com

(4)、配置好後的處理

(A)、檢驗配置是否有錯誤

crm(live)configure# verify

(B)、沒有錯誤就提交

crm(live)configure# commit
crm(live)configure# cd ../

(C)、查看提供數據庫高可用集羣的運行狀態

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

[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共享文件系統

[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進程

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、遠程連接測試

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 下線

crm(live)# node standby node1.9527du.com

(2)、查看HA高可用集羣的運行狀況

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的資源情況

[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)、遠程連接數據庫

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)、執行刪除數據庫操作

mysql> drop database testdata;
Query OK, 0 rows affected (0.16 sec)

說明:

   在node2也可以操作數據庫。資源轉移到node2節點,一樣可以操作數據庫。

5、讓 node1上線,再測試

(1)、讓node1節點上線

crm(live)# node online  node1.9527du.com

(2)、查看HA高可用集羣的運行狀況

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 進程

[root@node1 ~]# date;service mysqld stop
Mon Sep 15 20:36:03 CST 2014
Shutting down MySQL.                                       [  OK  ]

2、查看自動啓動服務

[root@node1 ~]# date ;netstat -anptl | grep mysqld
Mon Sep 15 20:36:09 CST 2014

再查看

[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。。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章