您好,登錄后才能下訂單哦!
本篇內容介紹了“基于docker的mysql5.7主從配置”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
docker下的mysql5.7數據庫配置文件存在在多個文件下,入口文件是/etc/mysql/my.cnf
,其他文件是通過include方式進來。
為了能更直觀的查看配置文件,所以主庫的配置文件放在/etc/mysql/mysql.conf.d/master.cnf
# vi $PWD/master.cnf [mysqld] server-id=100 log-bin=mysql-bin # vi $PWD/master.sql CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
不難理解的是mysql數據庫里記錄的一筆筆數據,最終還是以文件形式存在硬盤中的某幾個文件里的
在docker鏡像里的mysql5.7環境下,那些重要的數據文件是存在/var/lib/mysql
目錄下,當然是在容器環境中
所以建議將這些文件從容器內部映射到容器外部,以便更方便的對其進行備份保存。 本列中,我將容器內部的/var/lib/mysql
映射到自己主機的master/db
目錄,這個目錄可以不建立,只要說明路徑,docker會幫我們建立 ps:自己主機可以使用網盤路徑,這樣數據庫的文件其實是存在遠端的。
docker run -p 5001:3306 \ --name mymaster \ -v $PWD/master.cnf:/etc/mysql/mysql.conf.d/master.cnf \ -v $PWD/masterdb:/var/lib/mysql \ -v $PWD/master.sql:/docker-entrypoint-initdb.d/master.sql \ -e MYSQL_ROOT_PASSWORD=111111 \ -e MYSQL_DATABASE=waynedb \ -e MYSQL_USER=wayne \ -e MYSQL_PASSWORD=wayne \ -d mysql:5.7
逐行解釋:
將docker中的3306端口映射到外面的5001端口
將外面的配置文件映射到內部
將數據庫文件映射到外面某個目錄下(可以省略)
設置root密碼
設置一個初始數據庫(可以省略)
設置用戶,默認該用戶對上述初始數據庫有完全權限(可以省略)
設置上述用戶密碼(可以省略)
使用image為mysql的5.7版本
使用強大的docker,來模擬一個mysql客戶端,直接連接已經運行的主庫,注意填寫真實的主庫ip和端口號
docker run --rm -it --name mysql-client mysql:5.7 mysql -h20.2.11.97 --port=5001 -uroot -p
進入后先創建一個用于同步的賬號slave,密碼為123456,并賦予可同步權限
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
然后查詢狀態,為從庫同步做準備
show master status\G;
# vi $PWD/slave.cnf [mysqld] server-id=101 ## 開啟二進制日志功能,以備Slave作為其它Slave的Master時使用 log-bin=mysql-slave-bin ## relay_log配置中繼日志 relay_log=edu-mysql-relay-bin
docker run -p 5002:3306 \ --name myslave \ -v $PWD/slave.cnf:/etc/mysql/mysql.conf.d/slave.cnf \ -v $PWD/slavedb:/var/lib/mysql \ -v $PWD/a.sql:/docker-entrypoint-initdb.d/a.sql \ -e MYSQL_ROOT_PASSWORD=111111 \ -e MYSQL_DATABASE=waynedb \ -e MYSQL_USER=wayne \ -e MYSQL_PASSWORD=wayne \ -d mysql:5.7
使用強大的docker,來模擬一個mysql客戶端,直接連接已經運行的主庫,注意填寫真實的從庫ip和端口號
docker run --rm -it --name mysql-client mysql:5.7 mysql -h20.2.11.97 --port=5002 -uroot -p
配置從庫去連接主庫
請注意填寫真實的主庫ip和端口號
請注意填寫真實的master_log_file和master_log_pos,這個是從主庫上使用show master status\G;
獲得
mysql> change master to master_host='10.2.11.97', master_user='slave', master_password='123456', master_port=5001, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30; 解釋: master_host :Master的地址,指的是容器的獨立ip,可以通過docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱|容器id查詢容器的ip master_port:Master的端口號,指的是容器的端口號 master_user:用于數據同步的用戶 master_password:用于同步的用戶的密碼 master_log_file:指定 Slave 從哪個日志文件開始復制數據,即上文中提到的 File 字段的值 master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 字段的值 master_connect_retry:如果連接失敗,重試的時間間隔,單位是秒,默認是60秒
start slave;
使用docker的mysql來充當客戶端,運行一次就退出(--rm),進入交互模式(-it),黑體是mysql連接命令 docker run --rm -it --name mysql-client mysql:5.7 mysql -h227.0.0.1 --port=3339 -uroot -p
這個腳本需要基于docker的環境,請先配置好docker
僅需修改#-------------------------------
上面的那部分內容
master_ip= 主庫所在主機的真實ip master_port= 主庫所在主機的監聽端口 master_MYSQL_ROOT_PASSWORD=主庫的root賬號密碼 master_docker_name=主庫在docker下的名字 master_root_path=主庫的數據文件映射到主機的目錄
#!/bin/bash # master_ip和slave_ip如果相同的話,則master_port and slave_port不能相同,master_docker_name and slave_docker_name也不能相同 # 設置端口前,注意端口有沒有被占用 # master_ip和slave_ip要能互相訪問 # 主庫相關設置 master_ip=10.2.11.97 master_port=5010 master_MYSQL_ROOT_PASSWORD=111111 master_docker_name=mymaster_new master_root_path=/home/wayne/newnew # 從庫相關設置 slave_ip=10.2.11.97 slave_port=5011 slave_MYSQL_ROOT_PASSWORD=111111 slave_docker_name=myslave_new slave_root_path=$master_root_path # 從庫使用以下用戶去連接主庫同步 sync_user=slave sync_pass=123456 #----------------------------------------------------------- reset() { docker rm -f $master_docker_name docker rm -f $slave_docker_name } master() { if [ ! -d $master_root_path ]; then mkdir -p $master_root_path fi cd $master_root_path cat << EOF > master.sql CREATE USER '${sync_user}'@'%' IDENTIFIED BY '${sync_pass}'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '${sync_user}'@'%'; EOF cat << EOF > master.cnf [mysqld] server-id=100 log-bin=mysql-bin EOF docker run -p ${master_port}:3306 \ --name ${master_docker_name} \ -v $PWD/master.cnf:/etc/mysql/mysql.conf.d/master.cnf \ -v $PWD/masterdb:/var/lib/mysql \ -v $PWD/master.sql:/docker-entrypoint-initdb.d/master.sql \ -e MYSQL_ROOT_PASSWORD=${master_MYSQL_ROOT_PASSWORD} \ -e MYSQL_DATABASE=waynedb \ -e MYSQL_USER=wayne \ -e MYSQL_PASSWORD=wayne \ -d mysql:5.7 # rm master.sql # rm master.cnf } slave() { i=1 file=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep File |cut -f2 -d : | awk '$1=$1'` while [ -z $file ] do echo $i times sleep 5 sleep 5 i=`expr ${i} + 1` if [ $i -gt 10 ]; then echo "連接主庫失敗,從庫不建立并退出" exit 0 fi file=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep File |cut -f2 -d : | awk '$1=$1'` done pos=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep Pos |cut -f2 -d : | awk '$1=$1'` echo $pos if [ ! -d $slave_root_path ]; then mkdir -p $slave_root_path fi cd $slave_root_path cat << EOF > slavetmp.sql stop slave; change master to master_host='${master_ip}', master_user='${sync_user}', master_password='${sync_pass}', master_port=${master_port}, master_log_file='$file', master_log_pos= $pos, master_connect_retry=30; start slave; EOF cat -v slavetmp.sql |tr -d "^M" > slave.sql cat << EOF > slave.cnf [mysqld] server-id=101 ## 開啟二進制日志功能,以備Slave作為其它Slave的Master時使用 log-bin=mysql-slave-bin ## relay_log配置中繼日志 relay_log=edu-mysql-relay-bin EOF docker run -p ${slave_port}:3306 \ --name ${slave_docker_name} \ -v $PWD/slave.cnf:/etc/mysql/mysql.conf.d/slave.cnf \ -v $PWD/slavedb:/var/lib/mysql \ -v $PWD/slave.sql:/docker-entrypoint-initdb.d/slave.sql \ -e MYSQL_ROOT_PASSWORD=${slave_MYSQL_ROOT_PASSWORD} \ -e MYSQL_DATABASE=waynedb \ -e MYSQL_USER=wayne \ -e MYSQL_PASSWORD=wayne \ -d mysql:5.7 # rm slave.sql # rm slavetmp.sql # rm slave.cnf } master slave #reset
“基于docker的mysql5.7主從配置”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。