黑帽联盟

 找回密码
 会员注册
查看: 1653|回复: 0
打印 上一主题 下一主题

[其它] mongodb分片集群(Sharding Cluster)配置搭建

[复制链接]

295

主题

18

听众

969

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    慵懒
    2024-12-6 00:09
  • 签到天数: 377 天

    [LV.9]以坛为家II

    一、概念:
    分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。

    基本思想:就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器)。大部分使用场景都是解决磁盘空间的问题,对于写入有可能会变差(+++里面的说明+++),查询则尽量避免跨分片查询。

    使用分片的时机:

    1,机器的磁盘不够用了。使用分片解决磁盘空间的问题。
    2,单个mongod已经不能满足写数据的性能要求。通过分片让写压力分散到各个分片上面,使用分片服务器自身的资源。
    3,想把大量数据放到内存里提高性能。和上面一样,通过分片使用分片服务器自身的资源。



    二、部署安装: 前提是安装了mongodb(本文用2.6.5测试)
    在搭建分片之前,先了解下分片中各个角色的作用。
    配置服务器是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。不需要太多的空间和资源,配置服务器的1KB空间相当于真是数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。
    ② 路由服务器。即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
    ③ 分片服务器。是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。


    原理图:
    2121.png

    部署环境: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.sh
    export 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
    1211.png


    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
    1212.png

    启动服务的时候,上面也有提示: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
    1213.png


    三、配置分片:下面的操作都是在mongodb的命令行里执行 (172.31.225.243)
    查看当前分片集群的状态信息
    12.png

    可以看到上面的shards为空,因为我们还有添加分片服务器
    添加一台分片服务器
    13.png

    接着我们再添加另一台分片服务器
    14.png

    这还不够,以上操作只是添加分片服务器,并没有启用分片服务器,以及没有设置对哪个数据库进行分片,其次还有基于什么键类型的索引进行分片,都没有设置

    先启用针对testdb数据库进行分片功能:
    15.png

    基于age字段为索引进行分片,并按照升序排列
    16.png

    因为还没有testdb数据库,因此我们需要添加数据库,并在里面创建集合,添加一些数据进去,添加了100000条数据
    17.png

    再次查看分片集群的状态信息:
    18.png

    从上图可知:
    age范围:1-52 不包括52,在shard0001分片服务器上,即172.31.225.246
    age范围:52-119 包括最大值119,在shard0000分片服务器上,即172.31.225.245

    下面我们验证一下:
    shard0000分片服务器:
    12.jpg

    shard0001分片服务器
    13.jpg

    查看均衡状态,从下图可知:两个分片服务器分配数据均衡,都是2块数据
    21.png

    查看分片服务器总数据:
    22.png

    23.png

    数据加载一起正好是100000条数据,两边的数据也差不多

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部