升级 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教程”