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>
tidstorage由3部分组成:
> UL>
  • 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的约束条件:
    > UL>
  • Zope表演 协议(见下文)设计为单向(zope将数据推送到 tidstorage,并且不期望得到答案),因此tidstorage的速度不会 限制Zope性能。
  • 无附加单点故障 即使zope无法连接到tidstorage,它仍然可以工作。它只会 当连接丢失时发出一个日志行,如果没有,则在第一次尝试时发出一个日志行 成功。建立连接后,会发出另一条日志行。
  • 自举 因为tidstorage可以在事件仍然发生时启动和停止 Zodbs,它必须能够在任何备份之前引导其内容 发生。这是通过创建只有 目的是使每个zodb上发生提交,填充tidstorage和 确保没有任何存储上的挂起提交(因为所有锁 可能被那些交易拿走,意味着所有的交易都开始了 在此之前,tidstorage可以接收到他们的通知已结束。
  • 从data.fs还原 除了能够从repozo样式的备份中恢复之外, 为了提供比repozo提供的更高的备份频率 数据库,tidstorage提供了恢复一致数据的可能性。 从坠毁的飞机上-只要它们没有损坏。
  • 限制:
    > UL>
  • 恢复"滞后" 因为tidstorage只能在inderdependent时提供一个一致点 事务全部完成(提交或中止),tidstorage日志文件 从时间t开始的备份实际上可能包含以前时刻的数据。 因此,在使用-t选项执行还原时,数据将被剪切为 时间t-未定义,小滞后。

    甚至有些病理病例没有找到一致点, 因此tidstorage日志文件将没有任何信息。

  • Daemeon信号支持:
    > UL>
  • hup重新存储所有日志文件
  • usr1将tid配置转储到日志文件中
  • 术语杀死守护进程
  • 协议规范

    < 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
    

    命令不区分大小写。

    1. 开始提交命令:
    2. < > > < > <;提交ID>;n <;相关存储列表>;

      < Buff行情> <;提交ID>;:必须与提交完成时给定的ID相同(无论是中止还是提交) <;相关存储列表>;:事务中涉及的存储ID列表 注意:final n是列表表示法的一部分,因此不在上面显示。

      回答:(没有)

      1. 事务中止命令:
      2. < > >

        堕胎 <;提交id>;n

        < Buff行情> <;提交id>;:(cf.开始)

        回答:(没有)

        1. 交易定案命令:
        2. < > >

          <;提交ID>;n <;dict所涉及的存储和提交的tid>;

          < Buff行情> <;提交ID>;:(参见开始) 相关仓库:(参见开始) 承诺的TID:每个存储器的tid,如int。 注意:final n是列表表示法的一部分,因此不在上面显示。

          回答:(没有)

          1. 数据读取命令:
          2. < > >

            反应: <;dict of storages and tids>;

            1. 连接终止命令:
            2. < > > < QUITn >

              响应:(无,服务器关闭连接)

              1. 引导状态命令:
              2. < > >

                bootstrapedn

                响应:如果引导完全完成,则为1;否则为0。

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


    热门话题
    字符串Java字母替换无效   java Spring Roo JPA MS SQL Server无法打开JPA EntityManager组织。冬眠例外GenericJDBCException:无法打开连接   在scala中使用JavaWS对大型数据文件进行java流式处理   Java编译器是否将字节和短字符识别为文本?   java无法查找符号错误,空指针   mongodb在Java中重用数据库连接   java将多个StringArray从字符串文件获取到活动中   java是一个变量,它只保存最后一次鼠标单击的坐标   c#尺寸有限;添加、删除和洗牌   java如何在Android中显示来自资产文件夹的文本文件中的文本   Android应用程序中的java Tensorflow Lite自定义对象检测模型错误   java如何在foreachloop中使用scanner将来自命令行的输入存储到数组中   java如何定义一个好的存储库接口   Android中的java解析动态json对象