我有一个erlang应用程序,它使用mnesia存储一些定义系统用户和角色的基本状态。我们需要推出一个新功能,需要扩展存储在我们的mnesia表中的记录模式。
我们的部署计划是从群集中取出一个节点(只需从网络中删除),部署代码,运行脚本以升级该节点上的记录架构。重新投入使用。但是,一旦我升级了此节点上的记录,它就会复制到其他节点,并且由于匹配不匹配的记录模式,某些操作会在这些节点上开始失败。显然是零停机部署的一个大问题。
有没有办法隔离我的架构更改,以便在升级时可以在每个节点上运行架构升级?优选地,仅对于正在升级的表,允许其他表保持复制。但是,我可以在所有节点之间关闭复制,只需几分钟即可部署到所有节点。
答案 0 :(得分:0)
我遇到了这个问题。我能够解决这个问题的唯一方法就是将所有节点从集群中取出,只留下一个直播,升级即#34; master"节点的模式和代码,有希望在现场进行,然后为每个剩余的节点,删除其数据库文件,升级代码,并启动节点(使用正确的新模式创建表)并返回集群。
我使用了一个我编写的escript来添加和删除集群中的节点以使其更容易,并使用Ansible编剧来编排它。我真的不想在短期内再次这样做。
基本问题是Mnesia没有架构版本,否则可以用更好的方式完成。