搭建 MySQL 5.7.19 主從複製,以及複製實現細節分析

搭建 MySQL 5.7.19 主從複製,以及複製實現細節分析

概念

主從複製可使MySQL數據庫主服務器的主數據庫,複製到一個或多個MySQL從服務器從數據庫,默認狀況下,複製異步; 根據配置,能夠複製數據庫中的全部數據庫,選定的數據庫或甚至選定的表。html

MySQL中主從複製的優勢

橫向擴展解決方案 node

在多個從庫之間擴展負載以提升性能。在這種環境中,全部寫入和更新在主庫上進行。可是,讀取可能發生在一個或多個從庫上。該模型能夠提升寫入的性能(因爲主庫專用於更新),同時在多個從庫上讀取,能夠大大提升讀取速度。mysql

數據安全性 sql

因爲主庫數據被複制到從庫,從庫能夠暫停複製過程,能夠在從庫上運行備份服務,而不會破壞對應的主庫數據。數據庫

分析 segmentfault

能夠在主庫上建立實時數據,而信息分析能夠在從庫上進行,而不會影響主服務器的性能。安全

長距離數據分發服務器

可使用複製建立遠程站點使用的數據的本地副本,而無需永久訪問主庫。網絡

1.準備工做

參考 MySQL官網 - 第16章主從複製異步

Mysql版本:MySQL 5.7.19
Master-Server : 192.168.252.123
Slave-Server : 192.168.252.124

關閉防火牆

$ systemctl stop firewalld.service

安裝 MySQL

參考 - CentOs7.3 安裝 MySQL 5.7.19 二進制版本

首先在兩臺機器上裝上,保證正常啓動,可使用

2. Master-Server 配置

修改 my.cnf

配置 Master 以使用基於二進制日誌文件位置的複製,必須啓用二進制日誌記錄並創建惟一的服務器ID,不然則沒法進行主從複製。

中止MySQL服務。

$ service mysql.server stop

開啓binlog ,每臺設置不一樣的 server-id

$ cat /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1

啓動MySQL服務

$ service mysql.server start

登陸MySQL

$ /usr/local/mysql/bin/mysql -uroot -p

建立用戶

每一個從庫使用MySQL用戶名和密碼鏈接到主庫,所以主庫上必須有用戶賬戶,從庫能夠鏈接。任何賬戶均可以用於此操做,只要它已被授予 REPLICATION SLAVE權限。能夠選擇爲每一個從庫建立不一樣的賬戶,或者每一個從庫使用相同賬戶鏈接到主庫

雖然沒必要專門爲複製建立賬戶,但應注意,複製用到的用戶名和密碼會以純文本格式存儲在主信息存儲庫文件或表中 。所以,須要建立一個單獨的賬戶,該賬戶只具備複製過程的權限,以儘量減小對其餘賬戶的危害。

登陸MySQL

$ /usr/local/mysql/bin/mysql -uroot -p
mysql> CREATE USER 'replication'@'192.168.252.124' IDENTIFIED BY 'mima';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.252.124';

3.Slave-Server 配置

修改 my.cnf

中止MySQL服務。

$ service mysql.server stop
$ cat /etc/my.cnf
[mysqld]
server-id=2

若是要設置多個從庫,則每一個從庫的server-id與主庫和其餘從庫設置不一樣的惟一值。

啓動MySQL服務

$ service mysql.server start

登陸MySQL

$ /usr/local/mysql/bin/mysql -uroot -p

配置主庫通訊

查看 Master-Server , binlog File 文件名稱和 Position值位置 而且記下來

mysql>  show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      629 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

要設置從庫與主庫進行通訊,進行復制,使用必要的鏈接信息配置從庫在從庫上執行如下語句
將選項值替換爲與系統相關的實際值

參數格式,請勿執行

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.252.123',
    -> MASTER_USER='replication',
    -> MASTER_PASSWORD='mima',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=629;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

MASTER_LOG_POS=0 寫成0 也是能夠的

放在一行執行方便

CHANGE MASTER TO MASTER_HOST='192.168.252.123', MASTER_USER='replication', MASTER_PASSWORD='mima', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=629;

啓動從服務器複製線程

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

查看複製狀態

mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.252.123
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 629
               Relay_Log_File: master2-relay-bin.000003
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
......

檢查主從複製通訊狀態

Slave_IO_State #從站的當前狀態
Slave_IO_Running: Yes #讀取主程序二進制日誌的I/O線程是否正在運行
Slave_SQL_Running: Yes #執行讀取主服務器中二進制日誌事件的SQL線程是否正在運行。與I/O線程同樣
Seconds_Behind_Master #是否爲0,0就是已經同步了

必須都是 Yes

若是不是緣由主要有如下 4 個方面:

一、網絡不通
二、密碼不對
三、MASTER_LOG_POS 不對 ps
四、mysql 的 auto.cnf server-uuid 同樣(可能你是複製的mysql)

$ find / -name 'auto.cnf'
$ cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=6b831bf3-8ae7-11e7-a178-000c29cb5cbc # 按照這個16進制格式,修改server-uuid,重啓mysql便可

檢查複製狀態

4.測試主從複製

啓動MySQL服務

$ service mysql.server start

登陸MySQL

$ /usr/local/mysql/bin/mysql -uroot -p

在 Master-Server 建立測試庫

mysql> CREATE DATABASE `replication_wwww.ymq.io`;
mysql> use `replication_wwww.ymq.io`;
mysql> CREATE TABLE `sync_test` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

在 Slave-Server 查看是否同步過來

mysql> show databases;
+-------------------------+
| Database                |
+-------------------------+
| information_schema      |
| mysql                   |
| performance_schema      |
| replication_wwww.ymq.io |
| sys                     |
+-------------------------+

mysql> use replication_wwww.ymq.io
mysql> show tables;

+-----------------------------------+
| Tables_in_replication_wwww.ymq.io |
+-----------------------------------+
| sync_test                         |
+-----------------------------------+
1 row in set (0.00 sec)

一些命令

查看主服務器的運行狀態

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1190 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

查看從服務器主機列表

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         2 |      | 3306 |         1 | 6b831bf2-8ae7-11e7-a178-000c29cb5cbc |
+-----------+------+------+-----------+--------------------------------------+

獲取binlog文件列表

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1190 |
+------------------+-----------+

只查看第一個binlog文件的內容

mysql> mysql> show binlog events;
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                                                                                                                                                                  |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.19-log, Binlog ver: 4                                                                                                                                                                 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                                                                                                                                                                                       |
| mysql-bin.000001 | 420 | Anonymous_Gtid |         1 |         485 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                  |
| mysql-bin.000001 | 485 | Query          |         1 |         629 | GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.252.124'                                                                                                                                     |
| mysql-bin.000001 | 629 | Anonymous_Gtid |         1 |         694 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                  |
| mysql-bin.000001 | 694 | Query          |         1 |         847 | CREATE DATABASE `replication_wwww.ymq.io`                                                                                                                                                             |
| mysql-bin.000001 | 847 | Anonymous_Gtid |         1 |         912 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                  |
| mysql-bin.000001 | 912 | Query          |         1 |        1190 | use `replication_wwww.ymq.io`; CREATE TABLE `sync_test` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

查看指定binlog文件的內容

mysql> mysql> show binlog events in 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                                                                                                                                                                  |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.19-log, Binlog ver: 4                                                                                                                                                                 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                                                                                                                                                                                       |
| mysql-bin.000001 | 420 | Anonymous_Gtid |         1 |         485 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                  |
| mysql-bin.000001 | 485 | Query          |         1 |         629 | GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.252.124'                                                                                                                                     |
| mysql-bin.000001 | 629 | Anonymous_Gtid |         1 |         694 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                  |
| mysql-bin.000001 | 694 | Query          |         1 |         847 | CREATE DATABASE `replication_wwww.ymq.io`                                                                                                                                                             |
| mysql-bin.000001 | 847 | Anonymous_Gtid |         1 |         912 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                  |
| mysql-bin.000001 | 912 | Query          |         1 |        1190 | use `replication_wwww.ymq.io`; CREATE TABLE `sync_test` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

啓動從庫複製線程

mysql> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

中止從庫複製線程

mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)

5.複製實現細節分析

MySQL主從複製功能使用三個線程實現一個在主服務器上兩個在從服務器上

1.Binlog轉儲線程。

