基於Docker實現MySQL主從複製

来源:https://www.cnblogs.com/ytao-blog/archive/2019/11/02/11780468.html
-Advertisement-
Play Games

MySQL的主從複製是實現應用的高性能,高可用的基礎。對於資料庫讀操作較密集的應用,通過使資料庫請求負載均衡分配到不同MySQL伺服器,可有效減輕資料庫壓力。當遇到MySQL單點故障中,也能在短時間內實現故障切換。 ...


MySQL

前言

MySQL的主從複製是實現應用的高性能,高可用的基礎。對於資料庫讀操作較密集的應用,通過使資料庫請求負載均衡分配到不同MySQL伺服器,可有效減輕資料庫壓力。當遇到MySQL單點故障中,也能在短時間內實現故障切換。本文就MySQL的內建的複製功能進行闡述。

版本

  • MySQl: 5.7.17
  • CentOS: 7.4.1708
  • Docker: 1.13.1

概述

MySQL複製數據流程:

  1. 主庫在數據更新提交事務之前,將事件非同步記錄到binlog二進位日誌文件中,日誌記錄完成後存儲引擎提交本次事務
  2. 從庫啟動一個I/O線程與主庫建立連接,用來請求主庫中要更新的binlog。這時主庫創建的binlog dump線程,這是二進位轉儲線程,如果有新更新的事件,就通知I/O線程;當該線程轉儲二進位日誌完成,沒有新的日誌時,該線程進入sleep狀態。
  3. 從庫的I/O線程接收到新的事件日誌後,保存到自己的relay log(中繼日誌)中
  4. 從庫的SQL線程讀取中繼日誌中的事件,並執行更新保存。
    主從複製流程

配置主從庫

主庫my.cnf配置

在主庫的my.cnf中打開二進位日誌,並設置服務Id。

log-bin = mysql-bin
server-id = 1

註意server-id必須是一個唯一的數字,必須主從不一致, 且主從庫必須設置項。

從庫my.cnf配置

log-bin = mysql-bin
server-id = 2
log-slave-updates = 1
read-only = 1

從庫也開啟log-binlog-slave-updates設置為從庫重放中繼日誌時,記錄到自己的二進位日誌中,可以讓從庫作為其他伺服器的主庫,將二進位日誌轉發給其他從庫,在做一主多從方案時可考慮該種方案。

Dockerfile構建MySQL鏡像

構建所需文件

這裡masterslave文件各自保存不共用,先創建文件夾 /usr/local/mysql 然後在目錄創建masterslave兩個目錄,再各自創建data文件夾
文件目錄

  • data 目錄用來保存數據文件的目錄
  • Dockerfile 保存Dockerfile內容
  • init.sql 初始化資料庫的SQL
  • my.cnf 資料庫配置文件,配置方式上面已提到
  • start.sh Dockerfile構建MySQL時的腳本

Dockerfile 內容

# 利用 mysql 鏡像創建新的鏡像
FROM mysql:5.7.17

ENV MYSQL_ROOT_PASSWORD ytao

COPY start.sh /mysql/start.sh
COPY my.cnf /etc/mysql/my.cnf  
COPY init.sql /mysql/init.sql

EXPOSE 3306
CMD ["sh", "/mysql/start.sh"]

這裡的masterslave都是基於同一個鏡像構建,使用的存儲引擎和其他的組件最好是同一中,不然在複製過程中可能會出現異常。

init.sql 初始化數據

-- 創建 data_copy 資料庫
DROP DATABASE IF EXISTS `data_copy`;
CREATE DATABASE `data_copy` /*!40100 DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_general_ci */;

-- 創建 person 表
USE `data_copy`;
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `id` int(32) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

創建data_copy資料庫和person表。

start.sh 腳本

#!/bin/sh
echo '啟動mysql'
service mysql start
sleep 5

echo '初始化資料庫'
mysql -uroot -pytao < /mysql/init.sql
echo '初始化完成!'
tail -f /dev/null

構建masterslave鏡像並運行容器

構建master鏡像

docker build -t master/mysql .

構建slave鏡像

docker build -t slave/mysql .

構建成功會返回 Successfuly,或通過docker images命令查看鏡像
Dockerfile構建成功

使用剛構建的鏡像來運行容器

# master 容器
docker run --name master -p 3306:3306 -v /usr/local/mysql/master/data/:/var/lib/mysql -d master/mysql

# slave 容器
docker run --name slave -p 3307:3306 -v /usr/local/mysql/slave/data/:/var/lib/mysql -d slave/mysql

指定master埠為3306,slave埠為3307,掛載data目錄為保存數據的目錄。

連接到資料庫後驗證資料庫是否初始化成功
資料庫初始化的表

