天天看點

基于NFS和corosync實作mysql高可用

實驗基于redhat 5.8,nfs為系統自帶,corosync-1.2.7-1.1.el5.i386.rpm 。mysql-5.5.25a.tar.gz。實驗拓撲圖:

<a href="http://blog.51cto.com/attachment/201208/140436415.jpg" target="_blank"></a>

NFS共享目錄給兩台mysql,也就是圖中的node1,node2,這個目錄在同一時刻隻能是其中一台挂載。node1,node2的資料存儲在NFS提供的共享目錄中。這樣做的目的是當其中一個節點壞了,而另外一個節點能夠替代他,并繼續提供服務。當然此次實作沒有對NFS做高可用,如果在生産環境中,NFS也要做高可用。vip是也就提供服務的虛拟IP,在node1,node2隻能同時配置在其中一台伺服器上。

一,先配置好NFS, 建立一個lvm的分區來存儲msqyl 資料,對三台虛拟的時間調整到相同狀态。

(1)對nfs伺服器先配置好:

[root@server30 ~]# partprobe /dev/sda 

[root@server30 ~]# pvcreate  /dev/sda5 

  Writing physical volume data to disk "/dev/sda5" 

  Physical volume "/dev/sda5" successfully created 

[root@server30 ~]# vgcreate  myvg /dev/sda5 

  Volume group "myvg" successfully created 

[root@server30 ~]# lvcreate -L 5G -n mydata myvg 

[root@server30 ~]# mke2fs -j -L MYDATA /dev/myvg/mydata  

vim /etc/fstab 

LABEL=MYDATA            /mydata                 ext3    defaults        0 0 

[root@server30 ~]# mount -a 

[root@server30 ~]# mount 

[root@server30 ~]# useradd -u 300 -r mysql 

[root@server30 ~]# chown -R mysql:mysql /mydata/ 

[root@server30 ~]# vim /etc/exports  (no_root_squash表示不将root使用者映射為noboby)

/mydata                 172.16.150.30(rw,no_root_squash) 172.16.150.31(rw,no_root_squash) 

[root@server30 ~]# service nfs start 

[root@server30 ~]# chkconfig nfs on 

[root@server30 ~]# exportfs -arv 

(2)在node1上配置mysql

[root@node1 ~]# mkdir /mydata 

[root@node1 ~]# mount -t nfs 172.16.150.22:/mydata  /mydata

[root@node1 ~]# useradd -u 300 -r mysql 

[root@node1 ~]# su - mysql 

-bash-3.2$ cd /mydata 

-bash-3.2$ touch test.txt 

-bash-3.2$ ls 

lost+found  test.txt 

-bash-3.2$ rm -f test.txt 

[root@node1 ~]# mkdir /mydata/data 

[root@node1 ~]# chown -R mysql:mysql /mydata/data 

[root@node1 mysql]#  chown -R :mysql /usr/local/mysql/

[root@node1 support-files]# cp my-large.cnf /etc/my.cnf 

[root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld 

[root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld 

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

修改thread_concurrency = 4 跟自己的cpu核心有關 

添加一行datadir=/mydata/data 

[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data

對mysql進行初始化。 

[root@node1 ~]# service mysqld start 

[root@node1 ~]# /usr/local/mysql/bin/mysql 測試能否連接配接成功 

[root@node2 ~]# service mysqld stop 

[root@node1 ~]# scp /etc/my.cnf /etc/rc.d/init.d/mysqld node2:/root 

[root@node2 ~]# umount /mydata 這是因為需要将NFS定義成資源

(3)在node2上

[root@node2 ~]# chown -R :mysql /usr/local/mysql/ 

[root@node2 ~]# service mysqld start 

Starting MySQL.......                                      [  OK  ] 

[root@node2 ~]# /usr/local/mysql/bin/mysql 

[root@node2 ~]# umount /mydata  

二,先準備好三台虛拟機,并對node1,node2做好雙機互信。

(1)修改在node1上修改/etc/hosts。

 vim /etc/hosts 

172.16.150.30   node1 

172.16.150.31   node2 

并将些檔案複制到node2上,scp /etc/hosts node2:/etc/

(2)對node1與node2的主機名先做修改,并配置好IP。

node1:   

sed -i 's@\(HOSTNAME=\).*@\1node1@g'  /etc/sysconfig/network   

hostname node1  或者hostname -F /etc/sysconfig/network

node2:  

sed -i 's@\(HOSTNAME=\).*@\1node2g' /etc/sysconfig/network  

hostname node2  

(3)設定兩個節點可以基于密鑰進行ssh通信。

node1: 

ssh-keygen -t rsa 

ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 

node2: 

ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1 

三,在node1,node2上安裝corosync。需要安裝以下rpm包。

cluster-glue-1.0.6-1.6.el5.i386.rpm                                          

cluster-glue-libs-1.0.6-1.6.el5.i386.rpm                                       

corosync-1.2.7-1.1.el5.i386.rpm                                              

heartbeat-3.0.3-2.3.el5.i386.rpm                                               

heartbeat-libs-3.0.3-2.3.el5.i386.rpm                                         

libesmtp-1.0.4-5.el5.i386.rpm                                                  

pacemaker-1.1.5-1.1.el5.i386.rpm                                                 

pacemaker-libs-1.1.5-1.1.el5.i386.rpm                                         

perl-TimeDate-1.16-5.el5.noarch.rpm                                         

resource-agents-1.0.4-1.1.el5.i386.rpm   

可以使用yum -y --nogpgcheck localinstall *.rpm

四,在node1上做以下修改

[root@node1 corosync]# cd /etc/corosync/  

[root@node1 corosync]# cp corosync.conf.example corosync.conf  

[root@node1 corosync]# vim corosync.conf  

totem {  

        version: 2  

        secauth: on 啟用節點之間通信需要認證  

        threads: 0  

        interface {  

                ringnumber: 0  

                bindnetaddr: 172.16.0.0 自己所處的網絡位址  

                mcastaddr: 226.94.150.1 多點傳播位址  

                mcastport: 5405  多點傳播端口  

        }  

logging {  

        fileline: off  

        to_stderr: no  

        to_logfile: yes  

        to_syslog: no 禁止日志記錄到/var/log/messages  

        logfile: /var/log/cluster/corosync.log  

        debug: off  

        timestamp: on  

        logger_subsys {  

                subsys: AMF  

                debug: off  

}  

service { 添加一個pacemaker的服務  

        ver: 0 版本号  

        name: pacemaker  

        use_mgmtd: yes 是否啟用圖形,此次實驗基于指令,可以省略,如果其中圖形,還需要安裝别的.rpm包  

aixexec { 使用哪個使用者來啟用服務  

        user: root  

        group: root  

[root@node1 corosync]# corosync-keygen  生成密鑰檔案authkey  

[root@node1 corosync]# scp authkey  corosync.conf node2:/etc/corosync/  

[root@node1 corosync]# mkdir /var/log/cluster 

[root@node1 corosync]# ssh node2 'mkdir /var/log/cluster' 

[root@node1 corosync]# service corosync start 

Starting Corosync Cluster Engine (corosync):               [  OK  ] 

[root@node1 corosync]# ssh node2 '/etc/init.d/corosync start' 

Starting Corosync Cluster Engine (corosync): [  OK  ] 

在node1啟動node2的corosync,不要到node2本機上啟動。這是規定

[root@node1 corosync]# crm_mon 此指令會一直監視,需要按ctrl+c退出  

Last updated: Sat Aug  4 10:26:11 2012  

Stack: openais  

Current DC: node1 - partition with quorum  

Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f  

2 Nodes configured, 2 expected votes  

0 Resources configured.  

============  

Online: [ node1 node2 ] 目前線上的節點nod1,node2  

五,進入crm的互動式指令配置,在互動式中,可以使用tab鍵自動對齊。比較人性化。

[root@node1 corosync]# crm 

crm(live)# configure  

crm(live)configure# property stonith-enabled=false 禁用stonith,stonith需要硬體支援。 

crm(live)configure# verify 最好驗證剛才的語句有沒有錯誤 

crm(live)configure# commit 

crm(live)configure# property no-quorum-policy=ignore 沒有法定票數的政策,忽略不計,繼續提供服務 

crm(live)configure# rsc_defaults resource-stickiness=100 設定目前節點的粘性值,100大于0,表示資源更樂意留下目前節點 

crm(live)configure# verify  

crm(live)configure# show  檢視目前生效的配置

node node1 node node2 property $id="cib-bootstrap-options" \ dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \ cluster-infrastructure="openais" \ expected-quorum-votes="2" \ stonith-enabled="false" \ no-quorum-policy="ignore" rsc_defaults $id="rsc-options" \ resource-stickiness="100"

 六,開始定義資源:

crm(live)# ra 

crm(live)# classes 檢視資源代理類型 

crm(live)ra# list ocf heartbeat查找ocf 下的heartbeat有哪些代理 

crm(live)ra# meta ocf:heartbeat:IPaddr檢視IPaddr的參數 

  (1)定義第一個資源:虛拟IP

crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip="172.16.150.1" 

定義資源,資源名為myip  使用是ocf下的hearbeat下IPaddr ,IPaddr的ip參數 

crm(live)configure# commit  

[root@node1 ~]# crm status 

Last updated: Sat Aug  4 10:51:54 2012 

Stack: openais 

Current DC: node1 - partition with quorum 

Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 

2 Nodes configured, 2 expected votes 

1 Resources configured. 

============ 

Online: [ node1 node2 ] 

 myip   (ocf::heartbeat:IPaddr):    Started node1  表示資源已經在node1上啟動了 

 [root@node1 ~]# ifconfig 檢視有沒有真正的啟動 

 (2)定義第二個資源:檔案系統

crm(live)ra# cd 

crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem params device="172.16.100.1:/mydata" directory="/ 

mydata" fstype="nfs"  由于使用是預設的20秒,小于建議的60秒,是以出現下面的警告,隻需要将預設的20修改成大于60就ok 

WARNING: mynfs: default timeout 20s for start is smaller than the advised 60 ( crm(live)ra# meta ocf:heartbeat:Filesystem可以檢視到建議的最小值 

WARNING: mynfs: default timeout 20s for stop is smaller than the advised 60 

crm(live)configure# delete mynfs 

crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem params device="172.16.150.22:/mydata" directory="/mydata"  

fstype="nfs" op start timeout=60s op stop timeout=60s 

[root@node1 ~]# crm status  

Last updated: Sat Aug  4 11:48:23 2012 

2 Resources configured. 

 myip   (ocf::heartbeat:IPaddr):    Started node1 

 mynfs  (ocf::heartbeat:Filesystem):    Started node2表示在node2已經啟動 

 [root@node2 corosync]# crm node standby 将在node2切換成備節點 

 [root@node1 ~]# crm status  再次檢視mynfs資源已經在node1上啟動。 

 [root@node2 corosync]# crm node online 讓node2再次上線 

 [root@node1 ~]# crm status 由于前面配置的資源的粘性,是以資源不會再回node2 

(3)配置第三個資源mysqld,并定義資源的之間的限制mysqld與mynfs在一起。原因很簡單,如果不在一起mysql将無法啟動,且mynfs一定比mysqld先啟動。當然mysqld與myip也要在一起。

crm(live)configure# primitive mysqld lsb:mysqld 使用lsb類型的資源代理 

crm(live)configure# crm(live)configure# colocation mysqld_and_mynfs_myip inf: mysqld mynfs myip 

将三個資源定義在一起,三個資源要同時在一個節點上

crm(live)configure# order mysqld_after_mynfs  mandatory: mynfs:start mysqld mynfs

先啟動後,才啟動mysqld 

crm(live)configure# order mysqld_after_myip mandatory: myip mysqld  

myip與mynfs誰先啟動都無所謂 

[root@node2 ~]# crm_mon檢視是否已經啟動 

七,測試mysql

 mysql&gt; grant all on *.* to root@'%' identified by 'redhat'; 建立遠端連接配接使用者, 

mysql&gt; flush privileges; 

再開一台虛拟機測試先安裝mysql用戶端,并啟動服務mysql 

[root@server30 ~]# mysql -uroot -h172.16.150.1 -predhat 

mysql&gt; create database testdb;建立一個資料庫   

八,模拟node1故障是時,node2會不會自動接替

[root@node1 ~]# crm node standby 

[root@node1 ~]# crm_mon 令可能要等下,三個資源才會全部顯示 

到此結束!

本文轉自 deng304749970 51CTO部落格,原文連結:http://blog.51cto.com/damondeng/954107,如需轉載請自行聯系原作者