存储切换M3方式,强烈建议

夜莺在v3版本引入了m3作为后端存储,m3在uber声称存储了66亿监控指标,非常强悍,建议尝试

初期可以使用单机版m3db做测试,有了解之后上生产建议使用集群版。用了m3之后,原来的index模块和tsdb模块就可以不用了。m3相比原来的index+tsdb的方案,优劣势是什么?

优点:

  • 对硬盘IO要求没那么高了,普通机械硬盘也能抗比较大的量
  • 存原始数据,不降采样了,追问题的时候更方便,当然了,存储的数据时长就变短了,相同硬盘空间大小,比如原来rrd可以存1年的历史趋势数据,m3可能只能存1个月
  • 扩容非常方便,直接加m3dbnode即可,index+tsdb的方案使用migrate配置,扩容不易
  • 容灾更好了,可以设置3副本,如果集群部署了3台机器,挂掉一台机器完全没有影响
  • 索引避免了原来index+tsdb的单点容量问题,原来index虽然是可以部署为集群,但是集群里每个节点都是全量索引

劣势:

  • 硬盘空间占用大,毕竟存储原始数据嘛,一般生产环境建议存1个月,再久也尽量不要超过3个月,当然了,要监控的设备比较少,部署m3的机器硬盘又比较大,那另当别论
  • 内存占用比较多,一般配置是最近两个小时的数据要缓存在内存里,所以比较吃内存,好在内存现在也便宜了,一台机器动不动128G、256G的

通用改动

即不管是单机版m3还是集群版,对于n9e来说都要修改的一些配置。

修改 transfer 配置

  1. backend:
  2. datasource: "m3db" # 选择 m3db 为索引和存储源
  3. m3db:
  4. enabled: true # 开启 m3db
  5. name: "m3db"
  6. namespace: "test"
  7. seriesLimit: 0
  8. docsLimit: 0
  9. daysLimit: 7 # 查询时的最大时间限制
  10. # 读写数据时一致性检查的等级,请参考官方文档
  11. # https://m3db.github.io/m3/m3db/architecture/consistencylevels/
  12. writeConsistencyLevel: "majority" # one|majority|all
  13. readConsistencyLevel: "unstrict_majority" # one|unstrict_majority|majority|all
  14. config:
  15. service:
  16. # KV environment, zone, and service from which to write/read KV data (placement
  17. # and configuration). Leave these as the default values unless you know what
  18. # you're doing. 请与m3.dbnode 的配置保持一致
  19. env: default_env
  20. zone: embedded
  21. service: m3db
  22. # 以下是 etcd 的配置
  23. etcdClusters:
  24. - zone: embedded
  25. # 单机版的话,endpoints这部分一定要配置为127.0.0.1的
  26. endpoints:
  27. - 127.0.0.1:2379
  28. # 单机版不需要搞证书,单机版的etcd是内嵌在m3dbnode里的,把tls相关的这4行注释掉
  29. tls:
  30. caCrtPath: /opt/run/etcd/certs/root/ca.pem
  31. crtPath: /opt/run/etcd/certs/output/etcd-client.pem
  32. keyPath: /opt/run/etcd/certs/output/etcd-client-key.pem

修改 monapi 配置

  1. # 新增 indexMod 配置
  2. indexMod: transfer
  3. logger:
  4. dir: logs/monapi
  5. level: INFO
  6. keepHours: 24
  7. ...

修改 judge 配置

  1. query:
  2. indexMod: transfer
  3. connTimeout: 1000
  4. callTimeout: 2000
  5. indexCallTimeout: 2000
  6. ...

修改nginx配置

使用M3DB替代之前的自研index+rrd的方案,原来的index模块和tsdb模块就可以下掉了,nginx里index相关的配置需要改动,原来的配置:

  1. location /api/index {
  2. proxy_pass http://n9e.index;
  3. }

改成:

  1. location /api/index {
  2. proxy_pass http://n9e.transfer;
  3. }

相当于,使用M3DB做后端的存储的话,transfer模块会承接索引请求,转发给M3处理

M3官方资料

建议大伙尽量还是去官方了解一下M3,uber声称他们用m3存储了66亿指标,真的非常牛逼。如果不想深究,想先用起来测试,请参考下面的方法

单机版M3

这个试用于单机测试场景,所有夜莺服务端组件都部署在一台机器上,特别是transfer和m3要部署在一台机器上的场景,用来测试或者应对小规模场景,足够了

安装方法

单机安装包m3dbnode-single-v0.0.1.tar.gz ,解包之后有个README是安装文档,主要是两个操作步骤:

1、解包之后执行./scripts/install.sh,这个脚本在centos7上面测试ok,用了systemd的方式托管进程,大家可以打开看看脚本内容 2、调用m3的接口,创建/api/v1/database/create创建database,README里有个例子,retentionTime是数据存储时长,测试阶段可以设置为48h,存2天,足够了

检查状态

因为是systemd托管的,所以 systemctl status m3dbnode 即可查看进程状态。机器重启之后如果希望进程自动拉起,记得执行 systemctl enable m3dbnode

集群版M3

m3db-install-v0.0.2.tar.gz

配置

etcd证书

  1. # 修改 ./etcd/certs/config/hosts-etcd
  2. # 填写etcd的机器列表
  3. # 生成证书
  4. cd etcd/certs
  5. ./reinit-root-ca.sh
  6. ./update-etcd-client-certs.sh
  7. ./update-etcd-server-certs.sh

m3db配置

  1. # 修改 ./m3db/etc/m3dbnode.yml
  2. db:
  3. config:
  4. service:
  5. etcdClusters:
  6. - zone: embedded_env
  7. endpoints:
  8. - 10.255.0.146:2379 # 这里需要修改 etcd 节点信息
  9. - 10.255.0.129:2379

分发安装

为了避免麻烦,用来发起m3安装的机器,和目标的3台机器尽量不要复用

  1. . ./functions.sh
  2. # set hosts
  3. hosts="{node1} {node2} {node3}"
  4. # sync etcd,m3db to hosts
  5. sync
  6. # install
  7. install
  8. # status
  9. status

安装之后的路径

  1. # database path
  2. /home/etcd
  3. /home/m3db
  4. /home/m3kv
  5. # config path
  6. /etc/etcd/
  7. /etc/m3db/

初始化 m3dbnode database

修改 ./m3db/scripts/01-create-db.sh 后,执行:

  1. curl -X POST http://localhost:7201/api/v1/database/create -d '{
  2. "type": "cluster",
  3. "namespaceName": "default",
  4. "retentionTime": "2160h",
  5. "numShards": "64",
  6. "replicationFactor": "3",
  7. "hosts": [
  8. {
  9. "id": "10-255-0-146",
  10. "isolationGroup": "group1",
  11. "zone": "embedded",
  12. "weight": 100,
  13. "address": "10.255.0.146",
  14. "port": 9000
  15. },
  16. {
  17. "id": "10-255-0-129",
  18. "isolationGroup": "group2",
  19. "zone": "embedded",
  20. "weight": 100,
  21. "address": "10.255.0.129",
  22. "port": 9000
  23. },
  24. {
  25. "id": "10-255-0-137",
  26. "isolationGroup": "group3",
  27. "zone": "embedded",
  28. "weight": 100,
  29. "address": "10.255.0.137",
  30. "port": 9000
  31. }
  32. ]
  33. }'
  • hosts[0].id: 这是机器节点的标识,默认情况下,用的是机器的hostname; 取决于m3dbnode.yml: db.hostID.resolver如何配置
  • retentionTime: 数据保存时长,默认是90天,磁盘空间不够的话,建议改成8天,即192,不是7天,是担心后面可能有周环比的看图需要
  • numShards: 如果是单机测试,这里改成8,如果是3台机器可以用64,如果有更多机器,可以参照下一章节来定义这个数量
  • replicationFactor: 如果单节点就改成1即可

扩展阅读

节点数量, 建议至少3台机器,数据复制3份(RF),参考 replication_and_deployment_in_zones

Replica FactorQuorum SizeFailure Tolerance
110
220
321
431
532
642
743

数据分片数量,根据未来的规模配置,参考 placement_configuration

Number of NodesNumber of Shards
364
6128
12256
24512
481024
128+4096

最后修改 2021-02-06: v2 (bb04a83)