分布式系统中的数据同步

时间:2011-09-08 03:54:04

标签: rest synchronization distributed

我们在Restlet框架上构建了一个基于REST的应用程序,它支持CRUD操作。它使用本地文件来存储数据。

现在要求将此应用程序部署在多个VM上,并且一个VM中的任何更新操作都需要传播在其他VM上运行的其他应用程序实例。

我们解决这个问题的想法是在给定VM中发生更新操作时发送多个POST消息(对所有其他应用程序)。 这里假设每个应用程序都有一个所有其他应用程序的列表/ URL。

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:5)

Consistency是一个很深层次的主题,还有一个hard thing to get right。当同一数据发生两个几乎同时发生的变化时会出现问题:冲突的更新可以在一个服务器上以一个顺序到达,在另一个服务器上以另一个顺序到达。这是一个问题,因为两个服务器不再同意数据是什么,并且不清楚谁是“正确的”。

短篇小说:获取您最喜欢的RDBMS(例如,mysql很受欢迎)并让您的应用服务器连接到所谓的three-tier model。请务必在transactions中执行复杂的更新,这将提供可接受的一致性模型。

长篇大论:三层模型适用于中小型网站/服务。您最终会发现单个数据库成为瓶颈。对于读取流量远大于写入流量的服务,常见的优化是创建单主机,多从机数据库复制安排,其中所有写入都发送到单主机(与非分布式事务一致所需),但更常见的读取可以发送到任何读取从属。

对于具有均匀混合的读/写流量的服务,可以通过删除正式SQL提供的一些便利(以及附带的限制)来改善服务,而是使用最近的各种“nosql”数据存储之一出现了。他们对各种问题的相对优点和适应性本身就是一个深刻的话题。

答案 1 :(得分:1)

我现在可以看到7个主要选项。您应该了解更多详细信息,并确定设施/权衡是否适合您的目的

  1. 在公共RDBMS上执行CRUD操作。最简单,最一致的
  2. 在作为快速内存RDBMS运行的公共RDBMS上执行CRUD操作。例如来自Oracle等的TimesTen
  3. 在分布式缓存或您自己的家庭分布式哈希表上执行CRUD,这可以保证同步,例如Hazelcast / ehcache和其他人
  4. 使用REDIS / memcached等快速通用状态服务器并执行更新 以同步方式对其进行处理,并在需要时以懒惰方式将成功操作写出到DB。
  5. 分发您的REST服务器,以便单个实体上的CRUD操作仅由单个主服务器执行。完成此操作后,可以使用可靠的消息总线或在下面运行的分布式数据库(例如postgres)将有关更改的详细信息传达给其他人,并快速同步所有更新。
  6. 定位最终一致性并使用像Cassandra这样的分布式数据存储,它允许您target the consistency you require
  7. 分别使用Paxos或RAFT等分布式共识算法或者像zookeeper或etcd一样的(推荐)实现,并在执行CRUD操作之前获取要从每个REST服务器更改的项目的所有权 - 可能有点虽然速度很慢,但Cassandra可能会给你同样的东西。