Carpe Diem

備忘録

MongoDB

MongoDB AtlasでContinuous Cloud Backupを有効化してRPOを小さくする

概要 MongoDB AtlasではContinuous Cloud Backupという機能を用いることでRPO(Recovery Point Objective)を1分にすることが可能です。 Dedicated Cluster Backups — MongoDB Atlas その他のストレージやデータベースではPoint in Time Recover/Restoreとい…

SCRAM (Salted Challenge Response Authentication Mechanism) 認証

概要 MongoDBやPostgreSQLでは認証時にSCRAM (Salted Challenge Response Authentication Mechanism) と呼ばれる認証方式を採用しています。 これは従来のチャレンジレスポンス型の認証を改善したものであり、パスワード(ハッシュ値含む)といった機密情報…

マイグレーションデータの完全性をチェックする方法

概要 オンプレからクラウドに移行(マイグレーション)した場合や、クラウド上でセルフホスティングしていたDBをマネージドDBに移行した場合に問題となるのが「データは欠損なく移行されたか」です。 データの数が少なければプログラミングで差分チェックな…

GoでネストしたMongoDBドキュメントの部分更新をする

概要 MongoDBが使っているbsonはomitemptyというstructタグが利用可能で、これを使うことでそのフィールドがzero値の際は insert時にフィールドを追加しない(容量の削減) update時にフィールドを更新しない(部分アップデートの簡易化) といったメリット…

MongoDBでindexを整理する際に使ったコマンド

概要 MongoDBで使っていないindexを整理する際に使ったコマンドのチートシートです。 バックアップ用途の吐き出しコマンドとスプレッドシートで確認しやすくするためのコマンドを主に書きます。 環境 MongoDB v3.6.23 コマンド 以下にそれぞれのケースでのス…

MongoDB Causal Consistency Session

概要 MongoDB Write Concern - Carpe Diem MongoDB Read Concern - Carpe Diem でデータの耐久性・一貫性・分離性・最新性などを保証する方法について説明しました。 しかし、これらの設定だけでは Causal Consistency - Carpe Diem で紹介した因果関係の一…

MongoDB Read Concern

概要 前回 MongoDB Write Concern - Carpe Diem にてWrite Concernについて説明しました。 今回はRead Concernについて説明します。Read Concernはデータの分離性・一貫性・最新性を考慮する際に気をつけるべき設定です。 環境 MongoDB 3.6+ 前提知識 Point-…

MongoDB Write Concern

概要 MongoDBはデータがどこまで書き込まれたらクライアントにackを返すかという設定ができます。 その設定をWrite Concernといい、メモリまで保存されたのかディスクまで保存されたのか・何台のデータノードにデータが書き込まれたらといった指定が可能です…

MongoDB 4.2でシャーディング・レプリカセットのクラスタ構築

概要 気づいたらMongoDBも4.2になっていました。 以前に DockerでMongoDBのレプリカセットを構築 - Carpe Diem でレプリケーションを、 MongoDBでシャーディング - Carpe Diem でシャーディングを構築しましたが、設定項目が代わっていたりしたので復習がて…

EmbulkでMongoDBのデータをBigQueryへ

概要 ユーザの行動ログで利用しているデータがDBにあるので、それをまるっとBigQueryへ書き込む方法をEmbulkを使って説明します。 BigQueryにマスタデータを保存する理由は? 単純に行動ログに保存される関連データがIDのみで保存されていると、詳細が知りた…

MongoDBでJumboフラグのついたチャンクの分割

概要 シャード構成のMongoDBがチャンクの分割に失敗し、一定サイズを超えるとjumboというフラグが付きます。 普通の環境ではそうそう起きませんが、大量のドキュメントを扱っているとたまに発生します。 今回はそれの解消方法を紹介します。 環境 MongoDB 3.…

B TreeとB+ Treeの違い

