MongoDB 3.4 中文社区
http://www.mongoing.com/docs/sharding.html
1 什么是分片技术
分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法。尽管分片起源于关系型数据库分区,但MongoDB分片完全又是另一回事。和MySQL分区方案相比,MongoDB的最大区别在于它几乎能自动完成所有事情,只要告诉MongoDB要分配数据,它就能自动维护数据在不同服务器之间的均衡。
1.1 分片集群构造
- mongos :mongos充当查询路由器,在客户端应用程序和分片群集之间提供接口。
- config server:配置服务器存储集群的元数据和配置设置。从MongoDB 3.4开始,配置服务器必须部署为副本集(CSRS)。
- shard:真正的数据存储位置,以chunk为单位存数据,每个shard都可以部署为副本集。
Mongos本身并不持久化数据,Sharded cluster所有的元数据都会存储到Config Server,而用户的数据会议分散存储到各个shard。Mongos启动后,会从配置服务器加载元数据,开始提供服务,将用户的请求正确路由到对应的碎片。
Mongos的路由功能
- 当数据写入时,MongoDB Cluster根据分片键设计写入数据。
- 当外部语句发起数据查询时,MongoDB根据数据分布自动路由至指定节点返回数据。
1.2 使用chunk进行数据分区
MongoDB使用与集合关联的shard key将数据划分为chunk。一个chunk包括分片数据的子集的。每个chunk都有一个基于shard key的上下限范围。
当MongoDB超出配置的chunk大小时,MongoDB会对其进行拆分。插入和更新都可以触发块拆分。
chunk可以代表的最小范围是单个唯一的分片shard key。仅包含具有单个分片shard key的文档的块无法拆分。
1.3 chunk的大小
MongoDB中的默认chunk大小为64 MB。可以增加或减少chunk的大小。考虑更改默认块大小的含义:
- 小的chunk导致更均匀的数据分发,但代价是迁移更加频繁。这会在查询路由(mongos)层产生费用。
- 大得到chunk导致更少的迁移。从网络的角度以及在查询路由层的内部开销方面,这都是更有效的。但是,这些效率是以潜在的数据分布不均为代价的。
- chunk的大小影响最大数量的文档每块要迁移。
- 分片现有集合时,chunk的大小会影响最大集合大小。分片后,chunk大小不会限制集合大小。
对于许多部署而言,避免以频繁分散的数据集为代价,避免频繁的迁移和潜在的虚假迁移。
1.4 chunk分割
拆分是防止chunk增长太大的过程。当某个chunk增长到超过指定的块大小时,或者如果该chunk中的文档数超过了每块要迁移的最大文档数 ,MongoDB将根据该chunk所代表的shard key值拆分该块。必要时可以将一个大的chunk拆分为多个。插入和更新可能会触发拆分。拆分是有效的元数据更改。
1.5 balancing
平衡器是管理数据块迁移的后台进程。如果最大和最小碎片之间的块数差异超过迁移阈值,则平衡器将开始在整个群集中迁移块,以确保数据的均匀分布。
2 环境部署(3台机器全部执行)
2.1 MongoDB版本 4.0.16
MongoDB下载地址
官方:
https://www.mongodb.com/download-center#community
百度网盘:
链接:https://pan.baidu.com/s/1gwa6OHJGxoSLDNrpNviuKg 密码:u00s
[root@node3 ~]# mongod -version
db version v4.0.16
git version: 2a5433168a53044cb6b4fa8083e4cfd7ba142221
allocator: tcmalloc
modules: none
build environment:
distarch: x86_64
target_arch: x86_64
2.2 主机分配
node1:192.168.36.150 | node2:192.168.36.151 | node3:192.168.36.152 |
---|---|---|
shard1 主节点 | shard1 副本 | shard1 仲裁 |
shard2 仲裁 | shard2 主节点 | shard2 副本 |
shard3 副本 | shard3 仲裁 | shard3 主节点 |
2.3 端口分配
mongos | config | shard1 | shard2 | shard3 |
---|---|---|---|---|
20000 | 21000 | 27001 | 27002 | 27003 |
2.4 MongoDB安装
2.4.1yum安装(不推荐)
yum不推荐的原因:
- 下载太慢
- yum安装的mongodb全用默认路径,按需求配置目录时太麻烦
配置yum源
cat /etc/yum.repos.d/mongodb-org-4.2.repo
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
安装
yum install -y mongodb-org
2.4.2源码安装
源码安装非常简单,只需要解压就可以了,tar包提只供了mongodb的命令,其他的需要自己手动配置
[root@node1 tmp]# tar -zxvf mongodb-linux-x86_64-4.0.16.tgz -C /opt
[root@node1 opt]# mv mongodb-linux-x86_64-4.0.16/ mongodb
2.5 配置环境变量
[root@node1 opt]# tail -2 /etc/profile
export MONGODB_HOME=/opt/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
[root@node1 opt]# source /etc/profile
2.6 创建文件路径
配置文件路径:/etc/mongodb
数据存放路径:/data/mongodb
日志路径:/var/log/mongodb
pid路径:/var/run/mongodb
mkdir /etc/mongodb/
mkdir -p /data/mongodb/mongos/log
mkdir -p /data/mongodb/config/data
mkdir -p /data/mongodb/config/log
mkdir -p /data/mongodb/shard1/data
mkdir -p /data/mongodb/shard1/log
mkdir -p /data/mongodb/shard2/data
mkdir -p /data/mongodb/shard2/log
mkdir -p /data/mongodb/shard3/data
mkdir -p /data/mongodb/shard3/log
mkdir -p /var/log/mongodb
mkdir -p /var/run/mongodb
2.7 config server集群配置
配置config.conf
配置另外两台时注意修改ip
[root@node1 mongodb]# pwd
/etc/mongodb
[root@node1 mongodb]# cat config.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/config.log
storage:
#dbPath: /data/mongodb
dbPath: /data/mongodb/config/data
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/config.pid # location of pidfile
net:
port: