设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 844|回复: 0

[经验分享] OpenStack Ceilometer

[复制链接]
累计签到:4 天
连续签到:1 天
发表于 2017-6-27 12:42:30 | 显示全部楼层 |阅读模式
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 Repository
    • baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
    • gpgcheck=0

  •   yum info mongo-10gen-server,配置好yum源之后,查看yum源中是否包含MongoDB的服务器包的信息。
  •   安装MongoDB的服务器端和客户端工具:

    • yum install mongo-10gen-server
    • yum install mongo-10gen

  •   根据需要修改/etc/mongod.conf,启动MongoDB: service mongod start。
MongoDB的简单操作
连接MongoDB

  •   相关操作如下:

    • [iyunv@node-51 ~]# mongo --host hostIP/hostName --port portNum
    • mongos> show dbs
    • admin *GB
    • ceilometer *GB
    • config *GB
    • mongos> use ceilometer
    • mongos> show collections
    • meter
    • project
    • resource
    • system.indexes
    • system.users
    • user

查询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)即可对数据库进行读写。

  •   新建数据目录和日志目录

    • [iyunv@node-51 ~]# mkdir -p /data/shard/s0
    • [iyunv@node-51 ~]# mkdir -p /data/shard/s1
    • [iyunv@node-51 ~]# mkdir -p /data/shard/log

  •   配置shard server

    • [iyunv@node-51 ~]# /usr/bin/mongod --shardsvr --port 20000 --dbpath /data/shard/s0 --fork --logpath /data/shard/log/s0.log --directoryperdb
    • [iyunv@node-51 ~]# /usr/bin/mongod --shardsvr --port 20001 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb

  •   配置config server和route server

    • [iyunv@node-51 ~]# mkdir -p /data/shard/config
    • [iyunv@node-51 ~]# /usr/bin/mongod --configsvr --port 30000 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb
    • [iyunv@node-51 ~]# /usr/bin/mongos --port 27017 --configdb 172.31.2.51:30000 --fork --logpath /data/shard/log/route.log --chunkSize 1

  •   admin数据库和ceilometer数据库配置

    • [iyunv@node-51 ~]# mongo admin --host 172.31.2.51 --port 27017
    • mongos> use admin
    • mongos> 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 ceilometer
    • mongos> 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服务:

    • [iyunv@node-51 ~]# service openstack-ceilometer-alarm-evalutor restart
    • [iyunv@node-51 ~]# service openstack-ceilometer-alarm-notifier restart
    • [iyunv@node-51 ~]# service openstack-ceilometer-api restart
    • [iyunv@node-51 ~]# service openstack-ceilometer-central restart
    • [iyunv@node-51 ~]# service openstack-ceilometer-collector restart

Mongodb分片后的开机启动设置
  现在有一个问题是,设置好分片重启机器后,又得重新执行分片的命令。目前解决的办法是在/etc/rc.d/rc.local/中新增命令。

  •   关闭mongod开机启动:

    • [iyunv@node-51 ~]# chkconfig --list | grep mongod --> 可以查出mongod在哪几个运行级别上运行了
    • [iyunv@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 1

    • service openstack-ceilometer-alarm-evalutor restart
    • service openstack-ceilometer-alarm-notifier restart
    • service openstack-ceilometer-api restart
    • service openstack-ceilometer-central restart
    • service 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 stop
    • setenforce 0

  •   在mongos1, mongos2, mongos3中新建目录

    • [iyunv@mongos1 ~]# mkdir -p /data/shard/s1
    • [iyunv@mongos1 ~]# mkdir -p /data/shard/log
    • [iyunv@mongos1 ~]# mkdir -p /data/shard/config

    • [iyunv@mongos2 ~]# mkdir -p /data/shard/s2
    • [iyunv@mongos2 ~]# mkdir -p /data/shard/log

    • [iyunv@mongos3 ~]# mkdir -p /data/shard/s3
    • [iyunv@mongos3 ~]# mkdir -p /data/shard/log

  •   在mongos1, mongos2, mongos3中配置shard server

    • [iyunv@mongos1 ~]# mongod --shardsvr --port 27018 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb

    • [iyunv@mongos2 ~]# mongod --shardsvr --port 27018 --dbpath /data/shard/s2 --fork --logpath /data/shard/log/s2.log --directoryperdb

    • [iyunv@mongos3 ~]# mongod --shardsvr --port 27018 --dbpath /data/shard/s3 --fork --logpath /data/shard/log/s3.log --directoryperdb

  •   在mongos1中配置config server

    • [iyunv@mongos1 ~]# mongod --configsvr --port 27019 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb

  •   在mongos1中配置route server

    • [iyunv@mongos1 ~]# mongos --port 27017 --configdb 172.31.2.135:27019 --fork --logpath /data/shard/log/route.log --chunkSize 1

  •   在mongos1中配置admin数据库和ceilometer数据库

    • [iyunv@mongos1 ~]# mongo admin --host 172.31.2.135 --port 27017
    • mongos> 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 ceilometer
    • mongos> 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服务:

    • [iyunv@node-51 ~]# service openstack-ceilometer-alarm-evalutor restart
    • [iyunv@node-51 ~]# service openstack-ceilometer-alarm-notifier restart
    • [iyunv@node-51 ~]# service openstack-ceilometer-api restart
    • [iyunv@node-51 ~]# service openstack-ceilometer-central restart
    • [iyunv@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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388632-1-1.html 上篇帖子: 深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(二) 下篇帖子: OpenStack部署应用第一篇:认证服务keystone安装(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表