一. MongoDB简介
MongoDB 是一个基于分布式文件存储的面向文档的、NoSQL、内存数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的:
模式自由 :可以把不同结构的文档存储在同一个数据库里
面向集合的存储:适合存储 JSON风格文件的形式,
完整的索引支持:对任何属性可索引,
复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移。
自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。
丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组。
快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划。
高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
MongoDB与关系型数据库的对照关系:
RDBMS概念 | MongoDB概念 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 行数据/文档 |
column | field | 字段 |
index | index | 索引 |
table joins | aggregate + $lookup | MongoDB 3.2 版本过后,我们可以使用 $lookup 进行连表查询 |
嵌入文档 | MongoDB可以通过嵌入文档,实现表连接的功能 | |
primary key | primary key | 主键,mysql中建表时指定,MongoDB自动将_id自动设置为主键 |
二. MongoDB的集群方案
MongoDB 有三种集群部署模式,分别为:主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)
实际生产环境中,通常将 Replica Set 和 Sharding 两种技术结合使用:每个分片上部署一个副本集
2.1 主从复制(不推荐)
MongoDB 官方建议用副本集替代主从复制
主从复制是 MongoDB 中最简单的数据库同步备份的集群技术,其基本的设置方式是建立一个主节点、和一个或多个从节点:
-
一个主节点(Primary):
提供所有的增、删、查、改服务;主节点要记录所有操作;当主节点出现故障时,只能人工介入,指定新的主节点,从节点不会自动升级为主节点;主节点故障时,该集群架构只能处于只读状态
-
一个/多个从节点(Secondary):
默认不提供任务服务,也可以通过设置使从节点提供查询服务;从节点要知道主节点的地址;从节点定期轮询主节点记录的操作,并在本节点执行
2.2 副本集(Replica Set)
类似'主从复制',为一主多从的架构,主要区别在于:主节点发生故障时,副本集可以自动投票,选举出新的主节点,即 副本集是自带故障转移功能的主从复制
Replica Set 使用的是 N 个 mongod
节点构建的具备自动容错功能、自动恢复功能的高可用方案:
-
一个主节点(Primary):
主节点负责数据的写入和更新,并在更新数据的同时,将操作信息写入名为 oplog 的日志文件当中
主节点还负责指定其他节点为从节点,并设置从节点数据的可读性,从而让从节点来分担集群读取数据的压力
-
多个从节点(Secondary):
从节点会定时轮询读取 oplog 日志,根据日志内容同步更新自身的数据,保持与主节点一致
-
仲裁节点(Arbiter):
该类节点可以不用单独存在,如果配置为仲裁节点,就主要负责在复本集中监控其他节点状态,投票选出主节点;仲裁节点不会用于存放数据;如果没有仲裁节点,那么投票工作将由所有节点共同进行
-
无效节点(Down):
当服务器挂掉或掉线时就会处于该状态
2.3 分片(Sharding)
Sharding模式,通过将数据分开存储,不同服务器保存不同的数据(
所有服务器数据的总和即为整个数据集
),来实现处理大量数据。几个核心词汇扫盲:
- mongod:核心数据库进程,是mongoDB的核心守护进程,用于处理数据请求、管理数据访问、执行后台管理操作
- mongos:
MongoDB Shard Utility
,分片群集的控制器和查询路由器
- mongo:交互式MongoDB Shell
构建一个 MongoDB 的分片集群,需要三个重要的组件,分别是分片服务器、配置服务器和路由服务器
-
分片服务器(Shard Server)
即一个
mongod
数据库实例,用于存储实际的数据块;在实际生产中,一个 Shard Server 可由几台机器组成一个副本集来承担,防止因主节点单点故障导致整个系统崩溃 -
配置服务器(Config Server)
即一个独立的
mongod
进程,保存集群和分片的元数据,在集群启动最开始时建立,保存各个分片包含数据的信息 -
路由服务器(Route Server)
即一个独立的
mongos
进程,在集群中可作为路由使用,客户端由此接入,让整个集群看起来像是一个单一的数据库,提供客户端应用程序和分片集群之间的接口;Route Server 本身不保存数据,启动时从 Config Server 加载集群信息到缓存中,并将客户端的请求路由给每个 Shard Server,在各 Shard Server 返回结果后进行聚合并返回客户端
三. Mongo集群部署
3.1 简单副本集部署
1)下载&解压
cd /usr/local/mongodb/
# 下载
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz
# 复制至其他服务器
scp -P ${ssh端口} /usr/local/mongodb-linux-x86_64-4.0.0.tgz ${用户名}@${主机}:/usr/local
# 解压
tar -zxvf mongodb-linux-x86_64-4.0.0.tgz
# 将解压包拷贝到指定目录
mv mongodb-linux-x86_64-4.0.0/ /usr/local/mongodb
# 构建软连接
ln -s /usr/local/mongodb/bin/mongod /usr/bin/
ln -s /usr/local/mongodb/bin/mongo /usr/bin/
2)修改配置
# 创建相关存储目录
cd /usr/local/mongodb
# 创建db存放目录
mkdir -p ./data/db
# 创建日志存放目录
mkdir -p ./logs
# 利用touch命令创建空白日志文件
touch ./logs/mongodb.log
vim mongodb.conf
########### 编辑mongodb配置文件 ###########
#端口号
port=27017
#db目录
dbpath=/usr/local/mongodb/data/db
#日志目录
logpath=/usr/local/mongodb/logs/mongodb.log
#kfile地址
keyFile=/data/mongodb/mongodb-keyfile
#日志增加而不是覆盖
logappend=true
#进程ID文件路径
pidfilepath=/var/run/mongod.pid
#允许远程IP连接
bind_ip=0.0.0.0
#操作日志大小
oplogSize=10000
#是否后台运行 进程在后台运行的守护进程模式
fork=true
#开启用户认证
#auth=true
3)创建副本集认证key文件
# 创建目录
mkdir -p /data/mongodb
# 创建key文件
openssl rand -base64 741 > /data/mongodb/mongodb-keyfile
# 复制key文件至其他服务器
scp -P ${ssh端口} /data/mongodb/mongodb-keyfile ${用户名}@${主机}:/home/weihu/
scp -P ${ssh端口} /data/mongodb/mongodb-keyfile ${用户名}@${主机}:/home/weihu/
# 移动至指定目录
mv /home/weihu/mongodb-keyfile /data/mongodb/mongodb-keyfile
# 修改成 600 的文件属性
chmod 600 /data/mongodb/mongodb-keyfile
4)启动服务
# 启动服务
mongod -f /usr/local/mongodb/mongodb.conf
5)组建副本集
# 选择admin数据库
use admin
# 创建配置项
config = {_id: 'replSet', members: [{_id: 0, host: '172.17.0.3:27018'},{_id: 1, host: '172.17.0.4:27018'},{_id: 2, host:'172.17.0.5:27018'}]}
{
"_id" : "replSet",
"members" : [
{
"_id" : 0,
"host" : "${主机1}:27018"
},
{
"_id" : 1,
"host" : "${主机2}:27018"
},
{
"_id" : 2,
"host" : "${主机3}:27018"
}
]
}
# 初始化副本集:返回{ "ok" : 1 }即成功
rs.initiate(config)
# 查看副本集状态,找到primary节点的IP
rs.status()
6)创建帐户密码
# 连接主节点
mongo --port 27018
# 切换数据库
use admin
#创建分配用户权限的帐户:admin
db.createUser(
{
user: "admin",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)
# 验证
db.auth('admin', '123456')
# 查询用户
show users
db.system.users.find()
#没有则创建mytest数据库
use mytest
# 创建数据库用户
db.createUser({user:"mytest",pwd:"mytest",roles:[{role:"dbOwner",db:"mytest"}]})
7)设置开机启动
vi /etc/rc.d/rc.local #加入下面的自启动脚本
/root/mongodb/bin/mongod -f /root/mongodb/mongo.conf
8)测试验证
# 连接服务
/usr/local/mongodb/bin/mongo
# 测试
show dbs