/ 前言 /
隨着用戶的增長, 性能和穩定變得越來越重要, 爲了不讓其成爲系統的約束, 於是大家開始追求高可用, 而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主從原理
-
Slave服務的IO線程通過
Master_Host
、Master_User
、Master_Port
連接到Master服務, 根據Master_Log_File
找到Master服務中存放指令的日誌文件, 然後從MASTER_LOG_POS
所指明的位置開始讀取日誌 -
Master接收到Slave的請求後, 開啓複製線程根據Slave請求信息開始複製指令並返回, 同時返回的還有最新的
Master_Log_File
以及MASTER_LOG_POS
-
Slave獲取到返回數據後將指令存儲到
relay-log
文件中, 將Master_Log_File
以及MASTER_LOG_POS
存儲到master-info
文件中, 該文件中記錄的是IO線程讀取已經讀取到的Master_Log_File
及MASTER_LOG_POS
,用於Slave宕機後IO線程根據文件中的POS點重新拉取binlog日誌 -
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
參考文章