m3db install

M3 介绍

为Uber提供本机分布式时间序列数据库、高动态性和高性能的聚合服务、查询引擎和其他支持基础设施。

用途

用于存储时序服务平台
提供高可用服务(暂未完善,存在丢数据风险)
通过创建不同的 namespace 用于存储不同保留期的数据
使用了 prometheus 监控格式的读写 api 接口
完全兼容 grafana 数据读取

资料

官方文档参考
github 项目
influxdb benchmark 方法

概念

M3Coordinator

处于 M3DB cluster 上游
提供了兼容 prometheus 格式的数据写 api
提供了 Aggregator downsampleing 功能

M3DBnode

提供了时序存储服务
以集群模式存在
提供横向扩容能力
数据恢复,追溯有问题(有待新版本提供该功能)

M3Query

分布式查询接口
通过访问 etcd 获取 M3DB 集群信息
向 m3db 获取内存中,磁盘中存储的时序数据
cpu 将会成为大量并发查询的瓶颈(有待新版本优化这个问题)
可以通过横向扩展 m3query 提高并发查询速度

etcd

存储了集群中所有的配置信息

shard

时间序列键被散列为一组固定的 shard
shard 将会分配给物理节点
需要在第一次启动 m3db 集群后定义 shard 数量, 并且定义后不可以再修改
假如存在大量 metric, 存在着大型集群 50 台机器, 建议把 shard 设定到 256
假如只是一个小规模的集群, 建议把 shard 设定为 64
shard 越大,m3db 初始化时生成的文件数量就越大, 初始化, 重启恢复等时间就越长

replication

副本数量
即当一个 metric data 存储到集群后, 将会被自动复制保存的数量
一般可靠性集群都会习惯设定为 3
同样会把整体集群真正可用容量空间缩减至 1/3

retention

数据保存的最大期限
ex: 10h
那么数据在 10 小时后将会自动被丢弃 (数据文件被删除)

blocksize

用时间范围去定义一个 blocksize (ex: 1h)
m3dbnode 会划分了一个内存块, 该内存块只保存一个小时内的数据 (ex: 09:00 ~ 10:00 )
在上述时间段内,所有的 metric 及 value 都会按顺序地写入到同一个内存块中 (warm memory) 可以执行数据读操作
当时间到了 10:00 (warm memory) 会移动并成为 (clod memory) 不再执行数据读写
当时间到了 11:00, m3db 会把 clod memory 中的数据写入磁盘文件中, 数据文件不再提供修改功能(因此无法恢复丢失的数据)
即当前保存了 metric data 的数据某一个文件 (ex: xxxxx.db ) 只会保留这一个小时内的数据

bufferFuture bufferPass

bufferFuture, bufferPass 制定了插入 metric 时的 timestamp 时间范围
ex: bufferPass = 1h 即为当前时间至当前时间以后的 1 小时

文件组

每个 block size 期间都会生成了 7 个文件,如下

info file: 信息存储在块的开始时间窗口和其他重要的文件集体积的元数据
Summaries file: 存储索引文件的一个子集,子集中保留了内存中的内容,可以再少量的线性扫描就可以找到目标并跳转到索引文件分区列
Index file: 存储一系列元数据,包括启用的被索引的 tag,以及数据文件中提供检索的压缩流位置
Data file: 存储一系列压缩的数据流
Bloom filter file: 存储此文件集中包含的所有系列的Bloom筛选器位集,以便快速了解是否尝试为此文件集卷检索系列
Digests file: 将信息文件、摘要文件、索引文件、数据文件和Bloom筛选器文件的摘要校验和存储在文件集卷中,以进行完整性验证
Checkpoint file: 存储摘要文件的摘要,并在被持久化的文件集卷成功完成时写入,允许快速检查卷是否完成。

参考官方对文件组的描述图

                                                     ┌─────────────────────┐
┌─────────────────────┐  ┌─────────────────────┐     │     Index File      │
│      Info File      │  │   Summaries File    │     │   (sorted by ID)    │
├─────────────────────┤  │   (sorted by ID)    │     ├─────────────────────┤
│- Block Start        │  ├─────────────────────┤  ┌─>│- Idx                │
│- Block Size         │  │- Idx                │  │  │- ID                 │
│- Entries (Num)      │  │- ID                 │  │  │- Size               │
│- Major Version      │  │- Index Entry Offset ├──┘  │- Checksum           │
│- Summaries (Num)    │  └─────────────────────┘     │- Data Entry Offset  ├──┐
│- BloomFilter (K/M)  │                              │- Encoded Tags       |  |
│- Snapshot Time      │                              └─────────────────────┘  │
│- Type (Flush/Snap)  │                                                       │
└─────────────────────┘                                                       │
                                                                              │
                         ┌─────────────────────┐  ┌───────────────────────────┘
