Docker MySQL 安装及主从设置 - Go语言中文社区

Docker MySQL 安装及主从设置


MySQL

创建并运行

# 拉取镜像5.7版本
$ docker pull mysql:5.7

# 新建需要挂载的文件夹或文件,docker中的mysql 中的数据存放目录可以去docker hub中搜索mysql,文档寻找
cd /usr/local
mkdir mysql
cd mysql
mkdir data

# 设置端口映射
$ vi /etc/sysconfig/iptables
# 添加3306端口
-A INPUT -p tcp --dport 3306 -j ACCEPT
# 重启iptables
$ systemctl restart iptables.service

# 启动(第一次)
# --name 设置名称
# -v 设置挂载
# -e 设置环境变量,MYSQL_ROOT_PASSWORD--设置密码
# --restart=on-failure:3  设置重启策略,这里设置的是非正常退出下,尝试重启3次
# -p 设置端口映射
# -d 后台运行
# 最后是image_name:image_tag
$ docker run --name myMysql -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --restart=on-failure:3 -p 3306:3306 -d mysql:5.7

# 以后启动
$ docker start CONTAINER_ID

# 结束

主从配置

原理作用
  • 支持方式

    • 单向主从模式:Master ——> Slave
    • 双向主从模式:Master <====> Master
    • 级联主从模式:Master ——> Slave1 ——> Slave2
    • 一主多从模式
    • 多主一从模式(从5.7开始支持)
  • 作用

    • 实时灾备,用于故障切换
    • 读写分离,提供查询服务
    • 备份,避免影响业务
  • 原理

    • 从库生成两个线程,一个I/O线程,一个SQL线程;
    • i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
    • 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
    • SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
      在这里插入图片描述
  • 必要条件

    • 主库开启binlog日志(设置log-bin参数)
    • 主从server-id不同
    • 从库服务器能连通主库
问题及解决方案

mysql主从复制存在的问题:

  • 主库宕机后,数据可能丢失
  • 从库只有一个sql Thread,主库写压力大,复制很可能延时

解决方法:

  • 半同步复制—解决数据丢失的问题
  • 并行复制----解决从库复制延迟的问题
配置过程(一主一从)
# 创建主库与从库,并将相应文件夹(配置文件所在的文件夹与data)挂载到宿主机上,分别对应宿主机的3306,3307端口

# 创建主库(mysql-master)
$ docker run --name mysql-master -v /usr/local/masterMysql/data:/var/lib/mysql -v /usr/local/masterMysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root --restart=on-failure:3 -p 3306:3306 -d mysql:5.7

# 创建从库(mysql-slave)
docker run --name mysql-slave -v /usr/local/slaveMysql/data:/var/lib/mysql -v /usr/local/slaveMysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root --restart=on-failure:3 -p 3307:3306 -d mysql:5.7

# 配置主库
# 进入主库所在的docker
$ docker exec -it CONTAINER_ID /bin/bash

# 安装vim
$ apt-get update
$ apt-get install vim

# 编辑my.cnf,如果不存在就新建一个
$ vim /etc/mysql/my.cnf

# 添加以下内容
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

# 重启mysql服务和其所在的容器
$ service mysql restart
$ docker start CONTAINER_ID

# 添加同步用户(在主库的命令行界面执行)
$ CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
$ GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';


# 配置从库
# 进入从库所在的docker
$ docker exec -it CONTAINER_ID /bin/bash

# 安装vim
$ apt-get update
$ apt-get install vim

# 编辑my.cnf,如果不存在就新建一个
$ vim /etc/mysql/my.cnf

# 添加以下内容
[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin  

# 重启mysql服务和其所在的容器
$ service mysql restart
$ docker start CONTAINER_ID

# 结束
链接Master(主)和Slave(从)
# Master
# 进入master数据库的命令行界面,执行:
$ show master status;

显示如下内容:
在这里插入图片描述
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

# Slave
# 进入slave数据库的命令行界面,执行:
$ change master to master_host='172.17.0.6', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000004', master_log_pos=609, master_connect_retry=30;

# 开启同步配置
$ start slave;

# 查看状态,查看SlaveIORunning 和 SlaveSQLRunning 是否都是yes,都是yes表明配置成功
$ show slave status;

# 
验证

在主库新建一个库,查看从库是否同步

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Carty090616/article/details/101358498
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