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';
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架