Influx集群解决方案(Influx Proxy篇)

InFluxDB 集群搭建

本次搭建使用influx proxy

介绍

github地址:https://github.com/chengshiwen/influx-proxy/

Influx Proxy 是一个基于高可用、一致性哈希的 InfluxDB 集群代理服务,实现了 InfluxDB 高可用集群的部署方案,
具有动态扩/缩容、故障恢复、数据同步等能力。连接到 Influx Proxy 和连接原生的 InfluxDB Server 没有显著区别
(支持的查询语句列表),对上层客户端是透明的,上层应用可以像使用单机的 InfluxDB 一样使用,Influx Proxy
会处理请求的转发,并对各个 InfluxDB 集群节点进行管理。Influx Proxy 基于饿了么开源的 Influx-Proxy,
并进一步开发和优化,支持了更多的特性,移除了 Python、Redis 依赖,解决了受限于一个数据库、需要额外配置
KEYMAPS 、数据负载不均衡的问题。

架构说明

  • 在改造我们的系统中我们相当于要实现以下步骤

    在这里插入图片描述

实现步骤

Influx1.8环境

Influx1.8+Influx Proxy +SpringBoot +Ngnix

SpringBoot搭建
  • 引入依赖

    <dependency>
        <groupId>org.influxdb</groupId>
        <artifactId>influxdb-java</artifactId>
        <version>2.6</version>
    </dependency>
    
  • java代码(参考https://github.com/influxdata/influxdb-java)

    // Create an object to handle the communication with InfluxDB.
    // (best practice tip: reuse the 'influxDB' instance when possible)
    final String serverURL = "http://127.0.0.1:8086", username = "root", password = "root";
    final InfluxDB influxDB = InfluxDBFactory.connect(serverURL, username, password);
    
    // Create a database...
    // https://docs.influxdata.com/influxdb/v1.7/query_language/database_management/
    String databaseName = "NOAA_water_database";
    influxDB.query(new Query("CREATE DATABASE " + databaseName));
    influxDB.setDatabase(databaseName);
    
    // ... and a retention policy, if necessary.
    // https://docs.influxdata.com/influxdb/v1.7/query_language/database_management/
    String retentionPolicyName = "one_day_only";
    influxDB.query(new Query("CREATE RETENTION POLICY " + retentionPolicyName
            + " ON " + databaseName + " DURATION 1d REPLICATION 1 DEFAULT"));
    influxDB.setRetentionPolicy(retentionPolicyName);
    
    // Enable batch writes to get better performance.
    influxDB.enableBatch(
        BatchOptions.DEFAULTS
          .threadFactory(runnable -> {
            Thread thread = new Thread(runnable);
            thread.setDaemon(true);
            return thread;
          })
    );
    
    // Close it if your application is terminating or you are not using it anymore.
    Runtime.getRuntime().addShutdownHook(new Thread(influxDB::close));
    
    // Write points to InfluxDB.
    influxDB.write(Point.measurement("h2o_feet")
        .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
        .tag("location", "santa_monica")
        .addField("level description", "below 3 feet")
        .addField("water_level", 2.064d)
        .build());
    
    influxDB.write(Point.measurement("h2o_feet")
        .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
        .tag("location", "coyote_creek")
        .addField("level description", "between 6 and 9 feet")
        .addField("water_level", 8.12d)
        .build());
    
    // Wait a few seconds in order to let the InfluxDB client
    // write your points asynchronously (note: you can adjust the
    // internal time interval if you need via 'enableBatch' call).
    Thread.sleep(5_000L);
    
    // Query your data using InfluxQL.
    // https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/#the-basic-select-statement
    QueryResult queryResult = influxDB.query(new Query("SELECT * FROM h2o_feet"));
    
    System.out.println(queryResult);
    // It will print something like:
    // QueryResult [results=[Result [series=[Series [name=h2o_feet, tags=null,
    //      columns=[time, level description, location, water_level],
    //      values=[
    //         [2020-03-22T20:50:12.929Z, below 3 feet, santa_monica, 2.064],
    //         [2020-03-22T20:50:12.929Z, between 6 and 9 feet, coyote_creek, 8.12]
    //      ]]], error=null]], error=null]
    
Ngnix搭建(搭建中)

请参考 custom.conf

服务器搭建与数据库部署

使用docker来搭建对应的influxdb信息

本地存在两台服务器(请确保influx1可以访问到influx2 同一局域网)

influx1: 192.168.137.130

influx2: 192.168.137.131

  1. docker-compose代码

    version: "3.5"
    
    services:
    
      influx-proxy:
        image: chengshiwen/influx-proxy:latest
        container_name: influx-proxy
        ports:
          - 7076:7076
        environment:
          - TZ=Asia/Shanghai
        volumes:
          - ./proxy.json:/etc/influx-proxy/proxy.json
        restart: unless-stopped
        networks:
          - influx_net
    
      influxdb-1:
        image: influxdb:1.8
        container_name: influxdb-1
        restart: unless-stopped
        networks:
          - influx_net
        volumes:
          - ./influxdb1/influxdb.conf:/etc/influxdb/influxdb.conf
          - ./influxdb1/meta:/var/lib/influxdb/meta
          - ./influxdb1/data:/var/lib/influxdb/data
          - ./influxdb1/wal:/var/lib/influxdb/wal
        ports:
          - "8086:8086"
        command: ["influxd", "--config", "/etc/influxdb/influxdb.conf"]
    
      influxdb-2:
        image: influxdb:1.8
        container_name: influxdb-2
        restart: unless-stopped
        networks:
          - influx_net
        volumes:
          - ./influxdb2/influxdb.conf:/etc/influxdb/influxdb.conf
          - ./influxdb2/meta:/var/lib/influxdb/meta
          - ./influxdb2/data:/var/lib/influxdb/data
          - ./influxdb2/wal:/var/lib/influxdb/wal
        ports:
          - "8087:8086"
        command: ["influxd", "--config", "/etc/influxdb/influxdb.conf"]
    
    networks:
      influx_net:
    
  2. proxy.json代码

    {
        "circles": [
            {
                "name": "circle-1",
                "backends": [
                    {
                        "name": "influxdb-1-1",
                        "url": "http://192.168.137.130:8086",
                        "username": "",
                        "password": ""
                    },
                    {
                        "name": "influxdb-1-2",
                        "url": "http://192.168.137.130:8087",
                        "username": "",
                        "password": ""
                    }
                ]
            },
            {
                "name": "circle-2",
                "backends": [
                    {
                        "name": "influxdb-2-1",
                        "url": "http://192.168.137.131:8086",
                        "username": "",
                        "password": ""
                    },
                    {
                        "name": "influxdb-2-2",
                        "url": "http://192.168.137.131:8087",
                        "username": "",
                        "password": ""
                    }
                ]
            }
        ],
        "listen_addr": ":7076",
        "db_list": [],
        "data_dir": "data",
        "tlog_dir": "log",
        "hash_key": "idx",
        "flush_size": 10000,
        "flush_time": 1,
        "check_interval": 1,
        "rewrite_interval": 10,
        "conn_pool_size": 20,
        "write_timeout": 10,
        "idle_timeout": 10,
        "username": "",
        "password": "",
        "write_tracing": false,
        "query_tracing": false,
        "pprof_enabled": false,
        "https_enabled": false,
        "https_cert": "",
        "https_key": ""
    }
    
  3. influx.conf配置

    #这里只放出几处需要修改的 其他按照默认即可 如果生产环境可以考虑把internal禁掉
      
      # Determines whether the Flux query endpoint is enabled.
      flux-enabled = true  (如果需要支持flux语句 请设置为true)
    
  4. 测试

    curl -XPOST 'http://127.0.0.1:7076/query' --data-urlencode 'q=CREATE DATABASE "testdb"'
    sudo curl -XPOST 'http://127.0.0.1:7076/api/v2/write?bucket=testdb&precision=s' --data-binary 'mem,host=host1 used_percent=25 1700469476'
    sudo curl -XPOST 'http://127.0.0.1:7076/api/v2/write?bucket=testdb&precision=s' --data-binary 'mem2,host=host2 used_percent=23 1700469476'
    sudo curl -XPOST 'http://127.0.0.1:7076/api/v2/write?bucket=testdb&precision=s' --data-binary 'mem3,host=host3 used_percent=24 1700531670'
    
    sudo curl -XPOST 'http://127.0.0.1:7076/api/v2/query' \
      -H 'Accept:application/csv' \
      -H 'Content-type:application/vnd.flux' \
      -d 'from(bucket:"testdb")
            |> range(start:-5m)
            |> filter(fn:(r) => r._measurement == "mem")'
    

Influx2.5环境

SpringBoot搭建
  • 引入依赖

    <dependency>
        <groupId>com.influxdb</groupId>
        <artifactId>influxdb-client-java</artifactId>
        <version>6.3.0</version>
    </dependency>
    
  • Java代码

    public class influxProxyTest {
        public static void main(String[] args) {
    
            String url = "http://192.168.137.130:7076";
            String token = "testinfo";
            String org = "admin";
            String bucket = "analyse";
    
            InfluxDBClient client = InfluxDBClientFactory.create(url, token.toCharArray(), org, bucket);
            QueryApi queryApi = client.getQueryApi();
            String flux = "from(bucket:\"analyse\")\n" +
                    "|> range(start:-5d)\n" +
                    "|> filter(fn:(r) => r._measurement == \"mem\")";
            List<FluxTable> list = queryApi.query(flux, org);
            for (FluxTable fluxTable:list){
                List<FluxRecord> records = fluxTable.getRecords();
                for (FluxRecord fluxRecord:records){
                    System.out.println(fluxRecord.getValue());
                }
            }
        }
    
Ngnix搭建(实现中)

请参考 custom.conf

服务器搭建与数据库部署

使用docker来搭建对应的influxdb信息

本地存在两台服务器(请确保influx1可以访问到influx2 同一局域网)

influx1: 192.168.137.130

influx2: 192.168.137.131

  1. docker-compose代码

    version: "3.5"
    
    services:
    
      influx-proxy:
        image: chengshiwen/influx-proxy:3.0.0-preview
        container_name: influx-proxy
        ports:
          - 7076:7076
        environment:
          - TZ=Asia/Shanghai
        volumes:
          - ./proxy.json:/etc/influx-proxy/proxy.json
        restart: unless-stopped
        networks:
          - influx_net
    
      influxdb-1:
        image: influxdb:2.5.1
        container_name: influxdb-1
        restart: unless-stopped
        ports:
          - "8086:8086"
        networks:
          - influx_net
        volumes:
          - ./influxdb1:/var/lib/influxdb2
    
      influxdb-2:
        image: influxdb:2.5.1
        container_name: influxdb-2
        restart: unless-stopped
        ports:
          - "8087:8086"
        networks:
          - influx_net
        volumes:
          - ./influxdb2:/var/lib/influxdb2
    
    networks:
      influx_net:
    
  2. proxy.json代码

    {
        "circles": [
            {
                "name": "circle-1",
                "backends": [
                    {
                        "name": "influxdb-1-1",
                        "url": "http://192.168.137.130:8086",
                        "token": ""
                    },
                    {
                        "name": "influxdb-1-2",
                        "url": "http://192.168.137.130:8087",
                        "token": ""
                    }
                ]
            },
            {
                "name": "circle-2",
                "backends": [
                    {
                        "name": "influxdb-2-1",
                        "url": "http://192.168.137.131:8086",
                        "token": ""
                    },
                    {
                        "name": "influxdb-2-2",
                        "url": "http://192.168.137.131:8087",
                        "token": ""
                    }
                ]
            }
        ],
        "dbrp": {
            "separator": "/",
            "mapping": {"mydb": "admin/analyse", "mydb/myrp": "admin/analyse"}
        },
        "listen_addr": ":7076",
        "data_dir": "data",
        "flush_size": 10000,
        "flush_time": 1,
        "check_interval": 1,
        "rewrite_interval": 10,
        "conn_pool_size": 20,
        "write_timeout": 10,
        "write_tracing": false,
        "query_tracing": false,
        "token": "",
        "pprof_enabled": false,
        "https_enabled": false,
        "https_cert": "",
        "https_key": ""
    }
    
  3. 测试

    数据写入
    sudo curl -XPOST 'http://192.168.137.130:7076/api/v2/write?org=admin&bucket=analyse&precision=s' --data-binary 'mem,host=host3 used_percent=241 1700531671'
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/200686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字符串函数精讲1

又是好几天没有更新了&#xff0c;最近有些忙&#xff0c;但这并不是理由&#xff0c;还是怪我自己玩的时间多了&#xff01;但还是有在每天敲代码的&#xff01;话不多说&#xff0c;开始这一期的学习&#xff1a; strlen的使用和模拟实现 • 字符串以 \0 作为结束标志&#…

java学习part24异常throws

127-异常处理-异常处理方式二&#xff1a;throws_哔哩哔哩_bilibili 1.方法throws 2.如何抉择try和throws 3.手动throw语句 抛出一些java语法上没错但是不符合实际情况的异常。 用throw手动抛&#xff0c;方法上必须加throws。除非是运行时异常。 4.自定义异常

Java常见CodeReview及编码规范

鉴于自己的开发经验,以及常见容易产生bug及性能问题的点做个记录. 1.数据库 如果开发人员的经验不足,Java通过ORM(Mybatis)对数据库的操作的性能问题比较隐蔽.因为不压测或者异常case没发生的时候一般发现不了问题.特别是异常case发生的时候. 除配置表以外的sql都要经过expl…

软件设计师——程序设计语言基础(一)

&#x1f4d1;前言 本文主要是【程序设计语言基础】——程序设计语言基础的相关题目&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#…

荣耀冲击高端,一边推新「修路」,一边降价「拆桥」

作者 | 辰纹 来源 | 洞见新研社 从2020年11月17日与华为分家&#xff0c;开启独立创业之路&#xff0c;到成功逆袭&#xff0c;今年第三季度以18%的份额重回中国智能手机市场榜首&#xff0c;荣耀用了3年时间。 图源&#xff1a;Canalys 在这三年时间内&#xff0c;荣耀经历…

【算法萌新闯力扣】:环形链表及环形链表II

力扣题目&#xff1a;环形链表及环形链表II 开篇 今天是备战蓝桥杯的第26天和算法村开营第4天。挑选了链表的黄金关卡与大家分享。 题目一&#xff1a;环形链表 题目链接: 141.环形链表 题目描述 方法一、哈希表 判断是否有环&#xff0c;可以利用哈希表&#xff0c;遍历…

‘tsc‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近在用nodejs typescript 某游戏服务器在做一些研究 nodejs-tcs 问题描述&#xff1a; 1.使用命令npm install -g typescript安装typescript后&#xff0c;输入 tsc命令&#xff0c;一直报错 tsc 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 2.目…

算法面试题--树与对象数组的转化

1. Array -> Tree var arr [{ id: 12, parentId: 1, name: "朝阳区" },{ id: 241, parentId: 24, name: "田林街道" },{ id: 31, parentId: 3, name: "广州市" },{ id: 13, parentId: 1, name: "昌平区" },{ id: 2421, parentId:…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之存储管理(1)》(14)

[TOC](《Linux操作系统原理分析之存储管理》&#xff08;14&#xff09; 5 存储管理5.1 存储管理的目的和功能5.1.1 存储管理目的&#xff1a;5.1.2 存储管理的主要功能5.1.3 存储管理主要是对用户区进行管理 5.2 地址重定位5.2.1 作业的地址空间5.2.2&#xff0e;地址映射&…

Linux基本指令汇总

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Linux从入门到精通 &#x1f69a;代码仓库&#xff1a;小…

UI自动化测试工具工作原理是怎样的?

随着软件开发的不断演进&#xff0c;保障软件质量成为了至关重要的一环。在这个过程中&#xff0c;UI自动化测试工具崭露头角&#xff0c;为开发团队提供了一种强有力的方式来确保应用程序的稳定性、功能性和兼容性。本文将深入探讨UI自动化测试工具的定义、工作原理以及其在提…

名字大却不中用的AI大模型,名不副实

这两天 OpenAI 团队&#xff08; ChatGPT 公司&#xff09;的戏比较多&#xff0c;两三天的功夫&#xff0c;剧情发展都超出了 OpenAI 首席科学家的预期&#xff0c;目前来看&#xff0c;微软还是最大的赢家。这是个引子&#xff0c;这个话题&#xff0c;网络上早已传烂了&…

InnoDB存储引擎中的锁

文章目录 概要一、需要解决的问题二、共享锁和独占锁1.1 锁定读1.2 表级别的共享锁、独占锁 三、行锁3.1 数据准备3.2 几种常见的行级锁3.3 行锁升级为表锁 概要 关于MySQL涉及到的锁&#xff0c;大致可以总结如下&#xff1a; MyISAM存储引擎在开发过程中几乎很少使用了&…

【重磅合作】九章云极DataCanvas公司与生态伙伴强强联手,构建人工智能强生态!

11月21日&#xff0c;在「筑基赋能 智向未来」九章云极DataCanvas大模型系列成果发布会上&#xff0c;九章云极DataCanvas公司与人工智能产业链上下游合作伙伴广东民营投资股份有限公司&#xff08;以下简称“粤民投”&#xff09;、西藏赛富合银投资有限公司&#xff08;以下简…

通过流量监控分析某个部门或客户端网络性能

在当今数字化时代&#xff0c;网络已经成为组织和企业不可或缺的基础设施之一。作为信息传输和数据交互的关键载体&#xff0c;网络的性能对于保障业务的稳定运行和提升工作效率至关重要。因此&#xff0c;对某个部门或客户端网络的性能进行分析和评估&#xff0c;有助于了解当…

vue2 el-table 封装

vue2 el-table 封装 在 custom 文件夹下面创建 tableList.vue直接上代码&#xff08;代码比较多&#xff0c;复制可直接用&#xff09; <template><div class"mp-list"><el-tableref"multipleTable"class"mp-custom-table":dat…

解决d3dcompiler_43.dll文件丢失的方法,最详细的d3dcompiler_43.dll修复指南

如果你的电脑出现了d3dcompiler_43.dll文件丢失的问题&#xff0c;你知道要怎么去解决么&#xff1f;其实要解决这个问题还是比较简单的&#xff0c;只要你了解清楚d3dcompiler_43.dll文件&#xff0c;那么就知道有多种不同的方法可以去解决它&#xff0c;下面我们一起来看看吧…

bodymovin:AE动画导出为JSONforMac/win中文版下载

对于动画制作爱好者和专业设计师来说&#xff0c;Adobe After Effects&#xff08;AE&#xff09;是一个强大的工具&#xff0c;可以创造出惊人的动画效果。然而&#xff0c;将这些动画导出为可交互的格式一直是一个挑战。现在&#xff0c;有了bodymovin&#xff0c;你可以轻松…

【C++初阶】:简单的图书管理系统(可保存,完整源代码)

图书管理系统 library.h #include<iostream> #include<string> #include<vector> using namespace std;/****************************************************************公共类**********************************************************************…

element-plus 使用密码输入框的自定义图标

<el-inputv-model"ruleFormPassword.newPassword"placeholder"请输入新密码":type"showPassword ? text : password":style"{ width: 360px }"><template #suffix><span class"input_icon" click"swit…