夜莺升级tsdb为m3db(v3)
tsdb和m3db都是时序数据库,tsdb数据库对于历史数据的存储会出现降采样的情况,导致数据出现不准确,因此需要将tsdb升级到m3db,m3db的优缺点如下:
优点:
- 对硬盘IO要求没那么高了,普通机械硬盘也能抗比较大的量
- 存原始数据,不降采样了,追问题的时候更方便,当然了,存储的数据时长就变短了,相同硬盘空间大小,比如原来rrd可以存1年的历史趋势数据,m3可能只能存1个月
- 扩容非常方便,直接加m3dbnode即可,index+tsdb的方案使用migrate配置,扩容不易
- 容灾更好了,可以设置3副本,如果集群部署了3台机器,挂掉一台机器完全没有影响
- 索引避免了原来index+tsdb的单点容量问题,原来index虽然是可以部署为集群,但是集群里每个节点都是全量索引
劣势:
- 硬盘空间占用大,毕竟存储原始数据嘛,一般生产环境建议存1个月,再久也尽量不要超过3个月,当然了,要监控的设备比较少,部署m3的机器硬盘又比较大,那另当别论
- 内存占用比较多,一般配置是最近两个小时的数据要缓存在内存里,所以比较吃内存
注意:切换为m3db数据库后,就不再需要index和tsdb模块, transfer模块会承接索引请求,转发给M3处理
单机版m3db安装
单机版适用于夜莺的测试环境,生产环境建议采用集群的方式部署m3db
1、下载单机版安装包m3dbnode-single-v0.0.1.tar.gz,上传到夜莺服务器上,加压缩,进入解压目录执行scripts目录下的install.sh脚本执行安装,如图:

2、安装之后,在/home/n9e/目录下可以看到m3db目录,并且在m3db/data/m3db/可以看到创建的持久化数据信息,如图:

注意:上图中的安装目录以及持久化数据目录都是通过install.sh脚本以及etc目录下的m3dbnode.yml中修改的,全部都修改完之后,执行install.sh即可
install.sh文件的内容如下:
#!/bin/bash
: '
@此脚本为单机版m3db的安装方式
下面的n9e路径根据需要自己修改即可
'
CWD=$(cd $(dirname $0)/; pwd)
cd $CWD/..
systemctl stop m3dbnode
mkdir -p /home/n9e/m3db/data/{m3db,m3kv}
mkdir -p /home/n9e/m3db/{bin,etc}
cp -af ./bin/* /home/n9e/m3db/bin/
cp -af ./etc/*.yml /home/n9e/m3db/etc/
sysctl -w vm.max_map_count=3000000
sysctl -w vm.swappiness=1
sysctl -w fs.file-max=3000000
sysctl -w fs.nr_open=3000000
# echo "${USER} hard nofile 3000000" >> /etc/security/limits.conf
# Edit /etc/security/limits.conf file and allow the user under which asterisk runs to modify the ulimit to a higher value.
# <username> hard nofile <number>
ulimit -n 3000000
grep 'vm.max_map_count = 3000000' /etc/sysctl.conf || cat >> /etc/sysctl.conf <<'EOF'
# m3db
vm.max_map_count = 3000000
vm.swappiness = 1
fs.file-max = 3000000
fs.nr_open = 3000000
EOF
sudo cp -a ./systemd/m3dbnode.service /usr/lib/systemd/system/m3dbnode.service
systemctl daemon-reload
systemctl start m3dbnode
systemctl status m3dbnode
sleep 10
#创建持久化数据,适用为单机版,保存时间为30天
curl -X POST http://localhost:7201/api/v1/database/create -d '{
"type": "local",
"namespaceName": "default",
"retentionTime": "720h", #720h等于30天
"numShards": "8",
"replicationFactor": "1",
"hosts": [
{
"id": "m3db_local",
"zone": "embedded",
"address": "127.0.0.1",
"port": 9000
}
]
}'
m3dbnode.yml中需要修改的位置,如图:

3、修改transfer.yml文件,修改存储为m3db,如图:

注意:上图中的配置需要与m3dbnode.yml中的一致,开启m3db后,下面的tsdb模块要设置为false,否则会有很多粗错误日志,影响查看正常日hi
3、修改monapi.yml文件,添加内容如下,注意位置,如图:

4、修改judge.yml文件,添加内容如下:

5、最后修改nginx配置文件,将index修改为transfer,修改内容如下:

上图中的transfer模块承接索引请求,并转发给m3db处理
注意:需要将transfer.yml文件中的tsdb模块关闭,否则transfer模块日志会出错,提示无法连接到tsdb

6、重新加载nginx配置文件,关闭tsdb、index模块,重启transfer、monapi、judge模块,然后刷新页面,可以看到数据已经出来,此时采用的就是m3db作为时序数据库,如图:

集群版安装:
集群版安装需要下载对应的集群安装包,本例子下载的安装包如图:

环境准备:
m3db至少需要三台机器做成集群,如果一台机器挂掉不会影响实际业务,本例子中三台机器的IP分别为
- 10.xx.xx.190 系统为:centos7.4 关闭防火前和selinux
- 10.xx.xx.191 系统为:centos7.4 关闭防火前和selinux
- 10.xx.xx.192 系统为:centos7.4 关闭防火前和selinux
注意:三台机器上都有m3dbnode服务以及etcd服务
1、首先将安装包解压,加压后可以看到有四个文件,如图:

2、编辑functions.sh脚本,在hosts位置,添加三台机器的IP地址,每个IP地址之间通过空格分隔,user位置填写ssh连接的目标机器用户名,如图:

3、进入m3db文件夹下面的script文件夹,编辑安装文件install.sh,创建安装路径(根据自己实际情况自定义),如图:

4、进入m3db下面的etc文件夹,编辑配置文件m3dbnode.yml,修改数据存储时间为720h(30天),如图:

修改m3db的数据路径以及缓存目录,以及设置etcd的服务器IP地址和认证证书,如图:

5、编辑m3db文件夹下面的systemd路径下的启动文件m3dbnode.service,修改m3db的可执行文件位置以及配置文件位置,如图:

6、接下来安装etcd,进入etcd/certs/config,编辑文件vim hosts-etcd,将三台etcd服务器的IP地址填写进入,如图:

7、回到上一层certs目录,依次执行三个脚本文件,生成证书文件,如图:

在output和root目录下会生成证书文件,如图:


8、进入/etcd/etcd目录,编辑文件install.sh,创建etcd安装路径以及证书路径,如图:

注意:本例子中etcd也安装在了m3db路径下,因此上图中workdir设置路径为m3db路径
8、编辑/etcd/etcd/usr_lib_systemd_system路径下的etcd_server.tpl文件,修改为对应的路径即可,如图:

9、回到最开始目录,执行文件./functions.sh开始安装,安装完成后可以看到都是正常启动的状态,如图:


10、最后一步,初始化数据库,找到m3db/scripts目录下,编辑01_create_db.sh,修改内容为三台机器的IP地址和主机名,如图:

修改完成后在任意一台机器上执行即可,无需三台机器执行(集群)
11、编辑n9e安装路径下的etc/transfer.yml文件,修改内容如下:

从上图可以看出,修改数据源为m3db,将enabled改成true,表示开启m3db,日期限制可以根据需要自己设置,我这里设置15天,下面配置etcd三台机器的IP地址,下面的tls表示认证etcd的证书文件,最后面的tsdb模块的enabled要改为false,否则将受到很多无关错误信息
12、修改etc/judge文件,注意位置,添加内容如下:

13、修改monapi.yml文件,注意位置,添加内容如下:

14、修改nginx配置文件,修改index代理地址改为transfer,如图:

15、根据transfer配置文件中的tls证书位置,按照配置文件新建路径,并将证书拷贝过来,如果有多台夜莺服务端,每台都要创建,如图:

16、重启transfer、judge、monapi、nginx模块,关闭index模块,然后看到指标可以正常出来,表示升级成功,如图:



