Docker實現Mysql主從復制實戰(一主一從、雙主雙從)


SpringCloudAlibaba實戰教程系列  

docker:官網    中文官網

docker:鏡像官網

---------------------------------目錄---------------------------------- 

前期扯淡:mysql主從復制和集群區別

一、 Mysql數據庫主從復制一主一從

二、 Mysql數據庫主從復制雙主雙從

-----------------------------------------------------------------------

哈哈!歡迎你的到來,俗話說磨刀不誤砍柴工,來吧,咱們先看看Mysql的主從復制和集群概念的區別。 

MySQL集群是一個無共享的(shared-nothing)、分布式節點架構的存儲方案,其目的是提供容錯性和高性能。

集群所涉及到的三個概念:

  SQL節點(多個):應用程序和數據節點的一個橋梁,應用程序不能直接訪問數據節點,只能先訪問SQL節點,然后SQL節點再去訪問數據節點來返回數據,Cluster中可以有多個SQL節點,通過每個SQL節點查詢到的數據都是一致的,一般來說,SQL節點越多,分配到每個SQL節點的負載就越小,系統的整體性能就越好;

  數據節點(多個):用於存儲數據,數據存放內存中,數據節點中數據保存后自動復制並存儲到其他節點,數據節點之間采用的是同步復制來保證各節點之間的數據一致性

  管理節點(一個):主要負責管理數據節點和SQL節點,還有集群配置文件和集群日志文件。它監控其他節點的工作狀態,能夠啟動、關閉或者重啟某個節點。其他節點從管理節點檢索配置數據,當數據節點有新事件就把事件信心發送給管理節點並寫入集群日志。

  同步復制流程:

a) Master執行提交語句時,事務被發送到Slave,Slave開始准備事務的提交。
b) 每個slave都要准備事務,然后向Master發送OK(或ABORT)消息,表明事務已經准備好(或者無法准備該事務)。
c) Master等待所有Slave發送OK或ABORT消息,如果Master收到所有Slave的OK消息,它就會向所有Slave發送提交消息,告訴Slave提交該事務;如果 Master收到來自任何一個Slave的ABORT消息,它就向所有 Slave發送ABORT消息,告訴Slave去中止事務。
e) 每個Slave等待來自Master的OK或ABORT消息。如果Slave收到提交請求,它們就會提交事務,並向Master發送事務已提交 的確認;如果Slave收到取消請求,它們就會撤銷所有改變並釋放所占有的資源,從而中止事務,然后向Masterv送事務已中止的確認。
f) Master收到來自所有Slave的確認后,就會報告該事務被提交(或中止),然后繼續進行下一個事務處理。
由於同步復制一共需要4次消息傳遞,故mysql cluster的數據更新速度比單機mysql要慢。所以mysql cluster要求運行在千兆以上的局域網內,節點可以采用雙網卡,節點組之間采用直連方式。

主從復制是通過Mysql的Replication來保證數據的一致性。相對Mysql Cluster的異步數據同步方式。

Replication:首先主從服務器必須設置一個唯一的服務器id(局域網內唯一);其中主節點要開啟binlog日志功能,binlog記錄了master上的所有操作,同時也會被復制到從節點的Relaylog上,並在從節點上binlog回放執行。操作流程入下圖所示:

 

主從復制的日志記錄類型
  基於SQL語句的復制(statement):在Master上執行的SQL語句,在Slave根據主機系統時間去執行同樣的語句。SQL執行同步根據系統時間來確定,MySQL默認采用基於語句的復制,效率比較高。弊端:SQL在主機執行和從機執行時間不一致,導致數據不一致。

  基於行的復制(row):把改變的數據內容復制到Slave,而不是把命令在Slave上執行一遍。從MySQL5.0開始支持。弊端:如果執行一天update語句,影響1000萬行,那么需要在從庫執行1000萬次,效率太低。

  混合類型的復制(mixed):默認采用基於SQL語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制。弊端:是不能識別@@host name 系統變量,同時每太主機的系統變量都不一致導致數據不一致。

一、 Mysql數據庫主從復制一主一從

1、拉取鏡像

登錄docker 鏡像官網搜索mysql,找到制定的版本拉去,這里使用mysql5.7.30,版本查找文檔:Linux Centos7(Mac) 安裝Docker教程

docker pull mysql:5.7.30

2、查看docker的鏡像

docker images

3、創建容器本地映射文件,目的持久化數據。

 master文件夾與文件准備,my.cnf文件重點關注屬性server_id、log_bin、binlog_format、binlog_do_db、binlog_ignore_db.

mkdir -p /root/mysql/master/data /root/mysql/master/logs /root/mysql/master/conf
touch /root/mysql/master/conf/my.cnf

  在主節點的my.cnf配置文件中添加一下內容

[mysqld]
server_id = 1 # 唯一標識,主庫從庫不能重復
log_bin = mysql-bin # 開啟日志
binlog_format=STATEMENT # 日志記錄的格式類型
# max_binlog_size = 512M # 單個日志文件最大
# # expire_logs_day = 3 # 日志有效期(天)
# # binlog_do_db = test1,test2 # 日志記錄(同步復制)那些數據庫
# # binlog_ignore_db = mysql,performance_schema,information_schema # 日志記錄忽略那些數據庫的

slave文件夾與文件准備

