【MySQL】基于Docker搭建MySQL一主二從集群

本文記錄了搭建mysql一主二從集群,這樣的一個集群master為可讀寫,slave為只讀。過程中使用了docker,便于快速搭建單體mysql。

1,準備docker

docker的安裝可以參考之前基于yum安裝docker的文章[1]。

容器相關命令[2]。

查看正在運行的容器

docker ps

查看所有容器(查看正在運行的和已經停止運行的)

docker ps –a
docker ps -all

查看最后一次運行的容器

docker ps –l

查看停止的容器

docker ps -f status=exited

創建容器

docker run 參數 鏡像名稱:鏡像標簽 /bin/bash-i:表示運行容器,如果不加該參數那么只是通過鏡像創建容器,而不啟動。-t:表示容器啟動后會進入其命令行。加入這兩個參數后,容器創建就能登錄進去。即分配一個偽終端(如果只加it兩個參數,創建后就會自動進去容器)。-d:在run后面加上-d參數,則會創建一個守護式容器在后臺運行(這樣創建容器后不會自動登錄容器)。--name :為創建的容器命名。-v:表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上。-p:表示端口映射,前者是宿主機端口,后者是容器內的映射端口。可以使用多個-p做多個端口映射,例如:可以將Docker中Tomcat容器的8080端口映射到宿主機上的某一個端口8080,那么以后訪問tomcat只需要:http://宿主機的IP:8080/進入容器之后,初始化執行的命令:/bin/bash;可寫可不寫

刪除指定的容器

#刪除容器
docker rm 容器名稱(容器ID)
#刪除鏡像
docker rmi 鏡像ID(鏡像名稱)

2,跑起來3臺mysql容器

搜索mysql鏡像

docker search mysql

拉取mysql8鏡像

 docker pull mysql:8.0.29

注意:如果防火墻是開啟的,需要關閉防火墻,容器才能啟動。

運行3臺msyql容器

master

docker run -d \
-p 3311:3306 \
-v /usr/local/docker-mount/mysql-master1/conf:/etc/mysql/conf.d \
-v /usr/local/docker-mount/mysql-master1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-master1 \
mysql:8.0.29

slave1

docker run -d \
-p 3312:3306 \
-v /usr/local/docker-mount/mysql-slave1/conf:/etc/mysql/conf.d \
-v /usr/local/docker-mount/mysql-slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave1 \
mysql:8.0.29

slave2

docker run -d \
-p 3313:3306 \
-v /usr/local/docker-mount/mysql-slave2/conf:/etc/mysql/conf.d \
-v /usr/local/docker-mount/mysql-slave2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave2 \
mysql:8.0.29

這樣,通過docker,我們就快速部署了3臺mysql容器。

3,進入容器,搭建集群

進入容器,修改root密碼。

下面示例的是master容器

docker exec –it mysql-master1 /bin/bash

進入容器的bash后,通過mysql -uroot -p,即可進入mysql的命令行模式。
在這里插入圖片描述

修改默認密碼校驗方式

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

slave1、slave2同理,修改root密碼。

給3臺容器配置不同的server-id

我們找到之前容器掛載的conf目錄,在其中vim my.cnf

vim /usr/local/docker-mount/master1/conf/my.cnf[mysqld]
# 服務器唯一id,默認值1
server-id=1
# 設置日志格式,默認值ROW
binlog_format=STATEMENT
vim /usr/local/docker-mount/slave1/conf/my.cnf[mysqld]
# 服務器唯一id,每臺服務器的id必須不同,如果配置其他從機,注意修改id
server-id=2
vim /usr/local/docker-mount/slave2/conf/my.cnf[mysqld]
server-id=3

重啟3臺容器

需要配置的配置文件,到此已經結束,所以這里需要重新啟動mysql容器,將修改的配置讀取。命令如下,最后跟上容器名字或者id即可。

docker restart mysql-master1

在主庫上創建從庫同步賬號

