Atom feed of this document
  

 紧急恢复环构建者文件

你须一直保持对swift环构建者文件的备份。然而,一旦紧急事件发生了,此步骤可帮助你将集群恢复到可操作状态。

使用现有的swift工具,是没有办法从一个ring.gz文件来恢复构建者文件的。然后,如果拥有些Python的知识的话,就有可能构造一个构建者文件,它可以非常的接近你所丢失的。下面是你需要做的内容。

[警告]警告

此步骤是在紧急情况下最后的绝招。它需要swift python代码的知识,而且还有可能不会成功。

首先,在一个Python REPL中加载环和一个新的环构建者的对象:

>>> from swift.common.ring import RingData, RingBuilder
>>> ring = RingData.load('/path/to/account.ring.gz')

现在,开始拷贝环中的数据到构建者。

>>> import math
>>> partitions = len(ring._replica2part2dev_id[0])
>>> replicas = len(ring._replica2part2dev_id)

>>> builder = RingBuilder(int(math.log(partitions, 2)), replicas, 1)
>>> builder.devs = ring.devs
>>> builder._replica2part2dev = ring._replica2part2dev_id
>>> builder._last_part_moves_epoch = 0
>>> from array import array
>>> builder._last_part_moves = array('B', (0 for _ in xrange(partitions)))
>>> builder._set_parts_wanted()
>>> for d in builder._iter_devs():
            d['parts'] = 0
>>> for p2d in builder._replica2part2dev:
            for dev_id in p2d:
                builder.devs[dev_id]['parts'] += 1

这是一个在多大程度上可恢复的事情。对于min_part_hours,你不仅要记住你所使用的值,还要组成一个新的。

>>> builder.change_min_part_hours(24) # or whatever you want it to be

接下来,验证构建者。如果此会抛出异常,检查你原来的代码。当它通过验证,你就准备好保存构建者,然后创建一个新的account.builder。

>>> builder.validate()

保存构建者。

>>> import pickle
>>> pickle.dump(builder.to_dict(), open('account.builder', 'wb'), protocol=2)
>>> exit ()

你现在须在当前的工作目录中有一个名字叫做 'account.builder'的文件。接下来,运行swift-ring-builder account.builder write_ring,然后比较下你开始时的account.ring.gz和新的account.ring.gz。他们不可能每个字节都是一样的,但是如果你加载它们到REPL中,它们的_replica2part2dev_id and devs属性是一致(或者非常接近)的话,那么你成功的几率就非常的大了。

接下来,为container.ring.gzobject.ring.gz重复上述步骤,然后,你就可能得到可用的构建者文件

Questions? Discuss on ask.openstack.org
Found an error? Report a bug against this page


loading table of contents...