为您的Django数据库提供软件负载均衡器。
项目描述
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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7506c994044402685d677c49b5d70f3e4a1e1665972da9a41387cf2d65c06769 |
|
MD5 | fa403c1f422c524b5a406a9c41ccd44b |
|
BLAKE2b-256 | c2be2fa6fad2575e56e16af4e91d6e4b0eb03ee196616b9c015d05f29ecff2cb |