mongodb集群部署

mongodb集群部署

一、MongoDB

1.1 介绍

MongoDB是开源的一个分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

1.2 特点

高性能、易部署、易使用,存储数据非常方便。

1.3 主要功能特性

Ø 面向集合存储,易存储对象类型的数据

Ø 模式自由

Ø 支持动态查询

Ø 支持完全索引,包含内部对象

Ø 支持查询

Ø 支持复制和故障恢复

Ø 使用高效的二进制数据存储,包括大型对象(如视频等)

Ø 自动处理碎片,以支持云计算层次的扩展性

Ø 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言

Ø 文件存储格式为BSON(一种JSON的扩展)

1.4 MongoDB集成hadoop进行统计计算

MongoDB还提供了对外部统计工具的接口,MongoDB与Hadoop相结合。MongoDB作为数据源存储以及数据结果的存储,而具体的计算过程在Hadoop中进行。

 

 

二、MongoDB集群架构

2.1 架构图


 

 路由分片的架构 


 

2.2 路由服务器 - mongos


请求分发中心,负责把请求分拨到shard服务器上

192.168.1.150:20000
192.168.1.151:20000
192.168.1.107:20000
 

2.3 配置服务器 - configServer 

存储数据库元信息配置(路由、分片数据)

① mongos第一次启动、关掉重启都会从 config server 加载配置信息;

② 以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态;

③ configServer保证mongos可以准确路由;

192.168.1.150:21000
192.168.1.151:21000
192.168.1.107:21000
 

2.4 节点服务器 - shard

节点服务器负责存储mongo数据库的数据,分为主节点、副本节点以及仲裁节点。

分片

在mongodb集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上。 



 

例如:

一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了!在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力。

主节点

192.168.1.150:22001 (shard1)
192.168.1.150:22002 (shard2)
192.168.1.150:22003 (shard3)
 

副本节点

192.168.1.151:22001 (shard1)
192.168.1.151:22002 (shard2)
192.168.1.151:22003 (shard3)
 

仲裁节点 

192.168.1.107:22001 (shard1)
192.168.1.107:22002 (shard2)
192.168.1.107:22003 (shard3)

 三、集群部署

3.1 准备机器 

机器A:192.168.1.150

机器B:192.168.1.151

机器C:192.168.1.107

3.2 创建目录

mongos目录

mkdir -p /root/data/mongodb/mongos/data
mkdir -p /root/data/mongodb/mongos/log
 

config server 数据文件存放目录

mkdir -p /root/data/mongodb/config/data
mkdir -p /root/data/mongodb/config/log

节点数据目录

shard1 存放目录
mkdir -p /root/data/mongodb/shard1/data
mkdir -p /root/data/mongodb/shard1/log

shard2 存放目录
mkdir -p /root/data/mongodb/shard2/data
mkdir -p /root/data/mongodb/shard2/log

shard3 存放目录
mkdir -p /root/data/mongodb/shard3/data
mkdir -p /root/data/mongodb/shard3/log
 

3.3 启动configServer服务

mongod --configsvr --dbpath /root/data/mongodb/config/data --port 21000 --logpath /root/data/mongodb/config/log/config.log --fork
 

3.4 启动mongos服务

mongos --configdb 192.168.1.150:21000,192.168.1.151:21000,192.168.1.107:21000 --port 20000 --logpath /root/data/mongodb/mongos/log/mongos.log
 

3.5 启动节点服务

mongod --shardsvr --replSet shard1 --port 22001 --dbpath  /root/data/mongodb/shard1/data  --logpath /root/data/mongodb/shard1/log/shard1.log --fork --nojournal  --oplogSize 10
mongod --shardsvr --replSet shard2 --port 22002 --dbpath  /root/data/mongodb/shard2/data  --logpath /root/data/mongodb/shard2/log/shard2.log --fork --nojournal  --oplogSize 10
mongod --shardsvr --replSet shard3 --port 22003 --dbpath  /root/data/mongodb/shard3/data  --logpath /root/data/mongodb/shard3/log/shard3.log --fork --nojournal  --oplogSize 10



 

3.6 设置分片副本集

3.6.1 登陆机器A,设置第一个分片副本集

mongo 127.0.0.1:22001

use admin;
config = { _id:"shard1", members:[
                     {_id:0,host:"192.168.1.150:22001"},
                     {_id:1,host:"192.168.1.151:22001"},
                     {_id:2,host:"192.168.1.107:22001",arbiterOnly:true}    【仲裁节点】
                ]
         }
rs.initiate(config);



 



 

 

3.6.2 登陆机器A,设置第二个分片副本集

mongo 127.0.0.1:22002

use admin;
config = { _id:"shard2", members:[
                     {_id:0,host:"192.168.1.150:22002"},
                     {_id:1,host:"192.168.1.151:22002"},
                     {_id:2,host:"192.168.1.107:22002",arbiterOnly:true}【仲裁节点】 
                ]
         };
rs.initiate(config);

 

 


3.6.3 登陆机器A,设置第三个分片副本集


mongo 127.0.0.1:22003

use admin;
config = { _id:"shard3", members:[
                     {_id:0,host:"192.168.1.150:22003"},
                     {_id:1,host:"192.168.1.151:22003"},
                     {_id:2,host:"192.168.1.107:22003",arbiterOnly:true}【仲裁节点】 
                ]
         };
rs.initiate(config);

3.7 configServer分片配置

 
配置服务器,config server 为 21000
路由服务器,mongos为 20000
 
各个分片服务器
shard1为 22001  
shard2为 22002 
shard3为 22003
 
在程序里设置分片配置,让分片生效
mongo 127.0.0.1:20000

串联路由服务器与分配副本集
use  admin;
db.runCommand( { addshard : "shard1/192.168.1.150:22001,192.168.1.151:22001,192.168.1.107:22001"});
db.runCommand( { addshard : "shard2/192.168.1.150:22002,192.168.1.151:22002,192.168.1.107:22002"});
db.runCommand( { addshard : "shard3/192.168.1.150:22003,192.168.1.151:22003,192.168.1.107:22003"});
  

 
 查看刚刚设置的分片配置
db.runCommand( { listshards : 1 } );
 

 

3.8 设置需要分片的数据库和表


数据库:testdb
表:table1 
db.runCommand( { enablesharding :"testdb"});



db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
 
【设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!】
插入数据,数据能够自动分片;
让指定的数据库、指定的集合分片生效;
 

3.9 测试分片配置结果

mongo 127.0.0.1:20000
use  testdb;

for (var i = 1; i <= 100000; i++) db.table1.save({id:i,"test1":"testval1"});

db.table1.stats();
 
{ "sharded" : true, "ns" : "testdb.table1", "count" : 100000, "numExtents" : 13, "size" : 5600000, "storageSize" : 22372352, "totalIndexSize" : 6213760, "indexSizes" : { "_id_" : 3335808, "id_1" : 2877952 }, "avgObjSize" : 56, "nindexes" : 2, "nchunks" : 3, "shards" : { "shard1" : { "ns" : "testdb.table1", "count" : 42183, "size" : 0, ... "ok" : 1 }, "shard2" : { "ns" : "testdb.table1", "count" : 38937, "size" : 2180472, ... "ok" : 1 }, "shard3" : { "ns" : "testdb.table1", "count" :18880, "size" : 3419528, ... "ok" : 1 } }, "ok" : 1 }
 
【可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!】

 
 

猜你喜欢

转载自hyy044101331.iteye.com/blog/2279277