通過 corosync/pacemaker實現高可用的MariaDB


目的:

     通過corosync v1 和pacemaker 提供高可用mariadb,在調度切換RS時,仍能數據庫訪問及操作不中斷。

     其中corosyncv1提供底層心跳及事務信息傳遞功能,pacemaker提供CRM、LRM


試驗環境流程:

     第一臺虛擬機提供nfs文件共享存儲;中間兩臺虛擬機配置相同mariadb服務,數據庫存儲位置爲第四臺虛擬機提供的nfs文件系統。對pacemaker的配置操作可以有多種形式,如CLI接口的crmsh和pcs,GUI的 hawk(webgui)和LCMC。其中crmsh功能強大,本次就採用crmsh。由於虛擬機安裝的是centos6,不帶crmsh,因此需手動安裝crmsh,crmsh的安裝依賴於pssh

        corosync.x86_64 0:1.4.7-1.el6

        pacemaker.x86_64 0:1.1.12-4.el6

        crmsh-2.1-1.6.x86_64.rpm        

        pssh-2.3.1-2.el6.x86_64.rpm

        mariadb-5.5.43-linux-x86_64.tar.gz(二進制程序包)


架構圖:

wKiom1VpvMvgJCw7AAE1AhOmiC8513.jpg




一、corosync/pacemaker 的安裝配置


1、配置HA集羣的準備工作:各節點都做如下工作,本次試驗是2節點


       時間同步、名稱訪問、ssh 互信、仲裁設備(本次不提供仲裁設備)


(1) 節點間時間必須同步:使用ntp協議實現;

      各節點

# crontab -e
*/3 * * * *  /usr/sbin/ntpdate 172.16.0.1 &> /dev/null


(2) 節點間需要通過主機名互相通信,必須解析主機至IP地址;

      (a) 建議名稱解析功能使用hosts文件來實現;

# vim /etc/hosts
127.0.0.1       localhost.localdomain   localhost.localdomain   localhost4      localhost4.localdomain4 localhost       
::1     localhost.localdomain   localhost.localdomain   localhost6      localhost6.localdomain6 localhost       
172.16.0.1  server.magelinux.com server
172.16.20.100   node1
172.16.20.200   node2

       (b) 通信中使用的名字與節點名字必須保持一致:“uname -n”命令,或“hostname”展示出的名字保持一致;


(3) 考慮仲裁設備是否會用到

        2節點必須得有,以防發生集羣分裂發生,超過2 的偶數幾點可以沒有。

        教室環境可以使用 ping node 172.16.0.1

        此次試驗不考慮仲裁設備。


(4) 建立各節點之間的root用戶能夠基於密鑰認證;

# ssh-keygen -t rsa -P '' 
# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
# ssh node1 'ifconfig'

wKiom1VpvQWSWY8mAADYGUP5eK0689.jpg

wKioL1VpvqDRXLIdAAIOr4qSBDI271.jpg


2、centos6自帶了corosync和pacemaker的安裝樹,可以查詢到並直接yum安裝


       各節點都安裝corosync和pacemaker:

# yum install -y corosync
……
Installed:
  corosync.x86_64 0:1.4.7-1.el6                                                                                            
Dependency Installed:
  corosynclib.x86_64 0:1.4.7-1.el6          libibverbs.x86_64 0:1.1.8-3.el6           librdmacm.x86_64 0:1.0.18.1-1.el6    
  lm_sensors-libs.x86_64 0:3.1.1-17.el6     net-snmp-libs.x86_64 1:5.5-49.el6_5.3    
Complete!

        wKiom1VpvXWhY_eiAAF-yHTn7j0581.jpg



      查看生成的文件:

# rpm -ql corosync
/etc/corosync
/etc/corosync/corosync.conf.example
/etc/corosync/corosync.conf.example.udpu
/etc/corosync/service.d
/etc/corosync/uidgid.d
/etc/dbus-1/system.d/corosync-signals.conf
/etc/rc.d/init.d/corosync
/etc/rc.d/init.d/corosync-notifyd
/etc/sysconfig/corosync-notifyd
/usr/bin/corosync-blackbox
/usr/libexec/lcrso
/usr/libexec/lcrso/coroparse.lcrso
……
/usr/libexec/lcrso/service_pload.lcrso
/usr/libexec/lcrso/vsf_quorum.lcrso
/usr/libexec/lcrso/vsf_ykd.lcrso
/usr/sbin/corosync
/usr/sbin/corosync-cfgtool
/usr/sbin/corosync-cpgtool
/usr/sbin/corosync-fplay
/usr/sbin/corosync-keygen
/usr/sbin/corosync-notifyd
/usr/sbin/corosync-objctl
/usr/sbin/corosync-pload
/usr/sbin/corosync-quorumtool
/usr/share/doc/corosync-1.4.7
……
/var/log/cluster
# yum install pacemaker -y
Installed:
  pacemaker.x86_64 0:1.1.12-4.el6                                                                                          
Dependency Installed:
  clusterlib.x86_64 0:3.0.12.1-68.el6           libqb.x86_64 0:0.16.0-2.el6           pacemaker-cli.x86_64 0:1.1.12-4.el6 
  pacemaker-cluster-libs.x86_64 0:1.1.12-4.el6  pacemaker-libs.x86_64 0:1.1.12-4.el6  perl-TimeDate.noarch 1:1.16-13.el6  
  resource-agents.x86_64 0:3.9.5-12.el6        
Complete!




       提供配置文件:

# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
# vim /etc/corosync/corosync.conf

wKioL1VpvzKzucoaAAN7zZ3zCRY697.jpg

wKiom1VpvbSxv9g4AAPEcYwvYEc346.jpg

wKioL1Vpv1CgyrTXAAH8IyRzkss699.jpg


        驗證網卡是否打開多播功能:

# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:10:05:bf brd ff:ff:ff:ff:ff:ff

        如果沒有需要使用如下命令打開:

# ip link set eth0 multicast on

        生成corosync的密鑰文件:

# corosync-keygen

        如果熵池中的隨機數不夠,可以通過從網絡上下載打文件或手動敲擊鍵盤生成。

wKioL1Vpv9yw-361AAGgMtzKCEg012.jpg


        將生成的密鑰文件和corosync配置文件保留所有屬性複製一份到node2節點,並確保屬性符合要求:

# scp -p /etc/corosync/{authkey,corosync.conf}  node2:/etc/corosync/
authkey                                                                                  100%  128     0.1KB/s   00:00    
corosync.conf                                                                            100% 2754     2.7KB/s   00:00 
[root@node2 ~]# ll /etc/corosync/
total 24
-r-------- 1 root root  128 May 30 11:56 authkey
-rw-r--r-- 1 root root 2754 May 30 11:48 corosync.conf
-rw-r--r-- 1 root root 2663 Oct 15  2014 corosync.conf.example
-rw-r--r-- 1 root root 1073 Oct 15  2014 corosync.conf.example.udpu
drwxr-xr-x 2 root root 4096 Oct 15  2014 service.d
drwxr-xr-x 2 root root 4096 Oct 15  2014 uidgid.d


        啓動兩個節點的corosync:

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

        驗證corosync引擎是否正常啓動:

[root@node1 corosync]# ss -unlp | grep corosync
UNCONN     0      0             172.16.20.100:5404                     *:*      users:(("corosync",3906,13))
UNCONN     0      0             172.16.20.100:5405                     *:*      users:(("corosync",3906,14))
UNCONN     0      0             239.254.11.11:5405                     *:*      users:(("corosync",3906,10))
[root@node1 corosync]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log 
May 30 12:08:44 corosync [MAIN  ] Corosync Cluster Engine ('1.4.7'): started and ready to provide service.
May 30 12:08:44 corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.


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

[root@node1 corosync]# grep TOTEM /var/log/cluster/corosync.log
May 30 12:08:44 corosync [TOTEM ] Initializing transport (UDP/IP Multicast).
May 30 12:08:44 corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
May 30 12:08:44 corosync [TOTEM ] The network interface [172.16.20.100] is now up.
May 30 12:08:44 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
May 30 12:08:46 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.


        檢查啓動過程中是否有錯誤產生,下面的錯誤信息表示pacemaker不久之後將不再作爲corosync的插件運行,因此,建議使用cman作爲集羣基礎架構服務,此處可安全忽略:

[root@node1 corosync]# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
May 30 12:23:17 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.
May 30 12:23:17 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
May 30 12:23:18 corosync [pcmk  ] ERROR: pcmk_wait_dispatch: Child process mgmtd exited (pid=4144, rc=100)


        查看pacemaker是否正常啓動:

[root@node1 corosync]# grep pcmk_startup /var/log/cluster/corosync.log
May 30 12:23:17 corosync [pcmk  ] info: pcmk_startup: CRM: Initialized
May 30 12:23:17 corosync [pcmk  ] Logging: Initialized pcmk_startup
May 30 12:23:17 corosync [pcmk  ] info: pcmk_startup: Maximum core file size is: 18446744073709551615
May 30 12:23:17 corosync [pcmk  ] info: pcmk_startup: Service: 9
May 30 12:23:17 corosync [pcmk  ] info: pcmk_startup: Local hostname: node1


      上面查看都正常就可以在node2上的也查看檢查狀況是否正常。


      安裝crmsh及其依賴的pssh包:

     從ftp://172.16.0.1下載程序包 :

crmsh-2.1-1.6.x86_64.rpm        pssh-2.3.1-2.el6.x86_64.rpm


      一般都只需要在一個節點上安裝crmsh即可,但爲了使用方便,可以在兩個節點上都安裝crmsh

# yum  install --nogpgcheck  -y crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm

      安裝完後可以查看節點信息並使用了:

# crm status
Last updated: Sat May 30 12:48:24 2015
Last change: Sat May 30 12:33:42 2015
Stack: classic openais (with plugin)
Current DC: node2 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
0 Resources configured
Online: [ node1 node2 ]


二、mariadb的配置使用


       mariadb要能使用高可用,爲了保證數據讀寫一致,就必須用到共享存儲。這裏選用nfs共享存儲方式。


       共享存儲時,需要將數據庫所在主機對遠程mysql程序所在主機開放讀寫訪問權限(以mysql:mysql 主:組);


        做節點訪問時需要用mysql用戶訪問出故障換節點訪問時,就需要右幾點在訪問時仍以mysql用戶訪問,這時兩個節點和共享存儲點的都得需要有mysql用戶,且id號都得相同;


        訪問的格式化時只需要在一個節點上初始化就可以,另一節點不需要再初始化了。


(一)準備nfs共享文件存儲系統


      可以只導出一個文件目錄,也可以創建一個新分區作爲導出存儲空間。

      在第三臺主機上創建一個新分區,掛載至 /data目錄下

[root@aunt-s ~]# fdisk /dev/sda
[root@aunt-s ~]#  partx -a /dev/sda
[root@aunt-s ~]#  pvcreate /dev/sda6
[root@aunt-s ~]#  vgcreate myvg /dev/sda6
[root@aunt-s ~]#  lvcreate -L 4G -n mydata myvg
[root@aunt-s ~]#  mke2fs -t ext4 /dev/myvg/mydata

        編輯/etc/fstab,添加一行,使新分區能開機自動掛載

[root@aunt-s ~]# vim /etc/fstab
/dev/myvg/mydata        /data                   ext4    defaults,noatime        0 0
[root@aunt-s ~]# mount -a
[root@aunt-s ~]# mount 
……
/dev/mapper/myvg-mydata on /data type ext4 (rw,noatime)
[root@aunt-s data]# mkdir /data/cldata


         編輯 /etc/exports ,添加如下行,輸出文件系統,因爲是共享存儲,所以需要能寫,且不擠壓root權限:

[root@aunt-s ~]# vim /etc/exports 
/data/cldata           172.16.0.0/16(rw,no_root_squash)


        遠程節點mysql訪問時,是以mysql用戶進行訪問的,所有需要將文件屬主數組改爲mysql,且與節點的mysql用戶的ID要一致:

[root@aunt-s ~]# groupadd -r -g 492 mysql
[root@aunt-s ~]# useradd -r -g 492 -u 492 mysql
[root@aunt-s ~]# id mysql
uid=492(mysql) gid=492(mysql) groups=492(mysql)
[root@aunt-s data]# chown -R mysql:mysql /data/cldata
[root@aunt-s data]# ll -d /data/cldata
drwxr-xr-x 2 mysql mysql 4096 May 30 15:56 /data/cldata
[root@aunt-s data]# exportfs -arv
exporting 172.16.0.0/16:/data/cldata


(二)節點配置mysql服務


1、 掛載遠程nfs

[root@node1 ~]# showmount -e 172.16.20.150
clnt_create: RPC: Program not registered

       解決辦法:在服務器上先停止rpcbind,然後在停止nfs

       最後在重啓rpcbind和nfs,一定要按順序啓動和停止

       做完這個動作之後,訪問成功

[root@node1 ~]# showmount -e 172.16.20.150
Export list for 172.16.20.150:
/data 172.16.0.0/16
[root@node1 ~]# mkdir /mydata ; ssh node2 'mkdir /mydata'
[root@node1 ~]# mount -t nfs 172.16.20.150:/data /mydata
[root@node1 ~]# mount
……
172.16.20.150:/data on /mydata type nfs (rw,vers=4,addr=172.16.20.150,clientaddr=172.16.20.100)


       創建mysql用戶並驗證是否對nfs共享存儲有寫權限

[root@node1 ~]# id mysql
id: mysql: No such user
[root@node1 ~]# groupadd -r -g 492 mysql
[root@node1 ~]# useradd -r -g 492 -u 492 mysql
[root@node1 ~]# su - mysql
su: warning: cannot change directory to /home/mysql: No such file or directory
-bash-4.1$ tree /mydata
/mydata
├── cldata
└── lost+found [error opening dir]
2 directories, 0 files
-bash-4.1$ cd /mydata/cldata/
-bash-4.1$ touch a.txt
-bash-4.1$ ls /mydata/cldata/
a.txt
-bash-4.1$ rm /mydata/cldata/a.txt
-bash-4.1$ exit
logout
[root@node1 ~]#


       在node2上也需要創建相同的mysql用戶,並掛載nfs共享目錄,然後驗證mysql用戶是否對其有寫權限。過程略。


2、 安裝mariadb並初始化

     主程序包: mariadb-5.5.43-linux-x86_64.tar.gz


     先將二進制程序包解壓縮:

[root@node1 ~]# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local
[root@node1 ~]# ln -sv mariadb-5.5.43-linux-x86_64/ mysql
`mysql' -> `mariadb-5.5.43-linux-x86_64/'
[root@node1 ~]# cd /usr/local/mysql/
[root@node1 mysql]# ls
bin      COPYING.LESSER  EXCEPTIONS-CLIENT  INSTALL-BINARY  man         README   share      support-files
COPYING  data            include            lib             mysql-test  scripts  sql-bench
[root@node1 mysql]# chown -R root:mysql ./*
[root@node1 mysql]# ll
total 220
drwxr-xr-x  2 root mysql   4096 May 30 16:45 bin
-rw-r--r--  1 root mysql  17987 Apr 30 02:55 COPYING
……
[root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/cldata/

       在第二節點上可以看到初始化已成功:

[root@node2 ~]# ls /mydata/cldata/
aria_log.00000001  aria_log_control  mysql  performance_schema  test

       創建完成後,nfs共享存儲就不需要管理員操作了,可以將nfs共享修改爲 root_squash:

[root@aunt-s data]# vim /etc/exports 
/data           172.16.0.0/16(rw,root_squash)
[root@aunt-s data]# exportfs -arv
exporting 172.16.0.0/16:/data


      設置好配置文件:

[root@node1 mysql]# ls
bin      COPYING.LESSER  EXCEPTIONS-CLIENT  INSTALL-BINARY  man         README   share      support-files
COPYING  data            include            lib             mysql-test  scripts  sql-bench
[root@node1 mysql]# cp support-files/
binary-configure        my-innodb-heavy-4G.cnf  my-small.cnf            mysql.server
magic                   my-large.cnf            mysqld_multi.server     SELinux/
my-huge.cnf             my-medium.cnf           mysql-log-rotate

 

       將樣本複製到    /etc下,並修改或添加下面四項:

[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf 
thread_concurrency = 2
datadir = /mydata/cldata
innodb_file_per_table = on
skip_name_resolve = on
[root@node1 mysql]# service mysqld start
Starting MySQL.                                            [FAILED]
[root@node1 mysql]# service mysqld status
MySQL is not running, but lock file (/var/lock/subsys/mysql[FAILED]

        如果出現這種情況,是原來的程序沒有處理乾淨,需要將鎖文件/var/lock/subsys/mysql刪除。如果還是不行,則需要刪除所有安裝文件及生成的庫文件後再啓動就可以了。

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


        驗證mysql能正常使用:

[root@node1 mysql]# /usr/local/mysql/bin/mysql
……
MariaDB [(none)]> CREATE DATABASE testclusterdb;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> quit
Bye
[root@node1 mysql]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]
[root@node1 mysql]# chkconfig mysqld off
[root@node1 mysql]# chkconfig  | grep mysqld
mysqld         0:off1:off2:off3:off4:off5:off6:off


       在node2主機上執行上述過程,但不需要執行初始化(# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/cldata/)


       mariadb服務安裝配置好,停止mysqld服務,並卸載nfs掛載:

[root@node2 ~]# umount /mydata ; ssh node1 'umount /mydata'


三 corosync/pacemaker與mariadb結合構建高可用存儲


       根據mariadb的高可用存儲特點,按如下順序定義:

         ① 三種資源定義:

              IP、mariadb服務程序、nfs共享存儲

         ② 排列約束定義

              這三者之間都是都是具有高粘性的,必須在同一節點上

         ③ 順序約束

              啓動順序爲 IP --> nfs掛載 --> mariadb服務

              關閉順序爲 mariadb --> nfs卸載 --> IP


1、定義兩個關鍵全局配置:

         stonith-enabled=false

         no-quorum-policy=ignore

[root@node1 ~]# crm
crm(live)# configure property no-quorum-policy=ignore
crm(live)configure# property stonith-enabled=false

2、定義資源

       注意:如果是在configure外定義,在定義完無錯誤時是自動commit的,只有在configure裏定義完後,可以做verify和手動commit。


(1)ip資源

[root@node1 ~]# crm
crm(live)configure# primitive mdbip ocf:heartbeat:IPaddr params ip=172.16.20.50 nic=eth0 cidr_netmask=16 op monitor interval=10s timeout=20s

(2)nfs掛載

[root@node1 ~]# crm
crm(live)# ra info ocf:heartbeat:Filesystem  (查看掛載文件系統需要配置的參數)
crm(live)# configure primitive mdbstore ocf:heartbeat:Filesystem params device="172.16.20.150:/data" directory="/mydata/" fstype=nfs op monitor interval=10s timeout=40s op start timeout=60s op stop timeout=60

(3)mariadb服務資源

[root@node1 ~]# crm
crm(live)configure# primitive maria lsb:mysqld op monitor interval=10s timeout=20s
crm(live)configure# show
node node1 \
attributes standby=off
node node2
primitive maria lsb:mysqld \
op monitor interval=10s timeout=20s
primitive mdbip IPaddr \
params ip=172.16.20.50 nic=eth0 cidr_netmask=16 \
op monitor interval=10s timeout=20s
primitive mdbstore Filesystem \
params device="172.16.20.150:/data" directory="/mydata/" fstype=nfs \
op monitor interval=10s timeout=40s \
op start timeout=60s interval=0 \
op stop timeout=60 interval=0
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false \
no-quorum-policy=ignore \
last-lrm-refresh=1432984183
crm(live)configure#

3、定義排列約束

        將資源綁定在一個節點上運行有多種方法,一是將資源定義到一個group裏,二是定義colocation。這裏用group方法

[root@node1 ~]# crm
crm(live)configure#  group mdbservice mdbip mdbstore maria
crm(live)configure# show
node node1 \
attributes standby=off
node node2
primitive maria lsb:mysqld \
op monitor interval=10s timeout=20s
primitive mdbip IPaddr \
params ip=172.16.20.50 nic=eth0 cidr_netmask=16 \
op monitor interval=10s timeout=20s
primitive mdbstore Filesystem \
params device="172.16.20.150:/data" directory="/mydata/" fstype=nfs \
op monitor interval=10s timeout=40s \
op start timeout=60s interval=0 \
op stop timeout=60 interval=0
group mdbservice mdbip mdbstore maria
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false \
no-quorum-policy=ignore \
last-lrm-refresh=1432984183

        此時,就定義完了mariadb的高可用集羣了,可以通過網頁進行測試


4、測試高可用


(1)查看幾點信息

        在node1節點可以看到,三個資源都已經啓動,且運行在同一個節點上(node2):

[root@node1 ~]# crm
crm(live)# status
Last updated: Sat May 30 19:59:49 2015
Last change: Sat May 30 19:59:32 2015
Stack: classic openais (with plugin)
Current DC: node1 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
3 Resources configured
Online: [ node1 node2 ]
 Resource Group: mdbservice
     mdbip(ocf::heartbeat:IPaddr):Started node2 
     mdbstore(ocf::heartbeat:Filesystem):Started node2 
     maria(lsb:mysqld):Started node2 
crm(live)#


(2)遠程第三方主機測試:

     用主機172.16.20.96 [root@hot-d ~] 進行遠程登錄操作測試:


    在mysql中授權能遠程登錄並退出:

[root@node2 ~]# mysql
mysql> GRANT ALL ON *.* to tom@'172.16.20.96' IDENTIFIED BY '123';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> \q
Bye
[root@node2 ~]#


      在新主機hot-d上登錄mysql,並做資源轉移測試:


wKiom1Vpv4-wTFxJAAZdaAopqKc691.jpg

wKioL1VpwSuRceN7AAFH0vQIYd4321.jpg

wKiom1Vpv5zC_8W8AAGbwTOrvEY754.jpg


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