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 ...
随机推荐
- Blog上一页和下一页的功能
博客上一页和下一页的功能 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Sublime text找不到.so文件
在使用Sublime text打开一个android项目的时候,你会发现找不到.so文件. 解决方法: 点击Sublime text的Preferences,然后点击Settings,这时候出现设置的 ...
- mysql delete 多表
DELETE u.*,acu.*,alu.* FROM user u, accountuser acu ,algouser alu WHERE u.userId=11 and acu.userID=1 ...
- work_log
机房搬迁 1. 虚拟机-à实体机 2. ldap 服务器 3. 考勤数据服务器 4. glpi 权限管理. 5. 备份脚本. 6. 试验jira重新启动. Luke--- 1,报价文档,相关技术者,技 ...
- python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间
一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...
- Redis几个认识误区(转)
add by zhj: 文章很老了,2010年的,注意,下面几点是作者认为的误区 原文:http://timyang.net/data/redis-misunderstanding/ 前几天微博发生了 ...
- python通过原生sql查询数据库(共享类库)
#!/usr/bin/python # -*- coding: UTF-8 -*- """DB共享类库""" # 使用此类,先实例化一个Da ...
- 002-主流区块链技术特点及Hyperledger Fabric V0.6版本特点
一.主流区块链技术特点 二.HyperLedger子项目 三.Hyperledger fabric架构 V0.6逻辑架构: V0.6区块链网络 对应的0.6版本的运行时架构: 0.6版本的架构特点是: ...
- node.js---sails项目开发(1)
1.安装Node.js和npm---这里就做介绍啦! 2.需要全局下安装Sails sudo npm install sails -g 3. 在本地创建一个文件夹 mkdir ~/lsg/sails ...
- ubuntu下安装qwt
转载自:http://blog.chinaunix.net/uid-20717410-id-256767.html 相对于官方说明,特别适应于使用qt IDE开发者. //以下为引用: 虽然官网上说只 ...