1、主從複製
主從複製原理:
mysql資料庫提供了一種主從備份的機制,其實就是把主資料庫的所有的資料同時寫到備份的資料庫中。實現mysql資料庫的熱備份。
要想實現雙機的熱備,首先要了解主從資料庫伺服器的版本的需求。要實現熱備mysql的版本都高於3.2。還有一個基本的原則就是作為從資料庫的資料版本可以高於主伺服器資料庫的版本,但是不可以低於主伺服器的資料庫版本。
當然要實現mysql雙機熱備,除了mysql本身自帶的REPLICATION功能可以實現外,也可以用Heartbeat這個開源軟體來實現 主從複製的根本操作就是把從主伺服器上所執行過的sql在從機上再執行一遍,只要兩個機器的資料庫初態(資料庫結構,資料,配置)是一樣的,那麼我們開啟主從複製之後就能保證他們一直都是一樣的狀態。這些都是mysql自己實現的,我們就配置一下就可以了。
從圖中我們可以看出來了,主伺服器需要做的事情非常簡單的,就只是把執行的sql語句儲存到二進位制檔案binary-log中,而從伺服器需要做的事情比較多,而且還得使用兩個執行緒進行整個事件的監聽和處理。
我們的主從複製一共分為三步:
master將改變記錄到二進位制日誌(binary log)。這些記錄過程叫做二進位制日誌事件,binary log events。 slave將master的binary log events拷貝到它的中繼日誌(relay log)。 slave重做中繼日誌中的事件,將改變應用到自己的資料庫中。 MySQL複製是非同步的且序列化的。 基本原則
由於主從複製的一些特性,為了保證資料一一致,所以這裡有些原則需要遵守:
- 每個slave只有一個master
- 每個slave只能有一個唯一的伺服器ID
- 每個master可以有多個salve
1.1、環境準備:
-
A伺服器(主伺服器Master):192.0.0.131
-
B伺服器(從伺服器Slave):192.0.0.188
-
主從伺服器的Mysql版本皆為5.6
-
這裡需要注意防火牆的3306埠要開放
-
兩臺伺服器資料庫的資料表結構,配置都必須是一樣的。
1.2、主伺服器設定:
登陸到主伺服器的mysql,並執行如下語句建立使用者,授予許可權:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO slave@"%" IDENTIFIED BY "123456";
複製程式碼
修改my.cnf配置檔案
log-bin=mysql-bin
server-id=1
複製程式碼
說明:
-
- log-bin:開啟二進位制日誌,該日誌是在事務提交時寫日誌檔案的。預設大小是1G,後面加001,002這樣的字尾順加。
-
- server-id,唯一標識主機,mysql主從每個mysql例項配置都不一樣就行。這個值預設是0,如果是0,主伺服器拒絕任何從伺服器的連線。
其他配置(不是必須配置的):
-
1、binlog-do-db=db_001 #配置需要同步的資料庫,可以配置多個,如果沒有此配置項則同步全部。
-
2、binlog-ignore-db=mysql #配置不同步的資料庫,可以配置多個。
-
3、binlog_format = mixed #配置binlog的格式
-
4、read-only = 0 #配置是否只讀 0代表不只讀,1代表只讀
-
5、auto-increament-increment = 10 #用於設定雙主情況下自增列的ID衝突使用的,主要用來設定自增步長
-
6、auto-increment-offset = 1 #表示這臺伺服器的序號,從1開始,不超過auto-increament-increment
重啟資料庫
systemctl restart mysqld.service
複製程式碼
1.3、從伺服器設定:
配置my.cnf
server-id=2
binlog-do-db=db_001
binlog-ignore-db=mysql
skip-slave-start=true
複製程式碼
注意:如果你使用的是虛擬機器,而且從機是從master主機克隆出來的,那麼你就需要進行這一步的操作了。
進入我們mysql的資料庫目錄下:
#這是預設的地址,根據自己配置的datadir即可
cd /var/lib/mysql
vim auto.cnf
複製程式碼
修改裡面的uuid為一個不同的即可。
重啟資料庫
systemctl restart mysqld.service
複製程式碼
1.4、配置從伺服器認主
獲取binlog的資訊
我們先到主(master)伺服器上獲取binlog的資訊,在mysql的命令介面輸入:
show master status;
複製程式碼
這裡展示的就是我們當前主伺服器使用的binlog的檔名,其中position是檔案中偏移量,我們之後配置slave需要用到這些資訊,這個檔案在每次伺服器狀態變化後都不同
進入最關鍵的一步了,在進入從伺服器mysql操作介面後,輸入如下指令:
stop slave; //先停步slave服務執行緒,這個是很重要的,如果不這樣做會造成以下操作不成功,第一次設計主從的話忽略。
複製程式碼
change master to
master_host='192.0.0.131',
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=1472;
複製程式碼
這裡user和password就是我們第一步在主伺服器上建立的使用者名稱和密碼,然後MASTER_LOG_FILE 就是我們上一步檢視到的master在使用的binlog檔案(這個檔案在每次主伺服器狀態變化後都不同),MASTER_LOG_POS 就是binlog的偏移量,用於同步掃描使用。master_log_file對應File, master_log_pos對應Position。Mysql 5.x以上版本已經不支援在配置檔案中指定主伺服器相關選項。
執行完拋警告的話沒關係,沒有異常就可以。
開啟從伺服器slave執行緒
start slave;
複製程式碼
檢視(Slave)狀態
show slave status\G;
複製程式碼
看到圖中的兩個yes,就表示我們的從伺服器已經在完全執行了。
現在我們可以在主伺服器的資料庫上做一個修改資料看看是否同步到從伺服器的資料庫上來證明可用性。
1.5、主從驗證
因為之前資料庫的資料都是一樣的,現在就都新建個test 庫,並且在test 庫新建表 user_test.
這裡需要注意兩個資料庫都要執行
#建立新庫
CREATE DATABASE test;
#指定編碼
CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;
#建立新表
create table user_test( id int comment'ID',name VARCHAR(20) comment'名稱', create_time timestamp DEFAULT now() comment'建立時間' );
複製程式碼
準備條件完成,進入測試
主庫查詢:
從庫查詢:
現在我們在主庫手動插入一條資料
use test;
insert INTO user_test value(1,"張三",NOW());
複製程式碼
直接查詢從庫看有沒有資料同步
結果很明顯,資料已經同步,說明我們的主從複製的配置Ok了。
2、雙機熱備
實現雙機熱備,原理其實就是做兩個機器的互相主從,我們把上述步驟主從對調,然後做一遍就能實現了雙機熱備了
還是使用上面的兩臺伺服器,具體步驟就不寫了,直接貼一下兩個伺服器的配置檔案 my.cnf
伺服器A配置:
log-bin=mysql-bin
server-id=1
# 雙機熱備需要新增
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
複製程式碼
伺服器B配置
log-bin=mysql-bin
server-id=2
# 雙機熱備需要新增
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
複製程式碼
開始測試---------------------------------------------------->
伺服器A 刪除一條,檢視伺服器B的資料
伺服器B 增加一條,刪除一條,檢視伺服器A的資料
結果可以看到互為主從的雙機熱備也成功了,以上只是一個實現思路,具體的配置還得根據自己的實際情況,下面貼一些會用到的配置引數:
-
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:配置從庫上的更新操作是否寫入二進位制檔案,如果這臺從庫,還要做其他從庫的主庫,那麼就需要打這個引數,以便從庫的從庫能夠進行日誌同步。