数据库主从配置,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主从数据库分离配置相关推荐

  1. 《Netkiller Spring Cloud 手札》之 Master / Slave 主从数据库数据源配置

    2019独角兽企业重金招聘Python工程师标准>>> Netkiller Spring Cloud 手札 Spring Cloud Cookbook Mr. Neo Chan, 陈 ...

  2. mysql配置主从数据库_mysql配置主从数据库

    1.目的 1.1 实现数据备份 1.2 项目访问时可以实现读写分离,提高访问和操作数据的速度 2.背景 这次的主从配置主要实现主库数据的改变可以实现同步到从库中: 此次试验的主库为liunx 下mys ...

  3. 主从数据库的配置以及主从数据库的同步(MySQL)

    一.为什么要用主从数据库? 1.使用主从数据库主要是为了读写分离,在数据库集群架构中,让主库负责处理事务性查询,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能.当然,主数据 ...

  4. 主从数据库的配置流程

    1.主从数据库原理 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE), 而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同 ...

  5. sql2005主从数据库同步配置

    网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库.主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的 ...

  6. MyCat分布式数据库集群架构工作笔记0011---高可用_主从读写分离配置

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上一节咱们配置好了主从复制,确认主从复制,要在从机上执行命令, 显示slave_io_runnin ...

  7. Redis主从读写分离配置

    环境描述: 主redis:192.168.10.1 6379 从redis:192.168.10.2 6380 一.主从配置 1.将主从redis配置文件redis.conf中的aemonize no ...

  8. .net 同步mysql_MySQL服务器主从数据库同步配置

    首先需要在同一个局域网内的两台机器(当然也可以用一台机器虚拟两台机器出来),都安装上mysql服务. 主机A: 192.168.1.100 从机B: 192.168.1.101 可以有多台从机. 1. ...

  9. 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 配置: ...

最新文章

  1. 人群计数--Mixture of Counting CNNs
  2. Deepin 解决google chrome卡顿的问题
  3. android sdk版本控制,1. 统一SDK版本管理配置
  4. Native SBS for Android
  5. 1.2.2 时间复杂度
  6. zabbix监控suse linux,SuSE 系统之部署 Zabbix 监控服务
  7. 第六十六期:运维专家写给运维工程师的6条人生忠告
  8. idea修改代码后不重启项目_使用DevTool实现SpringBoot项目热部署
  9. Android异常总结---Test run failed:Unable to find instrumentation target package
  10. cl.exe is unable to create an executable file
  11. country-converter官方文档----机翻人工确认
  12. 八个机器学习非常重要的应用领域,每个领域都影响着我们的生活
  13. c++中引用作为函数参数
  14. 台式计算机音频插口,解决台式机电脑机箱前置音频插口(接口)不能使用一例.
  15. 计算机 存储体 存储单元 存储元 存储字 存储字长的联系
  16. php获取用户和服务器ip及其地理位置详解
  17. fetch请求cookie设置
  18. MATLAB中用李沙育图形分析光栅尺sincos信号正交性
  19. 如何启动一个vue项目
  20. Dicom 文件 转成 JPG 格式(批量处理)

热门文章

  1. 行内元素 块级元素之间的嵌套
  2. 跟我学ASP.NET MVC之五:SportsStrore开始
  3. express中的错误处理
  4. EV: repl.it - A Wonderful JavaScript Console
  5. 寄宿于CS程序的WCF服务
  6. SDUT 1291数据结构上机测试4.1:二叉树的遍历与应用1
  7. java打包拆包_关于java中JDK5的打包,拆包以及==和equals的问题
  8. 数字化转型方法论_50+企业数字化转型、管理的方法论,这本书到底有什么干货?...
  9. python音频特征提取_使用Python对音频进行特征提取
  10. 如何判断模糊图像_深圳企业宣传片拍摄制作教你如何使用手动聚焦