如何在部署期间保持数据同步?

Posted

技术标签:

【中文标题】如何在部署期间保持数据同步?【英文标题】:How can I keep data in sync during deployment? 【发布时间】:2010-09-24 04:20:48 【问题描述】:

我有机会使用开发、登台和生产环境制作 Drupal 网站。使用 subversion 使代码在站点之间保持同步是一项简单的任务。不那么简单的是在安装之间传播对数据库数据(不仅仅是模式)的更改。

任何 Drupal 开发人员都会熟悉这样做的原因。 Drupal 将某些配置设置存储在数据库中,特别是与 CCK 字段、视图和其他允许使用管理界面进行动态设置的模块相关。仅同步架构是不够的 - 数据中还包含基本信息。

我正在寻找一种同步这些数据库更改的方法,这样如果开发人员在临时服务器上进行 CCK 字段更改,它们可以传播到本地开发环境以进行更多工作,并最终传播到生产环境环境。

有没有工具可以做到这一点?您在这样的项目中处理单个或多个开发人员的流程是什么?

【问题讨论】:

见previous answers to this question Drupal Source Control Strategy?的可能重复 【参考方案1】:

对于基本数据同步:我每晚使用 mysqldump 将所有数据转储到 .sql 文件。然后该脚本将其签入版本控制系统。这是在一个简单的 bash 脚本中完成的,但您几乎可以在任何平台上执行类似的操作...

我刚刚阅读了一些内容,但我不确定我的方法是否会有所帮助。我从来不需要合并 SQL 转储,因此无法评论它的管理效率。

虽然您应该能够将更改(架构、新数据)推送到登台/生产服务器,但将更改拉回开发服务器可能会更麻烦。正如我所说 - 合并可能会也可能不会。我只是不知道。

【讨论】:

您是否在 Drupal 安装中实际使用过 mysqldump 进行 dev->staging->production?它真的很努力地在数据库中将内容和配置混合在一起,使得以这种方式使用数据库转储几乎是不可能的......如果你已经在 Drupal 上管理过这个,那么我会对你是如何做到的感兴趣: )【参考方案2】:

在这里,我们几乎将 CCK 降级为用于原型和 v.simple 节点类型。尝试将数据库中的“配置”与“内容”分开是不值得的。您可以通过各种方式尝试保持同步,但简而言之,除非它在文件中或提供导出到文件的选项,否则您会受到伤害。 (作为额外的好处,将视图导出到文件会比每次使用时将其从数据库中拉出要快一些。)

您提到了 Dev、Staging 和 Live 服务器 - 如果您有开发人员在 Staging 中进行未记录的更改,那么您就完蛋了。如果您定期将 Staging 与 Live 同步并强制执行(常识)策略,即对 Staging 所做的唯一更改是在 Dev 中已经解决并且在迁移到 Live 之前正在测试的事情,那么您可能会取得更大的成功。

【讨论】:

【参考方案3】:

我试图在另一个问题中回答我是如何做到这一点的。我也贴在这里

我认为这里的一个好策略是使用安装配置文件 API。使用安装配置文件 API,您可以做大多数使用 Drupal 管理工具所做的事情。大多数核心表单只是在变量表中设置变量。为了能够明智地对非内容数据库内容(即配置)进行版本控制,明智的做法是使用更新功能。

在我的网站上,我们有一个模块“ec”,除了它的 ec.install 文件包含更新功能之外,它几乎没有什么作用。 ec_update_6001()

您的主要安装功能可以负责在您进行的任何新安装上实际运行更新,以使您的模块保持最新。

function ec_install() 
  $ret = array();
  $num = 0;
  while (1) 
   $version = 6000 + $num;
   $funcname = 'ec_update_' . $version;
   if (function_exists($funcname)) 
     $ret[] = $funcname();
     $num++;
    else 
     break;
   
  
return $ret;

现在跟随我们实际文件中的一两个示例更新函数

// Create editor role and set permissions for comment module
function ec_update_6000() 
  install_include(array('user'));
  $editor_rid = install_add_role('editor');
  install_add_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
  install_add_permissions(DRUPAL_AUTHENTICATED_RID, array('access comments', 'post comments', 'post comments without approval'));
  install_add_permissions($editor_rid, array('administer comments', 'administer nodes'));
  return array();

// Enable the pirc theme.
function ec_update_6001() 
  install_include(array('system'));
  // TODO: line below is not working due to a bug in Install Profile API. See http://drupal.org/node/316789.
  install_enable_theme('pirc');
  return array();


// Add the content types for article and mtblog
function ec_update_6002() 
  install_include(array('node'));
  $props = array(
    'description' => 'Historical Movable Type blog entries',
  );
  install_create_content_type('mtblog', 'MT Blog entry', $props);
  $props = array(
    'description' => 'Article',
  );
install_create_content_type('article', 'Article', $props);
return array();

这主要解决了数据库和 Drupal 代码的版本控制问题。我们广泛使用它。它允许我们推广更改数据库配置的新代码,而无需重新导入数据库或进行实时更改。这也意味着我们可以正确地测试版本,而不必担心隐藏的数据库更改。

最后 cck 和 views 支持这种方法。看这段代码sn-p

// Enable CCK modules, add CCK types for Articles in prep for first stage of migration,
// enable body for article, enable migration modules.
function ec_update_6023() 
  $ret = array();
  drupal_install_modules(array('content', 'content_copy', 'text', 'number', 'optionwidgets'));
  install_include(array('content', 'content_copy'));
  install_content_copy_import_from_file(drupal_get_path('module', 'ec') . '/' . 'article.type', 'article');
  $sql = "UPDATE node_type SET body_label='Body', has_body=1
  WHERE type = 'article'";
  $ret[] = update_sql($sql);
  return $ret;
 

【讨论】:

【参考方案4】:

使用数据库版本控制系统。为此,您需要数据库中的 VersionInfo 表以及 xml 格式的所有 sql ddl 和 dml 查询以及版本信息。现在您只需一个简单的 .net 工具,它将检查 VersionInfo 表并运行来自 xml 的所有查询,这些查询是在该版本之后添加的,并将版本更新为 versionInfo 中的当前版本。

【讨论】:

以上是关于如何在部署期间保持数据同步?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Logstash 和 JDBC 确保 Elasticsearch 与关系型数据库保持同步

如何保持多个数据库处于同步状态

如何保持两个国家的服务器的数据库同步

使用微服务架构时如何保持数据库同步?

如何使我的数据库与 TICoreDataSync 保持同步?

RestKit:如何删除核心数据条目以保持内容与服务器同步?