mongdb在线添加新的分片复制集
MongoDB分布式部署之分片配置

MongoDB分布式部署之分片配置【学习笔记】MongoDB分布式部署之分片配置2010-04-07 14:27这里介绍的是Mongodb的分片配置,如果想配置主主或主从对,以实现数据备份,可见mongodb分布式之数据复制。
1、启动相关进程在shard server上启动mongod,使用--shardsvr 命令行参数。
对于主从对,使用--pairwith命令行选项。
建议一个shard server只运行一个mongod进程。
在config server上启动mongod,使用--configsvr命令行参数。
如果config server不是一台独立的服务器,为其分配一个独立的dbpath,--dbpath命令行参数。
启动mongos,使用--configdb参数指明配置的数据库地址。
2、shell配置分片在启动好的mongos服务器上运行这些命令,然后通过它运行所有的配置命令。
注:应该使用特定的admin数据库来存储这些命令,尽管通过mongos运行时,数据会存储在config server上,所以在集群的生命周期内这些命令只需运行一次即可。
./mongo <mongos-hostname>:<mongos-port>/admin> dbadmin>3、增加一个分片,每个分片包括两台服务器(一对主从)或单机(Alpha 2只支持单机)。
> db.runCommand( { addshard : "<serverhostname>[:<port>]" } );{"ok" : 1 , "added" : ...}多台配置用逗号分隔(alpha3及以上版本)。
可选参数maxSize可用户设置该分片可使用的磁盘空间,默认为整个磁盘。
该参数目前1.4及1.4以前的版本是无效的,1.5版本及以后才会有效。
mongodb 高可用方案

mongodb 高可用方案MongoDB是当前最流行的NoSQL数据库之一,其高可用性是企业采用它的重要原因之一。
随着数据规模和对数据可靠性要求的不断增加,如何保证MongoDB在故障情况下的高可用性成为了一项重要的挑战。
本文将介绍几种常见的MongoDB高可用方案,并对比它们的优缺点。
一、复制集(Replica Set)复制集是MongoDB官方提供的用于实现高可用的一种方案。
一个复制集由多个副本集成,其中一个为主节点(primary),其余为从节点(secondary)。
主节点负责处理所有的写操作,并将数据变更的操作日志(oplog)复制给从节点。
当主节点发生故障时,从节点会通过选举产生新的主节点,确保服务的连续性。
复制集的优点是配置简单,易于部署和维护。
当主节点发生故障时,系统可以自动完成主节点的切换,从而实现快速的故障恢复。
同时,复制集还能提供一定程度的数据冗余,可以防止数据丢失。
然而,复制集也存在一些缺点。
首先,复制集的写操作只能由主节点处理,从节点只能读取数据。
这就限制了系统的写入吞吐量,并且可能引入一定的写入延迟。
其次,复制集最多只能容忍一个节点的故障,当多个节点同时发生故障时,系统将无法正常运行。
二、分片集群(Sharded Cluster)分片集群是通过将数据划分为多个分片(shard)存储在多台服务器上来实现高可用的方案。
每个分片可以是一个独立的MongoDB副本集,其中包含主节点和从节点。
应用程序通过路由器(router)连接到分片集群,并根据分片键将数据路由到相应的分片。
分片集群的优点是可以水平扩展存储容量和吞吐量。
通过增加分片,可以实现数据的并行存储和查询,大大提高系统的性能。
此外,分片集群还能够容忍多个节点的故障,保证系统的高可用性。
然而,分片集群也存在一些挑战。
首先,配置和管理分片集群相对复杂,需要考虑数据划分、数据迁移、负载均衡等因素。
其次,在分片键选择不当或数据分布不均匀的情况下,可能导致某些分片负载过大,降低系统的性能。
Mongodb分片操作实战

