基于docker實現MySQL主從復制(全網最詳細!!!)

一、 通過docker鏡像搭建MySQL主從

主服務器:容器名zi-mysql-master,端口3306

從服務器:容器名zi-mysql-slave1,端口3307

從服務器:容器名zi-mysql-slave2,端口3308

二、 關閉防火墻,啟動docker

#關閉docker

systemctl stop docker

#關閉防火墻

systemctl stop firewalld

#啟動docker

systemctl start docker

三、 搭建主服務器master(主機中創建slave用戶)

3.1:在docker中創建并啟動MySQL主服務器:端口3306?

sudo docker run -d \--privileged --restart always \--name zi-mysql-master \-e MYSQL_ROOT_PASSWORD=root \-e MYSQL_DEFAULT_USERNAME=root \-e MYSQL_DEFAULT_PASSWORD=123456 \-v /xixi/mysql/master/conf:/etc/mysql/conf.d  \-v /xixi/mysql/master/data:/var/lib/mysql   \-p 3309:3306  \  
mysql:8.0.23

?如果docker本地鏡像中沒有MySQL,會默認去下載鏡像

3.2:創建MySQL主服務器配置文件:

默認情況下MySQL的binlog日志是自動開啟的,可以通過如下配置定義一些可選配置

vi /xixi/mysql/master/conf/my.cnf

配置文件內容:

通過vim命令寫入到my.cnf即可

[mysqld]
# 服務器唯一id,默認值1
server-id=1
# 設置日志格式,默認值ROW
binlog_format=STATEMENT
# 二進制日志名,默認binlog
# log-bin=binlog
# 設置需要復制的數據庫,默認復制全部數據庫
#binlog-do-db=mytestdb
# 設置不需要復制的數據庫
#binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema

重啟MySQL容器

docker restart zi-mysql-master

注意:binlog日志binlog格式說明:

binlog_format=STATEMENT:日志記錄的是主機數據庫的寫指令,性能高,但是now()之類的函數以及獲取系統參數的操作會出現主從數據不同步的問題。

binlog_format=ROW(默認):日志記錄的是主機數據庫的寫后的數據,批量操作時性能較差,解決now()或者 user()或者 @@hostname 等操作在主從機器上不一致的問題。

binlog_format=MIXED:是以上兩種level的混合使用,有函數用ROW,沒函數用STATEMENT,但是無法識別系統變量

我們此處采用STATEMENT模式
?

(一般采用默認的ROW格式)

3.3:使用命令行登錄MySQL主服務器:

#進入容器:env LANG=C.UTF-8 避免容器中顯示中文亂碼

docker exec -it zi-mysql-master env LANG=C.UTF-8 /bin/bash

#進入容器內的mysql命令行

mysql -uroot -p

# 如果SQLyog或Navicat測試連接報錯,修改默認加密方式

#修改默認密碼校驗方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

?3.4:主機中創建slave用戶:

-- 創建slave用戶

CREATE USER 'zi_slave'@'%';

-- 設置密碼

ALTER USER 'zi_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

-- 授予復制權限

GRANT REPLICATION SLAVE ON *.* TO 'zi_slave'@'%';

-- 刷新權限

FLUSH PRIVILEGES;

?3.5:主機中查詢master狀態:

執行完此步驟后不要再操作主服務器MYSQL,防止主服務器狀態值變化

SHOW MASTER STATUS;

記下File和Position的值。執行完此步驟后不要再操作主服務器MYSQL,防止主服務器狀態值變化。【file和position后續配置從服務器會使用】

四、 搭建從服務器slave1、slave2

4.1、在docker中創建并啟動MySQL從服務器

復制shell會話或者新建兩個終端,分別創建slave服務器

在docker中創建并啟動MySQL從服務器slave1:端口3307

sudo docker run -d \--privileged --restart always \--name zi-mysql-slaver1 \-e MYSQL_ROOT_PASSWORD=root \-e MYSQL_DEFAULT_USERNAME=root \-e MYSQL_DEFAULT_PASSWORD=123456 \-v /xixi/mysql/slaver1/conf:/etc/mysql/conf.d  \-v /xixi/mysql/slaver1/data:/var/lib/mysql   \
-p 3307:3306  mysql:8.0.23

