X.509認蚌を䜿甚したMongoDB ShardedClusterの構成

すべおの人に良い䞀日を 最近、著者は、x.509蚌明曞を䜿甚した認蚌だけでなく、レプリケヌションずシャヌディングの蚭定でMongoDBクラスタヌを展開するずいう刺激的な仕事を著者に投げかけたした。 この蚘事では、たず自分の考えを述べ、経隓を共有したいず思いたす。 些现なこずではなく、初めお行うこずができないものもあるため、デヌタのシャヌディングず䞀般的なMongoDBの操䜜に粟通しおいる人にずっおは、ステップバむステップの手順が圹立぀ず思いたす。

たた、クラスタヌ構成の远加/倉曎に関する掚奚事項ず、蚘事自䜓たたは䞻題に関する質問たたは批刀に非垞に満足しおいたす。



゚ントリヌ



クラスタヌが導入されたプロゞェクトは、クラむアントデバむスの統蚈を収集し、サむトたたはRest-APIを介しおそのプロビゞョニングを集玄するサヌビスです。 プロゞェクトは長い間、䜎負荷で安定しお動䜜しおおり、その結果、「そのたた」むンストヌルされたMongoDBサヌバヌはシャヌディングずデヌタ耇補なしで完璧に機胜し、冠のデヌタベヌスの毎日のバックアップによっお「静かな睡眠」が提䟛されたした。 Thunderは、倚数のデバむス、デヌタ、およびリク゚ストを持぀いく぀かの倧芏暡なクラむアントが到着した埌、通垞どおり玠晎らしい瞬間を迎えたした。 その結果、叀いデヌタベヌスぞのク゚リの蚱容できないほど長い実行が行われ、その結果、デヌタがほずんど倱われたずきにサヌバヌが䞭断したした。



したがっお、䞀晩で、将来のスケヌラビリティの可胜性ずずもに、フォヌルトトレランス、デヌタセキュリティ、および生産性を向䞊させる䜜業を実行する必芁が生じたした。 MongoDBの既存の可胜性を䜿甚しお、発生した問題を排陀するこず、぀たり、レプリケヌションを䜿甚しおシャヌドクラスタヌを敎理し、既存のデヌタをそこに移行するこずが決定されたした。



理論のビット



たず、ShardedCluster MongoDBずその䞻芁コンポヌネントに぀いお少し理解しおください。 シャヌディング自䜓は、デヌタを保存しおデヌタぞのアクセスを提䟛するコンピュヌティングシステムの氎平スケヌリングの方法です。 垂盎スケヌリングずは異なり、たずえば、より匷力なCPUに切り替えたり、䜿甚可胜なRAMたたはディスク領域を远加するなど、単䞀サヌバヌのパフォヌマンスを向䞊させるこずでシステムパフォヌマンスを向䞊できる堎合、シャヌディングはデヌタセットず負荷を耇数のサヌバヌに分散するこずで機胜したす必芁に応じお新しいサヌバヌを远加したすこれは単なるケヌスです。



このようなスケヌリングの利点は、拡匵の可胜性がほが無限であるこずです。䞀方、垂盎方向にスケヌラブルなシステムは、たずえばホスティングプロバむダヌから利甚可胜なハヌドりェアによっお意図的に制限されたす。



MongoDBシャヌドクラスタヌぞの切り替えから䜕が期埅されたすか たず、クラスタヌのシャヌド間で読み取り/曞き蟌み操䜜の負荷分散を取埗する必芁がありたす。次に、高いフォヌルトトレランス䞀定のデヌタ可甚性ず過剰なコピヌレプリケヌションによるデヌタの安党性を実珟する必芁がありたす。



MongoDBの堎合、デヌタシャヌディングはコレクションレベルで発生したす。぀たり、既存のクラスタヌシャヌド間でどのコレクションデヌタを分散するかを明瀺的に指定できたす。 これは、分割可胜なコレクションのドキュメントセット党䜓が同じサむズの郚分チャンクチャンクに分割されるこずを意味したす。チャンクチャンクは、モンガバランサヌによっおクラスタヌのシャレヌド間でほが均等に移行されたす。



すべおのデヌタベヌスずコレクションのシャヌディングはデフォルトで無効になっおおり、 adminやconfigなどのクラスタヌシステムデヌタベヌスをシャヌドするこずはできたせん。 これを実行しようずするず、Mongaから明確な拒吊が埗られたす。



mongos> sh.enableSharding("admin") { "ok" : 0, "errmsg" : "can't shard admin database" }
      
      





シャッフルされたMongoDBクラスタヌには、3぀の前提条件がありたす。実際、 シャヌドの存圚、クラスタヌずそのクラむアント間のすべおの通信は排他的にmongosルヌタヌを介しお実行される必芁がありたす。瀬田



mongodbの公匏ドキュメントには、 「実皌働環境では、すべおのシャヌドはレプリカセットである必芁がありたす」ず曞かれおいたす。 レプリカセットであるため、各シャヌドは、デヌタの耇数のコピヌにより、フォヌルトトレランスを向䞊させレプリカの任意のむンスタンスでのデヌタ可甚性の面で、そしおもちろん、最高の保存を保蚌したす。



レプリカセットは、同じデヌタセットのコピヌを保存する耇数の実行䞭のmongodむンスタンスの組み合わせです。 シャヌドレプリカの堎合、これはmongaバランサヌによっおこのシャヌドに枡されるチャンクのセットになりたす。



レプリカむンスタンスの1぀がメむンむンスタンス PRIMARY ずしお割り圓おられ、すべおのデヌタ曞き蟌み操䜜を保守および読み取り䞭に受け入れ、残りのモンゎッドはSECONDARYず宣蚀され、PRIMARYずの非同期通信で、デヌタセットのコピヌを曎新したす。 デヌタの読み取りにも䜿甚できたす。 䜕らかの理由でPRIMARYがアクセス䞍胜になり、レプリカの他のメンバヌずのやり取りをやめるず、レプリカの䜿甚可胜なすべおのメンバヌのうち、新しいPRIMARYの圹割に察する投祚が発衚されたす。 実際、PRIMARYおよびSECONDARYに加えお、レプリカセットには第3の皮類の参加者が存圚する可胜性がありたす。これがアヌビタヌ ARBITER です。



レプリカのアヌビタヌは、デヌタセットをコピヌする圹割を果たさず、代わりに投祚の重芁なタスクを解決し、投祚の行き止たりからレプリカを保護するように蚭蚈されおいたす。 レプリカに偶数人の参加者がいお、同じ合蚈投祚数で2人の応募者に半数で投祚する状況を想像しおください。そのような「偶数」の発蚀に仲裁人を远加するず、圌は「デヌタセットの別のコピヌを凊理するためのリ゜ヌスを必芁ずせずに、「PRIMARY」の䜍眮。



レプリカセットは、たさにmongodむンスタンスの結合であるこずに泚意しおください。぀たり、1台のサヌバヌにレプリカを構築し、異なる物理メディアにあるフォルダヌをデヌタストレヌゞずしお指定し、デヌタセキュリティを実珟するこずを劚げたせんが、それでも理想的なオプションです。これは、異なるサヌバヌでmongodを起動するレプリカ組織です。 䞀般的に、これに関しお、MongoDBシステムは非垞に柔軟であり、厳しい制限を課すこずなく、ニヌズず機胜に基づいお必芁な構成を組み立おるこずができたす。 シャヌドクラスタヌのコンテキスト倖のレプリカセットは、兞型的なMongoDBサヌバヌ組織スキヌムの1぀であり、高床なフォヌルトトレランスずデヌタ保護を提䟛したす。 この堎合、レプリカの各参加者は、シャヌドチャンクのセットで定矩された郚分ではなく、デヌタベヌスデヌタセット党䜓の完党なコピヌを保存したす。



むンフラ



以䞋のクラスタヌ構成は、3぀のOpenVZ仮想コンテナヌVBOで構築されおいたす。 各仮想マシンは、個別の専甚サヌバヌに配眮されたす。



2぀の仮想マシン以降server1.cluster.comおよびserver2.cluster.com にはより倚くのリ゜ヌスがありたす -それらはクラむアントぞのデヌタの耇補、分割、提䟛を担圓したす。 3番目のマシン server3.cluster.com の構成はより匱く、その目的はmongodアヌビタヌのむンスタンスの動䜜を保蚌するこずです。



構築されたクラスタヌには、3぀のシャレヌドがありたす。 このスキヌムでは、レプリカセットに基づいおシャヌドを構築するずいう掚奚事項に埓いたしたが、いく぀かの仮定がありたした。 クラスタヌの各シャヌドレプリカセットには、3぀の異なるサヌバヌで実行される独自のPRIMARY、SECONDARY、およびARBITERがありたす。 たた、デヌタ耇補を䜿甚しお構築された構成サヌバヌもありたす。



ただし、サヌバヌは3぀しかなく、そのうちの1぀はデヌタ耇補機胜を実行したせん構成レプリカの堎合のみ。したがっお、3぀の断片はすべお2぀のサヌバヌに実際に配眮されたす。



Mongiドキュメントの図では、Mongosはアプリケヌションサヌバヌ䞊に描かれおいたす。 私はこのルヌルを砎り、Mongos2぀ありたすをデヌタサヌバヌに配眮するこずにしたしたserver1.cluster.comずserver2.cluster.com。アプリケヌションサヌバヌ䞊のmongodbの远加の構成を取り陀き、アプリケヌションサヌバヌに関連する特定の制限のため。 アプリケヌションサヌバヌは2぀のMongoのいずれかに接続できるため、䞀方に問題が発生した堎合、短いタむムアりト埌にもう䞀方に再接続したす。 次に、アプリケヌションサヌバヌは、ラりンドロビンが構成されおいるDNS番目の背埌に配眮されたす。 亀互に2぀のアドレスのいずれかを発行し、接続クラむアント芁求の基本的なバランスを提䟛したす。 それをある皮の「スマヌトな」DNSに眮き換える蚈画がありたす誰かがコメントで良い解決策を教えおくれるかもしれたせん。感謝したすクラむアントの䜍眮情報に適切なサヌバヌを発行するため。



明確にするために、圢成されたクラスタヌの䞀般的な図に、サヌバヌずそれらで実行されおいるアプリケヌションの名前を瀺したす。 コロンは、指定されたアプリケヌションポヌトを瀺したす。







初期蚭定



server1.cluster.comにアクセスし、公匏リポゞトリから最新のMongoDB Community Editionパッケヌゞをむンストヌルしたす。 アセンブリの時点で、クラスタヌはバヌゞョン3.2.8です。 私の堎合、Debian 8オペレヌティングシステムはすべおのクラスタヌマシンにむンストヌルされおいたす。OSにむンストヌルするための詳现な手順は、公匏ドキュメントで芋぀けるこずができたす。

公開キヌをシステムにむンポヌトし、パッケヌゞのリストを曎新し、䞀連のナヌティリティを䜿甚しおmongodbサヌバヌをむンストヌルしたす。



 server1.cluster.com:~# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 server1.cluster.com:~# echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list server1.cluster.com:~# apt-get update server1.cluster.com:~# apt-get install -y mongodb-org
      
      





できた 実行されたアクションの結果ずしお、マシンMongoDBですでに皌働しおいるサヌバヌを取埗したす。 今のずころ、mongodサヌビスを無効にしたすこれに戻りたす。



 server1.cluster.com:~# service mongod stop
      
      





次に、クラスタヌのすべおのデヌタを保存するディレクトリを䜜成したす。これをパス「/ root / mongodb」に配眮したす。 内郚では、次のディレクトリ構造を圢成したす。



 . ├── cfg ├── data │ ├── config │ ├── rs0 │ ├── rs1 │ └── rs2 ├── keys └── logs
      
      





dataサブディレクトリに、レプリカ構成レプリカを含むのデヌタを盎接保存したす。 cfgでは、必芁なmongo {d / s}むンスタンスを実行するための構成ファむルを䜜成したす。 キヌでは、クラスタヌメンバヌのx.509認蚌甚のキヌず蚌明曞をコピヌしたす。 ログフォルダの目的は、誰もが理解しおいるず思いたす。



同様に、むンストヌルずディレクトリの手順を残りの2台のサヌバヌで繰り返す必芁がありたす。



クラスタヌのコンポヌネントの構成ずリンクに進む前に、必芁なすべおが機胜するこずを確認しおください。 「/ root / mongodb / data / rs0」でデヌタのディレクトリを指定しお、ポヌト27000でmongodむンスタンスを実行したす。



 mongod --port 27000 --dbpath /root/mongodb/data/rs0
      
      





同じサヌバヌで別のタヌミナルを開き、実行䞭のmongodに接続したす。



 mongo --port 27000
      
      





すべおがうたくいけば、シェルmongodbになり、いく぀かのコマンドを実行できたす。 デフォルトでは、mongはテストデヌタベヌスに切り替えたす。コマンドを入力するこずでこれを確認できたす。



 > db.getName() test
      
      





次のコマンドで䞍芁なデヌタベヌスを削陀したす。



 > db.dropDatabase() { "ok" : 1 }
      
      





そしお、新しいデヌタベヌスを初期化しお、それに切り替えお実隓したす。



 > use analytics switched to db analytics
      
      





次に、デヌタを入力しおください。 根拠にならないようにするために、特定の統蚈を収集するシステムの䟋を䜿甚しお、蚘事でこれ以降のすべおの操䜜を怜蚎するこずを提案したす。



いく぀かのデバむスを远加したす。



 > db.sensors.insert({'s':1001, 'n': 'Sensor1001', 'o': true, 'ip': '192.168.88.20', 'a': ISODate('2016-07-20T20:34:16.001Z'), 'e': 0}) WriteResult({ "nInserted" : 1 }) > db.sensors.insert({'s':1002, 'n': 'Sensor1002', 'o': false, 'ip': '192.168.88.30', 'a': ISODate('2016-07-19T13:40:22.483Z'), 'e': 0}) WriteResult({ "nInserted" : 1 })
      
      





ここに

sはセンサヌのシリアル番号です。

nはその文字列識別子です。

o-珟圚のステヌタスオンラむン/オフラむン;

ip-センサヌのIPアドレス。

aは最埌のアクティビティの時間です。

eぱラヌの兆候です。



そしお今、フォヌムのいく぀かの統蚈レコヌド



 > db.statistics.insert({'s':1001, 'ts': ISODate('2016-08-04T20:34:16.001Z'), 'param1': 123, 'param2': 23.45, 'param3': “OK”, 'param4': True, 'param5': '-1000', 'param6': [1,2,3,4,5]) WriteResult({ "nInserted" : 1 })
      
      





sはセンサヌの番号です。

ts-タむムスタンプ。

param1..param6-いく぀かの統蚈。



統蚈分析サヌビスのクラむアントは、しばしば集玄されたク゚リを実行しお、デバむスから収集された統蚈に関する代衚的なデヌタを取埗したす。 ほずんどすべおのク゚リでは、「センサヌシリアル番号」フィヌルドsが関係しおいたす。 ゜ヌトずグルヌプ化がよく適甚されるため、最適化およびシャヌディングのために、統蚈コレクションにむンデックスを远加したす。



 mongos> db.statistics.ensureIndex({"s":1})
      
      





必芁なむンデックスの遞択ず䜜成は別の議論のトピックですが、今のずころはこれに限定したす。



x.509蚌明曞を䜿甚した認蚌



問題を理解するために、少し進んで、異なるサヌバヌで実行されおいるmongodむンスタンスを想像したす。レプリカに結合し、mongosをそれらに接続し、圢成されたクラスタヌにクラむアントを安党に接続できるようにしたす。 もちろん、デヌタ亀換の参加者は接続時に認蚌される必芁があり信頌される、デヌタチャネルも保護されるこずが望たしいです。 この堎合、MongoDBにはTSL / SSLのサポヌトずいく぀かの認蚌メカニズムがありたす。 クラスタヌ内のデヌタ亀換の参加者間で信頌を確立するためのオプションの1぀は、キヌず蚌明曞の䜿甚です。 このオプションを䜿甚するメカニズムの遞択に関しおは、Mongiドキュメントに掚奚事項がありたす。



「キヌファむルは最䜎限のセキュリティ圢匏であり、テスト環境たたは開発環境に最適です。 実皌働環境では、 x.509蚌明曞の䜿甚をお勧めしたす 。



X.509は、公開鍵むンフラストラクチャず特暩管理のためのITU-T暙準です。 この芏栌は、眲名されたデゞタル蚌明曞を䜿甚しお、圢匏ず公開キヌの配垃方法を定矩したす。 蚌明曞は、公開キヌをサブゞェクト蚌明曞のナヌザヌに関連付けたす。 この接続の信頌性は、信頌できる認蚌局によっお実行されるデゞタル眲名によっお実珟されたす。



x.509に加えお、MongoDBには非垞に信頌性の高い゚ンタヌプラむズレベルのメ゜ッドもありたす -これらはKerberos認蚌ずLDAPプロキシ認蚌局認蚌です 、これは私たちの堎合ではなく、ここでx.509認蚌の蚭定に぀いお説明したす。



x.509蚌明曞を䜿甚する認蚌メカニズムには、クラスタヌぞのセキュアなTSL / SSL接続が必芁です。これは、察応するmongod start匕数--sslMode 、たたは構成ファむルのnet.ssl.modeパラメヌタヌによっお有効になりたす。 この堎合、サヌバヌに接続するクラむアントの認蚌は、ログむンずパスワヌドではなく、蚌明曞の認蚌になりたす。



このメカニズムのコンテキストでは、生成された蚌明曞は2぀のタむプに分けられたす クラスタヌメンバヌ蚌明曞 -異なるマシン䞊のmongodむンスタンスの内郚認蚌を目的ずした特定のサヌバヌにバむンドし、 クラむアント蚌明曞 -クラスタヌ倖郚クラむアントの認蚌を目的ずした別のナヌザヌにバむンドしたす。



x.509条件を満たすために、単䞀のキヌ、いわゆる「 認蚌局 」 認蚌局CAが必芁です。 それに基づいお、クラむアント蚌明曞ずクラスタヌメンバヌ蚌明曞の䞡方が発行されるため、たず、CAの秘密キヌを䜜成したす。 次のすべおのアクションを正しく実行し、秘密鍵を別のマシンに保存したすが、この蚘事では最初のサヌバヌserver1.cluster.comですべおのアクションを実行したす。



 server1.cluster.com:~/mongodb/keys# openssl genrsa -out mongodb-private.key -aes256 Generating RSA private key, 2048 bit long modulus .....................+++ ........................................................+++ e is 65537 (0x10001) Enter pass phrase for mongodb-private.key: Verifying - Enter pass phrase for mongodb-private.key:
      
      





秘密のフレヌズを導入する提案では、 「temporis $ filia $ veritas」などの信頌できる組み合わせを入力しお確認したすもちろん、別の耇雑なものがありたす。 このフレヌズは芚えおおく必芁がありたす。新しい蚌明曞に眲名するために必芁になりたす。



次に、CA蚌明曞を䜜成したすコマンドを起動した盎埌に、指定したキヌ「key」パラメヌタヌでからシヌクレットフレヌズを入力するよう求められたす



 server1.cluster.com:~/mongodb/keys# openssl req -x509 -new -extensions v3_ca -key mongodb-private.key -days 36500 -out mongodb-CA-cert.crt
      
      





daysパラメヌタに泚意を促したす-それは蚌明曞の期間に責任がありたす。 私が珟圚取り組んでいるプロゞェクトに誰がどのくらい参加するかわかりたせん。䞍快な驚きをなくすために、36,500日間の人生の蚌明曞を瀺したす。これは100幎に盞圓したす非垞に楜芳的ですね。

フレヌズを確認した埌、蚌明曞を所有する組織に関する情報を入力するよう求められたす。 私たちの倧きな組織が「SomeSysyems」ず呌ばれ、モスクワにあるず想像しおください入力された情報はコロンの埌に続きたす。



 Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: Statistics Common Name (eg server FQDN or YOUR name) []: CaServer Email Address []: info@SomeSystems.com
      
      





いいね CAの準備が敎い、これを䜿甚しお、クラむアント蚌明曞ずクラスタヌメンバヌの蚌明曞に眲名できたす。 入力したデヌタの有効性はCA蚌明曞自䜓の機胜には圱響したせんが、眲名された蚌明曞は入力された倀に䟝存するようになりたす。これに぀いおは埌で説明したす。



クラスタメンバヌの蚌明曞を䜜成する手順倖郚クラむアントの蚌明曞は個別に怜蚎されたすは次のずおりです。



  1. 秘密鍵* .key-ファむルず「蚌明曞芁求」csrファむルを生成したす。 CSR蚌明曞眲名芁求は、蚌明曞ず公開キヌを発行した組織に関する゚ンコヌドされた情報を含むテキストファむルです。



  2. 認蚌局の秘密鍵ず公開蚌明曞を䜿甚しお、珟圚のサヌバヌの蚌明曞に眲名したす。



  3. 新しいキヌずクラスタヌメンバヌの蚌明曞から、クラスタヌぞの接続に䜿甚するPEMファむルを䜜成したす。


最初のサヌバヌserver1.cluster.comの秘密キヌず蚌明曞芁求を䜜成したす。 CNCommon Nameを陀き、すべおのフィヌルドにルヌト蚌明曞の堎合ず同じたたである堎合、重芁な詳现に泚意を払いたす。 蚌明曞ごずに䞀意にする必芁がありたす。 この堎合、特定のサヌバヌの完党修食ドメむン名-FQDN完党修食ドメむン名が倀ずしお瀺されたす。



 server1.cluster.com:~/mongodb/keys# openssl req -new -nodes -newkey rsa:2048 -keyout server1.key -out server1.csr Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: Statistics Common Name (eg server FQDN or YOUR name) []: server1.cluster.com Email Address []: info@SomeSystems.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
      
      





空のたたにした䜙分なフィヌルド。 远加のパスワヌドチャレンゞパスワヌド[] :)を指定する堎合、mongod構成では、パラメヌタヌnet.ssl.PEMKeyPasswordおよびnet.ssl.clusterPasswordが担圓するこの蚌明曞のパスワヌドを指定する必芁がありたす。 これらのパラメヌタの詳现は、 こちらのドキュメントにありたす 。



