本文旨在win10上搭建Ubuntu18.04虚拟机,安装MySQL的Docker服务,实现主从复制,并供win10上的程序应用调用。
目录
1.虚拟机安装
2.win10宿主机ping通ubuntu虚拟机
3.安装Docker
4.拉取MySQL5.7镜像
4.1去阿里云获取个人的镜像加速器
4.2 创建主从实例容器
4.3 修改Master容器内的my.cnf
4.4 Master数据库设置数据同步用户
4.5 设置Slave1数据库
4.6 获取所有容器的IP
4.7 主数据库设置主从同步
4.8 从数据库设置主从同步
4.9 小结
5.数据库同步演示
本文旨在win10上搭建Ubuntu18.04虚拟机,安装MySQL的Docker服务,实现主从复制(一主一从),并供win10连接使用。
这里强烈建议使用最新版本的VMware,本次搭建将使用15.5.2版本的,防止虚拟机再次开机时卡死,以及“虚拟机繁忙”等错误。
这里提供两个VMware虚拟机软件下载链接:
VMware Workstation Pro 15.5.2 Build 15785246:
https://download3.vmware.com/software/wkst/file/VMware-workstation-full-15.5.2-15785246.exe
VMware Workstation Pro 12.5.9 Build 7535481
https://download3.vmware.com/software/wkst/file/VMware-workstation-full-12.5.9-7535481.exe
win10搭建Ubuntu18.04虚拟机:
参考链接:https://blog.csdn.net/qq_42372031/article/details/100588245
若安装vmware-tools出现"what is the location of the "ifconfig"program on your machine?"
解决方法一:直接输入“yes”,再回车即可。
解决方法二:
使用命令:ifconfig 查看虚拟机ip地址
设置网络:
虚拟机内部ping:
宿主机ping:
先安装vim:sudo apt-get install vim
更换阿里云镜像源:
参考链接:https://blog.csdn.net/hang916/article/details/79465458
cd /etc/apt
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
sudo vim /etc/apt/sources.list
vim命令删除全部内容,在命令模式下,光标在首行首个字母处,输入:.,$d 一回车就全没了,表示从当前行到末行全部删除掉。
然后添加阿里云镜像地址:
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
:wq保存退出。
执行:
sudo apt-get update
sudo apt-get upgrade
Ubuntu虚拟机安装Docker
官网参考链接:https://docs.docker.com/engine/install/ubuntu/
执行命令至:
查看docker版本:docker version
Docker启动报错:Got permission denied……
解决:https://www.cnblogs.com/informatics/p/8276172.html
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用
安装成功。
# 启动docker
sudo service docker start
# 停止docker
sudo service docker stop
# 重启docker
sudo service docker restart
逐行输入命令:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的镜像地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
然后拉取镜像:sudo docker pull mysql:5.7
启动容器:
#Master(主):
sudo docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
#slave1(从):
sudo docker run -p 3340:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
Master对外映射的端口是3339,Slave1对外映射的端口是3340。因为docker容器是相互独立的,每个容器有独立的ip,所以不同热容器使用相同的端口并不会冲突。
这里使用MySQL默认的3306端口,否则可能会出现无法通过ip连接docker容器内MySQL的问题。
进入容器内部:
sudo docker exec -it mysql-master /bin/bash
在容器内部添加MySQL账号:
#fate为账户名,root为密码
CREATE USER 'fate'@'%' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON * .* TO 'fate'@'%';
此时新起一个终端,原先的终端不要关,输入命令:
sudo apt install mysql-client-core-5.7
sudo apt install mariadb-client-core-10.1
#登陆master
mysql -h192.168.10.10 -P3339 -u fate -proot
可能会出现错误:
ERROR 2059 (HY000):Authentication plugin 'caching_sha2_password' cannot be laoded
这时需要返回原来的终端,在容器内部设置解决报错问题:
#fate为master用户名,root为密码
ALTER USER 'fate'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
使用命令:
sudo docker exec -it mysql-master /bin/bash
进入master容器内,安装vim:
apt-get update
apt-get upgrade
apt-get install vim
进入到/etc/mysql目录下:
cd /etc/mysql
vi my.cnf
对my.cnf添加下列内容:
[mysqld]
## 同一局域网内主要要唯一
server-id=100
## 开启二进制日志功能
log-bin=mysql-bin
退出Master容器并重启生效:sudo docker restart mysql-master
或者:
重新进入Master数据库:
sudo docker exec -it mysql-master /bin/bash
#root用户密码为root
mysql -uroot -proot
授予用户slave以 PLICATION SLAVE 权限和 REPLICATION CLIENT权限,用于在主从库之间同步数据。
CREATE USER 'slave'@'%' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
退出重启一下:
sudo docker restart mysql-master
进入Slave1数据库:
sudo docker exec -it mysql-slave1 /bin/bash
apt-get update
apt-get upgrade
apt-get install vim
cd /etc/mysql
vi my.cnf
类似Master,在对my.cnf添加下列内容:
[mysqld]
## 同一局域网内主要要唯一
server-id=101
## 开启二进制日志功能
log-bin=mysql-slave-bin
##relay_log配置中继日志
relay_log=edu-mysql-relay-bin
然后退出重启从节点:sudo docker restart mysql-slave1
或者:
虚拟机命令行执行:
sudo docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress}}' $(docker ps -aq)
可能报错:
解决办法是,将当前用户添加 docker 组:
sudo usermod -a -G docker $USER
重启虚拟机或着注销当前用户,这是必须的,否则组更改不会生效。
打开终端,重新启动主从节点:
sudo docker restart mysql-master
sudo docker restart mysql-slave1
重新执行:
sudo docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress}}' $(docker ps -aq)
得到结果:
/mysql-slave1 - 172.17.0.3
/mysql-master - 172.17.0.2
/serene_sinoussi -
从Master进入MySQL,执行命令:
sudo docker exec -it mysql-master /bin/bash
mysql -uroot -proot
#进入MySQL后:
mysql> show master status;
结果:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
新起一个终端,进入Slave1内部MySQL,执行命令:
sudo docker exec -it mysql-slave1 /bin/bash
mysql -uroot -proot
change master to master_host='172.17.0.2', master_user='slave',master_password='root',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=154,master_connect_retry=30;
效果如下:
mysql> change master to master_host='172.17.0.2', master_user='slave',master_password='root',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=154,master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
增加从数据库连接账号:
CREATE USER 'slave2'@'%' IDENTIFIED BY 'root';
GRANT SELECT ON * .* TO 'slave2'@'%';
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
结果:
再执行效果:
图中两个Yes表示正常同步。
从数据库停止同步命令:
STOP SLAVE IO_THREAD FOR CHANNEL ''
主数据库:mysql-master,从数据库:mysql-slave1。
master内部数据账号"fate",相当于"user_write";slave1内部数据账号"slave2",相当于"user_read"。
数据同步用户为 " slave " 。
另一种方案(未亲自实践):https://blog.csdn.net/big_white_py/article/details/103940139
进入master数据库中,查看master状态:
进入slave1节点数据库中:
#先停止slave
STOP SLAVE IO_THREAD FOR CHANNEL '';
#重新设slave同步
CHANGE MASTER TO MASTER_HOST='172.17.0.2',MASTER_USER='slave',MASTER_PASSWORD='root',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0;
#再启动slave
start slave;
#查看slave状态
show slave status \G;
win10主机使用数据库连接工具连接虚拟机中master主节点:
新建数据库:
create database test1 DEFAULT CHARACTER set utf8;
use test1;
CREATE TABLE tbl_test(
`user` VARCHAR(64) not null,
`age` INT(11) not null
)DEFAULT charset utf8;
效果如下:
进入slave数据库查看:
可以看到,slave数据库已经同步了master数据库中新建的数据库和表了。
接下来查看测试插入的数据:
INSERT INTO tbl_test (user,age) VALUES ('fate',18);
效果如下,同步插入数据没有问题:
查看slave状态:
查看master状态:
刚刚好对上,说明基本没问题了。
如果关闭虚拟机,再重新启动时,需要启动Docker服务和两个MySQL实例:
sudo service docker start
sudo docker restart mysql-master
sudo docker restart mysql-slave1
记得拍摄虚拟机快照!!!
记得拍摄虚拟机快照!!!
记得拍摄虚拟机快照!!!
如果这篇文章帮到了你,欢迎赏杯快乐水哦~