在docker中創建并啟動MySQL從服務器slave2:端口3308

sudo docker run -d \--privileged --restart always \--name zi-mysql-slaver2 \-e MYSQL_ROOT_PASSWORD=root \-e MYSQL_DEFAULT_USERNAME=root \-e MYSQL_DEFAULT_PASSWORD=123456 \-v /xixi/mysql/slaver2/conf:/etc/mysql/conf.d  \-v /xixi/mysql/slaver2/data:/var/lib/mysql   \-p3308:3306  mysql:8.0.23

4.2:創建MySQL從服務器配置文件:

slave1:

vi/xixi/mysql/slave1/conf/my.cnf

配置如下內容:

[mysqld]
# 服務器唯一id,每臺服務器的id必須不同,如果配置其他從機,注意修改id
server-id=2
# 中繼日志名,默認xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin

slave2

vim /zi/mysql/slave2/conf/my.cnf
[mysqld]# 服務器唯一id,每臺服務器的id必須不同,如果配置其他從機,注意修改idserver-id=3# 中繼日志名,默認xxxxxxxxxxxx-relay-bin#relay-log=relay-bin

重啟MySQL容器(slave1、slave2)

docker restart zi-mysql-slave1docker restart zi-mysql-slave2

4.3:使用命令行登錄MySQL從服務器:

slave1:

進入容器:

Docker exec -it zi-mysql-slave1 env LANG=C.UTF-8 /bin/bash

進入容器內的mysql命令行

mysql -uroot -p

修改默認密碼校驗方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

slave2:

docker exec -it zi-mysql-slave2 env LANG=C.UTF-8 /bin/bash

進入容器內的mysql命令行

mysql -uroot -p

修改默認密碼校驗方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

4.4:在從機上配置主從關系:

slave1、slave2:

在從機上執行以下SQL操作[兩臺從機操作都一樣]

此處就需要用到我們之前記錄好的主庫的file和position:

通過在主庫執行SHOW MASTER STATUS;可以查看主庫這兩項配置,但是執行命令后不要再操作主庫,以免發生改變?

CHANGE MASTER TO MASTER_HOST='192.168.145.48', 
MASTER_USER='zi_slave',MASTER_PASSWORD='123456', MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=1357; 

4.5 啟動主從同步

在從服務器上啟動從機的復制功能,執行SQL:

START SLAVE;

-- 查看狀態(不需要分號) \G表示縱向顯示, G需要大寫

SHOW SLAVE STATUS\G

兩個關鍵進程: 下面兩個參數都是Yes,則說明主從配置成功!

六、 測試實現主從同步

在主機中執行以下SQL,在從機中查看數據庫、表和數據是否已經被同步

CREATE DATABASE db_user;USE db_user;CREATE TABLE t_user (id BIGINT AUTO_INCREMENT,uname VARCHAR(30),PRIMARY KEY (id));INSERT INTO t_user(uname) VALUES('zhang3');INSERT INTO t_user(uname) VALUES(@@hostname);

?查看結果

主從都使用db_user數據庫:

use db_user;

  • master
  • slave1

?五、常見問題:

問題一:

ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.

原因:

因為之前已經創建過主節點,需停掉之前的配置 再重新配置

執行如下命令(在從節點上重新配置主節點)

stop slave;reset master;

問題二:

①啟動主從同步后,常見錯誤是Slave_IO_Running: No 或者 Connecting 的情況,此時查看下方的 Last_IO_ERROR錯誤日志,根據日志中顯示的錯誤信息在網上搜索解決方案即可

典型的錯誤例如:?Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Client requested master to start replication from position > file size’

-- 在從機停止slave

STOP SLAVE;

-- 在主機查看mater狀態

SHOW MASTER STATUS;

-- 在主機刷新日志

FLUSH LOGS;

-- 再次在主機查看mater狀態(會發現File和Position發生了變化)

SHOW MASTER STATUS;

-- 修改從機連接主機的SQL,并重新連接即可

②啟動docker容器后提示 WARNING: IPv4 forwarding is disabled. Networking will not work.