概要 インデックスに対してMongoDBはB Treeを採用し、MySQLのInnoDBはB+ Treeを採用しています。 どうして採用しているアルゴリズムが違うのだろう?と思って調べてみました。 主な違い B+ TreeはほとんどB Treeと同じですが、以下の点が異なります。 リーフ…

負荷が低いのにアクセスを捌けきれない時の対応

概要 MongoDBでCPU使用率やロードアベレージが高くないのに処理が詰まっている現象が起きました。 その時間にbatchが動いていてアクセスが急に増えることが原因と言うのは分かっているのですが、負荷的には十分余裕があり不思議な状態でした。 そこでdstatで…

MongoDBのデータをElasticsearchにリアルタイム同期

概要 以前はMongoRiverを使う - Carpe Diemで紹介したようにRiverという機能を使って同期を実現させていました。 しかしながらElasticsearchがRiverを廃止することを決め、バージョン2.x以降は使うことができなくなりました。 そこで調べてみて挙がったのは…

DockerでMongoDBのレプリカセットを構築

概要 MongoDBのレプリカセットを組んで検証する必要があったのでdockerを使って構築することにしてみました。 環境 Docker 1.12.0 Mongo 3.2.9 構成 コンテナ名 役割 ホスト側ポート mongo1 Primary 30001 mongo2 Secondary 30002 arbiter Arbiter。データは…

MongoDBのAggregationとSQLの比較

概要 MongoDBのAggregationとSQLとの比較です。 どうやって集計するかな?と悩んだ時に慣れているSQLとの比較があると分かりやすいと思って公式ドキュメントに沿った形で載せてます。 環境 MongoDB 3.0.7 オペレータの比較 SQL MongoDB WHERE $match GROUP B…

MongoDB 3.0 での explain

概要 MongoDB 3.0 からexplainの結果が大きく変わりました。 スロークエリを調べる上で、インデックスの使用、外部ソートの使用などをどこで確認するかをまとめてみました。 環境 Ubuntu 14.04 MongoDB 3.0.4 大まかな構造(全体) > db.users.find({name: "…

MongoDBのインデックス2

概要 MongoDBのインデックスにはIndex IntersectionやCovered Indexなんてのもあるので調べてみました。 環境 Ubuntu 14.04 MongoDB 2.6.8 Index Intersectionとは 1つのクエリーで2つのインデックスを使ってくれる機能で、より効率的にクエリーを処理でき…

MongoDB 3.0 をインストール

概要 3.0がリリースされたのでインストール方法をメモ。 Warningを消すのがちょっと面倒です。 環境 Ubuntu 14.04 MongoDB 3.0.0 インストール $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 $ echo "deb http://repo.mong…

MongoDBのインデックス

概要 MongoDBのインデックスをつける上で 複合インデックスの時はインデックスの順番に気をつける {a: 1, b: 1}の反対{a: -1, b: -1}は使えるけど{a: 1, b: -1}は使えない などいろいろ気をつける点が多く、一度しっかり学んでみましたのでそのメモ。 基本的…

MongoDBでシャーディング

概要 MongoDBでシャーディングを構築します。 MongoDBのインストールですでにインストールしている前提で進めます。 環境 Ubuntu 14.04 MongoDB 2.6.7 今回は1台でポートを別にして複数プロセスで構築します。 configサーバは1 or 3台必要(2だとサポー…

MongoRiverを使う

概要 MongoDBのデータをElasticSearchに流し込むMongoDB River Pluginを扱います。 あるデータに対して検索機能を追加したいけど、MongoDBで全文検索はちょっと。。という時に便利です。 環境 Ubuntu 14.04 MongoDB 2.6.7 Java 1.8.0_31 ElasticSearch 1.4.2…

MongoDBでTTL

概要 TTL(Time To Live)という自動でデータを消す仕組みを利用します。 データによっては「過去xx日までは必要だけどそれ以降は不要」みたいなものがあると思います。 例えばログなど。 そういったものに対して使えます。 環境 Ubuntu 14.04 MongoDB 2.6…