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

方案:node

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

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

拓撲圖以下:sql

wKiom1Qr_BjCyRZJAAJqfTCEF1Y669.jpg

1、配置HA高可用集羣的各節點間可以基於主機名通信。數據庫

一、設置主機名vim

(1)、在 192.168.60.128 主機設置安全

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

[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

二、爲了,操做方便設置節點之間可以基於密鑰通信。也就是所謂的創建信任主機。

[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

三、節點之間基於主機名通信,要可以解析主機名才能夠。解析主機名有兩種方式:

(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

四、測試兩個節點可以實現基於密鑰的方式進行通信和可否基於主機名進行通信

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

說明:

   從上述能夠看出,兩個節點已經可以實現基於主機名的方式進行通信。


2、配置NFS服務器

一、提供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)


二、配置掛載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


3、分別在兩個節點安裝數據庫軟件:

    兩個節點使用的數據庫軟件的版本要求是一致的。由於,兩個節點的數據庫軟件使用的是同一份數據集。因爲不一樣版本的數據庫,它的元數據有差別。會形成沒法啓動數據庫服務的。

這裏兩個節點都使用二進制版本的MariaDB數據庫軟件。

mariadb-5.5.36-linux-x86_64.tar.gz

一、在 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


二、在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


4、配置 corosync 提供數據庫服務的高可用

一、提供HA高可用集羣的節點通訊的密鑰;

   節點間的心跳信息和集羣事務信息要加密傳輸的,不容許主機隨便加入HA高可用集羣的。

使用corosync提供的命令【corosync-keygen】生成該HA高可用集羣的認證密鑰。持有該解密的節點才屬於該HA高可用集羣的成員。

在node1節點生成密鑰,生成的密鑰是默認保存在/etc/corosync目錄中的

生成密鑰

[root@node1 corosync]# corosync-keygen

爲corosync提供配置文件

二、提供配置文件

[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

三、啓動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已經運行正常。   


四、啓動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!!!

5、配置HA高可用集羣的資源:

一、分析提供高可用數據庫服務須要哪些資源?

   (1)、IP 地址
   (2)、啓動數據庫服務的進程 mysqld
   (3)、掛載NFS共享的文件系統
        由於,使用NFS共享的文件系統存放數據庫的數據目錄的

二、由上述的3個資源一塊兒纔可以提供數據庫服務,因此在HA高可用集羣服務中,要對資源作一些約束。

   (1)、保證不管什麼時候,這三個資源都始終運行在同一個HA節點

        解決方案:

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

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

        緣由一、因爲使用NFS共享文件系統作爲數據庫的數據目錄,掛載nfs共享文件系統成功以後才能夠啓用數據庫服務進程。

緣由二、即便數據庫服務啓動成功,沒有IP地址。啓動成功數據庫服務也沒有用。

因此,在配置資源時,要對資源的啓動順序作一些限制。方案:

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

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

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

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


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

         

說明:

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

四、查看啓動的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

五、配置資源

通常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高可用集羣已經配置成功。


6、測試提供數據庫服務的HA高可用集羣是否成功?

測試節點的高可用,能夠理解爲是否可以提供節點的冗餘

一、檢查資源

(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

二、遠程鏈接測試

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)

說明:

    數據庫服務工做正常。


三、模擬節點故障測試服務是否能夠轉移

(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節點都工做正常。


四、訪問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節點,同樣能夠操做數據庫。

五、讓 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的資源代理監控該該資源故障了,通告資源管理器。資源管理器理是否會指揮資源代理從新啓動該資源。

一、中止 mysqld 進程

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

二、查看自動啓動服務

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

相關文章
相關標籤/搜索