公式の手順に沿って上げるだけと思いきや、意外とつまづいたのでここに記します。
マニアックな問題なので、該当する人は少ないかと思います。
前提
Rails
gem 'rails', '~> 5.2.1'
gem "mongoid", "~> 7.0"
gem 'mongo', '~> 2.8'
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/