Mongo中的分片

分片(sharding)

分片的目的是通过分片能够增加更多的机器来应对不断增加的负载和数据,还不影响应用。

分片(sharding)是指将数据拆分,将其分散存在不同机器的过程,有时也用分区(partitioning)来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载.分片(sharding)是指将数据拆分,将其分散存在不同机器的过程,有时也用分区(partitioning)来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载.

MongoDB支持自动分片,可以摆脱手动分片的管理困扰,集群自动切分数据做负载均衡.MongoDB分片的基本思想就是将集合拆分成多个块,这些快分散在若干个片里,每个片只负责总数据的一部分,应用程序不必知道哪些片对应哪些数据,甚至不需要知道数据拆分了,所以在分片之前会运行一个路由进程(mongos进程),这个路由器知道所有的数据存放位置,应用只需要直接与mongos交互即可,mongos自动将请求转到相应的片上获取数据.从应用角度看分不分片没有什么区别。

mongoDB的分片架构图

  1. Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
  2. Config Server:mongod实例,存储了整个 ClusterMetadata。
  3. Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

什么时候做分片:

 ①机器磁盘不够用了

②单个的mongo已经不能满足写数据的性能需要了

片键:

设置分片时需要在集合中选一个键,用该键的值作为拆分数据的依据,这个片键称之为(shard key)

注意: 在真正的生产环境中,片键的选取很重要,片键的选取要一定要数据散列均匀

扫描二维码关注公众号,回复: 2290147 查看本文章

开始分片操作:

在此之前我们需要配置主机名,然后在linux系统中所以需要写ip地址的地方,都可以写主机名

vi /etc/hosts

192.168.58.136 mongo

在这里我们将58.136这个ip地址的主机名设置为mongo,配置中所有的mongo都代表此id,当然你也可以设置成别的名称。

这里我们在一台机器上以不同的端口号启动多个(8个)实例

(1)分片结构的端口如下(4台分片服务器,3台配置服务器,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

(3)在mongo的bin目录下创建数据目录并启动四台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

注:--bind_ip 0.0.0.0表示在任何的机器都可访问,不设定的话默认只能localhost本机访问

       --shardsvr明确表明这是一个分片服务器

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

./mongod --port 27100 --dbpath /root/shard/config1 --bind_ip 0.0.0.0 --replSet  config/mongo:27101 --configsvr

./mongod --port 27101 --dbpath /root/shard/config2 --bind_ip 0.0.0.0 --replSet  config/mongo:27102 --configsvr

./mongod --port 27102 --dbpath /root/shard/config3 --bind_ip 0.0.0.0 --replSet  config/mongo:27100 --configsvr

注:配置服务器必须以副本集的方式出现--replSet

       config声明的副本集的名字 

       --configsvr明确表明这是一个配置服务器

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

①登录任意config的server节点中使用 use admin

②config在admin中执行

var config = {

  _id:"config",

   configsvr: true,

  members:[

    {_id:0,host:"mongo:27100"},

    {_id:1,host:"mongo:27101"},

    {_id:2,host:"mongo:27102"}]

}

③初始化副本集配置 rs.initiate(config);

(6)启动路由(使用mongos命令)

./mongos --port 40000 --configdb config/mongo:27100,mongo:27101,mongo:27102 --bind_ip 0.0.0.0

注意: config为上面的副本集名称

(7)客户端登陆到mongos中做分片配置 ./mongo –port 40000

①use admin

②添加分片结点:

db.runCommand({ addshard:"mongo:27020","allowLocal":true });

db.runCommand({ addshard:"mongo:27021","allowLocal":true });

db.runCommand({ addshard:"mongo:27022","allowLocal":true });

db.runCommand({ addshard:"mongo:27023","allowLocal":true });

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

④设置那个库(test)中那个集合(user/emp)以及片键信息:

db.runCommand({ shardcollection: "test.user", key: { _id:1}})

注:分片失败,因为_id有规律,故所有的数据仍旧存储在一个分片中

db.runCommand({ shardcollection: "test.emp", key: { _id: "hashed"}})

注:分片成功,此时对_id做hash散列

猜你喜欢

转载自blog.csdn.net/wazk2008/article/details/81108831