基于docker 的mysql主從復制,讀寫分離

(參考原文鏈接https://www.cnblogs.com/taosim/articles/4244576.html)

數(shù)據庫復制 replication 的實現(xiàn)原理

主服務器凡運行語句 , 都產生一個二進制日志 binlog

從服務器不斷讀取主服務器的 binlog

從主服務讀取到的 binlog, 轉換為自身可執(zhí)行的 relaylog,

執(zhí)行 relaylog

實現(xiàn)步驟 :

首先確保主服務器打開二進制日志功能 .這樣 , 主服務器一旦有數(shù)據變化 , 立即產生二進制日志 .

從服務器也需要開啟二進制日志和 relay 日志功能 .這樣可以從主服務器讀取 binlog, 并產生 relaylog

在主服務器建立一個從服務器的賬號 , 并授予數(shù)得上權限 .

指定從服務對應的主服務器 , 開啟從服務器 .

實現(xiàn)過程

服務器準備:

10.3.136.128 主服務器 master

10.3.136.129 從服務器slave

1.為了簡化MySQL的安裝,我這里使用的docker-compose啟動服務器

docker-compose.yml的內容為

version: '3.1'

services:

? db:

? ? # 目前 latest 版本為 MySQL8.x

? ? image: mysql

? ? restart: always

? ? environment:

? ? ? MYSQL_ROOT_PASSWORD: 123456

? ? command:

? ? ? --default-authentication-plugin=mysql_native_password

? ? ? --character-set-server=utf8mb4

? ? ? --collation-server=utf8mb4_general_ci

? ? ? --explicit_defaults_for_timestamp=true

? ? ? --lower_case_table_names=1

? ? ports:

? ? ? - 3306:3306

? ? volumes:

? ? ? - ./data:/var/lib/mysql? # 這里主要是為了將容器中的數(shù)據持久化到磁盤上

然后運行兩個虛擬機上的容器:docker-compose up -d

2.使用Navicat遠程連接數(shù)據庫,兩個數(shù)據庫均連接成功

3.配置Master(主)

(1)通過docker exec -it 容器ID /bin/bash命令進入到Master容器內部

(2)cd /etc/mysql切換到/etc/mysql目錄下,

(3)使用apt-get install vim命令安裝vim

如果出現(xiàn)如下問題:

Readingpackagelists...?

DoneBuilding dependency tree? ? ??

?Reading state information...?

DoneE:Unable to locatepackagevim

(4)執(zhí)行apt-get update,然后再次執(zhí)行apt-get install vim即可成功安裝vim。

(5)使用vim編輯my.cnf,在my.cnf中添加如下配置:

server-id=128

log-bin=mysql-bin

(6)配置完成之后,需要重啟mysql服務使配置生效。使用service mysql restart完成重啟。重啟mysql服務時會使得docker容器停止,我們還需要docker start mysql-master啟動容器。

(7)mysql -u root -p進入mysql

在Master數(shù)據庫創(chuàng)建數(shù)據同步用戶,授予用戶 slave REPLICATION SLAVE權限和REPLICATION CLIENT權限,用于在主從庫之間同步數(shù)據。

CREATE USER 'repl'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';

4.配置Slave(從)

(1)和配置Master(主)一樣,在Slave配置文件my.cnf中添加如下配置:

##設置server_id,注意要唯一

server-id=129

## 開啟二進制日志功能,以備Slave作為其它Slave的Master時使用

log-bin=mysql-slave-bin

## relay_log配置中繼日志

relay_log=edu-mysql-relay-bin

(2)配置完成后也需要重啟mysql服務和docker容器,操作和配置Master(主)一致。

5.鏈接Master(主)和Slave(從)

(1)在Master進入mysql,執(zhí)行show master status;


File和Position字段的值后面將會用到,在后面的操作完成之前,需要保證Master庫不能做任何操作,否則將會引起狀態(tài)變化,F(xiàn)ile和Position字段的值變化。

(2)在Slave 中進入 mysql,執(zhí)行

change master to master_host='10.3.136.128', master_user='repl', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 2270, master_connect_retry=30;

命令說明:

master_host?:即Master的虛擬主機IP

master_port:Master的端口號,指的是容器的端口號

master_user:用于數(shù)據同步的用戶

master_password:用于同步的用戶的密碼

master_log_file:指定 Slave 從哪個日志文件開始復制數(shù)據,即上文中提到的 File 字段的值

master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 字段的值

master_connect_retry:如果連接失敗,重試的時間間隔,單位是秒,默認是60秒

(3)在Slave 中的mysql終端執(zhí)行show slave status \G;用于查看主從同步狀態(tài)。

正常情況下,SlaveIORunning 和 SlaveSQLRunning 都是No,因為我們還沒有開啟主從復制過程。使用start slave開啟主從復制過程,然后再次查詢主從同步狀態(tài)show slave status \G;。


SlaveIORunning 和 SlaveSQLRunning 都是Yes,說明主從復制已經開啟。此時可以測試數(shù)據同步是否成功。

主從復制排錯:

使用start slave開啟主從復制過程后,如果SlaveIORunning一直是Connecting,則說明主從復制一直處于連接狀態(tài),這種情況一般是下面幾種原因造成的,我們可以根據 Last_IO_Error提示予以排除。

(1)網絡不通

檢查ip,端口

(2)密碼不對

檢查是否創(chuàng)建用于同步的用戶和用戶密碼是否正確

(3)pos不對

檢查Master的 Position

我在配置的時候出現(xiàn)的問題:

一、mysql版本問題導致的權限問題:

2.docker克隆導致的UUID重復問題

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容