零停机迁移

零*停机迁移让站点在升级过程中以只读模式运行。这意味着你的静态站点、只需要读取数据的动态页面都可以继续正常工作,用户不会察觉到任何差异。任何需要写入数据库的操作都会被禁用,直到升级完成后才会恢复。

这是如何实现的

零停机迁移通过以下两种方式之一来启用只读模式:

  1. 使用只读副本。
  2. 使用数据库提供的“只读事务”。

无论采用哪种方式,在维护模式解除之前,数据库的写入操作都会被禁用。

在更新期间,网页端和 Desk 都会显示持续的只读警告。所有表单也会变为只读,因此你无法修改任何数据。

需要注意的事项

  • 并非所有应用都自动支持此功能。如果它们没有针对只读模式进行设计,可能会出现异常行为。
  • 在数据库架构更新期间,客户端应用也会被更新,因此你偶尔会遇到一些小问题。这些无法完全避免;此功能的目的仅仅是减少停机带来的影响。

在升级期间启用只读模式

  1. [可选] – 按照复制指南设置一个只读副本
  2. 编辑你的站点配置以启用此功能。 bench --site develop set-config allow_reads_during_maintenance 1

在你的应用中支持只读模式

如果你是一名应用开发者,并且想在你的应用中添加对此功能的支持,那么你需要修改你的应用

服务端更改

你可以使用 frappe.flags.read_only 来在只读模式下禁用或修改行为。

示例:记录页面访问

@frappe.whitelist()
def log_visit():
    if frappe.flags.read_only:
        return

    doc = frappe.new_doc("Doc Visit")
    doc.insert()

Jinja / 客户端页面更改

理想情况下,你应该更新 UI 以表明你的应用处于只读模式,当前无法执行写入操作。

网站上下文默认包含 read_only_mode 键;你可以利用它在页面上有条件地添加警告或切换功能。示例:

<!-- some html page -->
{% if read_only_mode %}
    <div class="alert">Site is running in read only mode. Full functionality will be restored soon.</div>
{% endif %}
<!-- other content -->