一、架构介绍
        mongodb有几种部署方式,这里采用的是副本集架构(Replica Set)。
        为了防止单点故障就需要引副本(Replication),当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复,最好能够自动的故障转移(failover)。有时引入副本是为了读写分离,将读的请求分流到副本上,减轻主(Primary)的读压力。而Mongodb的Replica Set都能满足这些要求。
        Replica Set的一堆mongod的实例集合,它们有着同样的数据内容。包含三类角色:
        主节点(Primary):接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。
        副本节点(Secondary):与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
        仲裁者(Arbiter):不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。
注意,一个自动failover的Replica Set节点数必须为奇数,目的是选主投票的时候要有一个大多数才能进行选主决策。
     
        由图可以看到客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。我们看一下主服务器挂掉后的架构:
 
        副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。

二、安装部署
    选择三台服务器:10.211.55.7(主节点)   10.211.55.8(副本节点)  10.211.55.9(副本节点)
    下载mongodb:wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.7.tgz
    解压到:/data/program/software
    文件夹重命名为mongodb
    进入mongodb目录:cd /data/program/software/mongodb
    新建两个文件夹:mkdir db
                mkdir logs
    进入bin目录cd /data/program/software/mongodb/bin
    新建配置文件:touch mongodb.conf
              dbpath=/data/program/software/mongodb/db
              logpath=/data/program/software/mongodb/logs/mongodb.log
              port=27017
              fork=true
              nohttpinterface=true

分别三台服务器上启动mongodb:

/data/program/software/mongodb/bin/mongod --replSet repset -f

/data/program/software/mongodb/bin/mongodb.conf

各个服务器查看,都已经启动:
            [root@bigdata3 bin]# ps -ef|grep mongodb

root      2574     1  1 22:09 ?   00:00:00 /data/program/software/mongodb/bin/mongod --replSet repset -f /data/program/software/mongodb/bin/mongodb.conf

PS:如果启动遇到问题,一般是openssl的问题(没有依赖libcrypto.so.10):

yum install openssl-devel

在三台机器上任意一台机器登陆mongodb:
            /data/program/software/mongodb/bin/mongo
    使用admin数据库
            use admin
    定义副本集配置变量,这里的_id:”repset”和上面命令参数--replSet repset保持一致
  config = { _id:"repset", members:[{_id:0,host:"10.211.55.7:27017"},{_id:1,host:"10.211.55.8:27017"},{_id:2,host:"10.211.55.9:27017"}]}
初始化副本集群:

rs.initiate(config);

表示成功
查看集群节点的状态:
 rs.status();
如下结果:
{
 "set" : "repset",
 "date" : ISODate("2017-09-21T14:30:17.190Z"),
 "myState" : 1,
 "term" : NumberLong(1),
 "heartbeatIntervalMillis" : NumberLong(2000),
 "optimes" : {
  "lastCommittedOpTime" : {
   "ts" : Timestamp(1506004207, 1),
   "t" : NumberLong(1)
  },
  "appliedOpTime" : {
   "ts" : Timestamp(1506004207, 1),
   "t" : NumberLong(1)
  },
  "durableOpTime" : {
   "ts" : Timestamp(1506004207, 1),
   "t" : NumberLong(1)
  }
 },
 "members" : [
  {
   "_id" : 0,
   "name" : "10.211.55.7:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 111,
   "optime" : {
    "ts" : Timestamp(1506004207, 1),
    "t" : NumberLong(1)
   },
   "optimeDurable" : {
    "ts" : Timestamp(1506004207, 1),
    "t" : NumberLong(1)
   },
   "optimeDate" : ISODate("2017-09-21T14:30:07Z"),
   "optimeDurableDate" : ISODate("2017-09-21T14:30:07Z"),
   "lastHeartbeat" : ISODate("2017-09-21T14:30:16.070Z"),
   "lastHeartbeatRecv" : ISODate("2017-09-21T14:30:16.887Z"),
   "pingMs" : NumberLong(0),
   "syncingTo" : "10.211.55.9:27017",
   "configVersion" : 1
  },
  {
   "_id" : 1,
   "name" : "10.211.55.8:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 111,
   "optime" : {
    "ts" : Timestamp(1506004207, 1),
    "t" : NumberLong(1)
   },
   "optimeDurable" : {
    "ts" : Timestamp(1506004207, 1),
    "t" : NumberLong(1)
   },
   "optimeDate" : ISODate("2017-09-21T14:30:07Z"),
   "optimeDurableDate" : ISODate("2017-09-21T14:30:07Z"),
   "lastHeartbeat" : ISODate("2017-09-21T14:30:16.070Z"),
   "lastHeartbeatRecv" : ISODate("2017-09-21T14:30:16.877Z"),
   "pingMs" : NumberLong(0),
   "syncingTo" : "10.211.55.9:27017",
   "configVersion" : 1
  },
  {
   "_id" : 2,
   "name" : "10.211.55.9:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 163,
   "optime" : {
    "ts" : Timestamp(1506004207, 1),
    "t" : NumberLong(1)
   },
   "optimeDate" : ISODate("2017-09-21T14:30:07Z"),
   "infoMessage" : "could not find member to sync from",
   "electionTime" : Timestamp(1506004115, 1),
   "electionDate" : ISODate("2017-09-21T14:28:35Z"),
   "configVersion" : 1,
   "self" : true
  }
 ],
 "ok" : 1
}
三、测试集群功能
    主节点连接到终端:
            mongo 127.0.0.1
    连接test数据库:
            use test;
    往testdb表里插入数据
            db.testdb.insert({"test1":"testval1"})
    在副本节点连接查询:
            ./mongo 10.211.55.7:27107
    使用test数据库:user test;
    查询表格:show tables;
    报错如下:
 
    mongodb默认是从主节点读写数据,副本节点上不允许读,设置副本节点可读。
            db.getMongo().setSlaveOk();
    然后就可以查询复制过来的数据了
            repset:SECONDARY> db.testdb.find();
            { "_id" : ObjectId("59c3cf8bf21850357d5392ba"), "test1" : "testval1" }

测试集群恢复功能,去停掉主节点:
    然后查看节点状态,发现7和8中有一台变为了PRIMARY,然后再启动主节点观察状态。

架构实战项目心得(六):后台服务nosql数据库mongodb的更多相关文章

  1. 架构实战项目心得(九):后台服务工具ldap:统一用户中心ldap工具使用以及安装

    一.安装OpenLDAP 1.安装 yum -y install openldapopenldap-servers openldap-clients openldap-devel compat-ope ...

  2. 架构实战项目心得(七):使用SpringBoot+Dubbo+Mybatisplus+Oracle搭建后台项目框架(二)

    接下来我们将整合mybatisplus+Oracle,实现一个简单的查询.(期间踩了很多坑,遇到一些问题,还好慢慢解决了.现在是通过配置文件的方式来进行dubbo服务的注册和发布,希望以后能在学习和实 ...

  3. 架构实战项目心得(六)(补):mongodb.conf参数详解

    --dbpath 数据库路径(数据文件)--logpath 日志文件路径--master 指定为主机器--slave 指定为从机器--source 指定主机器的IP地址--pologSize 指定日志 ...

  4. 架构实战项目心得(八):dubbo知识的整理

    1 Dubbo启动时检查.集群容错.负载均衡.线程模型的设置以及选项:    启动时检查:(1)Dubbo默认会在启动的时候检查依赖的服务是否可用,不可用时会抛出异常.阻止Spring初始化完成.以便 ...

  5. 架构实战项目心得(四)(补):Maven settings.xml的所有标签详解

    文章内容较长,各位看客可以根据自己需要CTRL+F 直接定位到自己需要了解的地方哦~ <?xmlversion="1.0" encoding="UTF-8" ...

  6. 架构实战项目心得(十四):spring-boot结合Swagger2构建RESTful API测试体系

    一.添加依赖: <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-s ...

  7. 架构实战项目心得(五):mysql安装

    1.  yum安装mysql yum -y install mysql-server 2.  启动mysql服务 启动mysql:service mysqld start 查看mysql的状态:ser ...

  8. 架构实战项目心得(十一):基于spring-security-oauth2的mysql数据表设计

    一.建立数据库及数据表结构 CREATE SCHEMA IF NOT EXISTS `oauth2` DEFAULT CHARACTER SET utf8 ; USE `oauth2` ; -- -- ...

  9. 架构实战项目心得(十):基于spring-ladp的统一用户中心结构设计以及代码结构设计

    一.目录设计 1 公司 2 部门 3 注册人员 4 层级人员 二.规则 1 注册 自行注册人员放到模拟公司的目录下,等所属公司组织结构建立完毕,将此人员迁移到所属公司(或者删除此人员,所属公司新建此人 ...

随机推荐

  1. sql添加列,删除列,修改列

    有时候,当数据库里面有数据了,再到设计器里面删除列,就删不掉.只能用代码删除. alter table tableName drop column columnName 添加列 ) 修改列 ) --修 ...

  2. ZKEACMS 模板组件扩展

    前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...

  3. dubbo 安装部署

    dubbo 安装部署   1 安装zookeeper 2 安装dubbo    1 下载源码 https://github.com/alibaba/dubbo 2 编译 mvn clean packa ...

  4. Ubuntu16.04以root身份登入!

    首先以非root用户身份登入系统. 1,修改root密码:启动shell,随后在shell里面输入命令: sudo passwd root 最后输入root要使用的密码,需要输入两次,这样root密码 ...

  5. python的数据结构分类,以及数字的处理函数,类型判断

    python的数据结构分类: 数值型 int:python3中都是长整形,没有大小限制,受限内存区域的大小 float:只有双精度型 complex:实数和虚数部分都是浮点型,1+1.2J bool: ...

  6. Windows 下目录切换以及挂载小技巧

    Windows 下目录切换以及挂载小技巧 一.前言: 作为几年的 Linux 老用户,再购买了一款新的本本只支持 Windows(主要是Linux下的驱动)操作系统后,加之发现 Windows 提供 ...

  7. P2300 合并神犇

    题目链接 题意分析 首先这道题不可以使用简单的贪心来做 根据\(DP\) 我们令\(dp[i]\)表示当前到了\(i\)一共做了\(dp[i]\)次合并 \(pre[i]\)表示当前合并到了\(i\) ...

  8. java使用freemarker导出复杂的excel表格

    正常导出excel表格使用的poi,但是导出复杂的excel有点困难,但是可以使用freemaker模板来导出复杂的excel. 1.都是先生成一个Excel表格的模板,最好是增加一行数据.具体看图里 ...

  9. thinkphp5无限极分类

    public function priTree() { $data = $this->select(); return $this->_reSort($data); } // 递归对有的分 ...

  10. Boost内存池使用与测试

    目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...