`

[转]mongodb分布式集群架构

    博客分类:
  • DB
阅读更多

此文凝聚笔者不少心血请尊重笔者劳动,转载请注明出处。

http://freeze.blog.51cto.com/

 

一、关于mongodb

 

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

 

二、mongodb分布式应用原理

 

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

 

 

  1. 1、shards:一个shard为一组mongod,通常一组为两台,主从或互为主从,这一组mongod中的数据时相同的,具体可见《mongodb分布式之数据复制》。数据分割按有序分割方式,每个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,这同google的BigTable 类似。数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。

  2. 2、mongos:可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client 服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器上,然后整理返回的结果发回给client服务器。

  3. 3、config server:存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每台config server上的数据的一致性。

  4. 4、shard key:为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段组成以分发数据,比如:

  5. { name : 1 }

  6. { _id : 1 }

  7. { lastname : 1, firstname : 1 }

  8. { tag : 1, timestamp : -1 }

  9. mongoDB的分片为有序存储(1为升序,-1为降序),shard key相邻的数据通常会存在同一台服务

  10. (数据块)上。

三、mongodb分布式部署方式

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

 

 

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

 

四、mongodb分布式的安装

1、下载

  1. wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz

2、安装

  1. tar zxvf mongodb-linux-2.0.4.tgz

  2. cp -fr mongodb-linux-*2.0.4/* /data/mongodb/

  3. mkdir -p /data/mongodb/data/                                     #创建数据存储目录

  4. mkdir -p /data/mongodb/log/                                      #创建日志存储目录

  5. mkdir -p /data/mongodb/config/                                   #创建配置存储目录

  6. mkdir -p /data/mongodb/arbiter/                                  #创建仲裁节点存储目录

3、单机模式以及个参数说明

  1. mongod --fork --bind_ip 127.0.0.1 --port 11811 --dbpath /data0/mongodb/data --directoryperdb --logpath /data0/mongodb/log/db1.log --logappend  --nohttpinterface

  2. netstat -ntlp|grep mongod

 

  1. 简单的参数说明:

  2. –logpath 日志文件路径

  3. –master 指定为主机器

  4. –slave 指定为从机器

  5. –source 指定主机器的IP地址

  6. –pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。

  7. –logappend 日志文件末尾添加

  8. –port 启用端口号

  9. –fork 在后台运行

  10. –only 指定只复制哪一个数据库

  11. –slavedelay 指从复制检测的时间间隔

  12. –auth 是否需要验证权限登录(用户名和密码)

  13. –noauth 不需要验证权限登录(用户名和密码)

五、集群模式mongos,mongod,configsvr

  1. 1.Shard分片--

  2. 第一组分片  

  3. 192.168.200.226:    

  4. /data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface

  5. #启动rep1分片的一个数据节点

  6. /data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log   #启动路由节点,读取201.226上的配置节点的配置文件,(在配置节点启动后启动)

  7. /data/mongodb/bin/mongod --replSet rep1 --fork --port 11814 --dbpath /data/mongodb/arbiter --directoryperdb --logpath /data/mongodb/log/arbiter.log --logappend --nohttpinterface

  8. #启动分片的仲裁节点

  9. 192.168.201.226:    

  10. /data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface

  11. #启动rep1分片的第二个数据节点

  12. /data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log

  13. #启动第二个路由节点 (在配置节点启动后启动)

  14. 2.ConfigServer---

  15.    #启动config server  

  16.    192.168.201.226:    

  17.        /data/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/config --port 11812 --fork --logpath /data/mongodb/log/mc.log

  18. #启动配置节点,注意配置节点应该优先启动,不然路由节点读取不到配置节点信息则会启动失败。

  19. 3.Mongos路由---

  20.    #启动mongos,指定config server, chunkSize 256M

  21.    192.168.201.226:

  22.        /data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log

  23. #启动路由节点

由于机器有限,只配置了一个shard分片,该分片里有2个节点,新增加分片只需对应改replSet 名称即可。

  1. 4.配置replSet: 连接任一mongod members

  2. mongo 192.168.201.226:11813

  3. config = {_id: 'rep1', members: [

  4. {_id: 0, host: '192.168.200.226:11813', priority: 2},                    #priority 为定义优先级,默认为1,高优先级会被认为是主节点优先启用。

  5. {_id: 1, host: '192.168.201.226:11813'},

  6. {_id: 2, host: '192.168.200.226:11814', arbiterOnly: true}]

  7. }

  8.    rs.initiate(config);

  9.    rs.status()

 

  1. 5.连接mongos增加shard 80G

  2.    mongo 192.168.201.226:11811/admin

  3.    show dbs

  4.    use admin

  5.    db.runCommand({addshard:'rep1/192.168.201.226:11813,192.168.200.226:11813',maxsize:81920})

  6.    db.runCommand({listshards:1})

 

  1. 6.连接mongos增加创建test库和c1集合,并测试

  2.    mongo 192.168.201.226:11811/admin

  3.    db.runCommand({enablesharding:'test'})

  4.    printShardingStatus()

  5.    db.runCommand({shardcollection:'test.auto_increment_id', key:{_id:1}, unique : true})

  6.    db.runCommand({shardcollection:'test.c1', key:{_id:1}, unique : true})

  7.    for (var i = 1; i <= 100; i++)db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"})

  8.    db.c1.stats()

  9. db.createCollection("cap_coll", {capped:true, size:100000, max:100});

  10. db.mycoll.validate();

  11.  

  12. 7.检查: db.printCollectionStats()

  13.  

  14. 8.管理: mongo 127.0.0.1:11811

  15. show dbs

  16. use admin

  17. show collections

  18. db.serverStatus()

  19. db.shutdownServer()

  20. exit

 

  1. 9.索引:

  2. db.product_data.ensureIndex({data_id: 1}, {unique: true,dropDups: true}); #创建索引

  3. db.product_data.dropIndexes();                                           #删除索引

 

至此,mongodb的分布式架构就架起来了,并且通过测试和log的分析,可看服务是否正常,下面就需要php客户端的支持,和程序的运行,之后加到监控里,就可以在线上部署使用了。

 

六、PHP的MongoDB拓展的安装

  1. # wget http://pecl.php.net/get/mongo-1.2.6.tgz    

  2. # tar zxvf mongo-1.2.6.tgz    

  3. # cd mongo-1.2.6    

  4. # /usr/local/php5/bin/phpize    

  5. # ./configure --enable-mongo=share--with-php-config=/usr/local/php5/bin/php-config    

  6. # make && make installl  

PHP支持mongodb

  1. 将生成的拓展mongo.so文件添加到php.ini中,重启php-fpm,或者apache,然后查看下phpinfo()

  2. 请编辑php.ini文件。添加如下一行:

  3. extension=mongo.so

  4. 然后用php输出:phpinfo,就可以看到mongo的信息了。。这样就说明你安装成功的了!

 

七、监控配置

     早在去年已经出现MongoDBRedis的Cacti模板,使用它,你可以对你的MongoDB和Redis服务进行流量监控。cacti的模板一直在更新,若企业已经用到nosql这种非关系数据库如mongodb和redis。可按照以下教程,对mongodb和redis进行监控。

该模板可以监控以下资源:

mongodb:

redis:

 

一、下载模板:

wget http://mysql-cacti-templates.googlecode.com/files/better-cacti-templates-1.1.8.tar.gz

二、配置ssh公私钥无需密码登录:

因为cacti监控mongodb是需要登录到mongodb的服务端运行mongo的状态获取命令,所以需要ssh连接登录。

所以需要配置非交互式帐号密码登录。这里采用公私钥模式。

先在监控服务器生成一对公私钥。

 

  1. ssh-keygen ##如果是root用户,生成的默认目录为/root/.ssh下2个文件id_rsa(公钥) id_rsa.pub(私钥)

  2. cd /root/.ssh/ && chmod 600 id_rsa*     把这2个文件修改权限,为600

  3. ssh-copy-id -i /root/.ssh/id_rsa root@192.168.200.1  #加被监控节点公私钥认证

id_rsa.pub复制出来,放到被监控机器上,然后公钥的内容追加到需要被监控的主机也就是mongodb和redis的服务端。追加到.ssh/authorized_keys

然后用ssh连接你所安装mongodb或者redis的服务端,如果不需输密码连接上。则正常。下面就可以开始添加监控文件了。

三、配置监控脚本:

 

  1. mongodb或redis的监控所需到的是你下载目录中的better-cacti-templates-1.1.8\scripts下的

  2. ss_get_by_ssh.php 这个脚本 这个脚本需要放在cacti的服务端

  3. 如果你cacti是装到/var/www/html/cacti/目录下。

  4. 把该文件放在其下面的scripts目录下。别忘了看下权限。要有执行权限。

然后修改该文件。主要修改一下选项,大概在40行。

  1. # ============================================================================

  2. $ssh_user   = 'root';                          # SSH username

  3. $ssh_port   = 22;                               # SSH port

  4. $ssh_iden   = '-i /root/.ssh/id_rsa';     # SSH identity

  5. ##修改根据你的配置,你的ssh连接用户,还有认证私钥的位置。

大该在50行,还可以修改其默认的去探测的端口(如果redis不是正常默认端口启动需要修改这些)。

  1. $memcache_port = 11211;                   # Which port memcached listens on

  2. $redis_port    = 6379;                    # Which port redis listens on

如果是mongodb不是正常端口启动,则需要这样修改。找到以下字段,添加红色字段,这里注意mongo这个命令一定要找对。

  1. function mongodb_cmdline ( $options ) {

  2. return “echo \”db._adminCommand({serverStatus:1, repl:1})\” | /usr/local/mongo/mongodb/bin/mongo –port 10000″;

  3. }

配置完后保存退出。

可以先用测试命令测一下。语法如下:

  1. php /var/www/html/scripts/ss_get_by_ssh.php --type mongodb --host 192.168.200.1 --items c,de,df,dg,dh,di,dj,dk,dl,dm,dn,do,dp,dq,dr,ds,dt,du

如果有数据输出。则表示正常。

 

四、在cacti里添加mongodb和redis模板:

4.1 模板导入

模板目录为better-cacti-templates-1.1.8\templates

4.2 导入后对被监控机添加模板:

4.3 添加后为其绘图:

五:实际效果测试:

 

分享到:
评论

相关推荐

    基于MongoDB分布式集群架构的日志系统及分片方法.docx

    【基于MongoDB分布式集群架构的日志系统及分片方法】 MongoDB是一种流行的开源文档数据库,以其灵活性、可扩展性和高性能而被广泛应用于日志管理、大数据处理和其他领域。本技术方案涉及利用MongoDB的分布式集群...

    MongoDB分布式搭建执行文件(直接可运行)搭建MongoDB分布式集群

    (3) 请在报告中使用文字和截图详细描述MongoDB分片集群搭建及配置的主要步骤: - 搭建配置集服务器(Mongod) - 搭建分片集服务器(Mongod) - 搭建路由节点服务器(Mongos) - 添加分片集到集群 - 创建数据库...

    深入了解MongoDB 分布式集群

    MongoDB 分布式集群是MongoDB数据库系统中的一个重要特性,它允许数据库跨越多个服务器,以提供水平扩展、高可用性和故障恢复能力。MongoDB的分布式设计使得它能够处理大规模的数据存储和复杂的查询操作,适合于...

    MongoDB分布式集群搭建

    ### MongoDB分布式集群搭建详解 #### 一、集群与分布式概念 **集群(Cluster)**与**分布式(Distributed)**是两种常见的架构设计模式,用于提高系统的可用性、可伸缩性和性能。 1. **集群(Cluster)** - **定义**:...

    Linux安装ElasticSearch与MongoDB分布式集群环境下数据同步

    ### Linux安装ElasticSearch与MongoDB分布式集群环境下数据同步 #### 概述 在现代的大数据处理场景下,为了提高数据处理效率以及更好地利用资源,通常会采用多种数据库技术组合的方式来构建系统架构。Elastic...

    毕业设计后端 - 基于MongoDB分布式数据库集群的斗鱼弹幕采集系统设计.zip

    该毕业设计项目主要关注的是构建一个基于...综上所述,这个毕业设计项目涵盖了MongoDB分布式数据库的使用、实时数据采集、Node.js后端开发、Web系统架构等多个核心IT技术,对于学习和掌握这些技能提供了实战平台。

    MongoDB集群架构.pptx

    以下是对MongoDB集群架构的详细说明,包括复制集和分片集群的关键概念和最佳实践。 1. **复制集**: - **读写设置**:复制集的主要目的是提供高可用性。默认情况下,所有写操作都会发送到Primary节点,读操作也...

    58同城高级系统架构师带你实战MongoDB集群分布式存储

    #### 二、MongoDB集群架构设计 MongoDB支持多种部署模式,包括单机部署、主从复制、副本集和分片等。其中,**集群**主要是指通过**分片(Sharding)**和**副本集(Replica Set)**两种技术实现的数据分布和高可用...

    PHP高级工程师必知必会Nginx+keepalived+MongoDB+haproxy+Sphinx实现分布式集群部署实战视频

    本文将围绕“Nginx + keepalived + MongoDB + haproxy + Sphinx”这一技术栈,详细介绍如何实现一个稳定的分布式集群部署方案。 #### 二、关键技术解析 ##### 1. Nginx **定义**:Nginx是一款高性能的HTTP和反向...

    java面试 分布式 集群 mongodb redis

    ### Java面试中的分布式集群关键技术:MongoDB与Redis #### 心跳机制详解 在分布式系统中,为了确保各个节点间的连接稳定性和及时发现并处理断线情况,通常会使用心跳机制来保持通信链路的活跃状态。心跳机制的...

    基于MongoDB云计算下GML分布式集群环境搭建研究.pdf

    根据提供的文件内容,这篇文章主要探讨了在云计算环境下,如何基于MongoDB搭建GML(Geography Markup Language)分布式集群环境。接下来,我们将详细解析文章中涉及的关键知识点。 ### 分布式系统与分布式开发 ...

    基于MongoDB的高可用性分布式数据库集群技术研究.pdf

    特别是对于需要高并发处理能力和大数据量处理能力的应用场景,MongoDB的分布式架构可以提供显著的优势。同时,MongoDB支持动态查询、模式自由、完整的索引支持等特性,使得开发者能够灵活地构建各种复杂的应用。 在...

    大型分布式网站架构设计与实践.带目录书签.完整版

    《大型分布式网站架构设计与实践》是一本深入探讨如何构建高效、可扩展、高可用性的分布式网站架构的专业书籍。在当今互联网行业中,随着用户数量的急剧增长和业务复杂度的不断提升,传统的单体架构已无法满足需求,...

    mongodb分布式理解

    #### 一、MongoDB 集群架构 MongoDB 的分布式部署涉及多种服务组件,这些组件协同工作以提供高度可扩展且具有容错能力的数据存储解决方案。 **1.1 配置服务(Config Server)** 配置服务负责存储集群的元数据信息...

    单台windows搭建mongoDb主从集群

    MongoDB是一种流行的开源、分布式文档型数据库,常用于处理大量数据。在Windows环境中,搭建MongoDB的主从复制集群是一项常见的任务,以实现数据冗余和高可用性。以下是关于"单台windows搭建mongoDb主从集群"的知识...

Global site tag (gtag.js) - Google Analytics