|

楼主 |
发表于 2007-10-27 23:41:50
|
显示全部楼层
关于一个 Berkeley DB 的问题
遇到一个比较奇怪的问题。
在初始化阶段完成之后,进入实时同步状态。我在 3 台主机上都部署了的,而且都运行了将近半个月,其中有一台主机有一天不知道怎么回事,我发现 fs_mirror 从 mirrord 接受到了空记录。正常的情况下,应该得到这样的内容:
"CREATE:/var/www/html"
"FWRITE:/var/www/html/index.php"
"DELETE:/var/www/html/temp"
"MOVE' '/var/www/html/aa', '/var/www/html/bb')"
...
但不应该有空记录。这导致 fs_mirror 进入了死循环。
我让 fs_mirror 从断点重启,但仍然还是如此,而且 DEBUG 发现每次出问题都在同一个 serial 号(我使用 Berkeley DB 作为日志记录,serial 号作为其 key),所以我怀疑问题出在 BDB,但不知道怎么测试以确定问题。
我首先尝试在 python 中直接打开原来的数据库:
[PHP]>>> import bsddb
>>> x = bsddb.btopen("/var/mirrord/wmlog"
>>> len(x)
623748
>>> x["6854"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/bsddb/__init__.py", line 223, in __getitem__
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
File "/usr/lib/python2.5/bsddb/dbutils.py", line 62, in DeadlockWrap
return function(*_args, **_kwargs)
File "/usr/lib/python2.5/bsddb/__init__.py", line 223, in <lambda>
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
KeyError: '6854'
>>> x[str(6854)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/bsddb/__init__.py", line 223, in __getitem__
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
File "/usr/lib/python2.5/bsddb/dbutils.py", line 62, in DeadlockWrap
return function(*_args, **_kwargs)
File "/usr/lib/python2.5/bsddb/__init__.py", line 223, in <lambda>
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
KeyError: '6854'
>>> x.first()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/bsddb/__init__.py", line 278, in first
rv = _DeadlockWrap(self.dbc.first)
File "/usr/lib/python2.5/bsddb/dbutils.py", line 62, in DeadlockWrap
return function(*_args, **_kwargs)
_bsddb.DBNotFoundError: (-30990, 'DB_NOTFOUND: No matching key/data pair found')[/PHP]
即便我把 mirrord 停止之后,仍然是这样的错误。
然后,我尝试把数据库拷贝和移动出来,然后打开新的数据库文件:
[PHP]>>> import bsddb
>>> x = bsddb.btopen("/tmp/wmlog")
>>> len(x)
0[/PHP]
长度为 0,getitem 操作和上面报错一样。
为什么把数据文件拷贝出来以后会有这种问题呢?尤其是 len() 的结果为 0?
我只好重新运行 mirrord,重建 BDB 数据文件,到现在没有再遇到这种问题。
不知道这个偶然性的问题是怎么回事?有哪位对 BDB 比较了解的能够赐教一二吗? |
|