Mongodb 副本与分配 学习笔记

副本

实例1 m1.config

port=27017 #端口

replSet=spock #副本名称随便取

dbpath=/usr/local/mongodb/fuben/db1 #数据存放目录

logpath=/usr/local/mongodb/fuben/log1/mongodb.log #日志目录

实例2 m2.config

port=27027

replSet=spock

dbpath=/usr/local/mongodb/fuben/db2

logpath=/usr/local/mongodb/fuben/log2/mongodb.log

实例3 m3.config

port=27037

replSet=spock

dbpath=/usr/local/mongodb/fuben/db3

logpath=/usr/local/mongodb/fuben/log3/mongodb.log

启动3个实例

/usr/local/mongodb/bin/mongod -f m*.config

连接任意一个实例

mongo --port 27017

配置变量

config ={

‘_id‘:‘spock‘,

‘members‘:[

{‘_id‘:0,‘host‘:‘localhost:27017‘},

{‘_id‘:1,‘host‘:‘localhost:27027‘},

{‘_id‘:2,‘host‘:‘localhost:27037‘}

]

}

导入配置

rs.initiate(config) 创建副本集成功

向集合中插入数据

db.user.insert({‘name‘:‘andi‘,‘age‘:22,‘sex‘:‘M‘})

链接其他实例查看数据同步情况

db.user.find()

Error: error: { "$err" : "not master and slaveOk=false", "code" : 13435 } 备份库默认不能读

设置可以查看数据

db.setSlaveOk()

db.user.find() 【成功】

副本集管理

db.isMaster() 查看是否为主等其他信息

rs.status() 查看副本集状态

{

"set" : "spock",

"date" : ISODate("2017-06-16T03:08:08.452Z"),

"myState" : 1,

"members" : [

{

"_id" : 1,

"name" : "localhost:27027",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 156845,#其他程序可以连接到此节点的立即时间(秒)

"optime" : Timestamp(1497425785, 2),

"optimeDate" : ISODate("2017-06-14T07:36:25Z"),#每个成员的oplog中最后一个操作时间

"lastHeartbeat" : ISODate("2017-06-16T03:08:08.148Z"),#当期服务器最后一次收到其他服务器的心跳

"lastHeartbeatRecv" : ISODate("2017-06-16T03:08:08.146Z"),

"pingMs" : 0,#心跳从当期服务器到达某个服务器的平均时间

"syncingTo" : "localhost:27017",#复制源

"configVersion" : 1

},

],

"ok" : 1

}

rs.config() 查看配置信息

{

"_id" : "spock", #副本集名称

"version" : 1, #版本号,没修改一次增加

"members" : [ #成员信息数组(添加和修改时可以指定下列选项)

{

"_id" : 0, #成员ID

"host" : "localhost:27017", #成员地址

"arbiterOnly" : false, #是否是仲裁者(仲裁者就是起哄的,没有数据)

"buildIndexes" : true, #副本上边是否创建索引

"hidden" : false, #是否隐藏成员(只有优先级为0的才可以设置成隐藏)客户端无法将请求发送给他

"priority" : 1, #被选为master的优先级默认为1,0不参与竞选

"tags" : {

},

"slaveDelay" : 0, #延迟复制时间(秒)(优先级为0才可以延迟)

"votes" : 1#投票数量(不要随便改)

},

....

],

"settings" : {

"chainingAllowed" : true,

"heartbeatTimeoutSecs" : 10,

"getLastErrorModes" : {

},

"getLastErrorDefaults" : {

"w" : 1,

"wtimeout" : 0

}

}

}

修改配置信息

config = rs.config()

config.members[1].host = ‘127.0.0.1:27057‘

rs.reconfig(config)

rs.add(‘localhost:27087‘) 向副本集中添加一个新的副本集

rs.remove(‘localhost:27087‘)

强制重新设置

rs.reconfig( config, {" force" : true})

将主节点降级为备份节点(降级时间100秒,100秒后如果没有主节点,可以重新申请竞选)

rs.stepDown(second)

强制备份节点在一段时间内始终处于备份状态(不参与竞选)

rs.freeze( 10000)

#查看复制源

db.adminCommand({replSetGetStatus:1})[‘syncingTo‘]

#修改复制源

db.adminCommand({‘replSetSyncFrom‘:‘localhost:27027‘})

#强制其他成员必须从主节点复制数据

var config = rs.config()

config.settings = config.settings || {}

config.settings.allowChaining = false

rs.reconfig(config)

#增加oplog大小

1,如果当前服务器是主节点,让它退位,以便让其他成员的数据能够尽快更新到与它一致。

2,关闭当前服务器。

3,将当前服务器以单机模式启动。

4,临时将oplog中的最后一条insert操作保存到其他集合中

uselocal

//op:"i"用于查找最后一条Insert操作

varcursor=db.oplog.rs.find({"op":"i"})

varlastInsert=cursor.sort({"$natural":-1}).limit(1).next()

db.tempLastOp.save(lastInsert)

//确保保存成功,这非常重要!

db.tempLastOp.findOne()

5,删除当期oplog

db.oplog.rs.drop()

6,创建一个新的oplog;

db.createCollection(‘oplog.rs‘,{‘capped‘:true,‘size‘:10000})

7,将最后一条操作记录歇会oplog

var temp = db.tempLastOp.findOne()

