Docker安装主从mysql
一、获取mysql镜像
拉去最新的mysql,如果想要拉去指定的mysql镜像只需要按照名称:版本格式获取指定镜像,默认是点赞最多版本
默认点赞多的版本
docker pull mysql
指定版本
docker pull mysql:5.7
下载完成之后检查一下mysql镜像是否拉去成功
docker images | grep mysql
得到如下结果表示镜像拉取成功
二、运行mysql
2.1 简单部署mysql
启动mysql,执行成功之后会返回容器id
docker run -d -p 3306:3306 --privileged=true -v /var/log/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql
参数说明:
-
-d: 后台运行容器,并返回容器ID;
-
-i: 以交互模式运行容器,通常与 -t 同时使用;
-
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
–name=“nginx-lb”: 为容器指定一个名称;
-
-e username=“ritchie”: 设置环境变量;
-
–volume , -v: 绑定一个卷
启动容器之后,需要检查容器是否正常
docker ps |grep mysql
进入/usr/local/mysql/conf(注:当前文件夹目录是 映射卷的目录,千万别弄错了)目录下新建如下脚步文件my.cnf,编辑my.cnf内容如下,保存并退出shift+ZZ:
vim my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
启动容器之后,需要检查容器是否正常
docker ps |grep mysql
进入容器,注意a65a90c70898 为本人的容器id
docker exec -it 628b497e1ecf /bin/bash
执行以下sql
#创建db01库
CREATE DATABASE db01;
#进入db01库
use db01;
#创建表t1
CREATE table t1(id int ,nams varchar(20));
#新增数据
INSERT into t1 VALUES (1,"aa");
#查询t1表
SELECT * from t1;
#新增数据
INSERT into t1 VALUES (2,"王五");
#查询t1表
SELECT * from t1;
三、运行MySQL
3.1 安装master 节点
运行如下指令
docker run -d -p 3307:3306 --privileged=true -v /var/log/mysql-master/log:/var/log/mysql -v /usr/local/mysql-master/data:/var/lib/mysql -v /usr/local/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql-master mysql
进入/usr/local/mysql-master/conf(注:当前文件夹目录是 映射卷的目录,千万别弄错了)目录下新建如下脚步文件my.cnf,
创建my.cnf:
touch my.cnf
编辑文件命令
vim my.cnf
内容如下:
## 默认编码格式
[client]
default_character_set=utf8
[mysqld]
## 设置服务端编码格式
collation_server = utf8_general_ci
## 设置编码格式
character_set_server = utf8
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
按键,保存退出
Shift zz
3.2 安装slave节点
运行如下指令
docker run -d -p 3308:3306 --privileged=true -v /var/log/mysql-slave/log:/var/log/mysql -v /usr/local/mysql-slave/data:/var/lib/mysql -v /usr/local/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql-slave mysql
查看容器是否起来
docker ps | grep mysql-slave
进入/usr/local/mysql-slave/conf(注:当前文件夹目录是 映射卷的目录,千万别弄错了)目录下新建如下脚步文件my.cnf,
创建my.cnf:
touch my.cnf
编辑文件命令
vim my.cnf
内容如下:
## 默认编码格式
[client]
default_character_set=utf8
[mysqld]
## 设置服务端编码格式
collation_server = utf8_general_ci
## 设置编码格式
character_set_server = utf8
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
按键,保存退出
Shift zz
3.3 主从配置
3.3.1 master 节点配置
执行容器重启指令
docker restart mysql-master
进入容器实例
docker exec -it mysql-master /bin/bash
进入mysql
mysql -u root -p
输入密码
创建同步用户
设置用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
节点说明:
slave --> 用户名
123456 --> 为用户密码
设置群组
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
查看主从同步状态
show master status;
一定要记录File:mall-mysql-bin.000001、Position:617值
查看mysql-master 的ip
docker inspect mysql-master
3.3.2 slave 节点配置
执行容器重启指令
docker restart mysql-slave
进入容器实例
docker exec -it mysql-slave /bin/bash
配置主从复制
执行主从复制配置,在从属docker中执行
change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000003', master_log_pos=154, master_connect_retry=30;
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mall-mysql-bin.000001', master_log_pos=617;
配置参数 说明
节点 | 说明 |
---|---|
master_host | 主数据库的IP地址:ip一定是ens3对应的inet |
master_port | 主数据库的运行端口 |
master_user | 在主数据库创建的用于同步数据库的用户账号 |
master_password | 在主数据库创建的用于同步数据库的用户密码 |
maste_log_file | 指定从数据库需要复制数据的日志文件,通过查看主数据的状态,获取File参数 |
master_log_pos | 指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数 |
master_connect_retry | 连接失败重试的时间间隔,单位为秒 |
查看主从配置是否生效
查看配置
show slave status \G;
通过如下看出Slave_IO_Running、Slave_SQL_Running结果为no
执行开启主从
执行如下指令,开启主从
start slave;
查看配置
执行如下指令
show slave status \G;
通过如下看出Slave_IO_Running、Slave_SQL_Running结果为yes,说明主从开启成功。
如果始终是Slave_IO_Running:Connecting,则参考以下链接:
https://blog.csdn.net/weixin_39359455/article/details/104220723
3.4 验证
进入master执行如下指令
#创建db01库
CREATE DATABASE db01;
#进入db01库
use db01;
#创建表t1
CREATE table t1(id int ,nams varchar(20));
#新增数据
INSERT into t1 VALUES (1,"aa");
#新增数据
INSERT into t1 VALUES (2,"222");
#查询t1表
SELECT * from t1;
在master中查看数据:
进入slave查看数据是否同步
如下图所示,说明主从配置无误