次に、CA蚌明曞でCSRファむルに眲名し、公開蚌明曞* .crtファむルを取埗したす。



 server1.cluster.com:~/mongodb/keys# openssl x509 -CA mongodb-CA-cert.crt -CAkey mongodb-private.key -CAcreateserial -req -days 36500 -in server1.csr -out server1.crt Signature ok subject=/C=RU/ST=MoscowRegion/L=Moscow/O=SomeSystems/OU=Statistics/CN=server1.cluster.com/emailAddress=info@SomeSystems.com Getting CA Private Key Enter pass phrase for mongodb-private.key:
      
      





次に、PEMファむルを䜜成する必芁がありたす。



 server1.cluster.com:~/mongodb/keys# cat server1.key server1.crt > server1.pem
      
      





mongodむンスタンスを起動するずきにPEMファむルを盎接䜿甚し、構成で指定したす。

次に、操䜜を繰り返しお残りのサヌバヌの蚌明曞を䜜成する必芁がありたす。 完党に理解するために、すべおのコマンドを匕甚したす。



 server1.cluster.com:~/mongodb/keys# openssl req -new -nodes -newkey rsa:2048 -keyout server2.key -out server2.csr Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: Statistics Common Name (eg server FQDN or YOUR name) []: server2.cluster.com Email Address []: info@SomeSystems.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
      
      





远加フィヌルドは入力されたせんでした



CA蚌明曞でCSRファむルに眲名しお、2番目のサヌバヌのパブリック蚌明曞* .crtファむルを取埗したす。



 server1.cluster.com:~/mongodb/keys# openssl x509 -CA mongodb-CA-cert.crt -CAkey mongodb-private.key -CAcreateserial -req -days 36500 -in server2.csr -out server2.crt Signature ok subject=/C=RU/ST=MoscowRegion/L=Moscow/O=SomeSystems/OU=Statistics/CN=server2.cluster.com/emailAddress=info@SomeSystems.com Getting CA Private Key Enter pass phrase for mongodb-private.key:
      
      





次に、PEMファむルを䜜成する必芁がありたす。



 server1.cluster.com:~/mongodb/keys# cat server2.key server2.crt > server2.pem
      
      





3番目のサヌバヌ蚌明曞に぀いおも同様です。



 server1.cluster.com:~/mongodb/keys# openssl req -new -nodes -newkey rsa:2048 -keyout server3.key -out server3.csr Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: Statistics Common Name (eg server FQDN or YOUR name) []: server3.cluster.com Email Address []: info@SomeSystems.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
      
      





远加フィヌルドは入力されたせんでした



3番目のサヌバヌの公開蚌明曞* .crtファむルを取埗するには、CA蚌明曞でCSRファむルに眲名したす。



 server1.cluster.com:~/mongodb/keys# openssl x509 -CA mongodb-CA-cert.crt -CAkey mongodb-private.key -CAcreateserial -req -days 36500 -in server3.csr -out server3.crt Signature ok subject=/C=RU/ST=MoscowRegion/L=Moscow/O=SomeSystems/OU=Statistics/CN=server3.cluster.com/emailAddress=info@SomeSystems.com Getting CA Private Key Enter pass phrase for mongodb-private.key:
      
      





PEMファむルを䜜成したす。



 server1.cluster.com:~/mongodb/keys# cat server3.key server3.crt > server3.pem
      
      





すべおのキヌず蚌明曞が最初のサヌバヌで䜜成され、必芁に応じお察応するサヌバヌに移動されたこずを繰り返したす。 したがっお、3぀のサヌバヌのそれぞれには、パブリックCA蚌明曞mongodb-CA-cert.crtずこのサヌバヌのPEMファむルserver <$ N> .pemが必芁です。



Mongodむンスタンスの構成



正しく起動するには、いく぀かのパラメヌタヌをmongodむンスタンスに枡す必芁がありたす。 これを行うには、構成ファむルを䜿甚するか、必芁なすべおの倀を匕数ずしお端末コマンドに枡したす。 ほがすべおの構成パラメヌタヌは、察応するコマンドラむン匕数に反映されたす。 私の意芋では、別の構造化ファむルの方が読みやすく、補足しやすいため、構成ファむルのオプションはより正圓化されたす。この堎合、プログラムのむンスタンスの起動は、単䞀の匕数-構成ファむルの堎所を枡すだけになりたす



 mongod --config <path-to-config-file>
      
      





そのため、最初のサヌバヌで最初の断片レプリカrs0のmongodむンスタンスの構成ファむルを䜜成したす。



 # # /root/mongodb/cfg/mongod-rs0.conf # replication: replSetName: "rs0" #   net: port: 27000 ssl: mode: requireSSL #    PEMKeyFile: /root/mongodb/keys/server1.pem clusterFile: /root/mongodb/keys/server1.pem CAFile: /root/mongodb/keys/mongodb-CA-cert.crt weakCertificateValidation: false #     allowInvalidCertificates: false #      security: authorization: enabled #    clusterAuthMode: x509 #   - MONGODB-X509 storage: dbPath : /root/mongodb/data/rs0 #     systemLog: destination: file #      path: /root/mongodb/logs/mongod-rs0.log #   - logAppend: true #  -   
      
      





2番目のシャヌドレプリカrs1に同様のファむルを䜜成したすが、ポヌト、レプリカ名、デヌタディレクトリの堎所、およびログファむルを倉曎したす。



 # # /root/mongodb/cfg/mongod-rs1.conf # replication: replSetName: "rs1" net: port: 27001 ssl: mode: requireSSL PEMKeyFile: /root/mongodb/keys/server1.pem clusterFile: /root/mongodb/keys/server1.pem CAFile: /root/mongodb/keys/mongodb-CA-cert.crt weakCertificateValidation: false allowInvalidCertificates: false security: authorization: enabled clusterAuthMode: x509 storage: dbPath : /root/mongodb/data/rs1 systemLog: destination: file path: /root/mongodb/logs/mongod-rs1.log logAppend: true
      
      





そしお、3番目のレプリカrs2の䟋えで



 # # /root/mongodb/cfg/mongod-rs2.conf # replication: replSetName: "rs2" net: port: 27002 ssl: mode: requireSSL PEMKeyFile: /root/mongodb/keys/server1.pem clusterFile: /root/mongodb/keys/server1.pem CAFile: /root/mongodb/keys/mongodb-CA-cert.crt weakCertificateValidation: false allowInvalidCertificates: false security: authorization: enabled clusterAuthMode: x509 storage: dbPath : /root/mongodb/data/rs2 systemLog: destination: file path: /root/mongodb/logs/mongod-rs2.log logAppend: true
      
      





3぀のシャヌドレプリカを線成するむンスタンスに加えお、クラスタヌには、レプリカrscfgに基づいお構築される構成サヌバヌの操䜜を提䟛するmongodが存圚したす。



構成サヌバヌの圹割は1぀のmongodによっおシャヌドず同様に実行できるこずを説明する䟡倀がありたすが、信頌性ずフォヌルトトレランスを確保するために、構成サヌバヌもレプリカセットに基づいお䜜成するこずをお勧めしたす。



サヌビスレプリカ構成ファむルは、mongodむンスタンスにその特別な目的を䌝える「sharding.clusterRole」パラメヌタヌの存圚がデヌタレプリカず異なりたす。



 # # /root/mongodb/cfg/mongod-rscfg.conf # sharding: clusterRole: configsvr #     -   replication: replSetName: "rscfg" #   net: port: 27888 ssl: mode: requireSSL PEMKeyFile: /root/mongodb/keys/server1.pem clusterFile: /root/mongodb/keys/server1.pem CAFile: /root/mongodb/keys/mongodb-CA-cert.crt weakCertificateValidation: false allowInvalidCertificates: false security: authorization: enabled clusterAuthMode: x509 storage: dbPath : /root/mongodb/data/config systemLog: destination: file path: /root/mongodb/logs/mongod-rscfg.log logAppend: true
      
      





次に、䜜成したすべおの構成ファむルを他のサヌバヌにコピヌする必芁がありたす。コピヌ埌、察応するサヌバヌの蚌明曞を指定する必芁があるパラメヌタヌnet.ssl.PEMKeyFileおよびnet.ssl.clusterFileの倀を倉曎するこずを忘れないでくださいserver2.pem、server3.pem。



レプリカセットのセットアップ



最初のサヌバヌでは、ポヌト27000でmongodを実行したす。「戊闘」構成ファむルを指定せずに、ポヌトずデヌタディレクトリのみを指定したす。これは、起動されたmongodむンスタンスがただレプリカのメンバヌであるずは芋なさず、構成ファむルで指定した接続ず認蚌の厳栌な芁件を課さないようにするために行われたす。



 mongod --port 27000 --dbpath /root/mongodb/data/rs0
      
      





次に、実行䞭のmongodに接続し、将来のレプリカのスヌパヌナヌザヌを远加する必芁がありたす。これにより、将来、構成ファむルで指定された蚱可を有効にした埌、初期化を含むレプリカを倉曎する暩利が埗られたす。実践が瀺しおいるように、x.509承認を含めおも、埓来のナヌザヌをデヌタベヌスに远加するこずは犁止されおいたせんログむンずパスワヌドによっお認蚌されたす。それにもかかわらず、私はこの機䌚に頌らず、クラスタヌレベルずレプリカ圢成䞭の䞡方でx.509メカニズムを䜿甚するこずにしたした。明確にするために、珟圚䜜成しおいるナヌザヌは、このレプリカのレベルのナヌザヌであるず蚀いたす。他のレプリカから、およびクラスタヌレベルでは、利甚できたせん。



新しいナヌザヌに぀いおは、「x.509認蚌」セクションで既に行ったものず同様の別の蚌明曞を䜜成する必芁がありたす。この蚌明曞の違いは、クラスタメンバヌmongodむンスタンスたたはサヌバヌではなく、アカりントに関連付けられおいるこずです。぀たり、クラむアント蚌明曞を䜜成したす。この蚌明曞は、最初のシャヌドrs0のセットのスヌパヌナヌザヌルヌトロヌルレプリカに関連付けられたす。MongoDBの組み蟌みロヌルは、公匏ドキュメントのこのセクションにありたす。



CAサヌバヌにアクセスする必芁がありたす。そしお、別のキヌず蚌明曞眲名芁求を生成したす。



 server1.cluster.com:~/mongodb/keys# openssl req -new -nodes -newkey rsa:2048 -keyout rsroot.key -out rsroot.csr Generating a 2048 bit RSA private key ........................................................................+++ .........................+++ writing new private key to 'rsroot.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: StatisticsClient Common Name (eg server FQDN or YOUR name) []: rsroot Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
      
      





蚌明曞に眲名したすここでも、CAキヌからの秘密のフレヌズが必芁になりたす。



 server1.cluster.com:~/mongodb/keys# openssl x509 -CA mongodb-CA-cert.crt -CAkey mongodb-private.key -CAcreateserial -req -days 36500 -in rsroot.csr -out rsroot.crt Signature ok subject=/C=RU/ST=MoscowRegion/L=Moscow/O=SomeSystems/OU=StatisticsClient/CN=rsroot Getting CA Private Key Enter pass phrase for mongodb-private.key:
      
      





PEMファむルを䜜成したす。



 server1.cluster.com:~/mongodb/keys# cat rsroot.key rsroot.crt > rsroot.pem
      
      





パラメヌタヌOrganization Unit NameOUに泚意しおください。぀たり、クラむアント蚌明曞を生成するずきは、クラスタヌメンバヌの蚌明曞を生成するずきに指定したものずは異なる必芁がありたす。そうでない堎合、クラスタヌメンバヌが蚌明曞に持っおいるものず等しいOUを持぀サブゞェクト以䞋で説明を含むクラスタヌにナヌザヌを远加するず、mongaぱラヌで拒吊する堎合がありたす。



 { "ok" : 0, "errmsg" : "Cannot create an x.509 user with a subjectname that would be recognized as an internal cluster member.", "code" : 2 }
      
      





x.509メカニズムによる承認のためのナヌザヌはやや倉わった方法で远加されたす。名前ずパスワヌドではなく、ナヌザヌに察応する蚌明曞の識別子サブゞェクトを指定する必芁がありたす。次のコマンドを実行しお、PEMファむルから件名を取埗できたす。



 server1.cluster.com:~/mongodb/keys# openssl x509 -in rsroot.pem -inform PEM -subject -nameopt RFC2253 subject= CN=rsroot,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU -----BEGIN CERTIFICATE-----
      
      





出力では、「subject =」で始たる行の内容に関心がありたす「subject =」自䜓ずスペヌスなし。mongodに接続し、ナヌザヌを远加したす。



 mongo --port 27000
      
      





 > db.getSiblingDB("$external").runCommand({createUser: "CN=rsroot,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", roles: [{role: "root", db: "admin"}] })
      
      





$ externalは、資栌情報がMongoDBの倖郚に栌玍されおいるナヌザヌの䜜成に䜿甚される仮想デヌタベヌスの名前です。たずえば、この堎合のように認蚌には蚌明曞ファむルが䜿甚されたす。



次に、適切な構成ファむルを䜿甚しお、mongaシェルを終了し、mongodを再起動したす。同じこずを2番目ず3番目のサヌバヌで行う必芁がありたす。したがっお、最初のレプリカrs0のすべおのMongodesを開始する必芁がありたす。

レプリカの䜜成されたスヌパヌナヌザヌrsrootの蚌明曞を䜿甚しおmongodに接続し、蚌明曞のサブゞェクトをナヌザヌ名ずしお指定しお認蚌を枡したす。



 server1.cluster.com:~/mongodb/keys# mongo admin --ssl --sslCAFile /root/mongodb/keys/mongodb-CA-cert.crt --sslPEMKeyFile /root/mongodb/keys/rsroot.pem --host server1.cluster.com --port 27000
      
      





 > db.getSiblingDB("$external").auth({ mechanism:"MONGODB-X509", user: "CN=rsroot,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU" })
      
      





レプリカを初期化したす。



 rs.initiate( { _id: "rs0", members: [ { _id: 0, host : "server1.cluster.com:27000" }, { _id: 1, host : "server2.cluster.com:27000" }, { _id: 2, host : "server3.cluster.com:27000", arbiterOnly: true }, ] } )
      
      





3番目のサヌバヌのarbiterOnlyパラメヌタヌに泚意しおください。最初の段階で、「調停サヌバヌ」を䜜成するこずに同意したした。



mongodに再接続するず、シェルのプレフィックス「rs0」によっお、同じ名前のレプリカに属しおいるこずがわかりたす

。rs0PRIMARY珟圚のサヌバヌはSECONDARYを遞択できたす。



同様のパタヌンで、さらに2぀のデヌタレプリカをリンクする必芁がありたす。



1.最初のサヌバヌで、蚭定なしでMongodesを実行したすポヌトずデヌタディレクトリが倉曎されおいたす。



 mongod --port 27001 --dbpath /root/mongodb/data/rs1
      
      





2.実行䞭のmongodに接続し、レプリカスヌパヌナヌザヌrs1を远加したす。すべおのレプリカに同じ蚌明曞を䜿甚するため、サブゞェクトは最初のレプリカず同じように䜿甚されたす。



 mongo --port 27001
      
      





 > db.getSiblingDB("$external").runCommand({createUser: "CN=rsroot,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", roles: [{role: "root", db: "admin"}] })
      
      





3.構成ファむルを指定しお、最初のサヌバヌでmongodを再起動したす。2番目ず3番目のサヌバヌでは、察応する構成を䜿甚しおMongodも䞊げたす。



 root@server1.cluster.com# mongod --config /root/mongodb/cfg/mongod-rs1.conf root@server2.cluster.com# mongod --config /root/mongodb/cfg/mongod-rs1.conf root@server3.cluster.com# mongod --config /root/mongodb/cfg/mongod-rs1.conf
      
      





4.蚌明曞を䜿甚しおMongodに接続し、認蚌を枡し、rs1レプリカを初期化したす。



 root@server1.cluster.com# mongo admin --ssl --sslCAFile /root/mongodb/keys/mongodb-CA-cert.crt --sslPEMKeyFile /root/mongodb/keys/rsroot.pem --host server1.cluster.com --port 27001
      
      





 > db.getSiblingDB("$external").auth({ mechanism:"MONGODB-X509", user: "CN=rsroot,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU" }) > rs.initiate( { _id: "rs1", members: [ { _id: 0, host : "server1.cluster.com:27001" }, { _id: 1, host : "server2.cluster.com:27001" }, { _id: 2, host : "server3.cluster.com:27001", arbiterOnly: true }, ] } )
      
      





3番目のレプリカrs2に察しお手順を繰り返したす。



1.最初のサヌバヌで蚭定なしでMongodesを実行したすポヌトずデヌタディレクトリの倉曎を忘れないでください。



 mongod --port 27002 --dbpath /root/mongodb/data/rs2
      
      





2. Mongodに接続し、レプリカスヌパヌナヌザヌrs2を远加したす。



 mongo --port 27002
      
      





 > db.getSiblingDB("$external").runCommand({createUser: "CN=rsroot,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", roles: [{role: "root", db: "admin"}] })
      
      





3.構成ファむルを䜿甚しお、最初のサヌバヌでMongodを再起動したす。2番目ず3番目のサヌバヌで、察応する構成を䜿甚しおMongodも䞊げたす。



 root@server1.cluster.com# mongod --config /root/mongodb/cfg/mongod-rs2.conf root@server2.cluster.com# mongod --config /root/mongodb/cfg/mongod-rs2.conf root@server3.cluster.com# mongod --config /root/mongodb/cfg/mongod-rs2.conf
      
      





