主從復制原理
MySQL資料庫的主從復制方案,是其自帶的功能,并且 主從復制并不是復制磁盤上的資料庫檔案,而是通過binlog 日志復制到需要同步的從服務器上,
MySQL資料庫支持單向、雙向、鏈式級聯等不同業務場景的復制,在復制的程序中,一臺服務器當主服務器(Master),接收來自用戶的內容更新,而一個或多個其它的服務器來當從服務器(Slaver),接收來自Master上binlog檔案的的日志內容,決議出SQL,重新更新到Slave,使得主從服務器的資料達到一致,
主從復制的邏輯有以下幾種:
一主一從:單向主從同步模式,只能在Master端寫入資料
一主多從:單向主從同步模式,只能在Master端寫入資料

主主同步:此架構可以在Master1或Master2進行資料寫入,或者兩端同時寫入(需特殊配置)

在生產環境中,MySQL主從復制都是異步的復制方式,既不是嚴格的實時復制,但是給用戶的體驗都是實時的,
.
MySQL主從復制集群功能使得MySQL資料庫支持大規模高并發讀寫成為可能,并有效的保護了服務器宕機的資料備份,
利用復制功能,當Master服務器出現問題時,我們可以人工的切換到從服務器繼續提供服務,此時服務器的資料和宕機時的資料幾乎完全一致,
.
服務功能也可用作資料備份,但是如果人為的執行drop、delete等陳述句洗掉,那么從看庫的備份功能也就失效了,
主從機制實作原理

- master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志時間,binary log events);
- slave將master的binary log events拷貝到它的中繼日志(relay log);
- slave重做中繼日志中的事件,將改變反映到它自己的庫中,
開始搭建主從復制
主服務器配置
開始修改組態檔
.
修改組態檔/etc/my.cnf,在[mysqld]配置下增加兩項配置:server-id=1,log-bin=mysql-bin,
- server-id=1: 是服務器的唯一標示(主從服務器之間必須不同),
- log-bin=mysql-bin: 啟用二進制日志,并指定日志名稱為mysql-bin,
- 保存退出后重啟服務:
systemctl restart mysql

開始創建授權復制用戶
# 創建復制用戶
MariaDB [(none)]> create user '用戶名' identified by '密碼';
Query OK, 0 rows affected (0.01 sec)
# 授權復制用戶
MariaDB [(none)]> grant replication slave on *.* to '用戶名;
Query OK, 0 rows affected (0.00 sec)
# 重繪授權表,使其立即生效
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
開始備份資料
# 鎖表
MariaDB [(none)]> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)
# 打開新視窗,匯出所有資料并傳至從服務器
[root@master ~]# mysqldump -uroot -p --all-databases > all_db.sql
[root@master ~]# scp all_db.sql 192.168.43.71:/root/
#ip地址是從服務器的地址 把all_db.sql檔案復制到從服務器root檔案夾下
# 查看二進制日志檔案和當前的位置并記錄
# File是二進制日志檔案名,Position是日志的當前位置
# 強調:記住File與Position的值,從服務器中會用到
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 567 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
# 解鎖
# 這一步驟應在主從服務器均配置完畢,可實作資料同步后,再解鎖
MariaDB [(none)]> unlock tables;
Query OK, 0 rows affected (0.00 sec)
從服務器配置
開始修改組態檔
.
修改組態檔/etc/my.cnf,在[mysqld]配置下增加此配置:server-id=2,
- server-id=2: 是服務器的唯一標示(主從服務器之間必須不同),
- 這里與主服務器不一樣,不可開啟
bin-log, - 保存退出后重啟服務:
systemctl restart mysql
匯入主庫傳過來的備份檔案
[root@slave ~]# mysql -uroot -p < all_db.sql
開始配置復制引數
# 查詢從庫資訊
MariaDB [(none)]> show variables like 'server_id';
MariaDB [(none)]> show variables like 'log_bin';
# 配置復制引數
MariaDB [(none)]> change master to
-> master_host='192.168.43.149', # 指定主庫的ip
-> master_user='tom', # 指定主庫創建遠程用戶名
-> master_password='user@tom', # 指定主庫創建遠程用戶密碼
-> master_log_file='mysql-bin.000001', # 指定二進制日志檔案
-> master_log_pos=567; # 指定二進制日志的當前位置
Query OK, 0 rows affected (0.02 sec)
# 啟動從庫同步
MariaDB [(none)]> start slave;
# 檢查復制狀態,詳見下圖
MariaDB [(none)]> show slave status\G;
檢查主從復制是否成功的關鍵在于:

這兩項都是yes,說明主從復制配置成功,
附:
此時還未配置從庫的只讀模式,只需在從服務器的組態檔中的[mysqld]配置下增加read-only=true,并且在從服務器上創建普通用戶,使用普通用戶主從同步即可達到只讀的效果,
注意一個坑:如果使用root用戶,則無法達到只讀的效果,超級用戶root不受只讀限制,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/238047.html
標籤:其他
上一篇:微服務架構誕生的今世前生大揭秘
