一、前言
? ? ? ? 某個應用場景中,在操作數據庫這部分,往往是數據庫的讀取往往大于數據庫的寫入,當讀取數據達到數據庫的瓶頸時,性能下滑,影響數據的寫入,導致整個應用的不可用。為了解決這個問題,這時,引入了 讀寫分離的數據庫架構,多個從庫分攤了讀數據的壓力。
二、什么是讀寫分離?
? ? ? ? 讀寫分離其實就是將數據庫分為主從庫,主庫負責寫入數據,從庫負責讀取數據,主庫與從庫通過 mysql 的 Slave機制進行主從復制。主數據庫只有一個,從數據庫有多個,這是一種常見的數據庫架構。
三、讀寫分離的結構圖
????????
? ? ? ? ?上圖,客戶端訪問服務器,服務器通過 數據庫中間件 或者其他的邏輯,使得[寫入、修改、刪除] 操作 主庫 , 而查詢讀取從庫。
? ? ? ? 主庫生產 binary log 的二進制日志文件,通過 slave 機制,通過連接主庫,讀取 binarylog 生成 中級文件,從數據同步 中級文件,寫入從數據庫,從而實現了 主從數據的同步。
四、前提條件
?????????1、搭建讀寫分離數據庫結構前,讀庫 slave 需要跟寫庫 master 的數據一致。
? ? ? ? ?2、寫數據必須操作主庫
? ? ? ? 3、讀去數據不一定是從庫,因為從庫同步主庫的數據,會有一定的延遲,在延遲內,主從數據可能不一致,因此,在某些特殊的情況下,需要讀取主庫來保證數據的即使型。
????????讀寫分離降低主數據庫的讀壓力,但是并不代表主庫就不允許讀數據了。在一些特殊場景允許讀取主數據庫的數據。
五、環境準備
? ? ? ? ?為了實驗,我這里準備了3臺機器,一臺? window , 2臺 centos 7 的虛擬機。
避免一些不必要問題,推薦主從mysql 版本一致。
主機 | 角色 | 系統 | mysql版本 | |
192.168.83.1 | 主 | win11 | 5.7.26 | 注意開放3306端口 |
192.168.23.148 | 從 | centos7 | 8.0.34 |
主數據庫:
?從數據庫:
?
?六、配置主數據庫
????????我們配置主數據庫時,只需要生成 binary log 的二進制日志文件? 和創建一個擁有訪問權限的 mysql 用戶 即可,其他的操作不會影響到從數據庫的配置。
? ? ? ? 1、看看一下主數據庫的狀態
? ? ? ? 查看 主庫的狀態。
show master status;
?輸出結果:?
? ? ? ? 從上圖可以看出, 暫時沒有主從的設置。?
? ? ? ? 2、配置文件的設置
????????找到 win 11 下面的 mysql 配置文件? my.ini 。在 配置文件的?[mysqld] 下面增加配置,如下:
# 這里填1 ,可以任意填寫,但是不允許數據庫之間同
server-id=1
# 只備份的數據庫
binlog-do-db=demo_slave
# binlog_ignore_db 表述忽略備份的數據庫
binlog_ignore_db=mysqld
# binary log 二進制日志文件的格式,有三種(statement , row , mixed),可以根據場景選用,mysql默認采用statement,建議使用mixed
binlog_format=mixed
# 二進制文件記錄
log-bin=master-bin
# 生成二進制文件的名稱格式
log-bin-index=master-bin.index
????????把上面的配置復制到 mysql 的配置文件,然后重啟 mysql 服務,在使用 show master status; 查看主庫的配置情況。
主從配置還有很多配置,請自行配置百度。
?重啟之后,你會發現在 mysql 存放數據庫的文件里面出現了 對應的 binary log 文件。
?登錄 MySQL, 查看狀態:
?如果出現上訴結果,則主庫的配置部分已完成。
3、創建主從訪問的用戶
? ? ? ? 1、查看一下用戶
? ? ? ? 2、創建復制用戶?[repl]
-- 創建用戶
create user repl;
?????????3、給[repl]用戶權限
# 給 repl 用戶授權,并設置密碼為 replpwd
# 允許 % 所有服務器訪問
grant replication slave on *.* to 'repl'@'%' identified by'replpwd';
輸出結果:
?七、配置從數據庫
?1、查看從數據庫的slave狀態
# 查看 slave 的狀態
show slave status \G;
?2、查看從數據庫的配置
?
?3、配置文件的設置
?在配置文件 【mysqld】 下面增加配置如下:
# 這里填2 ,可以任意填寫,但是不允許數據庫之間同
server-id=2
# 中繼日志文件的命名格式
relay-log-index=slave-relay-bin.index
# 中繼日志文件的匯總文件
relay-log=slave-relay-bin# 只復制數據庫 , 多個數據庫寫多條
#只復制db1和db2數據庫
; replicate-do-db=db1
; replicate-do-db=db2
replicate-do-db=demo_slave# 忽略復制數據庫 , 多個數據庫寫多條
replicate-ignore-db=mysql
?配置完成后,重啟 mysql 服務,然后查看
?????????配置完成后, mysql 的數據 目錄下 自動生產了? 4個數據文件。
4、鏈接主數據庫
-- 連接數據庫
CHANGE MASTER TOMASTER_HOST='192.168.83.1',MASTER_USER='repl',MASTER_PASSWORD='replpwd',MASTER_PORT=3306,MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=154;-- MASTER_HOST 主數據庫的IP
-- MASTER_USER 主數據庫的用戶
-- MASTER_PASSWORD 主數據庫的用戶密碼
-- MASTER_PORT 主數據庫的端口,必須查看主數據庫服務器是否有開放端口
-- MASTER_LOG_FILE 主數據庫的 binarylog 二進制日志文件
-- MASTER_LOG_POS 主數據庫的 binarylog 二進制日志 的偏移量(主數據庫是多少則填多少)
?啟動 slave
start slave
如果報錯:
ERROR 1872 (HY000): Replica failed to initialize applier metadata structure from the repository
?????????因為從數據庫可能以前配置過,生成過 中繼日志文件,導致 從數據庫 slave 中還記錄著舊數據,這時可以使用 命令
reset slave
重新設置即可。
?查看狀態:
查看數據庫:?
?
?5、檢查從數據庫是否運作正常
?在主數據庫創建 demo_master 數據庫,看看 從數據庫是否同步過來。
?有上圖可知,沒有同步上來。
?
?
?