LoginSignup
0
0

More than 5 years have passed since last update.

Rails + Mongoid で MongoDBのバージョンを3.4→3.6に上げる時の注意点

Posted at

公式の手順に沿って上げるだけと思いきや、意外とつまづいたのでここに記します。
マニアックな問題なので、該当する人は少ないかと思います。

前提

Rails

Gemfile
gem 'rails', '~> 5.2.1'
gem "mongoid", "~> 7.0"
gem 'mongo', '~> 2.8'
mongoid.yml一部抜粋
production:
  clients:
    default:
      database: production
      hosts:
        - [PrimaryのIP]
        - [SecondaryのIP]
      options:
        read:
          mode: :primary

Mongodb

レプリカセット
Primary,Secondary,Arbiterの3台構成
OS: Ubuntu18
aptでインストール

バージョン
$ mongo --version
MongoDB shell version v3.4.19

バージョンアップ手順

MongoDBのバージョンアップ自体は簡単です。
こちらの手順に従って更新します。
https://docs.mongodb.com/manual/release-notes/3.6-upgrade-replica-set/

aptでインストールしている場合、各サーバで行うことは、source.listを更新してapt upgradeするだけです。

$ sudo rm /etc/apt/sources.list.d/mongodb-org-3.4.list
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
$ sudo systemctl stop mongod
$ sudo apt update
$ sudo apt upgrade
$ sudo systemctl start mongod
バージョン
$ mongo --version
MongoDB shell version v4.0.8

バージョンアップできました。

Mongoidのエラー

Mongoid側は基本的には特に変更なく、普通に使えました。
しかし、このように個別のクエリーでSecondaryをreadすると

User.read(mode: :secondary_preferred).first

下記のエラーが。

not master and slaveOk=false (13435)

ログを見てみると、Secondaryに対して、何故かmode: primaryでクエリを投げています。
これではエラーになります。

MONGODB | [SecondaryのIP]:27017 〜 $readPreference"=>{"mode"=>"primary"}

どうやら、mongoのFeatureCompatibilityVersionが3.6の状態だと発生し、3.4だと発生しないようです。
FeatureCompatibilityVersionの変更方法はこちら。

db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } )

解決策

mongoid.ymlを変更することで一応解決しました。
下記の部分を外します。
readのmodeはデフォルトがprimaryなので特に変わりはありません。

      options:
        read:
          mode: :primary

そうすると、FeatureCompatibilityVersionが3.6でも指定したmodeになり、エラーは発生しなくなりました。

MONGODB | [SecondaryのIP]:27017 〜 $readPreference"=>{"mode"=>"secondaryPreferred"}

どうもmongoid.ymlの設定を優先してしまっているようです。
mongo-ruby-driverのバグ?仕様変更?
現状原因不明です。

参考

https://docs.mongodb.com/manual/release-notes/3.6-upgrade-replica-set/
https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0