一、雙擊熱備介紹
1.基本概念
雙機熱備特指基於高可用系統中的兩台服務器的熱備(或高可用),雙機高可用按工作中的切換方式分為:主-備方式(Active-Standby方式)和雙主機方式(Active-Active方式),主-備方式即指的是一台服務器處於某種業務的激活狀態(即Active狀態),另一台服務器處於該業務的備用狀態(即Standby狀態)。而雙主機方式即指兩種不同業務分別在兩台服務器上互為主備狀態(即Active-Standby和Standby-Active狀態)。
2.實現方式
a.基於共享存儲(磁盤陣列)的方式
共享存儲方式主要通過磁盤陣列提供切換后,對數據完整性和連續性的保障。用戶數據一般會放在磁盤陣列上,當主機宕機后,備機繼續從磁盤陣列上取得原有數據

b.全冗余方式
全冗余方式就是雙機雙存儲

二 MySQL熱備原理
雙機熱備就是使用MySQL提供的一種主從備份機制實現。所謂雙機熱備其實是一個復制的過程,復制過程中一個服務器充當主服務器,一個或多個服務器充當從服務。這個復制的過程實質上是從服務器復制主服務器上MySQL的二進制日志(bin-log),並在從服務器上還原主服務器上的sql語句操作,這樣只要兩個數據庫的初態是一樣的,就能一直同步。
雙機熱備的實現需要MySQL的版本高於3.2.。另外由於這種備份是基於MySQL二進制日志實現,所以主從服務器上的MySQL版本最好能夠一樣,至少從服務器的MySQL版本不可以低於主服務器的數據庫版本。因為MySQL不同的版本之間二進制日志可能不一樣。
當然這種復制和重復都是MySQL自動實現的,我們只需要配置即可。
如下圖所示:

上圖中有兩個服務器, 演示了從一個主服務器(master) 把數據同步到從服務器(slave)的過程。
這是一個主-從復制的例子。 主-主互相復制只是把上面的例子反過來再做一遍。 所以我們以這個例子介紹原理。
對於一個mysql服務器, 一般有兩個線程來負責復制和被復制。當開啟復制之后。作為主服務器Master,會把自己的每一次改動都記錄到 二進制日志 Binarylog 中。 (從服務器會負責來讀取這個log, 然后在自己那里再執行一遍。)
作為從服務器Slave, 會用master上的賬號登陸到 master上, 讀取master的Binarylog, 寫入到自己的中繼日志 Relaylog, 然后自己的sql線程會負責讀取這個中繼日志,並執行一遍。 到這里主服務器上的更改就同步到從服務器上了。
三 配置步驟
第一步環境搭建:
現在有兩個服務器,分別為A(主服務器),B(從服務器)。
- 為A和B分別分配靜態IP地址。我采用的是dhcp自動分配方式,A的ip地址為192.168.119.128,B的ip地址為192.168.119.130。
- 保證A和B能夠ping通,在B上輸入命令

,如果出現以下結果:

,則說明A和B是能夠通信的,如果不能,則查看是否A和B是否在同一個局域網中,或者關閉linux系統的防火牆 命令為 : /etc/init.d/iptables stop。
- 分別為A和B安裝mysql,client和server都需要安裝。
第二步 A(主服務器配置)配置
1.
進入mysql數據庫。輸入命令:

,然后根據提示輸入密碼。在A上面創建專門用於備份的用戶。命令如下:

grant replication slave on *.* to 'username'@'192.168.119.130' identified by '123456';
其中username是用戶名,192.168.119.130是B(從服務器)的ip地址,密碼為’123456’;這個等會在B上要用;
2.
創建數據庫。
我這里用的sql語句創建的 create database test;(具體實施的時候應該是直接導入數據庫,數據庫已經提前創建好了)。這個數據庫是來測試的。
3.
開啟A的binarylog
這里輸入命令:

,就會打開MySQL的配置文件。修改MySQL綁定的IP地址:

這個是MySQL默認的ip,這里修改成A的ip:192.168.119.128.
繼續修改如下配置

- server-id =1 表示A的id(之前是被#注釋掉的)
- Long_bin = mysql-bin.log 表示log日志,如果采用mysql之前默認的/var/log/mysql/mysql-bin.log會導致MySQL服務無法啟動。
- binlog-do-db =test用來表示,只把哪些數據庫的改動記錄到binary日志中。 可以寫上關注test數據庫(這句話最關鍵)。
- auto-increment-increment = 10和auto-increment-offset = 1用於在 雙主(多主循環)互相備份。 因為每台數據庫服務器都可能在同一個表中插入數據,如果表有一個自動增長的主鍵,那么就會在多服務器上出現主鍵沖突。 解決這個問題的辦法就是讓每個數據庫的自增主鍵不連續。 上圖說是, 我假設需要將來可能需要10台服務器做備份, 所以auto-increment-increment 設為10. 而 auto-increment-offset=1 表示這台服務器的序號。 從1開始, 不超過auto-increment-increment。
- 所有設置完成之后,退出文本編輯,按ESC,再按shift+;鍵,然后輸入wq,就能保存當前設置,並退出。
- 最后:重啟MySQL服務,輸入命令: service mysql restart。
4.
獲取主服務器狀態和同步狀態。
注:因為數據庫庫是已經提前創建好的,所以以下步驟可以省略
現在我有數據庫在A上面;

輸入命令 :use test 進入到test數據庫,
然后鎖定test,輸入命令:FLUSH TABLES WITH READ LOCK;

然后導出數據庫。
注:以下這一步驟需要進行!
查看A服務器的binary日志位置:
輸入命令:show master status\G

記住File和Position,接下來再設置從服務器的時候需要用到。
主服務器的全部做完,可以解除鎖定:

第三步:B(從服務器)配置
1.
設置從服務器的文件配置。
輸入命令:

,打開MySQL的配置文件。修改文件如下:

server-id 必須保證每個服務器不一樣。 這可能和循環同步有關。 防止進入死循環。
replicate-do-db 可以指定需要復制的數據庫, 這里是test。
relay_log 中繼日志的名字。 log-slave-updates 意思是,中繼日志執行之后,這些變化是否需要計入自己的binarylog。 當你的B服務器需要作為另外一個服務器的主服務器的時候需要打開。 就是雙主互相備份,或者多主循環備份。 我們這里需要, 所以打開。
修改完成之后,保存,重啟MySQL;
2.
導入數據庫,開始同步。
實施人員將數據庫導入到B中的MySQL。這里我就不詳細了。
我導入的是test數據庫。
進入MySQL,輸入命令:mysql -uroot -p 輸入密碼后進入。
在mysql中輸入:
CHANGE MASTER TO
MASTER_HOST='192.168.119.128',
MASTER_USER='username',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=510;
執行此語句,會出現

,
重啟MySQL, 然后查看slave線程開啟了沒。

注意圖中的紅框, 兩個都是Yes, 說明開啟成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果其中一個是No, 那就說明不成功。需要查看mysql的錯誤日志。。有時候密碼填錯了, 有時候防火牆的3306沒有打開。ip地址不對,等等。 都會導致失敗。
到這里就全部配置完成了。
第四步 測試
1.在A服務器的test的數據庫中的mytable表(這個是用來測試的,其他數據庫不一定有),添加一條數據。
A:未添加前的狀態:

B的數據庫

現在A和B的初態是一樣的。現在我往A里面插入一條數據,輸入命令:
insert into mytable values(‘test’,’f’,’1900-01-01’,’china’);
插入成功,現在A的狀態更新為:

與此同時B的數據庫也更新為:

這個動作是同時的,幾乎沒有什么間隔。
好了,MySQL的雙機熱備數據同步就完成了。
from:https://cloud.tencent.com/developer/article/1088706