【发布时间】:2014-12-23 21:23:48
【问题描述】:
我为 Django 的 MySQL 数据库后端设置了主从复制设置。 目前我只为 Master DB 读写,但我的仪表板是查询密集型的。 我正在寻找一个选项,我可以在其中定义如下 数据库
DATABASES = {
'default_slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
对于仪表板、报告和各种其他应用程序,我想做的是:
尝试连接:default_slave:如果可以访问,则使用default_slave,否则使用default
也就是说,如果slave启动了,就从slave数据库自己获取reports,如果没有从master数据库获取reports。
Catch 是,slave 可以启动或关闭,我希望它可以根据可重复性动态选择用于获取报告的数据库。
这可能吗?我可以事先测试连接并继续前进吗?
有了这个,我将在 Master 中写入和 sync_db,如果 slave 启动,则始终从 Slave 读取。
需要raw queries 和orm queries 的一些解决方案/提示
路由器的概念看起来不错,但是备用从机无法访问,我不知道这种可能性。
更新
如何处理多数据库
数据库
DATABASES = {
'default_slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
'linux': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
'linux_slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
'mac': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
'mac_slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
'pc': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
'pc_slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '3306',
},
}
现在,我有 1. 静态数据 2.动态数据
静态数据必须存储在 'default' 中,这将被复制到 'default_slave'
对于动态数据,查询首先需要判断动态数据可能在哪里:在'mac'或'pc'或'linux'中
为了实现这一点,我在“静态表”中添加了一个字段:“query_on”,其中包含 ['mac' or 'linux' or 'pc']
现在,使用查询集,我只是在写
static = Static.objects.get(pk = 1)query_on = static.query_on
dynamic = Dynamic.objects.get(static = static).using(alias=query_on)
这很好,查询路由到它需要执行的数据库,这里我需要判断:
- 如果
<'query_on'>_slave:连接已启动:使用:<'query_on'>_slave或 - 如果
<'query_on'>_slave:连接断开:使用:<'query_on'>
该怎么做呢?
申请的更多详情:
- 有一个数据库:默认(配置和分析数据库):用于维护配置数据和报告分析数据
- 有 20 个数据库(原始数据库):如示例所示:mac、linux、rhel、windows、pc ....(示例名称):用于收集原始数据,而不是用于分析的过程
- 每个数据库都有一个或多个从属数据库,命名约定为:default_slave_0、default_slave_1、default_slave_2 等其他数据库也是如此
现在需要每 5 分钟、30 分钟、1 小时...首先查询分析数据,并且该查询需要发送到特定数据库,因为并非每个数据库都会携带分析所需的特定数据集。
为此,我们需要
- 从(默认或其任何一个从属设备(从属部分是问题))获取配置数据
- 完成配置后,我们可以轻松查看“原始”数据的位置
- 查询原始数据,收集结果并分析 --> 将其存储在“默认”数据库中。
现在所有 30 个(原始)和 1 个默认数据库都需要“同步”,因为我们在所有节点中都保持相同的数据结构。
现在,由于我们正在查看所有数据库的 CPU 峰值,因此使用“从属”数据库来查询“原始”数据是有意义的。
因此需要 using 。我无法想象路由器在这里会有什么帮助?
【问题讨论】:
标签: mysql django python-2.7 multiple-databases