CentOS: 7.4.1708
Docker: 1.13.1

概述

MySQL復制數據流程:

主庫在數據更新提交事務之前,將事件異步記錄到binlog二進制日志文件中,日志記錄完成后存儲引擎提交本次事務
從庫啟動一個I/O線程與主庫建立連接,用來請求主庫中要更新的binlog。這時主庫創建的binlog dump線程,這是二進制轉儲線程,如果有新更新的事件,就通知I/O線程;當該線程轉儲二進制日志完成,沒有新的日志時,該線程進入sleep狀態。
從庫的I/O線程接收到新的事件日志后,保存到自己的relay log(中繼日志)中
從庫的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-bin,log-slave-updates設置為從庫重放中繼日志時,記錄到自己的二進制日志中,可以讓從庫作為其他服務器的主庫,將二進制日志轉發給其他從庫,在做一主多從方案時可考慮該種方案。

Dockerfile構建MySQL鏡像

構建所需文件

這里master和slave文件各自保存不共用,先創建文件夾 /usr/local/mysql 然后在目錄創建master和slave兩個目錄,再各自創建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]

這里的master和slave都是基于同一個鏡像構建,使用的存儲引擎和其他的組件最好是同一中,不然在復制過程中可能會出現異常。

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

構建master和slave鏡像并運行容器

構建master鏡像

docker build -t master/mysql .

構建slave鏡像

docker build -t slave/mysql .

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

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

# 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 是否開啟

創建復制賬號

前面有提到從庫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: Yes和Slave_SQL_Running: Yes可以看到I/O線程和SQL線程已啟動運行中。

測試同步數據

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

向主庫添加一條數據

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

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

總結

上述是最簡單最基本的配置,但是理解上面的配置過程,就可以根據自身情況定制不同方案,實現一主多從,主主復制(主動-主動或主動-被動模式)等等來滿足自身需求。

MySQL的復制雖然使用簡單方便,但也伴隨著一些問題需要我們在使用中進行解決,比如:不能從服務器異常停止中恢復,數據同步的延遲等等,還好現在遇到的大部分問題在行業中已得到相應的解決。對這方面感興趣的可以去了解下現在解決這些問題的中間件實現方案。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對三五互聯的支持。

更多關于云服務器域名注冊,虛擬主機的問題,請訪問三五互聯官網:m.shinetop.cn

贊(0)
聲明:本網站發布的內容(圖片、視頻和文字)以原創、轉載和分享網絡內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。郵箱:3140448839@qq.com。本站原創內容未經允許不得轉載,或轉載時需注明出處:三五互聯知識庫 » 基于Docker如何實現MySQL主從復制詳解

登錄

找回密碼

注冊

主站蜘蛛池模板: 国产精品久久人人做人人爽| 中文无码热在线视频| 九九热精品视频免费在线| 亚洲欧美日韩综合久久| A级毛片100部免费看| 精品国产一国产二国产三| 操操操综合网| 中文字幕在线精品国产| 免费人成再在线观看视频 | 国产强奷在线播放免费| 亚洲一区二区三区激情在线| 亚洲Av综合日韩精品久久久| 在线观看视频一区二区三区| 亚洲国产精品久久综合网| 亚洲精品一区国产精品| 成人综合人人爽一区二区| 亚洲国产综合自在线另类| 国产一区二区不卡自拍| 99精品日本二区留学生| 五月天免费中文字幕av| 亚洲精品宾馆在线精品酒店| 永久无码天堂网小说区| 国产AV无码专区亚洲AV紧身裤| 午夜福利视频| 久久国产自拍一区二区三区| 天天做日日做天天添天天欢公交车| 孟州市| 国产主播精品福利午夜二区| 欧美乱码伦视频免费| 女人被狂躁的高潮免费视频| 久久亚洲精品中文字幕无| 狠狠亚洲色一日本高清色| 国产在线精品无码二区| 亚洲日本一区二区三区在线播放| 久久精品国产再热青青青| 深夜免费av在线观看| 真实国产乱子伦视频| 在国产线视频A在线视频| 久久精品一区二区三区中文字幕 | 免费人成再在线观看视频| 亚洲av色香蕉一区二区三|