crosync + pacemaker + (NFS,DRBD,iSCSI)實現MySQL的高可用

HA部署方案:

  • hb v1 + haresourecenode

  • hb v2 + crm mysql

  • hb v3 + pacemaker + cluster-gluelinux

  • corosync + pacemaker + cluster-gluesql

  • cman + rgmanger數據庫

  • keepalived + scriptbootstrap

下面講述是利用corosync + pacemaker部署高可用集羣。vim

corosync相關知識

corosync早期是OpenAIS的組成部分,OpenAIS定義如何實現 Messaging Layer。08年corsync被獨立出來。08之前紅帽本身藉助於OpenAIS自主實現的cman,實現了投票機制。crosync2.0以前沒有投票系統,2.0之後實現了原生態投票系統。安全

corosync識別節點是經過authkey來實現的,不一樣於heartbeat v1 v2,corosync的authkey是經過corosync-keygen命令生成的,具備更高的安全性。bash

1、corosync + pacemaker搭建高可用集羣

環境說明:

高可用節點(使用2個節點):
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3
vip地址:172.16.10.200

前提條件:

一、全部節點的主機名稱和對應的IP地址解析服務能夠正常工做,且每一個節點的主機名稱須要跟
   "uname -n「命令的結果保持一致;
所以,須要保證兩個節點上的/etc/hosts文件均爲下面的內容:(由ansible提供)
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3

爲了使得從新啓動系統後仍能保持如上的主機名稱,還分別須要在各節點執行相似以下的命令:

Node2:
# sed -i 's@\(HOSTNAME=\).*@\1node2.example.com@g'  /etc/sysconfig/network
# hostname node2.example.com
Node3:
# sed -i 's@\(HOSTNAME=\).*@\1node3.example.com@g' /etc/sysconfig/network
# hostname node3.example.com

二、設置高可用節點之間的的時間同步
可使用時間同步服務器

三、集羣節點之間能夠ssh互信通訊


2 

安裝 corosync + pacemaker:

# 使用 ansible Role 完成 crosync + pacemaker 的安裝和配置
# 下面是 Role 的目錄樹
# /root/corosync
|-- ha.yml
|-- roles
|   |-- common
|   |   |-- default
|   |   |-- files
|   |   |   `-- hosts
|   |   |-- handlers
|   |   |-- meta
|   |   |-- tasks
|   |   |   `-- main.yml
|   |   |-- templates
|   |   `-- vars
|   |-- crmsh
|   |   |-- files
|   |   |   |-- crmsh-1.2.6-4.el6.x86_64.rpm
|   |   |   `-- pssh-2.3.1-2.el6.x86_64.rpm
|   |   `-- tasks
|   |       `-- main.yml
|   `-- ha
|       |-- default
|       |-- files
|       |   |-- authkey
|       |   `-- corosync.conf
|       |-- handlers
|       |   `-- main.yml
|       |-- meta
|       |-- tasks
|       |   `-- main.yml
|       |-- templates
|       `-- vars
`-- site.yml

下面是各個文件的內容:服務器

當前所在的目錄是: /root/corosync 如下出現是相對路徑
# cat ha.yml 是在最終執行的Playbokks 
- name: install and config corosync
  remote_user: root
  hosts: hbhosts
  roles:
  - common
  - ha
  - crmsh

# 這是一個空文件,是ansible格式要求 cat site.yml 

# comman角色的任務,實現時間同步,提供hosts文件
# cat roles/common/tasks/main.yml 
- name: hosts file
  copy: src=hosts dest=/etc/hosts
- name: sync time
  cron: name="sync time" minute="*/3" job="/usr/sbin/ntpdate 172.16.0.1 &> /dev/null"

# cat roles/common/files/hosts    
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3

# 這是提供 pacemaker 配置接口的軟件的安裝 crmsh pssh
# cat roles/crmsh/tasks/main.yml 
- name: copy pssh and crmsh
  copy: src={{ item }} dest=/tmp/
  with_items:
  - pssh-2.3.1-2.el6.x86_64.rpm
  - crmsh-1.2.6-4.el6.x86_64.rpm
