在學習mysql的過程中,常常會測試各種參數的作用。這時候,就需要快速構建出mysql實例,甚至主從。
考慮如下場景:
譬如我想測試mysqldump在指定–single-transaction參數的情況下,對于myisam表的影響。
本來想在現成的測試環境中進行,但測試環境中,有大量的數據,執行mysqldump進行全備,產生的SQL文件,很難基于表進行搜索。
這個時候,就特別渴望能有一套干凈的實例進行測試。
此刻,快速構建能力就顯得尤為必要,很多童鞋可能會問,通過腳本不就能實現么?為什么要用docker?
個人感覺:腳本太重,會涉及很多額外的工作,譬如創建用戶,相對較長的數據庫初始化過程,MySQL啟動過程,而我需要的是一種快速構建,快速銷毀的能力。
而這,正是Docker的強項。
?
如下,是利用docker啟動一個實例的時間,不到1s,如果使用腳本來做的話,絕不會這么快。
#?time??docker?run?--name?slave?-v?/etc/slave.cnf:/etc/mysql/my.cnf?-v?//lib/mysql/slave://lib/mysql?-p3307:-e?MYSQL_ROOT_PASSWORD=?-d?mysql:
于是基于docker寫了個腳本,可在30s左右新建一套MySQL主從復制環境
#!/bin/=/var/lib/mysql/=/var/lib/mysql/?-?-?-?---name?master?-v?/etc/master.cnf:/etc/mysql/my.cnf?-v?$MASTER_DIR:/var/lib/mysql?? --net=host?-e?MYSQL_ROOT_PASSWORD=?-d?mysql:.--name?slave?-v?/etc/slave.cnf:/etc/mysql/my.cnf?-v?$SLAVE_DIR:/var/lib/mysql?--net=host?-e? MYSQL_ROOT_PASSWORD=?-.?-it?master?mysql?-S?/var/lib/mysql/mysql.sock?-e?LAVE?ON?*.*?TO?@;=`docker?exec?-it?master?mysql? -S?/var/lib/mysql/mysql.sock?-e?=`??|???=`??|??=-it?slave?mysql?-S?/var/lib/mysql/mysql.sock?-e?eplrepldocker?exec?-it?slave?mysql? -S?/var/lib/mysql/mysql.sock?-e???/etc/?[?$??-eq??]; ??????>>?/etc/??>>?/etc/??>>?/etc//etc/
腳本本身沒有太多需要說明的地方,主從容器起來后,遵循的還是常見的主從復制建立流程。
主要是說說創建容器所涉及的選項。
docker run --name master -v /etc/master.cnf:/etc/mysql/my.cnf -v $MASTER_DIR:/var/lib/mysql --net=host -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34
?-v /etc/master.cnf:/etc/mysql/my.cnf:將本地的配置文件映射成容器的配置文件,這樣,可通過修改本地配置文件,來達到修改容器配置文件的效果。
?-v $MASTER_DIR:/var/lib/mysql :將本地目錄映射成容器的數據目錄,這樣,方便查看數據目錄的內容,不然的話,就默認保存在/var/lib/docker/volumes目錄下,實在不方便查看。
?–net=host:共享宿主機的網絡,大大降低容器之間的通信復雜度。
?
注意
在腳本剛開始的時候,會刪除之前的容器,這包含兩步操作
1. 通過docker命令刪除容器
2. 通過操作系統命令刪除之前容器的數據目錄。
??? 如果不刪除的話,再次通過如下命令創建容器時,并不會清空之前的數據目錄,而是直接加載,相當于新啟了一個mysqld進程啟動之前的實例。
docker?run?--name?master?-v?/etc/master.cnf:/etc/mysql/my.cnf?-v?$MASTER_DIR:/var/lib/mysql?? --net=host?-e?MYSQL_ROOT_PASSWORD=123456?-d?mysql:5.6.34
??? 這也給我們提供了一個思路,如果只是想測試參數的作用,并不想新建實例的話,只需通過docker命令刪除容器,修改配置文件,通過上述命令創建容器即可。
在啟動實例后,執行了一個重啟實例的操作,因為在測試的過程中,發現如果執行docker exec -it master bash之類的操作,會導致容器down掉(具體down的原因還未分析),但是重啟實例后就沒問題。
docker?stop?master?slave docker?start?master?slave sleep?3
設置快捷鍵
mysql:mysql客戶端,可以通過該客戶端連接其它主機上的MySQL服務器。
master:執行master即可登錄本機的master實例,省掉了指定主機名和端口的操作。
salve:執行slave即可登錄本機的slave實例。
?以上就是如何利用docker快速構建MySQL主從復制環境的詳情介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!