zoukankan      html  css  js  c++  java
  • MongoDB学习笔记(六、MongoDB复制集与分片)

    目录:

    • MongoDB部署模型
    • MongoDB可复制集
    • MongoDB读写分离
    • 分片架构部署
    • 最佳实践

    MongoDB部署模型:

    单机 -> 可复制集 -> 分片集群

    MongoDB可复制集:

    可复制集是多台MongoDB节点之间分布和维护数据的方法;它可以将数据从一个节点复制到其它节点,并在修改时进行数据同步。

    在3.0之前的版本这叫做主从复制,3.0+推荐使用这个可复制集。

    1、为什么要使用复制集,有什么好处?

    • 它可以尽可能的避免数据丢失,保障数据的安全性,提高系统安全性。(最少3个节点,最大50个)
    • 它具有自动化灾备机制,在主节点宕机后会选举出一个新的主节点,提高系统的健壮性。(7个选举节点上限)
    • 读写分离,提高系统性能。

    2、可复制集的搭建:

    a、安装3个及以上的MongoDB

    b、配置mongodb.conf

    replication:
      // 集群名称
      replSetName: name
      // oplog大小
      oplogSizeMB: 50

    c、在primary节点上运行可复制集的初始命令

    // 复制集初始化
    rs.initiate({
        '_id':'name',
        'version':1,
        'members':[{'_id':0, host:'ip:port'}]
    })
    
    // 添加子节点
    rs.add('ip:port')
    rs.add('ip2:port')

    d、运行rs.status()rs.isMaster()命令查看复制集状态。

    3、可复制集架构及原理:

    a、oplog:保存操作记录及时间戳。

    b、数据同步:主从保持长轮询

    • 从节点查看本机oplog最新的时间戳
    • 查看主节点oplog中晚于此时间戳的文档
    • 加载这些文档,并根据log执行写操作

    c、心跳机制:每2秒进行一次心跳检测,发现故障后会进行选举和故障转移。

    d、选举制度:当主节点故障后,其余节点根据优先级和bully算法选举出新的主节点,在此之间集群服务是只读的。

    MongoDB读写分离:

    对于MongoDB来说,主节点一般用于写数据,从节点用于读数据,且主节点也并不是固定的(当主节点宕机后会选举出一个新的主节点),所以在生产环境时客户端不能直连主节点。

    所以我们需要配置集群节点

    <mongo:mongo-client replica-set="ip1:port1,ip2:port2,ip3:port3">
        <mongo:client-options read-preference="SECONDARY_PREFERRED"/>
    </mongo:mongo-client>

    通过read-preference参数控制读写分离方式,其类型有以下几种:

    • PRIMARY(默认):读操作都在主节点,若主节点不可用则报错。
    • PRIMARY_PREFERRED:首选主节点,若主节点不可用则转移到其它从节点。
    • SECONDARY:读从节点,不可用则报错。
    • SECONDARY_PREFERRED(推荐):首选从节点,若是特殊情况则在主节点读(但主节点架构)。
    • NEAREST:最邻近主节点。

    分片架构部署:

    为何要使用分片架构:

    • 数据海量增长,需要更大的读写吞吐量
    • 单台服务器的内存、CPU始终有瓶颈

    分片架构的三个主要角色:

    1、分片:分片架构中唯一存储数据的角色,它可以是单台服务器也可以是一个可复制集(生成环境推荐使用可复制集),每个分区上只存储部分数据。

    2、路由:由于分片只存储部分数据,所以需要一个工具(工具为mongos)来讲请求处理到对应的分片中,而路由就充当这一角色。

    3、配置服务器:存储集群的元数据(数据库、集合、分片的位置范围等日志信息),配置服务器最低3台。

    分片架构的搭建:

    1、分片服务器的配置(分片的三台服务器都需要执行)

    ./mongod --port 27010 --dbpath /usr/local/mongodb/data/db/27010 --logpath /usr/local/mongodb/logs/mongodb0.log --fork -- shardsvr

    2、config服务器集群配置

    ./mongod --port 27011 /usr/local/mongodb/data/db/27011 --logpath /usr/local/mongodb/logs/mongodb1.log --fork --logappend --configsvr --replSet=cfrs1
    rs.initiate({
        '_id':'cfrs1',
        'version':1,
        'members':[{
            '_id':0
        'host':'主节点ip:主节点port'
        }]
    })
    rs.add("从节点1ip:从节点1port")
    rs.add("从节点2ip:从节点2port")

    3、启动mongos路由

    ./mongos --configdb cfrs1/host1,host2,host3 --port 27016 --logpath /usr/local/mongodb/logs/mongodb6.log --fork --logappend

    4、配置sharding
    连接mongos,增加sharding

    use admin
    sh.addShard("host1")
    sh.addShard("host2")
    sh.addShard("host3")
    // 设置db启动分片
    sh.enableSharding('dbName')
    // 配置collection分片键
    sh.shardCollection(
        'dbName.collectionName',
        {'分片键字段名':1}
    )

    分片键选择的一些建议:

    1、不推荐点:

    • 不要使用自增长的字段作为分片键,避免热点问题。
    • 不能使用粗粒度的分片键,避免数据块无法分割。
    • 不能使用完全随机的分片键值,这样会造成查询性能低下。

    2、推荐点:

    • 使用与常用查询相关的字段作为分片键,且包含唯一字段(如业务主键,id等)。
    • 索引对于分区同样重要,每个分片集合上要有同样的索引,分片键默认成为索引。
    • 分片集合只允许在id和分片键上创建唯一索引。

    最佳实践:

    1、尽量选取稳定新版本64位的MongoDB。

    2、数据模式设计;提倡单文档设计,将关联关系作为内嵌文档或者内嵌数组;当关联数据量较大时,考虑通过表关联实现,dbref或者自定义实现关联。

    3、避免使用skip跳过大量数据

    • 通过查询条件尽量缩小数据范围。
    • 利用上一次的结果作为条件来查询下一页的结果。

    4、避免单独使用不适用索引的查询符($ne、$nin、$where等)。

    5、根据业务场景选择合适的写入策略,在数据安全和性能之间找到平衡点。

    6、建立索引很重要。

    7、生产环境中建议打开profile,便于优化系统性能。

    8、生产环境中建议打开auth模式,保障系统安全。

    9、不要将MongoDB和其他服务部署在同一台机器上(虽然MongoDB 占用的最大内存是可以配置的)。

    10、单机一定要开启journal日志,数据量不太大的业务场景中,推荐多机器使用副本集,并开启读写分离。

    11、分片键的注意事项。

  • 相关阅读:
    js中给一个元素添加事件
    asp.net客户端回调
    (转)web元素之input (javascript)功能
    在wcf中使用基于证书的授权和保护
    (转)IE与FireFox的js和css几处不同点
    IE&FF兼容性问题
    solaris UFS文件系统 要点
    perl命令行 代替 各种shell 一则
    nginx中的验证模块
    漂亮的正则,素数查找
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12000811.html
Copyright © 2011-2022 走看看