查看 log-bin 是否開啟
log-bin是否開啟

創建複製賬號

前面有提到從庫I/O線程要與主庫建立連接,所以需要用到賬號進行驗證。賬號除了要有連接許可權(REPLICATION CLIENT),同時還要有複製許可權(REPLICATION SLAVE)。

GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO muser@'%' IDENTIFIED BY 'ytao';   

這裡設置的訪問地址是開放的,實際使用過程中安全起見一定要指定訪問地址。

從庫啟動複製

從庫連接到主庫,獲取到二進位日誌後重放。這裡首先要配置上面創建的賬號進行連接,使用命令進行相應的設置。

CHANGE MASTER TO 
MASTER_HOST = '47.107.xx.xxx',
MASTER_PORT = 3306,
MASTER_USER = 'muser',
MASTER_PASSWORD = 'ytao',
MASTER_LOG_FILE = 'mysql-bin.000006';

到這裡複製還沒有啟動,需要再從庫中啟動

START SLAVE;

使用SHOW SLAVE STATUS\G;命令查看啟動後的情況
複製啟動信息

上面標記的輸出信息Slave_IO_Running: YesSlave_SQL_Running: Yes可以看到I/O線程和SQL線程已啟動運行中。

測試同步數據

如果在主庫中添加,更新或刪除一個數據,那麼從庫中應該也有與主庫對應的數據變化。
向主庫添加一條數據

INSERT INTO `data_copy`.`person` (`id`, `name`) VALUES ('1', 'ytao');

查詢從庫數據,數據已被同步過來。
查詢從庫數據

總結

上述是最簡單最基本的配置,但是理解上面的配置過程,就可以根據自身情況定製不同方案,實現一主多從,主主複製(主動-主動或主動-被動模式)等等來滿足自身需求。
MySQL的複製雖然使用簡單方便,但也伴隨著一些問題需要我們在使用中進行解決,比如:不能從伺服器異常停止中恢復,數據同步的延遲等等,還好現在遇到的大部分問題在行業中已得到相應的解決。對這方面感興趣的可以去瞭解下現在解決這些問題的中間件實現方案。




個人博客: https://ytao.top
我的公眾號 ytao
我的公眾號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、安裝wmi-exporter 首先在需要監控的Windows機器上安裝wmi_exporter。wmi_exporter下載地址:https://github.com/martinlindhe/wmi_exporter/releases 下載後,雙擊即可完成安裝。 完成安裝後,會自動創建一個開機 ...
  • RHEL的yum是要給錢才能用的,想要不給錢的用,就把原裝yum替換為centos的yum1.查看原有yum包rpm -qa|grep yumyum-langpacks-0.4.2-7.el7.noarchyum-metadata-parser-1.1.4-10.el7.x86_64yum-rhn-... ...
  • 由於我在做linux下的QT開發,有時候會用到shell腳本的輔助,但是需要QT運行shell腳本並獲取執行結果,今天給大家分享下我的技巧,廢話少說直接上代碼: ...
  • Linux用戶和組的屬性與許可權本章結構1.用戶賬號和組賬號概述2.用戶賬號和組賬號管理3.查詢賬號信息4.查看目錄或文件的屬性5.設置目錄或文件的許可權6.設置目錄或文件的歸屬 前言在linux中一切都是文件(文件夾和硬體設備是特殊的文件),如果有可能儘量使用文本文件。文本文件是人和機器能理解的文件, ...
  • 作為IntelliJ IDEA mac新手,IDEA如何快速搭建Java開發環境呢? 今天小編就給大家帶來了IntelliJ IDEA mac使用教程,想知道IDEA如何快速搭建Java開發環境?那就一起來看看吧! 全局JDK(預設配置) 具體步驟:頂部工具欄 File ->Other Settin ...
  • Ubuntu軟體管理:dpkg和apt Debian軟體包通常為預編譯的二進位格式的擴展名“.deb”,類似rpm文件, dpkg:package manager for Debian,類似於rpm, dpkg是基於Debian的系統的包管理器。可以安裝,刪除和構建軟體包,但無法自動下載和安裝軟體包 ...
  • rpm包管理 程式源代碼 >預處理 >編譯 >彙編 >鏈接 數據處理 轉為彙編代碼 進行彙編 引入庫文件 靜態編譯:.a 動態編譯:.so包的組成: 二進位文件、庫文件、配置文件、幫助文件程式包管理器: debian: deb文件, dpkg包管理器 redhat: rpm文件, rpm包管理器 r ...
  • 升級過程: 原系統:CentOS7.3 [root@my-e450 ~]# uname -r3.10.0-514.el7.x86_64 安裝必需的軟體包: # yum update# yum install -y ncurses-devel make gcc bc bison flex elfuti ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...