久久96国产精品久久久-久久发布国产伦子伦精品-久久精品国产精品青草-久久天天躁夜夜躁狠狠85麻豆

技術員聯盟提供win764位系統下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務器類 >

如何利用docker快速構建MySQL主從復制環境

來源:技術員聯盟┆發布時間:2017-06-20 12:34┆點擊:

在學習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 /var/lib/mysql/slave:/var/lib/mysql -p3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34 6b7fe5da9e8c77529ee634e163add57db5cd15757e88261ce320a502ae01f853 real 0m0.986s user 0m0.026s sys 0m0.018s

于是基于docker寫了個腳本,可在30s左右新建一套MySQL主從復制環境

#!/bin/bash MASTER_DIR=http://www.3lian.com/var/lib/mysql/master SLAVE_DIR=http://www.3lian.com/var/lib/mysql/slave ## First we could rm the existed container docker rm -f master docker rm -f slave ## Rm the existed directory rm -rf $MASTER_DIR rm -rf $SLAVE_DIR ## Start instance 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 run --name slave -v /etc/slave.cnf:/etc/mysql/my.cnf -v $SLAVE_DIR:/var/lib/mysql --net=host -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34 ## Creating a User for Replication docker stop master slave docker start master slave sleep 3 docker exec -it master mysql -S /var/lib/mysql/mysql.sock -e "CREATE USER 'repl'@'127.0.0.1' IDENTIFIED BY 'repl';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1';" ## Obtaining the Replication Master Binary Log Coordinates master_status=`docker exec -it master mysql -S /var/lib/mysql/mysql.sock -e "show master status\G"` master_log_file=`echo "$master_status" | awk 'NR==2{print substr($2,1,length($2)-1)}'` master_log_pos=`echo "$master_status" | awk 'NR==3{print $2}'` master_log_file="'""$master_log_file""'" ## Setting Up Replication Slaves docker exec -it slave mysql -S /var/lib/mysql/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE=$master_log_file,MASTER_LOG_POS=$master_log_pos;"docker exec -it slave mysql -S /var/lib/mysql/mysql.sock -e "start slave;" docker exec -it slave mysql -S /var/lib/mysql/mysql.sock -e "show slave status\G" ## Creates shortcuts grep "alias master" /etc/profile if [ $? -eq 1 ];then echo 'alias mysql="docker exec -it master mysql"' >> /etc/profile echo 'alias master="docker exec -it master mysql -h 127.0.0.1 -P3306"' >> /etc/profile echo 'alias slave="docker exec -it master mysql -h 127.0.0.1 -P3307"' >> /etc/profile source /etc/profile fi

腳本本身沒有太多需要說明的地方,主從容器起來后,遵循的還是常見的主從復制建立流程。

主要是說說創建容器所涉及的選項。

復制代碼 代碼如下:


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