OpenStack高可用 -- DRBD塊映象 + Pacemaker心跳機制實現Active/Passive模式的高可用mysql叢集 ( by quqi99 )

quqi99發表於2013-07-20


OpenStack高可用 --
DRBD塊映象 + Pacemaker心跳機制實現Active/Passive模式的高可用mysql叢集 ( by quqi99 )

作者:張華  發表於:2013-07-20
版權宣告:可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本版權宣告

http://blog.csdn.net/quqi99 )

        這個屬於HA(高可用)的範疇。

  對於高可用,一般得將應用區分為有狀態和無狀態:

1)對於無狀態的服務,如nova-api, nova-conductor, glance-api, keystone-api, neutron-api, nova-schduler,這個簡單了,因為無狀態,在多個計算節點多啟動幾個這樣的服務,然後前端在通過LB (such as HAProxy)加入VIP就行了。

2)對於有狀態的服務,像horizon, db, mq之類。根據情況可以有Active/Passive和Active/Active的模式。

  Active/Passive,一般作為standby的從節點的服務是不啟動的,使用DRBD在主從節點之間做映象然後再結合心跳heartbeat用pacemaker作切換。

     Active/Active, 可用Galera,可同時對主從節點進行讀寫,主從節點的資料一致性由Galera來非同步保證。

      DRBD (distribute replication block device,分散式複製塊裝置),經常用來代替共享磁碟。它的工作原理是:在A主機上有對指定磁碟裝置寫請求時,資料傳送給A主機的kernel,然後通過kernel中的一個模組,把相同的資料傳送給B主機的kernel中一份,然後B主機再寫入自己指定的磁碟裝置,從而實現兩主機資料的同步,也就實現了寫操作高可用。DRBD一般是一主一從,並且所有的讀寫操作,掛載只能在主節點伺服器上進行,但是主從DRBD伺服器之間是可以進行調換的。


    除了DRBD可以做塊映象保持同步外,mysql自身的Replication功能也是可以保持master/slave的資料庫之間的同步的。http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html

    Pacemaker支援任何冗餘配置,包括:Active/Active, Active/Passive,N+1, N+M, N-to-1 and N-to-N


            

VIP,  192.168.99.122
node1 192.168.99.100
node2 192.168.99.101

兩臺機器上分別配置無密碼訪問:
[hua@node1 ~]$ ssh-keygen -t rsa
[hua@node1 ~]$ ssh-copy-id -i .ssh/id_rsa.pub hua@node2

[hua@node2 ~]$ ssh-keygen -t rsa
[hua@node2 ~]$ ssh-copy-id -i .ssh/id_rsa.pub hua@node1



1 在主從兩臺機器上均安裝mysql, 確保就用預設支援事務的InnoDB引擎(mysql -uroot -e "show engines")
DATABASE_USER=root
DATABASE_PASSWORD=password
sudo yum install mysql
sudo cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
sudo service mysqld start

# Set the root password - only works the first time.
sudo mysqladmin -uroot password $DATABASE_PASSWORD || true
sudo mysql -uroot -p$DATABASE_PASSWORD -e "GRANT ALL PRIVILEGES ON *.* TO '$DATABASE_USER'@'%' identified by '$DATABASE_PASSWORD';"

2 在主從兩臺機器上均安裝DRBD
sudo yum install kernel-devel-`uname -r`
sudo yum install brdb8.3.11
sudo modprobe drbd
cat /etc/drbd.d/mysql.res

resource mysql_res {
  device /dev/drbd0;
  disk "/dev/loop0";
  meta-disk internal;
  on node1{
    address    192.168.99.100:7788;
  }
  on node2{
    address   192.168.99.101:7788;
  }
}
說明如下:
1)最好用一塊乾淨的分割槽做backing file, 如sdb,檢視分割槽:sudo fdisk -l /dev/sda
  這裡我們用檔案系統模擬一塊:
  dd if=/dev/zero of=/bak/images/myql_backing_file bs=10M count=10
   sudo losetup -f --show /bak/images/myql_backing_file
    /dev/loop0
