預備知識 :
1.雙機熱備
對于雙機熱備這一概念,我搜尋了很多資料,最後,還是按照大多數資料所講分成廣義與狹義兩種意義來說。
從廣義上講,就是對于重要的服務,使用兩台伺服器,互相備份,共同執行同一服務。當一台伺服器出現故障時,可以由另一台伺服器承擔服務任務,進而在不需要人工幹預的情況下,自動保證系統能持續提供服務。
從狹義上講,雙機熱備就是使用互為備份的兩台伺服器共同執行同一服務,其中一台主機為工作機(Primary Server),另一台主機為備份主機(Standby Server)。在系統正常情況下,工作機為應用系統提供服務,備份機監視工作機的運作情況(一般是通過心跳診斷,工作機同時也在檢測備份機是否正常),當工作機出現異常,不能支援應用系統營運時,備份機主動接管工作機的工作,繼續支援關鍵應用服務,保證系統不間斷的運作。雙機熱備針對的是IT核心伺服器、存儲、網絡路由交換的故障的高可用性解決方案。
2.為什麼要進行雙機熱備?
雙機熱備服務針對的是伺服器的故障。伺服器的故障可能由各種原因引起,如裝置故障、作業系統故障、軟體系統故障等等。一般地講,在技術人員在現場的情況下,恢複伺服器正常可能需要10分鐘、幾小時甚至幾天。從實際經驗上看,除非是簡單地重新開機伺服器(可能隐患仍然存在),否則往往需要幾個小時以上。而如果技術人員不在現場,則恢複服務的時間就更長了。
而對于一些重要系統而言,使用者是很難忍受這樣長時間的服務中斷的。是以,就需要通過雙機熱備服務,來避免長時間的服務中斷,保證系統長期、可靠的服務。
當然,決定是否使用雙機熱備,正确的方法是要分析一下系統的重要性以及對服務中斷的容忍程度,以些決定是否使用雙機熱備。換句話說,就是你的使用者能容忍多長時間恢複服務,如果服務不能恢複會造成多大的影響。
在考慮雙機熱備時,需要注意,一般意義上的雙機熱備都會有一個切換過程,這個切換過程可能是一分鐘左右。在切換過程中,服務是有可能短時間中斷的。但是,當切換完成後,服務将正常恢複。是以,雙機熱備不是無縫、不中斷的,但它能夠保證在出現系統故障時,能夠很快恢複正常的服務,業務不緻受到影響。而如果沒有雙機熱備,則一旦出現伺服器故障,可能會出現幾個小時的服務中斷,對業務的影響就可能會造成很嚴重的損失。
3.雙機熱備技術與備份的概念差別
熱備份指的是:High Available(HA)即高可用,而備份指的是Backup,即資料備份的一種,這是兩種不同的概念,應對的産品也是兩種功能上完全不同的産品。熱備份主要保障業務的連續性,實作的方法是故障點的轉移。而備份,主要目的是為了防止資料丢失,而做的一份拷貝,是以備份強調的是資料恢複而不是應用的故障轉移。
4.雙機熱備方案的主要兩種組建方式
雙機熱備方案在進行讨論的時候一定要考慮到很多的因素,其中在各種環境下應用的時候需要格外的引起注意。當然還是有主要的兩方式可以借鑒考慮的。
第一種,雙機熱備它的工作原理是使用兩台伺服器,一台作為主伺服器(Active),運作應用系統來提供服務。另一台作為備機,安裝完全一樣的應用系統,但處于待機狀态(Standby)。當Active伺服器出現故障時,通過軟體診測将Standby機器激活,保證應用在短時間内完成恢複正常使用。
第二種,雙機互備方式則是在雙機熱備的基礎上,兩個相對獨立的應用在兩台機器同時運作,但彼此均設為備機,當某一台伺服器出現故障時,另一台伺服器可以在短時間内将故障伺服器的應用接管過來,進而保證了應用的持續性,這種方式實際上是雙機熱備方案的一種應用。
但目前使用最多的還是主從模式的雙機熱備方案。其大緻表示可如下圖所示:
目前基于存儲共享的雙機熱備是雙機熱備方案的最标準方案。對于這種方式,采用兩台伺服器,使用共享的儲存設備(磁盤陣列櫃或存儲區域網SAN)。兩台伺服器可以采用主從、互備等不同的方式。在工作過程中,兩台伺服器将以下一個虛拟的IP位址對外提供服務,依工作方式的不同,将服務請求發送給其中一台伺服器承擔。同時,伺服器通過心跳線(目前往往采用建立私有網絡的方式)偵測另一台伺服器的工作狀況。
下圖即為雙機熱備工作大緻狀況圖,如下圖所示:
雙機熱備方案當一台伺服器出現故障時,另一台伺服器根據心跳偵測的情況做出判斷,并進行切換,接管服務。對于使用者而言,這一過程是全自動的,在很短時間内完成,進而不會對業務造成大的影響。由于使用共享的儲存設備,是以兩台伺服器使用的實際上是一樣的資料,由雙機或叢集軟體對其進行管理。
5.Mysql雙機熱備實作原理圖
有了上面對雙機熱備知識的講解,對其實作原理就有了一個深入了解,那麼我們要做mysql資料庫的雙機熱備就清楚明了多了。
Mysql雙機熱備系統的拓撲結構如下圖所示:
兩台伺服器通過以太網連接配接網絡,通過網絡對外提供服務、互相通信。
兩台伺服器之間用com口直接互聯,雙機熱備軟體利用這個連接配接進行雙機熱備相關的通信、監控和控制等。
兩台伺服器通過HBA卡連接配接FC網絡,通路共同的磁盤陣列,實作雙機熱備系統必要的磁盤。
6.Mysql雙機熱備實作的配置
為了資料的安全,客戶有兩台機器作為互相備份,當一台機器出現故障時,自動切換到另一台伺服器。大部分的軟體是通過LifeKeeper來實作的,但是Mysql的雙機備份在LifeKeeper裡沒有實作,是以隻能自己手動來實作Mysql的雙機備份了。
其實,Mysql的雙機備份有一個很簡單的第三方軟體可以實作,那就是SQLyog,他有一個功能叫sja(SQLyog Job Agent)可以輕松實作,但是卻有一個不足之處,就是Mysql表裡必須有一個primary key,即主鍵值,如果沒有,則此表不能用sja來實作。
第二種方法就是用Mysql自身的Replication機制來實作了。但是這個功能隻有Mysql 3.23以上的版本才有。
這裡先說明下,由于我還沒有通過實際的應用例子來檢測這種雙機熱備方式是否能過通過,是以我會在我通過執行個體實作後在續寫我後面的關于Mysql雙機熱備實作的配置部分。現在這部分内容主要講的還是雙機熱備份的實作原理和意義。
★mysql雙機熱備的實作
接續上一篇關于mysql雙機熱備實作原理分析,在本文經過深思熟慮和多次用不同的方式實測試後。最後在這篇文章中,用一個小例子來完成mysql雙機熱備的實作。
Mysql資料庫沒有增量備份的機制,當資料量太大的時候備份是一個很大的問題。還好mysql資料庫提供了一種主從備份的機制,其實就是把主資料庫的所有的資料同時寫到備份的資料庫中。實作mysql資料庫的熱備份。
要想實作雙機的熱備,首先要了解主從資料庫伺服器的版本的需求。要實作熱備mysql的版本都高于3.2。還有一個基本的原則就是作為從資料庫的資料版本可以高于主伺服器資料庫的版本,但是不可以低于主伺服器的資料庫版本。
當然要實作mysql雙機熱備,除了mysql本身自帶的REPLICATION功能可以實作外,也可以用Heartbeat這個開源軟體來實作。不過本文主要還是講如何用mysql自帶的REPLICATION來實作mysql雙機熱備的功能。
- 準備伺服器
由于Mysql不同版本之間的(二進制日志)binlog格式可能會不太一樣,是以最好的搭配組合是主(Master)伺服器的Mysql版本和從(Slave)伺服器版本相同或者更低,主伺服器的版本肯定不能高于從伺服器版本。
本次我用于測試的兩台伺服器版本都是Mysql-5.5.17。
- Mysql 建立主-從伺服器雙機熱備配置步驟
2.1環境描述
A伺服器(主伺服器Master):59.151.15.36
B伺服器(從伺服器Slave):218.206.70.146
主從伺服器的Mysql版本皆為5.5.17
Linux環境下
将主伺服器需要同步的資料庫内容進行備份一份,上傳到從伺服器上,保證始初時兩伺服器中資料庫内容一緻。
不過這裡說明下,由于我是利用Mysql在安裝後就有的資料庫test進行測試的,是以兩台伺服器裡面是沒有建立表的,隻不分别在test裡面建立了同樣的一張空表tb_mobile;
Sql語句如下:
mysql> create table tb_mobile( mobile VARCHAR(20) comment’手機号碼’, time timestamp DEFAULT now() comment’時間’ );
2.2 主伺服器Master配置
2.2.1 建立同步使用者
進入mysql操作界面,在主伺服器上為從伺服器建立一個連接配接帳戶,該帳戶必須授予REPLICATION SLAVE權限。因為從mysql版本3.2以後就可以通過REPLICATION對其進行雙機熱備的功能操作。
操作指令如下:
mysql> grant replication slave on . to ‘replicate’@‘218.206.70.146’ identified by ‘123456’;
mysql> flush privileges;
建立好同步連接配接帳戶後,我們可以通過在從伺服器(Slave)上用replicat帳戶對主伺服器(Master)資料庫進行通路下,看下是否能連接配接成功。
在從伺服器(Slave)上輸入如下指令:
[[email protected] ~]# mysql -h59.151.15.36 -ureplicate -p123456
如果出現下面的結果,則表示能登入成功,說明可以對這兩台伺服器進行雙機熱備進行操作。
2.2.2 修改mysql配置檔案
如果上面的準備工作做好,那邊我們就可以進行對mysql配置檔案進行修改了,首先找到mysql配置所有在目錄,一般在安裝好mysql服務後,都會将配置檔案複制一一份出來放到/ect目錄下面,并且配置檔案命名為:my.cnf。即配置檔案準确目錄為/etc/my.cnf
找到配置檔案my.cnf打開後,在[mysqld]下修改即可:
[mysqld]
server-id = 1
log-bin=mysql-bin //其中這兩行是本來就有的,可以不用動,添加下面兩行即可
binlog-do-db = test
binlog-ignore-db = mysql
2.2.3 重新開機mysql服務
修改完配置檔案後,儲存後,重新開機一下mysql服務,如果成功則沒問題。
2.2.4 檢視主伺服器狀态
進入mysql服務後,可通過指令檢視Master狀态,輸入如下指令:
注意看裡面的參數,特别前面兩個File和Position,在從伺服器(Slave)配置主從關系會有用到的。
注:這裡使用了鎖表,目的是為了産生環境中不讓進新的資料,好讓從伺服器定位同步位置,初次同步完成後,記得解鎖。
2.3 從伺服器Slave配置
2.3.1修改配置檔案
因為這裡面是以主-從方式實作mysql雙機熱備的,是以在從伺服器就不用在建立同步帳戶了,直接打開配置檔案my.cnf進行修改即可,道理還是同修改主伺服器上的一樣,隻不過需要修改的參數不一樣而已。如下:
[mysqld]
server-id = 2
log-bin=mysql-bin
replicate-do-db = test
replicate-ignore-db = mysql,information_schema,performance_schema
2.3.2重新開機mysql服務
修改完配置檔案後,儲存後,重新開機一下mysql服務,如果成功則沒問題。
2.3.3用change mster 語句指定同步位置
這步是最關鍵的一步了,在進入mysql操作界面後,輸入如下指令:
mysql>stop slave; //先停步slave服務線程,這個是很重要的,如果不這樣做會造成以下操作不成功。
mysql>change master to
master_host=‘59.151.15.36’,master_user=‘replicate’,master_password=‘123456’,
master_log_file=’ mysql-bin.000016 ',master_log_pos=107;
注:master_log_file, master_log_pos由主伺服器(Master)查出的狀态值中确定。也就是剛剛叫注意的。master_log_file對應File, master_log_pos對應Position。Mysql 5.x以上版本已經不支援在配置檔案中指定主伺服器相關選項。
遇到的問題,如果按上面步驟之後還出現如下情況:
則要重新設定slave。指令如下
mysql>stop slave;
mysql>reset slave;
之後停止slave線程重新開始。成功後,則可以開啟slave線程了。
mysql>start slave;
2.3.4檢視從伺服器(Slave)狀态
用如下指令進行檢視
mysql> show slave status\G;
檢視下面兩項值均為Yes,即表示設定從伺服器成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.4 測試同步
之前開始已經說過了在資料庫test隻有一個表tb_mobile沒有資料,我們可以先檢視下兩伺服器的資料庫是否有資料:
Master:59.151.15.36
Slave:218.206.70.146
好了,現在可以在Master伺服器中插入資料看下是否能同步。
Master:59.151.15.36
Slave:218.206.70.146
可以從上面兩個截圖上看出,在Master伺服器上進行插入的資料在Slave伺服器可以查到,這就表示雙機熱備配置成功了。
-
Mysql 建立主-主伺服器雙機熱備配置步驟
伺服器還是用回現在這兩台伺服器
3.1建立同步使用者
同時在主從伺服器建立一個連接配接帳戶,該帳戶必須授予REPLIATION SLAVE權限。這裡因為伺服器A和伺服器B互為主從,是以都要分别建立一個同步使用者。
伺服器A:
mysql> grant replication slave on . to ‘replicate’@‘218.206.70.146’ identified by ‘123456’;
mysql> flush privileges;
伺服器B:
mysql> grant replication slave on . to ‘replicate’@‘59.151.15.36’ identified by ‘123456’;
mysql> flush privileges;
3.2修改配置檔案my.cnf
伺服器A
[mysqld]
server-id = 1
log-bin=mysql-bin
binlog-do-db = test
binlog-ignore-db = mysql
#主-主形式需要多添加的部分
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
replicate-do-db = test
replicate-ignore-db = mysql,information_schema
伺服器B:
[mysqld]
server-id = 2
log-bin=mysql-bin
master-slave need
replicate-do-db = test
replicate-ignore-db = mysql,information_schema,performance_schema
#主-主形式需要多添加的部分
binlog-do-db = test
binlog-ignore-db = mysql
log-slave-updates
sync_binlog = 1
auto_increment_offset = 2
auto_increment_increment = 2
3.3分别重新開機A伺服器和B伺服器上的mysql服務
重新開機伺服器方式和上面的一樣,這裡就不做講解了。
3.4分别查A伺服器和B伺服器作為主伺服器的狀态
伺服器A:
伺服器B:
3.5分别在A伺服器和B伺服器上用change master to 指定同步位置
伺服器A:
mysql>change master to
master_host=‘218.206.70.146’,master_user=‘replicate’,master_password=‘123456’,
master_log_file=’ mysql-bin.000011 ',master_log_pos=497;
伺服器B:
mysql>change master to
master_host=‘59.151.15.36’,master_user=‘replicate’,master_password=‘123456’,
master_log_file=’ mysql-bin.000016 ',master_log_pos=107;
3.6 分别在A和B伺服器上重新開機從服務線程
mysql>start slave;
3.7 分别在A和B伺服器上檢視從伺服器狀态
mysql>show slave status\G;
檢視下面兩項值均為Yes,即表示設定從伺服器成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.8 測試主-主同步例子
測試伺服器A:
在伺服器A上插入一條語句如下圖所示:
之後在伺服器B上檢視是否同步如下圖所示
測試伺服器B:
然後在從伺服器A上檢視是否有同步資料如下圖所示:
最後從結果可以看出主-主形式的雙機熱備是能成功實作的。
4. 配置參數說明
Server-id
ID值唯一的辨別了複制群集中的主從伺服器,是以它們必須各不相同。Master_id必須為1到232-1之間的一個正整數值,slave_id值必須為2到232-1之間的一個正整數值。
Log-bin
表示打開binlog,打開該選項才可以通過I/O寫到Slave的relay-log,也是可以進行replication的前提。
Binlog-do-db
表示需要記錄二進制日志的資料庫。如果有多個資料可以用逗号分隔,或者使用多個binlog-do-dg選項。
Binglog-ingore-db
表示不需要記錄二進制日志的資料庫,如果有多個資料庫可用逗号分隔,或者使用多binglog-ignore-db選項。
Replicate-do-db
表示需要同步的資料庫,如果有多個資料可用逗号分隔,或者使用多個replicate-do-db選項。
Replicate-ignore-db
表示不需要同步的資料庫,如果有多個資料庫可用逗号分隔,或者使用多個replicate-ignore-db選項。
Master-connect-retry
master-connect-retry=n表示從伺服器與主伺服器的連接配接沒有成功,則等待n秒(s)後再進行管理方式(預設設定是60s)。如果從伺服器存在mater.info檔案,它将忽略些選項。
Log-slave-updates
配置從庫上的更新操作是否寫入二進制檔案,如果這台從庫,還要做其他從庫的主庫,那麼就需要打這個參數,以便從庫的從庫能夠進行日志同步。
Slave-skip-errors
在複制過程,由于各種原因導緻binglo中的sql出錯,預設情況下,從庫會停止複制,要使用者介入。可以設定slave-skip-errors來定義錯誤号,如果複制過程中遇到的錯誤是定義的錯誤号,便可以路過。如果從庫是用來做備份,設定這個參數會存在資料不一緻,不要使用。如果是分擔主庫的查詢壓力,可以考慮。
Sync_binlog=1 Or N
Sync_binlog的預設值是0,這種模式下,MySQL不會同步到磁盤中去。這樣的話,Mysql依賴作業系統來重新整理二進制日志binary log,就像作業系統重新整理其他檔案的機制一樣。是以如果作業系統或機器(不僅僅是Mysql伺服器)崩潰,有可能binlog中最後的語句丢失了。要想防止這種情況,可以使用sync_binlog全局變量,使binlog在每N次binlog寫入後與硬碟同步。當sync_binlog變量設定為1是最安全的,因為在crash崩潰的情況下,你的二進制日志binary log隻有可能丢失最多一個語句或者一個事務。但是,這也是最慢的一種方式(除非磁盤有使用帶蓄電池後備電源的緩存cache,使得同步到磁盤的操作非常快)。
即使sync_binlog設定為1,出現崩潰時,也有可能表内容和binlog内容之間存在不一緻性。如果使用InnoDB表,Mysql伺服器處理COMMIT語句,它将整個事務寫入binlog并将事務送出到InnoDB中。如果在兩次操作之間出現崩潰,重新開機時,事務被InnoDB復原,但仍然存在binlog中。可以用-innodb-safe-binlog選項來增加InnoDB表内容和binlog之間的一緻性。(注釋:在Mysql 5.1版本中不需要-innodb-safe-binlog;由于引入了XA事務支援,該選項廢棄了),該選項可以提供更大程度的安全,使每個事務的binlog(sync_binlog=1)和(預設情況為真)InnoDB日志與硬碟同步,該選項的效果是崩潰後重新開機時,在滾回事務後,Mysql伺服器從binlog剪切復原的InnoDB事務。這樣可以確定binlog回報InnoDB表的确切資料等,并使從伺服器保持與主伺服器保持同步(不接收復原的語句)。
Auto_increment_offset和Auto_increment_increment
Auto_increment_increment和auto_increment_offset用于主-主伺服器(master-to-master)複制,并可以用來控制AUTO_INCREMENT列的操作。兩個變量均可以設定為全局或局部變量,并且假定每個值都可以為1到65,535之間的整數值。将其中一個變量設定為0會使該變量為1。
這兩個變量影響AUTO_INCREMENT列的方式:auto_increment_increment控制列中的值的增量值,auto_increment_offset确定AUTO_INCREMENT列值的起點。
如果auto_increment_offset的值大于auto_increment_increment的值,則auto_increment_offset的值被忽略。例如:表内已有一些資料,就會用現在已有的最大自增值做為初始值。