分片(sharding)
分片的目的是通过分片能够增加更多的机器来应对不断增加的负载和数据,还不影响应用。
分片(sharding)是指将数据拆分,将其分散存在不同机器的过程,有时也用分区(partitioning)来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载.分片(sharding)是指将数据拆分,将其分散存在不同机器的过程,有时也用分区(partitioning)来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载.
MongoDB支持自动分片,可以摆脱手动分片的管理困扰,集群自动切分数据做负载均衡.MongoDB分片的基本思想就是将集合拆分成多个块,这些快分散在若干个片里,每个片只负责总数据的一部分,应用程序不必知道哪些片对应哪些数据,甚至不需要知道数据拆分了,所以在分片之前会运行一个路由进程(mongos进程),这个路由器知道所有的数据存放位置,应用只需要直接与mongos交互即可,mongos自动将请求转到相应的片上获取数据.从应用角度看分不分片没有什么区别。
mongoDB的分片架构图
|
什么时候做分片:
①机器磁盘不够用了
②单个的mongo已经不能满足写数据的性能需要了
片键:
设置分片时需要在集合中选一个键,用该键的值作为拆分数据的依据,这个片键称之为(shard key)
注意: 在真正的生产环境中,片键的选取很重要,片键的选取要一定要数据散列均匀
开始分片操作:
在此之前我们需要配置主机名,然后在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散列