天天看點

如何使用Heartbeat,組建一個高可用性的mysql叢集

  轉了好多次文章,其實就是為了使用heartbeat來搭建mysql叢集,網上很多都是用make來生成RPM來安裝,我也找了很多資料,mysql 自帶的cluster使用者不滿意,隻能再次vmware虛拟機嘗試下,這裡要感謝部落格:http://kerry.blog.51cto.com/172631/110206/ ,很多是根據裡面的經驗來實作的,隻是部分還是解決不出需要其他方法。

一、背景

目前大多網站采用Linux +MYSQL+APACHE+PHP這種經典配置,如何防止單點失敗造成的整個網站的不可用是網站管理者必須要考慮的問題,其中資料庫的高可用性(Database server’s high availability)是重中之重。

對于資料庫的高可用性,各商業軟體的廠商都有各自的解決方案,比如Oracle OPS server和IBM DB2 (share-nothing architecture)。最近MYSQL AB也釋出了MYSQL cluster 軟體,使用與IBM DB2類似的技術。

MySQL cluster可能會是日後最理想的方案,但是從資源、可內建度方面考慮,給出一個簡單實用的方案借鑒。本文介紹的是成本效益比較高的一種: 使用Heartbeat 2.0配置Linux高可用性叢集,同時使用Heartbeat也可以實作簡單的web叢集。

二、實作原理

通過Linux HA 軟體 heartbeat 實作IP的自動漂移,即當一台伺服器當機後,浮動IP(整個cluster的對外IP )自動漂移到另外一台伺服器。

如何使用Heartbeat,組建一個高可用性的mysql叢集

通過Mysql自身的replication 實作不同機器上多個資料庫的同步整體性能此方案将會降低MYSQL 1%左右的性能,可用性及資料安全性将大有提高,同時伺服器的切換對終端使用者是透明的,終端應用不需要進行更改。

所需硬體:

安裝有雙網卡的配置大緻相同的伺服器或工作機兩台 一條交叉網線(用于雙機對連的心跳線)

  我這裡是根據http://distfiles.macports.org/mysql5/找的mysql-5.5.29.tar.gz來搭建mysql

所需軟體:

Linux HA 軟體 heartbeat (隻支援兩個節點),安裝盤裡內建的有這個軟體的rpm包

軟體首頁:​​[url]http://www.linux-ha.org/[/url]​​

我這裡是通過yum 安裝還有epel來安裝heartbeat的,具體請看下面步驟:

1、安裝MYSQL

#cd /opt

#useradd mysql -d /usr/local/mysql -s /sbin/nologin

#tar -zxvf mysql-5.1.29-rc.tar.gz

#cd mysql-5.1.29-rc

# ./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=gbk --with-collation=gbk_chinese_ci --with-extra-charsets=all --with-pthread --enable-thread-safe-client --enable-assembler --without-isam --without-innodb --without-ndb-debug --with-mysqli

這個如果沒有裝gcc編譯器,需要執行

​<code>​yum groupinstall​</code>​ ​<code>​ "Development Tools"​</code>​

接下如果缺少ncurses安裝包

解決辦法:

下載下傳安裝相應軟體包

一、如果你的系統是RedHat系列:

yum list|grep ncurses

yum -y install ncurses-devel

yum install ncurses-devel

#make &amp;&amp; make install

#/usr/local/mysql/bin/mysql_install_db        //初始化資料庫

#chown -R mysql.mysql /usr/local/mysql/     //設定目錄宿主

#cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf   //複制配置檔案

#cp support-files/mysql.server /etc/rc.d/init.d/mysqld    //設定啟動檔案 

#chmod 700 /etc/rc.d/init.d/mysqld                         

#/usr/local/mysql/bin/mysqld_safe --user=mysql &amp;         

#/etc/rc.d/init.d/mysqld start

在啟動mysql時報錯

如何使用Heartbeat,組建一個高可用性的mysql叢集

檢視日志發現以下錯誤:

如何使用Heartbeat,組建一個高可用性的mysql叢集

将/etc/my.cnf檔案中的skip-federated注釋掉,然後執行/usr/local/mysql/bin/mysql_install_db--user=mysql就可以了

如果上面的版本還不行,可以看看my.cnf是否有問題,可以通過檢視日志來得到問題原因:

http://zhidao.baidu.com/link?url=nXPsnqxsE2OTnMhTEbUX9NlE1LSiqcmJ09pEm2hKsLwrOCnvII4aEFelqGnoiLYbi2iU6tRBQFsSjzK2b6JMa_

