• Mongodb分布式集群-分片集群


    一、概念:

          分片(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

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

  • 相关阅读:
    自己的第一个网页
    第一次爬虫测试
    科学计算与可视化
    python自顶向下的设计方法进行体育竞技分析
    python PIL库的相关操作
    python 关于身份证号码的相关操作
    jieba库
    汉诺塔
    Django项目中运行Scrapy项目
    **Django+Echart实现多个饼状图(echart数据格式问题 {value: 135, name: '视频广告'})
  • 原文地址:https://www.cnblogs.com/xiaotang5051729/p/10405780.html
Copyright © 2020-2023  润新知