一 基础信息
--1.1 分片环境核心组件
shard 节点: 分片节点,存储数据,可以是单个进程,也可以是 replica set;
config 节点: 配置节点,仅存储集群的元数据,在生产环境上一般配置 3个 config 节点;
monos 进程: 路由进程,本身不存储数据,负责将应用发出的SQL分发到各个 shard 节点,
monos 进程消耗资源较少,可以部署在应用服务端,也可以部署在数据库端。
--1.2 环境信息
主机名: redhatB.example.com
OS: Red Hat Enterprise Linux Server release 6.2 (Santiago)
mongo: db version v2.2.1 ( 软件安装略)
--1.3 各节点端口信息
shard1 5281
shard2 5282
Config Server 7281
mongos 7282
二:搭建步骤
--2.1 增加OS用户
[root@redhatB ~]# groupadd shard [root@redhatB ~]# useradd -g shard shard [root@redhatB ~]# passwd shard [root@redhatB ]# mkdir -p /shard [root@redhatB ]# chown -R shard:shard /shard
--2.2 配置 shard1 节点
--2.2.1 创建目录和配置文件
mkdir -p /shard/shard1 touch /shard/shard1/shard1_5281.conf #(包含以下内容) fork = true port = 5281 dbpath = /shard/shard1 logpath = /shard/shard1/shard1.log logappend = true journal = true
--2.2.2 启动 shard1
mongod -f /shard/shard1/shard1_5281.conf
--2.3 配置 shard2 节点
--2.3.1 创建目录和配置文件
mkdir -p /shard/shard2 touch /shard/shard2/shard2_5282.conf #(包含以下内容) fork = true port = 5282 dbpath = /shard/shard2 logpath = /shard/shard2/shard2.log logappend = true journal = true
--2.3.2 启动 shard2
mongod -f /shard/shard2/shard2_5282.conf
--2.4 配置 Config Server
--2.4.1 创建目录和配置文件
mkdir -p /shard/conf touch /shard/conf/conf_7281.conf #(包含以下内容) configsvr = true fork = true port = 7281 dbpath = /shard/conf logpath = /shard/conf/conf.log logappend = true
--2.4.2 启动 Config Server
mongod -f /shard/conf/conf_7281.conf
--2.5 启动 mongos 进程
mongos --configdb redhatB.example.com:7281 --fork --logpath /shard/mongos.log --chunkSize 1 --port 7282
备注:--chunkSize 选项设置 chunk 的大小,默认64M,这里将它设置为 1M,在接下来的实验
更容易看到分片效果。
--2.6 增加分片结点到集群
[shard@redhatB shard]$ mongo 127.0.0.1:7282 MongoDB shell version: 2.2.1 connecting to: 127.0.0.1:7282/test mongos> show dbs; config 0.046875GB mongos> sh.addShard( "redhatB.example.com:5281" ); { "shardAdded" : "shard0000", "ok" : 1 } mongos> sh.addShard( "redhatB.example.com:5282" ); { "shardAdded" : "shard0001", "ok" : 1 }
--2.7 查看集群状态
mongos> sh.status(); --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "shard0000", "host" : "redhatB.example.com:5281" } { "_id" : "shard0001", "host" : "redhatB.example.com:5282" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" }
备注:到了这里,单节点的 Sharded Cluster 搭建完成了,接下来验证下。
三 测试
--3.1 开启指定数据库 Sharding 功能
[shard@redhatB shard]$ mongo 127.0.0.1:7282 MongoDB shell version: 2.2.1 connecting to: 127.0.0.1:7282/test mongos> sh.enableSharding("francs"); { "ok" : 1 }
--3.2 开启指定集合分片
mongos> sh.shardCollection("francs.test_1", { "id": 1} ); { "collectionsharded" : "francs.test_1", "ok" : 1 }
--3.3 查看已分片集合的索引信息
mongos> db.test_1.getIndexes(); [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "francs.test_1", "name" : "_id_" }, { "v" : 1, "key" : { "id" : 1 }, "ns" : "francs.test_1", "name" : "id_1" } ]
备注:在集合上通过命令 shardCollection 开启分片后, 在分片的字段上默认创建了索引。
--3.4 测试:插入数据
mongos> for( var i=1; i<50001; i++) db.test_1.save({id:i,name:'abc'})
--3.5 看集合 test_1 状态
mongos> db.test_1.stats(); { "sharded" : true, "ns" : "francs.test_1", "count" : 50000, "numExtents" : 10, "size" : 2400128, "storageSize" : 5849088, "totalIndexSize" : 3049648, "indexSizes" : { "_id_" : 1635200, "id_1" : 1414448 }, "avgObjSize" : 48.00256, "nindexes" : 2, "nchunks" : 3, "shards" : { "shard0000" : { "ns" : "francs.test_1", "count" : 11827, "size" : 567760, "avgObjSize" : 48.005411346918066, "storageSize" : 3055616, "numExtents" : 5, "nindexes" : 2, "lastExtentSize" : 2359296, "paddingFactor" : 1, "systemFlags" : 1, "userFlags" : 0, "totalIndexSize" : 735840, "indexSizes" : { "_id_" : 392448, "id_1" : 343392 }, "ok" : 1 }, "shard0001" : { "ns" : "francs.test_1", "count" : 38173, "size" : 1832368, "avgObjSize" : 48.0016765776858, "storageSize" : 2793472, "numExtents" : 5, "nindexes" : 2, "lastExtentSize" : 2097152, "paddingFactor" : 1, "systemFlags" : 1, "userFlags" : 0, "totalIndexSize" : 2313808, "indexSizes" : { "_id_" : 1242752, "id_1" : 1071056 }, "ok" : 1 } }, "ok" : 1 }
备注:"shard0000" 存储 11827条,"shard0001" 存储 38173 条,集合已分片。