云服务器内容精选

  • 监控指标 如下监控指标需要在实例节点查看,具体方法请参见查看监控指标。 表1 GeminiDB Influx支持的监控指标 指标ID 指标名称 指标含义 取值范围 测量对象 监控周期(原始指标) gemini001_cpu_usage CPU利用率 该指标为从系统层面采集的CPU使用率。 单位:% 0~100 % GeminiDB Influx实例的节点 1分钟 gemini002_mem_usage 内存利用率 该指标为从系统层面采集的内存使用率。 单位:% 0~100 % GeminiDB Influx实例的节点 1分钟 gemini003_bytes_out 网络输出吞吐量 统计平均每秒从测量对象的所有网络适配器输出的流量。 单位:kb/s ≥ 0 kb/s GeminiDB Influx实例的节点 1分钟 gemini004_bytes_in 网络输入吞吐量 统计平均每秒从测量对象的所有网络适配器输入的流量。 单位:kb/s ≥ 0 kb/s GeminiDB Influx实例的节点 1分钟 nosql005_disk_usage 存储容量使用率 该指标为存储容量使用率。 单位:% 0~100 % GeminiDB Influx实例 1分钟 nosql006_disk_total_size 存储容量总容量 该指标为实例的存储容量总容量。 单位:GB ≥ 0 GB GeminiDB Influx实例 1分钟 nosql007_disk_used_size 存储容量使用量 该指标为实例的存储容量使用量。 单位:GB ≥ 0 GB GeminiDB Influx实例 1分钟 influxdb001_series_num 时间线数量 描述总的时间线数量。 单位:Counts ≥ 0 Counts GeminiDB Influx实例的节点 1分钟 influxdb002_query_req_ps 每秒查询请求 描述每秒查询请求的数量。 单位:Counts/s ≥ 0 Counts/s GeminiDB Influx实例的节点 1分钟 influxdb003_write_req_ps 每秒写入请求 描述每秒写入请求的数量。 单位:Counts/s ≥ 0 Counts/s GeminiDB Influx实例的节点 1分钟 influxdb004_write_points_ps 写入数据点 描述每秒写入的数据点数量。 单位:Counts/s ≥ 0 Counts/s GeminiDB Influx实例的节点 1分钟 influxdb005_write_concurrency 写入并发量 描述并发写入的请求数量。 单位:Counts ≥ 0 Counts GeminiDB Influx实例的节点 1分钟 influxdb006_query_concurrency 查询并发量 描述并发查询的请求数量。 单位:Counts ≥ 0 Counts GeminiDB Influx实例的节点 1分钟
  • 使用默认SSL证书连接实例的示例代码 package mainimport ( "fmt" _ "github.com/influxdata/influxdb1-client" // this is important because of the bug in go mod client "github.com/influxdata/influxdb1-client/v2" "os")func main(){ c, err := client.NewHTTPClient(client.HTTPConfig{ Addr: "https://ip:port", // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 username = os.Getenv("EXAMPLE_USERNAME_ENV"), password = os.Getenv("EXAMPLE_PASSWORD_ENV"), Username:username, Password:password, InsecureSkipVerify: true, // true表示不验证服务端的信息,可能存在被攻击的风险,建议设为false,具体请参见使用CCM私有证书连接实例的示例代码。 }) if err != nil { fmt.Println("Error creating InfluxDB Client: ", err.Error()) } q := client.NewQuery("select * from cpu","databases","ns") if response, err := c.Query(q); err == nil && response.Error() == nil { fmt.Println(response.Results) }}
  • 使用CCM私有证书连接实例的示例代码 package mainimport ( "fmt" "io/ioutil" "crypto/tls" "crypto/x509" _ "github.com/influxdata/influxdb1-client" // this is important because of the bug in go mod client "github.com/influxdata/influxdb1-client/v2" "os")func main(){ pool := x509.NewCertPool() caCertPath := "/data/CA/agent/ca.crt" caCrt, err := ioutil.ReadFile(caCertPath) if err != nil { fmt.Println("ReadFile err:", err) return } pool.AppendCertsFromPEM(caCrt) // 此处是将ca.crt证书内嵌到程序中,也可以使用sudo cp {client}/ca.crt /etc/ssl/certs命令将证书添加到本机上。 c, err := client.NewHTTPClient(client.HTTPConfig{ Addr: "https://ip:port", // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 username = os.Getenv("EXAMPLE_USERNAME_ENV"), password = os.Getenv("EXAMPLE_PASSWORD_ENV"), Username: username, Password: password, TLSConfig: &tls.Config{ RootCAs: pool, InsecureSkipVerify: false, // false表示需要校验服务端的证书。 }, }) if err != nil { fmt.Println("Error creating InfluxDB Client: ", err.Error()) } q := client.NewQuery("select * from cpu","database","ns") if response, err := c.Query(q); err == nil && response.Error() == nil { fmt.Println("the result is: ",response.Results) }}
  • 使用非SSL方式连接实例的示例代码 package mainimport ( "fmt" _ "github.com/influxdata/influxdb1-client" // this is important because of the bug in go mod client "github.com/influxdata/influxdb1-client/v2" "os")func main(){ c, err := client.NewHTTPClient(client.HTTPConfig{ Addr: "http://ip:port", // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 username = os.Getenv("EXAMPLE_USERNAME_ENV"), password = os.Getenv("EXAMPLE_PASSWORD_ENV"), Username: username, Password: password, }) if err != nil { fmt.Println("Error creating InfluxDB Client: ", err.Error()) } q := client.NewQuery("select * from cpu","db0","ns") if response, err := c.Query(q); err == nil && response.Error() == nil { fmt.Println("the result is: ",response.Results) } }
  • 实例设置只读状态说明 为保护GeminiDB Influx实例的正常运行,在存储空间即将被写满的时候,数据库会被设置成只读状态,该状态下只支持数据的读取,不支持写入和更新,可以通过扩容存储容量来解除该状态,重新获得写入和更新的能力。 表1 实例设置只读状态说明 存储容量 说明 小于600GB 存储容量使用率(已使用/总容量)达到97%时,实例状态被设置为只读。 存储容量使用率下降到85%,实例自动解除只读状态。 大于或等于600GB 存储容量剩余空间(总容量-已使用)小于18GB,实例状态被设置为只读。 存储容量剩余空间大于或等于90GB,实例自动解除只读状态。 数据库内核采用LSM架构,在写入/删除数据积累到一定量后,后台会自动进行归并,归并会生成新的数据文件,删除老的数据文件,在生成新文件和删除老文件这段过渡期,新老文件会同时存在,磁盘会短暂上涨,上涨量和当时归并涉及的数据量相关,此时可能触发只读状态,建议预留合理的磁盘空间,避免归并任务触发只读状态。
  • 前提条件 已创建CCM私有证书。若未创建CCM私有证书,请参见《 云证书管理服务 用户指南》中“申请私有证书”章节先创建证书。 创建证书时需要将待连接的数据库IP信息添加到证书中,即“配置证书的AltName信息”。若不配置该信息,则会导致数据库连接失败。 若您在创建实例时选择证书功能,此处“证书的AltName信息”只能添加弹性公网IP,因为此时待连接的数据库实例尚未创建成功,无对应的内网IP地址生成,故无法将内网IP地址添加到证书的AltName信息处。 若您是在创建实例成功后,使用重置证书的功能来切换证书信息,此处“证书的AltName信息”可以添加数据库实例所有节点的内网IP地址或者弹性公网IP地址。 图1 创建CCM私有证书 其余参数配置,请参见《 云证书管理 服务用户指南》中“申请私有证书”章节进行设置。
  • 使用非SSL方式连接实例的Java代码示例 package influxdb;import okhttp3.OkHttpClient;import org.influxdb.InfluxDB;import org.influxdb.InfluxDBFactory;import org.influxdb.dto.Point;import org.influxdb.dto.Query;import org.influxdb.dto.QueryResult;import java.util.concurrent.TimeUnit;public class demoNoSSL { public static void main(String[] args) { OkHttpClient.Builder client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .retryOnConnectionFailure(true); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String username = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); final String serverURL = "http://127.0.0.1:8086", username = username, password = password; InfluxDB influxdb = InfluxDBFactory.connect(serverURL, username, password, client); // Create a database... String databaseName = "foo"; influxdb.query(new Query("CREATE DATABASE " + databaseName, databaseName)); influxdb.setDatabase(databaseName); // Write points to influxdb. influxdb.write(Point.measurement("bar") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("location", "chengdu") .addField("temperature", 22) .build()); // Query your data using InfluxQL. QueryResult queryResult = influxdb.query(new Query("SELECT * FROM bar", databaseName)); // Close it if your application is terminating or you are not using it anymore. influxdb.close(); }}
  • 使用须知 支持SELECT查询命令。 支持INSERT写入数据命令。 支持数据库操作命令(包括创建数据库、删除数据库、展示数据库等命令)。 支持用户操作命令(包括创建用户、删除用户、展示用户、授权用户、修改用户密码等命令)。 支持保留策略操作命令(包括创建保留策略、删除保留策略、展示保留策略、修改保留策略等命令)。 支持CONTINUOUS QUERY操作命令(包括创建CONTINUOUS QUERY、删除CONTINUOUS QUERY、展示CONTINUOUS QUERY等命令)。
  • 使用连接池方式连接实例的Java代码示例 package influxdb;import okhttp3.ConnectionPool;import okhttp3.OkHttpClient;import org.influxdb.InfluxDB;import org.influxdb.InfluxDBFactory;import org.influxdb.dto.Point;import org.influxdb.dto.Query;import org.influxdb.dto.QueryResult;import java.util.concurrent.TimeUnit;public class demoConnectionPool { public static void main(String[] args) { // 客户端连接池功能基于OkHttpClient实现 OkHttpClient.Builder client = new OkHttpClient().newBuilder(); client.connectTimeout(10, TimeUnit.SECONDS); client.readTimeout(10, TimeUnit.SECONDS); client.writeTimeout(10, TimeUnit.SECONDS); // 建议设为true,屏蔽部分连接错误,并自动进行重试 client.retryOnConnectionFailure(true); // maxIdleConnections指连接池最多维护的未使用的Idle连接数量,默认值是5 // 超过阈值的idle连接会由连接池关闭,关闭后sockets进入TIME_WAIT状态等待系统回收,该参数需根据实际连接数适当调整 client.connectionPool(new ConnectionPool(5, 30, TimeUnit.SECONDS)); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String username = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); final String serverURL = "http://127.0.0.1:8086", username = username, password = password; InfluxDB influxdb = InfluxDBFactory.connect(serverURL, username, password, client); // Create a database... String databaseName = "foo"; influxdb.query(new Query("CREATE DATABASE " + databaseName, databaseName)); influxdb.setDatabase(databaseName); // Write points to influxdb. influxdb.write(Point.measurement("bar") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("location", "chengdu") .addField("temperature", 22) .build()); // Query your data using InfluxQL. QueryResult queryResult = influxdb.query(new Query("SELECT * FROM bar", databaseName)); // Close it if your application is terminating or you are not using it anymore. influxdb.close(); }}
  • 使用SSL方式连接实例的Java代码示例 package influxdb; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLContext; import okhttp3.OkHttpClient; import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.Point; import org.influxdb.dto.Query; import org.influxdb.dto.QueryResult; import org.apache.http.ssl.SSLContexts; import javax.net.ssl.*; public class demo { public static void main(String[] args) { OkHttpClient.Builder client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .retryOnConnectionFailure(true); client.sslSocketFactory(defaultSslSocketFactory(), defaultTrustManager()); client.hostnameVerifier(noopHostnameVerifier()); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String username = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); final String serverURL = "https://127.0.0.1:8086", username = username, password = password; InfluxDB influxdb = InfluxDBFactory.connect(serverURL, username, password, client); // Create a database... String databaseName = "foo"; influxdb.query(new Query("CREATE DATABASE " + databaseName, databaseName)); influxdb.setDatabase(databaseName); // Write points to influxdb. influxdb.write(Point.measurement("bar") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("location", "chengdu") .addField("temperature", 22) .build()); // Query your data using InfluxQL. QueryResult queryResult = influxdb.query(new Query("SELECT * FROM bar", databaseName)); // Close it if your application is terminating or you are not using it anymore. influxdb.close(); } private static X509TrustManager defaultTrustManager() { return new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } }; } private static SSLSocketFactory defaultSslSocketFactory() { try { SSLContext sslContext = SSLContexts.createDefault(); sslContext.init(null, new TrustManager[] { defaultTrustManager() }, new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } private static HostnameVerifier noopHostnameVerifier() { return new HostnameVerifier() { @Override public boolean verify(final String s, final SSLSession sslSession) { return true;//true 表示使用ssl方式,但是不校验ssl证书,建议使用这种方式 } }; } }
  • 约束与限制 按需计费云数据库绑定的资源(弹性公网IP)可能不支持随实例同步变更计费模式,请参考表1查看绑定资源的计费规则及处理措施。 表1 弹性公网IP计费模式变更规则 资源 计费模式 计费方式 带宽类型 是否支持随GeminiDB Influx按需转包年/包月 处理措施 弹性公网IP 按需计费 按带宽计费 独享带宽 是 在控制台的弹性公网IP页面进行按需转包年/包月操作。 详细内容,请参见变更弹性公网IP计费方式。 弹性公网IP 按需计费 按流量计费 独享带宽 否 按需、按流量计费EIP不支持直接转为包年/包月EIP。变更方法如下: 先转为按需、按带宽计费的EIP。 再由按需、按带宽计费EIP转为包年/包月EIP。 详细内容,请参见变更弹性公网IP计费方式。
  • 约束与限制 包年/包月的云数据库绑定的资源(弹性公网IP)可能不支持随云数据库同步变更计费模式,请参考表1查看绑定资源的计费规则及处理措施。 表1 弹性公网IP计费模式变更规则 资源 计费模式 计费方式 带宽类型 是否支持随GeminiDB Influx包年/包月转按需 处理措施 弹性公网IP 包年/包月 按带宽计费 独享带宽 否 在控制台的弹性公网IP页面进行按需转包年/包月操作。 详细内容,请参见变更弹性公网IP计费方式。 弹性公网IP 包年/包月 按流量计费 独享带宽 否 包年/包月EIP不支持直接转为按需、按流量计费EIP。变更方法如下: 先转为按需、按带宽计费EIP。 再由按需、按带宽计费EIP转为按需、按流量计费EIP。 详细内容,请参见变更弹性公网IP计费方式。
  • 典型应用 IoT传感器时序数据分析 物联网应用,规模和可靠性至关重要。GeminiDB Influx接口提供了高吞吐量和并发性,您可以通过快速的响应时间来支持大量的连接。因此非常适合要求苛刻的物联网应用。 优势: 超强写入 小批量写入场景性能为开源版本InfluxDB的4.5倍,大批量写入场景性能为开源版本InfluxDB的3.3倍。 弹性扩展 基于计算存储分离的分布式架构,分钟级计算节点扩容,应对业务高峰期。 证券及加密货币交易数据 GeminiDB Influx接口存储用户银行的银行流水,可应用于金融行业的风控体系,构建反欺诈系统。 优势: 高效查询 就近区域部署,快速响应查询。 实时分析 数据同步上云,支持云上时序数据分析。 软硬件设备实时监控 使用GeminiDB Influx接口保存用户行为数据,支撑精准营销和用户画像。 优势: 高效写入和查询 最高每天处理万亿级时间点写入能力,多节点多线程并行高性能查询。 实时分析 数据同步上云,支持云上时序数据分析。 都市环保数据采集 GeminiDB Influx接口支持海量时间线的写入,为环保采集点提供稳定可靠的数据库支撑。 优势: 高效写入和查询 向量化查询接口,高效的聚合、卷积等时序数据查询算子,可高效处理高并发大数据量写入和查询。
  • 计费场景 某用户于2023/03/18 15:30:00购买了一个按需计费的GeminiDB Influx实例,规格配置如下: 规格:2vCPUs,8GB 节点数量:3 冷存储空间:500GB 公网带宽:6Mbit/s 用了一段时间后,用户发现实例当前规格无法满足业务需要,于2023/03/20 9:00:00扩容规格为4vCPUs,16GB。因为该实例打算长期使用下去,于2023/03/20 10:30:00将实例转为包年/包月计费,购买时长为1个月。那么在3~4月份,该实例总共产生多少费用呢?
  • 查询 规则 禁止执行SELECT * FROM进行查询。 查询语句必须带上时间范围限制。 业务上线前,一定要对数据库进行性能压测,评估业务峰值场景下,对数据库的负载情况。 建议 执行查询时,只选择需要返回的字段,不需要的字段不要返回。 查询时间范围越小,查询性能越好。 查询时TAG值越精确查询性能越好。尽量是单时间线查询,即指定所有的TAG值,或者尽量指定越多的TAG值。 在查询中的group by time intervals后增加fill(none), fill(none)作用为:对于没有数据点的时间间隔,不返回任何时间戳和值。针对稀疏数据场景,能大幅降低查询返回结果数据量。 在使用嵌套查询时将时间范围的查询条件放在最外层的查询语句中。