mkdir -p /root/mysql/slave/data /root/mysql/slave/logs /root/mysql/slave/conf
touch /root/mysql/slave/conf/my.cnf

  在slave的my.cnf文件寫入下面配置

[mysqld]
server_id = 2            # 數據庫唯一id,內網唯一
log_bin = mysql-bin        # 開啟日志,如果從庫還會用做主庫,建議配置
binlog_format=STATEMENT        # 日志記錄的格式類型
# max_binlog_size = 512M     # 單個日志文件最大
# # expire_logs_day = 3       # 日志有效期(天)
# # replicate_do_db = test1,test2 # 是在slave上配置,指定slave要復制哪個庫
# # replicate-ignore-db=mysql,performance_schema,information_schema  # 是在slave上配置,指定slave要忽略哪個庫
# relay_log_recovery = 1     # 從庫建議開啟,有利於數據一致性
# log_slave_updates = 1      # 如果從庫還會用做主庫,建議開啟

4、創建master主機容器,啟動服務。

首先創建容器並啟動:

        docker run -p 3306:3306 --name mysqlMaster \
                -v /root/mysql/master/conf:/etc/mysql/conf.d \
                -v /root/mysql/master/logs:/var/log/mysql \
                -v /root/mysql/master/data:/var/lib/mysql \
                -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.30

然后查看是否啟動 docker ps:

接着登錄master節點容器:

docker exec -it mysqlMaster /bin/bash

同時在master容器中執行以下SQL,創建用戶授權,四步完成:登錄mysql、創建用戶、賬號授權、刷新動態生效。mysql-管理命令【創建用戶、授權、修改密碼、刪除用戶和授權、忘記root密碼】

mysql -uroot -proot
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT ALL ON *.* TO 'slave'@'%';
GRANT ALL ON *.* TO 'slave'@'%';
flush privileges;

最后查看master的數據庫狀態,File 是記錄的二進制文件名,Position偏移位置,從庫會用到。還有需要復制的數據庫和不需要忽略的數據庫

show master status;

另開一個遠程連接窗口,查看master容器ip地址,從庫會用到:

docker inspect mysqlMaster|grep IPAddress

5、創建slave主機容器、並啟動(注意本地防火牆哦!)

匯總master節點信息

然后啟動創建slave庫的容器並啟動:

        docker run -p 3305:3306 --name mysqlSlave \
                -v /root/mysql/slave/conf:/etc/mysql/conf.d \
                -v /root/mysql/slave/logs:/var/log/mysql \
                -v /root/mysql/slave/data:/var/lib/mysql \
                -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.30

 登錄從庫容器

docker exec -it mysqlSlave /bin/bash

登錄從庫mysql服務器

 mysql -uroot -proot

在slave從庫中進行配置從庫主從信息,如下命令為解釋,操作如下圖

 change master to      開啟配置主從信息
    -> master_host='172.18.0.2', 指定主節點ip
    -> master_port=3306,      指定主節點端口
    -> master_user='slave',    登錄主節點拉去二進制文件的用戶名
    -> master_password='123456',   用戶密碼
    -> master_log_file='mysql-bin.000001',  二進制文件名,對應File字段
    -> master_log_pos=154;               二進制偏移位置對應Position偏移位置

啟動slave線程,如果配置錯誤輸入stop slave; 然后重新錄入一遍上一步命令

start slave;

查看salve數據庫狀態,如果

show slave status \G;

6主從驗證

在主庫創建數據庫

CREATE SCHEMA `test1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;

在從庫中查看:

二、 Mysql數據庫主從復制雙主雙從

 

雙主雙從主要是my.cof配置和雙主復制的命令不同,mysql默認的自增開始和自增的步長不同

master節點1的配置

[mysqld]
server-id=1
log-bin=mysql-bin
#binlog-do-db指定同步的庫名,建議使用binlog-ignore-db忽略某些庫 binlog
-do-db=mycat_m_s binlog_format=STATEMEN log-slave-updates auto-increment-increment=2 auto-increment-offset=1

master節點2配置

[mysqld]
server-id=3
log-bin=mysql-bin
#binlog-do-db指定同步的庫名,建議使用binlog-ignore-db忽略某些庫
binlog-do-db=mycat_m_s 
binlog_format
=STATEMEN
log
-slave-updates
auto
-increment-increment=2
auto
-increment-offset=2

雙主復制的命令

#主機2復制主機1命令
change master to master_host='192.168.220.102',
master_port=3307,
master_user='slave', 
master_password='123456', 
master_log_file='mysql-bin.000005',
master_log_pos=333,
master_connect_retry=60;


#主機1復制主機2命令
change master to master_host='192.168.220.102',
master_port=3309,
master_user='slave', 
master_password='123456', 
master_log_file='mysql-bin.000002',
master_log_pos=443,
master_connect_retry=60;

然后啟動主庫的從庫

start slave 

具體操作參看這位大佬的記錄吧:Docker安裝Mysql,並搭建一主一從復制集群,一主雙從,雙主雙從集群 

 

 

Docker(部署常見應用):Docker安裝MySql完整教程、實操 

Docker版:Mysql分庫分表MyCat實戰  

Docker實現Mysql主從復制實戰(一主一從、雙主雙從)  

mysql 5.8以上版本有問題可以參考:

mysql-管理命令【創建用戶、授權、修改密碼、刪除用戶和授權、忘記root密碼】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM