1. 程式人生 > >MySQL主從搭建

MySQL主從搭建

1.10 end break ins log-bin letter 寫入 完整性 font

MySQL主從搭建

環境準備

mysql安裝

省略

架構圖

技術分享圖片

異步復制

1.確保2臺服務器已安裝相同版本的mysql
2.在主庫上,設置一個復制使用的賬戶,並授予 REPLICATION SLAVE權限。這裏創建一個復制用戶repl,可以從IP為192.168.1.109(從庫)的主機進行連接:
命令文本:GRANT REPLICATION SLAVE ON . To ‘rep1‘@‘192.168.1.109‘ IDENTIFIED BY ‘1234test‘;
3.修改主數據庫服務器的配置文件 my.cnf,開啟 BINLOG,並設置 server-id的值。這兩個參數的修改需要重新啟動數據庫服務才可以生效
技術分享圖片


[mysqld]
log-bin=/data/ mysql/log/mysql-bin. log
server-id= 1
註意:如果mysql目錄下無log目錄,請先創建log目錄
4.然後得到主庫上當前的二進制日誌名和偏移量值。這個操作的目的是為了在從數據庫啟動以後,從這個點開始進行數據的恢復.
執行show master status:
技術分享圖片
5.修改從數據庫的配置文件 my.cnf,增加 server-id參數。註意 server-id的值必須是唯一的,不能和主數據庫的配置相同,如果有多個從數據庫服務器,每個從數據庫服務器必須有自己唯一的 server-id值。
在 mycnf中修改如下:
[mysqld]
server-id=2
6.在從庫上,使用 - -skip-slave- start選項啟動從數據庫,這樣不會立即啟動從數據庫服務上的復制進程,方便我們對從數據庫的服務進行進一步的配置:
操作命令:./bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-slave-start
7.對從數據庫服務器做相應設置,指定復制使用的用戶,主數據庫服務器的IP、端口
以及開始執行復制的日誌文件和位置等,參考代碼如下:
CHANGE MASTER TO MASTER_HOST=‘192.168.1.104‘,MASTER_PORT=3306,MASTER_USER=‘rep1‘,MASTER_PASSWORD=‘1234test‘ ,MASTER_LOG_FILE=‘mysql-bin.000001‘,MASTER_LOG_POS=120;
8.在從庫上,啟動 slave線程:
技術分享圖片

9.這時slave上執行 show processlist命令將顯示類似如下的進程:
技術分享圖片
10.執行show slave status;將顯示:
技術分享圖片
11.在master上執行 show processlist命令將顯示類似如下的進程:
技術分享圖片
12.測試
在主庫上建一個test1數據庫,發現在從庫上也出現了,在主庫test1上建area表,發現在從庫上也出現了,在從庫上建t_user表,發現主庫上沒有t_user,由此可以發現主從模式搭建完成。
技術分享圖片
技術分享圖片

半同步復制

在 MySQL5.5之前, MySQL的復制是異步操作,主庫和從庫的數據之間存在一定的延遲,這樣存在一個隱患:當在主庫上寫人一個事務並提交成功,而從庫尚未得到主庫推送的 Binlog日誌時,主庫宕機了,例如主庫可能因磁盤損壞、內存故障等造成主庫上該事務 Binlog丟失,此時從庫就可能損失這個事務,從而造成主從不一致。
而半同步復制,是等待其中一個從庫也接收到Binlog事務並成功寫入Relay Log之後,才返回Commit操作成功給客戶端;如此半同步就保證了事務成功提交後至少有兩份日誌記錄,一份在主庫Binlog上,另一份在從庫的Relay Log上,從而進一步保證數據完整性;半同步復制很大程度取決於主從網絡RTT(往返時延),以插件 semisync_master/semisync_slave 形式存在。
1.首先,判斷 MySQL服務器是否支持動態增加插件:
mysql> select @@have_dynamic_loading;
技術分享圖片


