Django主从数据库分离配置
数据库主从配置,django
发表时间:2020-08-25
对网站的数据库作读写分离(Read/Write Splitting)可以提高性能,在Django中对此提供了支持,下面我们来简单看一下。注意,还需要运维人员作数据库的读写分离和数据同步 -DBA。
配置数据库
我们知道在Django项目的settings中,可以配置数据库,除了默认的数据库,我在下面又加了一个db2。因为是演示,我这里用的是MySQL 。
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'AAAA','HOST': 'XXXXX','PORT': 3306,'USER': 'root','PASSWORD': '1qaz!QAZ','CHARSET': 'utf8','TIME_ZONE': 'Asia/Shanghai',},'slave1': {'ENGINE': 'django.db.backends.mysql','NAME': 'AAAA_slave1','HOST': 'XXXXX','PORT': 3306,'USER': 'root','PASSWORD': '1qaz!QAZ','CHARSET': 'utf8','TIME_ZONE': 'Asia/Shanghai',},}# 数据库路由配置
DATABASE_ROUTERS = [# 'common.db_routers.MultiDbRouter', # 多数据库配置'common.db_routers.MasterSlaveRouter', # 主从数据库路由配置
]
迁移文件
其实第二步迁移默认有参数python manage.py migrate --database default ,在默认数据库上创建表。因此完成以上迁移后,执行python manage.py --database slave1,再迁移一次,就可以在slave1上创建相同的表。
读写分离
手动读写分离
在使用ORM 调用数据库时,通过.using(db_name)来手动指定要使用的数据库
自动读写分离
通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个:def db_for_read()决定读操作的数据库,def db_for_write()决定写操作的数据库。
定义Router类
新建db_route.py脚本,定义Router类:
import random# class MultiDbRouter:
# """多数据库路由"""
#
# @staticmethod
# def db_for_read(model, **hints):
# if model._meta.app_label == 'ar_map':
# return 'slave1'
# return 'default'
#
# @staticmethod
# def db_for_write(model, **hints):
# if model._meta.app_label == 'ar_map':
# return 'slave1'
# return 'default'
#
# @staticmethod
# def allow_relation(obj1, obj2, **hints):
# return None
#
# @staticmethod
# def allow_migrate(db, app_label, model_name=None, **hints):
# return Trueclass MasterSlaveRouter:"""主从复制路由"""@staticmethoddef db_for_read(model, **hints):'''指定xxx_app 读数据时,使用指定setting配置的数据库xxx'''if model._meta.app_label == 'xxx_app':return 'xxx'return random.choice(('slave1', ))@staticmethoddef db_for_write(model, **hints):'''指定xxx_app 写的时候,使用指定setting配置的数据库xxx'''if model._meta.app_label == 'xxx_app':return 'xxx'return 'default'@staticmethoddef allow_relation(obj1, obj2, **hints):return None@staticmethoddef allow_migrate(db, app_label, model_name=None, **hints):''' python manage.py migrate --database=slave1django默认迁移 default 数据库'''return True
'''
稍微追溯一下源码, 当需要一个db时, 拿数据库的manager举例, 会通过django.db的router去获取而router就是django.db.utils中定义的一个类, 它使用了setttings.py中DATABASE_ROUTERS配置. /home/liwuang/.pyenv/versions/3.6.5/lib/python3.6/site-packages/django/db/utils.py
'''
配置Router
settings.py中已经指定DATABASE_ROUTERS
DATABASE_ROUTERS = [# 'common.db_routers.MultiDbRouter', # 多数据库配置'common.db_routers.MasterSlaveRouter', # 主从数据库路由配置
]
可以指定多个数据库路由,比如对于读操作,Django将会循环所有路由中的db_for_read()方法,直到其中一个有返回值,然后使用这个数据库进行当前操作。
一主多从方案
网站的读的性能通常更重要,因此,可以多配置几个数据库,并在读取时,随机选取,比如:
class Router:def db_for_read(self, model, **hints):"""读取时随机选择一个数据库"""import randomreturn random.choice(['db2', 'db3', 'db4'])def db_for_write(self, model, **hints):"""写入时选择主库"""return 'default'
分库分表
在大型web项目中,常常会创建多个app来处理不同的业务,如果希望实现app之间的数据库分离,比如app01走数据库db1,app02走数据库
class Router:def db_for_read(self, model, **hints):if model._meta.app_label == 'app01':return 'db1'if model._meta.app_label == 'app02':return 'db2'def db_for_write(self, model, **hints):if model._meta.app_label == 'app01':return 'db1'if model._meta.app_label == 'app02':return 'db2'
参考地址:https://www.pythonf.cn/read/140551
Django主从数据库分离配置相关推荐
- 《Netkiller Spring Cloud 手札》之 Master / Slave 主从数据库数据源配置
2019独角兽企业重金招聘Python工程师标准>>> Netkiller Spring Cloud 手札 Spring Cloud Cookbook Mr. Neo Chan, 陈 ...
- mysql配置主从数据库_mysql配置主从数据库
1.目的 1.1 实现数据备份 1.2 项目访问时可以实现读写分离,提高访问和操作数据的速度 2.背景 这次的主从配置主要实现主库数据的改变可以实现同步到从库中: 此次试验的主库为liunx 下mys ...
- 主从数据库的配置以及主从数据库的同步(MySQL)
一.为什么要用主从数据库? 1.使用主从数据库主要是为了读写分离,在数据库集群架构中,让主库负责处理事务性查询,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能.当然,主数据 ...
- 主从数据库的配置流程
1.主从数据库原理 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE), 而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同 ...
- sql2005主从数据库同步配置
网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库.主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的 ...
- MyCat分布式数据库集群架构工作笔记0011---高可用_主从读写分离配置
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上一节咱们配置好了主从复制,确认主从复制,要在从机上执行命令, 显示slave_io_runnin ...
- Redis主从读写分离配置
环境描述: 主redis:192.168.10.1 6379 从redis:192.168.10.2 6380 一.主从配置 1.将主从redis配置文件redis.conf中的aemonize no ...
- .net 同步mysql_MySQL服务器主从数据库同步配置
首先需要在同一个局域网内的两台机器(当然也可以用一台机器虚拟两台机器出来),都安装上mysql服务. 主机A: 192.168.1.100 从机B: 192.168.1.101 可以有多台从机. 1. ...
- ubuntu mysql主从配置_MYSQL 主从数据库的配置 ubuntu 12.04
环境: 主服务器:centos 5.2 mysql 5.1.35 IP:192.168.1.22 从服务器:centos 5.2 mysql 5.1.35 IP:192.168.1.33 配置: ...
最新文章
- 人群计数--Mixture of Counting CNNs
- Deepin 解决google chrome卡顿的问题
- android sdk版本控制,1. 统一SDK版本管理配置
- Native SBS for Android
- 1.2.2 时间复杂度
- zabbix监控suse linux,SuSE 系统之部署 Zabbix 监控服务
- 第六十六期:运维专家写给运维工程师的6条人生忠告
- idea修改代码后不重启项目_使用DevTool实现SpringBoot项目热部署
- Android异常总结---Test run failed:Unable to find instrumentation target package
- cl.exe is unable to create an executable file
- country-converter官方文档----机翻人工确认
- 八个机器学习非常重要的应用领域,每个领域都影响着我们的生活
- c++中引用作为函数参数
- 台式计算机音频插口,解决台式机电脑机箱前置音频插口(接口)不能使用一例.
- 计算机 存储体 存储单元 存储元 存储字 存储字长的联系
- php获取用户和服务器ip及其地理位置详解
- fetch请求cookie设置
- MATLAB中用李沙育图形分析光栅尺sincos信号正交性
- 如何启动一个vue项目
- Dicom 文件 转成 JPG 格式(批量处理)
热门文章
- 行内元素 块级元素之间的嵌套
- 跟我学ASP.NET MVC之五:SportsStrore开始
- express中的错误处理
- EV: repl.it - A Wonderful JavaScript Console
- 寄宿于CS程序的WCF服务
- SDUT 1291数据结构上机测试4.1:二叉树的遍历与应用1
- java打包拆包_关于java中JDK5的打包,拆包以及==和equals的问题
- 数字化转型方法论_50+企业数字化转型、管理的方法论,这本书到底有什么干货?...
- python音频特征提取_使用Python对音频进行特征提取
- 如何判断模糊图像_深圳企业宣传片拍摄制作教你如何使用手动聚焦