做人要厚道,轉載請保留原文鏈接:http://www.entage.net/1/viewspace_1868.html
作者:九尾銀狐
關(guān)于本文
本文給出了一個(gè)MYSQL HA的實(shí)列,簡(jiǎn)單說(shuō)明了如何實(shí)現MYSQL的高可用性,方法并非僅此一種,感興趣的朋友可參考相關(guān)資料。
背景
當前大多網(wǎng)站采用MYSQL+Linux+APACHE這種經(jīng)典配置,如何防止單點(diǎn)失敗造成的整個(gè)網(wǎng)站的不可用是網(wǎng)站管理者必須要考慮的問(wèn)題,其中數據庫的高可用性(Database server’s high availability)是重中之重。
對于數據庫的高可用性,各商業(yè)軟件的廠(chǎng)商都有各自的解決方案,比如Oracle OPS server和IBM DB2 (share-nothing architecture)。最近MYSQL AB也發(fā)布了MYSQL cluster 軟件,使用與IBM DB2類(lèi)似的技術(shù)。
MySQL cluster可能會(huì )是日后最理想的方案,但是從資源、可集成度方面考慮,筆者將給出一個(gè)簡(jiǎn)單實(shí)用的方案供大家借鑒。
實(shí)現原理
通過(guò)Linux HA 軟件 heartbeat 實(shí)現IP的自動(dòng)漂移,即當一臺服務(wù)器宕機后,浮動(dòng)IP(整個(gè)cluster的對外IP )自動(dòng)漂移到另外一臺服務(wù)器。
通過(guò)Mysql自身的replication 實(shí)現不同機器上多個(gè)數據庫的同步
整體性能
此方案將會(huì )降低MYSQL 1%左右的性能,可用性及數據安全性將大有提高,同時(shí)服務(wù)器的切換對終端使用者是透明的,終端應用不需要進(jìn)行更改。
所需硬件
安裝有雙網(wǎng)卡的配置大致相同的服務(wù)器或工作機兩臺(測試而已,用Vmware虛擬吧)
一條交叉網(wǎng)線(xiàn)(用于雙機對連的心跳線(xiàn))
所需軟件
Linux HA 軟件 heartbeat (只支持兩個(gè)節點(diǎn))
軟件主頁(yè):http://www.linux-ha.org/
Mysql
軟件主頁(yè):www.mysql.com
實(shí)現步驟
一、設置硬件環(huán)境:
Node1:
計算機名:RHEL1
eth0 : 192.168.168.1/255.255.255.0
eth1 : 10.0.0.1/255.0.0.0 (用于心跳)
Node2:
計算機名:RHEL2
eth0 : 192.168.168.2/255.255.255.0
eth1 : 10.0.0.2/255.0.0.0 (用于心跳)
Node1和Node2的eth0分別連接到你的交換機
Node1和Node2的eth1之間用心跳線(xiàn)直連起來(lái),做心跳
二、安裝MYSQL
在每個(gè)節點(diǎn)上分別安裝mysql,不會(huì )裝的看下面安裝步驟或是參考其它資料
1.獲取軟件源碼包
wget
http://mysql.linuxforum.net/Downloads/MySQL-4.0/mysql-4.0.20.tar.gz
2.解壓縮源碼包
tar -zxvf mysql-4.0.20.tar.gz
cd mysql-4.0.20
3.在linux系統中添加運行Mysql的用戶(hù)和組
groupadd mysql
useradd -g mysql -d /var/lib/mysql -s /sbin/nologin mysql
4.配置編譯參數
./configure --prefix=/usr --localstatedir=/var/lib/mysql
5.編譯并安裝
make
make install
6.裝載原始授權到數據庫
./scripts/mysql_install_db
7.copy配置文件到/etc目錄
cp ./support-files/my-small.cnf /etc/my.cnf
8.copy啟動(dòng)腳本到資源目錄
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
9.添加mysql服務(wù)
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
(chkconfig --list mysqld 查看狀態(tài),默認在運行級2.3.4.5是ON的,如果運行級3是Off,則執行chkconfig --level 3 mysqld on)
10.更改目錄屬主
chown -R mysql.mysql /var/lib/mysql
11.啟動(dòng)mysql
service mysqld start
12.設置mysql root用戶(hù)密碼
mysql -u root (登入mysql,以下操作在mysql命令行下進(jìn)行)
mysql>set password forroot@localhost=password(‘yourpassword‘); (設置從本地主機登錄的root用戶(hù)密碼)
mysql>use mysql;
mysql>delete from user where user=‘‘ ; (刪除匿名用戶(hù))
mysql>delete from user where host<>‘localhost‘ ; (只充許從localhost登錄)
mysql>flush privileges ; (使更改生效)
mysql>\q (退出mysql命令行)
至此,Mysql基本安裝完畢。
三、設置Mysql Replication
以下步驟在Node1上操作
1.增加一用于數據庫同步的用戶(hù)replicate
mysql -u root -p (執行后提示輸入密碼,正確輸入mysql root用戶(hù)密碼后,登入mysql,以下操作在mysql命令行下進(jìn)行)
mysql>GRANT REPLICATION SLAVE ON *.* TOreplicate@10.0.0.2IDENTIFIED BY ‘password‘ ;
(授與從10.0.0.2主機上登錄用戶(hù)replicate數據復制權限,4.02版本以前用:GRANT FILE ON *.* TOreplicate@10.0.0.2IDENTIFIED BY ‘password‘;)
mysql>flush privileges; (使權限生效,這步可不做,因為過(guò)會(huì )要重啟mysql)
mysql>\q (退出mysql命令行界面)
2.停止mysql服務(wù)
service mysqld stop
3.更改Mysql配置文件/etc/my.cnf
vi /etc/my.cnf
在[mysqld]一節中增加以下內容
server-id=1 #服務(wù)器的標識 1~2^32-1,不同主機設為不同的值,否則可能會(huì )出現不可預料的錯誤
#以下內容為作為Master的配置,如果此服務(wù)器只作為Slave,注釋掉以下各行
log-bin #允許二進(jìn)制更新日志
binlog-do-db=dbname #指定做二進(jìn)制更新日志的數據庫,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherdb,去掉下行的注釋
#binlog-do-db=anotherdb
binlog-ignore-db=dbname #指明數據庫dbname不做二進(jìn)制更新日志,沒(méi)有則注釋掉此行,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherigdb,去掉下行的注釋
#binlog-ignore-db=anotherigdb
#以下內容為作為Slave的配置,如果此服務(wù)器只作為Master,注釋掉以下各行
master-host=10.0.0.2 #Master服務(wù)器地址
master-user=replicate #Master服務(wù)器上用于replication的用戶(hù),必須有replication slave權限
master-password=replicatepass #Master服務(wù)器上用于replication的用戶(hù)的密碼
master-port=3306 #Master服務(wù)器的TCP端口
master-connect-retry=60 #如果連接Master服務(wù)器失敗,重試連接的間隔,以秒為單位
replicate-do-db=dodbname #指明要復制的數據庫,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherdb,去掉下行的注釋
#replicate-do-db=anotherdb
replicate-ignore-db=igdbname #指明不做復制的數據庫,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherigdb,去掉下行的注釋
#replicate-ignore-db=anotherigdb
4.將要進(jìn)行復制的數據庫打包傳到Node2
tar -cvf /tmp/mysql-thisdb-snapshot.tar /var/lib/mysql/thisdb (將要進(jìn)行復制的thisdb數據庫打包)
scp /tmp/mysql-thisdb-snapshot.tarroot@10.0.0.2:/tmp/ (將mysql-thisdb-snapshot.tar復制到Node2的/tmp目錄)
5.啟動(dòng)Mysql
service mysqld start
至此,Node1上的Mysql設置完畢,以下操作在Node2上完成
1.增加一用于數據庫同步的用戶(hù)replicate
mysql -u root -p (執行后提示輸入密碼,正確輸入mysql root用戶(hù)密碼后,登入mysql,以下操作在mysql命令行下進(jìn)行)
mysql>GRANT REPLICATION SLAVE ON *.* TOreplicate@10.0.0.1IDENTIFIED BY ‘password‘ ;
(授與從10.0.0.1主機上登錄用戶(hù)replicate數據復制權限,4.02版本以前用:GRANT FILE ON *.* TOreplicate@10.0.0.1IDENTIFIED BY ‘password‘;)
mysql>flush privileges; (使權限生效,這步可不做,因為過(guò)會(huì )要重啟mysql)
mysql>\q (退出mysql命令行界面)
2.停止mysql服務(wù)
service mysqld stop
3.更改Mysql配置文件/etc/my.cnf
vi /etc/my.cnf
在[mysqld]一節中增加以下內容
server-id=2 #服務(wù)器的標識 1~2^32-1,不同主機設為不同的值,否則可能會(huì )出現不可預料的錯誤
#以下內容為作為Master的配置,如果此服務(wù)器只作為Slave,注釋掉以下各行
log-bin #允許二進(jìn)制更新日志
binlog-do-db=dbname #指定做二進(jìn)制更新日志的數據庫,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherdb,去掉下行的注釋
#binlog-do-db=anotherdb
binlog-ignore-db=dbname #指明數據庫dbname不做二進(jìn)制更新日志,沒(méi)有則注釋掉此行,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherigdb,去掉下行的注釋
#binlog-ignore-db=anotherigdb
#以下內容為作為Slave的配置,如果此服務(wù)器只作為Master,注釋掉以下各行
master-host=10.0.0.1 #Master服務(wù)器地址
master-user=replicate #Master服務(wù)器上用于replication的用戶(hù),必須有replication slave權限
master-password=replicatepass #Master服務(wù)器上用于replication的用戶(hù)的密碼
master-port=3306 #Master服務(wù)器的TCP端口
master-connect-retry=60 #如果連接Master服務(wù)器失敗,重試連接的間隔,以秒為單位
replicate-do-db=dodbname #指明要復制的數據庫,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherdb,去掉下行的注釋
#replicate-do-db=anotherdb
replicate-ignore-db=igdbname #指明不做復制的數據庫,多個(gè)數據庫用多條此語(yǔ)句,如,還有anotherigdb,去掉下行的注釋
#replicate-ignore-db=anotherigdb
4.將先前從Node1上發(fā)過(guò)來(lái)的數據庫的打包文件解壓并替換掉原有文件,并確保屬主及權限正確
cd /var/lib/mysql
tar -xvf /tmp/mysql-thisdb-snapshot.tar
chown -R mysql.mysql thisdb
chmod 700 thisdb
chmod 660 thisdb/*
5.啟動(dòng)Mysql
service mysqld start
至此Node2上的Mysql設置完畢
在Mysql中可通過(guò)以下命令來(lái)查看主從狀態(tài)
show master status 查看master狀態(tài)
show slave status 查看slave狀態(tài)
show processlist \G 查看當前進(jìn)程
stop slave 暫時(shí)停止slave進(jìn)程
start slave 開(kāi)始slave進(jìn)程
其它相關(guān)命令及詳細配置參數請自行查閱Mysql在線(xiàn)文檔
四、安裝配置Linux HA軟件heartbeat
在每個(gè)節點(diǎn)上分別安裝heartbeat
1.安裝支持包(linux-ha.org站點(diǎn)提供下載)
Linux的版本不同,RPM文件名可能會(huì )不同,請選擇相應版本的RPM
rpm -iUvh libnet-1.1.0-1.rh.el.1.i386.rpm
rpm -iUvh ipvsadm-1.21-1.rh.el.1.i386.rpm
rpm -iUvh perl-Parse-RecDescent-1.80-1.rh.el.um.1.noarch.rpm
rpm -iUvh perl-Mail-IMAPClient-2.2.7-1.rh.el.um.1.noarch.rpm
rpm -iUvh perl-Net-SSLeay-1.23-1.rh.el.um.1.i386.rpm
rpm -iUvh perl-Digest-SHA1-2.01-10.i386.rpm
rpm -iUvh perl-Digest-HMAC-1.01-11.noarch.rpm
rpm -iUvh perl-Authen-SASL-2.03-1.rh.el.um.1.noarch.rpm
rpm -iUvh perl-Convert-ASN1-0.16-2.rh.el.um.1.noarch.rpm
rpm -iUvh perl-IO-Socket-SSL-0.92-1.rh.el.um.1.noarch.rpm
rpm -iUvh perl-XML-NamespaceSupport-1.08-1.rh.el.um.1.noarch.rpm
rpm -iUvh perl-XML-SAX-0.12-1.rh.el.um.1.noarch.rpm
rpm -iUvh perl-ldap-0.2701-1.rh.el.um.1.noarch.rpm
2.按裝heartbeat
以RPM方式按裝(推薦),Linux的版本不同,RPM文件名可能會(huì )不同,請選擇相應版本的RPM
rpm -iUvh heartbeat-pils-1.3.0-1.rh.el.3.0.i386.rpm
rpm -iUvh heartbeat-stonith-1.3.0-1.rh.el.3.0.i386.rpm
rpm -iUvh heartbeat-ldirectord-1.3.0-1.rh.el.3.0.i386.rpm
rpm -iUvh heartbeat-1.3.0-1.rh.el.3.0.i386.rpm
3.Copy配置文件到/etc/ha.d目錄 (只在一個(gè)節點(diǎn)上做即可,所有配置完成后copy到其它節點(diǎn))
cp /usr/share/doc/heartbeat-1.3.0/ha.cf /etc/ha.d/
cp /usr/share/doc/heartbeat-1.3.0/haresources /etc/ha.d/
cp /usr/share/doc/heartbeat-1.3.0/authkeys /etc/ha.d/
4.配置/etc/ha.d/ha.cf (只在一個(gè)節點(diǎn)上配即可,配好后copy到其它節點(diǎn))
vi /etc/ha.d/ha.cf
按如下內容進(jìn)行修改(文件中#開(kāi)頭的行為注釋行,更多的選項及選項的詳細說(shuō)明請參考文件中的注釋及相關(guān)文檔)
debugfile /var/log/ha-debug #寫(xiě)debug信息到這個(gè)文件中
logfile /var/log/ha-log #寫(xiě)運行日志到這個(gè)文件中
keepalive 2 #設置心跳時(shí)間為2秒
deadtime 30 #設置離最近一次心跳多長(cháng)時(shí)間沒(méi)有心跳時(shí)表明節點(diǎn)失敗
warntime 10 #設置離最近的一次心跳多長(cháng)時(shí)間沒(méi)有心跳時(shí)發(fā)出警告
initdead 120 #機器重啟動(dòng)或是剛開(kāi)機時(shí),網(wǎng)絡(luò )能正確開(kāi)始工作的時(shí)間,最小設置為deadtime的兩倍
udpport 694 #bcast/ucast方式心跳通訊所用的UDP端口
#baud 19200 #串口的波特率,使用串口作心跳時(shí)需設置
#serial /dev/ttyS0 #串口設備名,使用串口作心跳時(shí)需設置
bcast eth1 #使用哪一個(gè)設備(網(wǎng)卡)做心跳
#bcast eth1 eth2 #使用多個(gè)設備(網(wǎng)卡)做心跳時(shí)的設置
auto_failback on #當主節點(diǎn)從失敗狀態(tài)恢復時(shí)是否恢復其主節點(diǎn)的身份,即應用是否返回到其自身運行
#on 返回
#off 不返回,其它節點(diǎn)繼續作為主節點(diǎn)運行
#legacy 當所有節點(diǎn)都不支持自動(dòng)返回時(shí),將自身設為自動(dòng)返回
node RHEL1 #節點(diǎn)的主機名或域名,需在/etc/hosts文件或
DNS服務(wù)器中設置
node RHEL2 #所有節點(diǎn)都以node開(kāi)始的行列出
ping 192.168.168.254 #ping節點(diǎn),不屬于cluster內的節點(diǎn),通常選一臺路由器或交換機作為Ping節點(diǎn),
#ipfail模塊通過(guò)此節點(diǎn)來(lái)驗證網(wǎng)絡(luò )的連通性,可指定多個(gè)Ping節點(diǎn),如:
#ping 192.168.168.253 192.168.0.254 ns1.rhel.com ping.linux-ha.org
respawn hacluster /usr/lib/heartbeat/ipfail #由heartbeat調用并監視ipfail模塊
5.配置/etc/ha.d/haresources (只在一個(gè)節點(diǎn)上配即可,配好后copy到其它節點(diǎn))
vi /etc/ha.d/haresources
按如下內容進(jìn)行修改(文件中#開(kāi)頭的行為注釋行,更多的選項及選項的詳細說(shuō)明請參考文件中的注釋及相關(guān)文檔)
RHEL1 192.168.168.103 mysqld #設置heartbeat管理的資源或服務(wù)
#格式為:主節點(diǎn)主機名或域名 浮動(dòng)IP 服務(wù)名
#主節點(diǎn)主機名或域名為ha.cf中node行中指定的任一節點(diǎn)
#浮動(dòng)IP 為對外提供訪(fǎng)問(wèn)的IP,主節點(diǎn)失敗后會(huì )自動(dòng)漂移到其它節點(diǎn),繼續對外提供服務(wù).
#服務(wù)名 為 heartbeat管理的服務(wù)
#注意,此文件內容所有節點(diǎn)必須保持一致。
6.配置/etc/ha.d/authkeys (只在一個(gè)節點(diǎn)上配即可,配好后copy到其它節點(diǎn))
vi /etc/ha.d/authkeys
按如下內容進(jìn)行修改(文件中#開(kāi)頭的行為注釋行,更多的選項及選項的詳細說(shuō)明請參考文件中的注釋及相關(guān)文檔)
auth 1 #設置認證方式
1 crc #格式為:auth <number>
#auth 2 # <number> <authmethod>
[<authkey>]
#2 md5 Hello! #如果是用心跳是用交叉線(xiàn)直接對連兩個(gè)節點(diǎn),用crc方式即可,CPU占用最少
#auth 3 #如果心跳位于不安全的網(wǎng)絡(luò ),如通過(guò)共用交換機連接節點(diǎn),則選用sha1或md5
#3 sha1 HI! #sha1占用CPU資源更多,但是更安全,md5安全性及CPU占用率居中
#sha1和md5都需要提供認證KEY,即用來(lái)加密的KEY
#注意,此文件權限必須設置為600
7.copy配置文件到其它節點(diǎn)
scp /etc/ha.d/ha.cf /etc/ha.d/haresources /etc/ha.d/authkeysroot@RHEL2:/etc/ha.d/
8.分別設置各節點(diǎn)/etc/ha.d/authkeys文件權限
chmod 600 /etc/ha.d/authkeys (文件權限必須設置為600,否則heartbeat不能正常啟動(dòng))
9.在每個(gè)節點(diǎn)上啟動(dòng)heartbeat
service heartbeat start
五、測試
請自行模擬各種宕機情況,進(jìn)行測試,這里不一一例舉。
總結
此方案在Redhat Linux Enterprise Server 3.0 上測試通過(guò),
其它系統請參照本文自行測試。(完)
聯(lián)系客服