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