OpenStack Ceilometer -- 后台数据存储优化之MongoDB的分片存储设置
https://xiaofandh12.github.io/Mongo-Shard
关于MongoDB
MongoDB中的概念与关系型数据库之间的对应:
- Database --> Database
- Collection --> Table
- Document --> Row
MongoDB相较于关系型数据库的优势:
- 简化关系型数据库复杂的关联问题
- 摆脱关系模型里面的强一致性限制
- MongoDB可以做到水平扩展和高可用
学习MongoDB有几个比较重要的方面:
- CRUD操作
- 聚合(Aggregation)操作
- 索引(Indexs)
- 存储引擎(Storage)
- 复制集(Replication)
- 分片(Sharding)
- 各种命令
MongoDB的部署
yum info mongo-10gen查看yum源中是否包含MongoDB的相关资源。vi /etc/yum.repos.d/10gen.repo添加yum源,若已有则不添加。[10gen]name=10gen Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64gpgcheck=0
yum info mongo-10gen-server,配置好yum源之后,查看yum源中是否包含MongoDB的服务器包的信息。安装MongoDB的服务器端和客户端工具:
yum install mongo-10gen-serveryum install mongo-10gen
根据需要修改
/etc/mongod.conf,启动MongoDB:service mongod start。
MongoDB的简单操作
连接MongoDB
相关操作如下:
[root@node-51 ~]# mongo --host hostIP/hostName --port portNummongos> show dbsadmin *GBceilometer *GBconfig *GBmongos> use ceilometermongos> show collectionsmeterprojectresourcesystem.indexessystem.usersuser
查询meter中所有的数据
相关操作如下:
mongos> db.meter.find()mongos> db.meter.find().count()
查询meter中所有的counter_name
相关操作如下:
mongos> db.meter.distinct("counter_name")
查询meter中各counter_name有多少条记录
相关操作如下:
mongos> db.meter.aggregate([{$group: {_id: "$counter_name",count: {$sum:1}}},{ $match: { count: { $gt: 1 } } }])
我们一般对SQL型的数据库比较熟,因此对一些复杂的查询我们可以用SQL的思维来思考,再到页面SQL to Aggregation Mapping Chart中去寻找对应的MongoDB的查询方式
查询counter_name为hardware.memory.total时,resource_id分别为什么
相关操作如下:
mongos> db.meter.aggregate([{$match: {counter_name: "hardware.memory.total"}},{$group: {_id: {counter_name: "$counter_name",resource_id: "$resource_id"}}}])
分片与复制集(Sharding与Replication)
一个完整的数据库可以备份为多份,原始的数据库和备份的数据库就组成了一个复制集,由此可以提高容错性。
一个完整的数据库的数据可以进行分片,通过分片可以把数据库中的完整数据分为多份分别存储在多台机器中,由此可以提高吞吐量。
分片和复制集是分开的两个功能,可以只做分片,也可以只做复制集。
如果既有分片又有复制集的话,那么同一个分片组成的集合就是一个复制集,如一个数据库分为两片shard1、shard2,可以再分别对shard1、shard2做两个复制shard1_1、shard1_2、shard2_1、shard2_2,那么shard1、shar1_1、shard1_2组成一个复制集,shard2、shard2_1、shard2_2组成另一个复制集。
MongoDB的每一个分片或复制集中的分片都可以不存储在同一个机器上,只要指定好IP地址和端口号即可。
本文并不讨论复制集的问题。
MongoDB的分片,分为两片,两个分片在同一台物理机上