2) meta-disk為internal意思是說將DRBD-specific metadata安裝backing file自己上面
3) /dev/drbd0是定義的DRBD裝置的名字
4) 在/etc/hosts檔案中寫義host, (hostname一個是node1, 一個是node2)
   192.168.99.100 node1
   192.168.99.101 node2
5) resource mysql_res, 一個drbd裝置即/dev/loop0也是一個資源
6) 防火牆開啟7788埠,或:sudo iptables -F


接著建立一個DRBD資源,它會初始化後設資料到backing file中,刪除資源用命令:sudo drbdadm detach all
sudo drbdadm create-md mysql_res
sudo drbdadm up mysql_res      #attach DRBD裝置到backing file上,兩個節點均要做
啟動master上的drbd服務,sudo service drbd restart,它會等從節點上的服務也啟動,那就再啟動從節點上的服務,ok
檢視狀態:
[hua@laptop ~]$ cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
srcversion: 736E684C7C139044D743D35
 0: cs:SyncSource ro:Secondary/Secondary ds:UpToDate/Inconsistent C r---n-
    ns:98692 nr:0 dw:0 dr:98940 al:0 bm:6 lo:0 pe:3 ua:3 ap:0 ep:1 wo:f oos:3800
    [===================>] sync'ed:100.0% (3800/102360)K
    finish: 0:00:01 speed: 2,788 (2,592) K/sec


主節點執行:sudo drbdadm -- --force primary mysql_res #只是master節點上設定它為primary(即可讀可寫) 
從節點執行:sudo drbdadm secondary mysql_res)


3, 使用DRBD裝置:
sudo mkfs -t xfs /dev/drbd0 (這個命令只能在master節點上做,因為只有master節點的角色是可讀可寫的)

