サイバーエージェントを支える技術者たち

第25回 MongoDB最前線! 効果的なシャーディングとバックアップ

この記事を読むのに必要な時間:およそ 3 分

シャードを追加するタイミングには注意すべき

シャーディングを利用していれば,新たなサーバを利用してシャードを追加し,パフォーマンスを引き上げるといったことができます。そこで気になるのは,どの程度簡単にシャードを追加できるのかというところではないでしょうか。この点について並河氏は,⁠MongoDBはシャードの追加がオンラインですごく手軽にできます。サーバさえあればパフォーマンスを向上できるのはすごく便利ですね」と評価します。ただ,シャードを追加するタイミングは注意すべきだと話すのは桑野章弘氏です。

桑野章弘氏

桑野章弘氏

「一時的にロックがかかるなど,シャードの追加にはそれなりのリソースを消費します。そのため,状況によっては若干レスポンスが低下してしまうといったことも起こりえるので注意が必要ですね。どうしてもすぐにシャードを追加したいといった場合,あるいは1シャードや2シャード程度であればオンラインで追加してしまいますが,30~40シャードを一気に追加するといった場合はメンテナンスに合わせて対応するほうが望ましいですね」⁠桑野氏)

ちなみにMongoDBのモニタリングには,サーバの監視などに使われているMuninにMongoDB用のプラグインを追加して利用しているとのこと。これにより,たとえばロックの頻度などといった数値をグラフ化してチェックすることが可能になります。

可用性やスケールアウトの点で構築/運用の手間を省けるMongoDB

MySQLなどを運用する際,用途などに応じてパラメータの内容を検討しておくといった作業は極めて重要でしょう。では,MongoDBではどうなのでしょうか。

「まったく必要ないわけではありませんが,MySQLのようにバッファのキャッシュ量を調整するといった細かな設定を考えることはありません。最初に設定するのはジャーナリングのオン/オフと,シャードのチャンクサイズ,サーバ間でレプリケーションを行うために使われるOplog(オペレーションログ)の大きさくらいです。ただ,Oplogの大きさについてはデフォルト値で特に困ったことはないので,特に修正していません」⁠桑野氏)

では,MySQLと比べて運用の手間はどの程度違うのでしょうか。その点について伺ったところ,冗長性の確保やスケールアウトの手間が省けるという答えが返ってきました。

「MySQLの場合,可用性を担保するために冗長構成を考えておく必要がありますが,MongoDBであればレプリカセットのしくみを使えば済んでしまうので,そういう意味ではMongoDBのほうが楽ですね。また,シャーディングのしくみが最初から用意されているのも大きなポイントだと思います」⁠桑野氏)

ただ,その一方でこなれていない部分もあると言います。具体的に指摘されたのはMongoDBにアクセスするためのドライバの安定性です。

「ドライバのバージョンを上げたところ,データを正常に取得できなくなるなどのトラブルに遭遇しました。ドライバの完成度はけっこうネックになるイメージです」⁠桑野氏)

トラブル発生時の手戻りへの対処がバックアップ検討のポイント

そのほか運用上で苦労する点として挙げられたのは,トラブル発生時に正常な状態まで戻すといったことを行うためのしくみがないことです。

「MySQLのバイナリログのようなものがないので,特定のポジションに戻れないのが厳しいという場面はあります。単純にバックアップであればmongodumpコマンドなどを使えばデータファイルをすべて取得できるのですが,障害が発生したので1時間前の状態に戻す,といったことはできないわけです」⁠桑野氏)

mongodumpコマンドを利用すればオンラインでバックアップを取得できるなど,通常のフルバックアップであれば苦労することはないと言います。ただ,バックアップポリシーについては,試行錯誤が続いているようです。

「最初は1日1回の間隔でバックアップを行っていたのですが,そうするとトラブルが発生した際に最大で1日前の状態にまで戻ってしまうことになります。それはやはり厳しいということで,トラブル発生の直前の状態には戻せなくても,たとえば2~3時間前には戻せるといった形にしようと考えています」⁠桑野氏)

画像

MongoDBを運用するうえで知っておきたいポイント

そのほか,苦労した点として松下氏が話すのはドキュメントの問題です。

「バージョンによって機能が違うため,たとえばドキュメントを参照してトラブルに対応しようとしても,前提となるMongoDBのバージョンが違っていて役に立たなかったといったことがありました。また,気が付いたらドキュメントの内容が変わっていたということもあるので,たまに見直しています」⁠松下氏)

オペレーションミスが思わぬトラブルに発展することもあるようです。松下氏が経験したのは,サーバによってディレクトリ構成が異なり,リカバリしようとしたところ,データがロストした状態で復旧されてしまったというもの。バックアップを取得していたため大きな問題にはならなかったようですが,なかなか気付きにくい点だけに注意が必要ではないでしょうか。

またシャーディングの機能においても,サーバの設定を間違えるとリカバリが効かないなど,⁠オペレーションミスしたときのダメージが大きい」と話すのは桑野氏。こうした運用上のミスをカバーするようなしくみの追加は,MongoDBの今後のバージョンアップにおいて期待されるところではないでしょうか。

このように注意すべき点がある一方,やはりシャーディングやレプリカセットのしくみが最初から提供されているのは,MongoDBの大きな強みでしょう。またアプリケーションの開発においても,スキーマレスで利用できる柔軟性の高さは魅力的です。今後,新たなデータストアとしてMongoDBが広まっていく可能性はやはり高そうです。

サイバーエージェント公式エンジニアブログ
URL:http://ameblo.jp/principia-ca
エンジニアの生の声を週替わりでお届け中!

著者プロフィール

川添貴生(かわぞえたかお)

株式会社インサイトイメージ代表取締役。企業サイトの構築及び運用支援のほか、エンタープライズ領域を中心に執筆活動を展開している。

メール:mail@insightimage.jp