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;
#
验证
在主库新建一个库,查看从库是否同步