- name: install pssh and crmsh
  yum: name={{ item }} state=present
  with_items:
  - /tmp/pssh-2.3.1-2.el6.x86_64.rpm
  - /tmp/crmsh-1.2.6-4.el6.x86_64.rpm
# 軟件列表信息 
# ll roles/crmsh/files/         
total 536
-rw-r--r-- 1 root root 495332 Sep 15  2013 crmsh-1.2.6-4.el6.x86_64.rpm
-rw-r--r-- 1 root root  49960 Sep 15  2013 pssh-2.3.1-2.el6.x86_64.rpm

# 安裝和配置 corosync ll roles/ha/tasks/main.yml 
-rw-r--r-- 1 root root 472 Sep 20 16:50 roles/ha/tasks/main.yml
[root@node1 corosync]# cat roles/ha/tasks/main.yml 
- name: installed corosync and pacemaker
  yum: name={{ item }} state=present
  with_items:
    - corosync
    - pacemaker
  tags: inst
- name: auth key file
  copy: src=authkey dest=/etc/corosync/authkey owner=root group=root mode=0400
  tags: authkey
- name: configration file
  copy: src=corosync.conf dest=/etc/corosync/corosync.conf
  tags: conf
  notify: 
    - restart corosync
- name: start corosync
  service: name=corosync state=started enabled=no
  tags: start
[root@node1 corosync]# cat roles/ha/handlers/main.yml 
- name: restart corosync
  service: name=corosync state=restarted

# corosync的配置文件 cat roles/ha/files/corosync.conf 
# Please read the corosync.conf.5 manual page
compatibility: whitetank

totem {
	version: 2
	secauth: on
	threads: 0
	interface {
		ringnumber: 0
		bindnetaddr: 172.16.0.0
		mcastaddr: 228.10.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
	}
}

amf {
	mode: disabled
}

service {
	ver: 0
	name: pacemaker
}
aisexec {
	user: root 
	group: root
}

# corosync認證文件 ll roles/ha/files/authkey       
-r-------- 1 root root 128 Sep 20 16:04 roles/ha/files/authkey

執行 ansible-playbokks ha.yml,就可完成以上的配置。

3

2、corosync + pacemaker + NFS 實現MariaDB的高可用

一、在node2和node3上安裝MariaDB

# 這裏使用通用二進制包安裝
# 數據目錄: /mydata/data

#### 在Node2 Node3上:
# 添加用戶
groupadd -r mysql
useradd -r -g mysql mysql

# 二進制格式安裝mariadb
tar xf mariadb-10.0.13-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ln -sv mariadb-10.0.13-linux-x86_64 mysql
`mysql' -> `mariadb-10.0.13-linux-x86_64'
cd mysql
cp support-files/my-large.cnf /etc/my.cnf

# 修改 vim /etc/my.cnf
# 在mysqld下添加 datadir=/mydata/data

# 提供服務腳本
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld

二、提供nfs共享服務

nfs服務端:172.16.10.11

yum install nfs-utils
/mysqldata 172.16.0.0/16(rw,no_root_squash)
mkdir /mysqldata
setfacl -m u:493:rwx /mysqldata/ # 493是mysql用戶的UID

在Node2:

4

完成以上任務就能夠初始化數據庫了,以下圖:

6

初始化完成,就能夠登陸數據庫了,並受權:

說明:此處受權的的用戶不正確,應該是root@’172.16.%.%’

7

配置完成,在Node2上,驗證:

8

完成後,繼續:

在Node2和Node3上確保:

mysqld 是關閉狀態;
mysqld 開機不能啓動;
卸載 nfs 文件系統。

三、配置corosync的資源,實現高可用

# 如下是定義的資源和資源約束
crm(live)# configure show 
node node2.example.com
node node3.example.com
primitive mysql-storge ocf:heartbeat:Filesystem \
	params device="172.16.10.11:/mysqldata" directory="/mydata/" fstype="nfs" \
	op start timeout="60s" interval="0" \
	op stop timeout="60s" interval="0"
