跳转到主要内容

为ZODB提供分布式、冗余和事务性存储

项目描述

NEO是ZODB API的分布式、冗余和可伸缩实现。NEO代表Nexedi企业对象。

概述

NEO集群由以下类型的节点组成

  • “主”节点(必需,1个或更多)

    负责事务性。在任何给定时间,只有一个主节点是真正活跃的(称为“主主节点”),额外的节点是备用节点(称为“辅助主节点”)。

  • “存储”节点(必需,1个或更多)

    存储数据,保留历史记录。所有可用的存储节点同时使用。这提供了冗余和数据分布。支持的后端:MySQL(InnoDB、RocksDB或TokuDB)、SQLite

  • “管理”节点(启动时必需,之后可选)

    接受来自neoctl工具的命令并将其传输到主主节点,并监控集群状态。

  • “客户端”节点

    嗯……需要存储/加载NEO集群中的数据的东西。

ZODB API已完全实现,除了

  • pack: 仅删除旧版本的对象(可以使用 zc.zodbdgc 进行垃圾回收)

  • blobs: 未实现(尚未考虑)

任何像 FileStorage 一样的 ZODB 都可以立即转换为 NEO,这意味着在所有数据导入之前数据库就已经可用。还有一个工具可以将数据转换回 FileStorage。

有关与可扩展性相关的功能更详细的信息,请参阅https://neo.nexedi.com/架构和特性 部分。

要求

  • Linux 2.6 或更高版本

  • Python 2.7.x(对于 SSL 支持,需为 2.7.9 或更高版本)

  • 对于使用 MySQL 后端的存储节点

  • 对于客户端节点:ZODB 3.10.x 或更高版本

安装

  1. NEO 可以像任何其他 egg 一样安装(参见 setup.py)。或者,您可以简单地将 neo 目录提供给 Python 以供导入(例如,通过将其容器目录添加到 PYTHONPATH 环境变量)。

  2. 编写一个 neo.conf 文件,如提供的示例所示。如果您使用 MySQL,您还需要为每个存储节点创建 1 个数据库。

  3. 启动所有必要的节点

    $ neomaster -f neo.conf
    $ neostorage -f neo.conf -s storage1
    $ neostorage -f neo.conf -s storage2
    $ neoadmin -f neo.conf
  4. 告诉集群初始化存储节点

    $ neoctl -a <admin> start
  5. 当集群处于 RUNNING 状态时,客户端可以连接

    $ neoctl -a <admin> print cluster
    RUNNING
  6. 有关导入现有数据库的信息,请参阅 importer.conf 文件,或有关更多管理任务,请参阅 neoctl 命令。

或者,您可以使用 neosimple 命令快速设置用于测试的集群。

如何使用

首先确保 Python 可以导入 'neo.client' 包。

在zope中

  1. 编辑您的 zope.conf,添加一个 neo 导入并编辑 zodb_db 部分,将其 filestorage 子部分替换为 NEOStorage。它应该看起来像

    %import neo.client
    <zodb_db main>
        <NEOStorage>
            master_nodes 127.0.0.1:10000
            name <cluster name>
        </NEOStorage>
        mount-point /
    </zodb_db>
  2. 启动 zope

在Python脚本中

只需创建存储对象并与之交互即可

from neo.client.Storage import Storage
s = Storage(master_nodes="127.0.0.1:10010", name="main")
...

“name” 和 “master_nodes” 参数与配置文件中的含义相同。

关闭

在关闭 NEO 之前,所有客户端(如 Zope 实例)都应该停止,以便集群处于空闲状态。这对于多 DB 设置是必需的,以防止 TPC 第二阶段的临界故障。

可以使用 neoctl 将集群(即 masters+storages+admin)优雅地停止,将其置于 STOPPING 状态。

neoctl -a <admin> set cluster STOPPING

