分片集群搭建

  • 一. 分片的解释
  • 1. 分片(sharding)
  • 2. 什么时候分片
  • 二. 分片的架构图和分析
  • 三. 搭建环境准备
  • 1. 分片结构的端口如下
  • 2. 创建数据目录
  • 3. 创建数据目录并启动四台shard机器
  • 4. 创建config数据目录启动配置机器
  • 5. 初始化config的配置服务器副本集
  • 6. 启动路由
  • 7. 客户端登陆到mongos中 mongo –port 40000
  • 四. 测试分片集群


一. 分片的解释

1. 分片(sharding)

  • 分片目的是通过分片能够增加更多机器来应对不断的增加负载和数据,还不影响应用.
  • 分片(sharding)是指将数据拆分,将其分散存在不同机器的过程,有时也用分区(partitioning)来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载.
  • MongoDB支持自动分片,可以摆脱手动分片的管理困扰,集群自动切分数据做负载均衡.MongoDB分片的基本思想就是将集合拆分成多个块,这些快分散在若干个片里,每个片只负责总数据的一部分,应用程序不必知道哪些片对应哪些数据,甚至不需要知道数据拆分了,所以在分片之前会运行一个路由进程,mongos进程,这个路由器知道所有的数据存放位置,应用只需要直接与mongos交互即可,mongos自动将请求转到相应的片上获取数据.从应用角度看分不分片没有什么区别.

2. 什么时候分片

  • 机器磁盘不够用了
  • 单个的mongo已经不能满足写数据的性能需要了

二. 分片的架构图和分析

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_java

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_linux_02

  1. Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
  2. Config Server:mongod实例,存储了整个 ClusterMetadata。
  3. Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
  4. 片键,设置分片时需要在集合中选一个键,用该键的值作为拆分数据的依据,这个片键称之为(shard key)。注意: 在真正的生产环境中,片键的选取很重要,片键的选取要一定要数据散列均匀

三. 搭建环境准备

@ 我这里搭建的是伪分布式,全部的配置都是在一台机器上搭建

1. 分片结构的端口如下

Shard Server 1:27020
	Shard Server 2:27021
	Shard Server 3:27022
	Shard Server 4:27023

	Config Server :27100
	Config Server :27101
	Config Server :27102
	
	Route Process:40000

2. 创建数据目录

mkdir -p /root/shard/s0
	mkdir -p /root/shard/s1
	mkdir -p /root/shard/s2
	mkdir -p /root/shard/s3
	
	mkdir -p /root/shard/config1
	mkdir -p /root/shard/config2
	mkdir -p /root/shard/config3

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_MongoDB 是否分片 查看集合_03

3. 创建数据目录并启动四台shard机器

@ 四台shard机器都是复制机器出来的,只是配置的端口号不一样

./mongod --port 27020 --dbpath /root/shard/s0 --bind_ip 0.0.0.0 --shardsvr
./mongod --port 27021 --dbpath /root/shard/s1 --bind_ip 0.0.0.0 --shardsvr
./mongod --port 27022 --dbpath /root/shard/s2 --bind_ip 0.0.0.0 --shardsvr
./mongod --port 27023 --dbpath /root/shard/s3 --bind_ip 0.0.0.0 --shardsvr

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_数据_04

4. 创建config数据目录启动配置机器

@ 三台config机器都是复制机器出来的,只是配置的端口号不一样,还有主机都是Linux

./mongod --port 27100 --dbpath /root/shard/config1 --bind_ip 0.0.0.0 --replSet  config/Linux:27101 --configsvr
./mongod --port 27101 --dbpath /root/shard/config2 --bind_ip 0.0.0.0 --replSet  config/Linux:27102 --configsvr
./mongod --port 27102 --dbpath /root/shard/config3 --bind_ip 0.0.0.0 --replSet  config/Linux:27100 --configsvr

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_MongoDB 是否分片 查看集合_05

5. 初始化config的配置服务器副本集

  1. 登录任意config的server节点中使用

@ 记得改成自己配置的主机名称

use admin 

// config在admin中执行
var config = { 
	 	_id:"config", 
		   configsvr: true,
	 	members:[
	   	{_id:0,host:"Linux:27100"},
	   	{_id:1,host:"Linux:27101"},
	   	{_id:2,host:"Linux:27102"}]
}
//初始化副本集配置 
rs.initiate(config);
//查看配置
config

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_linux_06

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_linux_07

6. 启动路由

注意: config为上面的副本集名称
./mongos --port 40000 --configdb config/Linux:27100,Linux:27101,Linux:27102 
--bind_ip 0.0.0.0

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_java_08

7. 客户端登陆到mongos中 mongo –port 40000

use admin
//添加分片节点: 
db.runCommand({ addshard:"Linux:27020","allowLocal":true });
db.runCommand({ addshard:"Linux:27021","allowLocal":true });
db.runCommand({ addshard:"Linux:27022","allowLocal":true });
db.runCommand({ addshard:"Linux:27023","allowLocal":true });

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_数据_09

//设置分片的库:
db.runCommand({ enablesharding:"ems" });

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_MongoDB 是否分片 查看集合_10

//设置那个库中那个集合以及片键信息:
//_id 的信息差异不大 会被分在同一个片中
db.runCommand({ shardcollection: "ems.emps", key: { _id:1}})
//推荐使用下面这个hash散列 分布在不同的片中
db.runCommand({ shardcollection: "ems.emps", key: { _id: "hashed"}})

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_linux_11


MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_java_12

四. 测试分片集群

@ 插入10w条数据 基本上平均分配在4个片中 _id使用Hashed散列

MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_数据_13


MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_MongoDB 是否分片 查看集合_14


MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_mongodb_15


MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_MongoDB 是否分片 查看集合_16


MongoDB 是否分片 查看集合 mongodb中的分片是什么意思_mongodb_17