primitive mysqlservice lsb:mysqld
primitive vip ocf:heartbeat:IPaddr \
	params ip="172.16.10.200"
group mysql vip mysql-storge mysqlservice
order fist_vip_storge_service_end Mandatory: vip mysql-storge mysqlservice
property $id="cib-bootstrap-options" \
	dc-version="1.1.10-14.el6-368c726" \
	cluster-infrastructure="classic openais (with plugin)" \
	expected-quorum-votes="2" \
	stonith-enabled="0" \
	no-quorum-policy="ignore"

驗證:

9

遠程鏈接:

因爲受權的問題,在這裏須要從新受權,遠程端才能夠登陸。

10

遠程登陸訪問:

11

此時,若是有一個節點,出現故障?

12

遠端是否能夠正常訪問?

13

 

3、corosync + pacemaker + DRBD 實現MariaDB的高可用

一、corosync的配置如上

二、配置DRBD

具體詳細配置可參考:http://guoting.blog.51cto.com/8886857/1553462

一、準備好共享磁盤
這裏使用的是 /dev/sda5。Node2 和 Node3上都是。

二、安裝軟件
rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm 

三、配置文件
Node2:
1) 配置/etc/drbd.d/global-common.conf
global {
        usage-count no; # 是否爲drbd官方收集數據
        # minor-count dialog-refresh disable-ip-verification
}
# common是各個資源共用的選項
common {
        protocol C; # 複製協議
 
        handlers {
                pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; 
                /usr/lib/drbd/notify-emergency-reboot.sh;
                echo b > /proc/sysrq-trigger ; reboot -f";
                pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; 
                /usr/lib/drbd/notify-emergency-reboot.sh;
                echo b > /proc/sysrq-trigger ; reboot -f";
                local-io-error "/usr/lib/drbd/notify-io-error.sh; 
                /usr/lib/drbd/notify-emergency-shutdown.sh;
                echo o > /proc/sysrq-trigger ; halt -f";
                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
  # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }
 
        startup {
                #wfc-timeout 120;
                #degr-wfc-timeout 120;
        }
 
        disk {
                on-io-error detach; # 發生i/o錯誤的處理方法,detach將鏡像磁盤直接拔除
                #fencing resource-only;
        }
 
        net {
                cram-hmac-alg "sha1";
                shared-secret "mydrbdlab";
        }
 
        syncer {
                rate 1000M;
        }
}
 
2) 定義一個資源/etc/drbd.d/mysql.res,內容以下:
resource mysql {
  on node2.example.com {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.10.22:7789;
    meta-disk internal;
  }
  on node3.example.com {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.10.33:7789;
    meta-disk internal;
  }
}
3) scp /etc/drbd.d/*  node3.example.com:/etc/drbd.d
##############################################################################

在兩個節點上初始化已定義的資源並啓動服務
1)初始化資源,在 Node2 和 Node3 上分別執行:
drbdadm create-md test

2)啓動服務,在 Node3 和 Node2 上分別執行:
/etc/init.d/drbd start

3)drbdadm primary --force mysql
#############################################################################
完成上面的步驟後,就可使用 /dev/drbd0 設備了,能夠正常的分區掛載使用。

三、初始化mysql,並受權

14

16

此時,Node2應降級爲從節點(drbdadm secondary mysql)。Node3升級爲主節點(drbdadm primary mysql),測試:

17

18

19

完成後,繼續:

在Node2和Node3上確保:

mysqld 是關閉狀態;
mysqld 開機不能啓動;
卸載 drbd 文件系統;
確保 drbd 服務關閉;
確保 drbd 開機不能啓動;
保證drbd都爲從節點。

四、配置corosync的資源,實現高可用

crm(live)configure# show 
node node2.example.com
node node3.example.com
primitive myip ocf:heartbeat:IPaddr \
        params ip="172.16.10.200"
primitive mysql_drbd ocf:linbit:drbd \
        params drbd_resource="mysql" \
        op monitor role="Master" interval="10s" timeout="60s" \
        op monitor role="Slave" interval="20s" timeout="60s" \
        op start timeout="240s" interval="0" \
        op stop timeout="100s" interval="0"
primitive mysql_service lsb:mysqld \
        op monitor interval="20s" timeout="30s"
primitive mysql_storage ocf:heartbeat:Filesystem \
        params device="/dev/drbd0" directory="/mydata" fstype="ext4" \
        op start timeout="60s" interval="0" \
        op stop timeout="60s" interval="0"
group mysqld myip mysql_storage mysql_service
ms ms_mysql_drbd mysql_drbd \
        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" \
        notify="True"
colocation mysql_storage-with-ms_mysql_drbd_master \
     inf: mysql_storage ms_mysql_drbd:Master
colocation mysql_storage-with-mysql_service inf: mysql_service mysql_storage
order fist_ip_storage_service_end Mandatory: myip mysql_storage mysql_service
order mysql_storage-after-ms_mysql_drbd_master \
     Mandatory: ms_mysql_drbd:promote mysql_storage:start
property $id="cib-bootstrap-options" \
        dc-version="1.1.10-14.el6_5.3-368c726" \
        cluster-infrastructure="classic openais (with plugin)" \
        expected-quorum-votes="2" \
        stonith-enabled="0" \
        no-quorum-policy="ignore" \
        last-lrm-refresh="1411213570"

資源和資源之間的約束以下圖:

20

驗證:

21

22

此時,若是有一個節點,出現故障?

23

24

4、corosync + pacemaker + iSCSI 實現MariaDB的高可用

一、corosync的配置如上

二、配置iSCSI 服務端

具體詳細配置可參考:http://guoting.blog.51cto.com/8886857/1556487
# 192.168.1.11做爲 iSCSI服務器端:

yum -y install scsi-target-utils

# 修改配置文件/etc/tgt/targets.conf 
<target iqn.2014-09.com.example:mysql.ha>
    backing-store /dev/sda5
    initiator-address 172.16.0.0/16
</target>

# 啓動服務
service tgtd start
chkconfig tgtd on

25

完成以上以後,iscsi服務端配置完成。

三、配置iSCSI 客戶端

# 在Node2 Node3上:
yum install iscsi-initiator-utils # 客戶端管理工具 

# 如下配置是非必需的,默認狀況下,會有一個默認的iqn名稱
echo "InitiatorName=`iscsi-iname -p iqn.2014-09.com.example`" \
  > /etc/iscsi/initiatorname.iscsi
echo "InitiatorAlias=ha" >> /etc/iscsi/initiatorname.iscsi 

service iscsi start
chkconfig iscsi on 

iscsiadm -m discovery -t sendtargets -p 172.16.10.11
iscsiadm -m node -T iqn.2014-09.com.example:mysql.ha -p 172.16.10.11 -l

完成以上任務後,本地會多出一塊向本地磁盤的設備。

26

能夠對這塊磁盤分區,格式化,掛載使用。

27

28

在Node3測試:

29

完成後,繼續:

在Node2和Node3上確保:

mysqld 是關閉狀態;
mysqld 開機不能啓動;
卸載文件系統;
保證drbd都爲從節點。

四、配置corosync的資源,實現高可用

crm(live)configure# show 
node node2.example.com
node node3.example.com
primitive mysql-storge ocf:heartbeat:Filesystem \
	params device="/dev/sdb1" directory="/mydata/" fstype="ext4" \
	op start timeout="60s" interval="0" \
	op stop timeout="60s" interval="0"
primitive mysqlservice lsb:mysqld
primitive vip ocf:heartbeat:IPaddr \
	params ip="172.16.10.200"
group mysql vip mysql-storge mysqlservice
order first_vip_storge_service_end Mandatory: vip mysql-storge mysqlservice
property $id="cib-bootstrap-options" \
	dc-version="1.1.10-14.el6_5.3-368c726" \
	cluster-infrastructure="classic openais (with plugin)" \
	expected-quorum-votes="2" \
	stonith-enabled="0" \
	no-quorum-policy="ignore" \
	last-lrm-refresh="1411224183"

驗證:

30

31 

此時,若是有一個節點,出現故障?

32

33

 

到此,配置所有完成。

相關文章
相關標籤/搜索