mongodb部署--主备、副本及数据分片

主备复制

主备复制是最基本的一种多点部署方案,在读写分离、热备份、数据恢复等方面具有重要作用。
在真实的生产环境,主备库肯定需要部署在不同的服务器中,但鉴于学习测试,这里以一台机器的不同端口进行模拟。
准备工作:

  • 安装Mongodb的二进制程序安装步骤 假设已经安装在/usr/local/mongodb/目录
  • 为主库及备库创建数据目录:
    • 主库目录:/var/mongodb_master/data/ /var/mongodb_master/logs/
    • 备库目录:/var/mongodb_slave/data/ /var/mongodb_slave/logs/
  • 启动主备库服务:
    • 启动主库:

      1. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/var/mongodb_master/data/ --logpath=/var/mongodb_master/logs/log.log --master --port 27017 -fork
    • 启动备库:
      1. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/var/mongodb_slave/data/ --logpath=/var/mongodb_slave/logs/log.log --slave --port 27117 --source=127.0.0.1:27017 -fork

说明:在启动主库时,比普通启动多指定一个--master选项;在启动库备时比普通启动多指定一个--slave和--source选项。

  • master 说明当前实例以主库模式启动
  • slave 说明当前实例以备库模式启动
  • source 给备库指定主库的位置

通过上面几个步骤,其实就已经部署好了一主一备的mongodb集群。可以启动两个不同的mongo shell 连接到不同机器上,看主备数据是否能同步呢?

  1. sudo -u mongodb /usr/local/mongodb/bin/mongo 127.0.0.1:27017 ## 连到主库
  2. sudo -u mongodb /usr/local/mongodb/bin/mongo 127.0.0.1:27117 ## 连到备库

在主库上添加几条数据:

  1. use test
  2. for(var i = 0; i < 10; i++) {
  3. db.blog.insert({"author":"enjiex_" + i, "title":"mongodb title " + i});
  4. }

到备库的shell上看下:

  1. use test
  2. db.blog.find()

很神奇,数据竟然已经同步到备库上了。
如果只有一个主服务,另外一个计划外的服务如果想成为备库,也不需要重启服务的,只需要在将成为备库的local库里把主备source添加进来就ok。

  1. use local
  2. db.sources.insert("host":"127.0.0.1:27017")

不过,在备库上只能查询,并不能写入数据,并且当主备宕机或需要主备互换时甚至需要停止服务,所以对于热切换来说,还有更好的选择:副本集。

副本集

副本集,即副本的集合,每个mongodb服务在启动时并不区分主库备库,在运行中也没有特定的主库,所有的选择都是靠选举决定的。如果主库宕机,就会自动推选出新的主库。
先以两个副本为例:

  1. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s1/data/ --logpath/usr/mongodb_s1/logs/log.log --port 27017 --replSet enjiex/127.0.0.1:27117 -fork
  2. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s2/data/ --logpath/usr/mongodb_s2/logs/log.log --port 27117 --replSet enjiex/127.0.0.1:27017 -fork

创建副本也并没什么特别的地方,只需要在启动服务时指定--replSet选项即可,表示服务以副本集的方式部署。replSet后的参数:enjiex/127.0.0.1:27117中的enjiex为副本名称,后面的127.0.0.1:27117为副本集中另一副本的主机地址,也就是说需要在replSet后面指定副本名称和副本集中除自己外的其他副本服务的主机地址,如果有多个副本,用","隔开主机地址。
好了,副本集创建好了,但这时副本集还不能使用,因为需要先对他做下初始化。很简单,只需要通过mongo shell登录到任一副本服务,执行如下初始化命令即可:

  1. db.runCommand({"replSetInitiate":{
  2. "_id":"enjiex",
  3. "members":[{
  4. "_id":1,
  5. "host":"127.0.0.1:27017"
  6. },
  7. {
  8. "_id":2,
  9. "host":127.0.0.1:27117
  10. }
  11. ]
  12. }})

具有两个副本的副本集初始化完成,在初始化过程中,指定了副本集名称id:enjiex,以及两个副本成员。
一般情况下,执行副本初始化命令的那个服务会成为主服务,能提供正常的读写操作,并且其上的写操作会同步到各副本上。而其他的副本只有打开slaryOk后才能提供读服务,但始终不能提供写服务,除非其成为主服务。在副本节点上打开slaveOk命令如下:

  1. rs.slaveOk()

上面的主服务一般称为主节点,副本服务称为副本节点。对于上面的场景,假如主节点宕机,副本节点是否能顺利的晋升为主节点提供写服务呢?先来了解下选举算法吧。在mongodb的选举算法中,当主机宕机所有其他活跃的节点进行投票,当得票数大于副本集节点(包括已宕机的主节点)半数的节点才能成为主节点。所以对于上面的场景,如果主节点宕机,只有一个副本节点对自己投了一票,不满足当前主节点的条件,因此时间副本集就会处于不可写状态,直到主节点恢复。
为了避免上面的问题,在生产场景一般部署的副本集节点为奇数,所以可以基于上面的场景,再在副本集中添加一个副本节点或仲裁节点。副本节点在上面我们已经有所了解,那仲裁节点呢?其实也可看作是一个不能开启slaveOk的副本节点,也就是说完成不能提供读写服务,也不会成为主节点的节点,只能参与投票的节点。
添加仲裁节点和副本节点的方式基本是一样的,都需要先把副本启动:

  1. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s2/data/ --logpath/usr/mongodb_s2/logs/log.log --port 27217 --replSet enjiex/127.0.0.1:27017,127.0.0.1:27117 -fork

如果是添加副本节点,在主节点上执行:

  1. rs.add("127.0.0.1:27217")

如果添加的是仲裁节点,则在主节点上执行:

  1. rs.addAbr("127.0.0.1:27217")

好了,现在副本集中有3个节点,假如这时主节点宕机了,那么另外存活的副本节点就会投票选出一个新的主节点出来。(记住:仲裁节点只参与投票,但不能被选举)。如果原来宕机的主机又恢复服务了,那它也就只能以普通副本存在了。
在运行过程中,可以随机在副本集的任一台机器上执行如下命令查看副本集状态:

  1. rs.status()

该命令会列出副本集中的各节点及每个节点的状态:PRIMARY(主节点)、SECONDARY(副本节点)、ARBITER(仲裁节点),还能看到各节点的健康状态等信息。
最后,一个副本不再需要的话,可以在主节点上执行remove删除副本:

  1. rs.remove("127.0.0.1:27217")

数据分片

数据分片技术是为避免单个集合数据量过大影响性能,而把单个集合拆分到不同的mongodb服务集群中;因此至少需要两个mongod实例用于分片存储数据,另外还需要一个mongo-configdb用于存储分片配置及片键(即分片规则),基于mongo-configdb,执行mongos命令即可启动分片服务。

  • 启动mongo-configdb

    1. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/var/mongodb_config/data/ --logpath=/var/mongodb_config/logs/log.log --port27017 -fork

可以看出,mongo-configdb就是一个普通的mongod服务。

  • 开启mongos分片服务

    1. sudo -u mongodb /usr/local/mongodb/bin/mongos --logpath=/var/mongodb_mongos/logs/log.log --port 27117 --configdb=127.0.0.1:27017 -fork

mongos可以看作是一个对分片数据的路由,其本身不存储数据,因此无须dbpath,但其配置是基于mongo-configdb,所以需要通过configdb参数指定配置信息

  • 启动两个mongod服务

    1. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s1/data/ --logpath/usr/mongodb_s1/logs/log.log --port 27217 -fork
    2. sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s2/data/ --logpath/usr/mongodb_s2/logs/log.log --port 27317 -fork
  • 服务配置
    在分片集群中,mongos作为服务入口,因此客户端只需要连接到mongos服务上,无须知道后端的实际存储服务的位置。分片服务的配置也是在mongos上完成的:

    1. sudo -u mongodb /usr/local/mongodb/bin/mongo 127.0.0.1:27117
    2. db.runCommand({"addshard":"127.0.0.1:27217", "allowLocal":true})
    3. db.runCommand({"addshard":"127.0.0.1:27317", "allowLocal":true})

    上面添加了两个mongod服务作为mongos分片的数据存储服务,然后还需要指定需要分片的库和表、以及分片字段规则:

    1. db.runCommand({"enablesharding":"blogs"})
    2. db.runCommand({"shardcollection":"blogs.blog", "key":{"author":1}})

    尝试在mongos上添加些数据:

    1. use blogs
    2. for(var i = 0; i < 100; i++) {
    3. db.blog.insert({"author":"enjiex" + i, "title":"monge title" + i})
    4. }
    5. db.blog.find()
  • 查看分片情况:

    1. db.printShardingStatue()

MongoDB入门三步曲3--部署技术:主备、副本集和数据分片的更多相关文章

  1. MongoDB入门三步曲2--基本操作(续)--聚合、索引、游标及mapReduce

    mongodb 基本操作(续)--聚合.索引.游标及mapReduce 目录 聚合操作 MapReduce 游标 索引 聚合操作 像大多关系数据库一样,Mongodb也提供了聚合操作,这里仅列取常见到 ...

  2. MongoDB入门三步曲1--安装、基本操作

    mongodb 基本操作 目录 mongodb安装 mongod启动 mongo shell启动 mongod 停止 mongodb基本操作:CRUD 数据插入 数据查询 数据更新 数据删除 集合删除 ...

  3. [转]Membership三步曲之入门篇 - Membership基础示例

    本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例   Members ...

  4. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  5. ASP.NET 安全系列 Membership三步曲之入门篇 - Jesse Liu

    Membership 三步曲 ASP.NET 安全系列 Membership三步曲之入门篇 ASP.NET 安全系列 Membership三步曲之进阶篇 ASP.NET 安全系列 Membership ...

  6. Membership三步曲之进阶篇 - 深入剖析Provider Model

    Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...

  7. SQL Server2005 表分区三步曲(zz)

    前言 SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上.每一个表分区都和在某个文件 组(filegroup)中的单个文件关联.同样的一个文件/文件组可以容纳 ...

  8. VC控件自绘制三步曲

    http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处 ...

  9. 第七章 new的三步曲

    这章是本系列文章的重点,这章揭示了js对象的真正本质 看下面的事例 var a = new b(); 等价于 ①var a={}; ②a.__proto__=b.prototype; ③b.call( ...

随机推荐

  1. android128 zhihuibeijing 科大讯飞 语音识别

    - 科大讯飞 开放平台 http://open.voicecloud.cn/ package com.itheima.voicedemo; import android.app.Activity; i ...

  2. mysqldump原理5

    http://blog.csdn.net/niu870781892/article/details/6186078 导出多张表的时候表之间用空格分开: # mysqldump -h192.168.25 ...

  3. 火狐HACK

     /*针对Firefox*/@-moz-document url-prefix() {    #nav{ width:200px; }} 

  4. 手工配置tomcat 解决一闪而过~

    双击tomcat 目录下的bin目录下的startup.bat 如果看到Server startup in **** ms 显示在屏幕上证明你的配置都成功了 如果一闪而过,说明出错了.请在dos进入上 ...

  5. Java基础知识强化之网络编程笔记12:TCP之TCP协议上传文本文件并给出反馈

    1. 客户端: package cn.itcast_12; import java.io.BufferedReader; import java.io.BufferedWriter; import j ...

  6. PHP免费API调用,使用(CURL)

    <?phpclass GetApiModel{//获取第三方API //获取身份证信息 //返回json /*{ "errNum": 0, "retMsg" ...

  7. 谈谈MSP430 的框架程序

    最近在学习MSP430f149这块单片机,开始程序也没烧进去,弄了一天,发现串口不能下载,买了个jtag下载器,才搞定.现在也谈谈开始写程序的一些方法吧 程序重要的是框架,有这个基础之后才能行云流水的 ...

  8. 20160526-20160531mybatis入门进阶

    mybatis第二天  高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...

  9. Android MVP架构浅析

    Android之MVC模式 MVC好处: 从用户的角度出发,用户可以根据自己的需求,选择自己合适的浏览数据的方式.比如说,对于一篇在线文档,用户可以选择以HTML网页的方式阅读,也可以选择以pdf的方 ...

  10. hibernate设置mysql的timestamp默认值技巧

    首先,要想使用数据库中配置的默认值就必须不让hibernate覆盖了默认值,需要配置property insert="false" update="false" ...