如何利用docker快速構建MySQL主從複製環境,dockermysql

來源:互聯網
上載者:User

如何利用docker快速構建MySQL主從複製環境,dockermysql

在學習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
6b7fe5da9e8c77529ee634e163add57db5cd15757e88261ce320a502ae01f853real 0m0.986suser 0m0.026ssys 0m0.018s

 

於是基於docker寫了個指令碼,可在30s左右建立一套MySQL主從複製環境

#!/bin/bashMASTER_DIR=/var/lib/mysql/masterSLAVE_DIR=/var/lib/mysql/slave## First we could rm the existed containerdocker rm -f masterdocker rm -f slave## Rm the existed directoryrm -rf $MASTER_DIRrm -rf $SLAVE_DIR## Start instancedocker 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.34docker 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 Replicationdocker stop master slavedocker start master slavesleep 3docker 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 Coordinatesmaster_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 shortcutsgrep "alias master" /etc/profileif [ $? -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/profilefi

 

指令碼本身沒有太多需要說明的地方,主從容器起來後,遵循的還是常見的主從複製建立流程。

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

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 slavedocker start master slavesleep 3

 

設定快速鍵

mysql:mysql用戶端,可以通過該用戶端串連其它主機上的MySQL伺服器。

master:執行master即可登入原生master執行個體,省掉了指定主機名稱和連接埠的操作。

salve:執行slave即可登入原生slave執行個體。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.