基础概念理解
mongodb是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB集群。
MongoDB的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB(默认64MB),超出则生成新的数据块。Shard Server
Shard Server是实际存储数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Set。为了实现每个Shard内部的auto-failover,MongoDB官方建议每个Shard为一组Replica Set。关于如何安装及搭建replica set请参考我的另一篇文章 http://gong1208.iteye.com/blog/1558355
Config Server
为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,例如{age: 1} ,shard key可以决定该条记录属于哪个chunk。Config Servers就是用来存储:所有shard节点的配置信息、每个chunk的shard key范围、chunk在各shard的分布情况、该集群中所有DB和collection的sharding配置信息。
Route Process
这是一个前端路由,客户端由此接入,然后询问Config Servers需要到哪个Shard上查询或保存记录,再连接相应的Shard进行操作,最后将结果返回给客户端。客户端只需要将原本发给mongod的查询或更新请求原封不动地发给Routing Process,而不必关心所操作的记录存储在哪个Shard上。Mongod分布式分片集群(sharding cluster)配置
(一) 添加用户
#查看用户列表
cat /etc/passwd|grep -v nologin|grep -vhalt|grep -v shutdown|awk -F":" '{ print$1"|"$3"|"$4 }'|more
#若不存在mongodb用户,则添加用户groupadd mongodb
useradd -g mongodb mongodb
passwd mongodb
输入新密码
(二)安装monodb软件
cd /usr
mkdir mongodb
chown -R mongodb:mongodb mongodb 这里需要把安装文件的权限赋给mongodb
su mongodb 进入mongodb用户
cd mongodb
tar -zxvf mongodb-linux-x86_64-rhel62-3.0.7.tgz 解压文件
mv mongodb-linux-x86_64-rhel62-3.0.7 mongodb_3.0.7 重命名
(三)创建monodb分布式分片集群所需的数据目录
| 端口 | 192.168.167.170(Server1) | 192.168.167.171Server1) | 192.168.167.172Server1) |
安装文件 |
| mongodb_3.0.7 mongodb-linux-x86_64-rhel62-3.0.7.tgz | mongodb_3.0.7 | mongodb_3.0.7 |
config server | 20000 | config/config.log config/data | 左同 | 左同 |
mongos server | 21000 | mongos/mongos.log | 左同 | 左同 |
Shard server 1 | 27017 | Shard11 Shard11.log | Shard12 Shard12.log | Shard13 shard13.log |
Shard server 2 | 27018 | Shard21 Shard21.log | Shard22 Shard22.log | Shard23 Shard23.log |
Shard server 3 | 27019 | Shard31 Shard31.log | Shard32 Shard32.log | Shard33 Shard33.log |
(一)配置config server
#三台机器分别 启动【config server】
/diskd/mongodb/mongodb_3.0.7/bin/mongod--configsvr --dbpath /diskd/mongodb/config/data --port 21000 --logpath /diskd/mongodb/config/config.log--logappend --fork
(二)配置mongos
#三台机器分别 启动【mongos server】
/diskd/mongodb/mongodb_3.0.7/bin/mongos--configdb 192.168.167.170:21000,192.168.167.171:21000,192.168.167.172:21000--port 20000 --logpath /diskd/mongodb/mongos/mongos.log --logappend --fork
注:路由服务器不需要数据目录,但是一定要指明配置服务器的位置。
(三)配置副本集(replica sets)
#在每个机器里分别设置分片1服务器及副本集shard1
【分片1】
#配置分片1(shard1)用到的replicasets,即将三台机器的端口27017对应的mongodb实例,设置成分片(shard server1)的副本集(replica sets)。
Server1:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard1--port 27017 --dbpath /diskd/mongodb/shard11 --oplogSize 2048 --logpath /diskd/mongodb/shard11.log--logappend --fork
详解:
--replSet指定了复制集名字,通过该选项可以将不同的实例放在同一个复制集中。上面添加了两个实例,当然可以添加多个实例。启动复制集但还不可用,需要进行初始化。
Server2:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard1--port 27017--dbpath /diskd/mongodb/shard12 --oplogSize 2048 --logpath /diskd/mongodb/shard12.log --logappend --fork
Server3:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard1--port 27017--dbpath /diskd/mongodb/shard13 --oplogSize 2048 --logpath /diskd/mongodb/shard13.log --logappend --fork
#初始化副本集
/diskd/mongodb/mongodb_3.0.7/bin/mongo--port 27017 //非集群方式登录
(1) 定义副本集配置变量
> config = {_id: 'shard1', members: [
{_id: 0, host:'192.168.167.170:27017'},
{_id: 1, host:'192.168.167.171:27017'},
{_id: 2, host:'192.168.167.172:27017'}]
}
(2) 初始化副本集配置
> rs.initiate(config);
{ "ok" : 1 }
shard1:OTHER> 出现这,则正确
shard1:PRIMARY> quit()
(3) 日志中查看主节点、从节点;
或者三台机器分别登录mongod实例
./mongo –port 27017 查看该机器启动的mongod实例是主节点,还是从节点
(4) #查看集群节点的状态
db.status();
【分片2】配置分片2(shard2)用到的replica sets
Server1:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard2 --port 27018--dbpath /diskd/mongodb/shard21 --oplogSize 2048 --logpath /diskd/mongodb/shard21.log--logappend --fork
Server2:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard2--port 27018--dbpath /diskd/mongodb/shard22 --oplogSize 2048 --logpath /diskd/mongodb/shard22.log--logappend --fork
Server3:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard2--port 27018--dbpath /diskd/mongodb/shard23 --oplogSize 2048 --logpath /diskd/mongodb/shard23.log--logappend --fork
#初始化副本集
/diskd/mongodb/mongodb_3.0.7/bin/mongo--port 27018
> config = {_id: 'shard2', members: [
{_id: 0, host:'192.168.167.170:27018'},
{_id: 1, host:'192.168.167.171:27018'},
{_id: 2, host: '192.168.167.172:27018'}]
}
> rs.initiate(config);
{ "ok" : 1 }
shard2:SECONDARY> quit();
【分片3】配置分片3(shard3)用到的replica sets
Server1:制定shard服务器
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard3 --port 27019 --dbpath /diskd/mongodb/shard31 --oplogSize 2048 --logpath /diskd/mongodb/shard31.log--logappend --fork
Server2:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard3 --port 27019 --dbpath /diskd/mongodb/shard32 --oplogSize 2048 --logpath /diskd/mongodb/shard32.log--logappend --fork
Server3:
/diskd/mongodb/mongodb_3.0.7/bin/mongod--shardsvr --replSet shard2--port 27018--dbpath /diskd/mongodb/shard23 --oplogSize 2048 --logpath /diskd/mongodb/shard23.log--logappend --fork
【设置成功分片前,不能进行任务数据库操作,包括类似use admin操作】
初始化副本集
登录mongo use admin
/diskd/mongodb/mongodb_3.0.7/bin/mongo--port 27019
定义副本集配置变量
> config = {_id: 'shard3', members: [
{_id: 0, host:'192.168.167.170:27019'},
{_id: 1, host:'192.168.167.171:27019'},
{_id: 2, host:'192.168.167.172:27019'}]
}
初始化副本集配置
> rs.initiate(config);
{ "ok" : 1 }
日志中查看主节点、从节点
shard3:OTHER>
#查看集群节点的状态
rs.status();
#配置分片集群
连接到其中一个mongos进程,并切换到admin数据库做以下配置
1. 连接到mongs,并切换到admin
/diskd/mongodb/mongodb_3.0.7/bin/mongo192.168.167.170:20000/admin
>db
Admin
2. 串联路由服务器与分配副本集 【通过addshard添加分片。MongoDB会负责将分片集成到集群】
#串联路由服务器与分配副本集1 30G数据
>db.runCommand({addshard:"shard1/192.168.167.170:27017,192.168.167.171:27017,192.168.167.172:27017",name:"s1", maxsize:30720});
#串联路由服务器与分配副本集2
>db.runCommand({addshard:"shard2/192.168.167.170:27018,192.168.167.171:27018,192.168.167.172:27018",name:"s2",maxsize:30720});
#串联路由服务器与分配副本集3
>db.runCommand({addshard:"shard3/192.168.167.170:27019,192.168.167.171:27019,192.168.167.172:27019",name:"s3",maxsize:30720});
注意:在添加第二个shard时,出现error:test database 已经存在的错误,这里用mongo命令连接到第二个replica set,1) use test ; 2) db.dropDatabase();命令把test数据库给删除然后就可加入
3. 可选参数
Name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes
4. Listing shards 查看分片服务器的配置
>db.runCommand( { listshards : 1 } )
如果列出了以上3个你加的shards,表示shards已经配置成功
5. 激活数据库分片
#指定testdb分片生效
db.runCommand( { enablesharding :"statistics"});
#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "statistics.total",key:{date:1,adver_id:1} } )