Mongodb分布式分片集群安装和理解

来源:互联网 发布:跆拳道教练怎么样 知乎 编辑:程序博客网 时间:2024/05/17 08:54

基础概念理解

mongodb是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB集群。

MongoDB的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB(默认64MB),超出则生成新的数据块。


要给构建一个MongoDB Sharding Cluster,需要三种角色:

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)

说明:为保证分片的可靠性,对于每一个分片,生产环境通常是 2个副本 + 1个仲裁构建 replica set (副本集)。但本文的一个副本集仅有三个副本组成。

#在每个机器里分别设置分片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 --port27018--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--port27018--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--port27018--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--port27018--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} } )













0 0
原创粉丝点击