1. 设计思想:分片集群(sharding cluster),每个分片就是一个集群,每个集群就是一个分片。
Shard Server: mongod 实例,用于存储实际的数据块,一个shard server角色可由三台机器组成一个replica set承担,保障数据完整性。
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
2. 分片架构图:
3. 分片集群架构示例图
4. 分片集群扩展示例图
5. 主机配置表
1. 分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica set1,作为cluster的shard1;
2. 分别在3台机器运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组织replica set2,作为cluster的shard2;
3. 分别在3台机器运行一个mongod实例(称为mongod shard31,mongod shard32,mongod shard33)组织replica set3,作为cluster的shard3;
4. 每台机器运行一个mongod实例,作为3个config server;
5. 每台机器运行一个mongs进程,用于客户端连接。
6. 主机操作步骤
6.1 安装软件
6.1.1 分别在三台主机安装mongodb
a. 安装mongodb
cd /usr/local/mongo
tar zxvf mongodb-linux-x86_64-2.0.2.tar
b. 创建数据分片目录
server1:
mkdir -p /data/data/mongodb/shard11
mkdir -p /data/data/mongodb/shard21
mkdir -p /data/data/mongodb/shard31
mkdir -p /data/log
mkdir -p /data/data/mongodb/config
server2:
mkdir -p /data/data/mongodb/shard12
mkdir -p /data/data/mongodb/shard22
mkdir -p /data/data/mongodb/shard32
mkdir -p /data/log
mkdir -p /data/data/mongodb/config
server3:
mkdir -p /data/data/mongodb/shard13
mkdir -p /data/data/mongodb/shard23
mkdir -p /data/data/mongodb/shard33
mkdir -p /data/log
mkdir -p /data/data/mongodb/config
6.2 配置replica set
6.2.1 配置shard1的replica set
server1:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard1 --port 29017 --dbpath=/data/data/mongodb/shard11 --logpath=/data/log/shard11.log --logappend --fork
server2:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard1 --port 29017 --dbpath=/data/data/mongodb/shard12 --logpath=/data/log/shard12.log --logappend --fork
server3:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard1 --port 29017 --dbpath=/data/data/mongodb/shard13 --logpath=/data/log/shard13.log --logappend --fork
6.2.2 初始化shard1的replica set
连接任意一个mongo实例,如server1
cd /usr/local/mongo/bin
./mongo --port 29017
config={_id : 'shard1',members : [{_id : 0, host : '172.16.8.131:29017'},{_id : 1, host : '172.16.8.132:29017'},{_id : 2, host : '172.16.8.133:29017'}]}
rs.initiate(config)
rs.status()
6.2.3 配置shard2的replica set
server1:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard2 --port 29018 --dbpath=/data/data/mongodb/shard21 --logpath=/data/log/shard21.log --logappend --fork
server2:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard2 --port 29018 --dbpath=/data/data/mongodb/shard22 --logpath=/data/log/shard22.log --logappend --fork
server3:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard2 --port 29018 --dbpath=/data/data/mongodb/shard23 --logpath=/data/log/shard23.log --logappend --fork
6.2.4 初始化shard2的replica set
连接任意一个mongo实例,如server1
cd /usr/local/mongo/bin
./mongo --port 29018
config={_id : 'shard2',members : [{_id : 0, host : '172.16.8.131:29018'},{_id : 1, host : '172.16.8.132:29018'},{_id : 2, host : '172.16.8.133:29018'}]}
rs.initiate(config)
rs.status()
6.2.5 配置shard3的replica set
server1:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard3 --port 29019 --dbpath=/data/data/mongodb/shard31 --logpath=/data/log/shard31.log --logappend --fork
server2:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard3 --port 29019 --dbpath=/data/data/mongodb/shard32 --logpath=/data/log/shard32.log --logappend --fork
server3:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard3 --port 29019 --dbpath=/data/data/mongodb/shard33 --logpath=/data/log/shard33.log --logappend --fork
6.2.6 初始化shard3的replica set
连接任意一个mongo实例,如server1
cd /usr/local/mongo/bin
./mongo --port 29019
config={_id : 'shard3',members : [{_id : 0, host : '172.16.8.131:29019'},{_id : 1, host : '172.16.8.132:29019'},{_id : 2, host : '172.16.8.133:29019'}]}
rs.initiate(config)
rs.status()
6.3 配置config server
server1:
/usr/local/mongo/bin/mongod --configsvr --dbpath=/data/data/mongodb/config --port 20000 --logpath=/data/log/config.log --logappend --fork
server2:
/usr/local/mongo/bin/mongod --configsvr --dbpath=/data/data/mongodb/config --port 20000 --logpath=/data/log/config.log --logappend --fork
server3:
/usr/local/mongo/bin/mongod --configsvr --dbpath=/data/data/mongodb/config --port 20000 --logpath=/data/log/config.log --logappend --fork
6.4 配置mongos server
server1:
/usr/local/mongo/bin/mongos --configdb 172.16.8.131:20000,172.16.8.132:20000,172.16.8.133:20000 -port 30000 -chunkSize 5 --logpath=/data/log/mongos.log --logappend --fork
server2:
/usr/local/mongo/bin/mongos --configdb 172.16.8.131:20000,172.16.8.132:20000,172.16.8.133:20000 -port 30000 -chunkSize 5 --logpath=/data/log/mongos.log --logappend --fork
server3:
/usr/local/mongo/bin/mongos --configdb 172.16.8.131:20000,172.16.8.132:20000,172.16.8.133:20000 -port 30000 -chunkSize 5 --logpath=/data/log/mongos.log --logappend --fork
6.5 配置分片集群
6.5.1 连接任意一个mongos实例,如server1,并切换到admin
cd /usr/local/mongo/bin
./mongo 172.16.8.131:30000/admin
db
admin
6.5.2 加入shards
db.runCommand({ addshard : "shard1/172.16.8.131:29017,172.16.8.132:29017,172.16.8.133:29017", name:"shard1", maxsize:20480});
db.runCommand({ addshard : "shard2/172.16.8.131:29018,172.16.8.132:29018,172.16.8.133:29018", name:"shard2", maxsize:20480});
db.runCommand({ addshard : "shard3/172.16.8.131:29019,172.16.8.132:29019,172.16.8.133:29019", name:"shard3", maxsize:20480});
6.5.3 Listing shards
db.runCommand({listshards : 1})
如果列出了以上三个你加的shards,表示shards已经配置成功
6.5.4激活数据库分片
db.runCommand({enablesharding : "201"});
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard;
一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上;
但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作。
6.5.6 配置collection分片
db.runCommand({"shardcollection":"201.customer_user_mst", key:{"name":1}})
a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
2. 分别在3台机器运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组织replica set2,作为cluster的shard2;
3. 分别在3台机器运行一个mongod实例(称为mongod shard31,mongod shard32,mongod shard33)组织replica set3,作为cluster的shard3;
4. 每台机器运行一个mongod实例,作为3个config server;
5. 每台机器运行一个mongs进程,用于客户端连接。
6. 主机操作步骤
6.1 安装软件
6.1.1 分别在三台主机安装mongodb
a. 安装mongodb
cd /usr/local/mongo
tar zxvf mongodb-linux-x86_64-2.0.2.tar
b. 创建数据分片目录
server1:
mkdir -p /data/data/mongodb/shard11
mkdir -p /data/data/mongodb/shard21
mkdir -p /data/data/mongodb/shard31
mkdir -p /data/log
mkdir -p /data/data/mongodb/config
server2:
mkdir -p /data/data/mongodb/shard12
mkdir -p /data/data/mongodb/shard22
mkdir -p /data/data/mongodb/shard32
mkdir -p /data/log
mkdir -p /data/data/mongodb/config
server3:
mkdir -p /data/data/mongodb/shard13
mkdir -p /data/data/mongodb/shard23
mkdir -p /data/data/mongodb/shard33
mkdir -p /data/log
mkdir -p /data/data/mongodb/config
6.2 配置replica set
6.2.1 配置shard1的replica set
server1:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard1 --port 29017 --dbpath=/data/data/mongodb/shard11 --logpath=/data/log/shard11.log --logappend --fork
server2:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard1 --port 29017 --dbpath=/data/data/mongodb/shard12 --logpath=/data/log/shard12.log --logappend --fork
server3:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard1 --port 29017 --dbpath=/data/data/mongodb/shard13 --logpath=/data/log/shard13.log --logappend --fork
6.2.2 初始化shard1的replica set
连接任意一个mongo实例,如server1
cd /usr/local/mongo/bin
./mongo --port 29017
config={_id : 'shard1',members : [{_id : 0, host : '172.16.8.131:29017'},{_id : 1, host : '172.16.8.132:29017'},{_id : 2, host : '172.16.8.133:29017'}]}
rs.initiate(config)
rs.status()
6.2.3 配置shard2的replica set
server1:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard2 --port 29018 --dbpath=/data/data/mongodb/shard21 --logpath=/data/log/shard21.log --logappend --fork
server2:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard2 --port 29018 --dbpath=/data/data/mongodb/shard22 --logpath=/data/log/shard22.log --logappend --fork
server3:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard2 --port 29018 --dbpath=/data/data/mongodb/shard23 --logpath=/data/log/shard23.log --logappend --fork
6.2.4 初始化shard2的replica set
连接任意一个mongo实例,如server1
cd /usr/local/mongo/bin
./mongo --port 29018
config={_id : 'shard2',members : [{_id : 0, host : '172.16.8.131:29018'},{_id : 1, host : '172.16.8.132:29018'},{_id : 2, host : '172.16.8.133:29018'}]}
rs.initiate(config)
rs.status()
6.2.5 配置shard3的replica set
server1:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard3 --port 29019 --dbpath=/data/data/mongodb/shard31 --logpath=/data/log/shard31.log --logappend --fork
server2:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard3 --port 29019 --dbpath=/data/data/mongodb/shard32 --logpath=/data/log/shard32.log --logappend --fork
server3:
cd /usr/local/mongo/bin
/usr/local/mongo/bin/mongod --shardsvr --replSet shard3 --port 29019 --dbpath=/data/data/mongodb/shard33 --logpath=/data/log/shard33.log --logappend --fork
6.2.6 初始化shard3的replica set
连接任意一个mongo实例,如server1
cd /usr/local/mongo/bin
./mongo --port 29019
config={_id : 'shard3',members : [{_id : 0, host : '172.16.8.131:29019'},{_id : 1, host : '172.16.8.132:29019'},{_id : 2, host : '172.16.8.133:29019'}]}
rs.initiate(config)
rs.status()
6.3 配置config server
server1:
/usr/local/mongo/bin/mongod --configsvr --dbpath=/data/data/mongodb/config --port 20000 --logpath=/data/log/config.log --logappend --fork
server2:
/usr/local/mongo/bin/mongod --configsvr --dbpath=/data/data/mongodb/config --port 20000 --logpath=/data/log/config.log --logappend --fork
server3:
/usr/local/mongo/bin/mongod --configsvr --dbpath=/data/data/mongodb/config --port 20000 --logpath=/data/log/config.log --logappend --fork
6.4 配置mongos server
server1:
/usr/local/mongo/bin/mongos --configdb 172.16.8.131:20000,172.16.8.132:20000,172.16.8.133:20000 -port 30000 -chunkSize 5 --logpath=/data/log/mongos.log --logappend --fork
server2:
/usr/local/mongo/bin/mongos --configdb 172.16.8.131:20000,172.16.8.132:20000,172.16.8.133:20000 -port 30000 -chunkSize 5 --logpath=/data/log/mongos.log --logappend --fork
server3:
/usr/local/mongo/bin/mongos --configdb 172.16.8.131:20000,172.16.8.132:20000,172.16.8.133:20000 -port 30000 -chunkSize 5 --logpath=/data/log/mongos.log --logappend --fork
6.5 配置分片集群
6.5.1 连接任意一个mongos实例,如server1,并切换到admin
cd /usr/local/mongo/bin
./mongo 172.16.8.131:30000/admin
db
admin
6.5.2 加入shards
db.runCommand({ addshard : "shard1/172.16.8.131:29017,172.16.8.132:29017,172.16.8.133:29017", name:"shard1", maxsize:20480});
db.runCommand({ addshard : "shard2/172.16.8.131:29018,172.16.8.132:29018,172.16.8.133:29018", name:"shard2", maxsize:20480});
db.runCommand({ addshard : "shard3/172.16.8.131:29019,172.16.8.132:29019,172.16.8.133:29019", name:"shard3", maxsize:20480});
6.5.3 Listing shards
db.runCommand({listshards : 1})
如果列出了以上三个你加的shards,表示shards已经配置成功
6.5.4激活数据库分片
db.runCommand({enablesharding : "201"});
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard;
一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上;
但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作。
6.5.6 配置collection分片
db.runCommand({"shardcollection":"201.customer_user_mst", key:{"name":1}})
a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许