这也可以手动完成,这对于您的集群处于不良状态时非常有帮助

  • 首先使用 SIGINT 或 SIGTERM 停止所有主节点,这样存储节点就不会处于 OUT_OF_DATE 状态。

  • 然后使用 SIGINT 或 SIGTERM 停止剩余的节点。

主从异步复制

这是备份 NEO 集群的推荐方法。一旦启动了具有适当的 upstream_cluster & upstream_masters 配置的集群,您可以使用以下命令将其切换到备份模式

neoctl -a <admin> set cluster STARTING_BACKUP

当它停止时,它会记住它处于这种模式,并且可以通过将其设置为 STOPPING_BACKUP 状态将其放回正常模式(RUNNING)。

由于目前没有复制打包,这意味着打包应该一直做到 TID 已经完全复制的程度,这样备份集群就有一个完整的历史记录(而不是随机的空洞)。

SSL支持

除了任何外部解决方案(如 OpenVPN)之外,NEO 还具有内置的 SSL 支持,用于在节点之间进行身份验证和加密通信。

所有命令和配置文件都有选项可以指定 CA 证书、节点证书和节点私钥。证书可以由多个节点共享。

NEO 总是使用 Python 解释器支持的最新 SSL 协议,而不回退到旧版本。一个“SSL: WRONG_VERSION_NUMBER”错误意味着节点在比其他节点更旧的(Python + OpenSSL)环境中运行。

请注意,您不能混合非 SSL 节点和 SSL 节点,即使在上游集群和备份集群之间也不行。这样做可能会导致连接卡住,或者由于数据包损坏或 SSL 握手错误而失败。

部署

NEO 没有内置的部署功能,如进程守护进程化。我们使用 supervisor,如下面的配置所示

[group:neo]
programs=master_01,storage_01,admin

[program:storage_01]
priority=10
command=neostorage -s storage_01 -f /neo/neo.conf

[program:master_01]
priority=20
command=neomaster -s master_01 -f /neo/neo.conf

[program:admin]
priority=20
command=neoadmin -s admin -f /neo/neo.conf

开发者

对 NEO 感兴趣的开发者可以参考 NEO 网站 并订阅以下邮件列表

自动化测试结果发布在https://www.erp5.com/quality/integration/P-ERP5.Com.Unit%20Tests/Base_viewListMode?proxy_form_id=WebSection_viewERP5UnitTestForm&proxy_field_id=listbox&proxy_field_selection_name=WebSection_viewERP5UnitTestForm_listbox_selection&reset=1&listbox_title=NEO-%25

商业支持

Nexedi 为 NEO 提供商业支持:https://www.nexedi.com/

变更历史

1.12 (2019-04-28)

本版本的大部分更改都集中在高效、可靠地将大型 ZODB 迁移到 NEO 的能力上,这需要更改协议。有关示例场景,请参阅 testSplitAndMakeResilientUsingClone。

更好的集群管理

  • 新增 –new-nid 存储选项,用于快速克隆。

  • 所需副本数量现在是数据库的一个属性,在集群运行时可以修改,并由 neoctl print pt 报告。

  • 从主节点到 neoctl 的错误报告更好。

  • 调整:不触摸预期要删除的节点单元格。

  • 调整:尝试删除所有节点时不会崩溃。

  • 调整:新增 neoctl 选项,请求主节点模拟。

  • neoctl:更好地显示完整分区表。

  • 主节点:拒绝可能导致不期望状态的 drop/tweak 命令。

导入器

  • 修复写回时的潜在数据丢失。

  • v1.9 在导入完成后破坏了复制(作为源)。

  • 当导入已经完成时,加快启动速度。

  • 修复 ZODB 的关闭,并在导入完成后执行。

  • 修复启动时的隐藏“最大递归深度超出”错误。

  • 修复使用 SQLite 时的恢复。

  • v1.10 在导入开始后有新事务时破坏了恢复。

MySQL

  • 通过指定列族来更好地支持 RocksDB。

  • 修复处理没有凭据的连接字符串(–database)。

1.11 (2019-03-11)

此版本继续在 v1.8 中稳定 NEO 的工作。新增了一个名为“压力”的工具:它随机杀死存储节点并重置 TCP 连接,同时造成高并发活动。它揭示了各种类型的许多错误,包括崩溃和损坏。大多数都是在网络断开连接后发生的。为了修复它们,还对日志记录进行了几项改进。

  • 新增 neoctl 命令,用于刷新集群中所有节点的日志。

  • 在日志中,以更紧凑和可读的方式转储分区表。

  • 客户端:记录从应用程序到 ZODB 引发的多数异常。

  • 为客户端和连接提供更多 RTMIN+2(日志)信息。

  • 新的日志格式,在节点列中显示节点 ID(以及可选的集群名称)。

  • neolog:添加对 zstd 压缩日志的支持。

  • neolog:当表损坏时不会死亡。

其他更改

  • sqlite:优化元数据存储(v1.9 中关于通过‘oid’对‘obj’进行索引的速度提升仅对 MySQL 有效)。

  • 修复设置侦听连接器时的错误处理。

  • 已完全重写所有可执行文件命令行解析,修复了一些小错误。

1.10 (2018-07-16)

一个重要的性能改进是,复制现在会记住它中断的位置:短暂断开连接的存储节点现在可以非常迅速地完全正常工作,因为它只需要复制新数据。之前,恢复所需的时间取决于数据库的大小,只是为了验证大多数数据已经传输。

作为一个小优化,空的交易扩展现在使用空字符串序列化。

上述 2 个更改需要提升协议版本,以及存储格式的升级。一旦升级(这通常自动完成),数据库就不能再由 NEO 的旧版本打开。

其他一般更改

  • 添加对自定义压缩级别的支持。

  • 通过考虑存储节点的拓扑结构来最大化弹性。

  • 修复了ZODB5的一些问题。然而,请注意,只有当数据库仅用于ZODB < 5时,使用导入器后端合并多个数据库才有效。

主节点

  • 自动丢弃过时数据的供应单元。

客户端

  • 修复从源存储部分导入的问题。

  • 如果压缩大小相等,则存储未压缩数据。

存储

  • 修复了v1.9代码,通过发送更大的网络数据包加快了复制速度。

  • 修复了取消创建的复制。

  • 停止对已锁定的事务记录“中止事务”。

  • 澄清有关丢弃单元数据删除的日志。

MySQL后端

  • 修复了大于16M的大OID的复制。

  • 如果禁用了数据去重,则不要对大OID的全扫描。

  • 修复了未捕获服务器断开连接的剩余位置。

SQlite后端

  • 修复了升级数据库的索引。

导入器后端

  • 在一个单独的进程中获取并处理要导入的数据。通常可以使用最佳的压缩级别。

  • 添加了将新事务写回源数据库的新选项。有关更多信息,请参阅“importer.conf”。

  • 如果已安装“setproctitle”蛋,则给“import”和“writeback”子进程一个标题。

  • 记录当FileStorage数据库的事务索引构建时。

  • 尽可能以只读方式打开导入的数据库。

  • 不要无用地触发speedupFileStorageTxnLookup。

  • 不要对数据进行两次校验和。

  • 修复在tpc_finish期间恢复时的NameError。

1.9 (2018-03-13)

在这个版本中,对存储节点进行了大量的性能改进,其中一些改进需要对存储格式进行更改。简而言之,迁移是自动完成的,但您可能想阅读UPGRADE说明以获取更多详细信息。

性能

  • 通过发送更大的网络数据包和不获取对象next_serial来加快复制速度。

  • 通过首先按“oid”对“obj”进行索引(而不是“tid”)来加快读取速度。

  • 优化原始数据的存储布局以进行复制。

其他存储更改

  • 默认禁用数据去重。-dedup选项已添加。

  • 导入器:如果备份集群尝试复制,则不会崩溃。

  • 导入器:保留“packed”标志。

主节点

  • 修复在具有副本的备份集群中读取数据时可能出现的失败。

  • 修复TID的生成。

  • 修复备份复制的恢复(内部或非内部)。

客户端

  • 添加新的“cache-size”存储选项。

  • 缓存命中/未命中统计。

  • 修复缓存大小的会计。

  • 迭代时保留“packed”标志。

  • 在启动时或节点恢复后,在写入一些数据之前可以防止完全负载均衡。

其他

  • neolog:-from选项现在还尝试使用dateutil进行解析。

  • neolog:添加对xz压缩日志的支持,使用外部xzcat命令。

1.8.1 (2017-11-07)

  • 添加对OpenSSL >= 1.1的支持。

  • 存储:修复在延迟复制请求时可能发生的崩溃。

  • mysql:通过使用更多索引提示修复读操作的性能问题。

1.8 (2017-07-04)

本版本主要稳定了NEO在多个存储节点上的使用,修复了许多涉及事务操作(读写、冲突解决…)、复制、分区表调整和所有类型的故障(节点崩溃、网络中断…)的竞态条件。这包括对冲突解决的重新设计,以实现长期期待死锁避免(这是由于对象级锁定引起的限制)。

同样,备用主节点不再是实验性功能:已重新实现主主选举,现在它在RECOVERING阶段发生。这带来了节点状态的变化:BROKEN/HIDDEN/UNKNOWN被移除,DOWN更名为UNKNOWN,TEMPORARILY_DOWN更名为DOWN。

为了提高弹性,新的调整分区表的算法在最小化复制数量方面做得更好,并且它不会再那么快地丢弃可读单元格:现在分区可以有多个FEEDING单元格,以避免低于所需的复制水平。

其他更改

  • 通用

    • 已移除数据包超时。现在使用TCP keepalives代替应用层ping。

    • 节点之间的连接握手被审查,以确保它们在进行任何其他操作之前使用相同的协议,否则会报告更清晰的错误消息。一个危险的错误是neoctl和admin节点之间没有进行协议版本检查。

    • 正确处理已关闭/中止连接的传入数据包。

    • 在处理答案时出现异常可能会使处理程序切换器处于不良状态。

    • 在STOPPING集群状态下,确实等待所有事务完成。

    • 在撤销具有冲突解决的事务时已修复几个问题。

    • 当存储节点就绪时,延迟连接接受。

  • 客户端

    • 添加了对zodburi的支持。

    • 修复了在无效化延迟时的冲突解决过程中的加载错误。

    • 不等待tpc_vote就开始解决冲突。

    • 修复了无害的‘unexpected … AnswerRequestIdentification’异常。

  • 存储

    • 添加了新的–disable-drop-partitions选项,这对于大型数据库很有用,因为当前删除丢弃单元格数据的代码效率低下(此选项应在未来消失)。

    • 防止2个节点使用同一数据库。

    • 丢弃已中止复制的答案。在某些情况下,这导致数据损坏或崩溃。

  • MySQL后端

    • 添加了对RocksDB的支持。

    • 在非停止尝试连接时不要填充日志。

    • 不要无限期地重试失败的查询。

    • 默认情况下,不要自动尝试连接到服务器。

  • 工具

    • neolog:新的–decompress选项。

    • neolog:新的选项以隐藏节点列。

    • neoctl:使用‘print node’使主主机的识别更容易。

  • 针对开发人员和调试的大量改进。

1.7.1 (2017-01-18)

  • 复制

    • 修复了在恢复备份时对cells’ backup_tid可能错误了解的问题。在这种情况下,‘neoctl print ids’给备份集群是最新的错误印象。这也导致在问题自行解决之前离开备份模式时数据库不一致。

    • 存储节点现在选择落后最远的分区。以前的准则是在上游活动较高的情况下,备份甚至可能在一个子集的分区上循环。

    • 修复了未完成导入事务的复制。

  • 修复了在投票之前中止的问题,以释放事务使用的存储空间。添加了新的‘prune_orphan’ neoctl命令,用于删除数据库中未引用的原始数据。

  • 移除了重置数据库的短存储选项-R。帮助被重新措辞以澄清–reset完成后退出。

  • 应用程序接收缓冲区大小已增加。这加快了大数据包的传输。

  • 主节点在恢复期间退出时引发AttributeError。

  • 在启动时,导入存储后端两次连接到目标数据库。

1.7.0 (2016-12-19)

  • 识别问题得到修复,主要是由id冲突引起的。

    • 存储节点现在只接受由主节点知道的客户。

    • 在重新连接到主节点时,如果以前的id已重新分配给另一个客户,则客户将获得一个新的id。

    • 结果是崩溃或客户无法连接。

  • 添加了对最新版本的ZODB(4.4.4 & 5.0.1)的支持。一个显著的变化是,lastTransaction()不再ping主节点(但如果客户端断开连接,它仍然会导致与主节点的连接)。

  • 处于BACKUPING状态的集群现在可以以只读模式为普通客户端提供服务。但因为没有进行失效处理,所以客户端每次想要查看新数据时都必须重新连接。

  • 修复了在完整初始化之前尝试处理通知时客户端节点(包括备份主节点)崩溃的问题,而不是忽略它们。

  • 客户端

    • 修复了由于内部连接对象与其文件描述符之间的无效映射而导致的竞争条件。这导致KeyError异常。

    • 修复了从缓存中删除项目的问题,这可能会破坏从存储加载。

    • 在tpc_abort中改进了异常处理。

    • 不限制与存储节点的开放连接数。

  • 存储

    • 修复了在投票前客户端刚刚失去与主节点的连接时崩溃的问题。

    • MySQL:强制对一些查询使用索引。不幸的是,这并不完美,因为有时MySQL仍然会忽略我们的提示。

    • MySQL:不要使用不安全的TRUNCATE语句。

  • 使‘neoctl print ids’显示TID的时间。

  • neoctl/neolog的格式改进/修复。

  • 另外还有一些针对调试和开发人员的其他更改以及小的优化。

1.6.3 (2016-06-15)

  • 增加了对ZODB 4.x的支持。

  • 当事务成功提交时,客户端现在能够在tpc_finish期间从失败中恢复。

  • 与节点断开连接相关的其他修复。

    • 存储:修复在客户端请求完成事务后立即断开连接时的崩溃问题。

    • 存储:修复尝试从不可达节点复制时的崩溃问题。

    • 主节点:从不取消已准备的事务(例如,客户端在tpc_finish期间断开连接可能导致崩溃)。

    • 客户端:修复重新连接到主节点时的失效问题。

  • 客户端

    • 修复只检查当前序列号的存储的中止问题。

    • 修复缓存中历史项目的计数。

  • neoctl:当连接到管理员失败时,显示更好的错误消息。

1.6.2 (2016-03-09)

  • 存储:切换到MySQL-python(mysqlclient)的维护分支。

  • 存储:为了提高性能,在解锁事务提交后延迟1秒钟后端提交,希望它会被后续的提交合并(如果在崩溃的情况下,事务会再次解锁),因此在高活动期间每个事务只有两个提交。

  • 客户端:通过不在历史队列中保留计数器为0的项目来优化缓存。

  • 客户端:修复在晚期失效情况下的加载可能导致的断言失败。

1.6.1 (2016-01-25)

NEO仓库已迁移至https://lab.nexedi.com/nexedi/neoppod.git

  • 客户端:修复虚假连接超时。

  • 客户端:在SIGRTMIN+2上添加缓存统计信息到输出的信息。

  • 存储:在使用Importer后端时,在导入前后的最后tid之后允许截断。

  • neoctl:在成功的检查/截断命令中不要打印‘None’。

  • neolog:修复未知数据包的崩溃。

  • 另外还有一些针对调试和开发人员的其他更改。

