搭建高可用mongo集群3.4版本


说在开始之前:在搭建这个环境之前,已经有了一个师兄搭好的环境,虽然一样很棒,但是没有经过自己的手出来的东西,还是不属于自己,所以摸索着自己搭建一个吧,好巧不巧的是,新的版本中跟以前的版本搭建方式有了一些区别,解决这些问题,颇费了一番周折,在网上查不到有助于解决的信息,索性就开始了撰写自己的第一篇博客,意料之外,情理之中,我知道早晚有一天会开始写,只是不确切的知道什么时候开始,这个时候来了,索性就这样做吧。

在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写、海量数据高效存储、高可扩展性和高可用性这些难题。不过就是因为这些问题Nosql诞生了。

NOSQL有这些优势:

大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制。

高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病。

高性能,Nosql通过简单的key-value方式获取数据,非常快速。还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多。

灵活的数据模型,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。

高可用,NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如mongodb通过mongos、mongo分片就可以快速配置出高可用配置。

mongo在应用中有几种常见的模式,单实例、主从模式、副本集模式、分片。这几个方面,有相关博客已经做了很好的介绍和实践,这里就不再赘述了。在此贴上相关链接

1、单实例+主从模式: http://www.lanceyan.com/tech/mongodb/mongodb_cluster_1.html

2、副本集模式: http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html

3、深入副本集内部机制:http://www.lanceyan.com/tech/mongodb_repset2.html

4、分片: http://www.lanceyan.com/tech/arch/mongodb_shard1.html

这些不说,那我们说说什么呢,当然要说新版本新特性,还有,我搭建集群时遇到的坑,这是个漫长的故事。

接下来实战一下如何搭建高可用的mongodb集群:

首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里测试资源有限,只准备了 3台机器,在同一台机器只要端口不同就可以,看一下物理部署图:

搭建环境

  操作系统:linux ubuntu16.04.1 server

  mongo:mongodb-linux-x86_64-ubuntu1604-3.4.1

(大致的部署步骤我就仿照大神的步骤来,重点是中间的部署过程)

  1. 准备机器,IP分别设置为: 10.10.2.121、10.10.2.122、10.10.2.123。 
  2. 分别在每台机器上建立mongodb分片对应测试文件夹。
    1. #存放mongodb数据文件
      mkdir-p /data/mongodbtest
    2. #进入mongodb文件夹
      cd/data/mongodbtest
  3. 下载解压mongo,从官网下载mongodb-linux-x86_64-ubuntu1604-3.4.1.tgz
    1. 下载到本地,再上传到服务器,或者直接下载到服务器

    2. wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz

      2. #解压下载的压缩包到当前文件夹:tart -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.1.tgz

  4. 分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
    • #建立mongos目录
      mkdir -p /data/mongodbtest/mongos/log
    • #建立config server 数据文件存放目录
      mkdir -p /data/mongodbtest/config/data
    • #建立config server 日志文件存放目录
      mkdir -p /data/mongodbtest/config/log
    • #建立mongos server 日志文件存放目录
      mkdir -p /data/mongodbtest/mongos/log
    • #建立shard1 数据文件存放目录
      mkdir -p /data/mongodbtest/shard1/data
    • #建立shard1 日志文件存放目录
      mkdir -p /data/mongodbtest/shard1/log
    • #建立shard2 数据文件存放目录
      mkdir -p /data/mongodbtest/shard2/data
    • #建立shard2 日志文件存放目录
      mkdir -p /data/mongodbtest/shard2/log
    • #建立shard3 数据文件存放目录
      mkdir -p /data/mongodbtest/shard3/data
    • #建立shard3 日志文件存放目录
      mkdir -p /data/mongodbtest/shard3/log
  5. 规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
    这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.
  6. 在每一台服务器分别启动配置服务器。
    1. sudo ./mongodb-linux-x86_64-ubuntu1604-3.4.1/bin/mongod --configsvr --replSet configReplSet --dbpath /data/mongodbwsdc/config/data --port 21000 --logpath /data/mongodbwsdc/config/log/config.log --fork

      新版本中,官网强制添加副本集,必须给配置添加副本才可以启动后续mongos服务。这里configReplSet 为自定义副本集名称,接下来启动mongos也会用到该replSetName.

  7. 初始化配置副本集
    • 选择启动一台服务器,启动mongo客户端连接mongod

      mongo 10.10.2.121:21000
    • #添加配置
      config = {
          _id: "configReplSet",
          configsvr: true,
          members: [
            { _id : 0, host : "10.10.2.121:21000" },
            { _id : 1, host : "10.10.2.122:21000" },
            { _id : 2, host : "10.10.2.123:21000" }
          ]
        }
    • #初始化配置 
      rs.initiate(config)
  8. 在每一台服务器分别启动mongos服务器。
    • sudo ./mongodb-linux-x86_64-ubuntu1604-3.4.1/bin/mongos --configdb configReplSet/10.10.2.121:21000,10.10.2.122:21000,10.10.2.123:21000 --port 20000 --logpath /data/mongodbwsdc/mongos/log/mongos.log --fork
  9. 配置各个分片的副本集。
    • 在每个服务器上配置分别设置分片1、2、3服务器及副本集shard1、shard2、shard3
    • sudo ./mongodb-linux-x86_64-ubuntu1604-3.4.1/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbwsdc/shard1/data  --logpath /data/mongodbwsdc/shard1/log/shard1.log --fork --nojournal  --oplogSize 10
      sudo ./mongodb-linux-x86_64-ubuntu1604-3.4.1/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbwsdc/shard2/data  --logpath /data/mongodbwsdc/shard2/log/shard2.log --fork --nojournal  --oplogSize 10
      sudo ./mongodb-linux-x86_64-ubuntu1604-3.4.1/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodbwsdc/shard3/data  --logpath /data/mongodbwsdc/shard3/log/shard3.log --fork --nojournal  --oplogSize 10
  10. 任意登陆一个机器,初始化分片副本集配置

  

  

最新文章

  1. javascript-桥接模式
  2. Java 用自带dom解析器遍历叶子节点内容
  3. [转]Git - 重写历史
  4. C++杂谈(三)产生随机数与time函数
  5. ASP.NET-【状态管理】-Cookie小结
  6. c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_
  7. java练习-滚动文字
  8. Mvc Webapi+Fiddler调试 (WebAPI 一)
  9. iot前台开发环境:请求示例
  10. 关于java集合类HashMap的理解
  11. BZOJ_2529_[Poi2011]Sticks_贪心
  12. Friendly Date Ranges 让日期区间更友好
  13. 【模板】2-SAT 问题
  14. css 背景(background)属性、背景图定位
  15. Insert Into 语句的语法错误
  16. 在.NET中调用Java的类
  17. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
  18. 测试思想-集成测试 关于接口测试 Part1
  19. iOS变量定义在 .h 还是 .m 中
  20. TED #09# You don't have to be an expert to solve big problems

热门文章

  1. Express与NodeJs创建服务器的两种方法
  2. javascript 计算两个日期的差值
  3. 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
  4. 很傻很二很简单的一个问题,json键值为变量如何取值
  5. PHP 数组处理
  6. Spring的bean管理(注解)
  7. ssh免密码和ssh-copy-id命令
  8. 用js写出光棒效应的两种方法与jquery的两中方法
  9. ios常用资源网址链接
  10. nodeJS中读写文件方法的区别