1. 程式人生 > 實用技巧 >【手撕】兩數之和

【手撕】兩數之和

一、主從複製簡介

  • 基於二進位制日誌恢復的;
  • 主庫的修改操作記錄會記錄二進位制日誌;
  • 從庫會請求新的二進位制日誌並回放,最終達到主從資料同步;
  • 主從複製核心功能:輔助備份,處理物理損壞;

二、搭建主從複製的過程

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: