MySQL主從搭建圖文解析及原理

/ 前言 /

      隨着用戶的增長, 性能和穩定變得越來越重要, 爲了不讓其成爲系統的約束, 於是大家開始追求高可用, 而MySQL的主從就是爲了解決單一MySQL服務不穩定而誕生, 也可作爲MySQL讀寫分離的基石, 主從的配置使我們不再需要擔心夜裏數據庫突然宕機~.~
      本文主要內容有

MySQL主從配置圖文講解
MySQL主從配置原理
清除MySQL主從關係
Shell腳本實現MySQL主從自動化配置

      如還未完成MySQL的安裝, 可以參考我之前的博文Centos7安裝MySQL5.7圖文解析 (附MySQL安裝包官網地址及MySQL5.7安裝手冊)

      如果要做自動化配置可以看我的博文Shell腳本實現MySQL主從自動化配置

/ 1 / MySQL主從配置準備事項

  • 倆臺有MySQL服務的Linux服務器
  • Master-Server(主服務) : 192.168.232.134
  • Slave-Server(從服務) : 192.168.232.135
  • Master與Slave互相可以ping通

/ 2 / Master-Server配置

2 . 1 修改Master配置文件

關閉MySQl服務

service mysqld stop

編輯my.cnf文件

$ vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

開啓binlog、新增server-id

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

log-bin=mysql-bin
# 注意, server-id在同一個主從區域內不允許重複
server-id=1

啓動MySQl服務

service mysqld start

2 . 2 獲取Master日誌信息

登錄MySQL

mysql -uroot -ppassword

獲取Position、File信息

show master status\G

Position和File的解釋在下面/ 5 / MySQl主從原理中, 這裏就不過多敘述了

2 . 3 創建MySQL主從複製用戶

如果是單一的主從就配置只允許Slave服務器訪問

# 192.168.232.135 是從服務器的ip
CREATE USER 'replication_user'@'192.168.232.135' IDENTIFIED BY 'MaRePass4!';
# 爲replication_user添加權限
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'192.168.232.135';

/ 3 / Slave-Server配置項

3 . 1 修改Slave配置文件

暫停MySQl服務

service mysqld stop

編輯my.cnf文件

$ vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

添加server-id

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# 注意, server-id在同一個主從區域內不允許重複
server-id=2

啓動MySQl服務

service mysqld start

3 . 2 開啓複製通信

配置Master用戶信息及日誌信息

CHANGE MASTER TO MASTER_HOST='192.168.232.134', MASTER_USER='replication_user', MASTER_PASSWORD='MaRePass4!', MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=1864;

啓動從服務, 注意該從服務指的是MySQL自帶的從服務, 並不是當前數據庫服務

start slave;

查看Slave通信狀態

show slave status\G

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.232.134
                  Master_User: replication_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000010
          Read_Master_Log_Pos: 2349
               Relay_Log_File: localhost-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000010
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
...
  • Slave_IO_State : 當前從服務複製線程狀態
  • Master_Host : 主服務
  • Slave_IO_Running : 用於讀取主服務日誌的I / O線程是否正在運行
  • Slave_SQL_Running : 用於執行日誌中事件的SQL線程是否正在運行

如果Slave_IO_Running || Slave_SQL_Running的值有一個爲no的話, 請檢查CHANGE命令中的參數是否正確, 然後先運行停止slave服務, 重新執行CHANGE命令, 再啓動slave服務

# 停止slave服務
stop slave;

# 建立主從連接
CHANGE MASTER TO MASTER_HOST='192.168.232.134', MASTER_USER='replication_user', MASTER_PASSWORD='MaRePass4!', MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=1864;

# 啓動slave服務
start slave;

/ 4 / MySQL主從配置驗證

在Master服務中執行以下命令

1 . 查看正在運行的進程列表來檢查已連接的從服務器的狀態
SHOW PROCESSLIST \G;

mysql> SHOW PROCESSLIST \G;
*************************** 1. row ***************************
     Id: 5
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: starting
   Info: SHOW PROCESSLIST
*************************** 2. row ***************************
     Id: 6
   User: replication_user
   Host: 192.168.232.135:57720
     db: NULL
Command: Binlog Dump
   Time: 161
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL
2 rows in set (0.00 sec)
2 . 查看從服務信息
show slave hosts;

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         2 |      | 3306 |         1 | df04969d-94f5-11ea-98aa-000c298c16c6 |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)

經過這倆個命令的驗證就可以證明當前主從已經搭建好了, 大家可以去Master服務中創建一個數據庫、表之類進行業務認證

/ 5 / MySQL主從原理

  1. Slave服務的IO線程通過Master_HostMaster_UserMaster_Port連接到Master服務, 根據Master_Log_File找到Master服務中存放指令的日誌文件, 然後從MASTER_LOG_POS所指明的位置開始讀取日誌

  2. Master接收到Slave的請求後, 開啓複製線程根據Slave請求信息開始複製指令並返回, 同時返回的還有最新的Master_Log_File以及MASTER_LOG_POS

  3. Slave獲取到返回數據後將指令存儲到relay-log文件中, 將Master_Log_File以及MASTER_LOG_POS存儲到master-info文件中, 該文件中記錄的是IO線程讀取已經讀取到的Master_Log_FileMASTER_LOG_POS,用於Slave宕機後IO線程根據文件中的POS點重新拉取binlog日誌

  4. Slave的SQL線程檢測到relay-log文件發生變化後開始讀取並執行指令完成數據同步

/ 6 / 清除MySQL主從關係

# 清除Master服務中binlog文件
reset master;

stop slave;

# 清除Slave服務中relay-log文件
reset slave all;

show slave status\G
Emptyset (0,00 sec)

附MySQL默認配置

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

參考文章

MySQL 5.7參考手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章