1.6 (2015-12-02)

本版本对存储格式进行了更改。升级是自动完成的,但仅当集群干净地停止时:有关更多信息,请参阅UPGRADE说明。

  • NEO没有确保在tpc_finish之前将所有数据和元数据写入磁盘,例如它容易受到ENOSPC错误的影响。为了最小化tpc_finish期间失败的风险,现在将元数据写入临时表的写入现在在tpc_vote中进行。有关性能方面可能发生的变化的更多信息,请参阅提交7eb7cf1

    这个更改带来了一种验证未完成数据的新算法,这也修复了丢弃在调用readCurrent时具有对象的交易的bug。

  • RECOVERING/VERIFYING阶段以及与其他状态的转换已经被完全审查,以修复许多bug。

    • 分区表的潜在损坏。

    • 集群可能会卡在RECOVERING或VERIFYING状态。

    • 同时重启多个存储节点时,单元格过时的概率已降低。

    • 在恢复过程中,新选出的主节点现在总是等待所有带有可读单元格的存储节点处于待处理状态,以避免数据库分裂。

    • 在以下几种情况下,最后的时间戳/对象ID可能不正确,例如在VERIFYING阶段恢复事务后。

  • neoctl 获得了一个新命令,可以在任意 TID 处截断数据库。内部,NEO 已经能够截断数据库,因为这在退出备份模式时使数据库保持一致性是必要的。然而,有几个错误导致数据库被部分截断

    • 主节点现在首先持久化地存储截断的决定,以便它可以从任何类型的连接故障中恢复。

    • 只有当所有存储节点(包括没有任何可读单元格的节点)确认截断后,集群才会回到RUNNING状态。

  • 存储

    • 作为修复复制中断后的空洞的解决方案,如果新数据提交后复制中断,过时的单元格总是从开始重新复制。

    • 在验证期间删除部分事务时,没有尝试释放相关的原始数据。

    • 在删除数据库时,MySQL 后端没有删除 'bigdata' 表。

  • 在终止时,SSL 握手连接可能会卡住。

  • ‘neoctl print ids’ 在备份模式下显示新值:所有可读单元格已复制的最高共同 TID,即数据库退出备份模式时将被截断的 TID。

1.5.1 (2015-10-26)

在此版本中,修复了几个主要在存储节点中的错误和性能问题。

  • 导入存储后端

    • 修复了在 NEO 中下一个序列号时从 ZODB 获取对象的问题。

    • 修复了事务被终止时存储节点崩溃的问题。

    • 当许多事务已导入 MySQL 时,恢复速度更快。

  • MySQL 存储后端

    • 如果 max_allowed_packet 过小,则拒绝启动。

    • 加快事务元数据的提交速度。

  • 复制和副本检查

    • 修复了在检查 TID 时发现损坏时的崩溃。还有两个其他问题尚未修复:请参阅 BUGS.rst 文件。

    • 加快副本检查速度,但代价是存储节点对其他事件的响应能力降低。

  • 主节点错误地发送了只调用 readCurrent 的对象的无效化,这导致客户端缓存中存在无效条目或在 Connection._setstate_noncurrent 中出现断言失败。

1.5 (2015-10-05)

在此版本中,节点之间的连接性得到了很大改善

  • 添加了 SSL 支持。

  • IPv4 和 IPv6 可以混合使用:某些节点可以具有 IPv4 绑定地址,而其他节点则监听 IPv6。

  • 版本 1.4 修复了节点可能重新连接得太快的情况,这会导致 100% 的 CPU 使用率和日志洪水。现在已经完全修复,例如,当备份存储节点被拒绝,因为上游集群尚未就绪时。

  • 无滴答的轮询循环,以降低延迟和 CPU 使用率:节点不再每秒唤醒一次以检查是否已过期超时。

  • 在轮询之前可能会错误处理连接(用于读取或写入)。如果内核在连接关闭后重新分配文件描述符号,就会发生这种情况。

