MongoDB整理笔记のReplica Sets + Sharding

MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠、高可用还有些距离,所以有了"Replica Sets + Sharding"的解决方案。

shard:

使用Replica Sets,确保每个数据节点都具有备份,自动容错转移,自动回复能力。

config:

使用3个配置服务器,确保元数据的完整性。

route:

使用3个路由进程,实现负载均衡,提高客户端接入性能。

配置Replica Sets + Sharding 架构图:

配置Replica Sets + Sharding

  (1)配置shard1所用到的Replica Sets

在server A上

[[email protected] bin]# /Apps/mongo/bin/mongod --shardsvr --replSet shard1 --port 27017
--dbpath /data/shard1_1 --logpath /data/shard1_1/shard1_1.log --logappend --fork
[[email protected] bin]# all output going to: /data/shard1_1/shard1_1.log
forked process: 18923

在server B上

[[email protected] bin]# /Apps/mongo/bin/mongod --shardsvr --replSet shard1 --port 27017
--dbpath /data/shard1_2 --logpath /data/shard1_2/shard1_2.log --logappend --fork
forked process: 18859
[[email protected] bin]# all output going to: /data/shard1_2/shard1_2.log
[[email protected] bin]#

在Server C 上

[[email protected] bin]# /Apps/mongo/bin/mongod --shardsvr --replSet shard1 --port 27017
--dbpath /data/shard1_3 --logpath /data/shard1_3/shard1_3.log --logappend --fork
all output going to: /data/shard1_3/shard1_3.log
forked process: 18768
[[email protected] bin]#

用mongo 连接其中一台机器的27017 端口的mongod,初始化Replica Sets“shard1”,执行:

[[email protected] bin]# ./mongo --port 27017
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27017/test
> config = {_id: ‘shard1‘, members: [
... {_id: 0, host: ‘192.168.3.231:27017‘},
... {_id: 1, host: ‘192.168.3.232:27017‘},
... {_id: 2, host: ‘192.168.3.233:27017‘}]
... }
……
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}

(2)配置shard2所用到的Replica Sets

在server A上

[[email protected] bin]# /Apps/mongo/bin/mongod --shardsvr --replSet shard2 --port 27018
--dbpath /data/shard2_1 --logpath /data/shard2_1/shard2_1.log --logappend --fork
all output going to: /data/shard2_1/shard2_1.log
[[email protected] bin]# forked process: 18993
[[email protected] bin]#

在server B上

[[email protected] bin]# /Apps/mongo/bin/mongod --shardsvr --replSet shard2 --port 27018
--dbpath /data/shard2_2 --logpath /data/shard2_2/shard2_2.log --logappend --fork
all output going to: /data/shard2_2/shard2_2.log
forked process: 18923
[[email protected] bin]#

在Server C上

[[email protected] bin]# /Apps/mongo/bin/mongod --shardsvr --replSet shard2 --port 27018
--dbpath /data/shard2_3 --logpath /data/shard2_3/shard2_3.log --logappend --fork
[[email protected] bin]# all output going to: /data/shard2_3/shard2_3.log
forked process: 18824
[[email protected] bin]#

用mongo 连接其中一台机器的27018 端口的mongod,初始化Replica Sets “shard2”,执行:

[[email protected] bin]# ./mongo --port 27018
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27018/test
> config = {_id: ‘shard2‘, members: [
... {_id: 0, host: ‘192.168.3.231:27018‘},
... {_id: 1, host: ‘192.168.3.232:27018‘},
... {_id: 2, host: ‘192.168.3.233:27018‘}]
... }
……
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1

db.runCommand({ enablesharding:"test" })
db.runCommand({ shardcollection: "test.users", key: { _id:1 }})

}

  (3)配置3 台Config Server
    在Server A、B、C上执行:

/Apps/mongo/bin/mongod --configsvr --dbpath /data/config --port 20000 --logpath
/data/config/config.log --logappend --fork

(4)配置3台Route Process
    在Server A、B、C上执行:

/Apps/mongo/bin/mongos --configdb
192.168.3.231:20000,192.168.3.232:20000,192.168.3.233:20000 --port 30000 --chunkSize 1
--logpath /data/mongos.log --logappend --fork

(5)配置Shard Cluster
    连接到其中一台机器的端口30000 的mongos 进程,并切换到admin 数据库做以下配置

