mongodb副本集安装

前置工作

下载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

成功登录,则表明认证启用成功且用户名密码正确

总结

这里我由于硬件限制,使用的是伪分布式的方式,但是和真正的分布式区别不大。
部署主要分三步:

  • 前置工作:包括服务二进制下载,相关目录端口的规划、相关环境的初始化
  • 服务部署:主要是将服务正确的启动起来
  • 权限与认证:服务启动后,一些相关的配置工作,使服务更安全稳定的提供服务
发布了129 篇原创文章 · 获赞 203 · 访问量 45万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章