其他更改包括

  • IStorage:history() 没有等待 oid 解锁。这意味着对象的最新版本可能不存在于结果中。

  • 现在可以在配置文件中指定日志文件。

  • 对于配置中的所有路径(文件或命令行),现在都展开 ~(用户) 构造。这不涉及 neoctl 这样的非守护进程可执行文件。

  • 对于 neoctl,-l 选项现在自动将所有日志记录在磁盘上。

  • 管理员节点在重新连接时不再从配置中重置已知主节点的列表,以与客户端节点保持一致。

  • 代码重构和日志记录以及调试的改进。

  • 测试套件中的一个显著变化是,偶尔导致线程测试死锁的问题已得到修复。

1.4 (2015-07-13)

本版本包含对SQL表格式的更改,以修复存储节点在存储仅通过压缩标志不同的值时可能崩溃的问题。如果认为您的应用程序可能受到此错误的影响,请参阅UPGRADE说明。

  • 性能和特性

    • “导入器”存储后端已显著加速。

    • 已向MySQL存储后端添加了对TokuDB的支持。默认情况下,引擎仍然是InnoDB,可以通过新的“neostorage”选项进行选择。

    • 添加了“neomaster”选项,如果挂起的存储节点数量大于或等于指定的值,则自动启动新的集群。

  • 错误修复

    • 当读取空事务时,存储崩溃。我们仍然需要决定NEO是否

      • 继续存储此类事务;

      • 在提交时忽略它们,就像其他ZODB实现一样;

      • 或在提交时失败。

    • 当客户端尝试“窃取”另一个客户端的UUID时,存储会崩溃。

    • 如果未连接到主节点,客户端可能会永远卡在不可读的单元格上。

    • 客户端只能从主线程创建NEOStorage,且RTMIN+2信号仅显示1个NEOStorage的日志。现在,在导入neo.client模块时设置RTMIN+2 & RTMIN+3。

  • 以及日志记录和调试的修复和改进。

1.3 (2015-01-13)

  • 版本1.2添加了新的“导入器”存储后端,但它有两个错误。

    • 中断的迁移无法恢复。

    • 合并多个ZODB仅当NEO能够导入应用程序使用的所有类时才有效。这已通过不加载任何对象进行repickling来修复。

  • 已改进日志记录,以更好地与环境集成。

    • 将RTMIN+1信号更改为重新打开日志。以前用于调试的RTMIN+1 & RTMIN+2信号已重新映射到RTMIN+2 & RTMIN+3。

    • 在Zope中,客户端会自动注册进行日志轮换(USR2)。

    • NEO日志现在是SQLite数据库,不再使用持久日志打开,因为这与重命名+重新打开的日志轮换方式不兼容,并且我们希望支持logrotate。

    • “neolog”现在可以透明地打开gzip/bz2压缩日志。

    • 当管道到一个提前退出的进程时,“neolog”不再向控制台发送垃圾邮件。

  • MySQL后端已更新,以与最近的MariaDB(>=10)兼容。

  • 添加了2个“neomaster”命令行选项,用于设置上游集群/主节点。

1.2 (2014-07-30)

本版本最重要的更改是关于数据库从/to NEO的转换的工作。

  • 已实现一个新的“导入器”存储后端,现在是推荐迁移现有Zope数据库的方式。有关更多信息,请参阅“importer.conf”示例文件。

  • 从版本1.0开始,“neomigrate”命令拒绝运行。

  • 由NEO迭代器导出的数据序列是错误的。与FileStorage仍有差异。

    • NEO始终解析为原始序列,以避免任何间接引用(这略微加快了撤销速度,但复杂化了打包代码)

    • NEO在对象删除和撤销创建之间没有区别(数据序列在存储中始终为null)

    除此之外,应修复从NEO转换回数据库的问题。

