php 支持mongomongo 的副本集集吗

MongoDB副本集相关命令 - 简书
MongoDB副本集相关命令
MongoDB副本集相关命令
1 - 配置副本集
启动相关mongod进程
配置文件需要添加 replSet=xxx 选项。 xxx是副本集的一个名字
现在启动的mongod进程还只是相互独立的,彼此之间不会相互感知。所以,需要创建一个配置文件,列出副本集中的每一个成员。
然后发给一个mongod实例。
var config = {
"_id" : "iepac_replset",
"members" : [
{ "_id": 0, "host": "192.168.35.131:3000"},
{ "_id": 1, "host": "192.168.35.131:3001"},
{ "_id": 2, "host": "192.168.35.131:3002"}
config对象就是副本集的配置. 把这个配置文件发送给一个节点:
$ /data/mongodb-1/bin/mongo 192.168.35.131:3000
& rs.initiate(config);
使用rs.initiate(config); 初始化。等价于db.adminCommand({"replSetInitiate": config})
3000的mongod会解析这个配置对象, 然后给其他成员发送消息,提醒他们使用新的配置
所有成员配置完成后,他们会自动选出一个主节点,然后就可以正常处理读写请求了
主节点. 这个时候,只有主节点可以处理读写请求。
查看主节点:
iepac_replset:SECONDARY& rs.isMaster();
"hosts" : [
"192.168.35.131:3000",
"192.168.35.131:3001",
"192.168.35.131:3002"
"setName" : "iepac_replset",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.35.131:3000",
"me" : "192.168.35.131:3000",
"electionId" : ObjectId("7fffffff0001"),
"maxBsonObjectSize" : ,
"maxMessageSizeBytes" : ,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("T13:52:19.654Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
在secondary上进行如下操作:
iepac_replset:SECONDARY&
switched to db sns
iepac_replset:SECONDARY& db.imlog.insert({"sendor":});
WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })
iepac_replset:SECONDARY& db.imlog.find();
Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
插入数据时,提示不是主节点。查询数据时,提示不是主节点,并且slaveOk是false. 这是因为:
备份节点可能落后于主节点, 可能没有写入最新的数据
所以,备份节点默认情况下回拒绝读取请求,防止程序拿到过期数据
如果希望从备份节点读取数据,可以把slaveOk设置为true:
配置文件修改或者bin/mongo --nodb
& conn = new Mongo("192.168.35.131:3001");
& conn.setSlaveOk();
mongo --nodb =& 启动一个mongo shell,但是不连接任何mongod.
但是写入操作还是拒绝的:备份节点只能通过复制写入数据,不接受客户端的写入请求.
& conn.getDB("sns").imlog.insert({"sender":});
WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })
插入1w个文档:
& var func = function() {
var begin = new Date();
for (var i = 10000; i & 20000; i++) {
db.imlog.insert({"sender":i});
var end = new Date();
print('耗时:' + (end - begin));
2 - 修改配置
可以随时修改副本集的配置:添加、删除、修改已有的成员。很多常用的操作都有对应的shell函数。
rs.add("host:port") =& 添加一个节点
rs.remove("host:port") =& 删除成员
rs.config() =& 查看副本集配置
rs.reconfig(config) =& 根据config配置对象,重新配置副本集
注意:重新配置副本集时, 主节点会先退化为备份节点, 以便接受新的配置。然后会恢复。这段时间,副本集中可能没有主节点,之后会恢复MongoDB Replica Set集群_PHP程序员,雷雪松的博客
MongoDB副本集自动复制 Replica Set是官方推荐的主从复制和高可用方案。Replicat Set具有自动切换功能,当Primary挂掉之后,可以自动由Replica Set中的某一个Secondary来切换到Primary,以实现高可用的目的。下面看一下MongoDB Replica Set集群的具体步骤。
1、创建MongoDB数据文件夹
12[root@MongoDb ~]# mkdir /mongodb && cd /mongodb/
[root@MongoDb mongodb]# mkdir node1 node2 node3
2、以副本集mongos启动MongoDB
12345678[root@MongoDb mongodb]# /usr/local/bin/mongod --dbpath /mongodb/node3 --port 10003 --replSet mongos --fork --logpath /mongodb/node3/node3.log
[root@MongoDb mongodb]# /usr/local/bin/mongod --dbpath /mongodb/node2 --port 10002 --replSet mongos --fork --logpath /mongodb/node2/node2.log
[root@MongoDb mongodb]# /usr/local/bin/mongod --dbpath /mongodb/node1 --port 10001 --replSet mongos --fork --logpath /mongodb/node1/node1.log
[root@MongoDb mongodb]# ps -ef | grep mongod #查看mongod进程
root 3956 1 1 15:21 ? 00:00:23 /usr/local/bin/mongodd --dbpath /mongodb/node2 --port 10002 --replSet mongos --fork --logpath /mongodb/node2/node2.log
root 3970 1 1 15:21 ? 00:00:22 /usr/local/bin/mongodd --dbpath /mongodb/node1 --port 10001 --replSet mongos --fork --logpath /mongodb/node1/node1.log
root 4274 1 1 15:24 ? 00:00:21 /usr/local/bin/mongodd --dbpath /mongodb/node3 --port 10003 --replSet mongos --fork --logpath /mongodb/node3/node3.log
root 4959 1116 0 15:50 pts/0 00:00:00 grep mongod
3、初始化副本集mongos(只能初始化一次)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455[root@MongoDb mongodb]# /usr/local/bin/mongod localhost:10003
& rs.initiate({_id:&mongos&,members:[{_id:1,host:&localhost:10001&},{_id:2,host:&localhost:10002&},{_id:3,host:&localhost:10003&}]})
& rs.status();//查看副本集mongos的状态,也可以使用db.isMaster()查看集群中的主从节点信息。
&set& : &mongos&,
&date& : ISODate(&T07:53:00.240Z&),
&myState& : 2,
&members& : [
&_id& : 1,
&name& : &localhost:10001&,
&health& : 1,
&state& : 1,
&stateStr& : &PRIMARY&, #主节点
&uptime& : 1696,
&optime& : Timestamp(, 2),
&optimeDate& : ISODate(&T07:23:26Z&),
&lastHeartbeat& : ISODate(&T07:52:58.600Z&),
&lastHeartbeatRecv& : ISODate(&T07:52:58.728Z&),
&pingMs& : 1,
&electionTime& : Timestamp(, 1),
&electionDate& : ISODate(&T07:23:54Z&),
&configVersion& : 1
&_id& : 2,
&name& : &localhost:10002&,
&health& : 1,
&state& : 2,
&stateStr& : &SECONDARY&, #从节点
&uptime& : 1696,
&optime& : Timestamp(, 2),
&optimeDate& : ISODate(&T07:23:26Z&),
&lastHeartbeat& : ISODate(&T07:52:58.611Z&),
&lastHeartbeatRecv& : ISODate(&T07:52:58.793Z&),
&pingMs& : 1,
&lastHeartbeatMessage& : &could not find member to sync from&,
&configVersion& : 1
&_id& : 3,
&name& : &localhost:10003&,
&health& : 1,
&state& : 2,
&stateStr& : &SECONDARY&, #从节点
&uptime& : 1697,
&optime& : Timestamp(, 2),
&optimeDate& : ISODate(&T07:23:26Z&),
&configVersion& : 1,
&self& : true
mongos:PRIMARY& db.test.insert({name:&雷雪松&})
state: 1表示当前可以进行读写,2表示不能读写
health: 1表示是正常的,0异常
只用PRIMARY才可以读写,SECONDARY会提示”not master”不能读写操作。在从节点中使用rs.slaveOk(),就可以执行读操作了。
4、删除Replica Set节点
1mongos:PRIMARY& rs.remove(&localhost:10001&)
5、添加Replica Set节点
1mongos:PRIMARY& rs.add(&localhost:10001&)
6、停止PRIMARY主节点,查看自动切换。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556[root@MongoDb mongodb]# kill 3970
[root@MongoDb mongodb]# /usr/local/bin/mongod localhost:10003
mongos:SECONDARY& rs.status();
&set& : &mongos&,
&date& : ISODate(&T07:54:10.272Z&),
&myState& : 2,
&members& : [
&_id& : 1,
&name& : &localhost:10001&,
&health& : 0,
&state& : 8,
&stateStr& : &(not reachable/healthy)&, #节点不可用或者不健康
&uptime& : 0,
&optime& : Timestamp(0, 0),
&optimeDate& : ISODate(&T00:00:00Z&),
&lastHeartbeat& : ISODate(&T07:54:08.706Z&),
&lastHeartbeatRecv& : ISODate(&T07:54:00.819Z&),
&pingMs& : 1,
&lastHeartbeatMessage& : &Failed attempt to connect to localhost:10001; couldn't connect to server localhost:1.0.1), connection attempt failed&,
&configVersion& : -1
&_id& : 2,
&name& : &localhost:10002&,
&health& : 1,
&state& : 1,
&stateStr& : &PRIMARY&, #主节点
&uptime& : 1766,
&optime& : Timestamp(, 2),
&optimeDate& : ISODate(&T07:23:26Z&),
&lastHeartbeat& : ISODate(&T07:54:08.699Z&),
&lastHeartbeatRecv& : ISODate(&T07:54:08.870Z&),
&pingMs& : 0,
&electionTime& : Timestamp(, 1),
&electionDate& : ISODate(&T07:54:03Z&),
&configVersion& : 1
&_id& : 3,
&name& : &localhost:10003&,
&health& : 1,
&state& : 2,
&stateStr& : &SECONDARY&, #从节点
&uptime& : 1767,
&optime& : Timestamp(, 2),
&optimeDate& : ISODate(&T07:23:26Z&),
&configVersion& : 1,
&self& : true
mongos:PRIMARY& db.test.find();
{ &_id& : ObjectId(&50f94c860ac2&), &name& : &雷雪松& }
当节点恢复后,会自动成为SECONDARY从节点。博客分类:
网上已经有一大堆的设置步骤的了,根据我遇到的问题,整理一下,如下:
首先先去下载一个mongodb最新版,目前最新版应该是2.6
cd /usr/local/bin
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.0.tgz
mongodb-linux-x86_64-2.6.0.tar
mv mongodb-linux-x86_64-2.6.0/ mongodb2.6
先切换到安装目录,再下载,然后解压,最后改名!
mkdir -p /mnt/mongodb/rs/data
mkdir -p /mnt/mongodb/rs/logs
mkdir -p /mnt/mongodb/rs/config
然后再进入/mnt/mongodb/rs/config目录,新建mongod.conf文件,用来启动mongodb,内容如下:
dbpath=/mnt/mongodb/rs/data
#数据存放目录
logpath=/mnt/mongodb/rs/logs/mongod.log
#日志文件目录
pidfilepath=/mnt/mongodb/rs/mongod.pid
#pid端口文件
port=12345
#mongodb端口
logappend=true
#追加方式写日志文件
journal=true
#启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
oplogSize=2048
#同步操作记录文件大小(MB)
smallfiles=true
#使用较小的默认文件
replSet=dbset
#副本集名称,同一个副本集,名称必须一致
保存退出后,再进入到bin目录下执行:
./mongod -f ../mongod.conf
"info" : "Config now saved locally.
Should come online in about a minute.",
即运行mongodb成功。
如果有多台机器的话,只需重复以上步骤。
如果同一个机器的话,则仅需要将mongod.conf文件作出相应的更改,如更改数据,日志,pid文件,端口等,但replSet的名称必须一致。
创建集合
登录到其中一台已经成功运行mongodb的机器,
cd /usr/local/bin/mongodb2.6/bin
./mongo 127.0.0.1:12345/admin
登录进去,输入以下命令:
config={_id : 'dbset',members : [{_id : 1, host : '192.168.0.1:12345'},{_id : 2, host : '192.168.0.2:12345'},{_id : 3, host : '192.168.0.3:12345'}]}
回车后再输入
rs.initiate(config); #初始化副本集
以上例子,说明一共有三台机器做副本集,并可以用rs.help()来查看rs下有什么命令可以用。
退出,再重新登录,发现提示符已经发生变化,再输入rs.status()可以查看当前的状态。
其中:
"health" : 1, #代表机器正常
"stateStr" : "PRIMARY",& #代表是主节点,可读写,其中有以下几下状态
1. STARTUP:刚加入到复制集中,配置还未加载
2. STARTUP2:配置已加载完,初始化状态
3. RECOVERING:正在恢复,不适用读
4. ARBITER: 仲裁者
5. DOWN:节点不可到达
6. UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂
7. REMOVED:移除复制集
8. ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态
9. FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步
10. PRIMARY:主节点
11. SECONDARY:备份节点
至此你应该可以看到一台机为primary,二台机器的状态为secondary, 即完成副本集设置
维护:
添加副本,在登录到主节点下输入:
rs.add("ip:port");
rs.remove("ip:port");
前提是这个ip:port必须是使用了同一个relpSet名称的mongodb实例即可
db.addUser("username","password");
需要在主节点和从节点上的local数据库下,建个相同的用户名和密码的用户,可读写。 从节点连接主节点时,会用存储在local.system.users中的用户进行认证,最先尝试用repl用户,若没有,则用local.system.users中的第一个可用用户。(但网上有些人说会对效率产生影响,这个待验证。知道的朋友请跟帖说一下。谢谢!)
问题:
按以上完成后,导入原有数据后,导入命令
mongorestore -h 127.0.0.1:12345 -d syt --directoryperdb /mnt/mongo_data/
其中/mnt/mongo_data为要导入的json文件,后发现从节点都变成recovering状态。
问题原因
出现这个问题的原因主要是secondary节点同步oplog的速度追不上primary几点的速度,造成一直处于recovering状态。
解决办法:
&&& 首先停掉从节点mongod进程,然后删除目录(rs)下面所有的数据,然后重启mongod进程,这里有一点需要注意,如果有arbiter的mongod进程也需要停掉,启动的时候,先启动replSet的mongod进程,再启动arbiter的mongod进程,启动之后,会自动由recovering状态切换为startup2状态,最后切换为secondary状态
第二种办法就是先将recovering节点下的data目录删除,再将primary里的data都拷贝到该节点下,再重启就好了!操作前,务必要停止所有的mongodb数据库!
当正在startup2状态时,可以查看mongodb.log文件,发现正在不断地导入数据。当出现
[rsHealthPoll] replSet member 192.168.0.2:12345 is now in state SECONDARY
时,说明已经完成导入,状态也变为secondary了。
另一个解决办法是:
&&& 先对主节点机器完成数据导入,再设置为副本集的节点,即上述的步骤不需要重复操作。待数据完成导入,再操作
replica set权限认证
权限认证搞了一天,搞书本上说的须在每个节点上的local数据库里加入repl这个用户,然后在启动的时候加入 --auth参数,开启权限认证,如果经过测试,是不行的。不知道是那里出问题,具体情况是:当启动一个是时候,另外的节点就会全部变成"stateStr" : "(not reachable/healthy)"这样的状态。
后来经过长时间的百度,google,还是google给力,说要用到keyFile这个参数,于是上官网那里看,要生一个keyfile文件,用于节点之间权限认证的。按官网的提示作以下操作:
mkdir -p /mnt/mongodb/rs/config
cd /mnt/mongodb/rs/config
openssl rand -base64 741 & mongodb-keyfile
chmod 300 mongodb-keyfile
官网上的是600的,必须要改为300,如果不是的话, 会在启动的时候mongodb.log里写权限太开放的原因导致启动mongodb失败!切记切记!这里也花了不少时间...
这里先确保你已经安装了openssl,如果没有装,yum install openssl
将mongodb-keyfile 个问题复制到每一个节点对应的目录下,如果之前已经启动的mongodb的话,用mongo进入到终端后,先查看那个节点是主节点,rs.status(); 去到主节点下执行:
#选择需要认证的数据
db.addUser('name','password');
当然,也可以某一个自建的库进行权限认证
db.addUser('test','123456');
提示添加成功后,全部停止,每一节点执行db.shutdownServer();然后对mongod.conf文件添加以下两行:
keyFile=/mnt/mongodb/rs/confile/mongodb-keyfile
最后全部重启即可!
进入主节点终端,输入
db.runCommand({getLastError:1, w: N});
如果没有N,或者小于2,命令就会立刻返回,如果N等于2,主节点要等到至少一个从节点复制了上个操作都会响应命令(主节点本身也包括在N里面)。主节点使用local.slaves中存放的"syncedTo"信息来跟踪从节点的更新情况。
当指定"w"选项后,还可以使用"wtimeout"选项,表示以毫秒为单位的超时。getLastError就能在上一个操作复制到N个节点超时时返回错误(默认情况下命令是没有超时的)。
阻塞复制会导致写操作明显变慢,尤其是"w"的值比较大时。实际上,对于重要的操作将其值设置为2或者3就能效率与安全兼备了。
mongod的主要参数有:
------------------------------------基本配置----------------------
# 安静输出
--port arg
# 指定服务端口号,默认端口27017
--bind_ip arg
# 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
--logpath arg
# 指定MongoDB日志文件,注意是指定文件不是目录
--logappend
# 使用追加的方式写日志
--pidfilepath arg
# PID File 的完整路径,如果没有设置,则没有PID文件
--keyFile arg
# 集群的私钥的完整路径,只对于Replica Set 架构有效
--unixSocketPrefix arg
# UNIX域套接字替代目录,(默认为 /tmp)
# 以守护进程的方式运行MongoDB,创建服务器进程
# 启用验证
# 定期显示CPU的CPU利用率和iowait
--dbpath arg
# 指定数据库路径
--diaglog arg
# diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb
# 设置每个数据库将被保存在一个单独的目录
# 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
--journalOptions arg
# 启用日志诊断选项
# 启用IPv6选项
# 允许JSONP形式通过HTTP访问(有安全影响)
--maxConns arg
# 最大同时连接数 默认2000
# 不启用验证
--nohttpinterface
# 关闭http接口,默认关闭27018端口访问
--noprealloc
# 禁用数据文件预分配(往往影响性能)
--noscripting
# 禁用脚本引擎
--notablescan
# 不允许表扫描
--nounixsocket
# 禁用Unix套接字监听
--nssize arg (=16)
# 设置信数据库.ns文件大小(MB)
--objcheck
# 在收到客户数据,检查的有效性,
--profile arg
# 档案参数 0=off 1=slow, 2=all
# 限制每个数据库的文件数,设置默认为8
--quotaFiles arg
# number of files allower per db, requires --quota
# 开启简单的rest API
# 修复所有数据库run repair on all dbs
--repairpath arg
# 修复库生成的文件的目录,默认为目录名称dbpath
--slowms arg (=100)
# value of slow for profile and console log
--smallfiles
# 使用较小的默认文件
--syncdelay arg (=60)
# 数据写入磁盘的时间秒数(0=never,不推荐)
# 打印一些诊断系统信息
# 如果需要升级数据库
-----------------------------------Replicaton 参数--------------------
--fastsync
# 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
--autoresync
# 如果从库与主库同步数据差得多,自动重新同步,
--oplogSize arg
# 设置oplog的大小(MB)
---------------------------------* 主/从参数-------------------------
# 主库模式
# 从库模式
--source arg
# 从库 端口号
--only arg
# 指定单一的数据库复制
--slavedelay arg
# 设置从库同步主库的延迟时间
-----------------------------------Replica set(副本集)选项----------------------
--replSet arg
# 设置副本集名称
-----------------------------------Sharding(分片)选项------------------------
--configsvr
# 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
--shardsvr
# 声明这是一个集群的分片,默认端口27018
--noMoveParanoia
# 关闭偏执为moveChunk数据保存
# 上述参数都可以写入 mongod.conf 配置文档里例如:
dbpath = /data/mongodb
logpath = /data/mongodb/mongodb.log
logappend = true
port = 27017
fork = true
auth = true
下载次数: 25
浏览 25280
看着挺有技术。可这段,您这文章是自己写的?不懂Linux?文件权限,你一点不了解?官网上的是600的,必须要改为300,如果不是的话, 会在启动的时候mongodb.log里写权限太开放的原因导致启动mongodb失败!切记切记!这里也花了不少时间... 600是对的。 读写权限。其实那文件只读就可以了。可是这300,写跟执行?没用处吧。如果我没记错的话,log里的确是报这个异常的,你可以试试
浏览: 743562 次
来自: 被遗忘的角落...
今天刚遇到这个问题,正好解决了,谢谢!
你的问题怎么解决的,我的是出现了部分回滚的情况。我这边的情况是 ...
最后一句话救了 我
DEFAULT_ERROR(10000, & ...1184人阅读
linux(14)
mongodb副本集+分片集群部署step by step
本文只讲述mongodb副本集+分片集群的部署,关于mongdb shading & replica set原理优点等不在本文讨论范围内。
MongoDB Sharding Cluster,需要三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
本实例用的机器:
分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica set1,作为cluster的shard1
分别在3台机器运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组织replica set2,作为cluster的shard2
每台机器运行一个mongod实例,作为3个config server
每台机器运行一个mongs进程,用于客户端连接
1、安装mongodb
使用mongodb的版本 mongodb-linux-x86_64-rhel62-3.0.7.tgz
将mongodb-linux-x86_64-rhel62-3.0.7.tgz 解压到 /home/services
Server1、Server2、Server3 均作如下操作:
cd /home/services/
tar -zxf mongodb-linux-x86_64-rhel62-3.0.7.tgz
mv mongodb-linux-x86_64-rhel62-3.0.7 mongodb
2、创建sharding数据目录
根据本例sharding架构图所示,在各台sever上创建shard数据文件目录
cd /home/services/mongodb
mkdir -p data/shard11
mkdir -p data/shard21
cd /home/services/mongodb
mkdir -p data/shard12
mkdir -p data/shard22
cd /home/services/mongodb
mkdir -p data/shard13
mkdir -p data/shard23
3、配置relica sets
3.1 配置shard1所用到的replica sets 1:
./bin/mongod –shardsvr –replSet shard1 –port 27018 –dbpath /home/services/mongodb/data/shard11 –oplogSize 100 –logpath /home/services/mongodb/data/shard11.log –logappend –fork
./bin/mongod –shardsvr –replSet shard1 –port 27018 –dbpath /home/services/mongodb/data/shard12 –oplogSize 100 –logpath /home/services/mongodb/data/shard12.log –logappend –fork
./bin/mongod –shardsvr –replSet shard1 –port 27018 –dbpath /home/services/mongodb/data/shard13 –oplogSize 100 –logpath /home/services/mongodb/data/shard13.log –logappend –fork
3.2 初始化replica set 1
连接到一台mongod
./mongo –port 27018
执行如下脚本
config = {
"_id" : "shard1",
"members" : [
"_id" : 0,
"host" : "192.168.66.10:27018"
"_id" : 1,
"host" : "192.168.66.20:27018"
"_id" : 2,
"host" : "192.168.66.30:27018"
rs.initiate(config)
3.3 配置shard2所用到的replica sets 2:
./bin/mongod –shardsvr –replSet shard2 –port 27019 –dbpath /home/services/mongodb/data/shard21 –oplogSize 100 –logpath /home/services/mongodb/data/shard21.log –logappend –fork
./bin/mongod –shardsvr –replSet shard2 –port 27019 –dbpath /home/services/mongodb/data/shard22 –oplogSize 100 –logpath /home/services/mongodb/data/shard22.log –logappend –fork
./bin/mongod –shardsvr –replSet shard2 –port 27019 –dbpath /home/services/mongodb/data/shard23 –oplogSize 100 –logpath /home/services/mongodb/data/shard23.log –logappend –fork
3.4 初始化replica set 2
连接到一台mongod
./mongo –port 27019
执行如下脚本
config = {
"_id" : "shard2",
"members" : [
"_id" : 0,
"host" : "192.168.66.10:27019"
"_id" : 1,
"host" : "192.168.66.20:27019"
"_id" : 2,
"host" : "192.168.66.30:27019"
rs.initiate(config)
4、配置三台config server
mkdir -p /home/services/mongodb/data/config
./bin/mongod –configsvr –dbpath /home/services/mongodb/data/config –port 20000 –logpath /home/services/mongodb/data/config.log –logappend –fork
mkdir -p /home/services/mongodb/data/config
./bin/mongod –configsvr –dbpath /home/services/mongodb/data/config –port 20000 –logpath /home/services/mongodb/data/config.log –logappend –fork
mkdir -p /home/services/mongodb/data/config
./bin/mongod –configsvr –dbpath /home/services/mongodb/data/config –port 20000 –logpath /home/services/mongodb/data/config.log –logappend –fork
5、配置mongs
在server1,server2,server3上分别执行:
./bin/mongos –configdb 192.168.66.10:8.66.20:8.66.30:20000 –port 27017 –chunkSize 5 –logpath /home/services/mongodb/data/mongos.log –logappend –fork
6、配置分片集群(Configuring the Shard Cluster)
连接到其中一个mongos进程,并切换到admin数据库做以下配置
6.1、连接到mongs,并切换到admin
./bin/mongo 192.168.66.10:27017/admin
6.2、 加入shards
如里shard是单台服务器,用&db.runCommand( { addshard : “[:]” } )这样的命令加入,如果shard是replica sets,用replicaSetName/[:port][,serverhostname2[:port],…]这样的格式表示,例如本例执行:
&.runCommand( { addshard:"shard1/192.168.66.10:8.66.20:8.66.30:27018",name:"s1",maxsize:20480});
&.runCommand( { addshard:"shard2/192.168.66.10:8.66.20:8.66.30:27019",name:"s2",maxsize:20480});
Name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes
6.3、 Listing shards
db.runCommand( { listshards : 1 } )
如果列出了以上二个你加的shards,表示shards已经配置成功
如下为执行效果
[root@appsvr mongodb]# ./bin/mongo 192.168.66.10:27017/admin
mongos& db
mongos& db.runCommand( { addshard:"shard1/192.168.66.10:8.66.20:8.66.30:27018",name:"s1",maxsize:20480})
{ "shardAdded" : "s1", "ok" : 1 }
mongos& db.runCommand( { addshard:"shard2/192.168.66.10:8.66.20:8.66.30:27019",name:"s2",maxsize:20480})
{ "shardAdded" : "s2", "ok" : 1 }
mongos& db.runCommand( { listshards : 1 } )
"shards" : [
"_id" : "s1",
"host" : "shard1/192.168.66.10:8.66.20:8.66.30:27018"
"_id" : "s2",
"host" : "shard2/192.168.66.10:8.66.20:8.66.30:27019"
6.4、 激活数据库分片
db.runCommand( { enablesharding : “” } );
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作
Collecton分片
要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作:
db.runCommand( { shardcollection : “”,key :
a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
mongos& db.runCommand({enablesharding:"test2"});
{ "ok" : 1 }
mongos& db.runCommand( { shardcollection : "test2.books", key : { id : 1 } } );
{ "collectionsharded" : "test2.books", "ok" : 1 }
mongos& use test2
switched to db test2
mongos& db.stats();
"shard1/192.168.66.10:8.66.20:8.66.30:27018" : {
"db" : "test2",
"collections" : 3,
"objects" : 6,
"avgObjSize" : 69.33,
"dataSize" : 416,
"storageSize" : 20480,
"numExtents" : 3,
"indexes" : 2,
"indexSize" : 16352,
"fileSize" : ,
"nsSizeMB" : 16,
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
"dataFileVersion" : {
"major" : 4,
"minor" : 22
"$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("d63aa9f9f000")
"shard2/192.168.66.10:8.66.20:8.66.30:27019" : {
"db" : "test2",
"collections" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 0,
"numExtents" : 0,
"indexes" : 0,
"indexSize" : 0,
"fileSize" : 0,
"objects" : 6,
"avgObjSize" : 69,
"dataSize" : 416,
"storageSize" : 20480,
"numExtents" : 3,
"indexes" : 2,
"indexSize" : 16352,
"fileSize" : ,
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
mongos& db.books.stats();
"sharded" : true,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for c
ompatibility only.",
"userFlags" : 1,
"capped" : false,
"ns" : "test2.books",
"count" : 0,
"numExtents" : 1,
"size" : 0,
"storageSize" : 8192,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"id_1" : 8176
"avgObjSize" : 0,
"nindexes" : 2,
"nchunks" : 1,
"shards" : {
"ns" : "test2.books",
"count" : 0,
"size" : 0,
"numExtents" : 1,
"storageSize" : 8192,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard co
ded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 2,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"id_1" : 8176
"$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("d63aa9f9f000")
mongos& for (var i = 1; i &= 20000; i++) db.books.save({id:i,name:"",sex:"male",age:27,value:"test"});
WriteResult({ "nInserted" : 1 })
mongos& db.books.stats();
"sharded" : true,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"ns" : "test2.books",
"count" : 20000,
"numExtents" : 10,
"size" : 2240000,
"storageSize" : 5586944,
"totalIndexSize" : 1250928,
"indexSizes" : {
"_id_" : 670432,
"id_1" : 580496
"avgObjSize" : 112,
"nindexes" : 2,
"nchunks" : 5,
"shards" : {
"ns" : "test2.books",
"count" : 12300,
"size" : 1377600,
"avgObjSize" : 112,
"numExtents" : 5,
"storageSize" : 2793472,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 2,
"totalIndexSize" : 760368,
"indexSizes" : {
"_id_" : 408800,
"id_1" : 351568
"$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("d63aa9f9f000")
"ns" : "test2.books",
"count" : 7700,
"size" : 862400,
"avgObjSize" : 112,
"numExtents" : 5,
"storageSize" : 2793472,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 2,
"totalIndexSize" : 490560,
"indexSizes" : {
"_id_" : 261632,
"id_1" : 228928
"$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("bb")
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:33234次
排名:千里之外
原创:21篇
转载:10篇
(1)(1)(4)(3)(2)(5)(1)(1)(1)(1)(1)(2)(1)(3)(1)(1)(1)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 mongo 副本集 的文章

 

随机推荐