基於docker的mysql5.7主從配置及 一鍵安裝&設置腳本

創建主庫

準備主庫的配置文件

docker下的mysql5.7數據庫配置文件存在在多個文件下,入口文件是/etc/mysql/my.cnf,其餘文件是經過include方式進來。
爲了能更直觀的查看配置文件,因此主庫的配置文件放在/etc/mysql/mysql.conf.d/master.cnfmysql

# 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:本身主機可使用網盤路徑,這樣數據庫的文件實際上是存在遠端的。sql

使用docker運行mysql主庫

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

  1. 將docker中的3306端口映射到外面的5001端口
  2. 將外面的配置文件映射到內部
  3. 將數據庫文件映射到外面某個目錄下(能夠省略)
  4. 設置root密碼
  5. 設置一個初始數據庫(能夠省略)
  6. 設置用戶,默認該用戶對上述初始數據庫有徹底權限(能夠省略)
  7. 設置上述用戶密碼(能夠省略)
  8. 使用image爲mysql的5.7版本

配置主庫

進入主庫數據庫內部

使用強大的docker,來模擬一個mysql客戶端,直接鏈接已經運行的主庫,注意填寫真實的主庫ip和端口號數據庫

docker run --rm -it --name mysql-client mysql:5.7 mysql -h10.2.11.97 --port=5001 -uroot -p

配置同步帳號和查看同步信息(廢棄)

進入後先建立一個用於同步的帳號slave,密碼爲123456,並賦予可同步權限bash

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運行mysql從庫

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和端口號code

docker run --rm -it --name mysql-client mysql:5.7 mysql -h10.2.11.97 --port=5002 -uroot -p

配置同步

配置從庫去鏈接主庫
請注意填寫真實的主庫ip和端口號
請注意填寫真實的master_log_file和master_log_pos,這個是從主庫上使用show master status\G;得到orm

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來充當客戶端

使用docker的mysql來充當客戶端,運行一次就退出(--rm),進入交互模式(-it),黑體是mysql鏈接命令 docker run --rm -it --name mysql-client mysql:5.7 mysql -h127.0.0.1 --port=3339 -uroot -pserver

一鍵腳本

這個腳本須要基於docker的環境,請先配置好docker
僅需修改#-------------------------------上面的那部份內容ip

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
相關文章
相關標籤/搜索