在主數據庫上, 創建一個允許從數據庫來訪問的用戶賬號

用戶: master_slave

密碼:123456

主從復制使用 REPLICATION SLAVE 賦予權限

-- 創建slave用戶
CREATE USER 'master_slave'@'%';-- 設置密碼
ALTER USER 'master_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';-- 授予復制權限
GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%';-- 刷新權限
FLUSH PRIVILEGES;

鎖住主庫,記住master_log_pos

主庫的bin log需要同步到從庫的中繼日志relay log中。(bin log是一種記錄了mysql所有DDL DML語句的二進制日志文件,而relay log從bin log接收了DDL DML語句后,在從庫上執行,得到與主庫相同的數據。)因此在搭建的時候,主庫不能再接受數據,以免造成數據的不一致。

鎖住主庫,在master1上執行如下命令

-- 執行以下命令鎖定數據庫以防止寫入數據。
FLUSH TABLES WITH READ LOCK;

在主機查看mater狀態

show master status;

在這里插入圖片描述

在從庫上change master

在2臺從庫上執行如下命令


CHANGE MASTER TO MASTER_HOST='192.168.184.129',
MASTER_USER='master_slave',MASTER_PASSWORD='123456', MASTER_PORT=3311,
MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=1345;

注意,MASTER_HOST、MASTER_PORT為主庫的ip和端口(容器映射出來的端口,如我的這個是3311),前面申請的用來同步的用戶和密碼,以及最重要的,MASTER_LOG_FILE和MASTER_LOG_POS,這2個需要在主庫鎖住之后執行show master status查看,并填入對應的數值,如果對應不上,就會在SQL線程上出現問題,進而無法主從同步、

開啟主從

start slave;

查看從庫狀態,看看pos和file和主庫是否一致

show slave status\G;

在這里插入圖片描述

如果一切正常,到了這里,已經主從同步了,可以在主庫上嘗試建表插數據,并且在從庫上讀,看看能否讀到。

如果讀不到,看看slave的IO_RUNNING和SQL_RUNNING是否為NO。如果是NO,那就是有問題,可以看接下來的踩坑記錄,或者show slave status給出的結果中,有一些信息提示如error或state可以仔細觀察下,也許能發現一些線索。

如果正常的話,最后不要忘記,回到主庫把鎖解掉

unlock tables;

安裝過程中的踩坑

在安裝的過程中,踩了不少的坑,記錄如下。

1,掛載不要掛錯。

有一些可能是docker掛載的時候沒掛對,導致數據出現混亂,這個我建議大家最好還是在執行復雜命令之前把命令記下來反復核對,沒問題再執行。

2,IO為NO
我遇到了這個問題,排查出是這個slave的server-id沒有配置,無法識別這個slave,所以無法進行IO.

3,SQL為NO
問題到了這里,就開始比較復雜了。SQL線程跑不起來,可能有很多的原因,一般比較常見的就是pos沒對上,解決方法如下

mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;

或者在slave上手動同步一次。

stop slave; CHANGE MASTER TO MASTER_HOST='192.168.184.129',
MASTER_USER='master_slave',MASTER_PASSWORD='123456', MASTER_PORT=3311,
MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=1345;start slave;

如果還是解決不了的話,可以重新開始生成主庫的binlog和從庫的relay log

-- 在從機上執行。功能說明:用于刪除SLAVE數據庫的relaylog日志文件,并重新啟用新的relaylog文件。
reset slave;-- 在主機上執行。功能說明:刪除所有的binglog日志文件,并將日志索引文件清空,重新開始所有新的日志文件。
-- 用于第一次進行搭建主從庫時,進行主庫binlog初始化工作;
reset master;

我這里當時忘記了reset master/slave,所以我直接把掛載目錄清空并重新做了個容器,解決了問題。

過程中還嘗試過直接啟動sql線程,失敗(因為有問題所以起不來,再次重啟當然也起不來,畢竟問題還在那兒)。

start slave sql_thread;

查看error_log,在mysql中執行如下命令

show variables like '%log_error%';

但是發現mysql容器是直接把錯誤輸出在控制臺?可是我沒有看到error輸出啊,于是去slave的掛載目錄的my.cnf中指定了一下error_log路徑。

[mysqld] 
server-id=2
log-error=/var/log/mysqld.log

但是發現error log中還真的是沒有error,只有2個無關緊要的warning,于是這條路走失敗了。

后來分析很有可能就是relay log的問題,reset slave也許就能直接解決問題。

參考資料:
[1],【Docker】基于yum安裝docker
[2],mycat應用與實戰教程

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

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

相關文章

如何系統的學習Python——Python的基本語法

學習Python的基本語法是入門的第一步,以下是一些常見的基本語法概念: 注釋: 用#符號來添加單行注釋,或使用三引號(或""")來添加多行注釋。 # 這是一個單行注釋 這是 多行 注釋 變量和數據類型: 變量用…

Pod和容器設計模式

為什么需要 Pod; Pod 的實現機制; 詳解容器設計模式。 一、為什么需要 Pod 容器的基本概念 現在來看第一個問題:為什么需要 Pod?我們知道 Pod 是 Kubernetes 項目里面一個非常重要的概念,也是非常重要的一個原子調…

144. 二叉樹的前序遍歷

給你二叉樹的根節點 root ,返回它節點值的 前序 遍歷。 示例 1: 輸入:root [1,null,2,3] 輸出:[1,2,3]示例 2: 輸入:root [] 輸出:[]示例 3: 輸入:root [1] 輸出&am…

java方法

目錄 方法的定義 方法的命名規則 方法的調用與重載 方法調用實例 方法的重載 變量的作用域 算法中常見的方法 1:gcd(求兩個整數中的最大公約數) 2:lcm(求兩個整數的最小公倍數) 3:判斷一個整數是否…

SpringCloud(18)之Sleuth +Zipkin鏈路追蹤

一、Zipkin介紹 Zipkin是一個開放源代碼分布式的跟蹤系統,它可以幫助收集服務的時間數據,以解決微服務架構中的延遲問 題,包括數據的收集、存儲、查找和展現。每個服務向zipkin報告計時數據,zipkin會根據調用關系通 過Zipkin UI…

LeetCode: 數組中的第K個最大元素

問題描述 在未排序的數組中找到第k個最大的元素。請注意,你需要找的是數組排序后的第k個最大的元素,而不是第k個不同的元素。 解題思路 解決這個問題有多種方法,下面是幾種常見的解題策略: 排序后選擇: 將數組排序&#xff0c…

ProChat 如何接入 WebSocket

WebSocket是一種在單個TCP連接上進行全雙工通信的協議,允許客戶端和服務器之間進行雙向實時通信。與Server-Sent Events (SSE)類似,WebSocket也能實現實時數據推送,但其功能更為強大且靈活。 全雙工通信:WebSocket不僅允許服務器向…

【TestNG】(4) 重試機制與監聽器的使用

在UI自動化測試用例執行過程中,經常會有很多不確定的因素導致用例執行失敗,比如網絡原因、環境問題等,所以我們有必要引入重試機制(失敗重跑),來提高測試用例成功率。 在不寫代碼的情況沒有提供可配置方式…

Mysql 慢查詢日志

查詢是否開啟慢SQL日志 show variables like %slow_query_log; 開啟慢查詢日志 set global slow_query_logON; 可以通過修改MySQL的配置my.cfg或者my.ini永久生效 slow_query_logON # 開啟慢查詢日志開關 slow_query_log_file/var/lib/mysql/alvin-slow.log # 慢查詢日志…

1.2 在卷積神經網絡中,如何計算各層感受野的大小

1.2 在卷積神經網絡中,如何計算各層感受野的大小 分析與解答: 在卷積神經網絡中,由于卷積的局部連接性,輸出特征圖上的每個節點的取值,是由卷積核在輸入特征圖對應位置的局部區域內進行卷積而得到的,因此這…

