在ubuntu使用docker配置mysql主从同步 搭建读写分离
主从概念
首先需要配置两个mysql数据库,一个是本机下的主机Master,另外一个从机Slave
master拥有一个Binarylog日志,slave则为Relay日志
binarylog日志通过发送一个Io线程发送更改后的数据,relaylog接收到后更新slave库的数据
-
在ubuntu中安装mysql从机
-
获取MySQL镜像
$ sudo docker image pull mysql:5.7.22 或 $ sudo docker load -i 文件路径/mysql_docker_5722.tar
-
指定mysql从机配置文件
$ cd ~ $ mkdir mysql_slave #创建mysql_slave文件 $ cd mysql_slave #进入 $ mkdir data #创建data文件 $ cp -r /etc/mysql/mysql.conf.d ./ 将这个目录下的文件复制到当前文件 $ cd mysql.conf.d #进入 $ vim mysqld.cnf #进入
-
修改mysql从机配置文件
# 从机端口号 port = 8306 # 关闭日志 general_log = 0 # 从机唯一编号 server-id = 2
-
安装运行mysql从机
$ sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v /home/python/mysql_slave/data:/var/lib/mysql -v /home/python/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.22
-
测试是否启动成功
$ mysql -uroot -p -h 127.0.0.1 --port=8306 #注意不要在-p后面输入密码会报警告 #从库密码在上面启动时设置的为mysql
-
docker
docker container ls 查看运行镜像 docker container ls -a #查看所有镜像 docker container stop 镜像名 #停止镜像 docker container rm 镜像名 #删除镜像 docker container start 镜像名 #启动镜像 #注意不要在-p后面输入密码会报警告 #从库密码在上面启动时设置的为mysql
-
-
从库在docker中配置好后开始实现主从同步
-
配置主机(ubuntu的MySQL)
- 如果需要修改配置的话需要重启主机
# 开启日志 general_log_file = /var/log/mysql/mysql.log general_log = 1 # 主机唯一编号 server-id = 1 # 二进制日志文件 log_bin = /var/log/mysql/mysql-bin.log
-
从机备份主机原有数据
# 1. 收集主机原有数据 $ mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql # 2. 从机复制主机原有数据 $ mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
-
主从同步实现
- 1.创建用于从服务器同步数据的帐号
# 登录到主机 $ mysql –uroot –pmysql # 创建从机账号 $ GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave'; # 刷新权限 $ FLUSH PRIVILEGES;
- 2.展示ubuntu中MySQL主机的二进制日志信息
$ SHOW MASTER STATUS;
- 3.Docker中MySQL从机连接ubuntu中MySQL主机
# 登录到从机 $ mysql -uroot -pmysql -h 127.0.0.1 --port=8306 # 从机连接到主机 $ change master to master_host='127.0.0.1', master_user='slave', master_password='slave',master_log_file='mysql-bin.000250', master_log_pos=990250; 注:其中master_log_file='mysql-bin.后面的数字要跟主库SHOW MASTER STATUS展示的日志File下面数字同步' 同样master_log_pos=后面的数字要跟主库SHOW MASTER STATUS展示的日志Position下面的数字同步 表示我要跟主库的那个字节开始同步,否则从库永远不可能跟主库的数据同步!!! # 开启从机服务 $ start slave; # 展示从机服务状态 $ show slave status \G
-
注:搭建的从库不能修改数据
django实现mysql读写分离
1.增加slave数据库的配置
- settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sjk',
'USER':'root',
'PASSWORD':'1',
'HOST':'192.168.56.100',
'PORT':'3306'
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sjk',
'USER':'root',
'PASSWORD':'1',
'HOST':'192.168.56.100',
'PORT':'8306'
}
}
2.创建utils包创建db_router设置
- utils/db_router.py
class MasterSlaveDBRouter(object):
"""数据库读写路由"""
def db_for_read(self, model, **hints):
"""读"""
return "slave"
def db_for_write(self, model, **hints):
"""写"""
return "default"
def allow_relation(self, obj1, obj2, **hints):
"""是否运行关联操作"""
return True
3.将创建的类方法导入进settings.py
-
settings.py
DATABASE_ROUTERS = ['utils.db_router.MasterSlaveDBRouter']
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性