Mongodb分⽚操作实战由于⽣产环境中⼀般使⽤zoomkeeper做config节点的仲裁节点,zoomkeeper会在三个config节点中挑选出⼀台作为主config节点。
且mongos节点⼀般是两个节点,必须做⾼可⽤,可以⽤keepalived实现(任何具有负载均衡能⼒的服务器节点都可以使⽤keepalived做⾼可⽤)实际操作过程1:准备四个节点mongodb1(mongos)、mongodb2(config)、mongodb3(shard1)、mongodb4(shard2)且保证可以通过主机名访问,且时间同步2:配置mongodb2(config)节点,使得mongodb2为config节点,编辑配置⽂件/etc/mongod.conf添加:configsvr = true同时注释:#replSet=uplooking #replIndexPrefetch=_id_only #port=27017 这3个指令(因为副本集与config节点不能同时⼯作)4:启动config server,此时默认config server监听在27019端⼝systemctl start mongod.service5: 在mongodb1上操纵:mongodb1作为路由,使⽤mongos连接config server,先清空配置⽂件,再添加如下信息logpath=/var/log/mongodb/mongod.log # 指明⽇志路径pidfilepath=/var/run/mongodb/mongod.pid # 指明pid路径logappend=true # 指明⽇志累加fork=true # 指明运⾏于守护进程port=27017 # 指明端⼝configdb=192.168.43.11:27019 # 指明config server 的地址在哪⾥6:指定配置⽂件,启动mongos,也可以使⽤systemctl启动,但是需要修改下启动脚本/etc/rc.d/init.d/mongodmongos -f /etc/mongod.conf7:将mongodb3和mongodb4配置⽂件中关于副本集的指令注释,然后直接启动systemctl start mongod8:mongodb3、mongodb4启动之后,在mongodb1上,通过mongo登⼊到mongos,将mongodb3、mongodb4作为shard添加到mongos的路由策略中9:创建⽀持shard机制的数据库sh.enableSharding("uplookingdb")mongos> sh.status();--- Sharding Status ---sharding version: {"_id" : 1,"version" : 4,"minCompatibleVersion" : 4,"currentVersion" : 5,"clusterId" : ObjectId("59f6caf5c93e5ff2a637a0cd")}shards:{ "_id" : "shard0000", "host" : "192.168.43.13:27017" }{ "_id" : "shard0001", "host" : "192.168.43.12:27017" }databases: # 这⾥会显⽰⽀持shard的数据库,分⽚collection放置在各个shard,⽽没有分⽚的collection放置在主shard中{ "_id" : "admin", "partitioned" : false, "primary" : "config" }{ "_id" : "test", "partitioned" : false, "primary" : "shard0001" }{ "_id" : "uplookingdb", "partitioned" : true, "primary" : "shard0001" }10:在对应⽀持shard机制的数据库上创建⽀持shard的collection,{"age": 1}指明索引为age,升序排序,这样shard集群的功能就已经启动了,之后就可以调⽤mongodb1这个接⼝写数据了,但是写⼊mongodb1的数据不会保存在mongodb1,因为mongodb1是⼀个router节点,所有的数据都会保存⾄shard节点上。
mongodb复制原理

MongoDB复制原理MongoDB的复制(Replication)是指在MongoDB中创建主从复制集(Replica Set),通过复制将数据同步到多个服务器上。
MongoDB的复制实现了数据的冗余备份和故障转移,提供了数据的容错能力和高可用性,提高了系统的可用性和稳定性。
当主节点发生故障时,从节点可以快速接替主节点的功能,确保系统的连续运行。
因此,复制是MongoDB中重要的特性之一,也是构建高可用性、容错性、高性能系统的重要手段。
MongoDB复制的原理如下:1.主从复制集:一个典型的MongoDB复制环境包括一个主节点(Primary)和多个从节点(Secondary),以及一个仲裁节点(Arbiter)。
➢Primary(主节点):负责处理所有的写操作,,并将写操作的结果复制给从节点。
➢Secondary(从节点):从主节点复制数据,并且可以提供读取操作。
它们通常用于读取负载均衡和故障转移。
➢Arbiter(仲裁节点):用于选举主节点的辅助节点,本身不存储数据。
仲裁节点用来解决主节点故障时的选举问题。
2. Oplog(操作日志):MongoDB使用Oplog来记录主节点的所有操作,,包括插入、更新、删除等。
从节点定期轮询Oplog来获取主节点的写操作并应用到自己的数据中,从而保持数据的一致性。
3. 选举机制:如果主节点发生故障或意外断开连接,复制集会自动进行选举,选择一个新的主节点来接替原主节点的功能,确保整个系统的可用性。
4. 心跳检测:各个节点之间会相互发送心跳检测消息,用来检测节点的存活状态,一旦发现节点不可用就会进行故障转移。
5.数据同步:从节点定期轮询主节点,获取主节点的数据变更并应用到自己的数据中,保持数据的同步。
6.延迟复制:通过设置合适的复制延迟,可以在某些场景下实现数据恢复,比如防止误操作导致数据删除后的短时间内恢复数据。
mongodb分片集群(shardingwithreplicaset)配置

