黑帽联盟
标题: mongodb分片集群(Sharding Cluster)配置搭建 [打印本页]
作者: admin 时间: 2019-10-25 16:21
标题: mongodb分片集群(Sharding Cluster)配置搭建
一、概念:
分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。
基本思想:就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器)。大部分使用场景都是解决磁盘空间的问题,对于写入有可能会变差(+++里面的说明+++),查询则尽量避免跨分片查询。
使用分片的时机:
1,机器的磁盘不够用了。使用分片解决磁盘空间的问题。
2,单个mongod已经不能满足写数据的性能要求。通过分片让写压力分散到各个分片上面,使用分片服务器自身的资源。
3,想把大量数据放到内存里提高性能。和上面一样,通过分片使用分片服务器自身的资源。
二、部署安装: 前提是安装了mongodb(本文用2.6.5测试)
在搭建分片之前,先了解下分片中各个角色的作用。
① 配置服务器。是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。不需要太多的空间和资源,配置服务器的1KB空间相当于真是数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。
② 路由服务器。即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
③ 分片服务器。是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。
原理图:
部署环境:4台机子
配置服务器1台:172.31.225.244(centos7.3) (建议设立2台,做高可用,可以用keepalived做可用)
路由服务器1台:172.31.225.243 (centos7.3) (建议设立3台,做分布式集群,可以用zookeeper来实现)
分片服务器2台:172.31.225.245和172.31.225.246(centos6.7) (建议设立3台,万一其中的一台挂了,部分数据就会无法访问到,所以需要再添加一台做备用)
以上只用4台,原因是自己机器配置有限
在部署之前先明白片键的意义,一个好的片键对分片至关重要。片键必须是一个索引,数据根据这个片键进行拆分分散。通过sh.shardCollection加会自动创建索引。一个自增的片键对写入和数据均匀分布就不是很好,因为自增的片键总会在一个分片上写入,后续达到某个阀值可能会写到别的分片。但是按照片键查询会非常高效。随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。
启动上面这些服务,因为在后台运行,所以用配置文件启动
mongodb编译好的二进制文件下载:http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.6.5.tgz
在四台机器上配置如下操作:
1、wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.6.5.tgz
2、tar xf mongodb-linux-x86_64-2.6.5.tgz -C /usr/local/
3、cd /usr/local
4、ln -sv mongodb-linux-x86_64-2.6.5 mongo
5、vim /etc/profile.d/mongo.shexport MONGOD_HOME=/usr/local/mongo
export PATH=$MONGOD_HOME/bin:$PATH
6、. /etc/profile.d/mongo.sh
以上主要是为了配置mongodb环境变量,全局生效
接着再配置启动脚本#!/bin/sh
# chkconfig: - 64 36
# description:mongod
case $1 in
start)
/usr/local/mongo/bin/mongod --maxConns 20000 --config /etc/mongod.conf
;;
stop)
/usr/local/mongo/bin/mongo 127.0.0.1:27017/admin --eval "db.shutdownServer()"
#/usr/local/mongo/bin/mongo 127.0.0.1:27017/admin --eval "db.auth('system', '123456');db.shutdownServer()"
;;
restart)
/usr/local/mongo/bin/mongo 127.0.0.1:27017/admin --eval "db.shutdownServer()"
/usr/local/mongo/bin/mongod --maxConns 20000 --config /etc/mongod.conf
#/usr/local/mongo/bin/mongo 127.0.0.1:27017/admin --eval "db.auth('system', '123456');db.shutdownServer()"
;;
status)
/usr/local/mongo/bin/mongo 127.0.0.1:27017/admin --eval "db.stats()"
#/usr/local/mongo/bin/mongo 127.0.0.1:27017/admin --eval "db.auth('system', '123456');db.stats()"
;;
esac
以上的启动脚本适用于分片服务器
如果是“配置服务器”的话,则需要把上面的端口改成27019即可
如果是路由服务器的话,则需要把上面的mongod改成mongos即可
最后就是创建相关目录:即日志保存目录,数据保存目录
mkdir /mongdb/data -pv #路由服务器上不需要此操作,因为路由服务器不需要保存数据
mkdir /var/log/mongodb
groupadd mongod
useradd -g mongod mongod
chown -R mongod:mongod /mongodb/data
chown -R mongod:mongod /var/log/mongodb
配置顺序:先配置“配置服务器”、再配置“路由服务器”、最后再配置“分片服务器”
1)配置服务器的启动。(172.31.225.244)
配置文件如下:dbpath=/mongodb/data/
logpath=/var/log/mongodb/mongodb.log
pidfilepath=/var/run/mongo.pid
fork=true
logappend=true
directoryperdb=true
httpinterface=true
configsvr=true
接着启动mongod服务
service mongod start
2)路由服务器的启动
路由服务器不保存数据,把日志记录一下即可。
配置文件如下:logpath=/var/log/mongodb/mongodb.log
pidfilepath=/var/run/mongo.pid
fork=true
logappend=true
httpinterface=true
configdb=172.31.225.244
启动相关服务:
service mongos start
启动服务的时候,上面也有提示:2019-10-25T15:17:01.739+0800 warning: running with 1 config server should be done only for testing purposes and is not recommended for production
意思是:1台“配置服务器”用于做测试用,在生产环境上面,不建议使用1台“配置服务器”
3)分片服务器的启动:
就是一个普通的mongod进程:
配置文件如下:dbpath=/mongodb/data/
logpath=/var/log/mongodb/mongodb.log
pidfilepath=/var/run/mongo.pid
fork=true
logappend=true
directoryperdb=true
httpinterface=true
启动服务:
service mongod start
三、配置分片:下面的操作都是在mongodb的命令行里执行 (172.31.225.243)
查看当前分片集群的状态信息
可以看到上面的shards为空,因为我们还有添加分片服务器
添加一台分片服务器
接着我们再添加另一台分片服务器
这还不够,以上操作只是添加分片服务器,并没有启用分片服务器,以及没有设置对哪个数据库进行分片,其次还有基于什么键类型的索引进行分片,都没有设置
先启用针对testdb数据库进行分片功能:
基于age字段为索引进行分片,并按照升序排列
因为还没有testdb数据库,因此我们需要添加数据库,并在里面创建集合,添加一些数据进去,添加了100000条数据
再次查看分片集群的状态信息:
从上图可知:
age范围:1-52 不包括52,在shard0001分片服务器上,即172.31.225.246
age范围:52-119 包括最大值119,在shard0000分片服务器上,即172.31.225.245
下面我们验证一下:
shard0000分片服务器:
shard0001分片服务器
查看均衡状态,从下图可知:两个分片服务器分配数据均衡,都是2块数据
查看分片服务器总数据:
数据加载一起正好是100000条数据,两边的数据也差不多
欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) |
Powered by Discuz! X2.5 |