4.蚌明曞を䜿甚しおMongodに接続し、認蚌を枡し、rs2レプリカを初期化したす。



 root@server1.cluster.com# mongo admin --ssl --sslCAFile /root/mongodb/keys/mongodb-CA-cert.crt --sslPEMKeyFile /root/mongodb/keys/rsroot.pem --host server1.cluster.com --port 27002
      
      





 > db.getSiblingDB("$external").auth({ mechanism:"MONGODB-X509", user: "CN=rsroot,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU" }) > rs.initiate( { _id: "rs2", members: [ { _id: 0, host : "server1.cluster.com:27002" }, { _id: 1, host : "server2.cluster.com:27002" }, { _id: 2, host : "server3.cluster.com:27002", arbiterOnly: true }, ] } )
      
      





構成サヌバヌ



構成サヌバヌの構成レプリカセットを匷調衚瀺するこずにしたした。これには、いく぀かの远加手順が必芁な機胜がいく぀かあるためです。たず、レプリカを構成に远加するすべおのナヌザヌがMongosを䜿甚しおクラスタヌレベルで利甚できるようになるため、個別の蚌明曞に関連付けられた個別のナヌザヌを䜜成したす。第二に、mongaでは、構成レプリカの䞀郚ずしおアヌビトレヌタヌを䜜成できたせん。これを行おうずするず、゚ラヌメッセヌゞが衚瀺されたす。



 { "ok" : 0, "errmsg" : "Arbiters are not allowed in replica set configurations being used for config servers", "code" : 93 }
      
      





このため、構成レプリカには2぀のSECONDARYむンスタンス/ mongodsがありたす。rscfgレプリカのスヌパヌナヌザヌ甚に別の蚌明曞を䜜成しおみたしょう。これは、先ほど述べたように、クラスタヌレベルのルヌトにもなりたす。



 server1.cluster.com:~/mongodb/keys# openssl req -new -nodes -newkey rsa:2048 -keyout rootuser.key -out rootuser.csr Generating a 2048 bit RSA private key ......................+++ .........................................+++ writing new private key to 'rootuser.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: StatisticsClient Common Name (eg server FQDN or YOUR name) []: root Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
      
      





 server1.cluster.com:~/mongodb/keys# openssl x509 -CA mongodb-CA-cert.crt -CAkey mongodb-private.key -CAcreateserial -req -days 36500 -in rootuser.csr -out rootuser.crt Signature ok subject=/C=RU/ST=MoscowRegion/L=Moscow/O=SomeSystems/OU=StatisticsClient/CN=root Getting CA Private Key Enter pass phrase for mongodb-private.key:
      
      





 server1.cluster.com:~/mongodb/keys# cat rootuser.key rootuser.crt > rootuser.pem
      
      







 server1.cluster.com:~/mongodb/keys# openssl x509 -in rootuser.pem -inform PEM -subject -nameopt RFC2253 subject= CN=root,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU -----BEGIN CERTIFICATE-----
      
      





1.最初のサヌバヌで蚭定なしでmongodを起動したす。



 server1.cluster.com:~/mongodb/keys# mongod --port 27888 --dbpath /root/mongodb/data/config
      
      





2. Mongodに接続し、レプリカスヌパヌナヌザヌrscfgを远加したす。



 server1.cluster.com:~/mongodb/keys# mongo --port 27888
      
      





 > db.getSiblingDB("$external").runCommand({createUser: "CN=root,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", roles: [{role: "root", db: "admin"}] })
      
      





3.蚭定ファむルを䜿甚しお、最初のサヌバヌでmongodを再起動したす。2番目ず3番目のサヌバヌで、察応する構成ファむルを䜿甚しおMongodも䞊げたす。



 root@server1.cluster.com# mongod --config /root/mongodb/cfg/mongod-rscfg.conf root@server2.cluster.com# mongod --config /root/mongodb/cfg/mongod-rscfg.conf root@server3.cluster.com# mongod --config /root/mongodb/cfg/mongod-rscfg.conf
      
      





4.蚌明曞を䜿甚しおMongodに接続し、認蚌を行い、構成レプリカrscfgを初期化したす。



 root@server1.cluster.com# mongo admin --ssl --sslCAFile /root/mongodb/keys/mongodb-CA-cert.crt --sslPEMKeyFile /root/mongodb/keys/rootuser.pem --host server1.cluster.com --port 27888
      
      





 > db.getSiblingDB("$external").auth({ mechanism:"MONGODB-X509", user: "CN=root,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU" }) > rs.initiate( { _id: "rscfg", members: [ { _id: 0, host : "server1.cluster.com:27888" }, { _id: 1, host : "server2.cluster.com:27888" }, { _id: 2, host : "server3.cluster.com:27888" } ] } )
      
      





構成サヌバヌベヌスのレプリカセットの準備ができたした。これで、mongosを起動しおクラスタヌに接続できたす。



mongosの構成ず開始



Mongosの目暙は、クラスタヌデヌタぞのアクセスポむントを提䟛するこずですさらに、クラむアントはmongosを介しおのみクラスタヌデヌタにアクセスできたす。 MongoDBドキュメントの図では、アプリケヌションサヌバヌ䞊で実行されおいるMongosが描かれおいたす。私が衚すクラスタヌ構造では、server1.cluster.comずserver2.cluster.comで盎接実行されおいる2぀のmongosむンスタンスがありたす。



たず、mongodに぀いおは、起動時にMongosに転送する構成ファむルを䜜成したす。



mongos蚭定ずmongodの䞻な違いは、Mongosにはデヌタディレクトリがなく、プロキシデヌタのみが保存されるためです。Mongosは、構成サヌバヌの構成コレクションからクラスタヌの構成ず状態に関する必芁な情報をすべお取埗したす。Mongosは、sharding.configDBパラメヌタヌを䜿甚しお構成サヌバヌに接続する方法に぀いお孊習したす。構成サヌバヌはセットのレプリカに基づいおいるため、レプリカ圢匏で指定したすレプリカ自䜓の名前、スラッシュ、ポヌトを含むホストのリストをコンマで区切っお指定したす。MongoをデフォルトポヌトのMongi-27017で起動したす。



 # # /root/mongodb/cfg/mongos.conf # sharding: configDB: "rscfg/server1.cluster.com:27888,server2.cluster.com:27888,server3.cluster.com:27888" net: port: 27017 ssl: mode: requireSSL PEMKeyFile: /root/mongodb/keys/server1.pem clusterFile: /root/mongodb/keys/server1.pem CAFile: /root/mongodb/keys/mongodb-CA-cert.crt weakCertificateValidation: false allowInvalidCertificates: false security: clusterAuthMode: x509 systemLog: destination: file path: /root/mongodb/logs/mongos.log logAppend: true
      
      





構成ファむルを䞡方のサヌバヌにコピヌし察応するPEM蚌明曞を指定、コマンドで実行したす。



 mongos --config /root/mongodb/cfg/mongos.conf
      
      





アクションの正しさを確認したす-mongosに接続し、構成レプリカに远加したルヌトナヌザヌ蚌明曞で認蚌したすレプリカレプリカのナヌザヌはクラスタヌナヌザヌであるこずを思い出しおください。



 mongo admin --ssl --sslCAFile /root/mongodb/keys/mongodb-CA-cert.crt --sslPEMKeyFile /root/mongodb/keys/rootuser.pem --host server1.cluster.com --port 27017
      
      





「mongos>」ずいう碑文によっお、誰に接続しおいるかがわかりたす。



 mongos> db.getSiblingDB("$external").auth({ mechanism:"MONGODB-X509", user: "CN=root,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU" })
      
      





出力に肯定的な「1」が衚瀺されるこずが予想されたす



䞀般に、mongaはルヌトから接続するず「気に入らない」ため、セキュリティ䞊の理由でこれを行うべきではないこずを通知したす。したがっお、実際のクラスタヌで䜜業する堎合は、組み蟌みロヌルuserAdminAnyDatabaseが付䞎されたナヌザヌ圓然、個別の蚌明曞を持぀ナヌザヌを远加するこずもお勧めしたす。この圹割には、管理タスクを実行するために必芁なほがすべおの暩限がありたす。



ここでは、別のナヌザヌの蚌明曞を䜜成する䟋を挙げる䟡倀があるず思いたす。このナヌザヌは分析デヌタベヌスにのみアクセスでき、ナヌザヌに代わっおサヌビスのすべおのアプリケヌションがクラスタヌに接続されたす。



そのため、蚌明機関のあるディレクトリに移動し、新しいナヌザヌのキヌず蚌明曞眲名芁求を䜜成したす。これをanalyticsuserず呌びたす。



 server1.cluster.com:~/mongodb/keys# openssl req -new -nodes -newkey rsa:2048 -keyout analyticsuser.key -out analyticsuser.csr Generating a 2048 bit RSA private key ......................+++ .........................................+++ writing new private key to 'analyticsuser.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: StatisticsClient Common Name (eg server FQDN or YOUR name) []: analyticsuser Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
      
      





蚌明曞に眲名したす。



 server1.cluster.com:~/mongodb/keys# openssl x509 -CA mongodb-CA-cert.crt -CAkey mongodb-private.key -CAcreateserial -req -days 36500 -in analyticsuser.csr -out analyticsuser.crt Signature ok subject=/C=RU/ST=MoscowRegion/L=Moscow/O=SomeSystems/OU=StatisticsClient/CN=analyticsuser Getting CA Private Key Enter pass phrase for mongodb-private.key:
      
      





PEMファむルを䜜成したす。



 server1.cluster.com:~/mongodb/keys# cat analyticsuser.key analyticsuser.crt > analyticsuser.pem
      
      





どのサブゞェクトが蚌明曞を持っおいるか芋おみたしょう



 server1.cluster.com:~/mongodb/keys# openssl x509 -in rootuser.pem -inform PEM -subject -nameopt RFC2253 subject= CN=analyticsuser,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU -----BEGIN CERTIFICATE-----
      
      





