校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁(yè) > 知識(shí)庫(kù) > 基于Docker如何實(shí)現(xiàn)MySQL主從復(fù)制詳解

基于Docker如何實(shí)現(xiàn)MySQL主從復(fù)制詳解

熱門(mén)標(biāo)簽:外呼系統(tǒng)打哪顯哪 江西外呼系統(tǒng) 湖北ai智能電銷(xiāo)機(jī)器人 高德地圖標(biāo)注論壇 北海市地圖標(biāo)注app 新邵電銷(xiāo)機(jī)器人企業(yè) 蘭州ai電銷(xiāo)機(jī)器人招商 AI電銷(xiāo)機(jī)器人 源碼 新科美甲店地圖標(biāo)注

前言

MySQL的主從復(fù)制是實(shí)現(xiàn)應(yīng)用的高性能,高可用的基礎(chǔ)。對(duì)于數(shù)據(jù)庫(kù)讀操作較密集的應(yīng)用,通過(guò)使數(shù)據(jù)庫(kù)請(qǐng)求負(fù)載均衡分配到不同MySQL服務(wù)器,可有效減輕數(shù)據(jù)庫(kù)壓力。當(dāng)遇到MySQL單點(diǎn)故障中,也能在短時(shí)間內(nèi)實(shí)現(xiàn)故障切換。本文就MySQL的內(nèi)建的復(fù)制功能進(jìn)行闡述。

版本

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

概述

MySQL復(fù)制數(shù)據(jù)流程:

  1. 主庫(kù)在數(shù)據(jù)更新提交事務(wù)之前,將事件異步記錄到binlog二進(jìn)制日志文件中,日志記錄完成后存儲(chǔ)引擎提交本次事務(wù)
  2. 從庫(kù)啟動(dòng)一個(gè)I/O線(xiàn)程與主庫(kù)建立連接,用來(lái)請(qǐng)求主庫(kù)中要更新的binlog。這時(shí)主庫(kù)創(chuàng)建的binlog dump線(xiàn)程,這是二進(jìn)制轉(zhuǎn)儲(chǔ)線(xiàn)程,如果有新更新的事件,就通知I/O線(xiàn)程;當(dāng)該線(xiàn)程轉(zhuǎn)儲(chǔ)二進(jìn)制日志完成,沒(méi)有新的日志時(shí),該線(xiàn)程進(jìn)入sleep狀態(tài)。
  3. 從庫(kù)的I/O線(xiàn)程接收到新的事件日志后,保存到自己的relay log(中繼日志)中
  4. 從庫(kù)的SQL線(xiàn)程讀取中繼日志中的事件,并執(zhí)行更新保存。

配置主從庫(kù)

主庫(kù)my.cnf配置

在主庫(kù)的my.cnf中打開(kāi)二進(jìn)制日志,并設(shè)置服務(wù)Id。

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

注意server-id必須是一個(gè)唯一的數(shù)字,必須主從不一致, 且主從庫(kù)必須設(shè)置項(xiàng)。

從庫(kù)my.cnf配置

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

從庫(kù)也開(kāi)啟log-bin,log-slave-updates設(shè)置為從庫(kù)重放中繼日志時(shí),記錄到自己的二進(jìn)制日志中,可以讓從庫(kù)作為其他服務(wù)器的主庫(kù),將二進(jìn)制日志轉(zhuǎn)發(fā)給其他從庫(kù),在做一主多從方案時(shí)可考慮該種方案。

Dockerfile構(gòu)建MySQL鏡像

構(gòu)建所需文件

這里master和slave文件各自保存不共用,先創(chuàng)建文件夾 /usr/local/mysql 然后在目錄創(chuàng)建master和slave兩個(gè)目錄,再各自創(chuàng)建data文件夾

  • data 目錄用來(lái)保存數(shù)據(jù)文件的目錄
  • Dockerfile 保存Dockerfile內(nèi)容
  • init.sql 初始化數(shù)據(jù)庫(kù)的SQL
  • my.cnf 數(shù)據(jù)庫(kù)配置文件,配置方式上面已提到
  • start.sh Dockerfile構(gòu)建MySQL時(shí)的腳本

Dockerfile 內(nèi)容

# 利用 mysql 鏡像創(chuàng)建新的鏡像
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都是基于同一個(gè)鏡像構(gòu)建,使用的存儲(chǔ)引擎和其他的組件最好是同一中,不然在復(fù)制過(guò)程中可能會(huì)出現(xiàn)異常。

init.sql 初始化數(shù)據(jù)

-- 創(chuàng)建 data_copy 數(shù)據(jù)庫(kù)
DROP DATABASE IF EXISTS `data_copy`;
CREATE DATABASE `data_copy` /*!40100 DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_general_ci */;

-- 創(chuàng)建 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;

