CQRS读写分离MySQL数据库如何部署至Linux,实现一主多从
FearlessGuo
首先有一台可以使用的Linux服务器,可以自行购买,当然也可以白嫖。
有一款可以连接Linux的软件,我用的是putty
在Linux上下载docker镜像,类似应用商店。安装过程参阅下方链接
Linux安装Docker完整教程_docker安装_风随心飞飞的博客-CSDN博客
下载mysql镜像,查看版本
本次使用版本5.7
配置mysql的容器,每个容器就像是一台新的电脑,相互独立各不相同
实现demo:
--name后的内容可以修改
密码可以不为123456
结尾mysql为镜像名称,唯一可以只写name,不唯一也可以用id进行使用
这两段demo都可以创建容器,具体区别不清楚,多尝试一下,一个用不了就换一个。
1
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
2
docker run -p 3312:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
Docker ps 查看运行镜像
Docker ps -a 查看所有镜像
测试mysql容器是否正常
如果连接失败了
参阅以下文章:
MySQL 异常: "Host 'xxx' is not allowed to connect to this MySQL server"_mazaiting的博客-CSDN博客
下面我们配置数据库主从模式(可以当成读写分离)
- 我们专用的挂载好的容器(切记不要使用相同端口号,名字也不要相同)
//参数详解// -d守护进程// -p端口映射 -p 宿主机端口:容器端口// --privileged=true 应用容器 获取宿主机root权限// -v 绑定共享映射目录,-v 宿主机目录:容器目录
//主库
docker run -d -p 3322:3306 --privileged=true -v ~/docker_data/mysql-master/log:/var/log/mysql -v ~/docker_data/mysql-master/data:/var/lib/mysql -v ~/docker_data/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql
//从库
docker run -d -p 3324:3306 --privileged=true -v ~/docker_data/mysql-slave/log:/var/log/mysql -v ~/docker_data/mysql-slave/data:/var/lib/mysql -v ~/docker_data/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql
//可以多个从库
docker run -d -p 3325:3306 --privileged=true -v ~/docker_data/mysql-salve/log:/var/log/mysql -v ~/docker_data/mysql-salve/data:/var/lib/mysql -v ~/docker_data/mysql-salve/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-salve mysql
下面我们需要配置Linux挂载文件夹里的文件
这里主库和从库的都已经备注好了
//**主库配置** 这里在宿主机更新配置文件后,容器也会同步更新//在刚刚共享映射的宿主机conf目录新建my.cnf 写入以下内容//我的目录是:/docker_data/mysql-master/conf/my.cnf teps:不需要复制这段话 [mysqld] ## 设置server_id 同一局域网中需要唯一 server_id=101 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能 log-bin=mall-mysql-bin ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,stateement,row) binlog_format=mixed ## 二进制日志过期清理时间 默认值为0 表示不自动清理 expire_logs_days=7 ## 跳过主从复制值遇到的所有错误或指定类型的错误,避免slave端复制中断## 如:1062错误是指一些主键重复 1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
//**从库配置** 这里在宿主机更新配置文件后,容器也会同步更新//在刚刚共享映射的宿主机conf目录新建my.cnf 写入以下内容//我的目录是:/docker_data/mysql-slave/conf/my.cnf teps:不需要复制这段话 [mysqld] ## 设置server_id 同一局域网中需要唯一 server_id=102 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能 log-bin=mall-mysql-slave1-bin ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,stateement,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
如多多个从库变一下server_id就可以了只要不重复就行。想的话可以多设置几个小弟,搞两个给你们演示一下。
这是一个事例,其他的照着写就行。
下面一步一步进入主库(对主库创建slave用户)成功以后可查看是否创建了slave
Exit退出容器,去从库容器中进行配置
如果没报错的话会出来这样一个会话框
我们可以看见这两个状态是关闭的。
可能运行会有报错,empty,没关系这是我们少写了一段话,加上就行。
change master to master_host='47.97.19.23', master_user='slave', master_password='123456', master_port=3322, master_log_file='mall-mysql-bin.000001', master_log_pos=371, master_connect_retry=30;
这边需要最长的demo很贴心的放到这里了。切记一行代码,不能换行!!!!
当然如果直接复制粘贴的话,肯定报错。
需要修改一下port,为你主服务器的端口
还有其他的东西,自己看看去。
//开启主从复制
Start slave;
//查询从库状态
Show slave status \G;
此处的状态已经为yes了说明我们已经配置成功了
这时候你的数据库就不是一个了,主库后面跟俩小弟,非常哇塞。
在主mysql里创建test数据库两个小弟也就有了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律