一, 关于分片
1, 什么是分片
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力, 大的查询会将单机的 CPU 耗尽, 大的数据量对单机的存储压力比较大, 最终会耗尽系统的内存而将压力转移到磁盘 IO 上.
MongoDB 分片是使用多个服务器存储数据的方法, 以支持巨大的数据存储和对数据进行操作. 分片技术可以满足 MongoDB 数据量大量增长的需求, 当一台 MongoDB 服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时, 我们就可以通过在多台服务器上分割数据, 使得数据库系统能存储和处理更多的数据.
2,MongoDB 分片优势
(1) 分配为应对高吞吐量与大数据量提供了方法.
(2) 使用分片减少了每个分片需要处理的请求数, 因此, 通过水平扩展, 群集可以提高自己的存储容量和吞吐量. 比如, 当插入一条数据时, 应用只需要访问存储这条数据的分片.
(3) 使用分片减少了每个分片存储的数据.
(4) 分片的优势在提供类似线性增长的架构, 提高数据可用性, 提高大型数据库查询服务器的性能. 当 MongoDB 单点数据库服务器存储成为瓶颈, 单点数据库服务器的性能成为瓶颈或者需要部署大型应用以充分利用内存时, 可以使用分片技术. MongoDB 分片的结构如下:
3,MongoDB 分片群集的组成
MongoDB 分片群集主要有如下三个主要组件:
Shard: 分片服务器, 用于存储实际的数据块, 实际生产环境中一个 shard server 角色可由几台服务器组成一个 Replica Set 承担, 防止主机单点故障.
Config Server: 配置服务器, 存储了整个分片群集的配置信息, 其中包括 chunk 信息.
Router: 前端路由, 客户端由此接入, 且让整个集群看上去像一个单一数据库, 前端应用可以透明使用.
MongoDB 分片群集的组成如下图:
二, 简单部署 MongoDB 群集
系统环境:
1 台路由实列 (端口 27017)
1 台配置实列 (端口 37017)
2 台 Shard 实列 (端口 47017,47018)
1, 源码编译安装 MongoDB3.2
- yum install openssl-devel -y // 安装依赖包
- tar zxvf MongoDB-Linux-x86_64-3.2.1.tgz -C /opt/ // 解压源码包
- mv MongoDB-Linux-x86_64-3.2.1/ /usr/local/MongoDB // 将源码包移动到本地安装软件目录
- mkdir -p /data/MongoDB/MongoDB{
- 1,2,3
- } // 创建多实列库
- mkdir /data/MongoDB/logs
- touch /data/MongoDB/logs/MongoDB{
- 1,2,3
- }.log // 创建对应的日志文件
- chmod -R 777 /data/MongoDB/logs/*.log // 提权
- ulimit -n 25000 // 设置每个进程可打开的文件数
- ulimit -u 25000 // 设置最大进程数
2, 部署配置服务器 (config server)
VIM mongodb1.conf
加入下列内容
- port=37017 // 配置服务器的端口号
- dbpath=/data/MongoDB/mongodb1 // 实列库的路径
- logpath=/data/MongoDB/logs/mongodb1.log // 日志路径
- logappend=true // 开启日志功能
- fork=true // 开启守护进程
- maxConns=5000 // 最大端口连接数量
- storageEngine=mmapv1 // 指定存储引擎
- configsvr=true // 开启配置服务功能
对配置服务器做优化:
某节点内存不足时, 从其他节点分配内存
- sysctl -w vm.zone_reclaim_mode=0
- echo never> /sys/kernel/mm/transparent_hugepage/enabled
- echo never> /sys/kernel/mm/transparent_hugepage/defrag
做对 MongoDB/bin 下的常用命令做一个软件链接
- ln -s /usr/local/MongoDB/bin/mongo /usr/bin/mongo
- ln -s /usr/local/MongoDB/bin/mongod /usr/bin/mongod
开启配置服务器的实列
mongod -f /usr/local/MongoDB/bin/mongodb1.conf
3, 部署分片服务器
- cp -p mongodb1.conf mongodb2.conf // 复制主配置文件对应第一台 shard 实列
- cp -p mongodb2.conf mongodb3.conf // 对应第二台实列
- vi mongodb2.conf // 修改对应的端口号和相应的路径
- mongod -f mongodb2.conf // 分别开启分片服务器实列
- mongod -f mongodb3.conf
4, 启动路由服务器
./mongos --port 27017 --fork --logpath=/usr/local/MongoDB/bin/route.log --configdb 192.168.80.100:37017 --chunkSize 1
5, 进入路由实例中启动分片服务器
- mongo // 进入实列, 默认端口 27017
- show dbs // 查看配置的大小
sh.status() // 查看分片状态, 没有分片服务器
- sh.addShard("192.168.80.100:47017") // 添加分片服务器
- sh.addShard("192.168.80.100:47018")
sh.status()
6, 验证数据分片功能
- use kgc
- for(var i=1;i<=50000;i++)db.users.insert({
- "id":i,"name":"jerry"+i
- }) // 插入数据
注意: ulimit 指定了每个进程的文件数量 25000, 因此要插入大于 25000 的数据才能体现出分片功能
- db.users.find().limit(5) // 查看是否创建成功
- sh.enableSharding("kgc") // 启用数据库分片
- sh.status()
- db.users.createIndex({
- "id":1
- }) // 创建索引
- sh.shardCollection("kgc.users",{
- "id":1
- }) // 对数据集合分片 id=n 就是数据以 n 为单位分块
- sh.status()
7, 分片管理
添加标签
- sh.addShardTag("shard0000","sales00")
- sh.addShardTag("shard0001","sales01")
连接配置服务器
- db.chunks.findOne() // 查看分块信息
- db.collections.find() // 查看分片集合信息
- db.databases.find() // 查看分片数据库信息
添加分片服务器
- mkdir -p /data/MongoDB/mongodb4
- touch /data/MongoDB/logs/mongodb4.log
- chmod -R 777 /data/MongoDB/logs/*.log
- cp -p mongodb3.conf mongodb4.conf
- vi mongodb4.conf
- mongod -f mongodb4.conf // 开启实例
- mongo // 进入前端路由服务器
- sh.addShard("192.168.80.100:47019") // 添加分片服务器
- sh.status() // 查看分片状态
删除分片节点
- use admin // 进入管理模块
- db.runCommand({
- "removeshard":"192.168.80.100:47019"
- })
来源: http://www.bubuko.com/infodetail-2930665.html