使用Docker部署的基于binlog實(shí)現(xiàn)Mysql8的操作方法
概念
MySQL 基于 Binlog 的主從復(fù)制(Master-Slave Replication)是 MySQL 數(shù)據(jù)庫中實(shí)現(xiàn)數(shù)據(jù)復(fù)制的一種機(jī)制。在這種復(fù)制模式下,主庫(Master)記錄所有對(duì)數(shù)據(jù)庫的修改操作(如 INSERT、UPDATE、DELETE 等)到 二進(jìn)制日志(Binlog),從庫(Slave)則讀取這些日志并執(zhí)行相同的操作,從而保持與主庫的數(shù)據(jù)一致性。
1. 基本概念:
- 主庫(Master):所有的數(shù)據(jù)修改操作都在主庫上執(zhí)行,主庫會(huì)將這些修改記錄到 Binlog 中。
- 從庫(Slave):從庫通過連接到主庫,讀取主庫的 Binlog 并將其中的操作應(yīng)用到自己的數(shù)據(jù)上,達(dá)到與主庫一致的目的。
2. Binlog(二進(jìn)制日志)
Binlog 是 MySQL 用來記錄所有修改數(shù)據(jù)庫的事件的日志文件,包括:
- 數(shù)據(jù)修改事件:例如 INSERT、UPDATE、DELETE 等。
- DDL 事件:例如 CREATE、ALTER 等操作。
- 日志文件:Binlog 是一個(gè)文件序列,每個(gè)文件都有一個(gè)唯一的名稱。它是記錄所有數(shù)據(jù)庫更改的核心。
Binlog 存儲(chǔ)的是操作日志而非數(shù)據(jù)本身,因此從庫需要根據(jù)這些操作來更新自己的數(shù)據(jù)。
3. 工作流程:
基于 Binlog 的復(fù)制模式大致可以分為以下幾個(gè)步驟:
1. 主庫記錄 Binlog
- 在主庫中執(zhí)行任何更改操作時(shí),這些操作會(huì)被記錄到主庫的 Binlog 文件中。
- 這些操作是順序記錄的,并按時(shí)間順序排列。
2. 從庫連接主庫
- 從庫通過連接主庫來獲取 Binlog 數(shù)據(jù)。這個(gè)連接通過 IO 線程 來實(shí)現(xiàn),從庫會(huì)定期向主庫請(qǐng)求新的 Binlog 事件。
- 從庫會(huì)記錄主庫當(dāng)前的 Binlog 位置,并請(qǐng)求從該位置開始同步數(shù)據(jù)。
3. 從庫讀取 Binlog
- 從庫的 IO 線程從主庫獲取到最新的 Binlog 事件,并將這些事件存儲(chǔ)到從庫的本地 Binlog 文件中。
4. 從庫執(zhí)行 Binlog 事件
- 從庫的 SQL 線程 會(huì)讀取本地存儲(chǔ)的 Binlog,并根據(jù)日志中的操作來執(zhí)行相應(yīng)的 SQL 語句。這樣,從庫就能夠與主庫的數(shù)據(jù)保持一致。
5. 保持同步
- 主庫和從庫通過 Binlog 的持續(xù)同步保持一致。每次主庫有新的數(shù)據(jù)更新時(shí),這些更新會(huì)通過 Binlog 被傳播到從庫。
4. 主從復(fù)制的關(guān)鍵組件:
- Binlog(Binary Log):記錄所有更改數(shù)據(jù)的操作,主庫通過 Binlog 來傳遞更改的內(nèi)容。
- I/O 線程:從庫的 I/O 線程負(fù)責(zé)從主庫讀取 Binlog 事件,并將其寫入到從庫的本地 Binlog 中。
- SQL 線程:從庫的 SQL 線程負(fù)責(zé)讀取本地 Binlog,執(zhí)行其中的操作,使從庫的數(shù)據(jù)保持同步。
5. 復(fù)制模式的類型:
基于 Binlog 的主從復(fù)制可以分為不同的復(fù)制模式,主要有以下幾種:
異步復(fù)制:
- 在這種模式下,主庫執(zhí)行操作后,不等待從庫確認(rèn)即返回。主庫不會(huì)等待從庫是否已經(jīng)同步完數(shù)據(jù)。
- 優(yōu)點(diǎn):性能高,不會(huì)因?yàn)榈却龔膸齑_認(rèn)而增加延遲。
- 缺點(diǎn):如果主庫故障,可能會(huì)丟失未同步的數(shù)據(jù)。
半同步復(fù)制(Semi-Synchronous Replication):
- 在這種模式下,主庫在執(zhí)行操作后,至少等待一個(gè)從庫確認(rèn)已接收數(shù)據(jù)并寫入本地 Binlog 后才返回。這比完全異步復(fù)制稍微安全一些,但仍然存在延遲。
- 優(yōu)點(diǎn):比異步復(fù)制更安全,至少一個(gè)從庫能夠確認(rèn)同步。
- 缺點(diǎn):會(huì)增加一定的延遲,可能影響性能。
全同步復(fù)制(Synchronous Replication):
- 在這種模式下,主庫在執(zhí)行操作后,必須等待所有從庫確認(rèn)數(shù)據(jù)已經(jīng)同步才會(huì)返回。
- 優(yōu)點(diǎn):可以保證主庫和所有從庫的數(shù)據(jù)完全一致。
- 缺點(diǎn):性能開銷大,延遲較高,且需要更多的資源。
6. 復(fù)制延遲與容錯(cuò)性:
復(fù)制延遲:由于主庫和從庫是異步同步的,因此在高并發(fā)的場(chǎng)景中,從庫可能會(huì)出現(xiàn)延遲,導(dǎo)致主庫和從庫的數(shù)據(jù)不一致。這種延遲通常是由于從庫處理速度較慢,或者網(wǎng)絡(luò)問題等原因?qū)е隆?/p>
容錯(cuò)性:基于 Binlog 的主從復(fù)制,主庫發(fā)生故障時(shí),需要手動(dòng)或自動(dòng)切換到從庫。雖然從庫可以保持主庫的副本,但在主庫故障時(shí)可能會(huì)丟失一定的事務(wù),因此對(duì)高可用性的需求需要結(jié)合其他技術(shù)(如 MHA、ProxySQL、Group Replication 等)來提高容錯(cuò)性。
7. 優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
- 簡(jiǎn)潔性:基于 Binlog 的復(fù)制設(shè)置較為簡(jiǎn)單,容易理解和實(shí)現(xiàn)。
- 性能:相比于 GTID 復(fù)制模式,Binlog 復(fù)制模式的性能開銷較小。
- 兼容性強(qiáng):Binlog 復(fù)制是 MySQL 的標(biāo)準(zhǔn)復(fù)制方式,幾乎所有版本都支持。
- 適用廣泛:適用于大多數(shù)需要主從同步的場(chǎng)景,特別是讀寫分離和負(fù)載均衡。
缺點(diǎn):
- 故障恢復(fù)較慢:如果主庫發(fā)生故障,可能需要人工干預(yù)來恢復(fù)主從復(fù)制關(guān)系,且在切換過程中可能會(huì)丟失未同步的數(shù)據(jù)。
- 可能出現(xiàn)數(shù)據(jù)不一致:在網(wǎng)絡(luò)延遲或復(fù)制延遲較大的情況下,主從數(shù)據(jù)可能暫時(shí)不一致。
- 復(fù)制延遲:高負(fù)載時(shí),主從復(fù)制可能存在延遲,導(dǎo)致從庫的數(shù)據(jù)滯后于主庫。
總結(jié):
基于 Binlog 的主從復(fù)制是 MySQL 中實(shí)現(xiàn)數(shù)據(jù)復(fù)制的常見方式,它通過記錄主庫的二進(jìn)制日志,并將日志同步到從庫,從而保持?jǐn)?shù)據(jù)一致性。這種方式在大多數(shù)應(yīng)用中運(yùn)行穩(wěn)定、性能良好,但需要注意故障恢復(fù)、復(fù)制延遲等問題,適用于高可用架構(gòu)中進(jìn)行讀寫分離、負(fù)載均衡等場(chǎng)景。
binlog二進(jìn)制日志文件記錄了主服務(wù)器上所有數(shù)據(jù)庫的更改操作
實(shí)操,一個(gè)主庫兩個(gè)從庫之間進(jìn)行主從復(fù)制
參考:https://blog.csdn.net/2401_85648342/article/details/139765433
數(shù)據(jù)持久化管理-路徑規(guī)劃
. ├── docker-compose.yml ├── master1 │ ├── conf │ ├── data │ └── logs ├── slave1 │ ├── conf │ ├── data │ └── logs └── slave2 ├── conf ├── data └── logs
創(chuàng)建相關(guān)文件夾
# 創(chuàng)建持久化目錄 mkdir -p /opt/mysql-compose/{master1/{data,logs,conf},slave1/{data,logs,conf},slave2/{data,logs,conf}} # 修改權(quán)限 chmod -R 777 /opt/mysql-compose/{master1/{data,logs},slave1/{data,logs},slave2/{data,logs}} # 臨時(shí)測(cè)試-刪除持久化的數(shù)據(jù) rm -rf /opt/mysql-compose/{master1/{data/*,logs/*},slave1/{data/*,logs/*},slave2/{data/*,logs/*}} #rm -rf /opt/mysql-compose/{master1/data/*,slave1/data/*,slave2/data/*}
分別上傳配置文件(my.cnf)至 conf 目錄下
master1配置文件my.cnf如下
[mysqld] # 服務(wù)器唯一id,默認(rèn)值1 server-id=11 # 設(shè)置日志格式,默認(rèn)值ROW binlog_format=STATEMENT # 二進(jìn)制日志名,默認(rèn)binlog # log-bin=binlog # 設(shè)置需要復(fù)制的數(shù)據(jù)庫,默認(rèn)復(fù)制全部數(shù)據(jù)庫 binlog-do-db=testdb # 設(shè)置不需要復(fù)制的數(shù)據(jù)庫 #binlog-ignore-db=mysql #binlog-ignore-db=infomation_schema #binlog-ignore-db=sys #binlog-ignore-db=performance_schema
slave1配置文件my.cnf如下
# 服務(wù)器唯一id,每臺(tái)服務(wù)器的id必須不同,如果配置其他從機(jī),注意修改id server-id=12 # 中繼日志名,默認(rèn)xxxxxxxxxxxx-relay-bin #relay-log=relay-bin
slave2配置文件my.cnf如下
# 服務(wù)器唯一id,每臺(tái)服務(wù)器的id必須不同,如果配置其他從機(jī),注意修改id server-id=13 # 中繼日志名,默認(rèn)xxxxxxxxxxxx-relay-bin #relay-log=relay-bin
docker-compose.yml內(nèi)容如下
#version: "3.5" services: #mysql: # image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29 # container_name: mysql8 # ports: # - "13306:3306" # restart: always # environment: # - MYSQL_ROOT_PASSWORD=123456 # - TZ=Asia/Shanghai # volumes: # - /opt/mysql-compose/master1/conf:/etc/mysql/conf.d # - /opt/mysql-compose/master1/logs:/var/log/mysql # - /opt/mysql-compose/master1/data:/var/lib/mysql mysql_master1: image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29 container_name: mysql_master1 ports: - "13306:3306" restart: always environment: - MYSQL_ROOT_PASSWORD=123456 - TZ=Asia/Shanghai volumes: - ./master1/mysql:/etc/mysql - ./master1/logs:/var/log/mysql - ./master1/data:/var/lib/mysql mysql_slave1: image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29 container_name: mysql_slave1 ports: - "13307:3306" restart: always environment: - MYSQL_ROOT_PASSWORD=123456 - TZ=Asia/Shanghai volumes: - ./slave1/mysql:/etc/mysql - ./slave1/logs:/var/log/mysql - ./slave1/data:/var/lib/mysql mysql_slave2: image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29 container_name: mysql_slave2 ports: - "13308:3306" restart: always environment: - MYSQL_ROOT_PASSWORD=123456 - TZ=Asia/Shanghai volumes: - ./slave2/mysql:/etc/mysql - ./slave2/logs:/var/log/mysql - ./slave2/data:/var/lib/mysql
注意:/var/lib/mysql/auto.cnf文件中的server-uuid是 MySQL 數(shù)據(jù)庫服務(wù)器的唯一標(biāo)識(shí)符(UUID)。這個(gè)標(biāo)識(shí)符用于標(biāo)識(shí) MySQL 實(shí)例,尤其在復(fù)制(Replication)設(shè)置中,它可以幫助區(qū)分不同的數(shù)據(jù)庫實(shí)例。在 MySQL 中,/var/lib/mysql/auto.cnf 是一個(gè)自動(dòng)生成的配置文件,通常包含 MySQL 實(shí)例的 UUID 信息。你可以通過這個(gè)文件來查看 MySQL 服務(wù)器的 UUID。它是在 MySQL 啟動(dòng)時(shí)自動(dòng)生成的,并且通常不需要手動(dòng)修改。如果docker-compose掛載本地目錄已有掛載數(shù)據(jù)請(qǐng)檢查,如果有重復(fù)的修改server-uuid或者刪除這個(gè)auto.cnf文件之后重啟mysql服務(wù)
[auto] server-uuid=bc8c658e-ce63-11ef-89ae-0242ac130004
運(yùn)行docker-compose命令啟動(dòng)服務(wù)
# 進(jìn)入docker-compose.yml的所在層級(jí)文件夾 cd /opt/mysql-compose # 運(yùn)行docker compose 容器服務(wù) docker compose up -d #停止docker compose 容器服務(wù) docker compose down #查看docker compose 容器服務(wù)狀態(tài) docker compose ps
使用數(shù)據(jù)庫管理工具連接主庫和從庫數(shù)據(jù)庫
查看主庫狀態(tài),連接master1數(shù)據(jù)庫執(zhí)行下面sql語句
SHOW MASTER STATUS;
查看結(jié)果
File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
---|---|---|---|---|
binlog.000005 | 157 | testdb |
注意:如果是指定的數(shù)據(jù)庫比如testdb的話,先在主數(shù)據(jù)庫master1創(chuàng)建數(shù)據(jù)庫,并創(chuàng)建表添加數(shù)據(jù)后,導(dǎo)出腳本,然后從庫slave1和slave2也要?jiǎng)?chuàng)建數(shù)據(jù)庫testdb導(dǎo)入執(zhí)行sql腳本,使主從庫數(shù)據(jù)一致,執(zhí)行主從復(fù)制操作之前停止其他服務(wù)對(duì)主庫的讀寫操作,不然會(huì)造成數(shù)據(jù)丟失等問題;簡(jiǎn)單來說在主從復(fù)制操作開始之前保證主從數(shù)據(jù)庫數(shù)據(jù)一致
分別連接slave1和slave2數(shù)據(jù)庫執(zhí)行下面sql語句,設(shè)置或修復(fù) MySQL 的主從復(fù)制關(guān)系
#1.重置從服務(wù)器的復(fù)制設(shè)置。 #功能: 清除當(dāng)前從服務(wù)器的所有復(fù)制設(shè)置 #作用: 重置從服務(wù)器的復(fù)制狀態(tài),包括清除 MASTER_* 配置、復(fù)制相關(guān)的文件、狀態(tài)標(biāo)記等。如果之前從服務(wù)器已經(jīng)在運(yùn)行復(fù)制任務(wù),執(zhí)行這個(gè)命令會(huì)停止復(fù)制進(jìn)程并清除復(fù)制的所有狀態(tài)信息。 #使用場(chǎng)景: 這通常在配置新的復(fù)制關(guān)系,或者需要重新設(shè)置復(fù)制時(shí)使用。 RESET SLAVE; #2.配置從服務(wù)器連接到指定的主服務(wù)器(192.168.137.2),并設(shè)置復(fù)制的起始點(diǎn)。 #功能: 設(shè)置從服務(wù)器的主服務(wù)器連接信息及復(fù)制位置。 #作用: 配置從服務(wù)器如何連接到主服務(wù)器,以及從哪個(gè)二進(jìn)制日志文件和位置開始復(fù)制。 CHANGE MASTER TO MASTER_HOST='192.168.137.2', # 指定主服務(wù)器的 IP 地址或主機(jī)名,表示從服務(wù)器將連接到這個(gè)主機(jī) MASTER_PORT=13306, # 指定主服務(wù)器的端口號(hào),通常 MySQL 的默認(rèn)端口是 3306,根據(jù)實(shí)際情況修改 MASTER_USER='root', # 指定主服務(wù)器上用于連接的用戶名,通常是具備復(fù)制權(quán)限的用戶 MASTER_PASSWORD='123456', # 指定上述用戶的密碼,用于認(rèn)證連接 MASTER_LOG_FILE='binlog.000005',# 指定主服務(wù)器的二進(jìn)制日志文件名,從該文件的指定位置開始復(fù)制數(shù)據(jù)。 MASTER_LOG_POS=157; #指定從主服務(wù)器的二進(jìn)制日志文件中從哪個(gè)位置開始復(fù)制。位置是一個(gè)數(shù)字,表示從該位置開始的日志條目 #3.啟動(dòng)從服務(wù)器的復(fù)制進(jìn)程。 #功能: 啟動(dòng)從服務(wù)器的復(fù)制進(jìn)程 #作用: 在執(zhí)行完 CHANGE MASTER TO 后,啟動(dòng)從服務(wù)器的復(fù)制任務(wù),使得從服務(wù)器開始連接主服務(wù)器,并從指定的二進(jìn)制日志文件位置開始復(fù)制數(shù)據(jù)。 START SLAVE; #4.查看從服務(wù)器的復(fù)制狀態(tài)。 #功能: 顯示從服務(wù)器的復(fù)制狀態(tài) #作用: 查看從服務(wù)器的當(dāng)前復(fù)制狀態(tài),包括是否成功連接到主服務(wù)器,復(fù)制是否正常進(jìn)行,以及任何可能出現(xiàn)的錯(cuò)誤。 該命令會(huì)返回一個(gè)包含多個(gè)字段的結(jié)果,常用的字段有 Slave_IO_Running 和 Slave_SQL_Running,這兩者的值為yes,分別表示 I/O 線程和 SQL 線程是否正在運(yùn)行,Last_Error 顯示最后一個(gè)錯(cuò)誤信息等。 SHOW SLAVE STATUS;
到此這篇關(guān)于使用Docker部署的基于binlog實(shí)現(xiàn)Mysql8的文章就介紹到這了,更多相關(guān)使用Docker部署的基于binlog實(shí)現(xiàn)Mysql8內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Dockerfile制作java運(yùn)行環(huán)境的鏡像的方法步驟
這篇文章主要介紹了利用Dockerfile制作java運(yùn)行環(huán)境的鏡像的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11docker-compose部署coredns如何實(shí)現(xiàn)自建DNS服務(wù)
本文介紹了如何在內(nèi)網(wǎng)中使用自建的CoreDNS服務(wù)進(jìn)行域名解析,通過配置Corefile和hosts文件,實(shí)現(xiàn)內(nèi)部域名解析,無需在互聯(lián)網(wǎng)上注冊(cè)域名,使用docker-compose運(yùn)行CoreDNS,并通過修改resolv.conf文件配置DNS服務(wù)2025-01-01騰訊云服務(wù)器docker開啟端口后無法訪問的解決方法
本文主要介紹了騰訊云服務(wù)器docker開啟端口后無法訪問的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Docker 中的 bootfs、rootfs 簡(jiǎn)介
Docker中的bootfs和rootfs是容器文件系統(tǒng)的兩個(gè)層次,bootfs負(fù)責(zé)內(nèi)核啟動(dòng),而rootfs提供運(yùn)行環(huán)境,容器共享宿主機(jī)內(nèi)核,因此沒有獨(dú)立的bootfs,只使用精簡(jiǎn)的rootfs,感興趣的朋友跟隨小編一起看看吧2024-12-12