# Mongodb分片集群 ## 介绍 副本集帮助我们解决读请求扩展、高可用等问题。随着业务场景进一 步增长,可能会出现以下问题: - 存储容量超出单机磁盘容量 - 活跃数据集超出单机内存容量:很多读请求需要从磁盘读取 - 写入量超出单机 IOPS 上限 解决此问题,有两个途径: 1.扩展服务器硬件性能,比如增加磁盘和内存。 2.增加服务器数量。 从成本和便捷性上考虑,肯定是第2个更加合适。 而Mongodb分片技术就是基于第2个途径来解决以上问题的。 MongoDB 分片集群(Sharded Cluster)是对数据进行水平扩展的一种方式,分片集群用来支持大数据集和高吞吐量的业务场景。 本质上,Mongodb的分片技术就是将数据按预定的算法均匀地分布到不同的节点上,类似于磁盘的raid5。只不过它的每个节点都是一组一组的副本集。 ## 架构 分片集群由3个组件组成: ![](./13.png) 1.路由mongos 数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。 2.配置服务器configserver 存储所有数据库元信息(路由、分片)的配置。 mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。 mongos第一次启动或者关掉重启就会从config server加载配置信息,以后如果配置服务器信息变化会通知到所有的mongos更新自己的状态,这样mongos就能继续准确路由。 在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失! 3.分片shard 存储用户数据,不同shard保存不同用户数据 存储了一个集合部分数据的MongoDB实例,每个分片是单独的mongodb服务或者副本集,在生产环境中,所有的分片都应该是副本集 ## 搭建 ![](./14.png) 1.机器规划 | 节点名称 | 主机名 | IP地址 | 角色 | | :---- | :---- | :---- | :---- | | 节点1 | centos8 | 192.168.195.105 | mongos、config server、shard1主节点、shard2从节点、shard3从节点 | | 节点2 | centos8-1 | 192.168.195.106 | mongos、 config server、shard1从节点、shard2从节点、shard3主节点 | | 节点3 | centos8-2 | 192.168.195.107 | mongos、 config server、shard1从节点、shard2主节点、shard3从节点 | 2.端口划分 | 角色 | 端口 | | :---- | :---- | | mongos | 20000 | | config server | 21000 | | shard1 | 27001 | | shard2 | 27002 | | shard3 | 27003 | 3.准备工作 三个节点分别执行 ```bash # 修改各自的主机名 sudo hostnamectl set-hostname centos8 sudo hostnamectl set-hostname centos8-1 sudo hostnamectl set-hostname centos8-2 # 修改hosts文件,每台加入以下全部内容 cat >> /etc/hosts < /usr/local/mongodb/conf/keyfile chmod 400 /usr/local/mongodb/conf/keyfile chown mongodb /usr/local/mongodb/conf/keyfile ``` 将keyfile拷贝到另外两台机器 ```bash scp /usr/local/mongodb/conf/keyfile centos8-1:/usr/local/mongodb/conf/keyfile scp /usr/local/mongodb/conf/keyfile centos8-2:/usr/local/mongodb/conf/keyfile ``` 节点2和节点3上,更改keyfile权限 ```bash chmod 400 /usr/local/mongodb/conf/keyfile chown mongodb /usr/local/mongodb/conf/keyfile ``` 编辑配置文件(全部三个节点,操作一样) ```bash cd /usr/local/mongodb/conf ##将所有配置security那部分配置前面的#删除掉 sed -i -e 's/#security/security/' -e 's/#keyFile/keyFile/' *.conf ``` 重启所有服务(全部三个节点,操作一样) ```bash for s in configsvr shard1 shard2 shard3 mongos ; do systemctl restart $s; done ``` 测试 ```bash use admin db.auth("root","aminglinux.com") use testdb sh.enableSharding("testdb") ##指定要分片的数据库 sh.shardCollection("testdb.table1", {id: "hashed"} ) ##指定数据库里需要分片的集合和片键 for (var i = 1; i <= 10000; i++) db.table1.insert({id:i*123,uid:i}) ##插入测试数据 db.table1.stats() ##查看table1状态 ```