一、概念:

      分片(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:规定这是配置服务

注意:这里的dbpathlogpath是你之前创建的数据存储目录和日志存储文件的路径

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

启动顺序:分片--》配置--》路由。

 

posted on 2019-02-20 16:09  唐小夏  阅读(288)  评论(0编辑  收藏  举报