第一步:准备

1.安装包

mongodb-linux-x86_64-rhel70-3.4.2.tgz

2. 架构:

本文为 1-primary、1-secondary、1-arbiter 的 mongoDB 集群:

名称 IP 端口
mongodb 192.168.6.128 27017
mongodb 192.168.6.129 27017
mongodb 192.168.6.130 27017

3. 安装 MongoDB

根据架构信息,参照 MongoDB【第一篇】安装 来安装架构中的实例。

第二步:配置集群

1. 登录至任意主机,执行 mongodb/bin/mongo,进入 mongo shell 客户端

# cd mongodb/bin
# ./mongo

2. 在 mongo shell中,定义集群配置对象

> config = {
... "_id" : "rs1",
... "members" : [
... {"_id":,"host":" 192.168.6.128:27017"},
... {"_id":,"host":" 192.168.6.129:27017"},
... {"_id":,"host":" 192.168.6.130:27017", "arbiterOnly":true}
... ]
...}

其中,"_id" : "rs1"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。

3. 初始化集群配置

在mongo shell中执行

> rs.initiate(config)

返回信息:

4. 查看集群状态

在mongo shell中执行

> rs.status()

返回信息:

{
"set" : "rs1",
"date" : ISODate("2017-02-27T10:02:17.320Z"),
"myState" : ,
"term" : NumberLong(),
"heartbeatIntervalMillis" : NumberLong(),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"appliedOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"durableOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
}
},
"members" : [
{
"_id" : ,
"name" : "192.168.6.128:27017",
"health" : ,
"state" : ,
"stateStr" : "PRIMARY",
"uptime" : ,
"optime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"optimeDate" : ISODate("2017-02-27T10:02:15Z"),
"electionTime" : Timestamp(, ),
"electionDate" : ISODate("2017-02-27T09:59:54Z"),
"configVersion" : ,
"self" : true
},
{
"_id" : ,
"name" : "192.168.6.129:27017",
"health" : ,
"state" : ,
"stateStr" : "SECONDARY",
"uptime" : ,
"optime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"optimeDurable" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"optimeDate" : ISODate("2017-02-27T10:02:15Z"),
"optimeDurableDate" : ISODate("2017-02-27T10:02:15Z"),
"lastHeartbeat" : ISODate("2017-02-27T10:02:16.990Z"),
"lastHeartbeatRecv" : ISODate("2017-02-27T10:02:15.681Z"),
"pingMs" : NumberLong(),
"syncingTo" : "192.168.6.128:27017",
"configVersion" :
},
{
"_id" : ,
"name" : "192.168.6.130:27017",
"health" : ,
"state" : ,
"stateStr" : "ARBITER",
"uptime" : ,
"lastHeartbeat" : ISODate("2017-02-27T10:02:16.808Z"),
"lastHeartbeatRecv" : ISODate("2017-02-27T10:02:15.766Z"),
"pingMs" : NumberLong(),
"configVersion" :
}
],
"ok" :
}

关注 stateStr 字段,如集群配置正确,3个节点应有一个 PRIMARY,一个 SECONDARY,一个 ARBITER 。

如果stateStr字段显示为 STARTUP 或 RECOVERING,说明集群状态还在同步中,稍等几秒后再次运行 rs.status() 即可。

5. 配置集群安全认证

1)使用 mongo shell 连接到 PRIMARY 库

2)创建admin权限用户

> use admin
> db.createUser({
... user:"username",
... pwd:"password",
... roles:[
... {role:"clusterAdmin", db:"admin"},
... {role:"dbAdminAnyDatabase", db:"admin"},
... {role:"readWriteAnyDatabase", db:"admin"},
... {role:"userAdminAnyDatabase", db:"admin"}
... ]
... })

返回信息:

上面的命令创建了一个具备集群管理者权限、所有数据库dba权限、所有数据库读写权限、所有数据库用户管理权限的超级用户。

3)停止所有 mongodb 服务

# ps -ef|grep mongod |grep -v grep
# kill - <pid>

注意:必须使用 kill -2 命令杀死 mongod 进程,否则会导致数据文件异常,致使 mongod 无法再次正常启动。

4)生成集群内部认证key

# openssl rand -base64  > keyfile
# chmod keyfile

将 keyfile 拷贝至三台 mongodb 主机中。

5)修改mongodb配置文件

security:
keyFile: /root/mongodb/keyfile # 此处配置key文件的绝对路径

6)依次启动3个 mongod 实例

注意:启动前注意检查 ulimit 配置

7)身份认证

使用 mongo shell 登入任意 mongod 实例

> use admin
> db.auth(“username”,”password”)

认证通过后,再次查看集群状态:

> rs.status()

应返回正确的集群状态。

如果需要创建其他用户,先使用超级用户登录,再执行 db.createUser 命令即可。

第三步:测试

1. 测试同步功能

1)由于从节点默认是不可读的,为验证数据同步,首先要将从节点设为可读:

> rs.slaveOk()

2)登录主节点,执行以下命令:

> db.test1.insert({"test" : "ok"})

返回信息:

3)登录从节点,查找数据

> db.test1.findOne();

返回信息:

说明数据同步成功。

2. 测试故障自动回复功能

1)停止当前的主节点进程,然后连接从节点,执行命令:

> rs.status();

从输出中可以看到,原来的主节点已经不可用:

同时,原来的从节点已经升级为主节点:

说明故障自动恢复成功。

2)此时在当前主节点上插入一条新数据

> db.test1.insert({"test1":"ok"});

返回信息:

3)将先前停止的节点启动,并用mongo shell连接

此时新启动的实例应为从节点,从其中查找数据:

> db.test1.find()

验证故障节点恢复后,会自动从当前主节点同步增量数据

至此,mongodb 高可用集群的配置已经完成。

MongoDB【第二篇】集群搭建的更多相关文章

  1. mongodb 3.4 集群搭建升级版 五台集群

    最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进.如果大家不熟悉什么是分片.副本集.仲裁者的话请先 ...

  2. (转)MongoDB分片实战 集群搭建

    环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...

  3. MongoDB高可用集群搭建(主从、分片、路由、安全验证)

    目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...

  4. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  5. mongodb 3.6 集群搭建:分片+副本集

    mongodb是最常用的nosql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  6. mongodb之 3.4.0 mongodb sharing 副本集群搭建

    系统系统 centos6.5三台服务器:10.100.25.42/43/44安装包: mongodb-linux-x86_64-rhel62-3.4.0.tgz 服务器规划:mongos mongos ...

  7. mongodb高可用集群搭建

    集群构架图如下: 集群大致文件结构:(192.168.137.101节点) 先搭建3个副本集 rs1/mongod.conf rs1/start.sh rs2/mongod.conf 后面类似.... ...

  8. MongoDB 高可用集群搭建(3.4)

      一.架构概况192.168.56.101192.168.56.102192.168.56.103OS为centos 7.2 架构图: 规划5个组件对应的端口号,由于每台机器均需要同时部署 mong ...

  9. MongoDB的分片集群搭建

    MongoDB的最为自豪的一个特色之一,分片. 参考官方文档: https://docs.mongodb.com/manual/sharding/  单机压力,高频查询CPU,IO 单表压力,百万千万 ...

  10. kubernetes第二章--集群搭建

随机推荐

  1. java--面向对象编程

    instanceof的用法 静态绑定,即早期绑定,首先找父类 动态绑定,即运行时绑定,new谁找谁 Object o1 = null; //正确的语法,null也是一种特殊的引用数据类型 object ...

  2. 扫码JSP

    扫码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  3. Angular - - $sce 和 $sceDelegate

    $sce $sce 服务是AngularJs提供的一种严格上下文转义服务. 严格的上下文转义服务 严格的上下文转义(SCE)是一种需要在一定的语境中导致AngularJS绑定值被标记为安全使用语境的模 ...

  4. Delphi总结使用TStrings的一些技巧

    [delphi] view plaincopyprint? 先把要讨论的几个属性列出来: 1.CommaText 2.Delimiter & DelimitedText 3.Names &am ...

  5. js原生设计模式——2面向对象编程之继承—原型继承(类式继承的封装)

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. InnoDB的表类型,逻辑存储结构,物理存储结构

    表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...

  7. 我用Cocos2d-x模拟《Love Live!学院偶像祭》的Live场景(一)

    同样从CSDN搬过来 博客开这么久了,就发过一篇很水的文章,一直想写点正式的东西.这次准备开工一个仿其他游戏的简单小游戏,于是开博客把开发过程记录下来.这一系列文章主要讲,我是如何从零开始使用Coco ...

  8. cgLib生成动态代理

    package com.stono.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import ...

  9. Spring4.14 事务异常 NoUniqueBeanDefinitionException: No qualifying bean of type [....PlatformTransactionManager]

    环境为Spring + Spring mvc + mybatis:其中Spring版本为4.1.4 spring配置文件: <?xml version="1.0" encod ...

  10. MYBATIS 无效的列类型: 1111

    查询的时候竟然也会报错,如果参数是数字,需要加上jdbcType 在xml中加上 t.chart_id = #{chartId,jdbcType=DECIMAL}