對於MySQL還是個新手, 對一些的底層的東西缺乏理解,只是從業務角度去理解, 希望數據能夠達到一個什麼樣的效果(更安全, 更快速)。
其中MySQL自帶的複製機制是比較不錯的選擇, 可以保證數據的安全, 同時又不需要人工干預。複製分爲異步和半同步兩種機制, 半同步需要安裝插件。
主從複製搭建過程
異步複製配置
1. 準備兩個相同版本的MySQL(5.6)數據庫, 建議安裝在兩臺機器(CentOS 6.7)上
例:
主數據庫IP:172.22.1.152
從數據庫IP:172.22.1.153
主數據庫設置
2. 在主數據庫, 創建一個複製使用的賬戶,負責將數據從主數據庫複製到從數據庫.
授予REPLICATION SLAVE權限, 這裏使用用戶名: repl, 密碼: Aa12345
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.22.1.153' identified by 'Aa12345' with grant option;
或者直接通過可視化工具創建用戶, 如下圖
3. 配置主數據庫my.cnf, 開啓BINLOG, 並設置sever-id的值, 主從server-id的值必須是不一樣的
#Master configuration-defaults
server-id=1
log_bin=mysql-bin #啓動MySQ二進制日誌系統,注意:如果原來的配置文件中已經有這一行,就不用再添加了
expire_logs_days = 10 #二進制日誌自動刪除的天數。默認值爲0, 表示"沒有自動刪除".
#下面兩個屬性在半同步配置的時候會用到, 如果沒有安裝同步插件, 建議不要開啓
#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=30000
4. 在主庫上, 設置讀鎖定有效, 這個操作是爲了確保沒有數據庫操作, 以便獲得一個一致性的快照
如果可以確定主數據庫沒有讀寫操作, 可以不執行當前步驟
mysql> flush tables with read lock;
5. 從當前主庫獲得二進制日誌名和偏移量值. 這個操作的目的是爲了在從數據庫啓動以後, 從這個點開始進行數據的恢復.
mysql> show master status;
6. 備份主數據庫, 恢復到從數據庫, 這也是需要步驟4,5的原因
7. 主數據庫備份完畢後, 恢復寫操作
mysql> unlock tables;
從數據庫設置
8. 配置從數據庫my.cnf, 設置sever-id的值, 主從server-id的值必須是不一樣的
#Slave configuration-defaultsserver-id=2 #設置服務器id,爲2表示從服務器,注意:如果原來的配置文件中是否已經有這一行.
expire_logs_days = 15 #二進制日誌自動刪除的天數。默認值爲0,表示"沒有自動刪除".
slave_skip_errors=1032,1396,1062 #忽略sql執行錯誤
relay_log_recovery = 1 #從庫開啓中繼日誌relay-log自我修復
slave_parallel_type='logical_clock'; #基於邏輯時鐘的方式支持多線程複製
slave_parallel_workers=4; #設置併發處理的線程數
#rpl_semi_sync_slave_enabled=1
9. 在從庫上, 使用--skip-slave-start選項啓動從數據庫, 這樣不會立即啓動從數據庫服務項目上的複製進程,方便我們對從數據庫的服務進行進一步的配置.
需要的時候再考慮這一步吧
10. 對從數據庫服務器做相應設置, 指定複製使用的用戶, 主數據庫服務器的IP, 用戶名密碼, 以後第5步中的日誌名和偏移量值
mysql> change master to master_host='172.22.1.152',master_user='repl',master_password='Aa12345',master_log_file='mysql-bin.000002' ,master_log_pos=3688;
11. 啓動關閉slave線程
mysql> start/stop slave;
12. 從服務器查看同步服務是否正常啓動
mysql> show processlist
結果中顯示上述, 表明slave已經連接上master, 並開始接受並執行日誌
13. 添加新數據, 或者創建新表檢查數據是否正常同步
MySQL通過引入sync_binlog參數來控制Binlog刷新到磁盤的頻率:
mysql> SHOW VARIABLES LIKE '%sync_binlog%'
在默認情況下, sync_binglog=0表示MySQL不控制Binlog的刷新, 由文件系統自己控制文件系統的緩存的刷新.
如果sync_binlog>0, 則表示每sync_binlog次事務提交, MySQL調用文件系統的刷新操作將Binlog刷到磁盤. 比如: sync_binlog=1, 表示每一次事務提交,MySQL都需要把 binlog刷新到磁盤,如果主機故障, 系統最多損失一最近一個事務的數據。同時也因爲頻率的刷新, 對I/O帶來很大的壓力
故障判斷:
通常從服務器沒有成功從主庫同步到數據,都是SQL執行出錯,日誌同步一般有錯, 這種情況排除錯誤, 然後重啓slave就可以。
mysql >show slave status;
例如: Slave_IO_Running, Slave_SQL_Running, Last_SQL_Errno
半同步複製
在半同步複製中, 爲了保證主庫上的每一個binlog事務都能夠被可靠的複製到從庫上,主庫在每次事務成功提交時, 並不及時反饋給前端應用用戶,而是等待其中之一個從庫也接收到Binlog事務併成功寫入中繼日誌後, 主庫才返回Commit操作成功給客戶端。如果同步出現故障, 則MySQL自動調整複製爲異步模式,事務正常返回提交結果給客戶端。半同步服務需要安裝插件.
1. 首先判斷MySQL服務器是否支持動態增加插件
mysql> select @@have_dynamic_loading
顯示:
2. 確認支持動態增加插件後,檢查MySQL的安裝目錄下是否存在插件semisync_master.so和semisync_slave.so
mysql> show variables like 'plugin_dir'; #查看插件存入地址
在主庫上安裝插件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'
安裝完成以後, 可以在pluging表中能夠看到剛纔安裝的插件:
mysql> select * from mysql.plugin;
3. 分別配置主從數據庫my.cnf, 打開半同步semi-sync
主庫my.cnf
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=30000
從庫my.cnf
rpl_semi_sync_slave_enabled=1
至此半同步配置完畢,下面可以通過命令來驗證:
msyql> show status like '%semi_sync%'
mysql> show variables like '%Rpl%'