COM - IWbemClassObject對象屬性的遍歷

文章目錄 COM - IWbemClassObject對象屬性的遍歷概述筆記場景封裝好的函數bool CWmiBase::enumObjVaule(IWbemClassObject* obj, std::wstring& val)bool CWmiBase::appendVarToString(BSTR& strName, VARIANT& var, std::wstring& val)bool CWmiBase::get_var…

【筆試強訓錯題選擇題】Day5.習題(錯題)解析

文章目錄 前言 錯題題目 錯題解析 總結 前言 錯題題目 1. ? ? 2. 3. ? 4. ? 5. ? 錯題解析 1. 移位運算符的使用 2. 3. 4. 5. 總結

如何用TCC實現分布式事務?

TCC事務介紹 TCC(Try-Confirm-Cancel)是除可靠消息隊列以外的另一種常見的分布式事務機制,它是由數據庫專家帕特 赫蘭德(Pat Helland)在2007年撰寫的論文《Life beyond Distributed Transactions: An Apostate’s Op…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的體育賽事目標檢測系統(Python+PySide6界面+訓練代碼)

摘要:開發和研究體育賽事目標檢測系統對于增強體育分析和觀賞體驗至關重要。本篇博客詳細講述了如何運用深度學習技術構建一個體育賽事目標檢測系統,并提供了完整的實現代碼。系統基于先進的YOLOv8算法,對比了YOLOv7、YOLOv6、YOLOv5的性能&a…

【webrtc】p2p_transport_channel 中忽略Hyper-V

【win11】更改網絡適配器設置 刪掉了hype-v,這時候wsl2 打不開了,但是重啟后,還是存在hyper-v那么,讓webrtc自己不適用hyper-v的網絡Hyper-V 的全程:Hyper-V Virtual Ethernet Adapter https://github.com/SophistSolutions/Stroika/blob/2cd5e8bf4ee01cb5c423367b4df628f…

MFC 模態對話框退出機制的探究

一位讀者問了這樣一個問題: ” 如果我創建了一個可見的模態對話框,卻對用戶來說不可用。舉個例子,假設我在程序中的其他位置收到一個事件,并且我從事件中調用模態 CDialog 上的 DestroyWindow。我注意到 OnDestroy 是在 CDialog 上調用的,但在將 WM_QUIT 消息發送到模態對…

在MyBatis中自定義JsonTypeHandler

在MyBatis中使用自定義的JsonTypeHandler 在處理數據庫中的JSON字段時,我們經常需要將JSON字符串映射到Java對象,或者將Java對象序列化為JSON字符串以存儲在數據庫中。MyBatis作為一個流行的Java持久層框架,允許我們通過自定義類型處理器&am…

爬蟲入門到精通_實戰篇7(Requests+正則表達式爬取貓眼電影)_ 抓取單頁內容,正則表達式分析,保存至文件,開啟循環及多線程

1 目標 貓眼榜單TOP100:https://www.maoyan.com/board 2 流程框架 抓取單頁內容:利用requests請求目標站點,得到單個網頁HTML代碼,返回結果。正則表達式分析:根據HTML代碼分析得到電影名稱,主演,上映時間,評分,圖片…

跨域問題與解決方法

跨域問題與解決方法 同源策略 瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議域名端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。 同源策略限制以下幾種行為: Cookie、LocalStorage 和 IndexDB 無法讀取 DO…

C語言中的分支和循環語句:從入門到精通

分支和循環語句 1. 前言2. 預備知識2.1 getchar函數2.2 putchar函數2.3 計算數組的元素個數2.4 清屏2.5 程序的暫停2.6 字符串的比較 3. 結構化3.1 順序結構3.2 分支結構3.3 循環結構 4. 真假性5. 分支語句(選擇結構)5.1 if語句5.1.1 語法形式5.1.2 else…