您好,登錄后才能下訂單哦!
Docker中怎么搭建MySQL主從集群,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在搭建主從集群之前,我們需要在本機上安裝一個docker服務器,具體的安裝步驟讀者可參見docker的官網https://www.docker.com/
下載服務安裝。安裝完成之后,執行如下命令能正常顯示則說明安裝成功了:
$ docker --version Docker version 18.09.0, build 4d60db4
在安裝完docker之后,我們首先執行如下命令運行一個master容器:
docker run --name mysql-master --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-master
在執行上述命令之后,docker首先會檢測本地有沒有目標鏡像,即xiaochunping/mysql-master
,如果沒有,則會下載該鏡像,然后根據配置的參數運行該鏡像。上述命令中各個參數的含義如下:
--name
指定運行之后的容器的名稱為mysql-master
;
--privileged
指定了當前容器是否真正的具有root權限,所謂的root權限是指具有宿主機的root權限,而不僅僅只是在容器內部有root權限;
-v
指定了容器中指定目錄掛載到宿主機上的某個目錄,這樣做的目的在于防止容器中配置的數據丟失,因為docker容器在重啟之后是不會保留前一次在其內部運行的相關數據的;
-p
表示宿主機上的某個端口映射到docker容器內的某個端口,這里也就是將宿主機的3306端口映射到容器內部的3306端口;
-e
表示指定當前容器運行的環境變量,該變量一般在容器內部程序的配置文件中使用,而在外部運行容器指定該參數。這里的MYSQL_ROOT_PASSWORD
表示容器內部的MySQL的啟動密碼;
-d
參數指定了當前容器是在后臺運行。
在master容器啟動完成之后,我們通過docker ps
命令即可看到這個運行的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa4afaeb24c4 xiaochunping/mysql-master "docker-entrypoint.s…" 12 days ago Up About an hour 0.0.0.0:3306->3306/tcp mysql-master
可以看到,master容器已經正常啟動了,然后我們需要進入到該容器內部,對master節點進行一定的配置。可以通過如下命令進入該容器:
# 通過容器id方式,這里的id就是上面docker ps中展示的id docker exec -it fa4afaeb24c4 /bin/bash # 通過容器名稱方式,這里的名稱就是創建容器時指定的名稱,也就是mysql-master docker exec -it mysql-master /bin/bash
進入容器后,我們需要連接其MySQL服務:
# 這里的密碼就是最開始創建容器時指定的密碼 mysql -uroot -proot
然后我們需要為從服務器創建一個可以用來master服務器的賬戶,也就是創建一個專門用來復制binlog的賬號,并且賦予該賬號復制權限,其命令如下:
grant replication slave on *.* to 'test'@'%' identified by '123456'; flush privileges;
這里的grant replication slave
是一個命令格式,表示賦予后面的賬戶以復制的權限,這樣slave節點就能夠獲取到master節點對數據的更新。上述命令中創建的賬戶的用戶名為test
,密碼為123456
。接著我們需要查看master節點的binlog狀態:
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000014 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
這里需要記住這個File和Position屬性的值,因為下面在配置slave的時候需要用到。
對于從容器的使用,其啟動命令與master容器非常相似,但也有一些小小的區別:
docker run --name mysql-slave --privileged=true -v /home/mysql/slave-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-slave
從容器啟動與主容器啟動參數主要有一下兩點:
所映射的宿主機的端口號不能與master容器相同,因為其已經被master容器占用;
必須加上--link
參數,其后指定了當前容器所要連接的容器,mysql-master
表示所要連接的容器的名稱,master
表示為該容器起的一個別名,通俗來講,就是slave容器通過這兩個名稱都可以訪問到master容器。這么做的原因在于,如果master與slave不在同一個docker network中,那么這兩個容器相互之間是沒法訪問的。注意這一點非常重要,之前本人按照網上的搭建方式搭建主從服務器一直無法成功,主要就是因為他們一直沒有提到要設置這個參數。
在啟動從容器之后,我們還是需要進入到從容器,并且連接上MySQL服務:
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
連接上MySQL服務器之后,我們就需要切換當前服務的狀態,使其能夠連接上master服務器,并且復制其數據:
change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000014', master_log_pos=154, master_connect_retry=30;
上述命令中,各個參數的含義其實比較好理解,主要就是指定master服務的域名(也就是我們前面link時使用的別名)、用戶名、密碼、端口,以及master節點的binlog文件和log的position。這里的binlog文件和log的position就是前面我們show master status;
命令的執行結果,讀者朋友需要與本機的實際結果一致。最后我們需要開啟主從復制:
start slave;
開啟完成之后,我們可以通過如下命令查看從服務器的連接狀態:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: master Master_User: test Master_Port: 3306 Connect_Retry: 30 Master_Log_File: mysql-bin.000014 Read_Master_Log_Pos: 154 Relay_Log_File: 6774ae81bc25-relay-bin.000034 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000014 Slave_IO_Running: Yes Slave_SQL_Running: Yes .... Master_Server_Id: 1 Master_UUID: 8976b929-bc8b-11e9-bab3-0242ac110005 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: .... 1 row in set (0.00 sec)
這里只要看到兩個參數Slave_IO_Running
和Slave_SQL_Running
都為true,則表示復制是正常進行的,到這里我們的主從結構也就搭建完成了。
測試主從服務比較簡單,只需要在master服務器上執行相關的命令,然后檢查slave服務器上是否存在相應的更新即可。我們可以在master節點上執行如下命令,創建一個數據庫和表,然后插入一條數據:
mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> use test; Database changed mysql> create table t_user(id bigint, name varchar(255)); Query OK, 0 rows affected (0.02 sec) mysql> insert into t_user(id, name) value (1, 'Mary'); Query OK, 1 row affected (0.01 sec)
然后我們連接上從數據庫,查看其上是否有相關的更新:
mysql> select * from test.t_user; +------+------+ | id | name | +------+------+ | 1 | Mary | +------+------+ 1 row in set (0.00 sec)
可以看到,從服務器上確實同步了相關的數據,這也進一步驗證了我們搭建的主從服務器是OK的。
關于Docker中怎么搭建MySQL主從集群問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。