基于Corosync + Pacemaker+DRBD實現MySQL高可用集群

前言

在眾多的高可用集群解決方案中,除了Heartbeat之外,Corosync也能提供類似于Heartbeat一樣的功能,而且目前RedHat官方提供的高可用集群解決方案的程序包都以Corosync為主,所以今后Corosync會逐漸取代Heartbeat。本文帶來的是基于Corosync + Pacemaker+DRBD的MySQL高可用集群解決方案。

相關介紹

Corosync

Corosync是從OpenAIS中分支出來的一個項目,它在傳遞信息的時候可以通過一個簡單的配置文件來定義信息傳遞的方式和協議等。Corosync識別節點是通過authkey來實現的,不同于heartbeat v1 v2,Corosync的authkey是通過corosync-keygen命令生成的,具有更高的安全性。

Corosync目前有兩個主流的版本:v1和v2,兩個版本差別較大,v1沒有有投票功能,需要借助cman實現,v2支持投票功能。

Pacemaker

Pacemaker是從heartbeat v3版本中分裂出來專門用于管理高可用集群的組件,功能十分強大。它利用集群基礎構件(OpenAIS 或heartbeat)提供的消息和成員管理能力來探測并從節點或資源級別的故障中恢復,以實現群集服務(亦稱資源)的最大可用性。

DRBD

DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群。其實現方式是通過網絡來鏡像整個設備。可以把它看作是一種網絡RAID。

DRBD負責接收數據,把數據寫到本地磁盤,然后發送給另一個主機,另一個主機再將數據存到自己的磁盤中。

下面是DRBD的系統結構圖

drbd.jpg

高可用解決方案

實驗拓撲

基于Corosync + Pacemaker+DRBD實現MySQL高可用集群.jpg

實驗環境

node1:172.16.10.123 MariaDB DRBD CentOS6.6

node2:172.16.10.124 MariaDB DRBD CentOS6.6

VIP:192.168.1.121

配置過程

配置HA的前提:

時間同步、基于主機名互相通信、SSH互信

請確保兩個節點時間同步,可用ntpdate向時間服務器同步

[root@node1 ~]# ntpdate cn.pool.ntp.org

基于主機名互相通信

[root@node1 ~]# vim /etc/hosts
 
172.16.10.123   node1.scholar.com node1
172.16.10.124   node2.scholar.com node2
 
[root@node1 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
 
[root@node1 ~]# uname -n
node1.scholar.com
 
#兩個節點都需如上操作

SSH互信

[root@node1 ~]# ssh-keygen -t rsa -P ''
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
[root@node2 ~]# ssh-keygen -t rsa -P ''
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
[root@node1 ~]# date; ssh node2 'date' #測試
Wed Jun 10 16:27:47 CST 2015
Wed Jun 10 16:27:47 CST 2015

安裝所需程序包

#安裝corosync + pacemaker,pacemaker依賴于corosync,會一并安裝
[root@node1 ~]# yum install pacemaker -y 
#安裝pacemaker配置接口,crmsh依賴于pssh,單獨安裝需解決依賴關系,需suse官方源
[root@node1 ~]# yum install crmsh  -y
#安裝drbd
[root@node1 ~]# yum install gcc gcc-c++ glibc flex kernel-devel kernel-headers -y
[root@node1 ~]# tar xf drbd-8.4.3.tar.gz 
[root@node1 ~]# cd drbd-8.4.3
[root@node1 drbd-8.4.3]# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-km
[root@node1 drbd-8.4.3]# make && make install
[root@node1 drbd-8.4.3]# modprobe drbd

#兩個節點都執行以上操作

Corosync配置

修改配置文件

[root@node1 ~]# cd /etc/corosync/
[root@node1 corosync]# mv corosync.conf.example corosync.conf
[root@node1 corosync]# vim 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: 226.94.1.1     #多播地址
        mcastport: 5405           #多播的端口
        ttl: 1                    #生存周期
    }
}
logging {                         #日志
    fileline: off
    to_stderr: no                 #是否輸出在屏幕上
    to_logfile: yes               #定義自己的日志
    to_syslog: no                 #是否由syslog記錄日志
    logfile: /var/log/cluster/corosync.log  #日志文件的存放路徑
    debug: off
    timestamp: on                 #是否開啟時間戳
    logger_subsys {
        subsys: AMF
        debug: off
    }
}
amf {
    mode: disabled
}
service {
     ver: 0
     name: pacemaker   #pacemaker作為corosync的插件進行工作
}
aisexec {
     user: root
     group: root
}

生成認證文件

[root@node1 corosync]# corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Press keys on your keyboard to generate entropy (bits = 736).
########此時拼命敲鍵盤產生隨機數###########

將配置文件及認證文件同步給另一個節點

0.jpg

安裝mysql

1.jpg

[root@node1 ~]# vim /etc/mysql/my.cnf 

datadir = /mydata/data
log-bin=/mydata/binlogs/

#兩個節點都執行以上操作

DRBD配置

準備DRBD分區

[root@node1 ~]# fdisk sdb
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +10G

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@node1 ~]# partx -a /dev/sdb

#另一個節點也執行此操作

修改配置文件

[root@node1 ~]# vim /etc/drbd.d/global_common.conf

global {
        usage-count no;
        # minor-count dialog-refresh disable-ip-verification
}

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;
                #fencing resource-only;
        }

        net {
                cram-hmac-alg "sha1";
                shared-secret "mydrbdlab";
        }

        syncer {
                rate 1000M;
        }
}

[root@node1 ~]# vim /etc/drbd.d/mydata.res
#定義一個資源/etc/drbd.d/mydata.res,內容如下
resource mydata {
  on node1 {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   172.16.10.123:7789;
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   172.16.10.124:7789;
    meta-disk internal;
  }
}

將配置文件同步給另一個節點

2.jpg

初始化資源并啟動服務

[root@node1 ~]# drbdadm create-md mydata
[root@node1 ~]# service drbd start

#兩個節點都要執行以上操作

同步資源

3.jpg

#以上操作只在一個節點進行

格式化DRBD分區

4.jpg

#以上操作只在一個節點執行

掛載DRBD分區初始化數據庫

5.jpg

[root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydat
a/data/  --basedir=/usr/local/mysql

#初始化操作只執行一次即可

測試數據是否同步

6.jpg

在另一個節點上測試

7.jpg

8.jpg

數據同步成功,接下來關閉所有服務

9.jpg

#另一個節點也關閉服務,確保開機不會自啟

配置corosync資源,實現高可用

定義DRBD資源

10.jpg

定義DRBD主從資源

11.jpg

定義mysql所需資源

12..jpg

定義組及各資源約束關系

13..jpg

查看所有資源信息

crm(live)configure# show

node node1.scholar.com
node node2.scholar.com
primitive mydrbd ocf:linbit:drbd \
        params drbd_resource=mydata \
        op monitor role=Master interval=10s timeout=20s \
        op monitor role=Slave interval=20s timeout=20s \
        op start timeout=240s interval=0 \
        op stop timeout=100s interval=0
primitive myfs Filesystem \
        params device="/dev/drbd0" directory="/mydata" fstype=ext4 \
        op monitor interval=20s timeout=60s \
        op start timeout=60s interval=0 \
        op stop timeout=60s interval=0
primitive myserver lsb:mysqld \
        op monitor interval=30s timeout=20s
primitive myvip IPaddr \
        params ip=192.168.1.121 \
        op monitor interval=30s timeout=20s
group myservice myvip myfs myserver
ms ms_mydrbd mydrbd \
        meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
colocation myfs_with_ms_mydrbd_master inf: myfs ms_mydrbd:Master
colocation myserver_with_myfs inf: myserver myfs
order myfs_after_ms_mydrbd_master Mandatory: ms_mydrbd:promote myfs:start
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=1434014581

查看集群運行狀態

14.jpg

授權一個遠程用戶做測試

15.jpg

在其他主機登陸測試

16.jpg

此時模擬主節點故障

17.jpg

此時,資源被轉移到了node2上,繼續用遠程主機登陸測試

18.jpg

數據沒有受到任何影響,高可用目的實現,至此,基于Corosync + Pacemaker+DRBD的MySQL高可用集群實驗完成

The end

本次實驗就進行到這里了,實驗過程出現了一個奇葩問題,至今不知何故,朋友們如果配置過程中遇到問題歡迎留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~

原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/5261

(0)
書生書生
上一篇 2015-06-11
下一篇 2015-06-12

相關推薦

  • 一起學DHCP系列(四)安裝、配置

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/162580       本節將主要講述DHCP的安裝和配置。     …

    Linux干貨 2015-03-25
  • Linux實驗-搭建路由環境

    Linux實驗-搭建路由環境 背景: 在學習網絡基礎過程中,為了加強理解路由功能,準備用Linux模擬一個路由環境。同時也試試Linux的路由轉發功能。 實驗簡介: 準備5個虛擬機,其中三個做路由,兩個做客戶機,相連的設備之間在同一個網段,三個路由設備在中間,兩個客戶機在兩側,最后實現兩個虛擬機能相互通信。 實驗規劃: 這里配的IP都是隨意配的,保證相連設備…

    2017-08-19
  • 軟件包管理 — rpm & yum

    軟件包管理 包管理器     二進制應用程序的組成部分:         二進制文件、庫文件、配置文件、幫助文件     程序包管理器:      &…

    Linux干貨 2016-08-24
  • Linux中的權限修改指令及正則表達式

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶均沒有任何訪問權限 [root@centos6 ~]# cp -r /etc/skel/ /home/tuser1 [root@centos6 ~]# ls -la&…

    Linux干貨 2016-10-24
  • Mysql cmake 編譯安裝、

    基于cmake的mysql安裝 1.1 前言 從mysql5.5起,mysql源碼安裝的編譯工具configure開始向cmake過渡。安裝方式和之前的略有不同。在這里簡單介紹總結下。 安裝之前,檢查下GNU make, GCC, Perl, libncurses5-dev,cmake-2.8.4是否都已經安裝,如果沒有安裝,用yum install 安裝補…

    Linux干貨 2017-08-29
  • 編譯安裝httpd

    編譯安裝httpd   1 去官網下載源碼包                                      為避免非法軟件,一定要去官網下載http…

    2017-04-24
欧美性久久久久