Django的多数据库的处理(垂直分库和水平分库)
来源:互联网 发布:8080端口是什么 编辑:程序博客网 时间:2024/06/10 19:55
垂直分库指的是根据应用来分数据库,比如博客一个数据库,论坛一个数据库。水平分库是指,根据某些规则,将数据分布在不同的库上。比如根据用户ID把用户的博客文章分布在5个数据库上。
垂直分库,可以参考如下的文档。
Easy Multi-Database Support for Django
这篇文章的主要思路是,继承Manager创建一个MultiDBManager,在建立Model的时候用MultiDBManager替换默认的Manager,在MultiDBManager构造时指定数据库。
核心的设计思路是,在外部设置settings的数据库连接的值,在db内部使用。代码如下,将settings的字典中的链接值设置到settings上。然后再调用数据库连接。
这样作其实是很费劲的,因为django在设计之初就没有考虑到multi-db的问题,connection都是直接读取的setting的配置。
水平分库,可以参考如下的讨论链接,但是这家伙只是给出了思路。
Proposal: user-friendly API for multi-database support
因为我的代码很乱(夹杂其他功能),所以我也只给出思路和部分代码。假设一个应用场景如下:用户的某些消息(msg),根据用户的ID(数字)分布在2个数据库中,则用户ID对2求余就可以了。
1.setting.py
2.模拟一个settings.py出来,还有别的办法,我用的笨办法。
3.修改django安装文件下的django/db/backends/__init__.py文件,改完要重新安装。如果你直接修改/usr/lib/python2.5/site-packages/django/下的,则不需要。
4.好了,一个可以传入链接参数的connection就做好了。和第一个参考链接里面的差不多,还是有点差异。处理数据库连接,有两个地方一个是QuerySet一个是insert
5.models的定义,也需要额外的处理,一般情况下的调用如:userMsg.objects.filter()/get()之类的,如果是水平分库,则需要指定连接到哪个数据库。因此,我定义了一个objects(seg)的方法,可以传入数据编号。同时,保存的时候,一般是这样的:usermsg.save(),如果要分库,则改为usermsg.save(seg)就可以了。
6.views中的使用,和django的使用没有太大区别,就上面的两个方法的差异。
经一步的思考:
1.数据库事务的处理。在多数据库的情况下,针对不同的数据库,是无法使用事务的。因此,在架构上需要考虑异常和补偿性的事务。在同一个数据库上事务的处理,需要改写transication.py,或者获取当前connection,再进行事务的处理。
2.扩容的问题。增加数据库后,会导致数据重新分布,那么就涉及到数据迁移的问题,一个办法是分布规则,考虑到扩容的问题,新的规则兼容老的规则,旧有的数据不会变化。另外一种就是,可以平滑的在库之间移动数据。这两个都是很麻烦的问题。
==========================================================
ID规则,请看我的另外一篇帖子
数据库水平分布的ID规则问题
- Django的多数据库的处理(垂直分库和水平分库)
- 数据库的垂直分库和水平分库
- 数据库读写分离和垂直分库、水平分表
- 数据库读写分离和垂直分库、水平分表
- 数据库读写分离和垂直分库、水平分表
- mysql水平分表和垂直分表的优缺点
- mysql水平分表和垂直分表的优缺点
- mysql的水平分表和垂直分表
- 数据库读写分离与垂直分库水平分表
- django - 多数据库及分库实现
- 水平分表 和 垂直分表
- 水平分表和垂直分表
- 水平分库
- 数据库水平切分的实现原理解析(分库,分表,主从,集群,负载均衡器)
- 数据库垂直分库(vertical sharding)的粒度
- 数据库水平分库的一些个人理解
- 数据库水平切分的实现原理解析-分库,分表,主从,集群,负载均衡器
- 数据库水平切分的实现原理解析-分库,分表,主从,集群,负载均衡器
- 优秀程序员的十个习惯
- 自动编号
- 续c#多语言第二界面
- How to add a new "CustomAction" in ECB for a specific list
- DHC log 2009-4-3
- Django的多数据库的处理(垂直分库和水平分库)
- ◆ C++中通过溢出覆盖虚函数指针列表执行代码
- Head First C# 中文版 图文皆译 第七章 接口和抽象类 page303
- Apache
- 努力了一天把团队的SVN环境搭建起来,并对相应使用的功能做一下测试
- Dev tdxDBTreeView
- 把“女友”升级为“妻子”时发生的bug……
- 堆和栈的区别
- 如何通过互联网联接到某个连上互联网的局域网中的一台计算机上的MSSQL上