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 分片集群部署

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容