查看: 458|回复: 0

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

[复制链接]

257

主题

16

听众

581

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情

    3 天前
  • 签到天数: 321 天

    [LV.8]以坛为家I

    |显示全部楼层
    一、概念:
    分片(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 下一条