MongoDB与Cassandra的监控
由于Cassandra
数据库经常存在不稳定与报警的情况,为了弄清楚其真实原因,在Cassandra
中增加了一个监控,其技术栈为:
PacketBeat
:一个第三方的网络抓包工具,其兼容了各大数据库的网络协议ElasticSearch
:ES数据库Kibina
:基于ES的一个可视化图形展示系统
原理为:利用PacketBeat
监听网卡的数据包,进行解析之后将数据写入到ES
数据库中,然后通过Kibina
可视化的展示出来。
这样监控的好处是不影响数据库本身的性能,它是作为一个独立的监控存在,与数据库完全隔离开来,并且可以定制化的对数据库的各个维度进行分析。并且目前基于Cassandra
和MongoDB
的开源成熟监控工具并不多。
具体配置过程参照官网:https://www.elastic.co/guide/en/beats/packetbeat/current/packetbeat-getting-started.html
遇到的问题与解决
下面主要是具体实施过程中遇到的一些问题及解决方法。
问题一:没有数据
配置Packetbeat
开始运行之后,发现数据没有写到ES
中。
出现这样的问题的原因是,ES
配置文件里面设置成不允许自动创建索引,导致数据写不进去。
因此这里需要动态修改ES
集群的配置,命令如下:1
2
3
4
5
6PUT /_cluster/settings
{
"persistent": {
"action.auto_create_index":"true"
}
}
修改之后再运行程序,会发现ES
中终于有数据进来了。
问题二:莫名其妙的OOM
当终于看到数据后,会非常兴奋。可是用Packetbeat
来抓Cassandra
的数据包的时候,发现程序运行不到一分钟,packetbeat
进程和cassandra
进行都挂了。查看系统日志/var/log/message
之后发现由于packetbeat
程序占用了太大的内存,导致其它程序没有内存可以使用了,于是操作系统内核基于保护措施,把packetbeat
进程给Kill掉了。而Cassandra
进程是由于内存被它挤用了,内存不够导致Cassandra
挂了。
但是奇怪的是,同样的配置,用Packetbeat
来抓MongoDB
包的时候,没有出现Out of Memory
的错误。网上有一篇帖子说是由于滚雪球导致数据包指数级的增长,最终导致这个错误。
但是我这里仔细看了一下,Cassandra
数据库与ES
之间,不应该有滚雪球的抓包,于是我一个一个的过滤,最后终于发现是由于Cassandra
协议中有一类op
为RESULT
的数据包导致其程序不断占用内存增大的,最终被Kill了。因此在配置文件packetbeat.yml
中将这类包过滤掉,如下所示:
1 | packetbeat.protocols: |
问题三:Cassandra与MonogDB的不同
用PacketBeat
监控Cassandra
与MongoDB
还有一些地方稍有不同:
Cassandra
数据库是P2P完全对等的,因此该抓包程序需要在每一个部署有Cassandra
的物理机器上均运行。- 由于
MongoDB
的部署分为路由节点与数据节点,因此该抓包程序只需在部署有路由节点的物理机器上运行即可。
最终的效果
由于抓包得到的数据都存在ES
里面,最终想怎么展示或者怎么分析,那就很随意了,可以定制化制作一些Dashboard
什么的,下面是展示截图:
思考与感想
强烈安利ELK
,即:Elasticsearch
、Logstash
、Kibana
,这真的是非常成熟的集中式日志系统,非常方便。任何在线的实时的服务或者数据流,其所使用的技术系统是一整套,列举如下:
- 大数据分析的一整套:Spark、Hadoop、Hive、HBase、HDFS
- 大数据流式处理的一整套:Flink、Storm
- 大数据存储的一整套:Redis、MongoDB、Cassandra、Elasticsearch
- 消息中间件:Kafka
- 能力及服务的输出:Django、Gunicorn、Nginx
【版权声明】
本文首发于戚名钰的博客,欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:qimingyu.security@foxmail.com
欢迎关注我的微信公众号:科技锐新
本文永久链接:http://qimingyu.github.io/2018/05/30/利用Packetbeat监控Cassandra和MongoDB/