db.oplog.rs.insert(temp)

db.oplog.rs.findOne()

8,最后,当期服务器作为副本启动

从延迟备份节点恢复数据

方法一

1,关闭所有其他成员。

2,删除其他成员数据目录中的所有数据

3,重启所有成员,然后他们会自动从延迟库复制数据

方法二

1,关闭说有成员,包括延迟备份节点

2,删除其他成员(除了延迟备份节点)的数据目录

3,将延迟备份节点数据文件复制到其他服务器

4,重启所有成员

分片

用途

增加可用RAM

增加可用磁盘空间

减少单机负载

处理单机无法承受的吞吐量

配置服务器

配置服务器相当于集群的大脑,保存着集群和分片的元数据,即各分片包含哪些数据的信息。

mm.config内容

logpath=/data/mongo_test/fuben/logm/mongodb.log

配置服务器端口为:27019 (检查是否被占用)

数据默认存放地址/data/configdb 手动创建

开启配置服务器

mongod --configsvr -f/usr/local/mongodb/db/mm.comfig

--configsvr 指定mongodb为新配置服务器

开启mongos 进程 默认监听27017端口

mongos --configdb localhost:27019,...,... --logpath logmt/mongodb.log

--configdb 指定配置服务器,可以指定多个,用,分开

将副本转换为分片

链接mongos服务

mongo admin --port 27017

将以有副本添加到分片

sh.addShard(‘spock/localhost:27027,localhost:27037‘)

向以有分片中添加分片(注意副本名不能重复)

sh.addShard(‘abc/localhost:28017‘)

测试

在mongos链接中想test.goods集合中插入100条数据

for(var i = 0;i<100;i++){

db.goods.insert({‘name‘:‘goods‘+i,‘addtime‘:new Date()})

}

默认情况下数据会插入到第一个分片副本所在的服务器中,

而后添加的副本没有数据。

添加分片数据

再goods表上创建索引

db.goods.ensureIndex({‘name‘:1})

按索引建分片

sh.shardCollection(‘test.goods‘,{‘name‘:1})

查看分片状态

sh.status()

时间: 2024-10-13 00:26:52

Mongodb 副本与分配 学习笔记的相关文章

mongodb的基本概念 学习笔记(二)

mongodb的基本概念1.文档1.1定义:文档是mongodb的核心概念.多个键及其关联的值有序地放 置在一起便是文档. 文档可以理解为关系数据库总的一行数据.1.2表示方法:{"greeting":"hello,world"}1.3注意事项:文档包含多个键/值 对文档中的键/值 对是有序的文档中的值不仅可以使字符串,还可以是其他数据类型文档中的键是字符串. 键不能含有 \0 . $ 特殊字符 _也是保留的2.集合2.1 定义:集合就是一组文档.可以理解问等同于关

动态内存分配 学习笔记

#include<stdio.h> #include<stdlib.h> char *substr(const char *s, int n1, int n2) { char *p = (char *) malloc(n2-n1+2); int i,j=0; for(i=n1;i<=n2;i++,j++) p[j] = s[i]; p[j] = '\0'; return p; } void main(void) { char s[80], *sub; int n1, n2;

动态内存分配 学习笔记2

#include<stdio.h> #include<stdlib.h> void main() { struct stu_type{ char num[15]; char name[10]; int age; int c; int math; int en; int sum; float ave; } *p,*p1; int n,i; printf("请输入学生人数:"); scanf("%d",&n) ; p=(struct st

C++学习笔记13-类继承

1.  类模板的 static 成员[不同于C#中的static] 类模板可以像任意其他类一样声明static 成员.以下代码: template <classT> class Foo { public: static std::size_tcount() { return ctr; } // other interfacemembers private: static std::size_tctr; // otherimplementation members }; 定义了名为Foo 的类模

mongodb学习笔记系列一

一.简介和安装 ./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017 mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,--smallfiles 二.基本命令 1.登录mongodb client /use/local/mongo 2.查看当前数据库 show databases; show dbs; 两个可能 3.admin是和管理有关的库,local 是放schema有关

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

MongoDB学习笔记系列

回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助和启发,文章中有对新技术的研究(Mongo驱动),对老技术的回顾(代码重构),还有对架构设计的阐述等(面向接口编程,对扩展开放,对修改关闭,所以出现了IMongoRepository接口). MongoDB学习笔记系列~目录 MongoDB学习笔记~环境搭建 (2015-03-30 10:34) M

[Spring Data MongoDB]学习笔记--注册一个Mongo实例

1. 通过Java based bean metadata @Configuration public class AppConfig { public @Bean Mongo mongo() throws UnknownHostExceptioin { return new Mongo("localhost"); } } 上面的方式包含异常处理,这并不是我们想要的. 所以,应该尽量用下面这种方式MongoFactoryBean,或者后面的xml方式. @Configuration p

mongo db 学习笔记 之二: mongodb 用户认证

首先要知道mongodb默认安装后是没有任何认证开启的,也就是说,所有能连接到服务器的人都能进数据查看,当然,你可以用防火墙来挡.但没有防火墙的保护,数据库暴露出来是非常危险的. mongodb关于安全分为几个方面,主要是:认证,基于角色的访问控制(授权),审计,加密,部署和环境的安全(涉及到网络跟系统的访问环境). 一 关于认证 使用用户名认证指令为: mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admi