MySQL主從複製實現讀寫分離

MySQL主從複製實現讀寫分離

1. 讀寫分離原理

1.1 什麼是主從同步

指一臺服務器充當主數據庫服務器,另一臺或多臺服務器充當從數據庫服務器,主服務器中的數據自動複製到從服務器之中。其實就是從服務器重放主服務器的操作步驟,實現主從數據一致。

1.2 爲什麼要實現主從同步

(1)實現服務器負載均衡
通過主、從服務器之前切分處理客戶查詢符合,從而得到更好的客戶相應時間。主要方案有:

  • master處理記錄的新增、修改、刪除的功能,把查詢交給slave去做。
  • master處理記錄的新增、修改、刪除的功能,並且master還要承擔部分查詢任務,而slave只負責查詢數據。當主服務器比較忙時,部分查詢請求會自動發送到從服務器重,以降低主服務器的工作負荷。

(2)實現數據的異地備份
定期的將數據從master 服務器上覆制到slave服務器上,實現了異地備份。相對於將數據備份在本地,這種方式可以避免降低master服務器的性能,同時降低了因爲master服務器硬盤損壞、服務器異常而導致數據無法恢復的危險。

(3)提高數據庫系統的可用性
當主服務器出現問題時,可以馬上讓從服務器作爲主服務器,用來數據的更新與查詢服務。

1.3 怎麼實現主從同步

mysql支持的複製類型

  • 基於語句的複製: 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現沒法精確複製時, 會自動選着基於行的複製。
  • 基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
  • 混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。
    msyql主從複製原理

主從複製工作原理剖析

1.Master 數據庫只要發生變化,立馬記錄到Binary log 日誌文件中
2.Slave數據庫啓動一個I/O thread連接Master數據庫,請求Master變化的二進制日誌
3.Slave I/O獲取到的二進制日誌,保存到自己的Relay log 日誌文件中。
4.Slave 有一個 SQL thread定時檢查Realy log是否變化,變化那麼就更新數據

2. 數據庫環境準備

這裏我準備了兩臺服務器(centos7),在上面都安裝了mysql5.7.30,兩臺服務器網絡暢通:

主服務器(master):192.168.0.101
從服務器(slave):192.168.0.105

將主庫要同步的數據庫數據先同步到從庫。

3. master配置

3.1 修改mysql配置文件

在msyql配置文件中添加一下配置(主要配置server-id、log-bin和binlog-do-db):

vim /etc/my.cnf
# 主從設置
server-id=1                 # 節點ID,確保唯一

# log config
log-bin= mysql-bin          #開啓mysql的binlog日誌功能
binlog-do-db=oyc            #二進制日誌記錄的數據庫(多數據庫用逗號,隔開)
#控制數據庫的binlog刷到磁盤上去 , 0 不控制,性能最好,1每次事物提交都會刷到日誌文件中,性能最差,最安全
sync_binlog=1               
binlog_format=mixed         #binlog日誌格式,mysql默認採用statement,建議使用mixed
expire_logs_days=7          #binlog過期清理時間
max_binlog_size=100m        #binlog每個日誌文件大小
binlog_cache_size=4m        #binlog緩存大小
max_binlog_cache_size=512m  #最大binlog緩存大
binlog-ignore-db=mysql      #不生成日誌文件的數據庫,多個忽略數據庫可以用逗號拼接,或者 複製這句話,寫多行
auto-increment-offset=1     # 自增值的偏移量
auto-increment-increment=1  # 自增值的自增量
slave-skip-errors=all       #跳過從庫錯誤

3.2 重啓mysql

systemctl restart mysql 
或者 service mysqld restart  

3.3 創建同步用戶並授權

1.進入master的數據庫,爲master創建複製用戶

create user oyc identified by '123456';

2.賦予該用戶複製的權利

grant replication slave on *.* to 'oyc'@'192.168.0.105'  identified by '123456';
flush privieges;

3.查看master的狀態

show master status;

master狀態

4. slave配置

4.1 修改從庫配置文件

同步表配置說明:

  • replicate-do-db 設定需要複製的數據庫(多數據庫使用逗號,隔開)
  • replicate-ignore-db 設定需要忽略的複製數據庫 (多數據庫使用逗號,隔開)
  • replicate-do-table 設定需要複製的表
  • replicate-ignore-table 設定需要忽略的複製表
  • replicate-wild-do-table 同replication-do-table功能一樣,但是可以通配符
  • replicate-wild-ignore-table 同replication-ignore-table功能一樣,但是可以加通配符
[mysqld]
server-id = 2 # server_id是必須的,而且唯一。
log-bin=mysql-bin  
relay-log = mysql-relay-bin
replicate-do-db=oyc
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%

4.2 配置從庫連接信息

讓slave連接master,並開始重做master二進制日誌中的事件。

CHANGE MASTER TO MASTER_HOST='192.168.0.100',MASTER_USER='oyc',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;

4.3 啓動Salve並查看從庫狀態

START SLAVE;

SHOW SLAVE STATUS;

slave 狀態
看到Slave_IO_Running=Yes Slave_SQL_Running=Yes,說明成功了。

5.測試效果

5.1 同步前數據

同步前數據

5.2 在master插入一條數據,slave也同步插入數據

master插入數據
同步效果:
同步效果
master表數據的新增、修改、刪除都會同步到slave中,master表的新增、修改、刪除,視圖、存儲過程的變化都會同步。

6.同步錯誤解決

6.1 忽略錯誤繼續同步

該方法適用於主從庫數據相差不大,或者要求數據可以不完全統一的情況,數據要求不嚴格的情況。

stop slave; 

# 表示跳過一步錯誤,後面的數字可變
set global sql_slave_skip_counter =1;

start slave;

# 查詢同步情況
show slave status\G

6.2 忽略不需要的表

replicate-ignore-table=table1,table2,oyc_%

6.3 重新同步數據再實現同步

1.先進入主庫,進行鎖表,防止數據寫入
使用命令:

mysql> flush oyc with read lock;

注意:該處是鎖定爲只讀狀態,語句不區分大小寫

2.進行數據備份
把數據備份到mysql.bak.sql文件

[root@master mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql

這裏注意一點:數據庫備份一定要定期進行,可以用shell腳本或者python腳本,都比較方便,確保數據萬無一失

3.查看master 狀態

mysql> show master status;
+——————-+———-+————–+——————————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————-+———-+————–+——————————-+
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |
+——————-+———-+————–+——————————-+
1 row in set (0.00 sec)

4.把mysql備份文件傳到從庫機器,進行數據恢復

使用scp命令

[root@server01 mysql]# scp mysql.bak.sql [email protected]:/tmp/

5.停止從庫的狀態

mysql> stop slave;

6.然後到從庫執行mysql命令,導入數據備份

mysql> source /tmp/mysql.bak.sql

7.設置從庫同步,注意該處的同步點,就是主庫show master status信息裏的| File| Position兩項

change master to master_host = ‘192.168.1.101’, master_user = ‘oyc’, master_port=3306, master_password='123456', master_log_file = ‘mysqld-bin.000002’, master_log_pos=1002;

8.重新開啓從同步

mysql> start slave;

9.解鎖master

unlock table;

10.查看同步狀態

mysql> show slave status\G 查看同步情況
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章