为本地Mac开发环境设置mongo服务

1)安装

Mac 上通过 brew 安装 Mongo 参考:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/#std-label-install

brew tap mongodb/brew
brew install mongodb-community@5.0

brew services start/restart/stop mongodb-community@5.0
brew services list

通过 brew 安装后,MongoDB 的配置文件在 /usr/local/etc/mongod.conf,可根据实际情况设置端口、认证、复制集等。

net:
  port: 27117
  bindIp: 0.0.0.0
replication:
  replSetName: rs0

2) 设置密码登录

创建超级用户、普通用户:
mongosh

use admin
db.createUser(
  {
    user: "root",
    pwd: "password",
    roles: [
      { role: "root", db: "admin" }
    ]
  }
)

// 创建用户test,对数据库testDB1、testDB2读写的权限,其authorizaiton的DB是testDB1。
use testDB1
db.createUser(
  {
    user: "testuser",
    pwd: "123",
    roles: [
      { role: "readWrite", db: "testDB" },
      { role: "readWrite", db: "testDB2" }
    ]
  }
)

给 root 用户设置 clusterManager 角色,这样才可以使用 rs.initiate()、rs.conf()与复制集相关的命令。

use admin
db.grantRolesToUser(
  "root",
  [ "clusterManager" ]
)

这个 dbAdminAnyDatabase 角色似乎很‘方便’。

db.grantRolesToUser("yourUser", [{"role": "dbAdminAnyDatabase", "db": "admin"}])

3)设置复制集。

复制集需要安全通行。首先生成 mongodb 私钥
Reference:https://docs.mongodb.com/manual/tutorial/enforce-keyfile-access-control-in-existing-replica-set/

openssl rand -base64 756 > KEY_PATH/mongo_server.key

修改配置设置 keyFile:

security:
  keyFile: KEY_PATH/mongo_server.key
  authorization: enabled

强制设置本地节点复制集名称。

replication:
  replSetName: rs0

重启 mongo

brew services restart mongodb-community

进入 mongosh,执行 rs.initiate()初始化数据集:

rs.initiate()
rs.conf()

4)强制设置 master 复制集。

遇到的问题及解决:开始在端口为 27017 的情况下按照 https://mongoing.com/docs/tutorial/convert-standalone-to-replica-set.html 介绍的方式把单节点的 mongo 服务转变为单复制集的方式运行。

接着又更改了 mongo 服务的端口为 27117,这样之前的复制集节点就不对了。
先加上当前 27117 端口的 mongo 服务作为一个复制集。

rs.add("127.0.0.1:27117")

查看复制集配置

rs0 [direct: primary] test> cfg = rs.conf()
{
  _id: 'rs0',
  version: 4,
  term: 30,
  members: [
    {
      _id: 0,
      host: '127.0.0.1:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long("0"),
      votes: 1
    },
    {
      _id: 1,
      host: '127.0.0.1:27117',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long("0"),
      votes: 1
    }
  ],
  protocolVersion: Long("1"),
  writeConcernMajorityJournalDefault: true,
  settings: {
    chainingAllowed: true,
    heartbeatIntervalMillis: 2000,
    heartbeatTimeoutSecs: 10,
    electionTimeoutMillis: 10000,
    catchUpTimeoutMillis: -1,
    catchUpTakeoverDelayMillis: 30000,
    getLastErrorModes: {},
    getLastErrorDefaults: { w: 1, wtimeout: 0 },
    replicaSetId: ObjectId("616d08c744db747bb7e580b8")
  }
}

删除第一节点,

cfg.members.splice(0,1)

强制执行重新配置

rs.reconfig(cfg, {force : true})

5)设置复制集。

通过用户名密码登录

mongosh --port 27117 -u testuser -p 123 --authenticationDatabase  test

6)Mac 环境设置 maxfile limit

查看当前设置:

launchctl limit maxfiles

如果 soft limit 是 256,则执行下面命令扩大。否则 mongo server 可用的线程将受限。

sudo launchctl limit maxfiles 65536 200000

因为机器重启后以上更改会失效,所以还需要添加以上命令到开机脚本中。因为使用到了 sudo,可使用 visudo 修改设置免密码。

%admin          ALL = (ALL) NOPASSWD: ALL

7)mongo.conf

mongo.conf 大致如此:
如果需要设置 MongoDB 无需认证登录的话,需要 authrozation、keyFile 这两个字段同时注释掉。·

systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1
  port: 27017
  maxIncomingConnections: 4096
security:
  keyFile: /YOURPATH/mongo_server.key
  authorization: enabled
replication:
  replSetName: rs0