創(chuàng)建data_copy數(shù)據(jù)庫(kù)和person表。

start.sh 腳本

#!/bin/sh
echo '啟動(dòng)mysql'
service mysql start
sleep 5

echo '初始化數(shù)據(jù)庫(kù)'
mysql -uroot -pytao < /mysql/init.sql
echo '初始化完成!'
tail -f /dev/null

構(gòu)建master和slave鏡像并運(yùn)行容器

構(gòu)建master鏡像

docker build -t master/mysql .

構(gòu)建slave鏡像

docker build -t slave/mysql .

構(gòu)建成功會(huì)返回 Successfuly,或通過(guò)docker images命令查看鏡像

使用剛構(gòu)建的鏡像來(lái)運(yùn)行容器

# 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目錄為保存數(shù)據(jù)的目錄。

連接到數(shù)據(jù)庫(kù)后驗(yàn)證數(shù)據(jù)庫(kù)是否初始化成功

查看 log-bin 是否開(kāi)啟

創(chuàng)建復(fù)制賬號(hào)

前面有提到從庫(kù)I/O線(xiàn)程要與主庫(kù)建立連接,所以需要用到賬號(hào)進(jìn)行驗(yàn)證。賬號(hào)除了要有連接權(quán)限(REPLICATION CLIENT),同時(shí)還要有復(fù)制權(quán)限(REPLICATION SLAVE)。

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

這里設(shè)置的訪(fǎng)問(wèn)地址是開(kāi)放的,實(shí)際使用過(guò)程中安全起見(jiàn)一定要指定訪(fǎng)問(wèn)地址。

從庫(kù)啟動(dòng)復(fù)制

從庫(kù)連接到主庫(kù),獲取到二進(jìn)制日志后重放。這里首先要配置上面創(chuàng)建的賬號(hào)進(jìn)行連接,使用命令進(jìn)行相應(yīng)的設(shè)置。

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

到這里復(fù)制還沒(méi)有啟動(dòng),需要再?gòu)膸?kù)中啟動(dòng)

START SLAVE;

使用SHOW SLAVE STATUS\G;命令查看啟動(dòng)后的情況

上面標(biāo)記的輸出信息Slave_IO_Running: Yes和Slave_SQL_Running: Yes可以看到I/O線(xiàn)程和SQL線(xiàn)程已啟動(dòng)運(yùn)行中。

測(cè)試同步數(shù)據(jù)

如果在主庫(kù)中添加,更新或刪除一個(gè)數(shù)據(jù),那么從庫(kù)中應(yīng)該也有與主庫(kù)對(duì)應(yīng)的數(shù)據(jù)變化。

向主庫(kù)添加一條數(shù)據(jù)

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

查詢(xún)從庫(kù)數(shù)據(jù),數(shù)據(jù)已被同步過(guò)來(lái)。

總結(jié)

上述是最簡(jiǎn)單最基本的配置,但是理解上面的配置過(guò)程,就可以根據(jù)自身情況定制不同方案,實(shí)現(xiàn)一主多從,主主復(fù)制(主動(dòng)-主動(dòng)或主動(dòng)-被動(dòng)模式)等等來(lái)滿(mǎn)足自身需求。

MySQL的復(fù)制雖然使用簡(jiǎn)單方便,但也伴隨著一些問(wèn)題需要我們?cè)谑褂弥羞M(jìn)行解決,比如:不能從服務(wù)器異常停止中恢復(fù),數(shù)據(jù)同步的延遲等等,還好現(xiàn)在遇到的大部分問(wèn)題在行業(yè)中已得到相應(yīng)的解決。對(duì)這方面感興趣的可以去了解下現(xiàn)在解決這些問(wèn)題的中間件實(shí)現(xiàn)方案。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

標(biāo)簽:自貢 池州 海南 黃石 阿克蘇 南陽(yáng) 大理 黔東

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《基于Docker如何實(shí)現(xiàn)MySQL主從復(fù)制詳解》,本文關(guān)鍵詞  基于,Docker,如何,實(shí)現(xiàn),MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于Docker如何實(shí)現(xiàn)MySQL主從復(fù)制詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于基于Docker如何實(shí)現(xiàn)MySQL主從復(fù)制詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 迁西县| 德昌县| 屏东市| 黄石市| 遂平县| 开化县| 巴青县| 玉树县| 怀安县| 鄂伦春自治旗| 育儿| 海兴县| 沈阳市| 谷城县| 华亭县| 合肥市| 绥芬河市| 班戈县| 宁乡县| 静海县| 武乡县| 昔阳县| 汤原县| 金堂县| 京山县| 亳州市| 北宁市| 屏东市| 高雄县| 巫溪县| 延吉市| 博客| 班戈县| 龙胜| 西丰县| 突泉县| 南皮县| 宁晋县| 杂多县| 东兰县| 阳谷县|