[[email protected] bin]# ./mongo --port 30000
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:30000/test
> use admin
switched to db admin
>db.runCommand({addshard:"shard1/192.168.3.231:27017,192.168.3.232:27017,192.168.3.233:
27017"});
{ "shardAdded" : "shard1", "ok" : 1 }
>db.runCommand({addshard:"shard2/192.168.3.231:27018,192.168.3.232:27018,192.168.3.233:
27018"});
{ "shardAdded" : "shard2", "ok" : 1 }
>

激活数据库及集合的分片

db.runCommand({ enablesharding:"test" })
db.runCommand({ shardcollection: "test.users", key: { _id:1 }})

(6)验证Sharding正常工作
    连接到其中一台机器的端口30000 的mongos 进程,并切换到test 数据库,以便添加测试数据

use test
for(var i=1;i<=200000;i++) db.users.insert({id:i,addr_1:"Beijing",addr_2:"Shanghai"});
db.users.stats()
{
"sharded" : true,
"ns" : "test.users",
"count" : 200000,
"size" : 25600384,
"avgObjSize" : 128,
"storageSize" : 44509696,
"nindexes" : 2,
"nchunks" : 15,
"shards" : {
"shard0000" : {
……
},
"shard0001" : {
……
}
},
"ok" : 1
}

可以看到Sharding搭建成功了,跟我们期望的结果一致,至此我们就将Replica Sets与Sharding结合的架构也学习完毕了!

时间: 2024-12-20 11:25:25

MongoDB整理笔记のReplica Sets + Sharding的相关文章

MongoDB整理笔记のReplica Sets

MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台机器是用于写操作,正因为如此,MongoDB提供了数据一致性的保障.而担当primary角色的机器,可以把读的操作分发给slave. MongoDB高可用分两种:   Master-Slave 主从复制 只需要在某一个服务启动时加上–master 参数,而另一个服务加上–slave 与–source 参数,即可实现同步.MongoDB 的最新版本已不再推荐此方案. Replica Sets 复制集 Mono

MongoDB整理笔记のReplica oplog

主从操作日志oplog MongoDB的Replica Set架构是通过一个日志来存储写操作的,这个日志就叫做"oplog".oplog.rs是一个固定长度的capped collection,它存在于"local"数据库中,用于记录Replica Sets操作日志.在默认情况下,对于64位的MongoDB,oplog是比较大的,可以达到5%的磁盘空间.oplog的大小是可以通过mongod的参数“--oplogSize”来设置. rs1:PRIMARY> u

Mongodb Replica Sets+Sharding群集 部署手册

1.       群集简介 Mongodb是一个非关系型的分布式数据库,它可以通过自身的群集技术组成mongodb群集,进而实现数据库的横向扩展和数据库的高可用功能.Mongodb数据库群集分为Replica Sets(复制集)和Sharding(分片)两个部分.其中Replica Sets实现了mongodb数据库的高可用功能,Sharding分片实现了数据库的横向分布式扩展.在生产环境中搭建mongodb群集时一般都采取了Replica Sets+Sharding的解决方案. Replica

mongodb复制集(Replica sets)+分片(Sharding)环境搭建

1.创建数据目录--server a:# mkdir -p /data/shard1_1# mkdir -p /data/shard2_1# mkdir -p /data/config --server b:# mkdir -p /data/shard1_2# mkdir -p /data/shard2_2# mkdir -p /data/config --server c:# mkdir -p /data/shard1_3# mkdir -p /data/shard2_3# mkdir -p

MongoDB整理笔记の增加节点

MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境已不能满足需求,那么就需要增加一些节点将压力平均分配一下.   两种方式:一是通过oplog增加节点,二是通过数据库快照和oplog来增加节点 通过oplog增加节点   1.配置并启动新节点,启用28013这个端口给新的节点 [email protected] ~]# mkdir -p /data

MongoDB整理笔记の管理Replica Sets

一.读写分离 从库能进行查询,这样可以分担主库的大量的查询请求.   1.先向主库中插入一条测试数据 [[email protected] bin]# ./mongo --port 28010 MongoDB shell version: 1.8.1 connecting to: 127.0.0.1:28010/test rs1:PRIMARY> db.c1.insert({age:30}) db.c2rs1:PRIMARY> db.c1.find() { "_id" :

MongoDB整理笔记のSharding分片

这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chunk.每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB,超出则生成新的数据块.要构建一个 MongoDB Sharding Cluster,需要三种角色:    Shard Server    即存储实际数据的分片,每个Shard 可以是一个mongod

MongoDB整理笔记の管理Sharding

1.列出所有的Shard Server > db.runCommand({ listshards: 1 }) --列出所有的Shard Server { "shards" : [ { "_id" : "shard0000", "host" : "localhost:20000" }, { "_id" : "shard0001", "host"

MongoDB整理笔记のMapReduce

MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中的所有记录,将key和value传递给Reduce函数进行处理.Map函数和Reduce函数可以使用JS来实现,可以通过db.runCommand或mapReduce命令来执行一个MapReduce操作. 示例she