此錯誤,雖然不影響主從同步的搭建,但是如果想從遠程客戶端通過以下方式連接docker中的MySQL則沒法連接

解決方案:

修改配置文件:

vim /usr/lib/sysctl.d/00-system.conf

追加

net.ipv4.ip_forward=1

接著重啟網絡

systemctl restart network

解決方案:

CREATE USER 'zi_slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'zi_slave'@'%';

-- 發現master端和此處密碼不一樣

2.7 停止和重置主從

需要的時候,可以使用如下SQL語句

-- 在從機上執行。功能說明:停止I/O 線程和SQL線程的操作。

stop slave;

-- 在從機上執行。功能說明:用于刪除SLAVE數據庫的relaylog日志文件,并重新啟用新的relaylog文件。

reset slave;

-- 在主機上執行。功能說明:刪除所有的binglog日志文件,并將日志索引文件清空,重新開始所有新的日志文件。

-- 用于第一次進行搭建主從庫時,進行主庫binlog初始化工作;

reset master;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711083.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

免費百度快速收錄軟件

在網站SEO的過程中,不斷更新網站內容是提升排名和吸引流量的關鍵之一。而對于大多數網站管理員來說,頻繁手動更新文章并進行SEO優化可能會是一項繁瑣且耗時的任務。針對這一問題,百度自動更新文章SEO工具應運而生,它能夠幫助網站管…

基于R語言APSIM模型進階應用與參數優化、批量模擬教程

原文:基于R語言APSIM模型進階應用與參數優化、批量模擬教程 前沿 隨著數字農業和智慧農業的發展,基于過程的農業生產系統模型在模擬作物對氣候變化的響應與適應、農田管理優化、作物品種和株型篩選、農田固碳和溫室氣體排放等領域扮演著越來越重要的作…

全域營銷、全員營銷與霸詞、霸屏、霸網:揭秘數字營銷的五大核心策略

全域營銷、全員營銷與霸詞、霸屏、霸網:揭秘數字營銷的五大核心策略 隨著科技的飛速發展和互聯網的深度滲透,數字營銷已成為企業品牌推廣和市場拓展的必備手段。全域營銷、全員營銷、霸詞、霸屏和霸網這五大策略,更是引領著數字營銷的新潮流…

CCF-A類 IEEE VIS‘24 3月31日截稿!探索可視化技術的無限可能!

會議之眼 快訊 IEEE VIS (IEEE Visualization Conference )即可視化大會將于 2024 年 10月13日 -18日在美國佛羅里達州皮特海灘的信風島大海灘度假舉行!圣彼得海灘,以其迷人的日落和和煦的微風,作為激發創造力和促進可視化社區內合作的完美背…

工廠模式 詳解 設計模式

工廠模式 其主要目的是封裝對象的創建過程,使客戶端代碼和具體的對象實現解耦。這樣子就不用每次都new對象,更換對象的話,所有new對象的地方也要修改,違背了開閉原則(對擴展開放,對修改關閉)。…

使用Gson解析數組類型的JSON字符串

