文档章节

mongodb 由2.6 升级到3.0

robin-yao
 robin-yao
发布于 2015/08/22 17:40
字数 2901
阅读 4404
收藏 15
点赞 1
评论 0

    本文主要介绍mongodb3.0的新特性,及具体由2.6 到3.0的升级过程。

    mongodb3.0的新特性:参照(http://dataunion.org/12868.html

    1 插件式存储引擎API

    类似mysql 的思想。 目前除了早期的MMAP存储引擎外,WiredTiger和 RocksDB 均已完成了对MongoDB的支持,前者更是在被MongoDB公司收购后更是直接引入到了MongoDB 3.0版本中。插件式存储引擎API的引入为MongoDB丰富自己武器库以处理更多不同类型的业务提供了无限可能,内存存储引擎、事务存储引擎甚至Hadoop在未来都有可能接入进来。

    2WiredTiger存储引擎

     MMAP存储引擎自身的天然缺陷(耗费磁盘空间和内存空间且难以清理,库级别锁)。

1文档级别并发控制: WiredTiger通过MVCC实现文档级别的并发控制,即文档级别锁。这就允许多个客户端请求同时更新一个集合内存的多个文档,再也不需要在排队等待 库级别的写锁。这在提升数据库读写性能的同时,大大提高了系统的并发处理能力。关于这一点的效果从监控工具mongostat就可以直接体现出来,旧版本 的监控指标会有locked db这一项(该项指标过高是mongo使用人员的一大痛点啊),而新版的mongostat已经看不到了。

 2磁盘数据压缩: WiredTiger支持对所有集合和索引进行Block压缩和前缀压缩(如果数据库启用了journal,journal文件一样会压缩),已支持的压 缩选项包括:不压缩、Snappy压缩和Zlib压缩。这为广大Mongo使用者们带来了又一福音,因为很多Mongo数据库都是因为MMAP存储引擎消 耗了过多的磁盘空间而不得已进行扩容。其中Snappy压缩为数据库的默认压缩方式,用户可以根据业务需求选择适合的压缩方式。理论上来说,Snappy 压缩速度快,压缩率OK,而Zlib压缩率高,CPU消耗多且速度稍慢。当然,只要选择使用压缩,Mongo肯定会占用更多的CPU使用率,但是考虑到 Mongo本身并不是十分耗CPU,所以启用压缩完全是值得的。 此外,WiredTiger存储方式上也有很大改进。旧版本Mongo在数据库级别分配文件,数据库中的所有集合和索引都混合存储在数据库文件中,所以即 使删掉了某个集合或者索引,占用的磁盘空间也很难及时自动回收。WiredTiger在集合和索引级别分配文件,数据库中的所有集合和索引均存储在单独的 文件中,集合或者索引删除后,对应的存储文件随即删除。当然,因为存储方式不同,低版本的数据库无法直接升级到WiredTiger存储引擎,只能通过导 出导入数据的方式来实现。

MMAPv1存储引擎提升

MongoDB 3.0出了引入WiredTiger外,对于原有的存储引擎MMAP也进行了一定的完善,该存储引擎依然是3.0版的默认存储引擎。遗憾的是改进后的 MMAP存储引擎依旧在数据库级别分配文件,数据库中的所有集合和索引都混合存储在数据库文件中,所以磁盘空间无法及时自动回收的问题如故。

1、锁粒度由库级别锁提升为集合级别锁

这在一定程度上也能够提升数据库的并发处理能力。

2、文档空间分配方式改变

在MMAP存储引擎中,文档按照写入顺序排列存储。如果文档更新后长度变长且原有存储位置后面没有足够的空间放下增长部分的数据,那么文档就要移动到文件 中的其他位置。这种因更新导致的文档位置移动会严重降低写性能,因为一旦文档发生移动,集合中的所有索引都要同步修改文档新的存储位置。

MMAP存储引擎为了减少这种情况的发生提供了两种文档空间分配方式:基于paddingFactor(填充因子)的自适应分配方式和基于 usePowerOf2Sizes的预分配方式,其中前者为默认方式。第一种方式会基于每个集合中文档更新历史计算文档更新的平均增长长度,然后在新文档 插入或旧文档移动时填充一部分空间,如当前集合paddingFactor的值为1.5,那么一个大小为200字节的文档插入时就会自动在文档后填充 100个字节的空间。第二种方式则不考虑更新历史,直接为文档分配2的N次方大小的存储空间,如一个大小同样为200字节的文档插入时直接分配256个字 节的空间。

MongoDB 3.0版本中的MMAPv1抛弃了基于paddingFactor的自适应分配方式,因为这种方式看起来很智能,但是因为一个集合中的文档的大小不一,所 以经过填充后的空间大小也不一样。如果集合上的更新操作很多,那么因为记录移动后导致的空闲空间会因为大小不一而难以重用。目前基于 usePowerOf2Sizes的预分配方式成为默认的文档空间分配方式,这种分配方式因为分配和回收的空间大小都是2的N次方(当大小超过2MB时则 变为2MB的倍数增长),因此更容易维护和利用。如果某个集合上只有insert或者in-place update,那么用户可以通过为该集合设置noPadding标志位,关闭空间预分配。

下面介绍由2.6 升级到3.0 的过程。

升级过程

1搭建3.0 分片+副本 集群模式

mongodb 集群一般是shard(分片)+ replicateSet(副本集)+mongos(路由)+config(配置服务)

shard :分片顾名思义就是把原本的数据放在一堆,现在分开放。可以分2堆 ,3 堆 ,n 堆,但是每堆之间的数据不能重复。

          这样做的好事自然是可以把数据分别放到不同的机器上。


replicateSet: 副本集 ,如上图所示 shard1 分片下边有三个节点(Primary,Secondary,Secondary)。replicateSet 英文名字一看就是复制集合,把一个分片的数据重复拷贝几份。这样可以做到数据容灾,当主节点挂掉后,可以通过选举机制选出一个节点做主节点,集群仍可以正常工作。工作机制如下图:

mongos :负责路由。所有的对mongodb集群 请求操作都有它来负责分发。一个集群中至少有一台mongos ,当然看自己心情,你可以多弄几台。这样在项目中用mongo 做为datasource 你就可以多配几个地址。一个路由挂掉了可以自动选择其他路由.

config:  配置服务器。负责记录集群中的配置信息,如一个集群由哪里分片组成,分片管理权限用户等等。

其实 分片 和副本集不是一定强求都要做,可以只用分片功能,或者只用副本集功能。

架构介绍完就是具体一步一步操作了

安装

      大部分系统都可以直接下载压缩包,直接解压,添加相应的环境变量即可。

        Ubuntu 用apt-get install 安装

            sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

            sudo echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" >             /etc/apt/sources.list.d/mongodb-org.list

            sudo apt-get update

            sudo apt-get install -y mongodb-org=3.0.5 mongodb-org-server=3.0.5 

            mongodb-org-shell=3.0.5 mongodb-org-mongos=3.0.5 mongodb-org-tools=3.0.5


部署

          我们部署采用3台服务器(每台机子  2个shard+config server+mongs)。从2.6起,mongodb的配置文件支持yaml格式。

        

        shard1配置

systemLog:
 destination: file

###日志存储位置
 path: /XX/shard1.log
 logAppend: true

security:
 keyFile: /XX/conf/mongo-keyfile
#
processManagement:
 fork: true

storage:
##journal配置
 journal:
  enabled: true
##数据文件存储位置
 dbPath: /XX/db/shard1/
##是否一个库一个文件夹
 directoryPerDB: true
##数据引擎
 engine: wiredTiger
 ##WT引擎配置
 wiredTiger:
  engineConfig:
##WT最大使用cache(根据服务器实际情况调节)
   cacheSizeGB: 3
##是否将索引也按数据库名单独存储
   directoryForIndexes: true
##表压缩配置
  collectionConfig:
   blockCompressor: snappy
##索引配置
  indexConfig:
   prefixCompression: true
##端口配置
net:
 port: 27117
##副本集
replication:
##oplog大小
 oplogSizeMB: 2048
##复制集名称
 replSetName: rs1
##分片
sharding:
##分片角色
 clusterRole: shardsvr

shard2的配置就改下replSetName 和 端口。

config 配置

systemLog:
 destination: file

###日志存储位置
 path: /XX/logs/configsvr.log
 logAppend: true

#
processManagement:
 fork: true

security:
 keyFile: /XX/conf/mongo-keyfile
storage:
##journal配置
 journal:
  enabled: true
##数据文件存储位置
 dbPath: /XX/db/config/
##数据引擎
 engine: wiredTiger
##WT引擎配置
 wiredTiger:
  engineConfig:
##WT最大使用cache(根据服务器实际情况调节)
   cacheSizeGB: 2
##是否将索引也按数据库名单独存储
   directoryForIndexes: true
##表压缩配置
  collectionConfig:
   blockCompressor: snappy
##索引配置
  indexConfig:
   prefixCompression: true
##端口配置
net:
 port: 28017
##分片
sharding:
##分片角色
 clusterRole: configsvr

mongos配置

systemLog:
 destination: file

###日志存储位置
 path: /XX/logs/mongos.log
 logAppend: true

security:
 keyFile: /XX/conf/mongo-keyfile
#
processManagement:
 fork: true

net:
 port: 27017
##分片
sharding:
##config server
 configDB: host1IP:28017,host2IP:28017,host3IP:28017

三台机子的配置相同,直接scp 拷贝即可。

启动   

   三台机子先把分片和config 都启动,然后启动mongos

mongod --config conf/mongod_shard1.conf 
mongod --config conf/mongod_shard2.conf 
mongod --config conf/configsvr.conf

    启动mongos     

    mongos --config conf/mongos.conf

配置分片副本集合

    //shard1 shard2 都需要执行下边过程。

//连接到一个分片上
mongo <server1宿主ip>:27117
//配置副本集
rs.initiate();
rs.add(“<server2宿主ip>:27117”);
rs.add(“<server3宿主ip>:27117”);
rs.status();
//Fix hostname of primary.
cfg = rs.conf();
cfg.members[0].host = "<server1宿主ip>:21117";
rs.reconfig(cfg);
rs.status();
//以上命令一个一个执行


路由上添加分片 

//连接到路由服务器
mongo <宿主ip>:27017
sh.addShard("rs1/<宿主ip>:27017");
sh.addShard("rs2/<宿主ip>:27017");
sh.status();

添加用户和角色

        以上启动过程都必须在非auth模式下启动的,配置中不要打开key-file选项(默认打开auth)。如果以auth模式打开,就不能配置用户和角色了,必须是配置完后,在加key-file选项(auth模式)打开。

        直接登录到mongos 上:

use admin //切换到admin数据库上
db.createUser({user: "admin",pwd: "pwd",roles: [ { role:"root", db: "admin"} ]}) //这个角色是个超级角色,融合了很多权限。当然也可以把角色力度分开添加。


        重新启动我们的mongo集群,然后在配置中加入key-file选项,以auth模式打开集群。

导数据

导出:

由旧的2.6 直接导出

mongodump -u usename -p pwd -d dbname  --out xxx/   &
导入:

mongoDB 3.0兼容2.6导出的数据。

mongorestore -u username -p pwd --authenticationDatabase=dbname restore_data/ -j 1   &(一定要加-j 否者会把机器内存全部干了了)

以上命令在终端启动时最好加&,以后台进程启动(防止终端连接中断,过程被打断,数据量大,可能会持续几个小时…)

监控

1 mongostat -u admin -p pwd  --authenticationDatabase=admin

2 tail -10f mongo.log

2 mongotop  不过不能用在mongos 只作用在具体的实例上。

其他

    关闭mongoDB

            千万不要 kill -9 pid,可以 kill -2 pid 或 db.shutdownServer()

    程序驱动

            spring-data spring-mongo 升级 ,datasource 配置也需要改变。有些类型映射需要手工转换(java.util.Date, java.sql.Date)

转发标注:http://my.oschina.net/robinyao/blog/495807

© 著作权归作者所有

共有 人打赏支持
robin-yao
粉丝 150
博文 54
码字总数 61496
作品 0
杭州
3分钟完成MongoDB2.6升级3.0

3分钟完成MongoDB2.6升级3.0 前言 Part1:写在最前 自从3.0版本起,MongoDB支持了WT存储引擎,这个引擎相对老的MMAPv1存储引擎来讲,具有更高的压缩比,且支持文档级并发控制。也正因为WT的优...

dbapower
07/04
0
0
php扩展mongo和mongodb对应的MONGODB版本

PHP Driver MongoDB 2.4 MongoDB 2.6 MongoDB 3.0 MongoDB 3.2 MongoDB 3.4 PHPLIB 1.1 + mongodb-1.2 ✓ ✓ ✓ ✓ ✓ PHPLIB 1.0 + mongodb-1.1 ✓ ✓ ✓ ✓ mongodb-1.1 ✓ ✓ ✓ ✓ mong......

gaolongquan
2017/11/01
0
0
Linux中安装MongoDB(2015-11-03 00:51:24)

背景:之前有过一次试过安装MongoDB,但是网上说的方法各种各样,再加上虚拟机有问题,所以就导致没安装成功,今天在群里面提问,经过一哥们的提醒,告诉我直接上官网,按照官网上的安装方法...

Dreyer
2015/11/03
0
0
MongoDB 3.0安装并随win7,win10开机自启

MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的程序下来。在下载页面可以看到,对操作系统支持很全面,OS X、Linux、Windows、Solaris都支持,而且都有各自的...

mosaic101
2015/08/08
0
0
MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999
05/02
0
0
MongoDB【最新版V2.6】- 发行说明

开发团队表示,MongoDB 2.6是迄今为止改进最大的版本,全面增强了核心服务器,引入了新的开创性的自动化工具、重要的企业特性等等。 MongoDB 2.6版本的主要改进包括: 1 重写了整个查询执行引...

止静
2014/10/13
0
0
windows 安装配置mongodb(更新 --logpath 错误解决办法)

为了本地测试,在win8.1上装了mongodb服务 1、下载mongodb,对应下载自己windows的版本,之后解压 http://www.mongodb.org/downloads 2、建立数据文件目录,windows的c盘一般情况下容量需要重...

tanzhgo077
2014/05/05
0
0
Mongodb学习(安装篇): 在centos下的安装

下载解压文件 解压文件 查看解压文件 将/lamp/mongodb-linux-i686-2.2.2/bin目录拷贝到/usr/local/mongodb下 创建数据存放和日志文件: 启动进程(以后台Daemon形式运行服务) 查看mongod进程 ...

tw5566
2013/01/19
0
0
MongoDB Windows环境安装及配置

1.第一步:下载合适的安装包,目前的最新版本为2.6,网址为:http://www.mongodb.org/downloads。 安装包有zip和msi两种格式,msi安装时不让选择安装路径,默认安装到C:Program FilesMongoD...

zero2hero
2014/08/18
0
0
centos7.3yum安装mongodb3.4

最小化安装centos7.3 服务器规划(说明: 配置静态IP请查看关于上篇环境配置的博客) 安装mongodb3.x 创建yum源 修改yum源 安装MongoDB软件包和相关工具 网速较慢, 比较耗时, 推荐tar包安装, 下...

paascloud
2017/09/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Iterm2安装Zsh + Oh My Zsh+Solarized

安装Oh My Zsh curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh 安装Zsh: 1.安装zsh brew install zsh 2.配置iterm2 sudo vim /etc/shells输入:......

孟飞阳
2分钟前
0
0
缓解ddos攻击的有效解决办法

因为防火墙无法处理所有类型的ddos攻击,下一代防火墙生成内置的DDoS防御,但是无法处理所有类型的攻击。对抗DDoS攻击的最佳做法是有专属的设备或者服务在攻击透过防火墙或者其他的IT基础设施...

上树的熊
3分钟前
0
0
Spark Streaming如何使用checkpoint容错

在互联网场景下,经常会有各种实时的数据处理,这种处理方式也就是流式计算,延迟通常也在毫秒级或者秒级,比较有代表性的几个开源框架,分别是Storm,Spark Streaming和Filnk。 伦理片 http...

刺猬一号
4分钟前
1
0
Xamarin Essentials教程地理定位Geolocation

Xamarin Essentials教程地理定位Geolocation 通过地理定位功能,应用程序可以获取用户的当前地理位置,如经纬度值。利用地理位置,可以在地图上定位,也可以转化物理位置,划分用户的归属地。...

大学霸
17分钟前
0
0
vue 编译警告 Compiled with 4 warnings

There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. Use equal casing.......

落雪飞声
21分钟前
0
0
开篇文章,长期记录安全情形

密码位置 密码位于注释中 密码位于服务器端文件中 通过访问根目录下.htaccess、robots.txt查看禁查路径 密码文件可能存在的路径:/、/extra/、/extras/ 密码加密 binary to base16 sha256 彩虹...

hirainn
34分钟前
0
0
mysql数据库设置root可以远程登录的方法

mysql数据库设置root可以远程登录的方法 Posted on 2018-02-21 21:08 sishuisufeng 阅读(161) 评论(0) 编辑 收藏 允许root用户在任何地方进行远程登录,并具有所有库任何操作权限,具体操作如...

rootliu
39分钟前
1
0
TensorFlow 图的基本操作

图的创建,一般只需要使用默认图就能满足大部分的需求了 # 1 创建图的方法# 在默认图中创建常量c = tf.constant(0.0)# 新建一个图g = tf.Graph()# 设置上下文管理器,标明操作...

阿豪boy
今天
0
0
git 忽略文件失效

git update-index --assume-unchanged */.project

林子大鸟
今天
1
0
实现验证码功能

1、实现验证码,并存储 import com.dtb.pc_enterprise.entity.EnterUserEntity;import com.dtb.pc_enterprise.service.AdminService;import com.dtb.pc_enterprise.util.RedisService;......

木九天
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部