windows下使用docker安装mysql主从环境

一,mysql主从配置原理

主服务器将数据库的每次操作都记录在二进制文件mysql-bin.xxxxxx中,从服务器通过IO线程使用指定账号登录到主服务器中读取mysql.bin.xxxxxx文件,并将文件内容写入到自己本地的中继日志mysql-relay-bin文件中,然后从服务器的Sql线程会执行mysql-relay-bin中的sql语句,从而实现数据库同步。

二,准备工作

mysql主从配置需要至少2台服务器。在本文章里使用docker来作为环境部署。docker的环境部署这里就不再赘述了。大家可以自行百度下。

1,拉取mysql镜像

docker pull mysql

使用docker images查看拉取的镜像

docker images

 2,主库配置

# 创建主库容器
docker run --name mysql-master -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

# 进入容器
docker exec -it mysql-master bash

# 使用root账号登录数据库
mysql -uroot -p
# 密码是123456,在容器创建的时候有指定

# 创建数据库用户(用户名:masterdb,密码:123456)
create user 'masterdb' identified with mysql_native_password by '123456';

# 授权
grant all privileges on *.* to 'masterdb';

# 更新权限
flush privileges;

到此可以通过软件连接数据库

接下来要修改主库的配置文件

vi /etc/mysql/my.cnf

发现debian系统没有安装vim,使用apt-get进行vim的安装

apt-get install -y vim

无法安装,提示Unable to locate package vim

需要进行apt-get update

因为默认是国外源,执行更新比较慢,需要换源

# 备份
mv /etc/apt/sources.list /etc/apt/sources.list.bak

# 网上找了很多源,都不能正常更新,就减少了源的地址,最终使用下面2条
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list

这里提示没有公钥7638D0442B90D010、CBF8D6FD518E17E1

GPG error: http://mirrors.163.com/debian jessie Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7638D0442B90D010 NO_PUBKEY CBF8D6FD518E17E1

解决方案

# 提示几个公钥缺失就添加几个
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7638D0442B90D010
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv CBF8D6FD518E17E1

 继续执行apt-get install -y vim 后提示缺少依赖

vim : Depends: libtinfo5 but it is not going to be installed

需要安装libtinfo5

apt-get install -y libtinfo5

这里提示包依赖移除、更新

 Essential packages were removed and -y was used without --allow-remove-essential

apt-get install -y libtinfo5 --allow-remove-essential

apt-get install -y vim

安装完以后,修改配置文件

vi /etc/mysql/my.cnf

[mysqld]
#master
log-bin=mysql-bin
server-id=100

保存以后退出容器,并重启容器

docker restart mysql-master

到此主库准备完毕

3,从库配置

# 创建从库容器
docker run --name mysql-slave -p 23306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

# 进入容器
docker exec -it mysql-slave bash

# 使用root账号登录数据库
mysql -uroot -p
# 密码是123456,在容器创建的时候有指定

# 创建数据库用户(用户名:slavedb,密码:123456)
create user 'slavedb' identified with mysql_native_password by '123456';

# 授权
grant all privileges on *.* to 'slavedb';

# 更新权限
flush privileges;

修改从库的配置文件

vi /etc/mysql/my.cnf

[mysqld]
server-id=101
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin

保存后退出容器,并重启容器

docker restart mysql-slave

到此从库准备完毕

三、主从环境配置

进入主库,使用show_master_status 查看状态

# 进入主库容器
docker exec -it mysql-master bash

# 登录数据库
mysql -uroot -p

# 查看主库状态
show master status;

红色箭头的2个参数需要记录下,在从库中使用

退出容器, 查看主从库的ip

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave

主库ip:172.17.0.2

从库ip:172.17.0.3

进入从库,执行数据同步

# 进入从库容器
docker exec -it mysql-slave bash

# 登录数据库
mysql -uroot -p

# 执行数据同步
change master to master_host='172.17.0.2', master_user='masterdb', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 156, master_connect_retry=30;

参数说明

master_host:主库IP

master_port:主库容器端口号

master_user:用于同步的用户

master_password:用于同步的密码

master_log_file:指定从库从哪个日志文件开始复制数据,在主库使用show master status查看

master_log_pos:指定从库从哪个position开始读,在主库使用show master status查看

master_connect_retry:连接重试时间间隔,默认60秒

 使用show slave status 查看主从同步状态

 正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,这是因为还没有开启主从复制

使用一下命令 开始主从复制,然后再次查询

start slave

SlaveIORunning 和 SlaveSQLRunning 这时候会变成yes, 说明同步成功。 如果失败,需要查看mysql错误日志来进行问题定位和解决。

四、测试主从复制

直接在主库创建一个数据库、创建表、更新数据等操作来测试数据同步。 

这里还有个问题,每次docker 重启后,容器的ip都有可能发现改变,所以在创建容器的时候要指定网络和ip

docker network create --subnet=172.18.0.0/16 mysql_network
docker run -it --name mysql_master -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d --net=mysql_network --ip 172.18.0.11 --hostname=host_mysql_master mysql
docker inspect --format='{{.NetworkSettings.Networks.mysql_network.IPAddress}}' mysql_master

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值