「乾貨」Docker Mysql數據庫高可用操作指南

一. 前言

最近公司基礎平臺架構做了些許調整,期間順便弄了一下數據庫的高可用的方案,一來記錄一下,二來近期發表的文章貢獻太少了,爭取補上來~

二. 今天主題

正如標題上寫的,今天給大家分享的內容,是如何基於Docker+Mysql來實現數據庫主從同步方案,從而達到Mysql數據庫高可用的目的 ,其中Docker只是輔助介紹,重點是Mysql如何實現高可用的方法介紹。

「乾貨」Docker Mysql數據庫高可用操作指南

注:有的測試小夥伴會說,高可用這個不是開發或者是架構師的事嗎,測試要關注這個幹嘛?相信現在互聯網發佈到線上運營的產品大多都是高可用架構的,掌握產品架構的實現,可以幫助測試更好的掌握先機,再說,讓你們多學點知識,總不見得是壞事吧〜

三. 具體操作

3.1 先建立數據存放目錄(~/test/mysql_test/)

--mysql

--master

--data

--conf

--my.cnf

--slave

--data

--conf

--my.cnf

3.2 準備好 Mysql Master(主庫)和Mysql Slave(從庫)的my.cnf文件。

Master my.cnf 配置文件:

[mysqld]

server_id = 1

log-bin= mysql-bin

read-only=0

replicate-ignore-db=mysql

replicate-ignore-db=sys

replicate-ignore-db=information_schema

replicate-ignore-db=performance_schema

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

Slave my.cnf 配置文件:

[mysqld]

server_id = 2

log-bin= mysql-bin

read-only=1

replicate-ignore-db=mysql

replicate-ignore-db=sys

replicate-ignore-db=information_schema

replicate-ignore-db=performance_schema

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

注:在本文中,由上述my.cnf配置文件可得知,主從同步針對的數據庫(除了mysql,sys,information_schema,performance_schema這些以外)的其它所有數據庫都會執行同步操作(含數據庫、表、數據等)

小結:

  • 從上述master my.cnf和slave my.cnf配置文件中可知,兩者的區別主要在於server_id和read-only值不同。
  • server_id標識服務實例,master和slave值需要保證唯一。
  • read-only中值為0表示支持可讀寫、1的話表明僅支持可讀。

3.3 創建master主容器

docker run --name mastermysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/master/data:/var/lib/mysql -v ~/test/mysql_test/master/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7

3.4 創建slave從容器

docker run --name slavemysql -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/slave/data:/var/lib/mysql -v ~/test/mysql_test/slave/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7

3.5 master容器設置

//進入master容器

docker exec -it mastermysql bash

//啟動mysql命令,剛在創建窗口時我們把密碼設置為:root

mysql -u root -p

//創建一個用戶來同步數據,每個slave使用標準的MySQL用戶名和密碼連接master。進行復制操作的用戶會授予REPLICATION SLAVE 權限。

CREATE USER 'slave'@ '%' IDENTIFIED BY '123456'; (其實可省略)

GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';

//這裡表示創建一個slaver同步賬號slave,允許訪問的IP地址為%,%表示通配符

//查看狀態,記住File、Position的值,在Slave中將用到

show master status/G;

3.6 slave容器設置

//進入slaver容器

docker exec -it slavemysql bash

//啟動mysql命令,剛在創建窗口時我們把密碼設置為:root

mysql -u root -p

//設置主庫鏈接

change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306;

//啟動從庫同步

start slave;

//查看狀態

show slave status\\G;

如果 show slave status\\G命令結果中出現: Slave_IO_Running: Yes Slave_SQL_Running: Yes 以上兩項都為Yes,那說明沒問題了。

四、數據庫同步前的操作

4.1 首先在主從沒有生效的時候,需要保持兩臺服務器數據庫、表相同,數據相同,具體操作如下。

master容器上執行:

mysqldump -uroot -p --all-databases >/root/all_database.sql

將all_database.sql拷貝到從庫中來,在slave從庫容器上執行:

mysql -uroot -p 如此兩步驟,主庫和從庫數據會追加相平,保持同步!

再此過程中,若主庫存在業務,在同步的時候要先鎖表,讓其不要有修改!

#如需要,可以master容器中,執行以下命令鎖定數據庫以防止寫入數據。

mysql>FLUSH TABLES WITH READ LOCK;

等待主從數據追平,主從同步後在打開鎖!

#解鎖數據表。

mysql>UNLOCK TABLES;

主從數據追平後,定位好從庫到主庫日誌的文件名字,和相應的位置

master主庫運行:

mysql> show master status\\G;

「乾貨」Docker Mysql數據庫高可用操作指南

看到且記住相應文件名字和位置,下面會用到哦!

slave從庫運行:

#設置主庫鏈接

change master to master_host='172.17.0.9',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=2037,master_port=3306;

#執行從庫同步

start slave;

#查看從庫同步狀態

show slave status\\G;

「乾貨」Docker Mysql數據庫高可用操作指南

在結果中看到:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

即可成功同步!

五、主從同步驗證

5.1 如當前數據庫情況如下:

「乾貨」Docker Mysql數據庫高可用操作指南

5.2、在master主庫容器中,創建數據庫master_demo,並在此庫下創建表userinfo,並插入一條記錄

create database master_demo;

use master_demo;

create table userinfo(username varchar(50),age int);

insert into userinfo values('Tom',18);

「乾貨」Docker Mysql數據庫高可用操作指南

5.3、此時,進入從庫容器中,查看:

「乾貨」Docker Mysql數據庫高可用操作指南

確實已經將在master主庫新建的數據庫和表記錄都同步過來了。

既然是主從同步,那反過來驗證一下,在從庫下插入記錄後,會不會同步到主庫中來呢?

在從庫上操作插入記錄:

insert into userinfo values('slave',20);

查看:

「乾貨」Docker Mysql數據庫高可用操作指南

切到master主庫中,查看:

「乾貨」Docker Mysql數據庫高可用操作指南

發現在master主庫中,還是隻有一條記錄,說明與預期設想的一樣,在從庫中插入記錄,是不會同步到master主庫中來的

再來一波,在主庫master上,插入新記錄:

insert into userinfo values('master',25);

「乾貨」Docker Mysql數據庫高可用操作指南

在從庫中,查看

「乾貨」Docker Mysql數據庫高可用操作指南

發現在master主庫中新加入的master記錄,在從庫中同步過來了。

到此,基於Docker Mysql數據庫的主從同步效果就已經實現出來了,通過數據庫主從同步方案的配置,從而達到數據庫高可用的目的。

更多更優質的資訊,請關注我,你的支持會鼓勵我不斷分享更多更好的優質文章。求轉發,謝謝~

本文中所涉及到操作圖片,均來自於作者公眾號中,均為合規取材。


分享到:


相關文章: