tidstorage产品提供了一种在运行多存储实例时进行一致备份的方法(目前仅支持zeo)。
Products.TIDStorage的Python项目详细描述
TIDStorage
概要
此产品提供了在运行 多存储实例(目前仅支持Zeo)。
备份属于同一实例的单个data.fs 当存在涉及 多个存储:如果在事务提交期间发生崩溃,则不存在 判断哪个存储已提交,哪个未提交的方法(没有tid 数据库之间的一致性)。 还有一个更棘手的案子。请考虑以下事项:
2 transactions running in parallel: T1: modifies storage A and B T2: modifies storage A Commit order scenario: T1 starts committing (takes commit lock on A and B) T2 starts committing (waits for commit lock on A) T1 commits A (commit lock released on A) T2 commits A (takes & releases commit lock on A) [crash] T1 commits B (commit lock released on B) <- never happens because of crash
在这里,t2可以完全提交,但不能保存它。这是 因为事务按照提交的顺序存储在zodb中。 T2在备份中,T1的一部分也在备份中 不一致(B上从未发生T1提交)。
tidstorage日志和服务器日志
tidstorage使用两个日志文件-一个用于通知管理员 关于服务器状态(配置中的日志文件名)和tidstorage日志 附加TID(配置中的状态文件)。
用法
将产品放入Zope产品中以激活Zope侧补丁。
创建配置,repozo/sample_configuration.py中提供了示例
使用创建的配置运行bin/tidstorage.py。当Zope进行交易时 它将连接到tidstorage服务器,该服务器将显示在zope和tidstorage中 服务器日志。
Zope 2.12+配置
放入zope.conf部分:
<product-config TIDStorage> backend-ip ip-of-tidstorage-server backend-port port-of-tidstorage-server </product-config>
蟒蛇问题
要运行服务器和脚本,需要设置正确的pythonpath-至少 到产品目录和一些工具到zope lib/python。
示例:
pythonpath=/usr/lib/erp5/lib/python:/usr/lib/erp5/lib/python/products/tidstorage
典型的故障情况,从备份中恢复
< Buff行情>- zopes和zeos正在运行
- tidstorage正在运行
- 使用repozo/repozo_tidstorage.py完成的备份(它们可能包含 不一致),对于每个备份tidstorage.tid都被保存
- 系统故障
- 使用repozo/repozo-tidstorage.py和-t tidstorage.tid从上一个 备份< /LI>
在这种情况下,只有在还原时,目标文件才会在最后一点被剪切 已知TID位置。此步骤是可选的,在某些情况下是管理员 可能不想剪切此文件。
典型的故障情况,不需要恢复
< Buff行情>- zopes和zeos正在运行
- tidstorage正在运行
- 系统故障
- 不需要从备份还原,但可能有一些正在放置的事务 在不同的zodb文件中,系统不连贯
- 管理员使用repozo/restore_tidstorage.py剪切未正确提交 交易,系统再次连贯
技术细节
tidstorage通过跟踪事务与tid的关系来解决这些问题 对于任何事务中涉及的所有(zodb,通过zeo)存储,并通过跟踪 事务之间的依赖关系。
< DL>Zope产品,Monkey为"Zeo"和"Transaction"产品打补丁。
事务修补程序
< Buff行情>tidstorage在事务边界上工作,所以我们在 _ commitResource方法来知道它何时发生。 它必须配置为适合您的网络设置(TID存储地址)
Zeo修补程序
< Buff行情>对于常规的zeo,没有办法知道最后一次提交的tid 交易代码级别。此修补程序将上次提交的tid存储在zeo上 连接对象,到按事务修补程序读取。
守护者 这是tidstorage本身,从zopes接收tid并传送 一致性指向备份脚本。
备份脚本和其他实用程序 这些脚本(主要)是repozo备份脚本的包装器,获取 来自tidstorage守护进程和调用repozo的一致性点。 无需更改repozo.py,因为它仅用作子系统 进行可靠的备份和恢复。 在utils/目录中使用提供的utils可以查询 从服务器获取最后一个已知的tid,并对tidstorage日志进行操作。
恢复"滞后" 因为tidstorage只能在inderdependent时提供一个一致点 事务全部完成(提交或中止),tidstorage日志文件 从时间t开始的备份实际上可能包含以前时刻的数据。 因此,在使用-t选项执行还原时,数据将被剪切为 时间t-未定义,小滞后。
甚至有些病理病例没有找到一致点, 因此tidstorage日志文件将没有任何信息。
协议规范
< Buff行情>数据中允许的所有字符,n和r(0x0a&0x0d)除外。 每个字段以n结尾,忽略r。 不要逃避。 传输列表时,列表前面会加上包含的字段数。 例子:
3\n foo\n bar\n baz\n
当传输一个dict时,它前面是项目数,后面是 键,然后是值。值必须是表示为字符串的整数。 例子:
2\n key1\n key2\n 1\n 2\n
命令不区分大小写。
- 开始提交命令: < > > < > <;提交ID>;n <;相关存储列表>; < Buff行情> <;提交ID>;:必须与提交完成时给定的ID相同(无论是中止还是提交) <;相关存储列表>;:事务中涉及的存储ID列表 注意:final n是列表表示法的一部分,因此不在上面显示。
- 事务中止命令: < > >
- 交易定案命令: < > >
- 数据读取命令: < > >
- 连接终止命令: < > > < QUITn >
- 引导状态命令: < > >
回答:(没有)
堕胎 <;提交id>;n
< Buff行情> <;提交id>;:(cf.开始)回答:(没有)
<;提交ID>;n <;dict所涉及的存储和提交的tid>;
< Buff行情> <;提交ID>;:(参见开始) 相关仓库:(参见开始) 承诺的TID:每个存储器的tid,如int。 注意:final n是列表表示法的一部分,因此不在上面显示。回答:(没有)
反应: <;dict of storages and tids>;
响应:(无,服务器关闭连接)
bootstrapedn
响应:如果引导完全完成,则为1;否则为0。