Postgres和Mongodb的双向数据库同步

时间:2016-06-28 19:34:35

标签: mongodb postgresql synchronization data-synchronization database

假设我有一台本地服务器正在运行,而且我已经在亚马逊上运行了一台完全相似的服务器。

两台服务器都可以CRUD数据到其数据库。

Note that the servers use both `postgres` and `mongodb`.

现在当没有人使用wifi时(通常在夜间),我想同步postgresmongodb个数据库,以便从服务器上的每个数据库写入所有数据库本地上的数据库得到了正确应用。

我不想使用Multi-Master,因为:

  1. MongoDB本身不支持这种架构,所以也许我需要一个复杂的替代方案。
  2. 我想控制同步两个数据库的时间和数量。
  3. 当其他人使用互联网时,我不想使用网络带宽。
  4. 所以任何人都可以向我展示正确的方向。

    另外,如果列出一些解决我问题的工具,那将非常有用。 感谢。

1 个答案:

答案 0 :(得分:1)

我们有几个驱动程序可以帮助您完成此过程。我假设有一些软件开发知识,并将展示我们的MongoDB ADO.NET Provider,它使用看起来很熟悉的MongoDBConnectionMongoDBCommandMongoDBDataReader对象。

首先,您需要创建用于连接云MongoDB实例的连接字符串:

string connString = "Auth Database=test;Database=test;Password=test;Port=27117;Server=http://clouddbaddress;User=test;Flatten Objects=false";

您会注意到我们将Flatten Objects属性设置为false,这可以确保文档中包含的任何JSON / BSON对象都将作为原始JSON / BSON返回。

创建连接字符串后,您可以建立连接并从数据库中读取数据。您希望以某种方式存储返回的数据,以便日后使用。

List<string> columns = new List<string>();
List<object> values;
List<List<object>> rows = new List<List<object>>();
using (MongoDBConnection conn = new MongoDBConnection(connString))
{


  //create a WHERE clause that will limit the results to newly added documents
  MongoDBCommand cmd = new MongoDBCommand("SELECT * FROM SomeTable WHERE ...", conn);
  rdr = cmd.ExecuteReader();
  results = 0;

  while (rdr.Read())
  {
    values = new List<object>();
    for (int i = 0; i < rdr.FieldCount; i++)
    {
      if (results == 0)
        columns.Add(rdr.GetName(i));
      values.Add(rdr.GetValue(i));
    }
    rows.Add(values);
    results++;
  }
}

在收集了要复制的每个对象的所有数据后,可以配置与本地MongoDB实例的新连接,并构建查询以插入新文档。

connString = "Auth Database=testSync;Database=testSync;Password=testSync;Port=27117;Server=localhost;User=testSync;Flatten Objects=false";
using (MongoDBConnection conn = new MongoDBConnection(connString)) {
  foreach (var row in rows) {
    //code here to create comma-separated strings for the columns
    //  and values to be inserted in a SQL statement

    String sqlInsert = "INSERT INTO backup_table (" + column_names + ") VALUES (" + column_values + ")";
    MongoDBCommand cmd = new MongoDBCommand(sqlInsert, conn);
    cmd.ExecuteQuery();
}

此时,您将插入所有新文档。然后,您可以根据更新的日期/时间更改过滤器(开头的WHERE子句),并使用UPDATE命令更新本地MongoDB实例中的相应条目。

需要注意的事项:

  • 请确保您正确过滤掉新的/更新的条目。
  • 在SQL查询中输入值时,请确保正确解释变量类型,以便正确用引号括起来(或不用)。

我们有一些可能对您有用的驱动程序。我在上面展示了ADO.NET Provider,但我们还有一个driver for writing apps in Xamarin和一个JDBC driver (for Java)