升级 MongoDB 的版本从 3.4 到 3.6 时,在 Rails + Mongoid 中需要注意的事项

遵循公式的步骤,我本以为会很顺利,但意外地卡住了,所以在这里记录一下。因为这是一个繁琐的问题,所以可能适用的人比较少。

前提 tí)

火车轨道

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 – NoSQL数据库系统

主要,次要,仲裁者是由3个组件组成的复制集
操作系统: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错误

MongoDB的从属节点基本上没有特别的变化,可以正常使用。
然而,如果使用单独的查询来读取Secondary节点,可能会有些区别。

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模式的默认值是primary,所以没有什么特别的变化。

      options:
        read:
          mode: :primary

这样一来,FeatureCompatibilityVersion设置为3.6时也会采用指定的模式,而不会再出现错误。

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

目前的情况是,似乎优先使用了mongoid.yml的配置。这是mongo-ruby-driver的bug吗?还是有什么规格变动?目前还不清楚原因。

看看

https://docs.mongodb.com/manual/release-notes/3.6-upgrade-replica-set/ –> “MongoDB 3.6升级副本集的发行说明”
https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/ –> “在Ubuntu上安装MongoDB的MongoDB 3.6教程”