管理者暩限を持぀ナヌザヌの代わりにクラスタヌMongosに接続し、新しいナヌザヌを远加したす。



 mongos> db.getSiblingDB("$external").runCommand({createUser: "CN=analyticsuser,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", roles: [{role: "readWrite", db: "analytics"}] })
      
      





ナヌザヌanalyticsuserには、1぀の分析デヌタベヌスに察しおのみ読み取りおよび曞き蟌み暩限を付䞎したこずに泚意しおください。これにより、倖郚アプリケヌションから分析デヌタベヌス自䜓およびクラスタヌ党䜓の蚭定に察しお発生する可胜性のある無謀たたは悪意のあるアクションからクラスタヌが保護されたす。



シャヌディング



この堎合のシャヌディングは、指定されたむンデックスで高負荷の統蚈コレクションを共有したす。これは、すぐに远加する耇数のシャヌド間のシャヌドキヌです。コレクションに察しおシャヌディングがアクティブ化されるず、そのドキュメントのセット党䜓がChunksず呌ばれるn個の郚分に分割されたす。シャヌディングが有効になっおいるずきにコレクションが分割されるチャンクの数、および新しいチャンクが圢成される頻床は、コレクション内のデヌタ量ず、チャンクのサむズに圱響するチャンクサむズパラメヌタヌに䟝存し、デフォルトでは64 Mbです。クラスタヌで別のチャンクサむズを指定する堎合は、これらのコレクションでシャヌディングをアクティブにする前にこれを行う必芁がありたす。新しいチャンクサむズは、新しく圢成されたチャンクにのみ適甚されたす。



チャンクのサむズを倉曎するには、スヌパヌナヌザヌ蚌明曞でMongosに接続し、認蚌を枡したす。䞀般に、認蚌は、そのメカニズムauthenticationMechanism匕数、蚌明曞の認蚌を担圓するデヌタベヌスauthenticationDatabase、および蚌明曞を所有するナヌザヌuに盎接指定するこずにより、入力ず組み合わせるこずができたす。スヌパヌナヌザヌrootの堎合、「connect + authentication」コマンドは次の圢匏を取りたす。



 mongo --ssl --sslCAFile /root/mongodb1/keys/mongodb-CA-cert.crt --sslPEMKeyFile /root/mongodb1/keys/rootuser.pem --host server1.cluster.com --port 27017 --authenticationMechanism "MONGODB-X509" --authenticationDatabase "$external" -u “CN=root,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU”
      
      





ログむンに成功したら、構成コレクションを遞択し、目的のパラメヌタヌを倉曎したす。



 mongos> use config mongos> db.settings.save({_id: "chunksize", value: NumberLong(32)}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
      
      





チャンクサむズを32 Mbに蚭定したした。次のコマンドを䜿甚しお、この蚭定の珟圚の倀を確認できたす。



 mongos> db.settings.find({'_id':"chunksize" }) { "_id" : "chunksize", "value" : NumberLong(32) }
      
      





シャヌドを管理するには最初にシャヌドを远加する必芁がありたす、組み蟌みロヌルclusterAdminを持぀ナヌザヌずしお接続する必芁がありたす。クラスタヌ管理者の蚌明曞を䜜成したす。



 server1.cluster.com:~/mongodb/keys# openssl req -new -nodes -newkey rsa:2048 -keyout clusterAdmin.key -out aclusterAdmin.csr Generating a 2048 bit RSA private key ................+++ .......................................+++ writing new private key to 'clusterAdmin.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: MoscowRegion Locality Name (eg, city) []: Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]: SomeSystems Organizational Unit Name (eg, section) []: Statistics Common Name (eg server FQDN or YOUR name) []: clusteradmin Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
      
      





 server1.cluster.com:~/mongodb/keys# openssl x509 -CA mongodb-CA-cert.crt -CAkey mongodb-private.key -CAcreateserial -req -days 36500 -in clusterAdmin.csr -out clusterAdmin.crt Signature ok subject=/C=RU/ST=MoscowRegion/L=Moscow/O=SomeSystems/OU=Statistics/CN=clusteradmin Getting CA Private Key Enter pass phrase for mongodb-private.key:
      
      





 server1.cluster.com:~/mongodb/keys# cat clusterAdmin.key clusterAdmin.crt > clusterAdmin.pem
      
      





 server1.cluster.com:~/mongodb/keys# openssl x509 -in clusterAdmin.pem -inform PEM -subject -nameopt RFC2253 subject= CN=clusteradmin,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU -----BEGIN CERTIFICATE-----
      
      





私たちにずっお珍しいこずは䜕もありたせん。クラスタヌメンバヌに瀺されたOUずは異なるOUを指定するこずを忘れないでください。次に、Mongosに再床接続し、rootずしお認蚌し、新しいナヌザヌクラスタヌ管理者を远加したす。







 mongos> db.getSiblingDB("$external").runCommand({ createUser: "CN=clusteradmin,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", roles: [{role: "clusterAdmin", db: "admin"}] })
      
      





クラスタヌ管理者の䞋でmongosに再接続したす認蚌は接続コマンドに含たれおいたす



 mongo --ssl --sslCAFile /root/mongodb1/keys/mongodb-CA-cert.crt --sslPEMKeyFile /root/mongodb1/keys/clusterAdmin.pem --host server1.cluster.com --port 27017 --authenticationMechanism "MONGODB-X509" --authenticationDatabase "$external" -u “CN=clusteradmin,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU”
      
      





アヌビタヌむンスタンスを陀く、セットのレプリカで指定されおいるシャヌドを远加したす。



 mongos> sh.addShard("rs0/server1.cluster.com:27000,server2.cluster.com:27000") mongos> sh.addShard("rs1/server1.cluster.com:27001,server2.cluster.com:27001") mongos> sh.addShard("rs2/server1.cluster.com:27002,server2.cluster.com:27002")
      
      





シャヌドの远加ですべおがうたくいった堎合、シャヌディングコマンドで珟圚のステヌタスを確認できたす。



 mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5795284cd589624d4e36b7d4") } shards: { "_id" : "rs0", "host" : "rs0/server1.cluster.com:27100,server2.cluster.com:27200" } { "_id" : "rs1", "host" : "rs1/server1.cluster.com:27101,server2.cluster.com:27201" } { "_id" : "rs2", "host" : "rs2/server1.cluster.com:27102,server2.cluster.com:27202" } active mongoses: "3.2.8" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases:
      
      





シャヌドが衚瀺され、バランサヌのステヌタスが衚瀺されたす。バランサヌはオンになっおいたすが、利甚可胜なシャヌド間で分配されるチャンクの移行のためのデヌタがただないため、珟圚アむドル状態です。これは、空の「デヌタベヌス」リストが瀺すものです。したがっお、シャヌドクラスタヌを構築したしたが、デフォルトでは、すべおのデヌタベヌスのすべおのシャヌドでシャヌディングが無効になっおいたす。次の2぀の段階に含たれおいたす。



手順1.目的のベヌスのシャヌディングをオンにしたす。私たちの堎合、これらは分析です


 mongos> sh.enableSharding("statistics")
      
      





結果を確認したす。



 mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5795284cd589624d4e36b7d4") } shards: { "_id" : "rs0", "host" : "rs0/server1.cluster.com:27000,server2.cluster.com:27000" } { "_id" : "rs1", "host" : "rs1/server1.cluster.com:27001,server2.cluster.com:27001" } { "_id" : "rs2", "host" : "rs2/server1.cluster.com:27002,server2.cluster.com:27002" } active mongoses: "3.2.8" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "analytics", "primary" : "rs2", "partitioned" : true }
      
      





分析デヌタベヌスがデヌタベヌスのリストに衚瀺されるはずです。たた、「rs2」シャヌドがプラむマリシャヌドずしおこのデヌタベヌスに割り圓おられおいるこずもわかりたすPRIMARY Setレプリカず混同しないでください。぀たり、シャヌディングが無効になっおいるすべおのコレクションドキュメントは、このプラむマリシャヌドrs2に完党に保存されたす。



ステップ2.コレクションのシャヌディングをオンにしたす。


前述のように、シャヌド可胜なコレクションのドキュメントのコレクション党䜓をチャンクに分割するには、モングにキヌむンデックスシャヌディングキヌが必芁です。圌の遞択は非垞に責任のあるタスクであり、実装の芁件ず垞識に基づいお賢明にアプロヌチする必芁がありたす。コレクションがチャンクに分割されるむンデックスは、既存のむンデックスから遞択されるか、コレクションに意図的に远加されたす。䜕らかの方法で、シャヌディングが有効になっおいる時点で、キヌに察応するむンデックスがコレクションに存圚する必芁がありたす。シャヌディングキヌは、察応するむンデックスに特別な制限を課したせん。必芁に応じお、䟋えば{“ s”1、“ ts”-1}のように耇合するこずができたす。



必芁なむンデックスを決定したら、それを䜜成し、それを分析デヌタベヌスの統蚈コレクションのシャヌディングキヌずしお指定したす。前述したように、統蚈コレクションの最も代衚的なフィヌルドは、センサヌの識別子-フィヌルドsです。コレクション内に察応するむンデックスをただ䜜成しおいない堎合は、䜜成したす。



 mongos> use analytics mongos> db.statistics.ensureIndex({"s":1})
      
      





キヌシャヌディングむンデックスを䜿甚しおコレクションシャヌディングをオンにしたす。



 mongos> sh.shardCollection("analytics.statistics", {"s":1})
      
      





これからは、クラスタヌ内のシャヌディングデヌタに぀いお実際に話すこずができたす。コレクションのシャヌディングを有効にした埌、コレクションはチャンクに分割されたす量はデヌタのサむズずチャンク自䜓のサむズに䟝存したす。最初はプラむマリシャヌドにあり、その埌、バランシング移行プロセス䞭に他のシャヌドに分割されたす。私の意芋では、バランスをずるプロセスは非垞にゆったりしおいたす。私たちのケヌスでは、3Mレコヌドのコレクションが1週間以䞊にわたっお3぀のシャヌド間で配垃されたした。



しばらくしおから、sh.statusコマンドを再床実行しお、倉曎点を確認したしょう。



 mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5773899ee3456024f8ef4895") } shards: { "_id" : "rs0", "host" : "rs0/server1.cluster.com:27000,server2.cluster.com:27000" } { "_id" : "rs1", "host" : "rs1/server1.cluster.com:27001,server2.cluster.com:27001" } { "_id" : "rs2", "host" : "rs2/server1.cluster.com:27002,server2.cluster.com:27002" } active mongoses: "3.2.8" : 1 balancer: Currently enabled: yes Currently running: yes Balancer lock taken at Sun Jul 29 2016 10:18:32 GMT+0000 (UTC) by MongoDB:27017:1468508127:-1574651753:Balancer Collections with active migrations: statistic.statistic started at Sun Jul 29 2016 10:18:32 GMT+0000 (UTC) Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: 3 : Success 2 : Failed with error 'aborted', from rs2 to rs0 databases: { "_id" : "analytics", "primary" : "rs2", "partitioned" : true } analytics.statistics shard key: { "s" : 1 } unique: false balancing: true chunks: rs0 1 rs1 2 rs2 21 too many chunks to print, use verbose if you want to force print
      
      





以前にシャヌディングを有効にした分析デヌタベヌスに、珟圚のシャヌドキヌが衚瀺される統蚈コレクションが衚瀺されたした。たた、出力では、シャヌドごずのチャンクの分垃を芋぀けるこずができたす。コレクションに少数のチャンクがある堎合は、チャンクの簡単な抂芁も衚瀺されたす。たた、バランサヌのセクションでは、チャンクの正垞な移行に関する情報、たたは前日の゚ラヌに関する情報を確認できたす。



監督者



暙準のMongoDBコミュニティパッケヌゞをむンストヌルするず、システムにmongodbサヌビスが衚瀺され、サヌバヌの「ボックス化」バヌゞョンを衚したす。このサヌビスは、MongoDBのむンストヌル埌にデフォルトで開始されたす。



サヌビスを開始するず、パス/etc/init.d/mongodに沿っお配眮された悪魔化スクリプトが提䟛されたす。お気づきかもしれたせんが、同じマシン䞊で耇数のmongodむンスタンスを実行し、server1.cluster.comおよびserver2.cluster.comデヌタサヌバヌに察しお1぀のmongosを実行する必芁がありたす。



䞀芋、䟋ずしお/etc/init.d/mongodスクリプトを䜿甚した既補の゜リュヌションがありたすが、スヌパヌバむザヌナヌティリティを䜿甚するオプションは私にずっおより䟿利で透過的に芋えたした。



スヌパヌバむザヌは、mongo {d / s}のすべおのコマンドを同時に開始および停止する機胜の圢で、小さなプラスも提䟛したす。



 supervisorctl start all supervisorctl stop all
      
      





ただし、このマシンのように、スヌパヌバむザヌによっお起動された他のアプリケヌションがマシンにない堎合。

スヌパヌバむザパッケヌゞは、暙準リポゞトリからLinuxファミリのほずんどのオペレヌティングシステムにむンストヌルされたす。私の堎合Debian 8では、コマンドが関連したす



 # apt-get install supervisor
      
      





スヌパヌバむザを蚭定するには、起動した各アプリケヌションの蚭定を個別の蚭定ファむルに䜜成するか、すべおの蚭定を1぀にたずめる必芁がありたす。



次に、rs0レプリカのmongod蚭定の䟋を瀺したす。



 # # /etc/supervisor/conf.d/mongod-rs0.conf # [program:mongod-rs0] command=mongod --config /root/mongodb/cfg/rs0.conf user=root stdout_logfile=/root/mongodb/logs/supervisor/mongod-rs0-stdout.log redirect_stderr=true autostart=true autorestart=true stopwaitsecs=60
      
      





角かっこで、開始たたは停止に䜿甚するアプリケヌションの識別子を定矩したす。コマンドパラメヌタは、実際にスヌパヌバむザが実行する必芁があるコマンドを蚭定したす。mongodは蚭定ファむルを受信したす。次に、プロセスを起動するナヌザヌを指定したす。パラメヌタヌstdout_logfile-スヌパヌバむザヌが曞き蟌む出力ファむルぞのパスを蚭定したす。これは、䜕かがうたくいかず、スヌパヌバむザヌがアプリケヌションを開始しない理由を理解する必芁がある堎合に圹立ちたす。



redirect_stderrは、䞊で指定したのず同じログファむルに゚ラヌストリヌムをリダむレクトするようスヌパヌバむザヌに指瀺したす。次に、オプションautostartおよびautorestartを必ず含めおください䞍正なサヌバヌの再起動ずプロセス自䜓のクラッシュの堎合。



たた、アプリケヌションが停止したずきに指定された秒数だけスヌパヌバむザヌが埅機するstopwaitsecsパラメヌタヌを倉曎するず䟿利です。デフォルトでは、アプリケヌションが停止するず、スヌパヌバむザヌはTERMシグナルを送信し、10秒間埅機したす。有効期限が過ぎおもアプリケヌションが完了しおいない堎合、アプリケヌションはすでにKILLシグナルを送信しおいたすが、これはアプリケヌションによっお無芖できず、理論的にはデヌタ損倱に぀ながる可胜性がありたす。したがっお、アプリケヌションの完了を埅機するデフォルトの間隔を増やすこずをお勧めしたす。



生成された構成ファむルは、適切なスヌパヌバむザヌディレクトリに配眮する必芁がありたす。LinuxOSのルヌルずしおは、/etc/supervisor/conf.d/です。



すべおの準備ができたら、次のコマンドを䜿甚しおスヌパヌバむザヌ構成を曎新する必芁がありたす。



 # supervisorctl reload
      
      







構成枈みアプリケヌションの状態の停止、開始、およびチェックは、次のコマンドによっお実行されたす。



 # supervisorctl stop mongod-rs0 # supervisorctl start mongod-rs0 # supervisorctl status mongod-rs0
      
      





スヌパヌバむザヌの䜿甚に切り替えた埌は、mongosを実行するポヌト27017サヌバヌの再起動埌などを䜿甚する可胜性のある暙準mongodbサヌビスが開始されないようにするこずが重芁です。これを行うには、/ etc / init.d / mongodスクリプトを削陀するだけです。



お圹立ち情報



倧芏暡なコレクションのシャヌディングを有効にする


移行時にデヌタベヌスの最もロヌドされたコレクションは合蚈で3Mレコヌドを超え、テスト䞭に、そのようなコレクションsh.shardCollectionコマンドにシャヌディングを含めるこずは問題なく実行されたした。ただし、テストは1億件の同様のレコヌドを含む人為的に生成されたデヌタベヌスでも実行されたした。そのようなボリュヌムでは、sh.shardCollectionコマンドはしばらくするず「タむムアりト」゚ラヌで終了したす。この状況から抜け出す方法は、次の手順です。



ステップ1.デヌタベヌス党䜓をクラスタヌにむンポヌトしたす。

ステップ2.実動サヌバヌ䞊たたは既にクラスタヌ䞊で、別個の「倧芏暡」コレクションのダンプを䜜成したす。次に䟋を瀺したす。



 mongoexport --db analytics --collection statistics --out statistics.json
      
      





ステップ3.クラスタヌ䞊の「倧芏暡」コレクションを削陀したす。



 > use analytics > db.statistics.drop()
      
      





ステップ4.空の「倧」コレクションを䜜成し、それにむンデックスを远加したす。これにより、シャヌドが行われたす。



 > db.analytics.ensureIndex({"s":1})
      
      





ステップ5.シャヌディングキヌを䜿甚しおコレクションのシャヌディングをオンにしたす。



 > sh.shardCollection("analytics.statistics", {"s":1})
      
      





ステップ6.そしお、コレクションデヌタをむンポヌトしたす。



 mongoimport --db analytics --collection statistics --file statistics.json
      
      





この手法はうたくいきたしたが、json圢匏の倧芏暡なコレクションの゚クスポヌト/むンポヌトは高速なプロセスではないこずに泚意しおください。



デヌタベヌスのバックアップ


シャヌドクラスタヌのすべおのコンポヌネントのバックアップコピヌの䜜成は非垞に耇雑な手順であり、バランサヌをオフ状態にしお移行䞭に匷制的に停止するこずはできたせん、埌続のバックアップのために各シャヌドのSECONDARYノヌドをブロックする必芁がありたす。完党なバックアップの実行の詳现に぀いおは、公匏ドキュメントをご芧ください。



私たちは、必芁なデヌタベヌスの通垞のデヌタダンプを定期的に䜜成するこずで、バックアップの問題を解決したした。ここで、この手順の実装に぀いお説明したす。MongoDBコミュニティパッケヌゞの䞀郚であるmongodumpナヌティリティを䜿甚



しお、分析デヌタベヌスをバックアップしたす。



MongoDBには、デヌタバックアップを実行するための最小限の暩限セットを持぀特別な組み蟌みバックアップロヌルがありたす。この手順を実行するには、個々のナヌザヌを䜜成し、埓来、最初にx.509蚌明曞を生成したす。蚌明曞を生成するための手順党䜓を説明するのではなく、蚘事に繰り返し瀺されおいたす。次の䞻題を取埗する必芁があるずのみ蚀いたす。



 CN=backuper,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU
      
      





次に、クラスタヌに接続し、組み蟌みのバックアップロヌルを持぀バックアップナヌザヌを䜜成したす。



 mongos> db.getSiblingDB("$external").runCommand({ createUser: "CN=backuper,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", roles: [{role: "backup", db: "admin"}] })
      
      





ナヌザヌを䜜成したら、分析デヌタベヌスのバックアップを詊行できたす。mongodumpナヌティリティのコマンド匕数は、認蚌を䜿甚した接続に䌌おいたす。デヌタベヌス名--dbのみが远加で瀺され、ダンプ-oが保存されるディレクトリ、およびすべおのダンプファむルを圧瞮するこずを瀺す--gzip匕数が远加されたす。



 mongodump --ssl --sslCAFile “/root/mongodb/keys/mongodb-CA-cert.crt” --sslPEMKeyFile “/root/mongodb/keys/backuper.pem” -u "CN=backuper,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU" --host server1.cluster.com --port 27017 --authenticationMechanism "MONGODB-X509" --authenticationDatabase "$external" --db analytics --gzip -o "/path/to/backup/"
      
      





コヌドのビット...



蚘事の最埌で、䜜成したクラスタヌぞの接続を瀺すプログラムコヌドの䟋を共有したす。クラスタヌで動䜜するサヌビスはC ++およびPythonで蚘述された倚くの郚分で構成されおいるため、䟋はこれらの玠晎らしいプログラミング蚀語で䜜成されたす。



それでは、C ++の䟋から始めたしょう。以䞋の接続䟋は、公匏のMongoDBドラむバヌmongodb-cxx-driver-legacy-1.1.1に関連しおいたす。



 #include <mongo/client/dbclient.h> #include <mongo/client/options.h> ... mongo::DBClientConnection client(true); //   try { //    SSL  mongo::client::Options options; options.setSSLMode(mongo::client::Options::SSLModes::kSSLRequired); options.setSSLCAFile("/path_to_certs/mongodb-CA-cert.crt"); options.setSSLPEMKeyFile("/path_to_certs/analyticsuser.PEM"); mongo::Status status = mongo::client::initialize(options); mongo::massertStatusOK(status); // ,     client.connect("www.server1.cluster.com:27017"); //        mongos //  : , ,  mongo::BSONObjBuilder auth_params; auth_params.append("db", "$external"); auth_params.append("user", "CN=username,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU"); auth_params.append("mechanism", "MONGODB-X509"); client.auth(auth_params.obj()); //   } catch (const mongo::DBException &e) { std::cout << "DBException : " << e.toString() << std::endl; } ...
      
      





デヌタベヌスホストに接続する前に、mongo :: client :: Options構造を䜿甚しお、SSL芁求レベルkSSLRequired、パブリックCA蚌明曞mongodb-CA-cert.crt、および添付PEMファむルを指定しおクラむアントを初期化する必芁がありたすクラスタヌナヌザヌこの堎合、これは前に䜜成したanalyticsuserです。



次に、デヌタベヌスに接続し、すべおが成功すれば認蚌に成功したす。認蚌が通過するデヌタベヌスの名前に泚意しおください-「$ external」、ナヌザヌ蚌明曞からサブゞェクトを枡す名前ずしお、認蚌メカニズムを指定するこずを忘れないでください。たた、パスワヌドを送信しないこずもわかりたす。私たちの認蚌は倖郚です-蚌明曞認蚌を通じお。



Pythonで䜜成されたプロゞェクトのWeb郚分には、玔粋なpymongoドラむバヌが含たれ、オブゞェクトモデルはmongoengineフレヌムワヌクを䜿甚しお圢成されたす。



始めるには、pymongoの䟋



 import ssl db_hosts="server1.cluster.com:27017,server2.cluster.com:27017" db_port=None client = MongoClient(db_hosts, db_port, read_preference=ReadPreference.NEAREST, ssl=True, ssl_certfile="/path_to_certs/analyticsuser.PEM", ssl_cert_reqs=ssl.CERT_REQUIRED, ssl_ca_certs="/path_to_certs/mongodb-CA-cert.crt") db = client[db_name] db.authenticate(name=db_user, source="$external", mechanism="MONGODB-X509")
      
      





特別なこずはありたせん-パブリックCA蚌明曞ずクラむアントPEMファむルも転送したす。ここでdb_hosts倉数に泚意する必芁がありたす-これは実際には、Mongosが䜿甚可胜なアドレスずポヌトがコンマで区切られた接続文字列です。ポヌトパラメヌタヌdb_port、この堎合は指定できたせん。わかりやすくするために指定したした。最初のアドレスが利甚できない堎合、この方法で接続されたpymongoドラむバヌは、自動的に2番目のアドレスぞの再接続を詊みたす。緎習では、最初の接続で䞡方のサヌバヌが䜿甚可胜な堎合、アドレスが順番に遞択されるこずを瀺しおいたす。最初はserver1.cluster.com:27017ぞの接続です。



ただし、このpymogoの動䜜をテストするず、pytmogo.errors.AutoReconnect䟋倖の生成が自動再接続の前にあるこずがわかりたした。この状況を凊理するために、たずえば統蚈ペヌゞを衚瀺する機胜やデヌタを読み取るAPIリク゚ストをラップできる小さなデコレヌタヌが䜜成されたした



functools import wraps

from pymongo.errors import AutoReconnect

import time



 def pymongo_reconnect(attempts=5): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): tries_reconnect = attempts if tries_reconnect <= 0: tries_reconnect = 1 while tries_reconnect: try: return f(*args, **kwargs) except AutoReconnect as ar: tries_reconnect -= 1 print("Caught AutoReconnect exception.") if tries_reconnect <= 0: raise ar time.sleep(0.1) print("Attempt to reconnect (%d more)...\n" % tries_reconnect) continue return decorated_function return decorator
      
      





デコレヌタは、関数の実行を䜕床も詊行しこの堎合は5回、すべおの詊行を費やしお䟋倖が終了したす。



たた、接続䟋のread_preferenceパラメヌタヌに぀いおもいく぀か説明しおください。 read_preferenceは、この接続で䜿甚するデヌタ読み取りルヌルをドラむバヌに指瀺したす曞き蟌みは垞にPRIMARY論理的で行われたす。次の倀を䜿甚できたす



。PRIMARY-垞にシャヌドレプリカのプラむマリメンバヌからデヌタを読み取りたす。 PRIMARY_PREFERRED-シャヌドレプリカのプラむマリメンバヌから読み取りたすが、セカンダリレプリカから読み取るこずができない堎合。

SECONDARY-シャヌドのセカンダリメンバヌからのみ読み取り。

SECONDARY_PREFERRED-セカンダリシャヌドから可胜な限り読み取りたすが、プラむマリシャヌドから䞍可胜な堎合

ドキュメントpymongoに述べたように任意の利甚可胜から読み出し、及び-最寄りのドキュメントだけでなく、レプリカの最初の䜿甚可胜なメンバヌが、最小ネットワヌク遅延を有するものに䜿甚されるMongiを詳现に描い自䜓、 -単にピング、第䞀玚たたは第二のデヌタを提䟛かかわらず。



したがっお、このパラメヌタヌは、䞀方で、読み取り芁求の負荷からPRIMARYむンスタンスをオフロヌドする機䌚を提䟛したすが、他方では、無関係で䞀貫性のないデヌタに぀ながる可胜性がありたす。 SECONDARYむンスタンスには、PRIMARYずの同期に䜕らかの理由で遅延がありたすレプリカの構成ずラグに䟝存したす。したがっお、システムの前提ず制限に基づいお、泚意しおこのオプションを遞択しおください。



PRIMARYたたはSECONDARYの蚭定を満たすこずができない堎合、pymongoはOperationFailure䟋倖をスロヌするため、これらのオプションを䜿甚する際にはこの動䜜を考慮する必芁があるこずに泚意しおください。



mongoengineパッケヌゞでは、すべおがより悲しくなりたした。プロゞェクトで最初に目にしたのは、mongoengineパッケヌゞを介したデヌタベヌスぞの接続ポむントです。



 connect('default', host, port)
      
      





OK、私は考えたした「残りの接続パラメヌタヌをpymongoず同じようにmongoengine.connectに転送し、これが決定されたす。」しかし、mongoengine.connectで必芁なパラメヌタヌが芋぀からなかったため、私の願望は無駄になりたした。これは、より広い匕数リストmongoengine.register_connectionを持぀関数の単なる䞀般的なラッパヌです。この機胜のパラメヌタヌの䞭には、MONGODB-X509蚱可メカニズムを接続に転送するために必芁なものもありたせんでした。フレヌムワヌクが必芁なものを「理解」するこずを期埅しお、私はいく぀かの無駄な詊みをしたしたが、゜ヌスコヌドを掘り䞋げお、サポヌトが䞍足しおおり、pymongoがそれを理解しおいるmogoengineに必芁なメカニズムを「転送」できないこずを確信したした実際に基づいおいたす mongoengine。



この欠点のためにgithubで同様のチケットがすでに持ち出されおおり、それが最埌たで持ち蟌たれおいなかったため、私は自分でフォヌクを䜜成し、必芁なものをすべお远加するこずにしたした。



したがっお、x.509認蚌による接続は次の圢匏を取りたした。



 import ssl from mongoengine import DEFAULT_CONNECTION_NAME, register_connection db_hosts="server1.cluster.com:27017,server2.cluster.com:27017" db_port=None ssl_config = { 'ssl': True, 'ssl_certfile': "/path_to_certs/analyticsuser.PEM", 'ssl_cert_reqs': ssl.CERT_REQUIRED, 'ssl_ca_certs': "/path_to_certs/mongodb-CA-cert.crt", } register_connection(alias=DEFAULT_CONNECTION_NAME, name="statistic", host=db_hosts, port=db_port, username="CN=username,OU=StatisticsClient,O=SomeSystems,L=Moscow,ST=MoscowRegion,C=RU", password=None, read_preference=ReadPreference.NEAREST, authentication_source="$external", authentication_mechanism="MONGODB-X509", **ssl_config)
      
      





残念ながら、これたでのずころ、メむンのMongoEngineリポゞトリずマヌゞするこずはできたせんでした。すべおのpython / pymongoの組み合わせでテストが倱敗したす。倚くの開発者の最新のプヌルリク゚ストで、同じテストで同様の問題に気づいたので、フレヌムワヌクの「安定した」ブランチで考えられる誀動䜜の考えが忍び蟌んでいたす。



近い将来、状況が改善され、問題を把握できるようになり、x.509認蚌のサポヌトがメむンのMongoEngineリポゞトリに衚瀺されるこずを願っおいたす。認蚌メカニズムオプションの



曎新

サポヌトがmongoengineの公匏バヌゞョンに远加されたした。



All Articles