一、概念:
分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器)。大部分使用场景都是解决磁盘空间的问题,对于写入有可能会变差(+++里面的说明+++),查询则尽量避免跨分片查询。使用分片的时机:
1,机器的磁盘不够用了。使用分片解决磁盘空间的问题。 2,单个mongod已经不能满足写数据的性能要求。通过分片让写压力分散到各个分片上面,使用分片服务器自身的资源。 3,想把大量数据放到内存里提高性能。和上面一样,通过分片使用分片服务器自身的资源。
二、部署安装:
在搭建分片之前,先了解下分片中各个角色的作用。
① 配置服务器。是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,
指定configsvr选项。不需要太多的空间和资源,配置服务器的1KB空间相当于真是数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。
② 路由服务器。即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
③ 分片服务器。是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。
在部署之前先明白片键的意义,一个好的片键对分片至关重要。片键必须是一个索引,数据根据这个片键进行拆分分散。通过sh.shardCollection加会自动创建索引。一个自增的片键对写入和数据均匀分布就不是很好,因为自增的片键总会在一个分片上写入,后续达到某个阀值可能会写到别的分片。但是按照片键查询会非常高效。随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。
机器:135.149.34.54、135.149.34.55、135.149.34.56
部署包:mongodb-linux-x86_64-3.0.8.tgz
部署结构:
135.149.34.54上部署配置服务、路由服务
135.149.34.55上部署分片服务
135.149.34.56上部署分片服务
1.在三台服务器上分别解压mongodb部署包包并修改解压后的目录名分别为mongodb
tar -zxvf mongodb-linux-x86_64-3.0.8.tgz mv mongodb-linux-x86_64-3.0.8 mongodb
2.在135.149.34.54上部署配置服务
1)进入mongodb目录下
2)创建数据存储目录和日志存储文件
mkdir -p data/config
mkdir logs
touch logs/config.log
3)创建启动配置文件
mkdir conf
touch conf/config.conf
编辑启动配置文件
vi conf/config.conf
加入以下内容:
configsvr=true
port=27018
dbpath=/u01/esb/mongodb/data/config
storageEngine=wiredTiger
wiredTigerCacheSizeGB=1
wiredTigerJournalCompressor=zlib
logpath=/u01/esb/mongodb/logs/config.log
logappend=true
fork=true
解释:
port:mongodb端口号,默认是27017
dbpath:mongodb数据存储路径,就是之前创建的data/mongodb目录
storageEngine:存储引擎类型
wiredTigerCacheSizeGB:工作集大小(使用内存大小),根据需要设置,单位GB
wiredTigerJournalCompressor:文件压缩方式
logpath:日志存储路径,是一个文件的路径,这里是之前的logs/mongodb.log文件
logappend:日志已在文件末尾追加的方式存储
fork:后台运行
configsvr:规定这是配置服务
注意:这里的dbpath和logpath是你之前创建的数据存储目录和日志存储文件的路径
4)启动配置服务
进入bin目录下
./mongod -f /u01/esb/mongodb/conf/config.conf
3.在135.149.34.54上部署路由服务
1)进入mongodb目录下
2)创建日志存储文件(路由服务不存储数据,所有没有数据存储目录)
mkdir logs
touch logs/router.log
3)创建启动配置文件
mkdir conf
touch conf/router.conf
编辑router.conf
vi conf/router.conf
添加以下内容
configdb=135.149.34.54:27018 port=27017 logpath=/u01/esb/mongodb/logs/router.log logappend=true fork=true
注释:
configdb:配置服务的ip和端口,配置服务一般为1个或3个,生产环境建议使用3个,如果是3个就用逗号隔开
例如:configdb=135.149.34.54:27018,135.149.34.55:27018,135.149.34.56:27018
4)启动路由服务
进入bin目录下
./mongos -f /u01/esb/mongodb/conf/router.conf
注意:路由服务启动的目录是mongos
注:路由服务也可以启动多个,在集群配置启动完成之后,再启动一个路由服务就可使用
4.在135.149.34.55上部署分片服务
1)进入mongodb目录下
2)创建数据存储目录和日志存储文件
mkdir -p data/shard
mkdir logs
touch logs/shard.log
3)创建启动配置文件
mkdir conf
touch conf/shard.conf
编辑shard.conf
添加以下内容
shardsvr=true port=27019 dbpath=/u01/esb/mongodb/data/shard storageEngine=wiredTiger wiredTigerCacheSizeGB=1 wiredTigerJournalCompressor=zlib logpath=/u01/esb/mongodb/logs/shard.log logappend=true fork=true
4)启动分片服务
进入bin目录下
./mongod -f /u01/esb/mongodb/conf/shard.conf
5.创建认证文件
(1)135.149.35.54、135.149.35.54、135.149.35.54上面创建目录:
mkdir /u01/esb/mongodb/security
(2)135.149.35.54生成keyFile文件
openssl rand -base64 753 > /u01/esb/mongodb/security/keyfile
把生成的文件keyfile拷贝到其他两台服务器中的目录下面
(3)到服务器的keyfile所在目录,给所有的keyFile赋权限
chmod 600 keyfile
(4)连接路由服务器,进入路由mongodb的bin目录下
cd /u01/esb/mongodb/bin
./mongos -f /u01/esb/mongodb/conf/router.conf
(5)建立管理员账号
use admin; db.createUser( { user: "admin",pwd: "admin",roles: [{role:"root",db:"admin"}] } ); db.auth("admin","admin");
(6)添加分片
路由服务关联了配置服务,我们还需要将分片服务添加到路由上
进入admin数据库
use admin
路由上添加分片,有几个就添加几个
db.runCommand({addShard:"135.149.34.55:27019"}) db.runCommand({addShard:"135.149.34.56:27019"})
指定需要分片的数据库
db.runCommand({enableSharding:"logtest"})
指定需要分片的集合以及片键,这里是servcode和_id组合片键
db.runCommand({shardCollection:"logtest.logInstance",key:{servcode:1,_id:1}})
分片设置完成,退出exit
(7)用管理员账户登录,建立新账户,让他可以读写数据库logtest
./mongos localhost:27017/admin -u admin -p admin -f /u01/esb/mongodb/conf/router.conf
use logtest; db.createUser({ user:"logtest", pwd:"logtest", roles:[ {role:"readWrite",db:"logtest"} ] } ) db.auth("logtest","logtest");
(9)重新启动3台服务器的分片,配置和路由服务,加上认证文件
配置:
./mongod --keyFile=/u01/esb/mongodb/security/keyfile -f /u01/esb/mongodb/conf/config.conf
路由:
./mongos --keyFile=/u01/esb/mongodb/security/keyfile -f /u01/esb/mongodb/conf/router.conf
分片:
./mongod --keyFile=/u01/esb/mongodb/security/keyfile -f /u01/esb/mongodb/conf/shard.conf
启动顺序:分片--》配置--》路由。