mongodb分片集群(shardingwithreplicaset)配置一共有4台机器,各自挂接一个存储,希望实现:1.尽量节约存储2.高可用性3.存储大量数据配置方案:1.每一台机器做一个分片的主数据库2.每一台机器做一个分片的后备数据库3.每一台机器做一个分片的仲裁服务4.两个两个一组交叉作对方的后备5.有三台机器开配置服务6.有一台机器开路由服务(生产环境可以在每一台Windows App服务器上开路由服务,App服务器集群做负载均衡)这样的话,任何一台服务器完全离线(或者交叉的两台服务器离线),都能保证整个系统正常运行。
不过在服务器和服务器起来之后需要:1.在升级成为主数据库的那个后备数据库上运行rs.StepDown(100)来让它让出主数据库的位置,因为每一个分片的活动数据库都应该由独立服务器担当,以获得最好的性能2.配置服务和后备数据库起来之后不需要做任何调整192.168.129.142mkdir -p /usr/data/shard1mkdir -p /usr/data/shard2mkdir -p /usr/data/shard3mkdir -p /usr/data/config1/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10001 --dbpath /usr/data/shard1/ --logpath /usr/data/shard1/log.log --replSet shard1 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10002 --dbpath /usr/data/shard2/ --logpath /usr/data/shard2/log.log --replSet shard2 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10003 --dbpath /usr/data/shard3/ --logpath /usr/data/shard3/log.log --replSet shard3 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --configsvr --port 20001 --dbpath /usr/data/config1/ --logpath /usr/data/config1/log.log --restps aux | grep mongodb | grep -v grep/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongo --port 10001config = {_id: 'shard1', members: [{_id: 0, host: '192.168.129.142:10001'},{_id: 1, host: '192.168.129.172:10001'},{_id: 2, host: '192.168.129.173:10001', arbiterOnly: true}]}rs.initiate(config)rs.status()192.168.129.172mkdir -p /usr/data/shard2mkdir -p /usr/data/shard1mkdir -p /usr/data/shard4mkdir -p /usr/data/config2/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10002 --dbpath /usr/data/shard2/ --logpath /usr/data/shard2/log.log --replSet shard2 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10001 --dbpath /usr/data/shard1/ --logpath/usr/data/shard1/log.log --replSet shard1 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10004 --dbpath /usr/data/shard4/ --logpath /usr/data/shard4/log.log --replSet shard4 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --configsvr --port 20002 --dbpath /usr/data/config2/ --logpath /usr/data/config2/log.log --restps aux | grep mongodb | grep -v grep/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongo --port 10002config = {_id: 'shard2', members: [{_id: 0, host: '192.168.129.172:10002'},{_id: 1, host: '192.168.129.142:10002'},{_id: 2, host: '192.168.129.175:10002', arbiterOnly: true}]}rs.initiate(config)rs.status()192.168.129.173mkdir -p /usr/data/shard3mkdir -p /usr/data/shard4mkdir -p /usr/data/shard1mkdir -p /usr/data/config3/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10003 --dbpath /usr/data/shard3/ --logpath /usr/data/shard3/log.log --replSet shard3 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10004 --dbpath /usr/data/shard4/ --logpath /usr/data/shard4/log.log --replSet shard4 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork--shardsvr --port 10001 --dbpath /usr/data/shard1/ --logpath /usr/data/shard1/log.log --replSet shard1 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --configsvr --port 20003 --dbpath /usr/data/config3/ --logpath /usr/data/config3/log.log --restps aux | grep mongodb | grep -v grep/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongo --port 10003config = {_id: 'shard3', members: [{_id: 0, host: '192.168.129.173:10003'},{_id: 1, host: '192.168.129.175:10003'},{_id: 2, host: '192.168.129.142:10003', arbiterOnly: true}]}rs.initiate(config)rs.status()192.168.129.175mkdir -p /usr/data/shard4mkdir -p /usr/data/shard3mkdir -p /usr/data/shard2mkdir -p /usr/data/master/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10004 --dbpath /usr/data/shard4/ --logpath /usr/data/shard4/log.log --replSet shard4 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10003 --dbpath /usr/data/shard3/ --logpath /usr/data/shard3/log.log --replSet shard3 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongod --fork --shardsvr --port 10002 --dbpath /usr/data/shard2/ --logpath /usr/data/shard2/log.log --replSet shard2 --rest/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongos --fork --port 40000 --logpath /usr/data/master/log.log --chunkSize 1 "192.168.129.142:20001,192.168.129.172:20002,192.168.129 .173:20003"ps aux | grep mongodb | grep -v grep/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongo --port 10004config = {_id: 'shard4', members: [{_id: 0, host: '192.168.129.175:10004'},{_id: 1, host: '192.168.129.173:10004'},{_id: 2, host: '192.168.129.172:10004', arbiterOnly: true}]}rs.initiate(config)rs.status()/usr/local/mongodb-linux-x86_64-1.6.4/bin/mongo --port 40000use admindb.runCommand({ addshard:'shard1/192.168.129.142:10001 ,192.168.129.172:10001' })db.runCommand({ addshard:'shard2/192.168.129.172:10002 ,192.168.129.142:10002' })db.runCommand({ addshard:'shard3/192.168.129.173:10003 ,192.168.129.175:10003' })db.runCommand({ addshard:'shard4/192.168.129.175:10004 ,192.168.129.173:10004' })db.runCommand({ listshards:1 })db.runCommand({ enablesharding:'test' })db.runCommand({ shardcollection:'test.data', key:{_id:1} }) printShardingStatus()插入大量数据后的结果:db.data.stats(){"sharded" : true,"ns" : "test.data","count" : 1992002,"size" : 2103555152, "avgObjSize" : 1056.0005220878293, "storageSize" : 2464232960, "nindexes" : 1, "nchunks" : 23,"shards" : {"shard1" : {"ns" : "test.data","count" : 1271788,"size" : 1343008448, "avgObjSize" : 1056.0002516142627, "storageSize" : 1568785152, "numExtents" : 25, "nindexes" : 1, "lastExtentSize" : 267987712, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 52658176, "indexSizes" : {"_id_" : 52658176},"ok" : 1},"shard2" : {"ns" : "test.data", "count" : 98494,"size" : 104009808, "avgObjSize" : 1056.001462017991, "storageSize" : 111137536, "numExtents" : 12, "nindexes" : 1, "lastExtentSize" : 25047552, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 4087808, "indexSizes" : {"_id_" : 4087808},"ok" : 1},"shard3" : {"ns" : "test.data", "count" : 487410,"size" : 514705248, "avgObjSize" : 1056.000590878316, "storageSize" : 607047424, "numExtents" : 20, "nindexes" : 1, "lastExtentSize" : 107698688, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 20250624, "indexSizes" : {"_id_" : 20250624},"ok" : 1},"shard4" : {"ns" : "test.data","count" : 134310,"size" : 141831648, "avgObjSize" : 1056.0021442930533, "storageSize" : 177262848, "numExtents" : 14, "nindexes" : 1, "lastExtentSize" : 36068352, "paddingFactor" : 1,"flags" : 1, "totalIndexSize" : 5570560, "indexSizes" : {"_id_" : 5570560},"ok" : 1}},"ok" : 1}printShardingStatus()--- Sharding Status ---sharding version: { "_id" : 1, "version" : 3 } shards:{"_id" : "shard1","host" : "shard1/192.168.129.142:10001,192.168.129.172:10001"}{"_id" : "shard2","host" : "shard2/192.168.129.172:10002,192.168.129.142:10002"}{"_id" : "shard3","host" : "shard3/192.168.129.173:10003,192.168.129.175:10003"}{"_id" : "shard4","host" : "shard4/192.168.129.175:10004,192.168.129.173:10004"}databases:{ "_id" : "admin", "partitioned" : false, "primary" : "config" }{ "_id" : "test", "partitioned" : true, "primary" : "shard1" }test.data chunks:{ "_id" : { $minKey : 1 } } -->> { "_id" : ObjectId("4d01c5bc926adb17b8000001") } on : shard2 { "t" : 8000, "i" : 0 }{ "_id" : ObjectId("4d01c5bc926adb17b8000001") } -->> { "_id" : ObjectId("4d01c620926adb17b800d1dd") } on : shard2 { "t" : 10000, "i" : 0 }{ "_id" : ObjectId("4d01c620926adb17b800d1dd") } -->> { "_id" : ObjectId("4d01c669926adb17b80180bf") } on : shard4{ "t" : 9000, "i" : 0 }{ "_id" : ObjectId("4d01c669926adb17b80180bf") } -->> { "_id" : ObjectId("4d01c6b6926adb17b8022fa1") } on : shard2 { "t" : 12000, "i" : 0 }{ "_id" : ObjectId("4d01c6b6926adb17b8022fa1") } -->> { "_id" : ObjectId("4d01c6fd926adb17b802de83") } on : shard1 { "t" : 5000, "i" : 1 }{ "_id" : ObjectId("4d01c6fd926adb17b802de83") } -->> { "_id" : ObjectId("4d01c74c926adb17b8038d65") } on : shard4 { "t" : 11000, "i" : 0 }{ "_id" : ObjectId("4d01c74c926adb17b8038d65") } -->> { "_id" : ObjectId("4d01c795926adb17b8043c47") } on : shard4 { "t" : 13000, "i" : 0 }{ "_id" : ObjectId("4d01c795926adb17b8043c47") } -->> { "_id" : ObjectId("4d01c7e6926adb17b804eb29") } on : shard1 { "t" : 6000, "i" : 2 }{ "_id" : ObjectId("4d01c7e6926adb17b804eb29") } -->> { "_id" : ObjectId("4d01c82f926adb17b8059a0b") } on : shard1 { "t" : 6000, "i" : 4 }{ "_id" : ObjectId("4d01c82f926adb17b8059a0b") } -->> { "_id" : ObjectId("4d01c8d4926adb17b806f7cf") } on : shard1 { "t" : 12000, "i" : 1 }{ "_id" : ObjectId("4d01c8d4926adb17b806f7cf") } -->> { "_id" : ObjectId("4d01c963926adb17b8085593") } on : shard3 { "t" : 7000, "i" : 2 }{ "_id" : ObjectId("4d01c963926adb17b8085593") } -->> { "_id" : ObjectId("4d01ca1c926adb17b809b357") } on : shard3 { "t" : 7000, "i" : 4 }{ "_id" : ObjectId("4d01ca1c926adb17b809b357") } -->> { "_id" : ObjectId("4d01caf7926adb17b80b306a") } on : shard3{ "t" : 7000, "i" : 6 }{ "_id" : ObjectId("4d01caf7926adb17b80b306a") } -->> { "_id" : ObjectId("4d01cbc2926adb17b80d09fd") } on : shard3 { "t" : 13000, "i" : 2 }{ "_id" : ObjectId("4d01cbc2926adb17b80d09fd") } -->> { "_id" : ObjectId("4d01cc54926adb17b80e67c1") } on : shard3 { "t" : 14000, "i" : 1 }{ "_id" : ObjectId("4d01cc54926adb17b80e67c1") } -->> { "_id" : ObjectId("4d01cec7926adb125c00d1dc") } on : shard1 { "t" : 14000, "i" : 2 }{ "_id" : ObjectId("4d01cec7926adb125c00d1dc") } -->> { "_id" : ObjectId("4d01ced2926adb125c022fa0") } on : shard1 { "t" : 14000, "i" : 4 }{ "_id" : ObjectId("4d01ced2926adb125c022fa0") } -->> { "_id" : ObjectId("4d01cedf926adb125c038d64") } on : shard1 { "t" : 14000, "i" : 6 }{ "_id" : ObjectId("4d01cedf926adb125c038d64") } -->> { "_id" : ObjectId("4d01ceeb926adb125c04eb28") } on : shard1 { "t" : 14000, "i" : 8 }{ "_id" : ObjectId("4d01ceeb926adb125c04eb28") } -->> { "_id" : ObjectId("4d01cf1a926adb125c07a6ab") } on : shard1 { "t" : 14000, "i" : 10 }{ "_id" : ObjectId("4d01cf1a926adb125c07a6ab") } -->> { "_id" : ObjectId("4d01cf3c926adb125c0a622e") } on : shard1 { "t" : 14000, "i" : 12 }{ "_id" : ObjectId("4d01cf3c926adb125c0a622e") } -->> { "_id" : ObjectId("4d01cf52926adb125c0d1db1") } on : shard1 { "t" : 14000, "i" : 14 }{ "_id" : ObjectId("4d01cf52926adb125c0d1db1") } -->> { "_id" : ObjectId("4d01d58c926adb16480096f4") } on : shard1{ "t" : 14000, "i" : 16 }{ "_id" : ObjectId("4d01d58c926adb16480096f4") } -->> { "_id" : { $maxKey : 1 } } on : shard1 { "t" : 14000, "i" : 17 }另,这套配置插入1万条1KB数据的时间大约在1.4秒,如果使用最简单单进程配置的话速度稍快,在1.2秒,性能下降不是很厉害,可以接受。
linux下Mongodb集群搭建:分片+副本集

linux下Mongodb集群搭建:分⽚+副本集三台服务器 192.168.1.40/41/42安装包 mongodb-linux-x86_64-amazon2-4.0.1.tgz服务规划服务器40服务器41服务器42mongos mongos mongosconfig server config server config servershard server1 主节点 shard server1副节点 shard server1仲裁shard server2 仲裁 shard server2 主节点 shard server2 副节点shard server3副节点 shard server3仲裁 shard server3主节点端⼝分配:mongos:28000config:28001shard1:28011shard2:28012shard3:28013主要模块以及配置⽂件1、config server 配置服务器vi /usr/local/mongodb/conf/config.conf40服务器配置⽂件pidfilepath = /usr/local/mongodb/config/log/configsrv.piddbpath = /mydata/mongodb/config/datalogpath = /usr/local/mongodb/config/log/congigsrv.loglogappend = truebind_ip = 192.168.29.40port = 28001fork = true #以守护进程的⽅式运⾏MongoDB,创建服务器进程#declare this is a config db of a cluster;configsvr = true#副本集名称replSet=configs#设置最⼤连接数maxConns=2000041服务器配置⽂件pidfilepath = /usr/local/mongodb/config/log/configsrv.piddbpath = /mydata/mongodb/config/datalogpath = /usr/local/mongodb/config/log/congigsrv.loglogappend = truebind_ip = 192.168.29.41port = 28001fork = true #以守护进程的⽅式运⾏MongoDB,创建服务器进程#declare this is a config db of a cluster;configsvr = true#副本集名称replSet=configs#设置最⼤连接数maxConns=2000042服务器配置⽂件pidfilepath = /usr/local/mongodb/config/log/configsrv.piddbpath = /mydata/mongodb/config/datalogpath = /usr/local/mongodb/config/log/congigsrv.loglogappend = truebind_ip = 192.168.29.42port = 28001fork = true #以守护进程的⽅式运⾏MongoDB,创建服务器进程#declare this is a config db of a cluster;configsvr = true#副本集名称replSet=configs#设置最⼤连接数maxConns=20000启动三台服务器的config servermongod -f /usr/local/mongodb/conf/config.conf登录任意⼀台配置服务器,初始化配置副本集#连接mongo --port 21000#config变量config = {... _id : "configs",... members : [... {_id : 0, host : "192.168.1.40:28001" },... {_id : 1, host : "192.168.1.41:28001" },... {_id : 2, host : "192.168.1.42:28001" }... ]... }#初始化副本集rs.initiate(config)2 配置分⽚副本集(三台机器)配置⽂件vi /usr/local/mongodb/conf/shard1.conf#配置⽂件内容#——————————————–pidfilepath = /usr/local/mongodb/shard1/log/shard1.piddbpath = /mydata/mongodb/shard1/datalogpath = /usr/local/mongodb/shard1/log/shard1.log logappend = truebind_ip = 192.168.29.40port = 28011fork = true#打开web监控#httpinterface=true#rest=true#副本集名称replSet=shard1#declare this is a shard db of a cluster;shardsvr = true#设置最⼤连接数maxConns=20000#配置⽂件内容#——————————————–pidfilepath = /usr/local/mongodb/shard1/log/shard1.piddbpath = /mydata/mongodb/shard1/datalogpath = /usr/local/mongodb/shard1/log/shard1.log logappend = truebind_ip = 192.168.29.41port = 28011fork = true#打开web监控#httpinterface=true#rest=true#副本集名称replSet=shard1#declare this is a shard db of a cluster;shardsvr = true#设置最⼤连接数maxConns=20000#配置⽂件内容#——————————————–pidfilepath = /usr/local/mongodb/shard1/log/shard1.piddbpath = /mydata/mongodb/shard1/datalogpath = /usr/local/mongodb/shard1/log/shard1.log logappend = truebind_ip = 192.168.29.42port = 28011fork = true#打开web监控#httpinterface=true#rest=true#副本集名称replSet=shard1#declare this is a shard db of a cluster;shardsvr = true#设置最⼤连接数maxConns=20000vi /usr/local/mongodb/conf/shard2.confvi /usr/local/mongodb/conf/shard2.conf (shard2和shard3就是上⾯配置⽂件相应地⽅改为2和3就可以了)3、配置路由服务器 mongos先启动配置服务器和分⽚服务器,后启动路由实例:(三台机器)vi /usr/local/mongodb/conf/mongos.conf#内容pidfilepath = /usr/local/mongodb/mongos/log/mongos.pidlogpath = /usr/local/mongodb/mongos/log/mongos.loglogappend = truebind_ip = 0.0.0.0port = 28000fork = true#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字configdb = configs/192.168.1.40:28001,192.168.1.41:28001,192.168.1.42:28001#设置最⼤连接数maxConns=20000启动三台服务器的mongos servermongos -f /usr/local/mongodb/conf/mongos.conf4、启⽤分⽚⽬前搭建了mongodb配置服务器、路由服务器,各个分⽚服务器,不过应⽤程序连接到mongos路由服务器并不能使⽤分⽚机制,还需要在程序⾥设置分⽚配置,让分⽚⽣效。
mongodb 分片原理
mongodb 分片原理MongoDB 分片是一种用于处理大量数据的横向扩展方法,允许将数据分布到多个服务器上。
分片可以在MongoDB 中实现水平扩展,提高系统的容量和性能。
以下是MongoDB 分片的基本原理:1. 分片键(Shard Key):-在MongoDB 中,数据根据一个称为分片键(Shard Key)的字段进行分片。
分片键的选择非常关键,它应该能够确保数据均匀分布,避免热点(hotspot)问题。
-分片键通常是在文档中的一个字段,MongoDB 根据这个字段的值来决定将文档存储在哪个分片上。
2. 分片集合(Sharded Collection):-分片集合是一个普通的MongoDB 集合,但被配置为进行分片。
这样的集合存储在多个分片服务器上,每个分片负责存储数据的一部分。
3. Config 服务器:-MongoDB 使用Config 服务器来跟踪每个分片中数据的范围和位置。
Config 服务器存储了分片集合的元数据,包括分片键的范围和分片的位置信息。
4. Mongos 路由器:-Mongos 是一个路由器,它位于应用程序和MongoDB 分片集群之间。
应用程序通过Mongos 与整个集群交互,Mongos 负责将请求路由到适当的分片上。
5. 数据迁移:-当有新的分片加入集群或现有的分片移除时,MongoDB 会自动进行数据迁移。
数据迁移确保分片集合中的数据保持均匀分布。
6. 均衡器(Balancer):- MongoDB 集群中有一个均衡器,它会监视每个分片上的数据量,并在需要时触发数据迁移以保持均衡。
均衡器可以手动启动或自动运行。
MongoDB 分片的主要优势在于它允许数据库在数据量增加时水平扩展,通过添加更多的分片来处理更多的负载。
分片键的选择和分片集群的规划是关键的设计决策,因为它们直接影响了系统的性能和可扩展性。
MongoDB_使用手册-中文版
MongoDB_使用手册-中文版MongoDB 使用手册-中文版1:简介1.1 MongoDB 简介1.2 MongoDB 的优势1.3 安装 MongoDB1.4 启动和关闭 MongoDB2:数据库操作2.1 创建数据库2.2 切换数据库2.3 删除数据库2.4 数据库的备份和还原2.5 数据库的访问控制3:集合操作3.1 创建集合3.2 删除集合3.3 查找集合3.4 更新集合3.5 排序和限制集合结果4:文档操作4.1 插入文档4.2 查询文档4.3 更新文档4.4 删除文档4.5 索引和性能优化5:聚合操作5.1 聚合管道5.2 查询优化技巧5.3 数据分析和处理6:数据备份和恢复6.1 数据备份策略6.2 数据恢复方法7:复制和分片7.1 复制集7.2 分片集群8:安全性和权限控制8.1 认证和授权8.2 数据加密8.3 安全配置建议9: MongoDB 驱动程序9.1 Python 驱动程序 9.2 Java 驱动程序9.3 Node:js 驱动程序 9.4 :NET 驱动程序10:性能调优10:1 集合级别的优化 10:2 查询优化10:3 索引优化10:4 内存和磁盘配置11:故障排除11.1 常见问题11.2 日志分析11.3 性能监控12: MongoDB 与关系型数据库的比较12.1 数据模型比较12.2 查询语言比较12.3 事务和一致性比较本文档涉及附件:1:示例代码文件:[附件1](附件1:zip)2:配置文件示例:[附件2](附件2:txt)本文所涉及的法律名词及注释:1:认证和授权:指通过身份验证和权限控制来确保只有经过授权的用户才能访问和操作数据库的过程。
2:数据加密:指使用加密算法对数据库中的敏感数据进行加密保护的过程。
3:复制集:指一组 MongoDB 服务器的集合,其中包含主服务器(primary)和多个副本服务器(secondary),用于提供数据冗余和高可用性支持。
mongodb 高可用方案
mongodb 高可用方案MongoDB是一种开源的、非关系型的,基于分布式文件存储的数据库。
它具有高可扩展性和高性能的特点,因此在现代应用程序开发中被广泛使用。
然而,由于数据库的可靠性和可用性对于应用程序是至关重要的,因此采用一种高可用方案可以有效地保障数据的连续性和系统的稳定性。
在MongoDB提供的高可用方案中,最常用的是复制集。
复制集是一组能够自动维护相同数据集的MongoDB服务器。
其中一个节点是主节点(Primary),处理所有的写操作和读操作;其他节点是次节点(Secondary),只处理读操作。
当主节点发生故障或者不可用时,剩余的次节点会选举一个新的主节点来接替其职责。
使用复制集的高可用方案,可以提供以下的优势:1. 数据冗余和备份:复制集中的次节点都保存有主节点的完整数据副本,一旦主节点发生故障,剩余节点可以提供完全一样的数据服务,确保数据不会丢失。
2. 快速容错和自动故障转移:当主节点发生故障时,复制集可以自动选举一个新的主节点来接管原主节点的任务,不需要手动干预,降低了系统维护的复杂性。
3. 读操作的负载均衡:次节点可以提供读操作的负载均衡,分担主节点的压力,提高整体的读性能。
4. 系统可用性:由于复制集中有多个节点,即使其中的一个或者几个节点不可用,仍然可以提供服务。
同时,复制集还支持自动重平衡,可以动态增加或者减少节点,以满足应用程序的需求。
除了复制集,MongoDB还提供了分片集群(Sharding Cluster)作为高可用方案的扩展。
分片集群将数据分散存储在多个节点上,每个节点只存储整个数据集的一部分。
分片集群可以支持更大规模的数据存储和更高的写入负载。
总结起来,MongoDB的高可用方案主要是通过复制集和分片集群来实现的。
使用复制集可以提供数据冗余、自动故障转移和读负载均衡等功能,而分片集群则可以进一步扩展数据库的规模和性能。
根据应用程序的需求和预算,可以选择适合的高可用方案来保障数据的连续性和系统的稳定性。
MongoDB分片实例
分布式数据库
然后通过printShardingStatus命令查看mongodb的数据分片情况。
分布式数据库
MongoDB分片实例
• 5.查看结果
10
分布式数据库
11
总结
MongoDB分 片实例
1 MongoDB分片结构 2 MongoDB分片实例
分布式数据库
作业
12
任务
1.请按照步骤配置MongoDB 分片
分布式数据库
7
MongoDB分片实例
• 4.服务配置 • (1) client直接跟mongos联系,然后将4444,5555的mongod交给mongos,添加分片
的命令是addshard()。
分布式数据库
8
MongoDB分片实例
• 4.服务配置 • (2)片已经集群了,但是mongos不知道该如何切分数据,也就是先前所说的片键,
在mongodb中设置片键要做两步 • ①:开启数据库分片功能,命令很简单 enablesharding(),这里我就开启test数据库。 • ②:指定集合中分片的片键,这里我就指定为字段。
分布式数据库
9
MongoDB分片实例
• 5.查看结果 • 至此我们的分片操作全部结束,接下来我们通过mongos向mongodb插入10w记录,
分布式数据库
5
MongoDB分片实例
• 2.开启mongos服务器 • 这里要注意的是我们开启的是mongos,不是mongod,同时指定下config服务器,这
里我就开启D盘上的mongodb,端口3333。
分布式数据库
6
MongoDB分片实例
• 3.启动mongod服务器 • 对分片来说,也就是要添加分片了,这里开启E,G盘的mongodb,端口为:4444,5555。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由于业务迅速扩展,当前的分片已经不能满足要求,需要在mongodb线上在增加一个分片。 1、在master2上建立3个mongodb 先设立好ip和域名的映射关系: vim /etc/hosts 192.168.3.71 mongodb_shard3
先准备好3个mongodb进程,这里先做个模拟例子,所以在一台服务器上使用3个端口来模拟3个mongodb实例(生产环境一般都是3台linux服务器,一台linux服务器一个mongodb实例)。 # 建立mongodb进程数据目录 mkdir -p /data/mongodb/shard37017 mkdir -p /data/mongodb/shard37027 mkdir -p /data/mongodb/shard37037
# 建立mongodb日志目录 mkdir -p /data/mongodb/logs
# 开始启动3个mongodb实例,启动的时候,指定replset名称为shard3,启动方式如下: /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongod --shardsvr --replSet shard3 --port 37017 --dbpath /data/mongodb/shard37017 --oplogSize 2048 --logpath /data/mongodb/logs/shard_m2_37017.log --logappend --fork /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongod --shardsvr --replSet shard3 --port 37027 --dbpath /data/mongodb/shard37027 --oplogSize 2048 --logpath /data/mongodb/logs/shard_m2_37027.log --logappend --fork /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongod --shardsvr --replSet shard3 --port 37037 --dbpath /data/mongodb/shard37037 --oplogSize 2048 --logpath /data/mongodb/logs/shard_m2_37037.log --logappend --fork
mongodb启动完,进程如下所示: # 查看后台启动的mongodb进程 [mongodb@master2 ~]$ ps -eaf|grep mongo root 32652 752 0 17:38 pts/0 00:00:00 su - mongodb mongodb 32653 32652 0 17:38 pts/0 00:00:00 -bash mongodb 33495 1 0 17:39 ? 00:00:00 /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongod --shardsvr --replSet shard3 --port 37017 --dbpath /data/mongodb/shard37017 --oplogSize 2048 --logpath /data/mongodb/logs/shard_m2_37017.log --logappend --fork mongodb 33628 1 0 17:40 ? 00:00:01 /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongod --shardsvr --replSet shard3 --port 37027 --dbpath /data/mongodb/shard37027 --oplogSize 2048 --logpath /data/mongodb/logs/shard_m2_37027.log --logappend --fork mongodb 33780 1 0 17:40 ? 00:00:00 /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongod --shardsvr --replSet shard3 --port 37037 --dbpath /data/mongodb/shard37037 --oplogSize 2048 --logpath /data/mongodb/logs/shard_m2_37037.log --logappend --fork mongodb 33889 32653 0 17:41 pts/0 00:00:00 ps -eaf mongodb 33890 32653 0 17:41 pts/0 00:00:00 grep mongo [mongodb@master2 ~]$
2、初始化新的分片副本集 # 设置第3个分片 > config = { _id:"shard3", members:[ {_id:0,host:"mongodb_shard3:37017",priority:1}, {_id:1,host:"mongodb_shard3:37027",priority:2}, {_id:2,host:"mongodb_shard3:37037",arbiterOnly:true} ] };
# 初始化副本集 > rs.initiate(config);
# 执行过程如下: [mongodb@master2 ~]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodb_shard3:37017/admin MongoDB shell version: 3.0.3 connecting to: mongodb_shard3:37017/admin Server has startup warnings: 2016-07-08T17:39:51.888+0800 I CONTROL [initandlisten] 2016-07-08T17:39:51.888+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2016-07-08T17:39:51.888+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-08T17:39:51.888+0800 I CONTROL [initandlisten] 2016-07-08T17:39:51.888+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2016-07-08T17:39:51.888+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-08T17:39:51.888+0800 I CONTROL [initandlisten] > > config = { _id:"shard3", members:[ ... {_id:0,host:"mongodb_shard3:37017",priority:1}, ... {_id:1,host:"mongodb_shard3:37027",priority:2}, ... {_id:2,host:"mongodb_shard3:37037",arbiterOnly:true} ... ] ... }; { "_id" : "shard3", "members" : [ { "_id" : 0, "host" : "mongodb_shard3:37017", "priority" : 1 }, { "_id" : 1, "host" : "mongodb_shard3:37027", "priority" : 2 }, { "_id" : 2, "host" : "mongodb_shard3:37037", "arbiterOnly" : true } ] } > rs.initiate(config); { "ok" : 1 } shard3:OTHER>
3、在线添加新的分片shard3 在线添加命令:db.runCommand( { addshard : "shard3/mongodb_shard3:37017,mongodb_shard3:37027,mongodb_shard3:37037"}); 执行过程如下: [mongodb@master2 ~]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodbs1:30000/admin MongoDB shell version: 3.0.3 connecting to: mongodbs1:30000/admin mongos> db.runCommand( { addshard : "shard3/mongodb_shard3:37017,mongodb_shard3:37027,mongodb_shard3:37037"}); { "shardAdded" : "shard3", "ok" : 1 } mongos>
问题记录: mongos> db.runCommand( { addshard : "shard3/mongodb_shard3:37017,mongodb_shard3:37027,mongodb_shard3:37037"}); { "ok" : 0, "errmsg" : "couldn't connect to new shard socket exception [CONNECT_ERROR] for shard3/mongodb_shard3:37017,mongodb_shard3:37027,mongodb_shard3:37037" } mongos> mongos> rs.initiate(config); { "ok" : 0, "errmsg" : "no such cmd: replSetInitiate" } mongos>