MySQL主從同步配置
為什么要做主從同步?
- 在非常復雜的業務中,經常會碰到有sql需要鎖表的場景,導致暫時不能讀取數據,那么就影響運行中的業務,而使用主從復制,讓主庫復制寫,從庫復制讀,這樣就算主庫出現了鎖表的情景,通過讀取從庫也依然可以保證業務的正常運作。
- 做數據的熱備時很可靠
- 隨着業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
主從配置原理?
簡單說就是主庫開啟logbin,從數據庫啟動的那一刻起將保存所有修改數據庫結構或內容的一個文件。mysql主從復制是一個異步的復制過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。在主庫里,只要有更新事件出現,就會被依次地寫入到binlog里面,之后會推到從庫中作為從庫進行復制的數據源。
配置主從同步
准備工作:
- 12.122.132.22 :3306 主庫
- 12.122.132.23 :3306 從庫
- 數據庫版本 5.7+
首先安裝好兩台mysql,並且啟動:
systemctl start mysqld; #啟動mysql
systemctl stop mysqld;#停止mysql
systemctl reload mysqld; #重啟mysql
登錄主庫,創建一個用戶用於主從復制:
-- 用戶名 SimpleWu 密碼123456
CREATE USER 'SimpleWu'@'*' IDENTIFIED BY '123456';
-- 執行刷新權限:
flush privileges;
登錄兩個數據庫同時創建數據庫(CORE):
CREATE DATABASE CORE;
關閉兩個數據庫。
修改主庫配置文件:
[mysqld]
#開啟二進制日志
log-bin=mysql-bin
#設置server-id
server-id=1
binlog-do-db = game
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
log-bin:設置logbin文件名稱,最好不要改動位置。
server-id:該id主從之間必須是唯一,唯一的標識。
binlog-do-db:指定可以主從同步的數據庫,多數據庫則配置多行。
binlog-ignore-db:指定不可以主從同步的數據庫,多數據庫則配置多行
修改從庫配置文件:
#設置server-id,必須唯一
server-id=2
只需要將服務id設置為與主庫不同的ID既可;現在啟動兩個數據。
啟動后需要查看主庫log-bin信息:
SHOW MASTER STATUS; -- 主庫執行
獲取到:
+------------------+----------+--------------+----------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+----------------------------------+
| mysql-bin.000012 | 619 | core | mysql,information_schema,sys |
+------------------+----------+--------------+----------------------------------+
以目前位置開始主從同步,在從庫執行SQL將從庫關聯主庫:
CHANGE MASTER TO
MASTER_HOST='12.122.132.22', -- 主庫ip
MASTER_USER='SimpleWu', -- 用戶名
MASTER_PORT=3306, -- 端口號
MASTER_PASSWORD='123456', -- 密碼
MASTER_LOG_FILE='mysql-bin.000012', -- 開始文件
MASTER_LOG_POS=619; -- 開始位置
執行改SQL后我們需要查看我們目前的配置信息:
SHOW SLAVE STATUS; -- 從庫執行,查看主從狀態
可以看到Slave IO STATE為空代表未連接上,這時候從庫啟動復制:
START SLAVE; -- 從庫執行,啟動從庫
啟動后可以再次查看從庫狀態,看到Slave IO STATE變成Waiting for master to send event代表主從同步成功。
這個時候在主庫創建一張表:
-- 主庫執行
CREATE TABLE `TB_USER`(
ID VARCHAR(55) PRIMARY KEY NOT NULL,
`NAME` VARCHAR(55)
);
創建成功后登錄從庫,會發下多了一張表,這個時候我們的主從復制就已經搭建完成了。圖就不貼了,貼圖不如自己動手體會效果。
啟動,關閉從庫:
START SLAVE; # 啟動從庫
STOP SLAVE; # 關閉從庫
在修改從庫的master配置之前一定要關閉從庫,在修改配置信息。
主從同步延遲
在主從同步過程中因為所有的SQL必須都要在從服務器里面執行一遍,但是主服務器如果不斷的有更新操作源源不斷的寫入, 那么一旦有延遲產生, 那么延遲加重的可能性就會原來越大。雖然這個問題又不能完全解決,但是我們可以采取一些措施來緩解。
我們知道因為主服務器要負責更新操作, 他對安全性的要求比從服務器高, 所有有些設置可以修改,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設置,而slave則不需要這么高的數據安全,完全可以講sync_binlog設置為0或者關閉binlog,innodb_flushlog, innodb_flush_log_at_trx_commit 也 可以設置為0來提高sql的執行效率 這個能很大程度上提高效率。另外就是使用比主庫更好的硬件設備作為slave。
