使用podman搭建MySQL 8.0主从避坑指北

镜像准备和选择

由于mysql自带许多工具,比如mysqlbinlog之类的,但是普通数字版本号的就直接阉割掉了(如mysql:8.0),mysqlbinlog binary is missing on docker image 8.0.30,当时一度以为是自己容器水平不过关,最后是这么个事儿,所以要选择8.0.30-debian之类的版本号。加上最近dockerhub也被墙了,大伙自己想办法吧,我的办法是梯子+TUN模式。

为什么选择podman而不用docker

因为podman装起来实在是很方便,而且可以root-less运行,别的好处先不谈,你是否在linux上经常在docker命令前忘记加sudo?

安装

先要准备两个配置文件!位置随你放,但是你-v的时候要设置对,记得一定一定一定要叫*.cnf!!!!!!!!!!
在从机上只能读,不能写!这是原则问题,一旦写了,那么就会有奇怪的数据同步问题产生,因为从机是单方面的从主机拉数据罢了。所以要配置一个从机上只读的账号!
这里还有个坑,尽管在cnf已经加上read_only=1,但是创建一个普通用户依然可以写入。所以,尽管在从机上创建一个只读账户。再加上read_only才能生效。

config 复制代码
[mysqld]
# log-bin、binlog-do-db、binlog-ignore-db、server-id
log-bin = mysql-bin
# 需要同步的数据库名,多个配置多行
#binlog-do-db = test
# 不同步的数据库,多个配置多行
binlog-ignore-db = sys
#主节点id
server-id = 1

config 复制代码
[mysqld]
# log-bin、binlog-do-db、binlog-ignore-db、server-id
log-bin = mysql-bin
# 需要同步的数据库名,多个配置多行
#binlog-do-db = test
# 不同步的数据库,多个配置多行
binlog-ignore-db = sys
#主节点id
server-id = 2
# 设置只读
read_only=1

只有ID有区别,别的你可以自己设置。 主机和从机都安装

bash 复制代码
podman run --name some-mysql-debian -v ./conf:/etc/mysql/conf.d   -v ./data:/var/lib/mysql   -e MYSQL_ALLOW_EMPTY_PASSWORD=true -p 3306:3306 -d 你的自备镜像

一定要提前准备confdata这两个文件夹 详细的compose文件大家可能看得更清楚,也可以用podman-compose部署

yml 复制代码
version: '3.0'

services:
  mysql-debian-server:
    image: mysql:latest  # 请根据实际情况指定MySQL镜像版本
    container_name: some-mysql-debian
    volumes:
      - ~/podman-mysql/conf:/etc/mysql/conf.d
      - ~/podman-mysql/data:/var/lib/mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: true
    ports:
      - "3306:3306"
    command: mysqld
    restart: always

相信大家也能发现,我没有预设密码。不设密码有如下好处: 以后改密码的时候,再升级镜像或者换镜像,都可以直接用data,一开始就设置密码,可能导致有些数据加密,新的密码与老的冲突,寄。

进容器设置

主,从都要!

sql 复制代码
podman exec -it 你的容器 /bin/bash`
mysql -u root
ALTER USER 'your_username'@'localhost' IDENTIFIED BY 'new_password';

主机还要再加用户给从机同步

sql 复制代码
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
flush privileges;
show master status;

执行到show master status应该打印出一个表格:

像我这样名字是mysql-bin.00000X开头是对的 如果你的结果是这样:

那你就寄了,再仔细检查一下前面的工作吧。

让我们再转到从机进行设置! 同样的,给自己设置一个密码

sql 复制代码
podman exec -it 你的容器 /bin/bash`
mysql -u root
// % 表示允许所有用户
ALTER USER 'your_username'@'%' IDENTIFIED BY 'new_password';
// 再设置一个只读账号!
CREATE USER 'reader'@'%' IDENTIFIED BY 'new_password';

开始主从相关的设置了!

ini 复制代码
CHANGE MASTER TO
MASTER_HOST='你的主机IP',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157;
ini 复制代码
start slave;
show slave status ;

就全部完成了。

一点个人经验

如果一个数据库已经用了很久,要再加一台数据库做从机的话,那么只能先手动同步内容,内容一样后再开二进制同步。

相关推荐
覆东流8 分钟前
7.Java数组
java·开发语言·后端
threerocks40 分钟前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
JavaPub-rodert1 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
深漂的华哥1 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
why技术3 小时前
eli5,我觉得这个全网在吹的技能,使用体验真的很一般啊。
前端·人工智能·后端
学习星球3 小时前
Qwik 框架入门实战:从开源项目 Qwik City 开始,用可恢复性替代水合
后端·前端框架·开源·c5全栈
IT_陈寒5 小时前
被Java的final坑惨了,这些细节你可能也忽略了
前端·人工智能·后端
Zadig5 小时前
企业 Agent 总烂在 Demo 里?Zadig 工作流 AI 任务给了一条路
后端·devops
Zadig5 小时前
告别"人肉扛雷":Zadig 用 AI 接管发布前最脏最累的 15 分钟
后端·aiops
Nturmoils6 小时前
向量数据库不该成为新孤岛:KingbaseES 多模融合架构如何减少数据搬运
后端