posts - 52,comments - 30,views - 13万

MySql 受用docker 搭建一主一从 

由于最近工作有需要用到Mysql的主从复制、读写分离 于是开始了自己的搭建之旅~

由于只用一台服务器就选择采用docker容器的方式进行

在搭建之前也找过很多帖子 但都以失败告终  后来经过自己的摸索终于找到了比较合适在做法

还有一些常见的报错 也会相应的解决方案

核心想法是通过docker 配置两个mysql 分别设置主从  在两台中选一台为主 一台为从  然后启动服务先在主数据库中添加一个用户让从能够通过这个用户访问、再记录下主的 File | Position 然后在my.conf 中完善配置文件,最后通过关系命令启动

废话不多说 

开始

 

检查docker 镜像文件中是否有mysql的镜像(docker pull mysql:latest )

 

运行mysql(由于要配置读写分离启动两个镜像)分别启动到3310和3311两个端口  注意:开发端口后需要将服务器安全组对应的端口、ufw 对于的端口开放

复制代码
netstat -a # 查看所有服务端口

ufw disable 关闭防火墙

wfw enable 开启防火墙

sudo ufw status 查看ufw的状态

sudo ufw allow 3310/tcp 开发端口

sudo ufw delete allow 3310删除端口 

sudo ufw allow from 192.168.1.1 允许特定来源的ip地址访问 sudo ufw reload 重新加载
复制代码

(端口不能和docker容器中的其他端口冲突)

开始启动容器

主: docker run --name mysql01 -p 3306:3310 -e MYSQL_ROOT_PASSWORD=root -d 123456 

从: docker run --name mysql02 -p 3307:3311 -e MYSQL_ROOT_PASSWORD=root -d 123456

 

启动成功之后先进入主库

docker exec -it mysql-master bash

docker exec -it mysql-slave    bash

 

链接mysql 

mysql -uroot -p123456

 

设置允许远程访问

 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

 

//刷新
 FLUSH PRIVILEGES;

 

//在主库中创建用户slave给 从库做数据复制的时候用

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

//刷新
 FLUSH PRIVILEGES;

 

//退出mysql

exit;

 

进入容器中mysql存储的文件目录 

cd etc/mysql/

vim my.conf

 或者

vi etc/mysql/my.cnf

 

由于docker容器是简装版的系统 需要自己下载vim

apt-get update

apt-get install vim

 

然后开始写入配置 (按 i 插入 )

现在开始写入主库的内容:

原有的内容不要管在里面继续添加就行

复制代码
[mysqld]  
## 同一局域网内注意要唯一  
server-id=100  
# 开启二进制日志功能,可以随便取(关键) 
log-bin=mysql-bin 
#设置需要同步的数据库 
binlog‐do‐db= AnnualBill 
#屏蔽系统库同步 
binlog‐ignore‐db=mysql 
binlog‐ignore‐db=information_schema 
binlog‐ignore‐db=performance_schema
复制代码

 

写入完毕后 

输入完毕后按 esc  之后  再按 shift + :  输入 wq保存 退出 可以使用cat etc/mysql/my.cnf 查看文件内容

文件写入完毕后就 exit 退出当前容器即可

退出到容器页面后 重启一下该主容器保证配置生效  docker restart mysql-master

然后再次进入主库

docker exec -it mysql-master bash

mysql -uroot -p123456

//查看查看File、Position编码

show master status;

一般是这样的

 

 然后记录好 File 和 Position 就好

 

然后进入从容器

docker exec -it mysql-slave    bash 

slave(从) 修改 /etc/mysql/my.cnf

vi  /etc/mysql/my.cnf

 

由于docker容器是简装版的系统 需要自己下载vim

apt-get update

apt-get install vim

 

在原有的内容里面继续添加就行

复制代码
[mysqld]
##id确保唯一 server
-id=101 ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin ## 需要同步的数据库 replicate_wild_do_table=AnnualBill.% ## 需要屏蔽的数据库 replicate_wild_ignore_table=mysql.%
复制代码

 

写入完毕后 

输入完毕后按 esc  之后  再按 shift + :  输入 wq保存 退出 可以使用cat etc/mysql/my.cnf 查看文件内容

然后进入mysql 开始最后的配置

最难搞的就是这个地方(类似于这个链接字符串的网上有很多种,不尽相同 我也是尝试了很多次才找到正确的)

change master to
master_host='120.79.77.91',
master_user='slave',
master_password='123456',
master_port=3310,
master_log_file='mysql-bin.000001',
master_log_pos=156,
master_connect_retry=30;

参数讲解
master_host :当前服务器的公网ip (有的填容器的ip但是我尝试过不行)

master_user : 登陆主数据库的 用户名称

master_password : 登陆主数据库的 用户 密码

master_port : 登陆主数据库的 端口(docker 宿主机的端口 )

master_log_file : 刚才记录的file

master_log_pos : 刚才记录的Position 

master_connect_retry : ;链接失败的尝试次数

执行完毕后 启动

START SLAVE;

如果输入错误

//停止 后再次输入正确的就行了

STOP SLAVE;

 最后看当前从库的链接状态

SHOW SLAVE STATUS\G;

 

 

 

只有两个都是yes的才可以

如果一个yes 下面会提示错误信息

 

我整理了常见的错误信息如下

报错:

Last_IO_Error: error connecting to master 'repl@127.0.0.1:3316' - retry-time: 60 retries: 2 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

解决方案

ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

 

报错:

或者

repairReplication: attempt to fix 'Slave failed to initialize relay log info structure from the repository (errno 1872)'

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

解决方案:

stop slave;

reset slave;

start slave;

 

报错:

ERROR 1698 (28000): Access denied for user 'root'@xxx,xx,xx

 解决方案:修改 root 可以通过任何客户端连接  

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

 

当都成功后显示两个yes 后

测试:在主库通过创建一个数据库 看从库有没有同步过来  然后再创建表 和数据 如果能都同步过来,恭喜搭建成功

一定要在主库先创建表 我开始在从库创建后报错了又重新停止链接后 才正常

CREATE DATABASE `AnnualBill` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

 

 

 

posted on   白码一号  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示