为本地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