對於已存在的mysql資料庫,資料目錄位於/var/lib/mysql,最簡單的就是將這個目錄移到DRBD裝置。確保關閉mysql的時候做下列步驟:
sudo mount /dev/drbd0 /var/lib/mysql
sudo mv /var/lib/mysql/* /var/lib/mysql
對於新建的mysql資料庫,因為無數以的,可以:
sudo mount /dev/drbd0 /var/lib/mysql
sudo mysql_install_db --datadir=/var/lib/mysql

隨便建一個測試檔案: sudo touch /var/lib/mysql/test.txt,

現在應該/var/lib/mysql/test.txt檔案已經複製到從節點上了。那麼想要掛載從主節只讀的DRBD裝置,我們現在它從節點升級成可讀可寫的主節點:
在現在的主節點上, 先sudo umount /var/lib/mysql, 然後降級:sudo drbdadm secondary mysql_res
然後在從節點上,升級成主節點:sudo drbdadm -- --force primary mysql_res, sudo mount /dev/drbd0 /var/lib/mysql,用 ll mnt命令檢視你會看到檔案已經複製過來了。 


4, ok, 上述的過程已經說明了,出現故障,就是要通過心跳機制將出故障的機器降級成主節點,然後將從節點升級成主節點而已。
  1)pacemaker可以呼叫hearbeat做心跳,它的底層使用了組通訊框架Corosync
  2) 兩臺機器均安裝:sudo yum install pacemaker corosync heartbeat -y
      生成相同的金鑰(所謂的相同是指在一臺機器上生成再拷到其他的機器)(/etc/corosync/authkey):sudo corosync-keygen
  3) 兩節點均要配置Corosync. 在此我們使用單播模式, 這樣可以減少網路廣播.
     sudo cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
cat /etc/corosync/corosync.conf
totem {
    version: 2
    secauth: off
    interface {
        member {
            memberaddr: 192.168.99.100
        }
        member {
            memberaddr: 192.168.99.101
        }
        ringnumber: 0
        bindnetaddr: 192.168.99.0
        mcastport: 5405
        ttl: 1
    }
    transport: udpu
}
service {
      name: pacemaker
      ver: 1
}
logging {
    fileline: off
    to_logfile: yes
    to_syslog: yes
    debug: on
    logfile: /var/log/cluster/corosync.log
    debug: off
    timestamp: on
    logger_subsys {
        subsys: AMF
        debug: off
    }
}

且要設定屬性no-quorum-policy, 因為quorum只有一半節點線上才算合法的,不設定無法模擬。下面的CLI命令相當於直接修改檔案/var/lib/heartbeat/crm/cib.xml
[hua@laptop ~]$ sudo crm
crm(live)# configure
crm(live)configure# property no-quorum-policy="ignore"
crm(live)configure# commit
   
    4) 分別在兩臺機器上檢視狀態,如果看到的不是兩個節點可檢查金鑰是否相同。
總結健康:
[hua@node2 ~]$ sudo corosync-cfgtool -s
Printing ring status.
Local node ID 1701030080
RING ID 0
    id    = 192.168.99.101
    status    = ring 0 active with no faults

dump成員:
[hua@node1 ~]$ sudo corosync-cmapctl |grep member |grep ip
runtime.totem.pg.mrp.srp.members.1684252864.ip (str) = r(0) ip(192.168.99.100)
runtime.totem.pg.mrp.srp.members.1701030080.ip (str) = r(0) ip(192.168.99.101)

檢視引擎是否啟動
[hua@node1 ~]$ sudo grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
Jul 20 09:54:14 laptop corosync[3373]:   [MAIN  ] Corosync Cluster Engine ('2.3.0'): started and ready to provide service.
Jul 20 09:54:15 laptop corosync[3367]: Starting Corosync Cluster Engine (corosync): [  OK  

檢視初始成員是否加入
[hua@node1 ~]$ grep TOTEM /var/log/messages
Jul 20 17:48:24 laptop corosync[15233]:   [TOTEM ] adding new UDPU member {192.168.99.101}
Jul 20 17:48:24 laptop corosync[15233]:   [TOTEM ] adding new UDPU member {192.168.99.100}

檢視是否有錯誤發生
[hua@node1 ~]$ sudo grep ERROR: /var/log/messages | grep -v unpack_resources

使用Crm status命令, 檢視兩個節點的資訊,看該服務是否已經同
[hua@node1 ~]$ sudo service pacemaker restart
Restarting pacemaker (via systemctl):                      [  OK  ]
[hua@laptop ~]$ sudo crm status
============
Last updated: Sat Jul 20 18:36:52 2013
Last change: Sat Jul 20 18:33:06 2013
Current DC: NONE
0 Nodes configured, unknown expected votes
0 Resources configured.
============

這裡一直有錯,不清楚是怎麼回事,導致實驗沒有做下去,但心裡清楚是怎麼一回事就行了。 


    5) 啟動pacemaker, sudo service pacemaker start
    6) 最後通過上面已提到過的crm confiugre命令來為mysql配置VIP等資訊:
primitive p_ip_mysql ocf:heartbeat:IPaddr2 params ip="192.168.99.122" cidr_netmask="24" op monitor interval="30s"
primitive p_drbd_mysql ocf:linbit:drbd params drbd_resource="mysql_res" op start timeout="90s" \
op stop timeout="180s" op promote timeout="180s" op demote timeout="180s" \
op monitor interval="30s" role="Slave" op monitor interval="29s" role="Master"

primitive p_fs_mysql ocf:heartbeat:Filesystem params device="/dev/loop0" directory="/var/lib/mysql" fstype="xfs" \
options="relatime" op start timeout="60s" op stop timeout="180s" op monitor interval="60s" timeout="60s"

primitive p_mysql ocf:heartbeat:mysql params additional_parameters="--bind-address=50.56.179.138"
config="/etc/my.cnf" pid="/var/run/mysqld/mysqld.pid" socket="/var/run/mysqld/mysqld.sock" \
log="/var/log/mysql/mysqld.log" op monitor interval="20s" timeout="10s" \
op start timeout="120s" op stop timeout="120s"

group g_mysql p_ip_mysql p_fs_mysql p_mysql
ms ms_drbd_mysql p_drbd_mysql meta notify="true" clone-max="2"

colocation c_mysql_on_drbd inf: g_mysql ms_drbd_mysql:Master
order o_drbd_before_mysql inf: ms_drbd_mysql:promote g_mysql:start

上面的方法只是Active/Passive模式的,如果要配Active/Active的mysql模式需要用到Galera,它的特點的能往每個Active的活動節點讀和寫,Galera自己的組通訊框架來保證資料的一致性,略。




Reference: Openstack-ha-guide-trunk.pdf








 

相關文章