您的位置:首页 > 数据库 > Mongodb

mongodb集群搭建(sharding集群)

2018-01-28 10:32 302 查看
mongos:数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

config server:顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos就能继续准确路由。在生产环境通常有多个 config server配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存活, mongodb集群就不会挂掉。

shard:这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做,如下图:



一台机器的一个数据表 Collection1 存储了 1T数据,压力太大了!在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力。也许有人问一台机器硬盘加大一点不就可以了

,为什么要分给四台机器呢?不要光想到存储空间,实际运行的数据库还有硬盘的读写、网络的IO、CPU和内存的瓶颈。在mongodb集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上。在生产环境中分片的片键可要好好

设置,这个影响到了怎么把数据均匀分到多个分片机器上,不要出现其中一台机器分了1T,其他机器没有分到的情况,这样还不如不分片!

replica set:前面已经详细讲过了这个东东,怎么这里又来凑热闹!其实上图4个分片如果没有 replica set是个不完整架构,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建 replica set副本集保证分片的可靠性。生产环境通常是 2个副本 + 1个仲裁。说了这么多,还是来实战一下如何搭建高可用的mongodb集群:首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 =6 个,总共需要部署15个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里测试资源有限,只准备了3台机器,在同一台机器只要端口不同就可以,看一下物理部署图:



1、准备机器,IP分别设置为: 172.17.0.2、 172.17.0.3、 172.17.0.4,并分别创建mongos 、config 、 shard1、shard2、shard3对应目录

建立mongos及日志目录

mkdir -p /data/mongodbtest/mongos/log

建立config server 数据文件存放目录

mkdir -p /data/mongodbtest/config/data

建立config server 日志文件存放目录

mkdir -p /data/mongodbtest/config/log

建立shard1 数据文件存放目录

mkdir -p /data/mongodbtest/shard1/data

建立shard1 日志文件存放目录

mkdir -p /data/mongodbtest/shard1/log

建立shard2 数据文件存放目录

mkdir -p /data/mongodbtest/shard2/data

建立shard2 日志文件存放目录

mkdir -p /data/mongodbtest/shard2/log

建立shard3 数据文件存放目录

mkdir -p /data/mongodbtest/shard3/data

建立shard3 日志文件存放目录

mkdir -p /data/mongodbtest/shard3/log

172.17.0.2、172.17.0.3、172.17.0.4,并分别创建mongos 、config 、 shard1 、shard2、shard3对应目录

mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.

docker run -d -p 2220:22 -p20000 -p21000 -p22001 -p22002 -p22003 lamp

docker run -d -p 2221:22 -p20000 -p21000 -p22001 -p22002 -p22003 lamp

docker run -d -p 2222:22 -p20000 -p21000 -p22001 -p22002 -p22003 lamp

3、在每一台服务器分别启动配置服务器(后台运行)

config

mongod –configsvr –replSet cfgReplSet –dbpath /data/mongodbtest/config/data –port 21000 –logpath

/data/mongodbtest/config/log/config.log –fork

连接到任意一台配置服务器上

mongo –host 172.17.0.2 –port 21000

创建配置服务器副本集

rs.initiate({_id:”cfgReplSet”,configsvr:true,members:[{_id:0,host:”172.17.0.2:21000”},{_id:1,host:”172.17.0.3:21000”},{_id:2,host:”172.1

7.0.4:21000”}]})

4、在每一台服务器分别启动分片及副本集。(后台运行)

在每一台服务器分别以副本集方式启动分片1

mongod –shardsvr –replSet shard1ReplSet –port 22001 –dbpath /data/mongodbtest/shard1/data –logpath

/data/mongodbtest/shard1/log/shard1.log –fork –nojournal

mongod –shardsvr –replSet shard2ReplSet –port 22002 –dbpath /data/mongodbtest/shard2/data –logpath

/data/mongodbtest/shard2/log/shard2.log –fork –nojournal

mongod –shardsvr –replSet shard3ReplSet –port 22003 –dbpath /data/mongodbtest/shard3/data –logpath

/data/mongodbtest/shard3/log/shard3.log –fork –nojournal

连接任意一台分片服务器

连接任意一台分片服务器

mongo –host 172.17.0.2 –port 22001

use admin

创建副本集并初始化

rs.initiate({_id:”shard1ReplSet”,members:[{_id:0,host:”172.17.0.2:22001”},{_id:1,host:”172.17.0.3:22001”},{_id:2,host:”172.17.0.4:22001

“}]})

mongo –host 172.17.0.3 –port 22002

use admin

rs.initiate({_id:”shard2ReplSet”,members:[{_id:0,host:”172.17.0.2:22002”},{_id:1,host:”172.17.0.3:22002”},{_id:2,host:”172.17.0.4:22002

“}]})

mongo –host 172.17.0.4 –port 22003

use admin

rs.initiate({_id:”shard3ReplSet”,members:[{_id:0,host:”172.17.0.2:22003”},{_id:1,host:”172.17.0.3:22003”},{_id:2,host:”172.17.0.4:22003

“}]})

5、选择一台服务器启动mongos路由服务。

mongos –configdb cfgReplSet/172.17.0.2:21000,172.17.0.3:21000,172.17.0.4:21000 –port 20000 –logpath

/data/mongodbtest/mongos/log/mongos.log –fork

登录路由服务客户端

mongo –host 172.17.0.2 –port 20000

添加分片到集群

sh.addShard(“shard1ReplSet/172.17.0.2:22001,172.17.0.3:22001,172.17.0.4:22001”)

sh.addShard(“shard2ReplSet/172.17.0.2:22002,172.17.0.3:22002,172.17.0.4:22002”)

sh.addShard(“shard3ReplSet/172.17.0.2:22003,172.17.0.3:22003,172.17.0.4:22003”)

6、Enable Sharding for a Database

sh.enableSharding(“test”)

7、Shard a Collection

sh.shardCollection(“test.Log”, { id: 1})

8、测试

use test

for(var i = 1; i <= 100000; i++){

db.Log.save({id:i,”message”:”message”+i});

}

db.Log.stats()







分片不均匀,这是shard key的策略造成的

db.Log.drop()

sh.shardCollection(“test.Log”,{id:”hashed”})

db.Log.stats()







这里基本保持了数据的均衡。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: