使用shardedmodel、相关字段、queryset、managers和一个shard-aware数据库路由器开始分片数据库。
django-sharded的Python项目详细描述
Django Sharded添加ShardedModel、相关字段、queryset、managers和 一个支持碎片的数据库路由器,可以快速使用碎片数据库。
你可以从一个碎片开始,然后再添加更多的碎片最多支持255个碎片。
sharded.db.models是替换django.db.models的一种方法,有助于避免导入混乱
目前,这个软件包的设计和测试只适用于postgresql。
快速启动
添加“分片”作为安装的应用程序的第一个条目
INSTALLED_APPS = [ 'sharded', ... ]
运行python manage.py migrate将Shard.Shard添加到默认数据库
[可选]为SHARDED_DB_PREFIX设置一个值默认前缀是shard
SHARDED_DB_PREFIX = 'shard_'
将sharded.db.routers.ShardedRouter添加到数据库路由器设置:
DATABASE_ROUTERS = ['sharded.db.routers.ShardedRouter',]
设置所有可用碎片:
#NOTE: Django Sharded accesses each shard using the name format '%s%03d' % (SHARDED_DB_PREFIX, n) DATABASES['shard_001'] = { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'shard', 'USER': 'prjdbuser', 'PASSWORD': 'supersecretpassword', 'HOST': 'host.for.shard-001.com', 'PORT': '5432', } DATABASES['shard_002'] = { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'shard_002', 'USER': 'prjdbuser', 'PASSWORD': 'supersecretpassword', 'HOST': 'host.for.shard-002.com', 'PORT': '5432', } DATABASES['shard_003'] = { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'shard_003', 'USER': 'prjdbuser', 'PASSWORD': 'supersecretpassword', 'HOST': 'host.for.shard-002.com', 'PORT': '5432', } DATABASES['shard_004'] = { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'shard', 'USER': 'prjdbuser', 'PASSWORD': 'supersecretpassword', 'HOST': 'host.for.shard-004.com', 'PORT': '5432', } #NOTE: If you use 'dj-database-url' or 'django-connection-url' (shameless self-plug), # you can simplify the above using env vars like DATABASE_SHARD_nnn_URL import connection_url for shard in xrange(1,256): shard = '%s%03d' % ('shard_', shard) #TODO: Use SHARDED_DB_PREFIX if you've customized it above shard_env = 'DATABASE_' + shard.upper() + '_URL' if shard_env not in os.environ: break DATABASES.setdefault(shard, connection_url.config(shard_env))
使用可选参数运行python manage.py initshard<;1..255>;以初始化碎片
运行python manage.py updateshard<;1..255>;–以字节为单位的容量<;以跟踪碎片中的可用容量
使用shardedmodel作为需要分片的模型的基础。相关模型将自动包含在同一个shard中,ForeignKey字段也将自动使用一个大整数列:
from sharded.db import models from sharded.models import Shard class HelloManager(models.ShardedManager): use_for_related_fields = True def create(self, **kwargs): if not self._db: self._db = str(Shard.objects.most_free_shard()) return super(HelloManager, self).create(**kwargs) class Hello(models.ShardedModel): a_random_field = models.IntegerField() objects = HelloManager() class Foo(models.Model): hello = models.ForeignKey(Hello) class Bar(models.Model): hello = models.OneToOneField(Hello) class Baz(models.ShardedModel): hello = models.ForeignKey(Hello) class Herp(models.Model): #Unsharded model derp = models.CharField(max_length=8)
运行python manage.py makemigrations然后,python manage.py migrate–all在所有碎片上应用迁移
添加要运行的cronjobpython manage.py update shard以定期更新碎片使用级别