前置工作
下载mongo
mongodb 官方下载页面连接:https://www.mongodb.com/download-center/community
版本可以根据自己需要选择,由于我要使用 mongo事务的特性,只能选择 4.0 之后的版本,这里我选择 4.0.14
OS根据自己的系统选择,我的系统是 centos 7,选择 RHEL 7.0 Linux 64-bit x64 即可
下载并解压:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.14.tgz
tar -zvxf mongodb-linux-x86_64-rhel70-4.0.14.tgz
端口分配
服务 | Host | Port |
---|---|---|
node-0 | 10.38.160.174 | 27017 |
node-1 | 10.38.160.174 | 27027 |
node-2 | 10.38.160.174 | 27037 |
相关目录创建
安装目录:/home/work/app/mongodb
二进制目录:/home/work/app/mongodb/bin
数据目录:/home/work/app/mongodb/data/node-0,/home/work/app/mongodb/data/node-1,/home/work/app/mongodb/data/node-2
日志目录:/home/work/app/mongodb/logs
认证文件目录:/home/work/app/mongodb/auth
Mongodb二进制存储目录:/home/work/app/mongodb/bin
mkdir /home/work/app/mongodb
mkdir /home/work/app/mongodb/data/node-{0..2}
mkdir /home/work/app/mongodb/logs
mkdir /home/work/app/mongodb/auth
mv mongodb-linux-x86_64-rhel70-4.0.14/bin /home/work/app/mongodb
设置环境变量
vim ~/.bashrc # 这里为bash
export PATH=/home/work/app/mongodb/bin:$PATH
服务部署
启动服务
关键参数说明:
- –dbpath 数据目录路径
- –logpath 日志文件路径
- –logappend 以追加的方式写入日志而非覆盖(不设置可能会导致服务启动后,历史日志丢失)
- –fork 后台启动
- –port 绑定的端口
- –replSet 副本集名称
- –bind_ip_all 绑定所有端口(不指定,默认绑定127.0.0.1),等效于 --bind_ip 0.0.0.0
启动命令:
# 启动node-0
mongod --dbpath=/home/work/app/mongodb/data/node-0 --logpath=/home/work/app/mongodb/logs/node-0.log --logappend --fork --port=27017 --replSet=mytest --bind_ip_all
# 启动node-1
mongod --dbpath=/home/work/app/mongodb/data/node-1 --logpath=/home/work/app/mongodb/logs/node-1.log --logappend --fork --port=27027 --replSet=mytest --bind_ip_all
# 启动node-2
mongod --dbpath=/home/work/app/mongodb/data/node-2 --logpath=/home/work/app/mongodb/logs/node-2.log --logappend --fork --port=27037 --replSet=mytest --bind_ip_all
看到 child process started successfully
则表明启动成功,如果失败,可通过日志查看失败原因
登录mongo
登录命令如下:
mongo --host 10.38.160.174 --port 27017 # 这里端口随意,也可以选择 27027 或 27037
初始化集群,并设置 10.38.160.174:27017 为 primary :
可通过 priority 的设置决定master,不指定则默认为 1,关于 priority,详见Adjust Priority for Replica Set Member
use admin
# 初始化集群
rs.initiate({"_id":"mytest","members":[{"_id":0,"host":"10.38.160.174:27017",priority:2},{"_id":1,"host":"10.38.160.174:27027"},{"_id":2,"host":"10.38.160.174:27037"}]})
输出如下内容,则表明成功:
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1577104905, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1577104905, 1)
}
退出并重新登录:
exit # 退出mongo
# 重新登录
mongo --host 10.38.160.174 --port 27017 # 这里我们登录 27017端口
可以看到如下内容,表明集群设置成功,且 10.38.160.174:27017 为 PRIMARY 节点,符合预期:
mytest:PRIMARY>
至此,一个mongodb集群已经基本搭建完成可以使用,但是为了安全和更好地使用,我们需要创建用户并启用授权功能
权限与认证
创建用户名密码
这里我们创建了一个 admin
的用户,密码为 admin
,权限为 userAdminAnyDatabase
clusterAdmin
,更多身份与权限,参见:Users
use admin
db.createUser({
user:"admin",
pwd:"admin",
roles:[{
role:"userAdminAnyDatabase",db:"admin"
},{
role:"clusterAdmin",db:"admin"
}]
})
输出如下内容,则表明设置成功:
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "clusterAdmin",
"db" : "admin"
}
]
}
测试认证:
db.auth('admin', 'admin')
输出1
则表明设置成功。虽然用户名密码设置成功了,但是mongodb服务目前还是不支持认证的,需要让服务启用认证功能。
启用认证
启用认证后,不仅客户端连接需要认证,同样的,服务节点内部之间也是需要认证的,mongodb目前支持两种方,一种是keyfile方式,一种是证书方式,这里我们使用简单的keyfile的方式。keyfile方式原理上是将key存进文件中,key内容可以随意,推荐通过以下方式生成随机内容的keyfile:
openssl rand -base64 756 > /home/work/app/mongodb/auth/key.file
认证相关参数,更多信息参见Internal/Membership Authentication:
- –auth 启用认证
- –keyFile 集群之间证人token
- -u 用户名
- -p 密码
# 停止集群
mongod --dbpath=/home/work/app/mongodb/data/node-0 --logpath=/home/work/app/mongodb/logs/node-0.log --logappend --fork --port=27017 --replSet=mytest --bind_ip_all --shutdown
mongod --dbpath=/home/work/app/mongodb/data/node-1 --logpath=/home/work/app/mongodb/logs/node-1.log --logappend --fork --port=27027 --replSet=mytest --bind_ip_all --shutdown
mongod --dbpath=/home/work/app/mongodb/data/node-2 --logpath=/home/work/app/mongodb/logs/node-2.log --logappend --fork --port=27037 --replSet=mytest --bind_ip_all --shutdown
# 以认证方式重新启动
# 启动node-0
mongod --dbpath=/home/work/app/mongodb/data/node-0 --logpath=/home/work/app/mongodb/logs/node-0.log --logappend --fork --port=27017 --replSet=mytest --bind_ip_all --auth --keyFile=/home/work/app/mongodb/auth/key.file
# 启动node-1
mongod --dbpath=/home/work/app/mongodb/data/node-1 --logpath=/home/work/app/mongodb/logs/node-1.log --logappend --fork --port=27027 --replSet=mytest --bind_ip_all --auth --keyFile=/home/work/app/mongodb/auth/key.file
# 启动node-2
mongod --dbpath=/home/work/app/mongodb/data/node-2 --logpath=/home/work/app/mongodb/logs/node-2.log --logappend --fork --port=27037 --replSet=mytest --bind_ip_all --auth --keyFile=/home/work/app/mongodb/auth/key.file
测试登录:
mongo --host 10.38.160.174 --port 27017 -u admin -p admin
成功登录,则表明认证启用成功且用户名密码正确
总结
这里我由于硬件限制,使用的是伪分布式的方式,但是和真正的分布式区别不大。
部署主要分三步:
- 前置工作:包括服务二进制下载,相关目录端口的规划、相关环境的初始化
- 服务部署:主要是将服务正确的启动起来
- 权限与认证:服务启动后,一些相关的配置工作,使服务更安全稳定的提供服务