MongoDB雑用

10426 ワード

MongoDB雑用。


昨日、オンライン上でmongoが一度故障し、クライアントが接続できなくなったり、クエリーが遅くなったりして、一日中復元できない問題を排除しましたが、この過程でmongoとpymongoについてもっと理解しました.

819接続数


ログを表示すると、次のログが多数表示されます.
Getting connection refused because too many open connections: 819

dbを使用します.serverStatus().接続数を表示するには、次の手順に従います.
> db.serverStatus().connections
{ "current" : 71, "available" : 748 }
current , available 

このエラーの原因は、linuxの各プロセス1024個のファイルハンドル制限によるものです.現在のシステム制限を表示するには、ulimit-nまたはulimit-aを使用します.
ulmit-n 65535を使用すると、現在のsessionのファイルハンドル制限のみが変更され、システムの制限を変更するにはvim/etc/security/limitsが必要です.confは、下りのように追加されます.
*                soft    nofile          65535
*                hard    nofile          65535

mongoのプロファイルもvim/etc/mongodbを変更する必要があります.conf
maxConns=20000 #mongo 20000

ps.linuxシステムはサーバーとして一般的にいくつかの最適化を行う必要があります.ここでは、vim/etc/sysctlの一般的な最適化項目を示します.conf:
net.ipv4.tcp_max_tw_buckets = 819200
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 819200
#net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30

net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 0
net.ipv6.conf.all.disable_ipv6 = 1

vm.swappiness=5

pymongo接続パラメータ


接続数が大きすぎる問題を解決するためにpymongoコードをひっくり返して、2つのオプションを発見して、起点の作用ができます
auto_start_request:Trueに設定すると、MongoClientはスレッドごとにsocketを割り当てます.これは比較的安全で、unacknowledgedが書いた後の読み取りも正しいことを保証します.Falseに設定すると、複数のスレッドがsocketを共有しますが、read-your-own-writes consistencyを保証するために単一のsocket上でシーケンス操作をしたい場合はstart_request/end_request. 詳細は以下を参照してください.http://emptysqua.re/blog/requests-in-python-and-mongodb/
use_Greenlets:Trueの場合、geventを使用する場合、このパラメータをTrue,start_に設定requestは、現在のgreenletが同じsocketを使用することを保証します.

mongostat


mongostatはとても使いやすい監視ツールです
$mongostat
insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn       time
 2      6      3      0       0       6       0  4.44g    13g   772m      0        0          0       0|0     0|0     3k    40k    71   16:12:48
10     13     13      1       0      18       0  4.44g    13g   775m      0      0.3          0       0|0     0|0    46k    29k    71   16:12:49
 6      7      7      0       0      14       0  4.44g    13g   772m      0      0.2          0       0|0     0|0     7k     5k    71   16:12:50
 0      0      0      0       0       1       0  4.44g    13g   772m      0        0          0       0|0     0|0    62b     1k    71   16:12:51
 2      3      3      0       0       6       0  4.44g    13g   772m      0        0          0       0|0     0|0     3k     4k    71   16:12:52
47     32     54      2       0      66       0  4.44g    13g   776m      0      1.1          0       0|0     0|0   422k   160k    71   16:12:53
 0      0      0      0       0       1       0  4.44g    13g   776m      0        0          0       0|0     0|0    62b     1k    71   16:12:54
 8     10     10      0       0      19       0  4.44g    13g   776m      0      0.1          0       0|0     0|0    11k     8k    71   16:12:55
 4      5      5      0       0      10       0  4.44g    13g   776m      0        0          0       0|0     0|0     5k     5k    71   16:12:56
 0      0      0      0       0       1       0  4.44g    13g   776m      0        0          0       0|0     0|0    62b     1k    71   16:12:57

insert/query/update/delete:1秒あたりの挿入/クエリー/更新/削除数
getmore:クエリー時のカーソルのgetmoreオペランド
command:1秒あたりのコマンド数
flush:1秒以内のflushの回数、flushのオーバーヘッドはとても大きくて、もし頻繁にflushならば、原因を調べる必要があるかもしれません
mapped:mmapされたすべてのデータ量、単位はMB
vsize:仮想メモリ使用量
res:物理メモリ使用量
faults:毎秒アクセス失敗数(Linuxのみ)で、データが物理メモリに交換され、swapに格納されます.100を超えないでください.そうしないと、マシンのメモリが小さすぎて、頻繁にswapが書き込まれます.メモリまたは拡張機能をアップグレードする
locked:書き込みロックの占める時間比、この数値が大きすぎる(>10%)場合は注意が必要です
idx miss:インデックスがヒットしない割合です.通常、すべてのクエリはインデックスを通過する必要があります.
qr|qw ar|aw:mongo負荷が高い場合、コマンドが処理に間に合わず、mongoはコマンドをキューに入れます.qr|qwリード/ライト待ちキュー長ar|aw実行リード/ライト操作クライアント数
NetIn/netOut:出入りネットワーク帯域幅
conn:現在の接続数

mongo command


索引の表示/作成/削除
db.collection.getIndexes();
db.collection.ensureIndex({x: 1})
db.collection.dropIndexes();
db.collection.dropIndex({x: 1})

バックグラウンドでインデックスを作成する(オンライン・データベースにインデックスを付けると、通常のアプリケーションに影響を与えないようにする)
db.collection.ensureIndex({x: 1, y: 1}, {background: true});

インデックスの再構築(collectionサイズが大きく変更されたり、インデックスがスペースを消費しすぎたりした場合に実行)
db.collection.reIndex();

データベース情報の表示
db.stats();

サーバのステータス
db.serverStatus();

mongodbが現在実行中の操作
db.currentOp()

もしあなたが操作が長すぎてデータベースをカードで殺すことに気づいたら、このコマンドで彼を殺すことができます.
db.killOp("xxxx")

mongonメモリ


mongoは有名なメモリを食べて、空間の破片の問題は深刻で、今のところ良い方法はありません.
dbを使ってもいいです.repaireDatabase()はデータベースを整理して、とても遅くて、オンラインシステムは使いません.
システムメモリの表示
free -m
             total       used       free     shared    buffers     cached
Mem:         15793       6879       8913          0        385       4102
-/+ buffers/cache:       2391      13401
Swap:         8183          0       8183

linuxで使用可能なメモリの計算方法はfree+buffers+cachedで、実際の使用メモリはused-buffers-cachedです.
MongoDBはメモリマッピングストレージエンジンを使用しており、データファイルをメモリにマッピングし、読み取り操作であればメモリ中のデータをキャッシュする役割を果たし、書き込み操作であればメモリはランダムな書き込み操作を順番の書き込み操作に変換することができ、とにかく性能を大幅に向上させることができる.MongoDBはメモリ管理の仕事に干渉するのではなく、これらの仕事をオペレーティングシステムの仮想メモリマネージャに残して処理するメリットは、MongoDBの仕事を簡素化することですが、悪いところは、MongoDBがどれだけのメモリを占めているかを簡単に制御する方法がありません.幸いなことに、仮想メモリマネージャの存在は私たちに多くの場合、この問題に関心を持つ必要はありません.
メモリ関連の詳細は次のとおりです.http://huoding.com/2011/08/19/107