我一直在研究扩展 MySQL 的解决方案。除了添加 Memcached 层之外,经常出现的一个问题是读/写分离——所有写入都发送到主服务器,所有读取都发送到一组负载平衡的从服务器。
这种方法明显出现的一个问题是“最终一致性”。当我在主服务器上运行写入操作时,复制到读取从服务器需要一定的时间。因此,如果我请求新创建的行,它可能不存在。
有谁知道处理这个问题的具体策略?我读过有关“读你所写”能力的概念性部分解决方案。但是,有谁知道如何实现这样的解决方案——无论是概念上的,还是具体在 Spring/Hibernate 堆栈中?
mysql relational-database database-replication amazon-rds horizontal-scaling
有多种方法可以配置 mysql 复制。我知道如何配置复制集群以使用主-主-主动-被动模型或主从模型。
如果我在每个模型中将被动主站和从站配置为“只读”,并且被动主站和从站都可以在故障转移中提升为主动主站,那么我想知道它们之间有什么区别?
大多数nosql解决方案仅使用最终一致性,并且考虑到DynamoDB将数据复制到三个数据中心,如何保持写后读一致性?
解决此类问题的通用方法是什么?我认为这很有趣,因为即使在 MySQL 复制中,数据也是异步复制的。
eventual-consistency database-replication amazon-web-services nosql amazon-dynamodb
根据我对以下问题的理解,这些问题很久以前就被问到了,Redis 没有对主-主复制的内置支持。
截至目前,官方网站似乎没有关于主-主复制的内容。还是这样吗,即Redis还是没有多主复制的选项。甚至第三方工具似乎也没有帮助 Redis 实现同样的目标。我遇到了 Zabcluster 和 Zookeeper,但我不确定这是否能满足我对简单主-主设置的要求,而无需进行太多额外的复杂更改。
我在不同的地理位置(本地站点)有几个 PostgreSQL 数据库。
问题:如何使用 PostgreSQL 复制方法实现这一点?(流媒体/多主 UDR/BDR/等)
限制:本地站点只能进行传出网络连接(即由于防火墙限制不能进行入站连接)
postgresql replication database-replication transactional-replication
我已经设置了一个带有 3 个节点(虚拟机运行 CentOS)的 MongoDB 副本集。一个节点成为主节点,其他 2 个节点卡在启动中。当这 2 个节点将其状态从启动更改为辅助时。
aryabhata:PRIMARY> rs.status()
{
"set" : "aryabhata",
"date" : ISODate("2016-04-30T08:10:45.173Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost.localdomain:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 69091,
"optime" : Timestamp(1461935462, 1),
"optimeDate" : ISODate("2016-04-29T13:11:02Z"),
"electionTime" : Timestamp(1461934754, 1),
"electionDate" : ISODate("2016-04-29T12:59:14Z"),
"configVersion" : 459192,
"self" : true
},
{
"_id" : 1,
"name" : "repset1.com:27017",
"health" : 1,
"state" : 0,
"stateStr" : …Run Code Online (Sandbox Code Playgroud) 有时我们会观察到下一种情况:
w: 1通过mongos写入分片primaryA 副本的路由器向 MongoDB 插入一个带有写入问题的文档。local通过mongos应该从分片primaryA 的副本读取的路由器使用默认读取关注从 MongoDB 读取此文档。findOne返回null。pymongo - find_one(),它返回None)。我们发现:
db.oplog.rs,没有fromMigrate标志。为什么会发生?如何正确处理?
这些误报“未找到”-s 可能会导致错误的原子查找或创建通过$setOnInsert?
sharding database-migration mongodb database-replication pymongo
我们有一个在美国和欧盟托管的应用程序。为了获得出色的性能,我们将在两个位置托管一个数据存储实例。
现在我们的问题是如何将数据从美国数据存储复制到欧盟数据存储?
或者从技术角度来看,我们将数据存储在哪里并不重要?
在微服务架构中,我们通常有两种微服务通信的方式。假设服务 A 需要从服务 B 获取信息。第一个选项是远程调用,通常通过 HTTPS 同步,因此服务 A 查询服务 B 托管的 API。
第二种选择是采用事件驱动架构,其中服务 B 的状态可以以异步方式由服务 A 发布和消费。使用此模型,服务 A 可以使用来自服务 B 的事件的信息更新其自己的数据库,并且所有查询都在此数据库中本地进行。这种方法的优点是可以更好地分离微服务,从开发到运营。但它有一些与数据复制相关的缺点。
第一个是磁盘空间的高消耗,因为相同的数据可以驻留在需要它的微服务的数据库中。但在我看来,第二个最糟糕:如果服务 B 不能按需要快速处理其订阅,或者在服务 B 上创建它的同时它不能用于服务 A,则数据可能会变得陈旧,因为模型的最终一致性。
假设我们使用 Kafka 作为事件中心,其主题配置为使用 7 天的数据保留期。当服务 B 发布其状态时,服务 A 保持同步。两周后,新服务 C 部署完毕,其数据库需要使用服务 B 拥有的所有信息进行充实。由于最旧的事件已经消失,我们只能从 Kafka 主题中获取部分信息。我的问题是我们可以使用哪些模式来实现此微服务的数据库丰富(除了要求服务 B 将其所有当前状态重新发布到事件中心)。
event-driven eventual-consistency database-replication apache-kafka microservices
我们的 rails 应用程序有一个主数据库和一个副本数据库。我们已经定义了一个接受块的方法,并且在块内部时,将对副本进行查询,如下所示:
on_replica do
@my_things = MyModel.where(my_attr: "my value").to_a
end
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下效果很好,但如果您实际上不在块中执行查询,则它不起作用:
on_replica do
@my_things = MyModel.where(my_attr: "my value")
end
# this will run its query against the primary DB
@my_things.to_a
Run Code Online (Sandbox Code Playgroud)
我真的很想能够定义一个范围(或类似范围的东西),以便任何发生在方法链中该点之后的查询都会针对副本发生:
@my_things = MyModel.where(my_attr: "my value").eventually_on_replica
# this runs its query against the replica DB:
@my_things.to_a
Run Code Online (Sandbox Code Playgroud)
是否可以eventually_on_replica使用现有on_replica方法定义一种以这种方式工作的方法?如果MyModel.eventually_on_replica.where(my_attr: "my value")工作也加分。
mongodb ×2
mysql ×2
amazon-rds ×1
apache-kafka ×1
event-driven ×1
nosql ×1
postgresql ×1
pymongo ×1
redis ×1
replicaset ×1
replication ×1
sharding ×1