#chkconfig --add mysqld

#chkconfig --level 2345 mysqld on

設定軟連接配接,如果要删除直接ln -C

#ln -s /usr/local/mysql/bin/mysql /sbin/mysql

#ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin

#mysqladmin –u root password Password01!//設定root 密碼

#配置庫檔案搜尋路徑

#echo "/usr/local/mysql/lib/mysql" &gt;&gt; /etc/ld.so.conf

#ldconfig

#添加/usr/local/mysql/bin到環境變量PATH中

#export PATH=$PATH:/usr/local/mysql/bin

mysqlB也按以上的方式進行安裝

2、mysqlA設定

設定同步資料庫:

   在這裡我就用test資料庫來做測試,在test資料庫裡建立一個data表,并添加一些資料,具體操作如下:

#mysql –u root –pPassword01!

如何使用Heartbeat,組建一個高可用性的mysql叢集

mysql&gt; create table data(name VARCHAR(20), address VARCHAR(50), phone VARCHAR(20));

mysql&gt;insert into data(name,address,phone) values('jhone','beijing','138000000');

mysql&gt;select * from data;

設定資料庫同步帳戶:

mysql&gt;GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'backup'@'10.10.10.205' IDENTIFIED BY 'qawsed';

(授與從10.0.0.2主機上登入使用者backup資料複制權限,4.02版本以前用:GRANT FILE ON *.* TO [email protected] IDENTIFIED BY 'qawsed';)

mysql&gt;flush privileges;

如何使用Heartbeat,組建一個高可用性的mysql叢集

修改配置檔案:

停止mysql服務

[root@mysqlA opt]#service mysqld stop

建立用于更新日志的目錄,并給于mysql的權限

[root@mysqlA opt]# mkdir /var/log/mysql

[root@mysqlA opt]# chown mysql.mysql /var/log/mysql/

更改Mysql配置檔案/etc/my.cnf

[root@mysqlA opt]# vi /etc/my.cnf

server-id=1                 //伺服器ID号

log-bin=mysql-bin

log-bin=/var/log/mysql/updatelog   //啟用更新日志

binlog-do-db=test       //表示需要備份的資料庫是test這個資料庫

replicate-same-server-id

master-host=10.0.0.2      //指定主伺服器IP

master-user=backup       //指定在主伺服器上可以同步的帳号

master-password=qawsed //指定帳号對應的密碼

master-connect-retry=60  //斷點重試間隔為60秒

replicate-do-db=test      //表示同步test資料庫

binlog-ignore-db=mysql   //不同步mysql資料庫

把test進行備份

[root@mysqlA opt]# service mysqld start    //先啟動mysql

[root@mysqlA opt]# /usr/local/mysql/bin/mysqldump -h localhost -u root -p1q2w3e test &gt;test.sql

[root@mysqlA opt]#scp test.sql [email protected]:/opt     //(将test.sql複制到mysqlB的/opt目錄下)

至此mysqlA伺服器上有關mysql的設定已完成,下一步開始配置mysqlB

設定mysqlB

mysql&gt;GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'backup'@'10.0.0.1' IDENTIFIED BY 'qawsed';

(授與從10.0.0.1主機上登入使用者backup資料複制權限,4.02版本以前用:GRANT FILE ON *.* TO [email protected] IDENTIFIED BY 'qawsed';)

server-id=2                 //伺服器ID号

master-host=10.0.0.1      //指定主伺服器IP

還原從mysqlA備份過的test.sql

#service mysqld start

# mysql -u root -p1q2w3e test &lt;test.sql

重新開機兩邊的mysql服務

查詢配置

Show Slave status:此處Slave_IO_Running ,Slave_SQL_Running 都應該是yes,表示從庫的I/O,Slave_SQL線程都正确開啟.

在Mysql中可通過以下指令來檢視主從狀态

show master status 檢視master狀态

show slave status 檢視slave狀态

show processlist G 檢視目前程序

stop slave 暫時停止slave程序

start slave 開始slave程序

在primary伺服器上 MySQL指令符下輸入:

mysql&gt;show master status;

如何使用Heartbeat,組建一個高可用性的mysql叢集

mysql&gt;show slave status\G;

如何使用Heartbeat,組建一個高可用性的mysql叢集

如果出現以錯誤:

如何使用Heartbeat,組建一個高可用性的mysql叢集

解決辦法:在/etc/my.cnf 的[mysqld]下面加上replicate-same-server-id參數

如何使用Heartbeat,組建一個高可用性的mysql叢集

這裡如果是Slave_IO_Running:No Slave_SQL_Running:YES還有可能是IPTABLES沒有設定對,可以用下面指令:

在vmvare裡面配了兩台mysql,發現用mysql連不上mysql伺服器,用telnet登入mysql的3306端口,發現居然是no route to host;

[zhoulei@localhost ~]$ telnet 192.168.2.48 3306

Trying 192.168.2.48...

telnet: connect to address 192.168.2.48: No route to host

telnet: Unable to connect to remote host: No route to host

覺得甚是差異,估計是虛拟機裝了有問題,就把虛拟機中的防火牆給清了一下,發現可行。

[zhoulei@localhost ~]$ sudo iptables -F

因為如果安裝telnet指令,telnet對方的3362會報No route to host

這裡如果是Slave_IO_Running:YES Slave_SQL_Running:NO可以用下面指令:

mysql&gt; slave stop;

mysql&gt; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql&gt; slave start;

到此mysql的雙機互備已基本完成,在兩台伺服器的mysql資料庫中任意添加資料,都可以同步到對端伺服器上

安裝配置heartbeat:

Heartbeat下載下傳位址如下:

這裡是用:

yum install PyXML cluster-glue cluster-glue-libs resource-agents 

然後

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-3.0.4-2.el6.x86_64.rpm  

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-libs-3.0.4-2.el6.x86_64.rpm  

rpm -ivh heartbeat-* 

因為原來的教程是centos 5.3下的heartbeat2以上的版本

配置 HA的各配置檔案:

複制配置檔案

[root@mysqlA opt]# cp /usr/share/doc/packages/heartbeat/authkeys /etc/ha.d/

[root@mysqlA opt]# cp /usr/share/doc/packages/heartbeat/haresources /etc/ha.d/

[root@mysqlA opt]# cp /usr/share/doc/packages/heartbeat/ha.cf /etc/ha.d/

配置心跳的加密方式:authkeys

[root@mysqlA opt]#vi /etc/ha.d/authkeys

#如果使用雙機對聯線(雙絞線),可以配置如下:

auth 1

1 crc

#存盤退出,然後

[root@mysqlA opt]#chmod 600 authkeys

配置心跳的監控:haresources

[root@mysqlA opt]#vi /etc/ha.d/haresources

#各主機這部分應完全相同。

mysqlA IPaddr::192.168.8.155 ipvsadm mysqld

[root@mysqlA opt]# mkdir -p /var/log/ha_log

[root@mysqlA opt]#chmod 777 /var/log/ha_log/

配置心跳的配置檔案:ha.cf

[root@mysqlA opt]#vi /etc/ha.d/ha.cf

logfile /var/log/ha_log/ha-log.log   ## ha的日志檔案記錄位置。如沒有該目錄,則需要手動添加

bcast eth1     ##使用eht1做心跳監測

keepalive 2    ##設定心跳(監測)時間時間為2秒

warntime 10

deadtime 30

initdead 120

hopfudge 1

udpport 694    ##使用udp端口694 進行心跳監測

auto_failback on

node mysqlA  ##節點1,必須要與 uname -n 指令得到的結果一緻。

node mysqlB  ##節點2

ping 192.168.8.100   ##通過ping 網關來監測心跳是否正常。

設定ipvsadm的巡回監測

[root@mysqlA opt]#ipvsadm -A -t 192.168.8.155:3306 -s rr

[root@mysqlA opt]#ipvsadm -a -t 192.168.8.155:3306 -r 192.168.8.151:3306 -m

[root@mysqlA opt]#ipvsadm -a -t 192.168.8.155:3306 -r 192.168.8.152:3306 –m

執行後進行監測:

[root@mysqlA opt]#ipvsadm –list

如何使用Heartbeat,組建一個高可用性的mysql叢集
如何使用Heartbeat,組建一個高可用性的mysql叢集

HA服務的啟動、關閉以及測試

啟動HA: service heartbeat start

關閉HA; service heartbeat stop

進行監控: service heartbeat status

如何使用Heartbeat,組建一個高可用性的mysql叢集

防火牆設定

heartbeat 預設使用udp 694端口進行心跳監測。 如果系統有使用iptables 做防火牆,應記住把這個端口打開。

iptables -I INPUT -p udp --dport 694 -j ACCEPT

到此mysql雙機互備已基本完成,不管哪一台伺服器菪機都不會影響mysql的正常運作