使用shardedmodel、相关字段、queryset、managers和一个shard-aware数据库路由器开始分片数据库。

django-sharded的Python项目详细描述


Django Sharded添加ShardedModel、相关字段、queryset、managers和 一个支持碎片的数据库路由器,可以快速使用碎片数据库。

你可以从一个碎片开始,然后再添加更多的碎片最多支持255个碎片。

sharded.db.models是替换django.db.models的一种方法,有助于避免导入混乱

目前,这个软件包的设计和测试只适用于postgresql。

快速启动

  1. 添加“分片”作为安装的应用程序的第一个条目

    INSTALLED_APPS = [
        'sharded',
        ...
    ]
    
  2. 运行python manage.py migrate将Shard.Shard添加到默认数据库

  3. [可选]为SHARDED_DB_PREFIX设置一个值默认前缀是shard

    SHARDED_DB_PREFIX = 'shard_'
    
  4. 将sharded.db.routers.ShardedRouter添加到数据库路由器设置:

    DATABASE_ROUTERS = ['sharded.db.routers.ShardedRouter',]
    
  5. 设置所有可用碎片:

    #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))
    
  6. 使用可选参数运行python manage.py initshard<;1..255>;以初始化碎片

  7. 运行python manage.py updateshard<;1..255>;–以字节为单位的容量<;以跟踪碎片中的可用容量

  8. 使用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)
    
  9. 运行python manage.py makemigrations然后,python manage.py migrate–all在所有碎片上应用迁移

  10. 添加要运行的cronjobpython manage.py update shard以定期更新碎片使用级别

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Spring 4升级后未加载java应用程序上下文   java Android 2.3.3 internet可以在我的Galaxy S上运行,但不能在我的Galaxy选项卡上运行?(许可?)   java通过不改变其原始位置对大小写字母进行排序   java Spring Boot一直在破坏我的电脑。。。sts的最佳配置是什么。Windows 10上的ini文件?   css Java Spring+引导问题   java Jackson将GeoJsonPoint序列化为纬度/经度   xml Java Transformer:如何将其结果生成OutputStream?   java如何更改字体、文本大小和设置文本位置?   在JavaSpringHibernate3.6.3中,如何告诉一个方法等待,直到获得锁,以及如何重试失败的事务?   java安卓服务代替线程   Java Swing使用鼠标移动JFrame