MongoDB整理笔记の增加节点
MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境已不能满足需求,那么就需要增加一些节点将压力平均分配一下。
两种方式:一是通过oplog增加节点,二是通过数据库快照和oplog来增加节点
通过oplog增加节点
1、配置并启动新节点,启用28013这个端口给新的节点
- root@localhost ~]# mkdir -p /data/data/r3
- [root@localhost ~]# echo "this is rs1 super secret key" > /data/key/r3
- [root@localhost ~]# chmod 600 /data/key/r3
- [root@localhost ~]# /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r3 --fork --port
- 28013 --dbpath /data/data/r3 --logpath=/data/log/r3.log --logappend
- all output going to: /data/log/r3.log
- forked process: 10553
- [root@localhost ~]#
2、添加此新节点到现有的Replica Sets
- rs1:PRIMARY> rs.add("localhost:28013")
- { "ok" : 1 }
3、查看Replica Sets,我们可以清晰的看到内部是如何添加28013这个新节点的
(1)进行初始化
- rs1: PRIMARY > rs.status()
- {
- "set" : "rs1",
- "date" : ISODate("2012-05-31T12:17:44Z"),
- "myState" : 1,
- "members" : [
- ……
- {
- "_id" : 3,
- "name" : "localhost:28013",
- "health" : 0,
- "state" : 6,
- "stateStr" : "(not reachable/healthy)",
- "uptime" : 0,
- "optime" : {
- "t" : 0,
- "i" : 0
- },
- "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
- "lastHeartbeat" : ISODate("2012-05-31T12:17:43Z"),
- "errmsg" : "still initializing"
- }
- ],
- "ok" : 1
- }
(2)进行数据同步
- rs1:PRIMARY> rs.status()
- {
- "set" : "rs1",
- "date" : ISODate("2012-05-31T12:18:07Z"),
- "myState" : 1,
- "members" : [
- ……
- {
- "_id" : 3,
- "name" : "localhost:28013",
- "health" : 1,
- "state" : 3,
- "stateStr" : "RECOVERING",
- "uptime" : 16,
- "optime" : {
- "t" : 0,
- "i" : 0
- },
- "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
- "lastHeartbeat" : ISODate("2012-05-31T12:18:05Z"),
- "errmsg" : "initial sync need a member to be primary or secondary
- to do our initial sync"
- }
- ],
- "ok" : 1
- }
(3)初始化同步完成
- rs1:PRIMARY> rs.status()
- {
- "set" : "rs1",
- "date" : ISODate("2012-05-31T12:18:08Z"),
- "myState" : 1,
- "members" : [
- ……
- {
- "_id" : 3,
- "name" : "localhost:28013",
- "health" : 1,
- "state" : 3,
- "stateStr" : "RECOVERING",
- "uptime" : 17,
- "optime" : {
- "t" : 1338466661000,
- "i" : 1
- },
- "optimeDate" : ISODate("2012-05-31T12:17:41Z"),
- "lastHeartbeat" : ISODate("2012-05-31T12:18:07Z"),
- "errmsg" : "initial sync done"
- }
- ],
- "ok" : 1
- }
(4)节点添加完成,状态正常
- rs1:PRIMARY> rs.status()
- {
- "set" : "rs1",
- "date" : ISODate("2012-05-31T12:18:10Z"),
- "myState" : 1,
- "members" : [
- ……
- {
- "_id" : 3,
- "name" : "localhost:28013",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 19,
- "optime" : {
- "t" : 1338466661000,
- "i" : 1
- },
- "optimeDate" : ISODate("2012-05-31T12:17:41Z"),
- "lastHeartbeat" : ISODate("2012-05-31T12:18:09Z")
- }
- ],
- "ok" : 1
- }
4、验证数据已经同步过来
- [root@localhost data]# /Apps/mongo/bin/mongo -port 28013
- MongoDB shell version: 1.8.1
- connecting to: 127.0.0.1:28013/test
- rs1:SECONDARY> rs.slaveOk()
- rs1:SECONDARY> db.c1.find()
- { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }
- rs1:SECONDARY>
通过数据库快照和oplog增加节点
通过oplog 直接进行增加节点操作简单且无需人工干预过多,但oplog 是capped collection,采用循环的方式进行日志处理,所以采用oplog 的方式进行增加节点,有可能导致数据的不一致,因为日志中存储的信息有可能已经刷新过了。不过没关系,我们可以通过数据库快照(--fastsync)和oplog 结合的方式来增加节点,这种方式的操作流程是,先取某一个复制集成员的物理文件来做为初始化数据,然后剩余的部分用oplog 日志来追,最终达到数据一致性。
(1)取某一个复制集成员的物理文件来作为初始化数据
- [root@localhost ~]# scp -r /data/data/r3 /data/data/r4
- [root@localhost ~]# echo "this is rs1 super secret key" > /data/key/r4
- [root@localhost ~]# chmod 600 /data/key/r4
(2)在取完物理文件后,在c1集中插入一条新文档,用于最后验证此更新也同步了
- rs1:PRIMARY> db.c1.find()
- { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }
- rs1:PRIMARY> db.c1.insert({age:20})
- rs1:PRIMARY> db.c1.find()
- { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }
- { "_id" : ObjectId("4fc7748f479e007bde6644ef"), "age" : 20 }
- rs1:PRIMARY>
(3)启用28014这个端口给新的节点
- /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r4 --fork --port 28014 --dbpath
- /data/data/r4 --logpath=/data/log/r4.log --logappend --fastsync
(4)添加28014节点
- rs1:PRIMARY> rs.add("localhost:28014")
- { "ok" : 1 }
(5)验证数据已经同步过来
- [root@localhost data]# /Apps/mongo/bin/mongo -port 28014
- MongoDB shell version: 1.8.1
- connecting to: 127.0.0.1:28014/test
- rs1:SECONDARY> rs.slaveOk()
- rs1:SECONDARY> db.c1.find()
- { "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }
- { "_id" : ObjectId("4fc7748f479e007bde6644ef"), "age" : 20 }
- rs1:SECONDARY>
MongoDB整理笔记の增加节点的更多相关文章
- MongoDB整理笔记の减少节点
当应用的压力小时,可以减少一些节点来减少硬件资源的成本:总之这是一个长期且持续的工作. 下面将刚刚添加的两个新节点28013 和28014 从复制集中去除掉,只需执行rs.remove 指令就可以了, ...
- MongoDB整理笔记のReplica Sets
MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台机器是用于写操作,正因为如此,MongoDB提供了数据一致性的保障.而担当primary角色的机器,可以把读的 ...
- MongoDB整理笔记のjava MongoDB分页优化
最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...
- MongoDB整理笔记のReplica Sets + Sharding
MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding" ...
- MongoDB整理笔记のSharding分片
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...
- MongoDB整理笔记のMapReduce
MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...
- MongoDB整理笔记の体系架构
MongoDB 是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台特性. 一个运行着的MongoDB 数据库就可以看成是一个MongoDB Server,该Server 由实例和数 ...
- MongoDB整理笔记の走进MongoDB世界
本人学习mongodb时间不长,但是鉴于工作的需要以及未来发展的趋势,本人想更深层的认识mongodb底层的原理以及更灵活的应用mongodb,边学边工作实践. mongodb属于nosql中算是最 ...
- MongoDB整理笔记のID自增长
以下是官网原文地址: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 概要 MongoDB 的_i ...
随机推荐
- linux 目标文件 bss,data,text,rodata,堆,栈***
linux目标文件 一个简单的程序被编译成目标文件后的结构如下: 从图可以看出,已初始化的全局变量和局部静态变量保存在 .data段中,未初始化的全局变量和未初始化的局部静态变量保存在 .bss段中. ...
- Google Cloud VM上在线扩硬盘
Google Cloud VM是可以在线扩展Disk的大小的. 一.创建VM和磁盘 比如我有一台VM,附加了一块Disk,大小是120GB.如下图: 在VM中进行格式化: mkfs.ext4 -F / ...
- Perl参考函数/教程
这是标准的Perl解释器所支持的所有重要函数/功能的列表.在一个函数中找到它的详细信息. 功能丰富的 Perl:轻松调试 Perl Perl脚本的调试方法 perl 入门教程 abs - 绝对值函数 ...
- 1111 Online Map
题意:给定一个图,以及起点和终点,需要我们计算两条路径.第1条路径:距离最短路径,若不唯一,则选择用时最短的那一条:第2条路径:用时最少路径,若不唯一,选择经过结点数最少的那一条. 思路:两次Dijk ...
- PHP5.6 安装Yaf 2.3.5
Yaf 安装 PHP5.6 安装Yaf 2.3.5 1.下载 https://github.com/laruence/yaf 2.phpize /usr/bin/phpize 3.配置 ./confi ...
- kali下启动postgresql
1.service postgresql start 2.su postgres 3.psql
- Eclipse修改XML默认打开方式
用Eclipse开发Android的时候 默认的XML是采用Android xml editor 打开,这个工具不够直观,如果想直接看文本的XML的话,可以通过如下方式修改 1.菜单:Window ...
- Spring Cloud Feign 1(声明式服务调用Feign 简介)
Spring Cloud Feign基于Netflix Feign 同时整合了Spring Cloud Ribbon和Spring Cloud Hytrix,除了提供两者的强大功能外,它还提供了一种声 ...
- pandas读写excel
import pandas as pd import numpy as np df = pd.read_csv("result.csv") # csv # df = pd.read ...
- 6410在rvds下编译启动代码报错分析
contains invalid call from '~PRES8' function to 'REQ8' function main RVDS编译出现contains invalid call f ...