基于docker的Mysql主从数据库配置

基本过程

1)、Mysql的主从同步就是当master(主库)发生数据变化的时候,会实时同步到slave(从库)。
2)、主从复制可以水平扩展数据库的负载能力,容错,高可用,数据备份。

3)、不管是delete、update、insert,还是创建函数、存储过程,都是在master上,当master有操作的时候,slave会快速的接受到这些操作,从而做同步。

用途和条件

1)、mysql主从复制用途
  ●实时灾备,用于故障切换
  ●读写分离,提供查询服务
  ●备份,避免影响业务
2)、主从部署必要条件:
  ●主库开启binlog日志(设置log-bin参数)
  ●主从server-id不同
  ●从库服务器能连通主库

拉取mysql镜像

用 docker search mysql 命令来查看可用版本

拉取一个你需要的版本:

docker pull mysql:5.7

查看镜像:

docker images

基于docker的Mysql主从数据库配置_第1张图片
制作运行mysql主从容器:

3306端口前面的端口是容器映射到宿主机的端口,外部访问端口,映射端口时注意端口不要冲突。
Master库:

docker run -p 3339:3306 --name main_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Slave库:

docker run -p 3340:3306 --name slave_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

查询启动两个mysql容器:
在这里插入图片描述
使用工具连接测试:
基于docker的Mysql主从数据库配置_第2张图片

配置Master(主)

通过docker exec -it 35d587e3438a /bin/bash命令进入到Master容器内部,也可以通过docker exec -it main_mysql /bin/bash命令进入。3330ed3c6cde是容器的id,而main_master是容器的名称。

cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。

报错:

bash: vi: command not found,

升级系统解决:

apt-get update
apt-get install vim命令安装vim

在my.cnf中添加如下配置:

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

重启mysql服务使配置生效

service mysql restart

重启容器

docker start main_mysql

REPLICATION

下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

进入容器:

docker exec -it main_mysql 

连接数据库:

mysql -u root -p 123456

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

基于docker的Mysql主从数据库配置_第3张图片

配置从数据库slaveMySQL

基本操作和主数据库一样

cd /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服务和docker容器,操作和配置Master(主)一致。

重启mysql服务使配置生效

service mysql restart

重启容器

docker start slave_mysql

连接Master(主)和Slave(从)

在Master进入mysql,执行show master status;
基于docker的Mysql主从数据库配置_第4张图片
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

master_host查询 后面跟容器名字或者容器ID:

docker inspect --format='{
     {
     .NetworkSettings.IPAddress}} main_mysql

在这里插入图片描述
在Slave 中进入 mysql,执行:

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 617, master_connect_retry=30;

在这里插入图片描述
基于docker的Mysql主从数据库配置_第5张图片
在从数据库查询从数据库状态:

show slave status \G;

基于docker的Mysql主从数据库配置_第6张图片
此时这两状态都是NO:

Slave_IO_Running: No
Slave_SQL_Running:No

因为此时从数据库还未开启主从服务

开启数据库主从服务:

start slave;

在这里插入图片描述

再次查看:

show slave status \G;

基于docker的Mysql主从数据库配置_第7张图片
主从配置成功。

测试主从同步:

连接主数据库,创建数据库
进入主库,创建一个mysql数据库:

create database gene

Master:

基于docker的Mysql主从数据库配置_第8张图片

Slave:

基于docker的Mysql主从数据库配置_第9张图片
操作Master库则Slave库跟着也会变化,表示主从配置 搭建完成。

mysql主从不同步的解决方式

先停掉主从模式:

stop slave;

#表示跳过第n步错误,n就是后面的数字

set global sql_slave_skip_counter =1;

再次启动主从:

start slave;

之后再用mysql> show slave status\G 查看:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

主从同步状态恢复正常

你可能感兴趣的:(docker,Linux,mysql,docker)