┌─────────────────────┐  │  Bloom Filter File  │  │
│    Digests File     │  ├─────────────────────┤  │  ┌─────────────────────┐
├─────────────────────┤  │- Bitset             │  │  │      Data File      │
│- Info file digest   │  └─────────────────────┘  │  ├─────────────────────┤
│- Summaries digest   │                           │  │List of:             │
│- Index digest       │                           └─>│  - Marker (16 bytes)│
│- Data digest        │                              │  - ID               │
│- Bloom filter digest│                              │  - Data (size bytes)│
└─────────────────────┘                              └─────────────────────┘

┌─────────────────────┐
│   Checkpoint File   │
├─────────────────────┤
│- Digests digest     │
└─────────────────────┘

部署环境

逻辑结构

利用三个机器组建独立的 etcd 服务器, 存储了整个 m3db 集群信息
利用三个机器组建 m3dbnode 集群, 用于存储 metric data
创建 m3coordinator, 成为客户端数据写入到 m3dbnode 的桥梁, 客户端需要经过 m3coordinator 代理写入数据到 namespace
创建 m3query, 成为客户端如 grafana 查询 m3dbnode 中数据的桥梁, 客户端需要经过 m3query 代理查询 namespace 中的数据
grafana 通过 m3query 接口, 获取 m3dbnode 数据, 并提供图片方式展示监控信息
prometheus 暂时只用于监控物理机性能, 并把监控信息写入到 m3dbnode 中
data import client, 用于测试阶段,暂时采用了 m3 项目提供的 benchmark 进行数据写入

主机及服务列表

主机名etcdm3dbnodem3coordinatorm3queryprometheusgrafanadata import/export
m3test001yy
m3test002yy
m3test003yy
m3controlleryy
m3clientyyy

etcd 部署

独立维护的 etcd 集群
按平时习惯部署 etcd 集群即可
etcd 需要支持 version3

etcd 配置文件

cat /etc/etcd/etcd.conf

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"  
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"  
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"  
ETCD_NAME="ns-ceph-208210.vclound.com"  
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://m3test001:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://m3test001ipaddr:2379"
ETCD_INITIAL_CLUSTER="m3test001=http://m3test001:2380,m3test002=http://m3test002:2380,m3test003=http://m3test003:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

启动集群

systemctl start etcd
systemctl enable etcd

验证集群命令

etcdctl cluster-health
etcdctl member list

初始化 m3dbnode 主机

内核优化

/etc/sysct.conf
vm.max_map_count = 6000000
vm.swappiness = 1
fs.file-max = 6000000
fs.nr_open = 6000000

创建相关用户, 目录

ueradd apps
mkdir -p /apps/dat/m3db/commitlogs  /apps/svr/m3db/bin  /apps/conf/m3db /apps/logs/m3db  /apps/dat/etcd  /apps/dat/m3db/m3kv_coordinator /apps/dat/m3db/m3kv
chown apps:apps /apps -R

m3dbnode 目录结构

/apps
├── conf
│     └ m3db                         (m3db 配置文件)
│         ├── m3coordinator.yaml
│         └── storagenode.yaml
├── dat
│     └ m3db                         (m3db 数据存储位置)  
│          ├── commitlogs
│          ├── data
│          └── snapshots
├── logs
│     └ m3db                         (m3db 日志存放位置)
└── svr
      └── m3db
           └── bin                   (m3db 启动程序)
                ├── m3coordinator
                ├── m3dbnode
                └── m3query

m3dbnode 启动

m3dbnode 配置文件

/apps/conf/m3db/storagenode.yaml

db:
  logging:
    level: debug
  metrics:
    prometheus:
      handlerPath: /metrics
    sanitization: prometheus
    samplingRate: 1.0
    extended: detailed
  hostID:
    resolver: hostname
    envVarName: gd-m3test001                              (对应每台 m3dbnode 主机名)
# Fill-out the following and un-comment before using.
  config:
    service:
      env: default_env
      zone: embedded
      service: m3db
      cacheDir: /apps/dat/m3db/m3kv
      etcdClusters:
        - zone: embedded
          endpoints:
            - etcd1_ip:2379
            - etcd2_ip:2379
            - etcd3_ip:2379
  listenAddress: 0.0.0.0:9000
  clusterListenAddress: 0.0.0.0:9001
  httpNodeListenAddress: 0.0.0.0:9002
  httpClusterListenAddress: 0.0.0.0:9003
  debugListenAddress: 0.0.0.0:9004
  client:
    writeConsistencyLevel: majority
    readConsistencyLevel: unstrict_majority
  gcPercentage: 100
  writeNewSeriesAsync: true
  writeNewSeriesLimitPerSecond: 1048576
  writeNewSeriesBackoffDuration: 2ms
  bootstrap:
    bootstrappers:
        - filesystem
        - commitlog
        - peers
        - uninitialized_topology
    fs:
      numProcessorsPerCPU: 0.125
    commitlog:
      returnUnfulfilledForCorruptCommitLogFiles: false
  cache:
    series:
      policy: lru
    postingsList:
      size: 262144
  commitlog:
    flushMaxBytes: 524288
    flushEvery: 1s
    queue:
      calculationType: fixed
      size: 2097152
  fs:
    filePathPrefix: /apps/dat/m3db

m3dbnode 服务启动脚本

/usr/lib/systemd/system/m3dbnode.service

[Unit]
Description=M3DB node Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
KillSignal=SIGINT
ExecStartPre=/usr/bin/find /apps/dat/m3db/commitlogs/ -size 0 -exec rm -rf {} \;
ExecStart=/bin/bash -c "/apps/svr/m3db/bin/m3dbnode -f /apps/conf/m3db/storagenode.yaml  2>&1 > /apps/logs/m3db/m3dbnode-info.log"
ExecStop=/bin/kill -s SIGINT $MAINPID
RemainAfterExit=yes
PIDFile=/var/run/m3node.pid
LimitNOFILE=6000000
User=apps
Group=apps

[Install]
WantedBy=multi-user.target

在三台 m3dbnode 服务器上完成配置启动后, m3dbnode 及可以组建集群完成

m3cordinator 启动

配置文件

/apps/conf/m3db/m3coordinator.yaml

listenAddress:
  type: "config"
  value: "0.0.0.0:7201"
metrics:
  scope:
    prefix: "coordinator"
  prometheus:
    handlerPath: /metrics
    listenAddress: 0.0.0.0:7203
  sanitization: prometheus
  samplingRate: 1.0
  extended: none
clusters:
   - namespaces:
       - namespace: apps                     (对应 namespace)
         retention: 1440h                    (retention 时间)
         type: unaggregated
     client:
       config:
         service:
           env: default_env
           zone: embedded
           service: m3db
           cacheDir: /apps/dat/m3db/m3kv_coordinator
           etcdClusters:
             - zone: embedded
               endpoints:
                 - etcd1_ip:2379
                 - etcd2_ip:2379
                 - etcd3_ip:2379
       writeConsistencyLevel: majority
       readConsistencyLevel: unstrict_majority
       writeTimeout: 10s
       fetchTimeout: 15s
       connectTimeout: 20s
       writeRetry:
         initialBackoff: 500ms
         backoffFactor: 3
         maxRetries: 2
         jitter: true
       fetchRetry:
         initialBackoff: 500ms
         backoffFactor: 2
         maxRetries: 3
         jitter: true
       backgroundHealthCheckFailLimit: 4
       backgroundHealthCheckFailThrottleFactor: 0.5
tagOptions:
    # Configuration setting for generating metric IDs from tags.
    idScheme: quoted

启动文件

/usr/lib/systemd/system/m3coordinator.service

[Unit]
Description=M3DB m3coordinator
After=network.target
After=network-online.target
After=m3node.service
Wants=network-online.target


[Service]
Type=simple
KillSignal=SIGINT
ExecStart=/bin/bash -c "/apps/svr/m3db/bin/m3coordinator -f /apps/conf/m3db/m3coordinator.yaml  2>&1 > /apps/logs/m3db/m3coordinator.log"
ExecStop=/bin/kill -s SIGINT $MAINPID
RemainAfterExit=yes
PIDFile=/var/run/coordinator.pid
LimitNOFILE=3000000
User=apps
Group=apps


[Install]
WantedBy=multi-user.target

m3query 启动

配置文件

/apps/conf/m3db/m3query-apps.yaml

listenAddress:
  type: "config"
  value: "0.0.0.0:8201"                                     ( m3query 接受请求监听端口 )
