- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我为 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' 或 'linux' 或 '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'>
该怎么做呢?
申请的更多详情:
现在分析数据需要每 5 分钟、30 分钟、1 小时 .... 进行一次查询,并且该查询需要发送到特定数据库,因为并非每个数据库都会携带分析所需的特定数据集。
为此,我们需要
现在所有 30 个(原始)和 1 个默认数据库都需要“同步”,因为我们在所有节点中都保持相同的数据结构。
现在,由于我们正在查看所有数据库的 CPU 峰值,因此使用“从属”数据库来查询“原始”数据是有意义的。
因此需要 using
.我无法想象路由器在这里会有什么帮助?
最佳答案
您在使用路由器方面走在正确的轨道上。我假设您的两个数据库定义相同只是一个拼写错误。
(仅供引用,我将使用 the more sensitive master->follower 引用数据库层次结构)
在您的 db_for_read() 函数中,您可以检查与您的关注者的连接。这可能会产生更多的开销,但这是对数据库进行自动故障转移的成本。一个示例数据库定义是:
DATABASES = {
'follower': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'follower',
'USER': 'root',
'HOST': '54.34.65.24',
'PORT': '3306',
},
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'HOST': '54.34.65.23',
'PORT': '3306',
},
}
您可以通过快速尝试/异常(exception)来测试连接,例如 this example .使用它来完成您需要的路由器看起来像:
from django.conf import settings
import socket
def test_connection_to_db(database_name):
try:
db_definition = getattr(settings, 'DATABASES')[database_name]
s = socket.create_connection((db_definition['HOST'], db_definition['PORT']), 5)
s.close()
return True
except (AttributeError, socket.timeout) as e:
return False
class FailoverRouter(object):
"""A router that defaults reads to the follower but provides a failover back to the default"""
def db_for_read(self, model, **hints):
if test_connection_to_db('follower'):
return 'follower'
return 'default'
def db_for_write(self, model, **hints):
"Point all writes to the default db"
return 'default'
def allow_syncdb(self, db, model):
"Make sure only the default db allows syncdb"
return db == 'default'
这仍然会像你想要的那样在 master 中同步数据库。此外,您可以使 db_for_read()
和 db_for_write()
的逻辑更复杂(例如仅为为您的报告查询的某些模型选择关注者数据库。
我不知道这个 test_connection()
会导致每次读取的开销是多少,因为这取决于 MySQL 服务器和超时。也许更好的架构是使用 memcached 来缓存这些报告,或者只是解决从服务器出现故障的问题,并首先在设置中更新数据库定义。
关于mysql - 如果 Slave 关闭,Django 多个数据库回退到 Master,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26608906/
我想知道一个服务器是否可以同时是slave和master。我们的问题是我们有很多移动单元需要同步到主服务器,但它们只需要主服务器上 100 个表中的 6 个。除了延迟同步和增加数据成本之外,所有额外的
此站点上的许多帖子(例如 this、this 或 this)讨论了如何检测 Android 上丢失的蓝牙连接。本质上,一个人可以注册 Action 的广播 BluetoothAdapter.ACTIO
我有主从复制,我们有很多记录插入主服务器,以至于从服务器更新速度不够快。我们有 innodb,也许 slave 上的复制是单线程的。我想知道我们是否可以在数据库方面做些什么,而不是在编码或表结构等方面
正如标题所说,“从机启动”和“从机启动”有什么区别?当我接受DBA面试时,他问了这个问题,我搜索了google但没有找到答案,有人知道吗? 最佳答案 没有区别.. Slave start; 已弃用,现
我在设置主从配置时遇到困难。 Master Database 在 Ubuntu(亚马逊 AWS 实例)上运行并成功设置主复制。 我有本地主机作为从属服务器。 (Windows 机器)。 主数据库快照
我的权限被拒绝,但不知道为什么。从我的 Jenkins 大师那里,我能够使用 ssh-rsa-key 运行以下命令 scp /var/cache/jenkins/war/WEB-INF/slave.j
我计划在一台主服务器和几台从服务器上使用 MySQL 设置服务器。我会在其中一个从服务器上定期执行数据 EBS 的一致备份服务器(我总是会先停止数据库,然后在完成后重新启动它)。 从站故障转移 如果其
如果我使用 —expect-slaves 3 运行 headless Locust master,如果我连接 5 个 slave,master 会接受并使用所有连接的 slave 吗? 最佳答案 答案
当在有从属的从属的环境中使用 Redis 的复制功能时,connected_slaves 计数器是否会增加主控、充当主控的从属或两者?引用示例图:https://imgur.com/Ge1WLzX 在
我想配置slave以启用写入(slave-read-only no)。用例是启用临时缓存。 但是,文档中的这段让我担心: Normally slave nodes will redirect clie
我想设置一个 Linux 节点作为 Jenkins 主节点的从属节点。我正在浏览 the tutorial为 Linux 机器设置它。 Have master launch slave agent v
我现有的 jenkins 主从连接断开了。我尝试通过 scp 命令建立连接。 关于主人: scp ~/ .ssh/id_rsa.pub jenkins@:/tmp 在奴隶上: • ssh-keyg
所以我从从属虚拟机列表中删除了 vm4,当我运行以下命令时它不会访问它 hdfs dfsadmin -report 结果是: ubuntu@anmol-vm1-new:~$ hdfs dfsadmin
一.安装环境 这里也顺便记录一下如何在windows7上卸载解压版MySQL5.6数据库,如果无需卸载请忽略下一步,直接看第三步即可 二.windows7卸载解压版MySQL5.6 1.使
我已按照有关如何设置 Redis 主服务器集群的说明进行操作,但完成后我无法看到为什么服务器无法相互看到。这是我组装的第二个版本,我被困在同一个地方。我真的可以使用一些以前从未在 REDIS 上工作过
我有一个本地 Jenkins 服务器,我已经设置并为其创建了作业。我正在尝试注册新的 slave/build 机器,但 Jenkins 拒绝提供 slave.jar 或 slave-agent.jnl
我正在尝试在大型 redis 队列中使用哨兵进行故障转移(12 个哨兵,500 多个分片,每个分片一个主站和一个从站)。我遇到了一个非常奇怪的问题,我的哨兵反复向某些 redis 节点发出命令 +fi
我如何配置jenkins master slavemaster在linux上,slave在windows上我需要通过master在slave上执行一个文件我对 Jenkins 不太了解,所以我需要完整
如何将系统配置为有一个主多从,用 gmake 构建普通的 c 代码?从站如何从主站访问工作区?我想 NFS 共享是可行的,但如果这是不可能的任何 其他 选项? http://wiki.hudson-c
有没有人尝试过使用 Jenkins Rest/API 或任何其他方式在 Jenkins slave 的配置中添加或更新环境变量的方法。 使用 Jenkins Swarm 插件,我创建了一个从站(它使用
我是一名优秀的程序员,十分优秀!