跳转到主要内容

Django的轮询多数据库路由器。

项目描述

django-multidb-router

Build Status https://img.shields.io/pypi/v/django-multidb-router.svg

multidb提供了两个Django数据库路由器,在主从数据库部署中非常有用。

ReplicaRouter

使用multidb.ReplicaRouter,所有读取查询将发送到从数据库;所有插入、更新和删除将发送到默认数据库。

首先,在您的设置中定义REPLICA_DATABASES。它应该是一个可以在DATABASES中找到的数据库名称列表。

DATABASES = {
    'default': {...},
    'shadow-1': {...},
    'shadow-2': {...},
}
REPLICA_DATABASES = ['shadow-1', 'shadow-2']

然后,将multidb.ReplicaRouter放入DATABASE_ROUTERS中。

DATABASE_ROUTERS = ('multidb.ReplicaRouter',)

副本数据库将按轮询方式选择。

如果您想在应用程序中获取到副本的连接,请使用multidb.get_replica

from django.db import connections
import multidb

connection = connections[multidb.get_replica()]

固定副本路由器

在某些应用程序中,主数据库接收写入到副本复制之间的延迟足以导致最终用户的不一致性。例如,想象一个1秒复制延迟的场景。如果用户在500毫秒后发布论坛帖子(到主数据库)并被重定向到完全渲染的视图(从副本),则视图将失败。如果这是您应用程序中的问题,请考虑使用multidb.PinningReplicaRouter。此路由器与multidb.middleware.PinningRouterMiddleware结合使用,以确保在写入default数据库后,来自同一用户代理的后续读取将在可配置的时间长度内指向default数据库。

注意事项

PinningRouterMiddleware主要根据请求类型识别数据库写入,假设不是GETTRACEHEADOPTIONS的HTTP方法都是写入。您可以使用multidb.db_write装饰器来指示任何视图写入数据库。这将导致与请求为POST等相同的结果。

您还可以手动设置response._db_write = True以指示发生了写入。这将不会导致在此请求中使用default数据库,但只会在下一个请求中。

配置

要使用PinningReplicaRouter,将其放入您的设置中的DATABASE_ROUTERS

DATABASE_ROUTERS = ('multidb.PinningReplicaRouter',)

然后,安装中间件。它必须排在任何其他执行数据库写入的中间件之前。

MIDDLEWARE_CLASSES = (
    'multidb.middleware.PinningRouterMiddleware',
    ...more middleware here...
)

PinningRouterMiddleware将一个cookie附加到刚刚写入的任何用户代理。cookie应该设置为在复制延迟时间之后过期。默认情况下,其值为保守的15秒,但可以调整如下

MULTIDB_PINNING_SECONDS = 5

如果您需要更改cookie的名称,请使用MULTIDB_PINNING_COOKIE设置。

MULTIDB_PINNING_COOKIE = 'multidb_pin_writes'

您还可以通过使用以下设置来设置cookie的“Secure”、“HttpOnly”和“SameSite”属性。这些设置基于Django对会话和CSRFcookie的设置。

MULTIDB_PINNING_COOKIE_SECURE = False
MULTIDB_PINNING_COOKIE_HTTPONLY = False
MULTIDB_PINNING_COOKIE_SAMESITE = 'Lax'

注意:“SameSite”属性仅在django 2.1及以上版本中可用

use_primary_db

multidb.pinning.use_primary_db是用于包装代码以使用主数据库的上下文管理器和装饰器。您可以使用它作为上下文管理器

from multidb.pinning import use_primary_db

with use_primary_db:
    touch_the_database()
touch_another_database()

或作为装饰器

from multidb.pinning import use_primary_db

@use_primary_db
def func(*args, **kw):
    """Touches the primary database."""

运行测试

要运行测试,您需要安装开发依赖项

pip install -r requirements.txt
./run.sh test

或者,您可以使用tox在Django和Python的几个版本上运行测试

$ pip install tox

$ tox

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django-multidb-router-0.10.tar.gz (9.1 kB 查看哈希值)

上传时间

构建分发

django_multidb_router-0.10-py3-none-any.whl (10.4 kB 查看哈希值)

上传时间 Python 3

由以下机构支持