其他更改包括

  • 在“neo.conf”中添加了一个关于可能滥用副本的警告。

  • 已放弃与Python 2.6的兼容性。

  • 已添加对SQLite最新版本的支持。

  • 在复制中修复了一个内存泄漏。

  • MySQL后端现在在有任何挂起更改的情况下会失败,而不是静默重连,这可能导致数据丢失。

  • 优化和修复了一些小错误。

1.1 (2014-01-07)

  • 客户端无法正确重连主节点。它可能在tpc_finish期间杀死主节点,或者最终导致无效的缓存(即可能的数据损坏)。现在,只要分区表包含最新数据,事务开始()和tpc_begin之间的主节点连接是可选的。

  • 已删除与ZODB 3.9的兼容性。仅支持3.10.x分支。

  • checkCurrentSerialInTransaction未正常工作。

  • 优化和修复了一些小错误。

1.0 (2012-08-28)

本版本主要包含稳定的SQL表格式和高效的备份功能,依赖于复制,该复制功能已完全重写。

  • 现在是增量更新,而不是对整个分区进行操作。已更改MySQL表的架构以优化存储布局,以实现良好的部分复制性能。

  • 它以最低优先级运行,以免降低客户端节点的性能。

  • 新状态为BACKINGUP的集群是正常集群的客户端,其所有存储节点都会收到无效通知并从上游节点进行复制。

其他更改包括

  • 已删除与Python < 2.6和ZODB < 3.9的兼容性。

  • 当所有UP_TO_DATE单元格的存储节点都可用时,集群现在将自动启动,类似于mdadm assemble --no-degraded的行为。

  • NEO现在可以检查副本,以检测复制过程中的数据损坏或错误。当在备份集群上执行时,使用上游数据作为参考。这仍然仅限于数据索引(tid & oid/serial)。

  • NEO日志现在是SQLite数据库,总是包含所有调试信息,包括交换的数据包。记录首先保存在RAM中,默认最多16MB,仅在RTMIN信号或任何重要记录时才写入磁盘。已编写一个名为neolog的脚本来帮助读取此类数据库。

  • 主节点地址必须由空格分隔。‘/’不能再使用了。

  • 添加和删除主节点现在更容易:现在接受未知传入的主节点而不是拒绝,并且可以为主节点提供一个指向包含已知主节点列表的文件的路径。

  • 节点UUID已从16字节缩短到4字节,以提高性能和简化调试。

还包括代码清理和错误修复。

0.10.1 (2012-03-13)

  • 客户端在提交大事务时没有限制其内存使用。

  • 当集群离开RUNNING状态时,主节点未能断开客户端。

0.10 (2011-10-17)

  • 存储无法或缓慢处理大型事务。这需要更改协议和MySQL表格式。

  • NEO现在可以存储空值(尽管当由ZODB Connection管理时没有用)。

0.9.2 (2011-10-17)

  • storage: 可以给MySQL后端提供一个特定的套接字

  • storage: 当客户端比主节点快得多时,可能会发生ConflictError

  • ‘neomigrate’的‘verbose’命令行选项未正常工作

  • 客户端:ZODB monkey-patch随机抛出NameError

0.9.1 (2011-09-24)

  • 客户端:获取持久化对象历史的方法与最近的ZODB不兼容,并会无谓地系统地询问所有存储。

  • neoctl:‘print node’命令(获取所有节点列表)引发了AssertionError。

  • ‘neomigrate’在将NEO数据库转换为FileStorage时引发了TypeError。

0.9 (2011-09-12)

首次发布。

NEO被认为足够稳定,可以替换现有的ZEO设置,但除了

  • 没有备份机制(即高效的快照):只有复制和底层MySQL工具

  • MySQL表格式可能在将来发生变化

支持者