文档章节

mongodb分布式集群架构

浮躁的码农
 浮躁的码农
发布于 2016/04/13 08:28
字数 1835
阅读 1853
收藏 0
一、关于mongodb
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当***能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

二、mongodb分布式应用原理
MongoDB集群包括一定数量的mongod(分片存储数据)、mongos(路由处理)、config server(配置节点)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。

mongodb分布式集群架构 - Figthing - Figthing的博客

1、shards:一个shard为一组mongod,通常一组为两台,主从或互为主从,这一组mongod中的数据时相同的,具体可见《mongodb分布式之数据复制》。数据分割按有序分割方式,每个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,这同google的BigTable 类似。数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。 
  
2、mongos:可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client 服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器上,然后整理返回的结果发回给client服务器。 
  
3、config server:存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每台config server上的数据的一致性。 
  
4、shard key:为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段组成以分发数据,比如: 
  
{ name : 1 } 
{ _id : 1 } 
{ lastname : 1, firstname : 1 } 
{ tag : 1, timestamp : -1 } 
  
mongoDB的分片为有序存储(1为升序,-1为降序),shard key相邻的数据通常会存在同一台服务
(数据块)上。 

三、mongodb分布式部署方式
服务器部署可以有多种方式。首先,每台config server、mongos、mongod都可以是单独的服务器,但这样会导致某些服务器的浪费,比如config server。下图为物理机共享的集群部署,不需要额外加机器。
 
mongodb分布式集群架构 - Figthing - Figthing的博客

当然也有其他的方案,比如把mongos部署在所有的mongod(server1-6)上,又或者在每个运用服务器(server7)上部署mongos。这样部署有个好处在于,appserver和mongos之间的通信建立在localhost interface上,减少了通信成本。当然,此乃官方说法,但本人有想法,尽管减少了appserver和mongos之间的通信成本,但mongos与mongod之间的通信成本却增加了,而且把mongos部署在appserver上并不是很利于sa管理,mongoDB应该是一个相对独立的系统,与应用的耦合度应该尽量降到最低,万一应用想要换数据库,也能多少减少些工作量。
 
四、mongodb分布式的安装
1、下载
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz

2、安装
tar zxvf mongodb-linux-2.0.4.tgz 
cp -fr mongodb-linux-*2.0.4/* /data/mongodb/ 
mkdir -p /data/mongodb/data/                                     #创建数据存储目录 
mkdir -p /data/mongodb/log/                                      #创建日志存储目录 
mkdir -p /data/mongodb/config/                                   #创建配置存储目录 
mkdir -p /data/mongodb/arbiter/                                  #创建仲裁节点存储目录 

3、单机模式以及个参数说明
mongod --fork --bind_ip 127.0.0.1 --port 11811 --dbpath /data0/mongodb/data --directoryperdb --logpath /data0/mongodb/log/db1.log --logappend  --nohttpinterface 
netstat -ntlp|grep mongod 
 
 简单的参数说明: 
–logpath 日志文件路径 
–master 指定为主机器 
–slave 指定为从机器 
–source 指定主机器的IP地址 
–pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。 
–logappend 日志文件末尾添加 
–port 启用端口号 
–fork 在后台运行 
–only 指定只复制哪一个数据库 
–slavedelay 指从复制检测的时间间隔 
–auth 是否需要验证权限登录(用户名和密码) 
–noauth 不需要验证权限登录(用户名和密码) 

五、集群模式mongos,mongod,configsvr
1.Shard分片-- 
第一组分片  
192.168.200.226:     
/data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface 

#启动rep1分片的一个数据节点
/data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log  #启动路由节点,读取201.226上的配置节点的配置文件,(在配置节点启动后启动)
/data/mongodb/bin/mongod --replSet rep1 --fork --port 11814 --dbpath /data/mongodb/arbiter --directoryperdb --logpath /data/mongodb/log/arbiter.log --logappend --nohttpinterface 
#启动分片的仲裁节点
  
192.168.201.226:     
/data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface
 #启动rep1分片的第二个数据节点
/data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log 
#启动第二个路由节点 (在配置节点启动后启动)
  
2.ConfigServer--- 
#启动config server  
    192.168.201.226:     
        /data/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/config --port 11812 --fork --logpath /data/mongodb/log/mc.log 
   #启动配置节点,注意配置节点应该优先启动,不然路由节点读取不到配置节点信息则会启动失败。

3.Mongos路由--- 
    #启动mongos,指定config server, chunkSize 256M 
    192.168.201.226: 
        /data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log 
#启动路由节点
由于机器有限,只配置了一个shard分片,该分片里有2个节点,新增加分片只需对应改replSet 名称即可。

4.配置replSet: 连接任一mongod members 
mongo 192.168.201.226:11813 
config = {_id: 'rep1', members: [ 
{_id: 0, host: '192.168.200.226:11813', priority: 2},                     #priority 为定义优先级,默认为1,高优先级会被认为是主节点优先启用。 
{_id: 1, host: '192.168.201.226:11813'}, 
{_id: 2, host: '192.168.200.226:11814', arbiterOnly: true}] 
    rs.initiate(config); 
    rs.status() 
 
5.连接mongos增加shard 80G 
    mongo 192.168.201.226:11811/admin 
    show dbs 
    use admin 
    db.runCommand({addshard:'rep1/192.168.201.226:11813,192.168.200.226:11813',maxsize:81920}) 
    db.runCommand({listshards:1}) 
 
6.连接mongos增加创建test库和c1集合,并测试 
 
    mongo 192.168.201.226:11811/admin 
    db.runCommand({enablesharding:'test'}) 
    printShardingStatus() 
    db.runCommand({shardcollection:'test.auto_increment_id', key:{_id:1}, unique : true}) 
    db.runCommand({shardcollection:'test.c1', key:{_id:1}, unique : true}) 
    for (var i = 1; i <= 100; i++)db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"}) 
    db.c1.stats() 
  
db.createCollection("cap_coll", {capped:true, size:100000, max:100}); 
db.mycoll.validate(); 
 
7.检查: 
db.printCollectionStats()
 
8.管理: 
mongo 127.0.0.1:11811
show dbs
use admin
show collections
db.serverStatus()
db.shutdownServer()
exit
 
9.索引: 
db.product_data.ensureIndex({data_id: 1}, {unique: true,dropDups: true}); #创建索引   
db.product_data.dropIndexes();  #删除索引


本文转载自:http://blog.163.com/023_dns/blog/static/118727366201341804921987/

浮躁的码农

浮躁的码农

粉丝 71
博文 851
码字总数 154515
作品 0
松江
程序员
私信 提问
MongoDB深圳用户组线下活动来了

MongoDB线下用户组是由全世界MongoDB爱好者发起的不定期线下交流活动。目前全球有100多个MongoDB用户组,3万5千多爱好者参与。用户组活动的形式通常会有一到两个MongoDB相关的技术分享。分享...

MongoDB中文社区
2016/07/02
0
0
《阿里巴巴MongoDB4.0高级实战:基于Java Spring Boot 2.0》运维、监控、聚合、集群、监控等高级面试题

《阿里巴巴MongoDB4.0高级实战》阿里巴巴技术大牛 资深专家P9叶翔、专家徐雷. NoSQL排名第一!最流行的NoSQL数据库;谷歌、阿里巴巴、蚂蚁金服、腾讯、百度等一线互联网公司必备技能。 本系列...

徐雷frank
2018/11/01
0
0
MongoDB深圳用户组线下活动来了

MongoDB线下用户组是由全世界MongoDB爱好者发起的不定期线下交流活动。目前全球有100多个MongoDB用户组,3万5千多爱好者参与。用户组活动的形式通常会有一到两个MongoDB相关的技术分享。分享...

MongoDB中文社区
2016/07/02
26
0
使用Docker和Kubernetes将MongoDB作为微服务运行

原文:Running MongoDB as a Microservice with Docker and Kubernetes 作者:Andrew Morgan 译者:徐雷 MongoDB是NoSQL排名第一的数据库,Docker是最流行的容器引擎,Kubernetes是谷歌开源的...

徐雷frank
03/16
0
0
MySQL Cluster 与 MongoDB 复制群集分片设计及原理

分布式数据库计算涉及到分布式事务、数据分布、数据收敛计算等等要求 分布式数据库能实现高安全、高性能、高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL...

微笑向暖wx
01/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 吾不好梦中插人

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @鱼豆腐233 :#今日歌曲分享# 分享My Chemical Romance的单曲《I Don't Love You》: 《I Don't Love You》- My Chemical Romance 手机党少年们...

小小编辑
今天
92
8
ss5 vpn 安装(linux版本)

1. 创建一个文件夹 /ss5 你也可以自定义,不过后续的地方需要注意自己的地址 2. 下载ss5文件(如果你的服务器没有安装wget请使用 yum -y install wget 命令安装 如果连yum都没安装自己查去)(下...

太黑_thj
今天
2
0
八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
5
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
3
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部