分布式系统中的数据同步

san*_*fin 4 rest distributed synchronization

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

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

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

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

phs*_*phs 6

一致性是一个深层次的主题,也是一个很难做到的事情.当同一数据发生两个几乎同时发生的变化时会出现问题:冲突的更新可以在一个服务器上以一个顺序到达,在另一个服务器上以另一个顺序到达.这是一个问题,因为两个服务器不再同意数据是什么,并且不清楚谁是"正确的".

短篇小说:获取您最喜欢的RDBMS(例如,mysql很受欢迎)并让您的应用服务器连接到所谓的三层模型.确保在事务中执行复杂的更新,这将提供可接受的一致性模型.

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

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


com*_*ife 6

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

  1. 在普通的RDBMS上执行CRUD操作。最简单、最一致
  2. 在与快速内存 RDBMS 一样运行的通用 RDBMS 上执行 CRUD 操作。例如 Oracle 的 TimesTen 等
  3. 在分布式缓存或您自己的自制分布式哈希表上执行 CRUD,这可以保证同步,例如 Hazelcast/ehcache 等
  4. 使用像 REDIS/memcached 这样的快速公共状态服务器,并在其上以同步方式执行更新,并在需要时以惰性方式将成功的操作写入数据库。
  5. 分布式 REST 服务器,以便单个实体上的 CRUD 操作仅由单个主服务器执行。完成此操作后,可以使用可靠的消息总线或在底层运行并相当快地同步所有更新的分布式数据库(例如 postgres)将有关更改的详细信息传达给其他人。
  6. 以最终一致性为目标并使用 Cassandra 等分布式数据存储,它可以让您以所需的一致性为目标
  7. 分别使用 Paxos 或 RAFT 等分布式共识算法或类似(推荐)的 Zookeeper 或 etcd 的实现,并在执行 CRUD 操作之前从每个 REST 服务器获取要更改的项目的所有权 - 不过可能会有点慢Cassandra 可能会给你同样的东西。