在Docker平臺實現MySQL Replication(複製)

MySQL Replication提供了數據庫之間複製數據的功能,經過這個功能可讓一個數據庫的數據更改自動同步到另一個數據庫。一般用這個功能來實現數據備份、數據容災、數據冗餘,進一步實現數據的讀寫分離等功能。具體的功能介紹不詳細描述,這是一個成熟的解決方案,官網有詳細的step by step教程。mysql

 

官網給出的實現Replication的指引,是基於服務器MySQL實現的,參考它的步驟能夠將MySQL Replication的功能在Docker平臺下實現。整個過程主要改變是將host主機的配置和數據映射到MySQL容器中,也就是以前提供配置和存儲數據的方式變了。sql

 

下面來開始咱們的實施:docker

實施環境:數據庫

運行在CentOS上的Docker平臺vim

 

1.下載MySQL Server Docker鏡像服務器

這裏咱們使用MySQL官方提供的社區版本的鏡像測試

docker pull mysql/mysql-serverspa

 

2.建立數據存放目錄和配置目錄命令行

master是主庫的目錄,slave是從庫的目錄日誌

sudo mkdir -p /var/Docker/master/data /var/Docker/slave/data

sudo mkdir -p /var/Docker/master/cnf  /var/Docker/slave/cnf

這裏建立的目錄是供接下來建立MySQL容器使用的,這裏的路徑將映射到容器中

 

3.建立數據庫配置文件

 

建立主庫配置文件

sudo vim /var/Docker/master/cnf/my.cnf

內容以下

# Config Settings
[mysqld]

user=mysql
server-id=1
binlog_format=ROW
log-bin

 

建立從庫配置文件

sudo vim /var/Docker/slave/cnf/my.cnf

內容以下

# Config Settings
[mysqld]

user=mysql
server-id=2

 

一樣這裏建立的配置文件,在接下來建立容器時將映射到容器中。

 

4.主庫的Replication設置

啓動主庫的MySQL容器實例

docker run --name master_mysql --mount type=bind,src=/var/Docker/master/cnf/my.cnf,dst=/etc/my.cnf --mount type=bind,src=/var/Docker/master/data/,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server

這個命令的意思是基於myql/mysql-server這個鏡像建立mysql容器實例,而且將宿主機的配置路徑和數據路徑映射到mysql容器中,這樣MySQL的數據就能保存到宿主機器中。

 

登陸到主庫的MySQL

docker exec -it master_mysql mysql -uroot -p

而後就會進入到mysql的命令行,以後的操做跟普通配置Replication基本類似。

 

建立用於Replication的用戶

GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'repl_password';

 

查詢主庫的日誌position信息

SHOW MASTER STATUS\G;

*************************** 1. row ***************************
              File: 9fd14f7de2e4-bin.000001
          Position: 437
      Binlog_Do_DB:
  Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

記錄下File和Position的值

 

6.從庫的Replication設置

啓動從庫的MySQL容器實例

docker run --name slave_mysql --mount type=bind,src=/var/Docker/slave/cnf/my.cnf,dst=/etc/my.cnf --mount type=bind,src=/var/Docker/slave/data/,dst=/var/lib/mysql --link master_mysql:master_mysql -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server

這裏跟運行主庫的MySQL容器相似,區別在於增長了--link參數,將master_mysql的主機名稱連接到容器中,在配置master信息的時候須要用到。

 

登陸到從庫的MySQL

docker exec -it slave_mysql mysql -uroot –p

 

配置maste信息

change master to master_host='master_mysql',master_user='repl',master_password='repl_password',master_log_file='9fd14f7de2e4-bin.000001',master_log_pos=437;

 

啓動SLAVE

START SLAVE;

 

查看SLAVE狀態

SHOW SLAVE STATUS\G;

若是一切成功,那麼能夠看到以下信息,其中Slave_IO_Running和Slave_SQL_Running應該都是Yes的值,而且沒有其餘Error。

*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: master_mysql
                   Master_User: repl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: 9fd14f7de2e4-bin.000001
           Read_Master_Log_Pos: 437
                Relay_Log_File: 4f02ee10dc71-relay-bin.000002
                 Relay_Log_Pos: 327
         Relay_Master_Log_File: 9fd14f7de2e4-bin.000001
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes

               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:

 

7 驗證數據修改 

在主庫更新數據測試是否能正確同步數據到從庫

docker exec -it slave_mysql mysql -uroot –p

不詳細演示了,就是登錄到主庫改改數據,而後到從庫看看是否存在對應的數據便可。

 

小結

這個實驗主要演練了如下知識點

1.將MySQL部署到Docker平臺

2.練習將宿主機的文件夾/文件映射到Docker容器實例中

3.演練了MySQL Replication的實現方式,而且在Docker中實現

相關文章
相關標籤/搜索