阅读 102

MongoDB集群部署

一. MongoDB简介

MongoDB 是一个基于分布式文件存储的面向文档的、NoSQL、内存数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的:

  1. 模式自由 :可以把不同结构的文档存储在同一个数据库里

  2. 面向集合的存储:适合存储 JSON风格文件的形式,

  3. 完整的索引支持:对任何属性可索引,

  4. 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移。

  5. 自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

  6. 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组。

  7. 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划。

  8. 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)

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):

    1. 主节点负责数据的写入和更新,并在更新数据的同时,将操作信息写入名为 oplog 的日志文件当中

    2. 主节点还负责指定其他节点为从节点,并设置从节点数据的可读性,从而让从节点来分担集群读取数据的压力

  • 多个从节点(Secondary):

    从节点会定时轮询读取 oplog 日志,根据日志内容同步更新自身的数据,保持与主节点一致

  • 仲裁节点(Arbiter):

    该类节点可以不用单独存在,如果配置为仲裁节点,就主要负责在复本集中监控其他节点状态,投票选出主节点;仲裁节点不会用于存放数据;如果没有仲裁节点,那么投票工作将由所有节点共同进行

  • 无效节点(Down):

    当服务器挂掉或掉线时就会处于该状态

image-20210310135432516

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 返回结果后进行聚合并返回客户端

image-20210310141049537

三. 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

3.2 分片集群部署

作者:_小土狗_

原文链接:https://www.jianshu.com/p/bdbc7e72d313

文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