metrics:
  scope:
    prefix: "coordinator"
  prometheus:
    handlerPath: /metrics
    listenAddress: 0.0.0.0:8202                            ( m3query debug 专用端口 )
  sanitization: prometheus
  samplingRate: 1.0
  extended: none
tagOptions:
  idScheme: quoted
clusters:
  - namespaces:
      - namespace: apps                                       (对应需要监控的 namespace)
        type: unaggregated
        retention: 1440h
    client:
      config:
        service:
          env: default_env
          zone: embedded
          service: m3db
          cacheDir: /apps/dat/m3db/m3kv
          etcdClusters:
            - zone: embedded
              endpoints:
                 - etcd1_ip:2379
                 - etcd2_ip:2379
                 - etcd3_ip:2379
      writeConsistencyLevel: majority
      readConsistencyLevel: unstrict_majority
      writeTimeout: 10s
      fetchTimeout: 15s
      connectTimeout: 20s
      writeRetry:
        initialBackoff: 500ms
        backoffFactor: 3
        maxRetries: 2
        jitter: true
      fetchRetry:
        initialBackoff: 500ms
        backoffFactor: 2
        maxRetries: 3
        jitter: true
      backgroundHealthCheckFailLimit: 4
      backgroundHealthCheckFailThrottleFactor: 0.5

启动文件

/usr/lib/systemd/system/m3query-apps.service

[Unit]
Description=M3DB m3query default namespace
After=network.target
After=network-online.target
After=m3node.service
Wants=network-online.target

[Service]
Type=simple
KillSignal=SIGINT
ExecStart=/bin/bash -c "/apps/svr/m3db/bin/m3query -f /apps/conf/m3db/m3query-apps.yaml  2>&1 > /apps/logs/m3db/m3query-apps.log"
ExecStop=/bin/kill -s SIGINT $MAINPID
RemainAfterExit=yes
PIDFile=/var/run/m3query-apps.pid
LimitNOFILE=3000000
User=apps
Group=apps

[Install]
WantedBy=multi-user.target

管理配置

初始化 m3db

初始化 placement

m3db 集群第一次启动完成
需要为集群设计 shard 数量
需要为集群中所有节点执行初始化

初始化方法

curl -X POST m3coordinator_ip:7201/api/v1/placement/init -d  '{
    "num_shards": 64,                              (shard 定义)
    "replication_factor": 3,                       (副本数量)
    "instances": [
        {
            "id": "gd-m3test001",
            "isolation_group": "nansha-a",
            "zone": "embedded",
            "weight": 100,
            "endpoint": "m3test001_ip:9000",
            "hostname": "gd-m3test001",
            "port": 9000
        },
        {
            "id": "gd-m3test002",
            "isolation_group": "nansha-b",
            "zone": "embedded",
            "weight": 100,
            "endpoint": "m3test002_ip:9000",
            "hostname": "gd-m3test002",
            "port": 9000
        },
       {
            "id": "gd-m3test003",
            "isolation_group": "nansha-c",
            "zone": "embedded",
            "weight": 100,
            "endpoint": "m3test003_ip:9000",
            "hostname": "gd-m3test003",
            "port": 9000
        }
        ]
}'

创建 namespace

一个 m3db 集群可以有多个 namespace
不同的 namespace 保存不同的数据
可以根据需要为不同的 namespace 设定不同的参数如:

retention
blocksize
bufferFuture
bufferPass

参考创建 namespace 参数

curl -X POST localhost:7201/api/v1/namespace -d '{
  "name": "apps",
  "options": {
    "bootstrapEnabled": true,
    "flushEnabled": true,
    "writesToCommitLog": true,
    "cleanupEnabled": true,
    "snapshotEnabled": true,
    "repairEnabled": false,
    "retentionOptions": {
      "retentionPeriodDuration": "1440h",
      "blockSizeDuration": "24h", 
      "bufferFutureDuration": "10m",
      "bufferPastDuration": "10m",
      "blockDataExpiry": true,
      "blockDataExpiryAfterNotAccessPeriodDuration": "5m"
    },
    "indexOptions": {
      "enabled": true,
      "blockSizeDuration": "24h"
    }
  }
}'

执行 namespace 创建命令后

/apps/dat/m3db/data/apps 目录会被创建
上述目录下回创建 64 个目录 (由 shard 定义)
每个目录中具有 retention / blocksize * 7 (fileset) 文件个数
因此, 当 shard 过大,retention 过小,则导致了会生成大量的文件, m3db 需要启动大量的文件句柄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Terry_Tsang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值