跳转到主要内容

为您的Django数据库提供软件负载均衡器。

项目描述

https://travis-ci.org/btimby/django-proxysql.png https://coveralls.io/repos/github/btimby/django-proxysql/badge.svg?branch=master https://badge.fury.io/py/django-proxysql.svg

django-proxysql

什么?

这是一个为您的Django数据库提供的软件负载均衡器。此项目提供了一种Django数据库引擎,它可以管理多个对等数据库连接,并将查询均匀地分配给每个连接。它还会记录对等连接失败的情况,直到该连接恢复,不再向其发送查询。

该项目是为MySQL、Galera和ProxySQL开发的。但是,它可以与任何与Django兼容的数据库引擎一起使用。最可能需要调整连接错误检测(因为使用MySQLdb.Error来检测失败)。

django-proxysql 可以在没有ProxySQL的情况下使用(例如,您的对等节点可以是Galera集群节点),也可以与MaxScale等不同的负载均衡器一起使用。您还可以将其与multidb结合使用,其中您的Django路由器在多个数据库对等体池之间路由。

为什么?

Django的多数据库支持是在高层次实现的。因此,它不知道连接失败。它会继续将查询路由到下线主机,从而导致错误。

有人建议在multidb路由器中添加活动检查,但这会增加不必要的开销。django-proxysql 也会路由查询,但在数据库引擎级别,这使它能够识别连接失败并相应地路由查询。

django-proxysql 假定您正在使用一组所有对等MySQL、ProxySQL或MaxScale服务器,它们都是完全等效的。它不会智能路由查询,这留给了下游对等节点。

如何?

首先安装 django-proxysql,例如

pip install django-proxysql

然后,在 Django 设置中将您的 MySQL 同伴配置为附加数据库。将您的 default django 数据库设置为使用此引擎并指定同伴。您还可以指定可选的 CHECK_INTERVAL,它控制下线同伴被重新检查的频率(默认为 30 秒)。

DATABASES = {
    'default': {
        'ENGINE': 'django_proxysql.backends.proxysql',
        'PEERS': ['peer0', 'peer1'],
        'CHECK_INTERVAL': 30,
    },
    'peer0': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'peer0',
        'PORT': 6033,
    },
    'peer1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'peer1',
        'PORT': 6033,
    },
}

现在,当您在 Django 中使用默认数据库时,连接将随机分配到同伴。

如果您不需要像 ProxySQL 或 MaxScale 这样的专用负载均衡器,您可以将您的 Galera 集群节点配置为同伴。

DATABASES = {
    'default': {
        'ENGINE': 'django_proxysql.backends.proxysql',
        'PEERS': ['galera0', 'galera1'],
    },
    'peer0': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'galera0',
        'PORT': 6033,
    },
    'peer1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'galera1',
        'PORT': 6033,
    },
}

您可以为多个 django-proxysql 后端进行配置,然后使用 Django multidb 在这些之间进行路由。

DATABASES = {
    'default': {
        'ENGINE': 'django_proxysql.backends.proxysql',
        'PEERS': ['peer0', 'peer1'],
    },
    'users': {
        'ENGINE': 'django_proxysql.backends.proxysql',
        'PEERS': ['peer2', 'peer3'],
    },
    'peer0': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'peer0',
        'PORT': 6033,
    },
    'peer1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'peer1',
        'PORT': 6033,
    },
    'peer2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'peer2',
        'PORT': 6033,
    },
    'peer3': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'peer3',
        'PORT': 6033,
    },
}

还有其他什么吗?

因为只有连接错误由引擎处理,其他错误,如断开连接,将导致您的应用程序失败。因此,如果您正在执行滚动升级,您必须优雅地排空每个同伴。例如,使用 ProxySQL,您可以在管理界面(端口 6032)中发出 PROXYSQL PAUSE 命令。这将导致 ProxySQL 停止接受新的连接,而 django-proxysql 将检测并处理,而不会出现任何错误。

请注意,当应用迁移时,Django 会检查所有配置的数据库。这一点需要重复。所有数据库同伴必须在线才能执行数据库迁移。

兼容性

Python

2.7

3.5

3.6

3.7

Django

1.10

O

O

O

O

1.11

O

O

O

O

2.0

O

O

O

2.1

O

O

O

2.2

O

O

O

项目详情


下载文件

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

源分发

django-proxysql-0.8.tar.gz (9.4 kB 查看哈希)

上传时间

支持者: