MongoDb(八)可复制集,分片集群

(一)可复制集

   可复制集是跨多个MongDB服务器(节点)分布和维护数据的方法。 MongoDB可以把数据从一个节点复制到其他节点并在修改时进行同步,集群中的节点配置为自动同步数据;旧方法叫做主从复制。MongoDB 3.0以后推荐使用可复制集。

(1):为什么要用可复制集?它有什么重要性?

  • 1:避免数据丢失,保障数据安全,提高系统安全性; (最少3节点,最大50节点)
  • 2:自动化灾备机制,主节点宕机后通过选举产生新主机;提高系统健壮性; (7个选举节点上限)
  • 3:读写分离,负载均衡,提高系统性能;
  • 4:生产环境推荐的部署模式;

(2):可复制集搭建过程:

  • 1:安装好3个以上节点的mongoDB;
  • 2:配置mongodb.conf,增加跟复制相关的配置如下:
replication:
     replSetName: rs1 //集群名称
     oplogSizeMB: 50 //oplog集合大小
  • 3:在primary节点上运行可复制集的初始化命令,初始化可复制集,命令如下:
    //复制集初始化,在主节点上执行,ip禁止使用localhost
rs.initiate({
_id: "rs1",
version: 1,
members: [{ _id: 0, host : "192.168.1.142:27017" }]});
rs.add("192.168.1.142:27018");//有几个节点就执行几次方法
rs.add("192.168.1.142:27019");//有几个节点就执行几次方法
  • 4:在每个节点运行rs.status()或rs.isMaster()命令查看复制集状态;

(3):可复制集架构及原理
在这里插入图片描述
oplog(操作日志): 保存操作记录、时间戳。

数据同步: 从节点与主节点保持长轮询;
1.从节点查询本机oplog最新时间戳;
2.查询主节点oplog晚
于此时间戳的所有文档;
3.加载这些文档,并根据log执行写操作;

心跳机制: 成员之间会每2s 进行一次心跳检测(ping操作),发现故障后进行选举和故障转移;

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

   MongoDB复制集里Primary节点是不固定的,不固定的,不固定的!所以生产环境千万不要直连Primary,千万不要直连Primary,千万不要直连Primary!

具体如何连接:

Java原生驱动开发:
List<ServerAddress> asList = Arrays.asList(
new ServerAddress("192.168.1.142", 27018),
new ServerAddress("192.168.1.142", 27017),
new ServerAddress("192.168.1.142", 27019));
client = new MongoClient(asList);

或者Spring配置开发:

扫描二维码关注公众号,回复: 10753365 查看本文章
<mongo:mongo-client replica-
set="192.168.1.142:27017,192.168.1.142:27018,192.168.1.142:27019">
</mongo:mongo-client>

(二)分片集群

   分片是把大型数据集进行分区成更小的可管理的片,这些数据片分散到不同的mongoDB节点,这些节点组成了分片集群。

为什么要用分片集群?

  • 数据海量增长,需要更大的读写吞吐量
  • 单台服务器内存、 cpu等资源是有瓶颈的

(1):mongoDB分片集群推荐的模式

   分片集合,它是一种基于分片键的逻辑对文档进行分组,分片键的选择对分片非常重要,分片键一旦确定,mongoDB对数据的分片对应用是透明的;
在这里插入图片描述
(2):分片集群架构图与组件
在这里插入图片描述
分片:在集群中唯一存储数据的位置,可以是单个mongo服
务器,也可以是可复制集,每个分区上存储部分数据。生产
环境推荐使用可复制集;

mongos路由:由于分片之存储部分数据,需要mongos路
由将读写操作路由到对应的分区上;mongos提供了单点连接
集群的方式,轻量级、非持久化所以通常mongos和应用部署
在同一台服务器上;

配置服务器:存储集群的元数据,元数据包括:数据库、集
合、分片的范围位置以及跨片数据分割和迁移的日志信息;
mongos启动时会从配置服务器读取元数据信息在内存中;配
置服务器最低3台;

(3):分片搭建过程
在这里插入图片描述
配置步骤:

1: 分片服务器配置:给27020、 27021以及复制集(27017、 27018、 27019)的配置文件增加:

sharding:
    clusterRole: shardsvr

2:config服务器配置:给复制集(27022、 27023、 27024)的 配置文件增加:

sharding:
    clusterRole: configsvr

3:启动mongos路由如下:

./mongos --configdb
shardingConfig/192.168.1.142:27022,192.168.1.142:27023,
192.168.1.142:27024 --port 27025 --
logpath=/usr/local/apache/mongoDB/sharding/rounter/
mongodb-rounter1/logs/mongodb.log

分片注意点:

  • 热点:某些分片键会导致所有的读或者写请求都操作在单个数据块或者分片上,导致单个分片服务器严重不堪重负。自增长的分片键容易导致写热点问题;
  • 不可分割数据块:过于粗粒度的分片键可能导致许多文档使用相同的分片键,这意味着这些文档不能被分割为多个数据块,限制了mongoDB均匀分布数据的能力;
  • 查询障碍:分片键与查询没有关联,造成糟糕的查询性能。

建议:

  • 不要使用自增长的字段作为分片键,避免热点问题;
  • 不能使用粗粒度的分片键,避免数据块无法分割;
  • 不能使用完全随机的分片键值,造成查询性能低下;
  • 使用与常用查询相关的字段作为分片键,而且包含唯一字段(如业务主键,id等);
  • 索引对于分区同样重要,每个分片集合上要有同样的索引,分片键默认成为索引;分片集合只允许在id和分片键上创建唯一索引;
发布了246 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41987908/article/details/105257928