一、實(shí)驗(yàn)背景
Docker 是一個開源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個輕量級、可移植、自給自足的容器。
Docker 通常用于如下場景:
web 應(yīng)用的自動化打包發(fā)布
自動化測試和持續(xù)集成、發(fā)布
在服務(wù)性環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺應(yīng)用
Docker 是一種新型的虛擬化方式,和傳統(tǒng)的的虛擬化方式相比具有以下優(yōu)勢:
Docker 容器的啟動可以在秒級實(shí)現(xiàn),這比傳統(tǒng)的的虛擬機(jī)方式要快很多。
Docker 對系統(tǒng)資源的利用率很高,一臺主機(jī)上可以同時運(yùn)行數(shù)千個 Docker 容器。
本文主要講解docker的安裝和MySQL 的主從復(fù)制的搭建,Docker 的具體使用可以去找相關(guān)的書籍或其他資料自行進(jìn)行學(xué)習(xí),本文就不涉及 Docker 的具體命令的講解了。
本文分成以下幾步來說明如何基于 Docker 來搭建 MySQL 的主從復(fù)制:
準(zhǔn)備兩臺 MySQL 服務(wù)器
配置主服務(wù)器(Master)
配置從服務(wù)器(Slave)
完成Master和Slave鏈接
測試配置是否成功
二、MySQL主從復(fù)制原理
主服務(wù)器數(shù)據(jù)庫的每次操作都會記錄在其二進(jìn)制文件mysql-bin.xxx(該文件可以在mysql目錄下的data目錄中看到)中,從服務(wù)器的I/O線程使用專用賬號登錄到主服務(wù)器中讀取該二進(jìn)制文件,并將文件內(nèi)容寫入到自己本地的中繼日志relay-log文件中,然后從服務(wù)器的SQL線程會根據(jù)中繼日志中的內(nèi)容執(zhí)行SQL語句。
MySQL主從同步的作用:
1、可以作為備份機(jī)制,相當(dāng)于熱備份
2、可以用來做讀寫分離,均衡數(shù)據(jù)庫負(fù)載
三、實(shí)驗(yàn)環(huán)境
操作系統(tǒng): CentOS7.x?
MySQL01(master):192..168.1.103
MySQL02(slave):? ?192.168.1.105
Docker版本:18.06
MySQL鏡像版本:5.7.20
四、安裝docker,拉取MySQL鏡像
在MySQL01、MySQL02服務(wù)器
關(guān)閉selinux
# setenforce 0
# sed? -i? 's/^SELINUX=.*/SELINUX=permissive/g'? /etc/selinux/config
開放相關(guān)端口
#? firewall-cmd --zone=public? --add-port=3306/tcp --permanent
#? firewall-cmd --reload
安裝docker
# yum -y install? yum-utils device-mapper-persistent-data lvm2
# yum-config-manager? --add-repo? ? https://download.docker.com/linux/centos/docker-ce.repo
# yum list docker-ce? --showduplicates | sort? -r
#? yum -y install docker-ce-18.06.0.ce
# systemctl? start docker
# systemctl? status docker
# systemctl? enable? docker
# docker version
設(shè)置鏡像加速
#? curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# systemctl restart docker
拉取MySQL5.7.x鏡像
# docker pull mysql:5.7.20
# docker images
# docker run -it --rm? mysql:5.7.20? cat /etc/issue
# docker run -it --rm mysql:5.7.20 cat /etc/passwd
五、安裝配置MySQL01
在MySQL01服務(wù)器
創(chuàng)建配置文件和數(shù)據(jù)文件目錄
# mkdir /opt/mysqldata
#? mkdir /opt/mysqlconfig
創(chuàng)建配置文件
# vim /opt/mysqlconfig/mysqld.cnf
#################################################
[mysqld]
pid-file? ? ? ? = /var/run/mysqld/mysqld.pid
socket? ? ? ? ? = /var/run/mysqld/mysqld.sock
datadir? ? ? ? = /var/lib/mysql
symbolic-links? = 0
max_connections = 1000
server_id? ? ? ? = 100
log-bin? ? ? ? ? ? = mysql-bin
binlog_cache_size = 1M
binlog_format? ? = mixed
expire_logs_days? = 7
log_bin_trust_function_creators = 1
# GTID
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates? = 1
#################################################
# chown 999:999? /opt/mysqlconfig/mysqld.cnf
注意:/opt/mysqlconfig/mysqld.cnf如果屬主屬組為root,那么權(quán)限要求為644,如果屬組屬主uid為999(容器中mysql用戶的uid),文件權(quán)限可以為644或者640,否則用鏡像起MySQL容器,無法讀取自定義的掛載配置文件!
初始化MySQL
# docker run -d \
? --name mysql \
? -p 3306:3306 \
? -e UMASK=0600 \
? -e UMASK_DIR=0700 \
? -e MYSQL_HISTFILE=/dev/null \
? -e MYSQL_ROOT_PASSWORD="MySQL@123" \
? -v? /opt/mysqldata:/var/lib/mysql \
? -v /opt/mysqlconfig/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
? mysql:5.7.20
#? docker ps -a
#? ll? /opt/mysqldata
可以看出,生成了MySQL初始化數(shù)據(jù),我們后續(xù)會用到相關(guān)數(shù)據(jù),如設(shè)置的初始密碼。
關(guān)于MySQL配置調(diào)優(yōu),大家可以根據(jù)自己的實(shí)際應(yīng)用去編輯mysqld.cnf。
將MySQL注冊成系統(tǒng)服務(wù)
刪掉初始化容器
# docker stop mysql
# docker rm mysql
創(chuàng)建MySQL的systemd Unit文件
# vim /etc/systemd/system/mysqld.service
#######################################################
[Unit]
Description=MySQL Server
After=network-online.target?docker.service
Requires=docker.service
[Service]
ExecStartPre=-/usr/bin/docker rm -f mysql
ExecStart=/usr/bin/docker run \
? --name mysql \
? -p 192.168.1.103:3306:3306 \
? -e UMASK=0600 \
? -e UMASK_DIR=0700 \
? -e MYSQL_HISTFILE=/dev/null \
? -v /opt/mysqldata:/var/lib/mysql \
? -v /opt/mysqlconfig/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
? mysql:5.7.20
ExecStop=/usr/bin/docker stop mysql
LimitNOFILE=65535
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
########################################################
# systemctl? daemon-reload
# systemctl start? mysqld.service
# systemctl enable mysqld.service
# systemctl status? mysqld.service
# docker ps -a
# docker logs? mysql
五、安裝配置MySQL02
在MySQL02服務(wù)器
創(chuàng)建配置文件和數(shù)據(jù)文件目錄
# mkdir /opt/mysqldata
#? mkdir /opt/mysqlconfig
創(chuàng)建配置文件
# vim /opt/mysqlconfig/mysqld.cnf
##########################################################
[mysqld]
pid-file? ? ? ? = /var/run/mysqld/mysqld.pid
socket? ? ? ? ? = /var/run/mysqld/mysqld.sock
datadir? ? ? ? = /var/lib/mysql
symbolic-links? = 0
max_connections = 1000
server_id? ? ? ? = 200
log-bin? ? ? ? ? = mysql-bin
binlog_cache_size = 1M
binlog_format? ? = mixed
expire_logs_days? = 7
log_bin_trust_function_creators = 1
read_only = 1
# GTID
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates? = 1
#####################################################
# chown 999:999? /opt/mysqlconfig/mysqld.cnf
注意:/opt/mysqlconfig/mysqld.cnf如果屬主屬組為root,那么權(quán)限要求為644,如果屬組屬主uid為999(容器中mysql用戶的uid),文件權(quán)限可以為644或者640,否則用鏡像起MySQL容器,無法讀取自定義的掛載配置文件!
初始化MySQL
# docker run -d \
? --name mysql \
? -p 3306:3306 \
? -e UMASK=0600 \
? -e UMASK_DIR=0700 \
? -e MYSQL_HISTFILE=/dev/null \
? -e MYSQL_ROOT_PASSWORD="MySQL@123" \
? -v? /opt/mysqldata:/var/lib/mysql \
? -v /opt/mysqlconfig/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
? mysql:5.7.20
#? docker ps -a
#? ll? /opt/mysqldata
可以看出,生成了MySQL初始化數(shù)據(jù),我們后續(xù)會用到相關(guān)數(shù)據(jù),如設(shè)置的初始密碼。
關(guān)于MySQL配置調(diào)優(yōu),大家可以根據(jù)自己的實(shí)際應(yīng)用去編輯mysqld.cnf。
將MySQL注冊成系統(tǒng)服務(wù)
刪掉初始化容器
# docker stop mysql
# docker rm mysql
創(chuàng)建MySQL的systemd Unit文件
# vim /etc/systemd/system/mysqld.service
#######################################################
[Unit]
Description=MySQL Server
After=network-online.target?docker.service
Requires=docker.service
[Service]
ExecStartPre=-/usr/bin/docker rm -f mysql
ExecStart=/usr/bin/docker run \
? --name mysql \
? -p 192.168.1.105:3306:3306 \
? -e UMASK=0600 \
? -e UMASK_DIR=0700 \
? -e MYSQL_HISTFILE=/dev/null \
? -v /opt/mysqldata:/var/lib/mysql \
? -v /opt/mysqlconfig/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
? mysql:5.7.20
ExecStop=/usr/bin/docker stop mysql
LimitNOFILE=65535
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
########################################################
# systemctl? daemon-reload
# systemctl start? mysqld.service
# systemctl enable mysqld.service
# systemctl status? mysqld.service
# docker ps -a
# docker logs? mysql
六、配置MySQL01 MySQL02 主從
在MySQL01服務(wù)器
創(chuàng)建主從復(fù)制賬號
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "CREATE USER 'repl'@'127.0.0.1' IDENTIFIED BY 'Repl@123';"
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "CREATE USER 'repl'@'192.168.1.105' IDENTIFIED BY 'Repl@123';"
#?docker exec -it mysql mysql -u root -p"MySQL@123" -e "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.105';"
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "select user,host from mysql.user;"
初始化MySQL master slave狀態(tài)
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "reset master;"
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "reset slave;"
在MySQL02服務(wù)器
初始化MySQL master slave狀態(tài)
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "reset master;"
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "reset slave;"
開啟主從同步
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "change master to master_host='192.168.1.103',master_port=3306,master_user='repl',master_password='Repl@123',master_auto_position=1;"
#? docker exec -it mysql mysql -u root -p"MySQL@123" -e "start slave;"
#? docker exec -it mysql mysql -u root -p"MySQL@123" -e "show slave status;"
七、測試主從效果
在MySQL01服務(wù)器
# docker exec -it mysql mysql -u root -p"MySQL@123" -e "CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8 COLLATE utf8_general_ci;"
#?docker exec -it mysql mysql -u root -p"MySQL@123" -e "grant all privileges on test.* to 'test'@'%' IDENTIFIED BY 'Test@123';"
在MySQL02服務(wù)器
# docker exec -it mysql mysql -u root -p"MySQL@123" -e? "select user,host from mysql.user;"
# docker exec -it mysql mysql -u root -p"MySQL@123" -e? "show databases;"
七、參考
MySQL主從配置詳解
http://www.lxweimin.com/p/b0cf461451fb
基于 Docker 的 MySQL 主從復(fù)制搭建
http://www.lxweimin.com/p/ab20e835a73f
CentOS7.x上容器部署MySQL
http://www.lxweimin.com/p/c74b1d2d8ad4
MySQL 查看最大連接數(shù)和修改最大連接數(shù)
https://www.cnblogs.com/aaronguo/p/8412800.html
解決MySQL使用GTID主從復(fù)制錯誤問題
https://blog.csdn.net/fujiakai/article/details/82700457