【手撕】兩數之和
阿新 • • 發佈:2020-12-27
一、主從複製簡介
- 基於二進位制日誌恢復的;
- 主庫的修改操作記錄會記錄二進位制日誌;
- 從庫會請求新的二進位制日誌並回放,最終達到主從資料同步;
- 主從複製核心功能:輔助備份,處理物理損壞;
二、搭建主從複製的過程
1)至少兩臺mysql例項,server_id,server_uuid不同;
2)主庫開啟二進位制日誌功能;
3)建立專用的複製使用者;
4)保證主從開啟之前的某個時間點,從庫資料和主庫是一致的;
5)告知從庫,複製user、password、IP、Port以及複製的起點;
6)從庫開啟從庫模式(start slave);
7)確認執行緒:主庫(dump thread)、從庫(ID thread、SQL thread);
三、主從複製搭建
3.1 環境描述
system | hostname | IP | service |
---|---|---|---|
centos 7.5 | db01 | 192.168.1.1 | mysql 5.7.29(主) |
centos 7.5 | db02 | 192.168.1.2 | mysql 5.7.29(從) |
以上兩臺主機都已經搭建完整MySQL,最初的環境!
3.2 修改MySQL主配置檔案
主庫(192.168.1.1) [root@db01 ~]# vim /etc/my.cnf server_id=1 #指定server—_id,注意server_id是唯一的 log_bin=/usr/local/mysql/data/mysql-bin #開啟二進位制日誌功能,並指定日誌存放路徑及日誌名稱字首 [root@db01 ~]# systemctl restart mysqld #重啟MySQL服務 從庫(192.198.1.2) [root@db02 ~]# vim /etc/my.cnf server_id=2 #切記不可和主庫進行衝突 [root@db02 ~]# systemctl restart mysqld
3.3 主庫中建立複製專用使用者
[root@db01 ~]# mysql -uroot -p123
mysql> grant replication slave on *.* to test@'192.168.1.%' identified by '123';
3.4 備份主庫並恢復到從庫
[root@db01 ~]# mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E --triggers > /opt/full.sql #對主庫進行全庫備份 [root@db01 ~]# scp /opt/full.sql root@db02:/root #將sql指令碼傳到從庫上 [root@db02 ~]# mysql -uroot -p123 < full.sql #從庫匯入指令碼 [root@db02 ~]# grep "\-- CHANGE MASTER TO" full.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1310; #從匯入的指令碼中獲取同步日誌的起點資訊
3.5 告知從庫複製資訊並開啟專用執行緒
[root@db02 ~]# mysql -uroot -p123
mysql> help change master to
#如果忘記這條命令建議使用help的方式獲取命令格式
mysql> change master to
master_host='192.168.1.1', #主庫的IP地址
master_user='repl', #專用複製的使用者名稱
master_password='123', #使用者對應的密碼
master_port=3306, #主庫資料庫監聽的埠
master_log_file='mysql-bin.000001', #同步主庫的日誌檔案
master_log_pos=1310, #日誌中的起點位置
master_connect_retry=10; #如果連線失敗重試次數
mysql> start slave; #開啟從庫專用執行緒
3.6 檢查執行緒狀態
mysql> show slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#確保IO執行緒、SQL執行緒是開啟的狀態
3.7 驗證主從複製
[root@db01 ~]# mysql -uroot -p123
mysql> create database test01 charset utf8mb4;
mysql> use test01
mysql> create table t1(id int);
mysql> insert into t1 values (100),(200),(300);
mysql> select * from t1;
+------+
| id |
+------+
| 100 |
| 200 |
| 300 |
+------+
#主庫插入資料
[root@db02 ~]# mysql -uroot -p123 -e 'select * from test.t1;'
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 11 |
| 12 |
| 13 |
+------+
#該資料是通過匯入SQL指令碼實現的
[root@db02 ~]# mysql -uroot -p123 -e 'select * from test01.t1;'
+------+
| id |
+------+
| 100 |
| 200 |
| 300 |
+------+
#該資料是通過主從複製得到的
#從庫驗證資料
至此MySQL主從已經搭建完成!
四、主從複製原理
4.1 主從複製中涉及到的檔案和執行緒
1)執行緒
主庫:dump thread
從庫:io thread、sql thread
2)檔案
主庫:
二進位制日誌檔案(mysql-bin.000001)
從庫:
中繼日誌檔案(db02-relay-bin.000001)
主庫資訊記錄檔案(master.info)
記錄中繼日誌檔案中應用情況資訊(relay-log.info)
4.2 主從複製原理
主從複製原理圖:
主從複製過程:
1)change master to 時,ip port user password binlog position寫入到master.info進行記錄;
2)start slave 時,從庫會啟動IO執行緒和SQL執行緒;
3)從庫IO執行緒,讀取master.info資訊,獲取主庫資訊連線主庫;
4)主庫會生成一個準備DUMP執行緒,來響應從庫;
5)從庫IO執行緒根據master.info記錄的binlog檔名和position號,請求主庫DUMP執行緒最新日誌資訊;
6)主庫DUMP執行緒檢查主庫的binlog日誌,如果有新的,DUMP執行緒會將新的日誌檔案傳送給從庫的IO執行緒;
7)從庫的IO執行緒將收到的日誌儲存到了TCP/IP 快取,立即返回ACK給主庫 ,主庫工作完成;
8)從庫IO執行緒將快取中的資料,儲存到relay-log日誌檔案,更新master.info檔案binlog 檔名和postion,從庫IO執行緒工作完成;
9)從庫SQL執行緒讀取relay-log.info檔案,獲取到上次執行到的relay-log的位置,作為起點,回放relay-log(寫入從庫日誌檔案中);
10)從庫SQL執行緒回放完成之後,會更新relay-log.info檔案;
細節:
1)主庫一旦有新的日誌生成,會發送“訊號”給dump執行緒,從庫IO執行緒再進行請求;
2) 從庫relay-log會有自動清理的功能;
五、主從複製監控、分析、處理
主庫方面
mysql> show processlist; #檢視執行緒列表
+----+------+------------+------+-------------+------+---------------------------------------------------------------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+------------+------+-------------+------+---------------------------------------------------------------+-----------------------+
| 6 | repl | db02:59320 | NULL | Binlog Dump | 3801 | Master has sent all binlog to slave; waiting for more updates | NULL |
| 8 | root | localhost | NULL | Query | 0 | starting | show full processlist |
+----+------+------------+------+-------------+------+---------------------------------------------------------------+-----------------------+
#每個從庫都會有一行dump相關的資訊
#如果顯示非以上資訊,說明主從之間的關係出現了問題
#顯示的兩行資訊,第一行是從庫,第二行是主庫資訊
mysql> show slave hosts; #檢視從庫主機
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 2 | | 3306 | 1 | b91d331a-7d83-11ea-8ec1-000c29b71bbd |
+-----------+------+------+-----------+--------------------------------------+
從庫方面
mysql> show slave status \G
#主庫的資訊,來自於master.info檔案
Master_Host: 192.168.1.1
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1924
#從庫relay-log的執行情況,來自於relay.info檔案,一般用於判斷主從延遲
Relay_Log_File: db02-relay-bin.000002
Relay_Log_Pos: 934
Relay_Master_Log_File: mysql-bin.000001
#已經執行到主庫的位置資訊
Exec_Master_Log_Pos: 1924
#落後主庫多少秒
Seconds_Behind_Master: 0
#從庫的執行緒狀態,具體報錯資訊看後四行
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
#過濾複製相關資訊
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
#延遲從庫的配置資訊
SQL_Delay: 0
SQL_Remaining_Delay: NULL
#GTID相關複製資訊
Retrieved_Gtid_Set:
Executed_Gtid_Set: