sql >> データベース >  >> NoSQL >> MongoDB

MongoDB RubyDriver2.5.xレプリカセットのホスト名で大文字と小文字を区別する問題

    MongoDB Rubyドライバーを2.5.xにアップグレードした後、MongoDBレプリカセットへの接続に問題がありますか?最近、最新のMongoDB Rubyドライバーバージョンでこの問題に関するいくつかの問い合わせを受け取り、問題と原因に関する調査結果を共有するためにこの投稿を作成しました。

    接続の試行時に発生したエラーメッセージは-

    でした
    No server is available matching preference: #<Mongo::ServerSelector::Primary:...>

    この問題はすでにMongoDBに報告されており、ここで追跡されています。この問題と、2.5.xのドライバーコードで導入された根本的な原因を調査するために時間を費やしました。

    MongoDB RubyDriver2.5.xの問題の概要

    この問題は、MongoDB Rubyドライバーの2.5.xバージョンに存在し、レプリカセットを構成するホスト名に大文字と小文字が区別される文字が含まれている場合に発生します。 ABC-server1.example.com 。考えられる回避策は次のとおりです。

    1. 2.4.xにダウングレードするか、利用可能になったら2.6.xをアップグレードします。
    2. レプリカセットのすべてのメンバーのホスト名を小文字に変更します。たとえば、上記の例のホスト名をabc-server1.example.com。に変更します。

    問題の詳細

    Rubyで詳細なログ記録を有効にすると、何が起こっているのかがわかります:

    ...
    #19140] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
    #19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
    #19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'unknown'.
    #19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
    #19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
    #19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
    #19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.
    #19140] DEBUG -- : MONGODB | There was a change in the members of the 'replica set' topology.
    C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/server_selector/selectable.rb:119:in `select_server': No server is available matching preference: # using server_selection_timeout=30 and local_threshold=0.015 (Mongo::Error::NoServerAvailable)
    from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/database.rb:157:in `command'
    from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:404:in `list_databases'
    from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:385:in `database_names'
    ...
    

    ドライバーがレプリカセットのプライマリの役割を正しく検出できなかったことは明らかであるように思われました。 2.4.xのログと比較すると、これはそのバージョンで正しく発生していたことは明らかでした。つまり、プライマリがプライマリとして正しく識別されていました。

    ] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
    ] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
    ] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'primary'.
    ] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
    ] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
    ] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
    ] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.
    

    もう1つの手がかりは、ログでサーバー名がわずかに変更されたことです。実際の名前の代わりにSG -connectiontest1-2.servers.example.com sgとしてログに記録されていました -connectiontest1-2.servers.example.com

    接続の初期化中にホスト名が解析され、役割が割り当てられる方法に関するコードを調べると、ドライバーコードがダウンケーシング(つまり、ABCの変換)であると判断できました。 example.comからabc.example.comへ)接続文字列の解析中。次に、ドライバはプライマリに接続し、isMasterコマンドを使用してトポロジを検出します。このコマンドの結果を解析しているときに、ドライバーが各ノードの役割を決定します。

    MongoDB RubyDriver2.5.xレプリカセットのホスト名に関する大文字と小文字の区別の問題クリックしてツイート

    ただし、コマンドから返されたホスト名を接続文字列内のホスト名と比較している間、ドライバーは大文字と小文字を区別しない一致の実行を無視していました。これにより、MongoDBによって報告されたプライマリの名前と、ドライバーが接続文字列から決定したものとの不一致が発生しました。これにより、プライマリの役割が不明になり、接続障害が発生しました。役割検出コードのアドレス一致チェックが2.5.xで追加されました。

    この問題の修正は、バージョン2.6.0のドライバーを対象としています。


    1. マングースを使用したMongoDBでの一括アップサート

    2. MongoDB:フィールドがnullまたは設定されていないレコードをクエリする方法は?

    3. pymongoでmongodbをソートする方法

    4. doRedisは、異なるRedisサーバービルドのWindows8x64でエラーを返します