2.確認支持動態增加插件後,檢查 MySQL的安裝目錄下是否存在插件:
技術分享圖片
安裝插件:
在主庫上安裝插件semisync_master.so:
mysql> install plugin rpl_semi_sync_master SONAME ‘semisync_master.so‘;
從庫上則安裝 semisync_slave.so插件:
mysql> install plugin rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;
安裝完成後,從 plugin表中能夠看到剛才安裝的插件
mysql> select * from mysql.plugin;
從庫:
技術分享圖片
主庫:
技術分享圖片
3.需要分別在主庫和從庫上配置參數打開半同步semi-sync,默認半同步設置是不打開的,主庫上配置全局參數:
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_master_timeout=30000;
執行:show variables like ‘%rpl_semi%‘;
技術分享圖片
從庫上一樣配置全局參數:
mysql> set global rpl_semi_sync_slave_enabled=1;
執行:show variables like ‘%rpl_semi%‘;
技術分享圖片
註意,由於之前配置的復制是異步復制,所以要重啟一下從庫上的I/O線程(如果是全新配置的半同步復制則不需要):
mysql> stop slave io_thread;
mysql>start slave io_thread;
技術分享圖片
4.至此半同步配置完畢,下面可以來驗證一下。主庫上通過show status命令能夠看到當前半同步復制的一些狀態值:
mysql>show status like ‘%semi_sync%‘;
技術分享圖片
著重關註以下3個狀態值:
Rpl_semi_sync_master_status:值為ON,表示半同步復制目前處於打開狀態。
Rpl_semi_sync_master_yes_tx:值為0,表示主庫當前尚未有任何一個事務時通過半同步復制到從庫。
Rpl_semi_sync_master_no_tx: 值為0,表示當前有0個事務不是通過半同步模式下從庫及時響應的(記住只給值,後面有對比)。
5.執行一個事務,再檢查一下:
技術分享圖片
此時會發現Rpl_semi_sync_master_yes_tx值變為3,即剛才的create 和 insert事務通過半同步復制到從庫上了
Rpl_semi_sync_master_yes_tx 基數增加到3,到從庫上確認一下:
技術分享圖片
6.再嘗試一下網絡異常的場景下,主庫等待rpl_semi_sync_master_timeout毫秒超時後,自動轉成異步復制的場景。
7.首先,在主庫上確認半同步會等待30秒超時;
技術分享圖片
8.停掉從庫服務
9.在主庫上執行一個事務並提交(默認提交即可),主庫上的提交操作會被阻塞30秒:
delete from emp where emp_id=2;
10: 檢查半同步的狀態值
技術分享圖片
Rpl_semi_sync_master_status | OFF 半同步復制目前處於關閉狀態。
Rpl_semi_sync_master_yes_tx | 3 剛才並沒有通過半同步復制完成,所以半同步並沒有累加
Rpl_semi_sync_master_no_tx | 1 當前有1個事務不是通過半同步模式下從庫及時響應的
11:再執行一條sql:
insert into emp values(3,‘cat‘);
技術分享圖片
此時執行時間很快,說明網絡異常的場景下,主庫等待rpl_semi_sync_master_timeout毫秒超時後,自動轉成異步復制的場景。
12:再次檢查半同步的狀態值
技術分享圖片
Rpl_semi_sync_master_status | OFF 半同步復制目前處於關閉狀態。
Rpl_semi_sync_master_yes_tx | 3 剛才並沒有通過半同步復制完成,所以半同步並沒有累加
Rpl_semi_sync_master_no_tx | 2 當前有2個事務不是通過半同步模式下從庫及時響應的
13:恢復從庫,確認是否會自動切換回半同步復制模式。
檢查從庫的狀態:
技術分享圖片
從庫恢復需要註意:需要啟動slave線程,開啟半同步
start slave;
set global rpl_semi_sync_slave_enabled=1;
註意啟動順序
如果先執行開啟半同步,則需要重新啟動I/O線程
mysql> stop slave io_thread;
mysql>start slave io_thread;
如果沒有開啟半同步,在向主庫插入數據,從庫仍然可以同步到數據,說明此時並非是半同步模式,而是異步模式
14.檢查主庫半同步復制狀態值
技術分享圖片
Rpl_semi_sync_master_status 值自動由OFF變為 | ON ,說明主庫檢測到正常以後主庫到從庫的復制方式自動切換為半同步方式
15.在主庫上做個測試
insert into emp values(5,‘bob‘);
技術分享圖片
提交一個事務後,Rpl_semi_sync_master_yes_tx 由3變為4,確認剛才事務是半同步復制。

MySQL主從搭建