一、概述
模式:
主從複製,主庫寫入數據,從庫同步主庫數據,從庫保持與主庫內容一致,達到實施備份的效果。
優勢:
- 數據分佈(data distribution)
- 負載平衡(load balancing),實現讀寫分離,緩解數據庫壓力。
- 數據備份(backup)
- 高可用性與容錯行(high availability and failover)
原理圖如下:
功能:
- BinLog:二進制文件,存儲MasterDB(主數據庫)中修改數據的內容,存儲內容的格式有Statement,Row,Mixed。
- Relay Log:功能作用與Binlog一樣,不同點在於當日志內的內容被讀取完後,會被刪除。
- Binlog dump:將讀取Binlog後發送數據給IO線程。
- IO線程:將接收到數據傳給RelayLog日誌。
- SQL線程:讀取RelayLog數據。
流程:
- 從庫,配置主庫信息,建立連接。
- MasterDB數據庫數據發生變化時,會記錄在Binlog日誌中。
- Binlog dump線程讀取Binlog中的內容,將數據發送給IO線程。
- IO線程再將數據存入RelayLog中。
- SQL線程讀取RelayLog中的數據並寫入從庫。
二、安裝和配置
2.1 環境說明
提示:主從庫的數據庫版本最好保持一致,或者,從庫的版本一定要高於主庫版本,否則在數據同步過程中可能會出現問題,切記。
這裏使用測試環境來記錄。
Master(主數據庫)環境:
- 機器:物理機
- 網絡:固定IP
- 系統:Windows 7
- IP:192.168.2.166
- 子網掩碼:255.255.255.0
- 默認網關:192.168.2.1
- DNS1:202.100.199.8
- DNS2:202.100.192.68
- 數據庫版本:MySQL 5.7.19
Slave(從數據庫)環境:
- 機器:從宿主機器建立Esxi環境,在Esxi下建立Centos系統。
- 網絡:1.Esxi 網絡橋接 2.Centos 網絡橋接
- 系統:虛擬機 Linux Centos 7
- IP:192.168.2.110
- 子網掩碼:255.255.255.0
- 默認網關:192.168.2.1
- DNS1:202.100.199.8
- DNS2:202.100.192.68
- 數據庫版本:MySQL 5.7.30
環境測試:
要求:IP互通,端口互通
Windows:
- ping 192.168.2.110
- telnet 192.168.2.110 3306
Centos:
- ping 192.168.2.166
- telnet 192.168.2.166 3306 或 wget 192.168.2.166:3306 或 curl 192.168.2.166 3306
2.2 配置主數據庫(Master)
1.修改【主數據庫】配置文件,Windows 下默認配置文件(my.ini)路徑可以通過服務裏面查詢。
2.修改my.ini配置文件,找到以下2行代碼取消註釋並修改。
- Master(主數據庫)192.168.2.166
[mysqld]
# 啓用二進制日誌,可指定指定路徑和名稱
log-bin=mysql-bin
# 服務唯一ID,默認是1,一般取IP最後一段,如IP:192.168.2.166
server-id=166
3.重啓數據庫服務。
4.進入到主數據庫中,創建從數據庫的操作用戶賬號和權限。
# 1.登錄
mysql -uroot -p
# 2.創建用戶並授權 REPLICATION SLAVE ,用戶:backup-user,密碼:backup-user,授權IP:192.168.2.110(從數據庫IP)
grant replication slave on *.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';
# 3.刷新權限
flush privileges;
# 4.查詢用戶表
select user,host from mysql.user;
5.清除日誌索引文件,用於第1次搭建主從環境。
reset master;
6.查詢 master 狀態。
show master status\G;
- File:mysql-bin.000001
- Position:154
2.3 配置從數據庫(Slave)
1.修改my.ini配置文件(Linux下,執行 vim /etc/my.cnf),添加以下2行代碼。
- Slave(從數據庫)192.168.2.110
[mysqld]
# 啓用二進制日誌,可指定指定路徑和名稱
log-bin=mysql-bin
# 服務唯一ID,默認是1,一般取IP最後一段,如IP:192.168.2.110
server-id=110
# 複製進程不隨MySQL啓動而啓動,設置後重啓數據庫後需要手動啓動複製進程,即start slave
skip-slave-start=on
# 同步的數據庫名稱
replicate_wild_do_table=test_db.*
3.重啓數據庫服務。(systemctl restart mysqld.service)
4.修改從數據庫的master鏈接配置。
- MASTER_HOST='192.168.2.166' # 連接主機地址
- MASTER_USER='backup_user' # 連接主機賬號
- MASTER_PASSWORD='backup_user' # 連接主機賬號密碼
- MASTER_LOG_FILE='mysql-bin.000001' # 日誌文件-通過查詢主數據庫master狀態取得
- MASTER_LOG_POS=154 # 日誌文件起始位置-通過查詢主數據庫master狀態取得
# 1.修改master信息
CHANGE MASTER TO MASTER_HOST='192.168.2.166',MASTER_USER='backup_user',MASTER_PASSWORD='backup_user',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
# 2.開啓
start slave;
# 3.查詢狀態
show slave status\G;
以下兩行代碼都顯示yes代表已經配置成功。
- Slave_IO_Running:Yes
- Slave_SQL_Running:Yes
2.4 同步數據庫
1.如沒有舊的數據庫需要同步,則可以直接使用。如主數據庫上,有舊的數據庫需要同步,則要進行鎖表操作,防止對數據庫進行讀寫改變日誌索引文件的位置值,將主數據庫上的數據庫導入從數據庫後再進行解鎖。
flush tables with read lock;
2.將需要同步的數據庫導出(可使用mysql命令或其他工具均可,如:Navicat等)。
3.導入從數據庫後,在主數據庫上,進行解鎖操作。
unlock tables;
4.這裏直接使用Navicat將表同步過去。
三、測試
注意:啓動從數據庫同步命令以前建立的數據庫是不會同步的,如需要同步舊的數據庫,看2.4步驟,這裏直接使用新增表操作來演示。
- 在主數據庫上(192.168.2.166),新建 Article 表,新增1條數據。
- 刷新從數據庫(192.168.2.110),可以看到從數據庫已經同步了。
四、要點說明和場景應用(其它)
4.1 從庫解除主從關係
場景:從庫解除主從關係,提升從庫爲主庫進行使用或重置主從關係和日誌文件。
1.在從庫數據庫命令行中,先停止主從關係進程。
stop slave
2.再使用以下命令,清除主從複製關係的位置信息。該語句將被用於乾淨的啓動,它刪除 master.info 文件和 relay-log.info 文件以及所有的 relay log 文件並重新啓用一個新的 relaylog 文件。
reset slave
3.查詢狀態
show slave status\G;
4.修改 my.cnf 刪除主從相關配置參數。
4.2 skip-slave-start 使從數據庫複製進程不隨從數據庫啓動而啓動
場景:從數據庫重啓時,確保手動啓動從數據庫複製進程是正常的,我們一般在從數據庫配置文件中加入 skip-slave-start=on 參數配置,查詢相關配置是否正確(主數據庫 show master status\G; 的 File 和 Position 值正確爲前提),從數據庫重啓完成後,先檢查主數據庫值,再手動去啓動複製進程 start slave。
4.3 指定同步數據庫
第1種,在主數據庫中進行 grant 用戶授權時,限定用戶可操作的數據庫。
# 統一格式
grant 權限1,權限2,... on 數據庫名稱.表名稱 to '用戶名'@'授權地址' identified by '用戶密碼';
# 栗子:創建並授權本地 root用戶 全部數據庫 全部權限
grant all privileges on *.* to 'root'@'localhost' identified by 'root';
# 栗子:創建並授權192.168.2.110地址 test_user用戶 test_db數據庫 select,insert權限
grant select,insert on test_db.* to 'test_user'@'192.168.2.110' identified by 'test_user';
# 栗子:創建並授權192.168.2.110地址 test_user用戶 test_db數據庫 user數據表 select,insert權限
grant select,insert on test_db.user to 'test_user'@'192.168.2.110' identified by 'test_user';
# 栗子:創建並授權192.168.2.110地址 backup_user用戶 test_db數據庫 replication slave權限
grant replication slave on test_db.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';
第2種,在主數據庫配置文件中(my.ini、my.cnf),設置以下規則參數,從數據庫中不做限制。
- 不建議使用:binlog_do_db=DB_NAME(需要同步的數據庫,1.如需同步全部數據庫,則不需要設置;2.多個數據庫,用逗號分開)
- 不建議使用:binlog_ignore_db=DB_NAME(需要忽略的數據庫,搭配使用)
第3種,在從數據庫配置文件中(my.ini、my.cnf),設置以下規則參數,主數據庫中不做限制。
- 不建議使用:replicate_do_db=DB_NAME(需要同步的數據庫,1.如需同步全部數據庫,則不需要設置;2.多個數據庫,用逗號分開)
- 不建議使用:replicate_ignore_db=DB_NAME(需要忽略的數據庫,搭配使用)
- 不建議使用:replicate_do_table=DB_NAME.TABLE_NAME(需要同步的數據表,1.如需同步全部數據表,則不需要設置;2.多個數據表,用逗號分開)
- 不建議使用:replicate_igore_table=DB_NAME.TABLE_NAME(需要忽略的數據表,搭配使用)
- 建議使用:replicate_wild_do_table=DB_NAME.TABLE_NAME(可解決跨庫和過濾問題,需要同步的數據表,全部表:DB_NAME.%)
- 建議使用:replicate_wild_ignore_table=DB_NAME.TABLE_NAME(可解決跨庫和過濾問題,需要忽略的數據表,全部表:DB_NAME.%)
五、參考文章
- https://blog.csdn.net/Yoga0301/article/details/80545914?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare
- https://blog.csdn.net/kjsayn/article/details/51350691?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare
- https://blog.csdn.net/donghaixiaolongwang/article/details/78591012