零*停机迁移让站点在升级过程中以只读模式运行。这意味着你的静态站点、只需要读取数据的动态页面都可以继续正常工作,用户不会察觉到任何差异。任何需要写入数据库的操作都会被禁用,直到升级完成后才会恢复。
这是如何实现的
零停机迁移通过以下两种方式之一来启用只读模式:
- 使用只读副本。
- 使用数据库提供的“只读事务”。
无论采用哪种方式,在维护模式解除之前,数据库的写入操作都会被禁用。
在更新期间,网页端和 Desk 都会显示持续的只读警告。所有表单也会变为只读,因此你无法修改任何数据。
需要注意的事项
- 并非所有应用都自动支持此功能。如果它们没有针对只读模式进行设计,可能会出现异常行为。
- 在数据库架构更新期间,客户端应用也会被更新,因此你偶尔会遇到一些小问题。这些无法完全避免;此功能的目的仅仅是减少停机带来的影响。
在升级期间启用只读模式
- [可选] – 按照复制指南设置一个只读副本
- 编辑你的站点配置以启用此功能。
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 -->