要使用Gson解析數組類型的JSON字符串,首先需要創建一個Java類來表示這個數組中的數據類型。例如,假設我們要解析的JSON數組如下: [{"name": "John Doe","age": 35},{"name": "Jane Smith"…

win中刪除不掉的文件,火絨粉碎刪除親測有效

看網上的 win R 然后終端輸入什么刪除的,照做了都沒有刪掉 有火絨的可以試試: 拖進去就刪掉了 很好使

選項 打光 試題總結

試題1 被測物體100100mm,精度要求被測物體 ,精度要求0.1mm,相機距被測物體在200~320mm之間,要求選擇合適的相機和鏡頭? 分析如下: 通常我們用的相機靶面是4:3 的所以我們要用短邊來計算視場&am…

Jmeter系列(5)線程數到底能設置多大

疑惑 一臺設備的線程數到底可以設置多大? 線程數設置 經過一番搜索找到了這樣的答案: Linux下,2g的 java內存,1m 的棧空間,最大啟動線程數2000線程數建議不超過1000jmeter 能啟動多少線程,由你的堆內存…

CSS常用選擇器及注意事項

CSS選擇器是CSS中的基本概念,用于選擇頁面上要樣式化的元素。下面詳細介紹CSS中所有的選擇器、使用方法及注意事項。 1. 基本選擇器 通用選擇器(Universal Selector):*,選擇頁面上的所有元素。元素類型選擇器&#x…

Tomcat 下部署若依單體應用可觀測最佳實踐

實現目標 采集指標信息采集鏈路信息采集日志信息采集 RUM 信息會話重放 即用戶訪問前端的一系列過程的會話錄制信息,包括點擊某個按鈕、操作界面、停留時間等,有助于客戶真是意圖、操作復現 版本信息 Tomcat (9.0.81)Springboot(2.6.2)JDK (>8)DDT…

【Redis筆記】Redis消息隊列方案

Reids消息隊列(Message Queue) 消息隊列 是指利用 高效可靠 的 消息傳遞機制 進行與平臺無關的 數據交流,并基于數據通信來進行分布式系統的集成。 消息隊列具有 低耦合、可靠投遞、廣播、流量控制、最終一致性 等功能。 常見的消息隊列 有 …

ensp路由器將不同網絡連通在一起

1.拓撲結構信息如下 二層交換機:lsw2,lsw3,lsw5,lsw6 不進行ip配置,只是定義vlan,和主機標注的保持一致,向下連接pc用access,向上連接路由交換機用trunk lsw2配置信息如下圖 定義vlan,設置各個連接口的方式…

tcpdump 常用用法

簡要記錄下tcpdump用法 監控某個ip上的某個端口的流量 tcpdump -i enp0s25 tcp port 5432 -nn -S 各個參數作用 -i enp0s25 指定抓包的網卡是enp0s25 -nn 顯示ip地址和數字端口 ,如果只 -n 則顯示ip,但是端口為services文件中的服務名 如果一個…

用python寫一個自動化部署工具

效果 起因 現在springboot項目的自動化部署已經非常普遍,有用Jenkins的,有用git鉤子函數的,有用docker的…等等。這段時間在玩python,想著用python實現自動化部署,即能鍛煉下編碼能力,又方便運維。于是開始…

每日學習總結20240228

每日總結 20240228 1.獲取系統命令執行結果 #include <stdio.h>#define TRUE 1 #define FALSE 0int get_system_cmd_result(const char *command, char *buffer, int bufferLen) {FILE *pipe popen(command, "r");if (pipe NULL) {return FALSE;}while (f…

HTML-表格、表單和CSS初識,選擇器,書寫規范

&#xff11;. 表格標簽 &#xff11;.&#xff11;創建表格 表格標簽是一種用來處理&#xff0c;顯示表格式數據的常用標簽。 注意&#xff1a; &#xff11;. tr 用于定義表格中的一行&#xff0c;必須嵌套在 table標簽中&#xff0c;在 table中包含幾對 tr&#xff0c;就有…

實用指南:SOLIDWORKS數據失真問題的解決之道

在數據處理和模擬計算的過程中&#xff0c;數據失真是一個常見的挑戰。數據失真指的是由于計算機或人為操作導致的原始數據與計算結果或實際情況之間的偏差。特別是在使用SOLIDWORKS這類工程設計軟件時&#xff0c;數據失真可能由多種因素引起&#xff0c;如軟件版本老舊、設置…

AI大模型-啟航

文章目錄 什么是大模型&#xff1f;&#xff08;大體現在參數量巨大&#xff09;大模型將會改變那些行業&#xff08;大模型有哪些作用&#xff1f;&#xff09;如何搞數據訓練模型&#xff1f;LangChain帶來的技術變革LangChain架構 什么是大模型&#xff1f;&#xff08;大體…

九、GG bond的邏輯運算

描述 GG bond想要鍛煉自己的邏輯能力&#xff0c;于是輸入了兩個整型變量x和y&#xff0c;分別判斷它們的與、或、非關系&#xff0c;你能幫他輸出x與y&#xff0c;x或y&#xff0c;非x&#xff0c;非y的值嗎&#xff1f; 輸入描述&#xff1a; 輸入兩個整數x和y&#xff0c…