基于Docker 配置主从服务器实现 mysql主从复制(8.0版本)

基于Docker 配置主从服务器实现 mysql主从复制

版本
mysql - latest(8.0)
感谢

这里感谢B站上飞哥在狂神说java这个IP上上传的视频资源

主从复制报错2061:Authentication plugin ‘caching_sha2_password’ reported error:Authentication require secure connection - 墨天轮

(1条消息) Docker搭建MySQL8主从复制 (全网最详细版)_bright的博客-CSDN博客

ShardingShpere数据库中间件- 专栏 -KuangStudy

(1条消息) ERROR 1776 (HY000): Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS can_小伟的博客-CSDN博客

(1条消息) @@GLOBAL.GTID_MODE = OFF 问题_wangxuelei036的博客-CSDN博客

等。

同时感谢 B站CSDN简书 等提供的平台!

mysql - 共同配置
安装mysql
docker pull mysql:latest

选择你自己需要安装的mysql版本,这这里选择的是最新的(latest),对应 8.0,版本这里包含了一个连接的坑,我下文会讲!

如果你不是使用Docker进行安装,而是直接在linux下安装mysql,我推荐教程 - (02~03)

该博客是KaungStudy飞哥提供的文档。

mysql 是否安装成功?
查看安装成功的镜像
docker images

查看docker已安装镜像

存在mysql红框内容就表示安装成功!

mysql 启动
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:latest

run : 启动

-p 3306:3306 : 指定映射端口, -p 外部端口:内部端口(容器内部)

–name mysql-master :给容器起别名,起个名称方便以后称呼(我用的主-mysql是mymysql)

-e MYSQL_ROOT_PASSWORD=12345678 : 设置root用户的密码

-d : 后台运行

mysql:latest : mysql:tag,tag就是你选择的msyql版本号

查看mysql-容器是否启动成功?

mysql启动成功后,会打印出当前运行容器的id

或者你自己查看容器状态!

docker ps

查看正在运行的容器列表

这样的就表示启动成功了。

mysql 配置master

先进入 mysql容器内部,这里我的主mysql叫mymysql,命令如下:

docker exec -it mymysql /bin/bash

进入容器

可以看到下一行的**root@**已经不一样了,并且该id就是你当前进入的容器的容器id,

查看容器内部配置文件所在,我已经把my.cnf所在截图了,如下:

my.cnf路径

/etc/mysql/my.cnf (这个有用!)

OK,我感觉我是不是废话太多了,那我们下面就加快进度吧!

拿到路径之后,我们先进入my.cnf,

vim进入my.conf

好吧,容器内部没装vim,你可以自己去安装。

apt-get update

apt-get install vim

我就没有这么去安装了我直接用了docker cp

使用 docker cp 配置 my.cnf
  1. 将my.cnf 从容器复制到主机上
docker cp 容器id(或容器名称):/etc/mysql/my.cnf /docker/mysql/master(或slavel1)/my.cnf

将容器id或名称为XXX的容器在 /etc/mysql/my.cnf 复制给主机路径下的/docker/mysql/master/my.cnf文件

  1. 修改my.cnf(添加对应的主从配置)

主节点如下:

[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
binlog-format=ROW     // 二级制日志格式,有三种 row,statement,mixed
binlog-do-db=数据库名  //同步的数据库名称,如果不配置,表示同步所有的库

从节点如下:

[mysqld]
# 设置server_id,注意要唯一
server-id=201  
# 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
# relay_log配置中继日志
relay_log=mysql-relay-bin  
# 设置为只读,该项如果不设置,表示slave可读可写
read_only=1  

注意每个主从节点的server-id都要唯一!!!

  1. 将修改后的my.cnf复制回容器中
docker cp /docker/mysql/master(或slavel1)/my.cnf 容器id(或容器名称):/etc/mysql/my.cnf 

就是和步骤1的指令路径反一下。

  1. 重启服务
docker restart 容器名称/容器id
master(主)配置

经过共同配置之后呢,我们先进入主-mysql中,查看对应配置从节点需要的信息。

进入mysql内部
# 进入容器内部
docker exec -it 容器id/容器名称 /bin/bash
# 进入mysql
mysql -uroot -p密码

进入master-mysql

登录成功

查看master服务的binlog文件名和位置(master节点执行)
show master status;

master服务的binlog文件名和位置

OK,接下来配置从节点。

slave(从)配置

它一开始的步骤和主的一样,都是共同配置,唯一不一样的是修改 my.cnf不一样,请注意!

进入mysql内部
# 进入容器内部
docker exec -it 容器id/容器名称 /bin/bash
# 进入mysql
mysql -uroot -p密码

进入slave1-mysql)

登录成功

执行 change master to
change master to master_user='root',master_password='mysql8.0',master_host='192.168.168.101',master_port=3306,get_master_public_key=1, master_log_file='master-bin.000004', master_log_pos=1097, master_connect_retry=30;

master_host :Master库的地址
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒》
get_master_public_key=1: 解决 Authentication plugin ‘caching_sha2_password’ reported error:Authentication require secure connection 问题导致的密码插件问题 - msyql8.0才出现的问题。

注意: 当前字段中说的文中指的是 在锚点 - **查看master服务的binlog文件名和位置(master节点执行)**那里查询出来的主节点信息。

启动slave
start slave;
查看是否配置成功?
show slave status \G

\G : 表示换行。

查询从节状态

两个 YES 就成功了!

配置从节点时,出现的各种问题?

飞哥这里已经例举了一大部分,我就不一一讲了,放置传送门: https://www.kuangstudy.com/zl/sharding#1369645557613608962

我讲一下我的主机配置时出现的问题?

  1. Authentication plugin ‘caching_sha2_password’ reported error:Authentication require secure connection 问题导致的密码插件问题 - msyql8.0才出现的问题。

从配置锚点 - 执行 change master to里已经加上了该解决的配置了,看 get_master_public_key=1,从博客中得到的解决方法(在评论那块)。

  1. No query specified

    show slave status\G;

    多了个分号(😉。

  2. The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

    额,我是因为我的从节点连接主节点配置那里的ip地址配置错了。

  3. Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS can

    由于之前用的master_auto_position=1,现在改回0,重新用pos方法change就可以了。

    # 停止slave
    stop slave;
    # 清楚配置
    reset slave;
    change master to master_auto_position=0;
    change master to master_user='root',master_password='mysql8.0',master_host='192.168.168.101',master_port=3306,get_master_public_key=1, master_log_file='master-bin.000004', master_log_pos=1097, master_connect_retry=30;
    # 启动slave
    start slave;
    
使用 root用户 造成从(slavel-mysql)服务器可以操作数据(crud)?

影响: 一不小心就可能造成主从数据不一致!

(2条消息) mysql从库不能写吗_mysql的主从复制,从库设为只读不能写_L NEO的博客-CSDN博客

我建议给从库分配一个普通用户账号并仅分配对应权限!

# 例如以下,创建一个名称为 'username' 密码为 'password' 且任何ip都可以连接的账号 
create user 'username'@'%' identified by 'password';
# 分配权限,例如我只给他 SELECT 权限
grant select on *.* to 'username'@'%';
# 需要刷新
flush privileges;
# 查看效果
show grants for 'username'@'%';

查看权限

然后你就可以自己去测试了,如果先看账号创建成功了吗?

# 查询 mysql 库下的用户表信息
select host,user from mysql.user;
查看用户表信息

权限分配成功后,我这边使用navicat对’username’账号进行登录,并(修改、新增、删除)数据,出现下图错误信息!

无权限提示

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值