第一步:准备

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. phpmyadmin修改mysql数据库密码

    甩上链接:http://jingyan.baidu.com/article/e4511cf332b9832b845eaf27.html

  2. yum命令被锁 Existing lock /var/run/yum.pid

    有时使用yum命令,不知怎会回事就提示: Existing lock /var/run/yum.pid: another copy is running as... 感觉也没操作什么错误的事情. 此时 ...

  3. 在发板实现24位jpg和bmp图片用手划动显示上一张与下一张图片

    arm-linux-gcc test.c -ljpeg -I /usr/local/libjpeg-8a/include/ -L /usr/local/libjpeg-8a/lib/ 这样编译 代码 ...

  4. javascript的页面加载及性能优化(兼容IE7)

    通常来说,window.onload就够用了,如果想加载多个事件,我们可以采取以下方式: window.onload = function(){        func1();        func ...

  5. Bootstrap3网上api文档地址

    http://v3.bootcss.com/css/#forms http://www.ziqiangxuetang.com/bootstrap/bootstrap-forms.html 另附加fa字 ...

  6. iOS 引导页

    1. 目标需求 引导页无限轮播,且轮播到最后一张时没有跳转到头一个的感觉 pageControl的显示为可选项 是否无限轮播为可选项 手动切换图片,并再次启动自动轮转 实现点击事件 2. 实现思路 初 ...

  7. 如何用C语言封装 C++的类,在 C里面使用

    本文给出了一种方法.基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在  wrapper的实现文件里实现. 1. apple.h #ifnde ...

  8. node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...

  9. 使用 visualstudio code 编辑器调试执行在 homestead 环境中的 laravel 程序

    由于之前做 .net 开发比较熟悉 visualstudio,所以自 visualstudio code 发布后就一直在不同场合使用 vscode ,比如前端.node等等.最近在做 laravel ...

  10. 《JAVASCRIPT高级程序设计》表单基础知识和文本框脚本

    在HTML中,表单是由<form>元素来表示,在javascript中,表单对应的是HTMLFormElement类型,它具有一些独有的属性和方法: 一.表单基础知识 1.取得表单的方式 ...