一。 副本集介绍

之前的文章介绍了 mongodb主从 mongodb提供了另外一种 基于副本集的集群 该方式 是一主一从的升级版  一主多从,

仍然是主节点负责写入 从节点定时同步主节点数据 使用该种方式 从节点可以负责读取的操作 主节点负责写入 可以轻松实现读写分离

同时该集群方式支持自动故障转移  集群中所有节点间保持心跳 发现主节点宕机后 选举一个新的主节点

二。 副本集搭建

查看支持的三种集群参数
  mongod --help  
  帮助中 默认的参数 dbpath都有注释 可以查看
集群帮助如下:

Master/slave options (old; use replica sets instead): 主从集群 --master                              master mode--slave                               slave mode--source arg                          when slave: specify master as <server:port>--only arg                            when slave: specify a single database to replicate--slavedelay arg                      specify delay (in seconds) to be used when applying master ops to slave--autoresync                          automatically resync if slave data is staleReplica set options:   副本集集群--replSet arg                         arg is <setname>[/<optionalseedhostlist>]--replIndexPrefetch arg               specify index prefetching behavior (if secondary) [none|_id_only|all]--enableMajorityReadConcern           enables majority readConcernSharding options:  分片集群--configsvr                           declare this is a config db of a cluster; default port 27019; default dir /data/configdb--shardsvr                            declare this is a shard db of a cluster; default port 27018

环境:

副本集名称  myrep
主从自动选举  192.168.58.147,192.168.58.149,192.168.58.150

分别在每台机器创建数据目录和启动

mkdir -p /data/db
mongod --port "27017" --dbpath "/data/db" --replSet "myrep"   

任意一台机器 使用mongo连接进入 设置集群配置

config = { _id:"myrep", members:[
... {_id:0,host:"192.168.58.147:27017"},
... {_id:1,host:"192.168.58.149:27017"},
... {_id:2,host:"192.168.58.150:27017"}]
... }

进入admin数据库  初始化配置

use admin
rs.initiate(config);

查看状态 查询哪个是主节点  PRIMARY表示主节点  SECONDARY表示从节点

"members" : [{"_id" : 0,"name" : "192.168.58.147:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 113,"optime" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2017-10-28T08:11:51Z"),"infoMessage" : "could not find member to sync from","electionTime" : Timestamp(1509178280, 1),"electionDate" : ISODate("2017-10-28T08:11:20Z"),"configVersion" : 1,"self" : true},{"_id" : 1,"name" : "192.168.58.149:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 50,"optime" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2017-10-28T08:11:51Z"),"optimeDurableDate" : ISODate("2017-10-28T08:11:51Z"),"lastHeartbeat" : ISODate("2017-10-28T08:11:58.642Z"),"lastHeartbeatRecv" : ISODate("2017-10-28T08:11:58.423Z"),"pingMs" : NumberLong(0),"syncingTo" : "192.168.58.150:27017","configVersion" : 1},{"_id" : 2,"name" : "192.168.58.150:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 50,"optime" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2017-10-28T08:11:51Z"),"optimeDurableDate" : ISODate("2017-10-28T08:11:51Z"),"lastHeartbeat" : ISODate("2017-10-28T08:11:58.648Z"),"lastHeartbeatRecv" : ISODate("2017-10-28T08:11:58.797Z"),"pingMs" : NumberLong(0),"syncingTo" : "192.168.58.147:27017","configVersion" : 1}],"ok" : 1

主节点为147,测试数据插入

myrep:PRIMARY> use kkk
switched to db kkk
myrep:PRIMARY> db.mycol.insert(name:'zs',sex:'boy')
2017-10-28T01:19:25.629-0700 E QUERY    [thread1] SyntaxError: missing ) after argument list @(shell):1:20
myrep:PRIMARY> db.mycol.insert({name:'zs',sex:'boy'})
WriteResult({ "nInserted" : 1 })
myrep:PRIMARY> show dbs
admin  0.000GB
kkk    0.000GB
local  0.000GB
test   0.000GB
myrep:PRIMARY> cd kkk
2017-10-28T01:19:49.855-0700 E QUERY    [thread1] SyntaxError: missing ; before statement @(shell):1:3
myrep:PRIMARY> use kkk
switched to db kkk
myrep:PRIMARY> show tables
mycol
myrep:PRIMARY> db.mycol.find()
{ "_id" : ObjectId("59f43d9808241ee611659c95"), "name" : "zs", "sex" : "boy" }

149 mongo命令进入当前机器服务

myrep:SECONDARY> db.getMongo().setSlaveOk();  设置可读
myrep:SECONDARY> show dbs
admin  0.000GB
kkk    0.000GB
local  0.000GB
test   0.000GB

发现kkk数据库已经被创建了 也就是正常同步数据

测试关闭147 主节点
149客户端查看集群状态

"members" : [{"_id" : 0,"name" : "192.168.58.147:27017","health" : 0,"state" : 8,"stateStr" : "(not reachable/healthy)",  不可达"uptime" : 0,"optime" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"optimeDurable" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"optimeDate" : ISODate("1970-01-01T00:00:00Z"),"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),"lastHeartbeat" : ISODate("2017-11-01T02:42:23.164Z"),"lastHeartbeatRecv" : ISODate("2017-11-01T02:42:01.859Z"),"pingMs" : NumberLong(2),"lastHeartbeatMessage" : "Connection refused","configVersion" : -1},{"_id" : 1,"name" : "192.168.58.149:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 885,"optime" : {"ts" : Timestamp(1509179151, 4),"t" : NumberLong(2)},"optimeDate" : ISODate("2017-10-28T08:25:51Z"),"syncingTo" : "192.168.58.150:27017","configVersion" : 1,"self" : true},{"_id" : 2,"name" : "192.168.58.150:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY",  切换回主节点"uptime" : 838,"optime" : {"ts" : Timestamp(1509179151, 4),"t" : NumberLong(2)},"optimeDurable" : {"ts" : Timestamp(1509179151, 4),"t" : NumberLong(2)},"optimeDate" : ISODate("2017-10-28T08:25:51Z"),"optimeDurableDate" : ISODate("2017-10-28T08:25:51Z"),"lastHeartbeat" : ISODate("2017-11-01T02:42:24.126Z"),"lastHeartbeatRecv" : ISODate("2017-11-01T02:42:23.174Z"),"pingMs" : NumberLong(1),"electionTime" : Timestamp(1509179151, 2),"electionDate" : ISODate("2017-10-28T08:25:51Z"),"configVersion" : 1}],"ok" : 1

150自动切换为主节点了 登录 150 后 执行删除kkk数据库操作

myrep:SECONDARY> use kkk
switched to db kkk
myrep:PRIMARY> db.dropDatabase()
{ "dropped" : "kkk", "ok" : 1 }

149检查

myrep:SECONDARY> show dbs
admin  0.000GB
local  0.000GB
test   0.000GB

重启 147  (注意不要用 mongod启动 带上完整参数启动)

mongod --port "27017" --dbpath "/data/db" --replSet "myrep"    

检查状态发现  147的数据库kkk也删除了 检查rs.status()发现 147 自动变成了从服务器

三。 jdbc操作

添加maven依赖

<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.2.0</version></dependency>

添加测试类 (代码和之前主从一致 只是需要设置 读取偏好)

package mongo;import java.util.ArrayList;
import java.util.List;
import java.util.Random;import org.bson.Document;
import org.junit.Test;import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ReadPreference;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;public class TestMongoMs {/*** 获取mongodb的连接* @return*/public static MongoClient getClient(){//将副本集中所有的节点都加入List<ServerAddress> seedList=new ArrayList<ServerAddress>();seedList.add(new ServerAddress("192.168.58.150", 27017));seedList.add(new ServerAddress("192.168.58.147", 27017));seedList.add(new ServerAddress("192.168.58.149", 27017));//设置偏好为 从节点读取数据 默认是主节点读取MongoClientOptions mco=MongoClientOptions.builder().readPreference(ReadPreference.secondary()).build();MongoClient mc=new MongoClient(seedList,mco);return mc;}/*** 创建集合并添加文档和document*/@Testpublic void createCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");for(int i=0;i<=100;i++){Document doc=new Document();doc.append("name", "ls"+i);doc.append("sex", i%2==0?"女":"男");doc.append("age", new Random().nextInt(100));mcd.insertOne(doc);}}/*** 查找集合下所有文档 具体根据条件参考删除*/@Testpublic void findCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");FindIterable<Document> ft=mcd.find();MongoCursor<Document> mr=ft.iterator();while(mr.hasNext()){Document doc=mr.next();System.out.println(doc.get("name")+"--"+doc.get("sex"));}}/*** 更新文档* updateOne更新找到的所有结果集中的第一条* updateMany是更新所有结果集*/@Testpublic void updateCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");Document doc=new Document();doc.append("sex","男");//只是找到所有sex=女  将sex改成男 其他字段不修改mcd.updateMany(Filters.eq("sex", "女"),new Document("$set",doc));}/*** 根据条件删除*/@Testpublic void deleteCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");//删除满足条件找到的第一条记录mcd.deleteOne(Filters.eq("sex", "女"));//两个条件都满足的所有记录都删除mcd.deleteMany(Filters.and(Filters.eq("sex", "女"),Filters.eq("name", "ls")));}
}

主要代码在 MongoClient实例化位置 设置偏好为 读 从从服务器

设置从服务器可读  db.getMongo().setSlaveOk()

测试java结果

信息: Discovered replica set primary 192.168.58.147:27017
十一月 01, 2017 4:44:33 下午 com.mongodb.diagnostics.logging.JULLogger log
信息: Opened connection [connectionId{localValue:4, serverValue:14}] to 192.168.58.149:27017

多次测试读取都是从 从服务器

转载于:https://www.cnblogs.com/liaomin416100569/p/9331174.html

文档型数据库mongodb介绍2-副本集相关推荐

  1. mongodb单表最大记录数_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...

    ​一.MongoDB简介以及使用场景 MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富, ...

  2. spring cloud alibaba微服务原理与实战_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...

    ​一.MongoDB简介以及使用场景 MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富, ...

  3. 非关系型数据库 之 文档型数据库 MongoDB 的使用(Python3)

    文章目录 1.MongoDB 简介 1.1.简述 1.2.应用场景 1.3.优点 1.4.缺点 2.CentOS 操作 MongoDB 2.1.安装启动 2.1.1.下载安装 2.1.2.后台启动 2 ...

  4. 悉数11种主流NoSQL文档型数据库

    悉数11种主流NoSQL文档型数据库 文档型数据库是NoSQL中非常重要的一个分支,它主要用来存储.索引并管理面向文档的数据或者类似的半结构化数据.顾名思义,文档型数据库(面向文档数据库)的关键核心概 ...

  5. 关系型数据库到文档型数据库的跨越

    1. 简介 在文档型NoSQL数据库出现之前,许多开发者一直绞尽脑汁思考,希望能想出更好的处理关系型数据库技术的方法,如今他们可能要跳出那种思维而另辟蹊径.本文将介绍关系型数据库和分布式文档型数据库的 ...

  6. 文档型数据库列一般都是弱项

    文档型数据库一般都是以行为基础得,添加更新删除等操作,因为文档型数据的一般存储结构都是键值对.所以对列的概念很弱,比如有一些文档数据库,是无法对单列操作的,有时候想修改一列的值,只能所有数据全部重新添 ...

  7. 文档型数据库设计模式-如何存储树形数据

    在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...

  8. MongoDB小型文档型数据库使用

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中 ...

  9. 文档型非关系数据库MongoDB经验总结

    文档型非关系数据库MongoDB 数据库基础概念 数据:能够输入到计算机中并被识别处理的信息集合 数据结构:研究一个数据集合中,数据元素关系 数据库:按照数据结构,存储管理数据的仓库.数据仓库是在数据 ...

最新文章

  1. window.opener.document.getElementById(“a”)用标准的Jquery 语言怎么写
  2. 【小白学习C++ 教程】十四、C++ 中预处理器
  3. Android震动vibrator系统开发全过程
  4. 档案盒正面标签制作_错题本科学制作方法、正确使用方式及窍门
  5. devops 数据库_DevOps世界中与数据库管理员合作的6种方法
  6. java switch 不加 break 继续执行 下一个case(不用匹配条件) 这个设计是为什么
  7. Android快速开发框架LoonAndroid (转)
  8. Java6开发WebService进阶
  9. 顶级 Vue.js 开发工具
  10. 泛型编程基础知识详解
  11. Cocos2dx基础手册
  12. 那些你该知道的CSS颜色代码大全都在这里了,点击查阅
  13. 制造执行系统(MES)软件可以增加收入,创造更快的周转时间,提高制造商的质量
  14. 百度搜索结果页面的参数 搜索框提示词搜索方式(rsv_sug2)
  15. 基于C语言设计的俄罗斯方块小游戏(VS2017运行)
  16. 上半年要写的博客文章29
  17. 软件技术专业需要学什么?
  18. 已经在用的安卓手机能用鸿蒙吗,鸿蒙可以通过刷机在手机上使用吗?
  19. 电脑报,百度网盘全新版本体验,风格大变样
  20. 扫地机器人灰尘堵住_不怕脏更不怕累!这才是清理扫地机器人的正确姿势

热门文章

  1. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
  2. 计算机文化基础教程教案,新版《计算机文化基础》教案.doc
  3. ajax后台如何把对象转为json_57. Django 2.1.7 查询数据返回json格式
  4. 【正一专栏】巴萨西甲冠军遇到挑战
  5. trace分析优化器执行计划 || optimizer
  6. Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
  7. 截图如何能截到鼠标?脑洞小方法
  8. matlab实现彩色图像灰度化的三种方法
  9. 湫湫系列故事——消灭兔子
  10. linux硬件设备操作函数 open