MongoDB的三台构建复制集的故障修复经历
首先
只是我自己的经验,所以并不适用于所有情况,请您理解。
如果本文中出现了错误术语等,请谅解。
这个故事的背景
背景
他社で作成されたスマートフォンアプリを移譲されることになり、それに伴う形でレプリケーション3台構成のMongoDB(PRIMARY×1台、SECONDARY×2台)の管理が必要となったことから解析作業を依頼された。
環境
AWS上のLinuxに構築された上記MongoDBの入った3台のサーバ(本番環境と呼称)を、さらにコピーしてデプロイされた検証環境。
本番環境の設定を持ったままIPアドレスの異なるサーバとしてデプロイされたためレプリケーションがぶっ壊れた。(多分)
筆者
この作業を依頼された時点でMongoDBの知見は一切ない。
今もあんまりない。
问题困扰
-
- DB内の情報を検索することができない。
- Mongoシェルにてdb.XXX.findで検索をかけた際に下記のようなエラーメッセージが出力された。
Error: error: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotPrimaryNoSecondaryOk"
}
从这里开始,他们推测出“复制似乎出现了故障”,并开始了调查。
在Mongo Shell中输入rs.conf()后,确实发现了被注册为当前服务器不同的IP地址作为主机。
-
- 全サーバが「OTHER」になっており、レプリカセットを編集できない。
-
- 「レプリカセットの修正が必要そうだ」というところまではなんとか漕ぎつけたものの、レプリカセットの編集にはPRIMARYの権限が必要であるため修正ができない。
- サーバ側のIPアドレスを変えようにもレプリカセットに設定されているIPアドレスは本番環境が保有し稼働し続けていたため奪取できなかった。
做过的事情 (zuò guò de shì
-
- 現在のレプリカセットを削除した
- レプリカセットの設定を削除するため、本来PRIMARYとなるサーバ(以下Pサーバ)にて/etc/mongod.confに記載されていた下記2行をコメントアウト。
replication:
replSetName: "XXX"
再說明一次,在執行 “systemctl restart mongod” 命令重新啟動 MongoDB 後,使用 “mongo” 命令啟動 mongo shell,並刪除本地剩餘的複製集設定。
> use local;
> db.dropDatabase();
顺便提一句,当启动mongo shell时,OTHER的显示已经消失了。
删除副本集后,使用exit退出mongo shell,然后再次使用systemctl restart mongod命令重启MongoDB。
请参考以下文章。
-
- 今のIPアドレスをレプリカセットとして登録した
-
- Pサーバにて先程修正した/etc/mongod.confを再度修正し、追加したコメントアウトを解除した。
- その後再度mongoシェルを起動し、下記コマンドでレプリカセットの設定を投入した。
> config = { _id : "example01",members: [{ _id: 0, host: "XXX.XXX.XXX.XXX:27017" },{ _id: 1, host: "XXX.XXX.XXX.YYY:27017" },{ _id: 2, host: "XXX.XXX.XXX.ZZZ:27017" },]}
此外,还将之前所有的工作应用到了作为第二组(以下简称S1服务器和S2服务器)的两台服务器上。
在P1服务器的mongo shell中执行以下命令,如果成功,则会显示PRIMARY>或SECONDARY>。(可能)
> rs.initiate(config)
{ "ok" : 1 }
-
- 念のためS1・S2サーバのMongoDBを再起動
-
- PサーバをPRIMARYに、S1・S2サーバをSECONDARYとするためにS1・S2サーバそれぞれでsystemctl stop mongodコマンドを実行し一旦両方のMongoDBが停止している状態にした。
-
- その後、S1サーバ→S2サーバの順にsystemctl start mongodコマンドでMongoDBを起動させた。
- 正直この作業は不要だったかもしれない。
這是一個附帶提到的事情。
有时在使用`systemctl start mongod`命令或`systemctl restart mongod`命令启动或重启MongoDB时,可能会遇到错误并无法启动。
有时,当重新启动失败时,通过按顺序执行systemctl stop mongod命令和systemctl start mongod命令可以使其正常运行。
另外,如果systemctl start mongod命令无法运行,可以通过删除/tmp/mongodb-27017.sock文件使其正常工作。
据说,如果这个文件在MongoDB启动时被创建并在停止时被删除,那么如果它保留下来没有被删除,MongoDB就无法启动。
据说,如果在启动mongo shell时误将mongo命令与mongod命令混淆执行,就会创建这个文件。
最终
在一个带有「既然是测试环境,就算彻底搞乱也没问题,请尽情操作」这个评论的环境中,我们正在进行使用过程中的讨论。虽然一开始动起来后数据库内的搜索功能似乎正常运行,所以应该没问题,但我真的觉得这样就可以了吗?总之,不知道为什么它正在运行。有点可怕。