node-51为一台物理机,它的IP地址为172.31.2.51。
图中各服务所在IP和端口号,对应过来如下:
- shard1 --> 172.31.2.51:20000
- shard2 --> 172.31.2.51:20001
- config --> 172.31.2.51:30000
- mongos --> 172.31.2.51:27017
client通过mongos(172.31.2.51:27017)即可对数据库进行读写。
新建数据目录和日志目录
[root@node-51 ~]# mkdir -p /data/shard/s0[root@node-51 ~]# mkdir -p /data/shard/s1[root@node-51 ~]# mkdir -p /data/shard/log
配置shard server
[root@node-51 ~]# /usr/bin/mongod --shardsvr --port 20000 --dbpath /data/shard/s0 --fork --logpath /data/shard/log/s0.log --directoryperdb[root@node-51 ~]# /usr/bin/mongod --shardsvr --port 20001 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb
配置config server和route server
[root@node-51 ~]# mkdir -p /data/shard/config[root@node-51 ~]# /usr/bin/mongod --configsvr --port 30000 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb[root@node-51 ~]# /usr/bin/mongos --port 27017 --configdb 172.31.2.51:30000 --fork --logpath /data/shard/log/route.log --chunkSize 1
admin数据库和ceilometer数据库配置
[root@node-51 ~]# mongo admin --host 172.31.2.51 --port 27017mongos> use adminmongos> db.runCommand({addshard:'172.31.2.51:20000'})mongos> db.runCommand({addshard:'172.31.2.51:20001'})mongos> db.runCommand({enablesharding:'ceilometer'})mongos> db.runCommand({shardcollecton:'ceilometer.meter',key:{counter_name:1}})mongos> use ceilometermongos> db.addUser("ceilometer","ceilometer")mongos> db.meter.stats()
在这里ceilometer是一个新建的数据库,OpenStack模块的openstack-ceilometer需要连接MongoDB中的ceilometer数据库,而openstack-ceilomter在连接MongoDB中的ceilometer数据库时,使用的是用户名:ceilometer,密码:ceilometer来连接的(再安装openstack-ceilometer时设置的),所以有了db.addUser("ceilometer","ceilomter")。
修改ceilometer.conf,并重启ceilometer服务
将ceilometer.conf中的connection改为如下:
connection=mongodb://ceilometer:ceilometer@172.31.2.51:27017/ceilometer
重启ceilometer服务:
[root@node-51 ~]# service openstack-ceilometer-alarm-evalutor restart[root@node-51 ~]# service openstack-ceilometer-alarm-notifier restart[root@node-51 ~]# service openstack-ceilometer-api restart[root@node-51 ~]# service openstack-ceilometer-central restart[root@node-51 ~]# service openstack-ceilometer-collector restart
Mongodb分片后的开机启动设置
现在有一个问题是,设置好分片重启机器后,又得重新执行分片的命令。目前解决的办法是在/etc/rc.d/rc.local/中新增命令。
关闭mongod开机启动:
[root@node-51 ~]# chkconfig --list | grep mongod --> 可以查出mongod在哪几个运行级别上运行了[root@node-51 ~]# chkconfig --levels 2345 mongod off
在文件/etc/rc.d/rc.local中,增加下述内容:
/usr/bin/mongod --shardsvr --port 20000 --dbpath /data/shard/s0 --fork --logpath /data/shard/log/s0.log --directoryperdb/usr/bin/mongod --shardsvr --port 20001 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb/usr/bin/mongod --configsvr --port 30000 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb/usr/bin/mongos --port 27017 --configdb 172.31.2.51:30000 --fork --logpath /data/shard/log/route.log --chunkSize 1service openstack-ceilometer-alarm-evalutor restartservice openstack-ceilometer-alarm-notifier restartservice openstack-ceilometer-api restartservice openstack-ceilometer-central restartservice openstack-ceilometer-collector restart
这个问题没算完全解决,有空再看看《鸟哥的linux私房菜》第18章 认识系统服务(daemons)和第20章 启动流程、模块管理与Loader。
MongoDB的分片,分为三片,三个分片在不同的物理机上
这小节我会介绍一下把MongoDB中的数据库分为三片,并且把三个分片存储在不同物理机上的方法。

