- 背景:在一些Web服務器開發中,系統用戶在進行數據訪問時,基本都是直接操作數據庫MySQL進行訪問,而這種情況下,若只有一臺MySQL服務器,可能會存在如下問題
????????- 數據的讀和寫的所有壓力都會由一臺數據庫獨立承擔,壓力太大
- 數據庫服務器磁盤損壞等原因則會導致數據丟失,出現單點故障問題
- 那為了解決這兩個問題,我們可以準備兩臺MySQL服務器,一臺主(master)服務器,一臺從(slave)服務器,若主庫的數據存在變更時,需要同步到從庫中,稱為主從復制。而用戶在訪問我們的Web項目時,如果是寫操作(insert、update、delete)則直接操作主庫即可;如果是讀(select)操作,則直接操作從庫,同時在這種讀寫分離的結構中,從庫我們是可以有多個的這種結構,這種方式我們可稱為讀寫分離。? ? ?
- 因為MySQL數據庫默認是支持主從復制的,所以我們并不需要借助于其他的技術,只要在數據庫中進行簡單的配置即可實現。那么接下來我們開始進行MySQL的主從復制的操作
- 主從復制的簡單介紹
- MySQL主從復制是一個異步的復制過程,底層是基于MySQL的數據庫自帶的二進制日志功能。就是從一臺或多臺MySQL數據庫(slave,從庫)從另一臺MySQL數據庫(master,主庫)進行日志的復制,然后再解析對應的日志并應用到自身,最終實現從庫的數據和主庫的數據保持一致。MySQL主從復制是MySQL數據庫自帶功能,無需借助第三方工具進行操作
- 本案例中僅通過一主一從來介紹主從復制的操作
- 首先我們先準備兩臺Linux服務器,并且在服務器上需要預先安裝好MySQL數據庫,同時我們已經將服務器的防火墻已經關閉,并將兩臺Linux系統的MySQL服務正常啟動
- Linux操作系統:ubuntu-20.04-live-server-amd64
- MySQL數據庫版本:5.7.40
- 首先進行主庫配置
- 修改MySQL數據庫的配置文件my.cnf文件,在文件最下面添加啟用二進制日志功能
-
# binlog日志 server-id=101 log-bin = /home/dev/dev-install/mysql-5.7.40/binlog/mysql-bin
- log-bin:[必須]啟用二進制日志
server-id:[必須]服務器唯一ID(唯一即可)
- 修改完配置文件需要重啟MySQL服務
-
./mysql.server restart
-
- 修改MySQL數據庫的配置文件my.cnf文件,在文件最下面添加啟用二進制日志功能
- 主庫中創建數據同步的用戶并授權
- 登錄MySQL,然后執行如下指令,創建用戶并授權
-
GRANT REPLICATION SLAVE ON *.* to 'syncdata'@'%' identified by 'Sync@Data123';
- 上面的指令是syncdata為用戶,Sync@Data123為密碼,從庫在建立復制的時候需要用到用戶授權,只有在有授權用戶的前提下才能進行復制
-
- 登錄MySQL,然后執行如下指令,創建用戶并授權
- 登錄MySQL的數據庫,查看master主庫的同步狀態
- 執行如下指令,并將結果中的File和Position的信息記錄下來
-
show master status;
- 注意,查看上面的狀態之后,不要再操作當前數據庫了,也就是不要再執行任何指令,防止數據同步位置錯誤
-
- 執行如下指令,并將結果中的File和Position的信息記錄下來
- 開始進行從庫的配置
- 修改MySQL數據庫的配置文件my.cnf文件,在文件最下面添加設置服務器的唯一id
-
server-id=102
- server-id:[必須]服務器唯一ID
- 重啟MySQL服務
-
./mysql.server restart
-
- 修改MySQL數據庫的配置文件my.cnf文件,在文件最下面添加設置服務器的唯一id
- 登錄從庫的MySQL數據庫,設置主庫的地址以及對應的同步位置,依次執行下列指令
-
change master to master_host='192.168.xxx.xxx',master_user='syncdata',master_password='Sync@Data123',master_log_file='mysql-bin.000009',master_log_pos=433;start slave;
- 上面的指令信息說明為:
- master_host :主庫的IP地址,即需要根據實際情況的ip設定
- master_user :訪問主庫進行主從復制的用戶名,也就是上面所在主庫創建的
- master_password :訪問主庫進行主從復制的用戶名對應的密碼
- master_log_file : 從哪個日志文件開始同步,也就是上面查詢master狀態中展示的File
- master_log_pos : 從指定日志文件的哪個位置開始同步,也就是查詢master狀態中展示的Position
-
- 然后查看從庫數據庫的狀態
-
show slave status \G
- 可以通過狀態信息中的?Slave_IO_Running 和Slave_SQL_Running 可以看出主從同步是否就緒,如果這兩個參數全為Yes,則表示主從同步已經配置完成
-
- 若狀態是Slave_IO_Running: No,Slave_SQL_Running: Yes,說明同步不成功,則需要前往MySQL的log錯誤日志查看報錯信息
- 若出現文件[ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593的解決方案
-
找到從數據庫的該文件對應的 UUID,該文件為/home/dev/dev-install/mysql-5.7.40/data/auto.cnf,然后編輯auto.cnf,將里面uuid的值隨便改一個即可,然后保存文件
-
- 保存完文件重新啟動MySQL服務器即可
- 再次通過 show slave status \G 查看從數據庫的狀態
-
- 若出現文件[ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593的解決方案
- 主從環境的測試
- 我們已經把主從復制的環境搭建好了,接下來我們可以通過Navicat連接上兩臺MySQL服務器進行測試,我們只需要在主庫master上執行操作,然后再查看從庫slave中是否將數據同步過去即可
- 主庫創建數據庫,刷新并查看從庫是否可以正常同步過去
- 可以發現主庫創建的數據庫已經同步到從庫,證明主從復制已經驗證成功
- 我們已經把主從復制的環境搭建好了,接下來我們可以通過Navicat連接上兩臺MySQL服務器進行測試,我們只需要在主庫master上執行操作,然后再查看從庫slave中是否將數據同步過去即可
- 首先我們先準備兩臺Linux服務器,并且在服務器上需要預先安裝好MySQL數據庫,同時我們已經將服務器的防火墻已經關閉,并將兩臺Linux系統的MySQL服務正常啟動