當從服務器與主服務器鏈接時,主服務器會建立一個線程將二進制日誌內容發送到從服務器。
該線程可使用 語句 SHOW PROCESSLIST(下面有示例介紹) 在服務器 sql 控制檯輸出中標識爲Binlog Dump線程。

二進制日誌轉儲線程獲取服務器上二進制日誌上的鎖,用於讀取要發送到從服務器的每一個事件。一旦事件被讀取,即便在將事件發送到從服務器以前,鎖會被釋放。

2.從服務器I/O線程。

當在從服務器sql 控制檯發出 START SLAVE語句時,從服務器將建立一個I/O線程,該線程鏈接到主服務器,並要求它發送記錄在主服務器上的二進制更新日誌。

從機I/O線程讀取主服務器Binlog Dump線程發送的更新 (參考上面 Binlog轉儲線程 介紹),並將它們複製到本身的本地文件二進制日誌中。

該線程的狀態顯示詳情 Slave_IO_running 在輸出端 使用 命令SHOW SLAVE STATUS

使用\G語句終結符,而不是分號,是爲了,易讀的垂直佈局

這個命令在上面 查看從服務器狀態 用到過

mysql> SHOW SLAVE STATUS\G

3.從服務器SQL線程。

從服務器建立一條SQL線程來讀取由主服務器I/O線程寫入的二級制日誌,並執行其中包含的事件。

在前面的描述中,每一個主/從鏈接有三個線程。主服務器爲每一個當前鏈接的從服務器建立一個二進制日誌轉儲線程,每一個從服務器都有本身的I/O和SQL線程。
從服務器使用兩個線程將讀取更新與主服務器更新事件,並將其執行爲獨立任務。所以,若是語句執行緩慢,則讀取語句的任務不會減慢。

例如,若是從服務器開始幾分鐘沒有運行,或者即便SQL線程遠遠落後,它的I/O線程也能夠從主服務器創建鏈接時,快速獲取全部二進制日誌內容。

若是從服務器在SQL線程執行全部獲取的語句以前中止,則I/O線程至少獲取已經讀取到的內容,以便將語句的安全副本存儲在本身的二級制日誌文件中,準備下次執行主從服務器創建鏈接,繼續同步。

使用命令 SHOW PROCESSLIST\G 能夠查看有關複製的信息

命令 SHOW FULL PROCESSLISTG

在 Master 主服務器 執行的數據示例

mysql>  SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
     Id: 22
   User: repl
   Host: node2:39114
     db: NULL
Command: Binlog Dump
   Time: 4435
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL

Id: 22是Binlog Dump服務鏈接的從站的複製線程
Host: node2:39114 是從服務,主機名 級及端口
State: 信息表示全部更新都已同步發送到從服務器,而且主服務器正在等待更多更新發生。
若是Binlog Dump在主服務器上看不到 線程,意味着主從複製沒有配置成功; 也就是說,沒有從服務器鏈接主服務器。

命令 SHOW PROCESSLISTG

在 Slave 從服務器 ,查看兩個線程的更新狀態

mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
     Id: 6
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 6810
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 7
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 3069
  State: Slave has read all relay log; waiting for more updates
   Info: NULL

Id: 6是與主服務器通訊的I/O線程
Id: 7是正在處理存儲在中繼日誌中的更新的SQL線程

在 運行 SHOW PROCESSLIST 命令時,兩個線程都空閒,等待進一步更新

若是在主服務器上在設置的超時,時間內 Binlog Dump線程沒有活動,則主服務器會和從服務器斷開鏈接。超時取決於的 服務器系統變量 值 net_write_timeout(在停止寫入以前等待塊寫入鏈接的秒數,默認10秒)和 net_retry_count;(若是通訊端口上的讀取或寫入中斷,請在重試次數,默認10次) 設置 服務器系統變量

該SHOW SLAVE STATUS語句提供了有關從服務器上覆制處理的附加信息。請參見 第16.1.7.1節「檢查複製狀態」。

6.更多常見主從複製問題:

常見主從複製問題

Contact

  • 做者:鵬磊
  • 出處:http://www.ymq.io
  • Email:admin@souyunku.com
  • 版權歸做者全部,轉載請註明出處
  • Wechat:關注公衆號,搜雲庫,專一於開發技術的研究與知識分享

關注公衆號-搜雲庫

相關文章
相關標籤/搜索