mongos1,mongos2,mongos3代表三台物理机,它们的IP地址为:
- mongos1 --> 172.31.2.135
- mongos2 --> 172.31.2.136
- mongos3 --> 172.31.2.137
图中各服务所在IP和端口号,对应过来如下:
- shard1 --> 172.31.2.135:27018
- shard2 --> 172.31.2.136:27018
- shard3 --> 172.31.2.137:27018
- config1 --> 172.31.2.135:27019
- mongos1 --> 172.31.2.135:27017
client通过连接mongos1(172.31.2.135:27017)即可对数据库进行读写。
下面详细介绍一下整个过程:
安装好操作系统,安装好MongoDB,重要提醒:关闭iptables,seLinux(因为这个我中午都没睡成午觉...)
service iptables stopsetenforce 0
在mongos1, mongos2, mongos3中新建目录
[root@mongos1 ~]# mkdir -p /data/shard/s1[root@mongos1 ~]# mkdir -p /data/shard/log[root@mongos1 ~]# mkdir -p /data/shard/config[root@mongos2 ~]# mkdir -p /data/shard/s2[root@mongos2 ~]# mkdir -p /data/shard/log[root@mongos3 ~]# mkdir -p /data/shard/s3[root@mongos3 ~]# mkdir -p /data/shard/log
在mongos1, mongos2, mongos3中配置shard server
[root@mongos1 ~]# mongod --shardsvr --port 27018 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb[root@mongos2 ~]# mongod --shardsvr --port 27018 --dbpath /data/shard/s2 --fork --logpath /data/shard/log/s2.log --directoryperdb[root@mongos3 ~]# mongod --shardsvr --port 27018 --dbpath /data/shard/s3 --fork --logpath /data/shard/log/s3.log --directoryperdb
在mongos1中配置config server
[root@mongos1 ~]# mongod --configsvr --port 27019 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb
在mongos1中配置route server
[root@mongos1 ~]# mongos --port 27017 --configdb 172.31.2.135:27019 --fork --logpath /data/shard/log/route.log --chunkSize 1
在mongos1中配置admin数据库和ceilometer数据库
[root@mongos1 ~]# mongo admin --host 172.31.2.135 --port 27017mongos> db.runCommand({addshard:'172.31.2.135:27018'})mongos> db.runCommand({addshard:'172.31.2.136:27018'})mongos> db.runCommand({addshard:'172.31.2.137:27018'})mongos> db.runCommand({enablesharding:'ceilometer'})mongos> db.runCommand({shardCollection:'ceilometer.meter',key:{counter_name:1}})mongos> use ceilometermongos> db.addUser("ceilometer", "ceilometer")mongos> db.meter.stats()mongos> sh.status()
修改ceilometer.conf,并重启ceilometer服务
将ceilometer.conf中的connection改为如下:
connection=mongodb://ceilometer:ceilometer@172.31.2.135:27017/ceilometer
重启ceilometer服务:
[root@node-51 ~]# service openstack-ceilometer-alarm-evalutor restart[root@node-51 ~]# service openstack-ceilometer-alarm-notifier restart[root@node-51 ~]# service openstack-ceilometer-api restart[root@node-51 ~]# service openstack-ceilometer-central restart[root@node-51 ~]# service openstack-ceilometer-collector restart
可以再到mongos1中去查看数据量db.meter.find().count(),每隔一段时间执行一次,数字是不是越来越大。
MongoDB:Expire Data from Collections by Setting TTL
当MongoDB数据库中的数据量变得很大时,查询的速度也会随之下降,定期的删除或转存数据库中的数据就成为了一个很重要的需求了。
在MongoDB 2.2中就引进了一个功能,即Expire Data from Collections by Setting TTL,有了这个功能我们只要做一个简单的设置就可以定期的删除历史数据了。
在Ceilometer的配置文件中,设置了ttl的相关参数后,Ceiloemter的后台数据库就会去自动清理数据库中的历史数据,而后台数据库不论是MongoDB还是关系型数据库都可以,当后台是MongoDB时就正是利用了MongoDB 2.2中引入的Expire Data from Collections by Setting TTL这项功能。
Ceilometer中新增自动清理数据库中的历史数据的blueprint页面为:Database data TTL,review页面为:Database data TTL Review
OpenStack Ceilometer -- 后台数据存储优化之MongoDB的分片存储设置的更多相关文章
- MongoDB 搭建分片集群
在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(S ...
- MongoDB之分片集群(Sharding)
MongoDB之分片集群(Sharding) 一.基本概念 分片(sharding)是一个通过多台机器分配数据的方法.MongoDB使用分片支持大数据集和高吞吐量的操作.大数据集和高吞吐量的数据库系统 ...
- 树后台数据存储(採用webmethod)
树后台数据存储 关于后台数据存储将集中在此篇解说 /* *作者:方浩然 *日期:2015-05-26 *版本号:1.0 */ using System; using System.Collection ...
- Redis数据存储优化机制(转)
原文:Redis学习笔记4--Redis数据存储优化机制 1.zipmap优化hash: 前面谈到将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象.省内存的原因是新建一个h ...
- Openstack Ceilometer监控项扩展
Openstack ceilometer主要用于监控虚拟机.服务(glance.image.network等)和事件.虚拟机的监控项主要包括CPU.磁盘.网络.instance.本文在现有监控项的基础 ...
- 中国铁路基于Intel架构超大规模OpenStack行业云的性能优化研究
1. 项目简介 铁路作为一种大众化的交通工具和非常重要的货物运输方式,其业务规模庞大.覆盖全国.服务全国各族人民.铁路面向公众提供的服务业务,主要是客运和货运两大类,且每年365天.每天7*24小时连 ...
- Kudu – 在快数据上的进行快分析的存储
转自: http://www.tuicool.com/articles/nmYf2uf Cloudera Impala Kudu – 在快数据上的进行快分析的存储 Kudu,对应中文的含义应该 ...
- <转>Openstack Ceilometer监控项扩展
Openstack ceilometer主要用于监控虚拟机.服务(glance.image.network等)和事件.虚拟机的监控项主要包含CPU.磁盘.网络.instance.本文在现有监控项的基础 ...
- <转>Openstack ceilometer 宿主机监控模块扩展
<Openstack ceilometer监控项扩展>( http://eccp.csdb.cn/blog/?p=352 )主要介绍了对虚拟机监控项扩展, 比較简单.怎样在ceilomet ...
随机推荐
- ZOJ 3490 String Successor(模拟)
Time Limit: 2 Seconds Memory Limit: 65536 KB The successor to a string can be calculated by applying ...
- java编程思想 英文版 打卡
计划 2017.3.1 购入 准备花一个月的时间阅读完, 共1500页,最后两章是GUI的内容,只需要到1300页就行了 目的有三: 熟悉java基础 提升英语阅读能力,好久没读英文书籍了 补补oop ...
- 《挑战程序设计竞赛》2.3 动态规划-基础 POJ3176 2229 2385 3616 3280
POJ3176 Cow Bowling 题意 输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线. 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个 ...
- spring 攻略
1.5 指定Bean引用 为了Bean之间相互访问,在Bean配置文件中通过<ref>元素为Bean属性或构造程序参数指定Bean引用. <property name="p ...
- sql语句(mysql中json_contains、json_array的使用)
https://blog.csdn.net/qq_35952946/article/details/79131488 https://www.jianshu.com/p/455d3d4922e1 1. ...
- 如何编译部署 UIKit 离线文档?
如何编译部署 UIKit 离线文档? Whis is UIKit? Note:部署在 Windows 系统会出现路径错误情况,这里采用在 Debian 系统上进行编译和部署. 1. 安装一些前置工具 ...
- unity里无损实现制定物体bloom
虽然标题是实现hdr+bloom,但实际感觉更像是控制单个物体bloom https://blog.csdn.net/zsy654321/article/details/80682651
- 一.数据库连接对象connection
1.python 3.5,需要把MySQLdb换成pymysql
- MongoDB的Python客户端PyMongo(转)
原文:https://serholiu.com/python-mongodb 这几天在学习Python Web开发,于是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样的好玩 ...
- 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:
我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...