OpenStack influxdb数据库集群与高可用服务体验

influxdb是一个什么样的数据库呢?在官网上https://influxdata.com/ 是这样介绍的,“An open source time-series database designed for high-performance writes and compact disk storage. Supports open source high-availability architectures and native clustering is available through an Influx Enterprise subscription.”influxdb是一个开源时序数据库,常用来存放监控数据,在这段官网的介绍中特别提到了开源高可用架构和原生的集群服务。本文会介绍influxdb目前开源的集群以及高可用服务。

influxdb集群

在influxdb 0.12发布的同时,也宣告了influxdb开源集群服务的结束,在官方文档0.12与0.11的差别中的clustering updates部分

https://docs.influxdata.com/influxdb/v0.12/concepts/011_vs_012/ ,

提到了0.11是最后一个包含集群服务的开源版本。

influxdb集群安装

在3个节点上安装influxdb 0.11

yum install influxdb-0.11.1-1.x86_64

分别修改配置文件,使用默认端口、地址绑定即可,我的做法是修改hostname

vim /etc/influxdb/influxdb.conf

配置集群

vim /etc/default/influxdb
INFLUXD_OPTS="-join ysm-test1:8091,ysm-test2:8091,ysm-test3:8091"

全部修改完以后重启服务即可

systemctl restart influxdb

进入influxdb交互模式,查看集群情况

influx

Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.11.1
InfluxDB shell 0.11.1
> show servers
name: data_nodes
----------------
id  http_addr   tcp_addr
1   ysm-test1:8086  ysm-test1:8088
2   ysm-test3:8086  ysm-test3:8088
3   ysm-test2:8086  ysm-test2:8088

name: meta_nodes
----------------
id  http_addr   tcp_addr
1   ysm-test1:8091  ysm-test1:8088
2   ysm-test3:8091  ysm-test3:8088
3   ysm-test2:8091  ysm-test2:8088

验证集群
> create database test

在集群中的其他节点里也能看到新建的test数据库
> show databases
name: databases
---------------
name
_internal
test

influxdb高可用

influxdb 0.12发布的时候,也公开了influxdb-relay项目,用来实现influxdb的高可用。从官方推荐的架构https://docs.influxdata.com/influxdb/v0.12/high_availability/relay/ ,可以看到influxdb-relay在influxdb上面又加了一层,用来处理/write和UDP的请求,而/query请求则是直接访问influxdb。

安装golang环境

influxdb release的rpm包本身是已经编译好的,并不需要golang的环境。而influxdb-relay目前还只是存放在github上,因此需要先安装golang环境。
Centos的base源里是有golang的

yum list|grep golang
golang.x86_64 1.4.2-9.el7 base

不过版本较低,只有1.4.2在编译influxdb-relay的时候,很有可能会出现以下问题。

/usr/lib/golang/src/github.com/influxdata/influxdb-relay/relay/udp.go:210: undefined: bytes.LastIndexByte

这是因为/srv/influxdb-relay/relay/udp.go中的以下这个函数中,用到了bytes库的LastIndexByte 函数,这个功能于2015年4月merge,
https://github.com/golang/go/commit/0fb5475bdf0e5352d7aac67d2ec97c0513ee0af3 是个golang 1.5+ 的功能。于是,手动下载更高版本的golang是需要的。

func (b *udpBackend) post(data []byte) error {
        var err error
        for len(data) > b.mtu {
                // find the last line that will fit within the MTU
                idx := bytes.LastIndexByte(data[:b.mtu], '\n')
                if idx < 0 {
                        // first line is larger than MTU
                        return errPacketTooLarge
                }
                _, err = b.u.c.WriteToUDP(data[:idx+1], b.addr)
                if err != nil {
                        return err
                }
                data = data[idx+1:]
        }

下载并解压1.6.2版本的golang压缩包

wget http://www.golangtc.com/static/go/1.6.2/go1.6.2.linux-amd64.tar.gz
tar -zxf go1.6.2.linux-amd64.tar.gz -C /usr/local/ 

设置环境变量

export GOROOT=/usr/local/go  
export GOBIN=$GOROOT/bin 
export GOPKG=$GOROOT/pkg/tool/linux_amd64  
export GOARCH=amd64 
export GOOS=linux 
export GOPATH=$HOME
export PATH=$PATH:$GOBIN:$GOPKG:$GOPATH/bin 

至此,golang环境已经安装完成,执行go help,确认go命令已经可以使用。
go help

安装influxdb-relay

go install github.com/influxdata/influxdb-relay 

执行这条命令的时候很有可能会报以下的错误,

can't load package: package github.com/influxdata/influxdb-relay: cannot find package "github.com/influxdata/influxdb-relay" in any of:
    /usr/lib/golang/src/github.com/influxdata/influxdb-relay (from $GOROOT)

通过google搜索以后,意外地发现了天才程序员TJ Holowaychuk 2013年8月在vegeta项目下报的类似的issue https://github.com/tsenart/vegeta/issues/1 ,
看来使用golang项目的文档撰写者需要注意一下这个部分文档的完善。直接使用go install命令是无法安装远程代码的,需要执行go get命令先将远程的代码拷贝到本地的$GOPATH下。

go get github.com/influxdata/influxdb-relay
go install github.com/influxdata/influxdb-relay

安装完成以后,配置配置文件relay.toml

cp $GOPATH/src/github.com/influxdata/influxdb-relay/sample.toml ./relay.toml

这是我的配置文件,只采用了http协议连接方式,如果influxdb /etc/influxdb/influxdb.conf的配置里开启了udp的配置也可以使用udp协议的连接方式。

vim relay.toml
[[http]]
name = "example-http"
bind-addr = "127.0.0.1:9096"
output = [
    { name="ysm-test1", location = "ysm-test1:8086/write" },
{ name="ysm-test2", location = "ysm-test2:8086/write" },
{ name="ysm-test3", location = "ysm-test3:8086/write" },
]

接下来就可以使用influxdb-relay的HA了

/usr/local/go/bin/influxdb-relay -config ./relay.toml
2016/05/05 09:42:11 starting relays...
2016/05/05 09:42:11 Starting HTTP relay " example-http " on :9096

将这台机器的influxdb服务关闭

systemctl stop influxdb

再使用influx命令,就会发现无法进入交互模式

Failed to connect to http://localhost:8086
Please check your connection settings and ensure 'influxd' is running.

再指定之前influxdb-relay配置的端口9096,成功进入其他的influxdb

influx -port 9096
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:9096 version 0.11.1
InfluxDB shell 0.11.1
>

验证可以通过influxdb-relay写数据

curl -i -XPOST 'http://localhost:9096/write?db=test' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'

进入influxdb验证数据写入

> use test
Using database test
> select * from cpu_load_short
name: cpu_load_short
--------------------
time            host        region  value
1434055562000000000 server01    us-west 0.64

至此,基于influxdb 0.11的集群高可用介绍已经完成,influxdb开源的集群以及高可用服务都不是很完善,不建议在生产环境中使用,如需更详细的了解,可以参考官方文档https://docs.influxdata.com/influxdb 。

本文来自九州云独家供稿

你可能感兴趣的:(OpenStack influxdb数据库集群与高可用服务体验)