华为云用户手册

  • 兼容的接口列表 表1 接口列表 接口名称 CreateTable UpdateTable DescribeTable ListTables DeleteTable PutItem UpdateItem GetItem DeleteItem BatchWriteItem BatchGetItem Query Scan UpdateTimeToLive 表2 CreateTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 CreateTable 请求参数 AttributeDefinitions 是 是 - KeySchema 是 是 - TableName 是 是 Table Name 字符长度3~48,正则表达式([\w-]+)。 BillingMode 否 否 计费属性,暂不支持。 GlobalSecondaryIndexes 否 是 - LocalSecondaryIndexes 否 是 - ProvisionedThroughput 否 是 - SSESpecification 否 否 当前版本不支持,规划中。 StreamSpecification 否 否 当前版本不支持,规划中。 Tags 否 否 当前版本不支持,规划中。 返回参数 TableDescription - 是 - 表3 UpdateTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 UpdateTable 请求参数 AttributeDefinitions 否 是 - BillingMode 否 否 计费属性,不予支持。 GlobalSecondaryIndexesUpdates 是 是 支持Create和Delete,不支持Update。 ProvisionedThroughput 否 否 计费属性,不予支持。 ReplicaUpdates 否 否 默认强一致性。 SSESpecification 否 否 当前版本不支持,规划中。 StreamSpecification 否 否 当前版本不支持,规划中。 TableName 是 是 - 返回参数 TableDescription - 是 - 表4 DescribeTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 DescribeTable 请求参数 TableName 是 是 - 返回参数 Table - 是 不支持itemCount字段。 表5 ListTables接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 ListTables 请求参数 ExclusiveStartTableName 否 是 - Limit 否 是 - 返回参数 LastEvaluatedTableName - 是 - TableNames - 是 - 表6 DeleteTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 DeleteTable 请求参数 TableName 是 是 - 返回参数 TableDescription - 是 - 表7 PutItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 PutItem 请求参数 Item 是 是 - TableName 是 是 - ConditionalOperator 否 否 遗弃参数,见ConditionExpression。 ConditionExpression 否 是 - Expected 否 否 遗弃参数,见该接口中ConditionExpression字段。 ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 ReturnValues 否 是 - 返回参数 Attributes - 是 - ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 表8 UpdateItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 UpdateItem 请求参数 Key 是 是 - TableName 是 是 - AttributeUpdates 否 否 遗弃参数,见该接口中UpdateExpression字段。 ConditionalOperator 否 否 遗弃参数,见该接口中UpdateExpression字段。 ConditionExpression 否 是 - Expected 否 否 遗弃参数,见该接口中UpdateExpression字段。 ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 ReturnValues 否 是 - UpdateExpression 否 是 - 返回参数 Attributes - 是 - ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 表9 GetItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 GetItem 请求参数 Key 是 是 - TableName 是 是 - AttributesToGet 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConsistentRead 否 否 默认强一致性。 ExpressionAttributeNames 否 是 - ProjectionExpression 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 返回参数 ConsumedCapacity - 否 计费属性,暂不支持。 Item - 是 - 表10 DeleteItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 DeleteItem 请求参数 Key 是 是 - TableName 是 是 - ConditionalOperator 否 否 遗弃参数,见该接口中ConditionExpression字段。 ConditionExpression 否 是 - Expected 否 否 遗弃参数,见该接口中ConditionExpression字段。 ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 ReturnValues 否 是 - 返回参数 Attributes - 是 - ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 表11 BatchWriteItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 BatchWriteItem 请求参数 RequestItems 是 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 返回参数 ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 UnprocessedItems - 是 - 表12 BatchGetItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 BatchGetItem 请求参数 RequestItems 是 是 无 ReturnConsumedCapacity 否 否 计费属性,暂不支持。 返回参数 ConsumedCapacity - 否 统计属性,暂不支持。 Responses - 是 - UnprocessedKeys - 是 - 表13 Query接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 Query 请求参数 TableName 是 是 - AttributesToGet 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConditionalOperator 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConsistentRead 否 否 默认强一致性。 ExclusiveStartKey 否 是 - ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - FilterExpression 否 是 - IndexName 否 是 - KeyConditionExpression 否 是 - KeyConditions 否 否 遗弃参数,见该接口中KeyConditionExpression字段。 Limit 否 是 - ProjectionExpression 否 是 - QueryFilter 否 否 遗弃参数,见该接口中FilterExpression字段。 ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ScanIndexForward 否 是 - Select 否 是 不支持Count。 返回参数 ConsumedCapacity - 否 计费属性,暂不支持。 Count - 是 - Items - 是 - LastEvaluatedKey - 是 - ScannedCount - 是 - 表14 Scan接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 Scan 请求参数 TableName 是 是 - AttributesToGet 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConditionalOperator 否 否 遗弃参数,见该接口中ConditionExpression字段。 ConsistentRead 否 否 默认强一致性。 ExclusiveStartKey 否 是 - ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - FilterExpression 否 是 - IndexName 否 是 - Limit 否 是 - ProjectionExpression 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ScanFilter 否 否 遗弃参数,该接口中FilterExpression字段。 Segment 否 是 - Select 否 是 不支持Count类型。 TotalSegments 否 是 - 返回参数 ConsumedCapacity 否 否 计费属性,暂不支持。 Count - 是 - Items - 是 - LastEvaluatedKey - 是 - ScannedCount - 是 - 表15 UpdateTimeToLive接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 UpdateTimeToLive 请求参数 TableName 是 是 - TimeToLiveSpecification 是 是 - 返回参数 TimeToLiveSpecification - 是 -
  • 负载均衡 DynamoDB应用程序通常连接的一个URL,在服务端内部会进行请求的分发。我们希望DynamoDB接口的请求均匀的分布在所有的节点,实现这个目标DynamoDB提供了低成本并且小型的库,将它附加到DynamoDB SDK。其基本原理是客户端维护当前DB集群存活的节点列表,在DynamoDB SDK发送请求前拦截器会修改请求头中的目标地址,从而达到负载均衡的目的。下面提供简单的使用示例: TABLE_NAME ='user' // seed url URL = boto3_lb.setup(['***.***.***.***'],'http',8000,'fake.domain.com') dynamodb = boto3.resource('dynamodb', endpoint_url=URL,region_name='None', aws_access_key_id='None', aws_secret_access_key='None')
  • 使用须知 流量统计以及流量限制,当前版本不支持。 Stream功能、事务功能(TransactWriteItems, TransactGetItems) 不支持。 不支持按需备份接口:CreateBackup、DescribeBackup、 DeleteBackup, ListBackups, RestoreTableFromBackup。 在DynamoDB中,哈希键(或分区键)决定项目将存储在DynamoDB内部存储中的位置。DynamoDB使用专有的哈希函数,GeminiDB DynamoDB采用的是Murmur3算法,这种差异会导致Scan操作在DynamoDB和GeminiDB DynamoDB数据返回的顺序不同。 DynamoDB应用程序指定一个Endpoint地址,采用客户端的负载均衡插件,将请求均匀的发送到后端节点。若不使用该插件,则只会连接单个Endponit。详细负载均衡代码包可联系客服提供。 表/索引名称中不能包含.。 由于编码方式的不同,每行数据大小不会严格400K限制, DDL接口均为同步接口。
  • 支持的表达式 GeminiDB DynamoDB中的ConditionExpression支持的函数语法如下: function ::= attribute_exists (path) | attribute_not_exists (path) | attribute_type (path, type) | begins_with (path, substr) | contains (path, operand) contains(path,operand)中operand只能是属性值(即传入的value占位符)。 GeminiDB DynamoDB中的UpdateExpression语法如下: update-expression ::= [ SET action [, action] ... ] [ REMOVE action [, action] ...] [ ADD action [, action] ... ] [ DELETE action [, action] ...] set-action ::= path =value value ::= operand | operand '+' operand | operand '-' operand operand ::= path | function function ::= if_not_exists (path, value) | list_append (list1, list2) remove-action ::= path add-action ::= path value delete-action ::= path value SET path = operand语法中,不支持operand是path的场景。 SET path = operand1 '+'|'-' operand2语法中,operand1必须等于path,operand2必须是属性值 SET path = if_not_exists (path, value)语法中,两个path必须相等,且value只能是表达式属性值。 所有的value只能是占位符,比如':placeholder'。
  • 使用须知 用户既可以扩大规格,也可以降低规格。 节点规格变更采用滚动方式,单个节点耗时约5-10分钟,总时长与节点数量有关。 正在进行变更的节点,其计算任务由其他节点分担,请在业务低峰变更,避免实例过载。 规格变更过程中,不建议进行DDL操作。 DDL即数据定义语言(Data Definition Language) ,是SQL语言集中负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成。数据定义语言主要负责创建、修改、删除数据库对象(如:表、索引、视图、函数、存储过程和触发器等)。 CPU规格/节点数支持在“实例管理”页面显示,您可以联系客服申请开通。 在变更实例的CPU和内存规格期间,每个节点会串行进行变更,每个节点变更期间会有部分读写失败、时延上升,建议业务空闲时操作。 实例异常时,若强制执行规格变更操作,可能会造成秒级的业务影响,请谨慎选择强制执行规格变更操作。
  • 事件监控支持的事件说明 表1 云数据库 GeminiDB事件监控支持的事件说明 事件来源 事件名称 事件ID 事件级别 事件说明 处理建议 事件影响 NoSQL 创建实例业务失败 NoSQLCreateInstanceFailed 重要 一般是由于实例配额不足或底层资源不足等原因导致。 先释放不再使用的实例再尝试重新发放,或者提交工单调整配额上限。 无法创建数据库实例。 变更规格失败 NoSQLResizeInstanceFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源再重试规格变更操作。 业务中断。 添加节点失败 NoSQLAddNodesFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源,删除添加失败的节点,重新尝试添加新节点。 无 删除节点失败 NoSQLDeleteNodesFailed 重要 一般是由于底层释放资源失败导致。 重新尝试删除节点。 无 扩卷失败 NoSQLScaleUpStorageFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源再重试扩卷操作。 如果磁盘满,会导致业务中断。 重置密码失败 NoSQLResetPasswordFailed 重要 一般是由于重置密码命令超时导致。 重新尝试重置密码操作。 无 修改参数模板失败 NoSQLUpdateInstanceParamGroupFailed 重要 一般是由于修改参数模板命令超时导致。 重新尝试修改参数模板操作。 无 设置备份策略失败 NoSQLSetBackupPolicyFailed 重要 一般是由于数据库连接异常导致。 重新重试设置备份策略操作。 无 创建手动备份失败 NoSQLCreateManualBackupFailed 重要 一般是备份文件导出失败或上传失败等原因导致。 提交工单让运维处理。 无法备份数据。 创建自动备份失败 NoSQLCreateAutomatedBackupFailed 重要 一般是备份文件导出失败或上传失败等原因导致。 提交工单让运维处理。 无法备份数据。 实例运行状态异常 NoSQLFaultyDBInstance 重要 由于灾难或者物理机故障导致实例故障时,会上报该事件,属于关键告警事件。 提交工单。 可能导致数据库服务不可用。 实例运行状态异常已恢复 NoSQLDBInstanceRecovered 重要 针对灾难性的故障,NoSQL有高可用工具会自动进行恢复或者手动恢复,执行完成后会上报该事件。 不需要处理。 无 节点运行状态异常 NoSQLFaultyDBNode 重要 由于灾难或者物理机故障导致数据库节点故障时,会上报该事件,属于关键告警事件。 检查数据库服务是否可以正常使用,并提交工单。 可能导致数据库服务不可用。 节点运行状态异常已恢复 NoSQLDBNodeRecovered 重要 针对灾难性的故障,NoSQL有高可用工具会自动进行恢复或者手动恢复,执行完成后会上报该事件。 不需要处理。 无 实例主备切换 NoSQLPrimaryStandbySwitched 重要 在手动触发的主备倒换或节点故障自动触发的故障倒换场景下,会上报该事件。 不需要处理。 无 出现热点分区键 HotKeyOccurs 重要 客观上是因为主键设置不合理,使得热点数据集中分布在一个分区。客户端不合理的应用程序设计,造成对某一key的频繁读写。 1. 选择合理的分区键。 2. 业务增加缓存,业务应用先从缓存中读取热点数据。 影响业务请求成功率,存在影响集群性能及稳定性的风险。 出现超大分区键 BigKeyOccurs 重要 主键设计不合理,单个分区的记录数或数据量过大,引起了节点负载不均。 1. 选择合理的分区键 2. 基于现有分区键,增加分区键散列。 随着数据量增长,集群稳定性会下降。 数据盘空间不足 NoSQLRiskyDataDiskUsage 重要 数据盘空间不足,产生此告警。 请参见对应服务用户指南中“扩容磁盘”的内容,进行磁盘扩容。 实例被设为只读模式,数据无法写入。 数据盘空间已扩容并恢复可写 NoSQLDataDiskUsageRecovered 重要 数据盘空间已扩容并恢复可写,产生此事件。 无需处理。 无 创建索引失败 NoSQLCreateIndexFailed 重要 业务负载超过实例规格瓶颈,此时再创建索引会耗费更多实例资源,导致响应变慢甚至卡顿,最终超时,引起索引创建失败。 1、根据业务负载,选择匹配的实例规格 2、在业务低峰期创建索引 3、使用后台方式创建索引 4、索引字段,结合业务进行合理选择。 索引创建失败或不完整,导致索引无效,需要删掉索引重新创建。 发生写入降速 NoSQLStallingOccurs 重要 写入速度快,接近集群规模和实例规格范围允许最大写能力,从而触发数据库自身的限流机制,会发生请求失败情况 1. 根据业务的最大写请求速率,调整集群规模或者节点规格 2. 衡量业务的最大写请求速率,分散业务写峰值速率 影响业务的请求的成功率 发生写入停止 NoSQLStoppingOccurs 重要 写入速度过快,达到集群规模和实例规格范围允许最大写能力,从而触发数据库自身的限流机制,会发生请求失败情况 1. 根据业务的最大写请求速率,调整集群规模或者节点规格 2. 衡量业务的最大写请求速率,分散业务写峰值速率 影响业务的请求的成功率 重启数据库失败 NoSQLRestartDBFailed 重要 一般是由于实例状态异常等原因导致。 提交工单让运维处理。 数据库实例状态可能存在异常。 恢复到新实例失败 NoSQLRestoreToNewInstanceFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源,重新尝试添加新节点。 无法恢复到新的数据库实例。 恢复到已有实例失败 NoSQLRestoreToExistInstanceFailed 重要 一般是由于备份文件下载或恢复失败等原因导致。 提交工单让运维处理。 当前数据库实例可能处于不可用状态。 删除备份文件失败 NoSQLDeleteBackupFailed 重要 一般是由于备份文件从obs删除失败导致。 重新尝试删除备份文件。 无 切换慢日志明文开关失败 NoSQLSwitchSlowlogPlainTextFailed 重要 一般是由于接口不支持切换等原因导致。 请查阅NoSQL用户指南,确认接口支持打开慢日志明文开关。提交工单让运维处理。 无 绑定EIP失败 NoSQLBindEipFailed 重要 一般是由于节点状态不正常,节点已经绑定EIP或EIP非法等原因导致。 检查节点是否正常,EIP是否合法。 无法通过公网访问数据库实例。 解绑EIP失败 NoSQLUnbindEipFailed 重要 一般是由于节点状态不正常,节点已经未绑定EIP等原因导致。 检查节点和EIP状态是否正常。 无 修改参数失败 NoSQLModifyParameterFailed 重要 一般是由于参数取值非法等原因导致。 排查参数值是否符合在合法范围内,提交工单让运维处理。 无 参数模板应用失败 NoSQLApplyParameterGroupFailed 重要 一般是由于实例状态异常导致参数模板无法应用等原因导致。 提交工单让运维处理。 无 开启或关闭SSL失败 NoSQLSwitchSSLFailed 重要 一般是由于修改SSL命令超时导致。 重新提交一次或者提交工单处理,并先保持切换之前使用SSL的连接方式。 是否使用SSL连接。 单行数据量太大 LargeRowOccurs 重要 用户单行数据量过大,可能会导致查询超时,进而节点OOM异常等各种故障发生。 1. 对每列和每行的写入长度做限制,遵从规范,使得单行的的key和value长度和不超过阈值。 2. 排查业务是否出现异常写入和异常编码,导致写入大row。 过大的单行记录,随着数据量增长,集群稳定性会下降。 父主题: 事件监控
  • 查询性能测试数据 不同业务模型和实例规格下,查询性能测试数据不同,详情请参见如下表格。 不同业务模型说明请参见表1。 测试实例类型:集群,规格:4U16GB,测试并发数:20,执行100万次,计算平均值 表3 测试数据 测试模型 OPS(单位:queries/sec) 平均时延(单位:ms) 最小时延(单位:ms) 最大时延(单位:ms) high-cpu-all 710.81 28.12 9.35 714.11 single-groupby-1-8-1 1308.56 13.74 2.56 148.96 single-groupby-1-1-1 6393.67 3.10 1.43 45.02 cpu-max-all-1 850.51 23.49 6.16 715.23
  • 使用须知 当有对应的补丁更新时(定期同步开源社区问题、漏洞修复),请及时进行升级。 当数据库版本为风险版本时,会提醒用户进行数据库补丁升级。 补丁升级会采用滚动升级的方式,升级过程中会依次重启每一个节点,重启期间业务会由其他节点接管,每次接管会产生5-10s闪断,请在业务低峰变更,避免实例过载,并建议业务添加自动重连机制,确保重启后连接及时重建。 基础组件升级约需15分钟,数据组件升级与节点数量有关,约1-2min每节点。
  • 支持审计的关键操作列表 通过云审计服务,您可以记录与GeminiDB Influx相关的操作事件,便于日后的查询、审计和回溯。 表1 GeminiDB Influx的关键操作列表 操作名称 资源类型 事件名称 创建实例 instance NoSQLCreateInstance 删除实例 instance NoSQLDeleteInstance 扩容节点 instance NoSQLEnlargeInstance 缩容节点 instance NoSQLReduceInstance 重启实例 instance NoSQLRestartInstance 恢复到新实例 instance NoSQLRestoreNewInstance 磁盘扩容 instance NoSQLExtendInstanceVolume 重置密码 instance NoSQLResetPassword 修改实例名称 instance NoSQLRenameInstance 规格变更 instance NoSQLResizeInstance 绑定弹性公网IP instance NoSQLBindEIP 解绑弹性公网IP instance NoSQLUnBindEIP 实例冻结 instance NoSQLFreezeInstance 实例解冻 instance NoSQLUnfreezeInstance 创建备份 backup NoSQLCreateBackup 删除备份 backup NoSQLDeleteBackup 设置备份策略 backup NoSQLSetBackupPolicy 添加实例标签 tag NoSQLAddTags 修改实例标签 tag NoSQLModifyInstanceTag 删除实例标签 tag NoSQLDeleteInstanceTag 创建参数模板 parameterGroup NoSQLCreateConfigurations 修改参数模板 parameterGroup NoSQLUpdateConfigurations 修改实例参数 parameterGroup NoSQLUpdateInstanceConfigurations 复制参数模板 parameterGroup NoSQLCopyConfigurations 重置参数模板 parameterGroup NoSQLResetConfigurations 应用参数模板 parameterGroup NoSQLApplyConfigurations 删除参数模板 parameterGroup NoSQLDeleteConfigurations 删除扩容失败的节点 instance NoSQLDeleteEnlargeFailNode 切换SSL instance NoSQLSwitchSSL 修改实例安全组 instance NoSQLModifySecurityGroup 实例导出参数模板 instance NoSQLSaveConfigurations 回收站策略 instance NoSQLModifyRecyclePolicy 父主题: 审计
  • 使用非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(); } }
  • 使用连接池方式连接实例的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证书,建议使用这种方式 } }; } }
  • 使用须知 支持SELECT查询命令。 支持INSERT写入数据命令。 支持数据库操作命令(包括创建数据库、删除数据库、展示数据库等命令)。 支持用户操作命令(包括创建用户、删除用户、展示用户、授权用户、修改用户密码等命令)。 支持保留策略操作命令(包括创建保留策略、删除保留策略、展示保留策略、修改保留策略等命令)。 支持CONTINUOUS QUERY操作命令(包括创建CONTINUOUS QUERY、删除CONTINUOUS QUERY、展示CONTINUOUS QUERY等命令)。
  • 使用须知 当有对应的补丁更新时(定期同步开源社区问题、漏洞修复),请及时进行升级。 当数据库版本为风险版本时,会提醒用户进行数据库补丁升级。 补丁升级会采用滚动升级的方式,升级过程中会依次重启每一个节点,重启期间业务会由其他节点接管,每次接管会产生3-5s闪断,请在业务低峰变更,避免实例过载,并建议业务添加自动重连机制,确保重启后连接及时重建。 基础组件升级约需15分钟,数据组件升级与节点数量有关,约1-2min每节点。 升级过程中会重启实例,业务会中断,中断时间受业务、节点数和数据量等因素影响,请选择在业务低峰期进行升级。
  • 测试环境 区域:华北-北京四 可用区:可用区一 弹性云服务器(Elastic Cloud Server,简称ECS):规格选择通用计算型s3.2xlarge.2,8U16GB,操作系统镜像使用CentOS 7.5 64位版本。 被测试副本集实例的规格:覆盖副本集实例支持的全部规格类型,详见表1。 表1 副本集规格 副本集编号 数据库版本 实例规格 被测副本集1 4.0 4U16GB 被测副本集2 4.0 8U32GB 被测副本集3 4.0 16U64GB 被测副本集4 4.0 32U128GB
  • 测试模型 workload模型 表2 workload模型 workload模型编号 workload模型 S1 100% insert S2 90% update ,10% read S3 65% read ,25% insert, 10% update S4 90% read ,5% insert, 5% update S5 50% update, 50% read S6 100% read 测试并发数 :128 文档模型 使用YCSB默认配置,每个文档大小1KB,默认“_id”索引。 预置数据量 本次性能测试中,针对每种规格的副本集,测试了2种预置数据量下的性能。 不同规格副本集的预置数据量不同,具体如下表所示。 表3 预置数据量 副本集编号 实例规格 预置小数据量 预置大数据量 被测副本集1 4U16GB 存储容量:10GB RecordCount:10000000 存储容量:100GB RecordCount:100000000 被测副本集2 8U32GB 存储容量:10GB RecordCount:10000000 存储容量:100GB RecordCount:100000000 被测副本集3 16U64GB 存储容量:10GB RecordCount:10000000 存储容量:100GB RecordCount:100000000 被测副本集4 32U128GB 存储容量:10GB RecordCount:10000000 存储容量:100GB RecordCount:100000000 数据一致性模型 弱一致性:Write Concern为{w : 1, j : false},数据写入单个节点磁盘,将返回结果。后台异步持久化下盘,为默认的Write Concern设置。
  • 副本集实例规格 表1 GeminiDB Mongo副本集实例规格 规格名称 vCPU(个) 内存(GB) 最小存储空间(GB) 最大存储空间(GB) 缺省最大连接数配置 geminidb.mongodb.repset.large.4 2 8 100 600 400 geminidb.mongodb.repset.xlarge.4 4 16 100 1,200 1,000 geminidb.mongodb.repset.2xlarge.4 8 32 100 2,400 4,000 geminidb.mongodb.repset.4xlarge.4 16 64 100 4,800 8,000 geminidb.mongodb.repset.8xlarge.4 32 128 100 9,600 16,000 geminidb.mongodb.repset.xlarge.8 4 32 100 1,200 1,000 geminidb.mongodb.repset.2xlarge.8 8 64 100 2,400 4,000 geminidb.mongodb.repset.4xlarge.8 16 128 100 4,800 8,000 geminidb.mongodb.repset.8xlarge.8 32 256 100 9,600 16,000
  • 性能测试数据 不同业务模型和实例规格下,针对弱一致性,预置1000万行数据量,测试的OPS*数据(表格中黑色字体),详见表1中加粗内容。 表1 测试数据 实例规格 4U16GB 8U32GB 16U64GB 32U128GB 业务模型编号 s1 35263 69490 75332 92332 业务模型编号 s2 13399 26732 39276 50833 业务模型编号 s3 19959 55442 79135 98611 业务模型编号 s4 23338 75905 89156 101306 业务模型编号 s5 16829 35224 60616 81019 业务模型编号 s6 29286 64882 97377 121071 *OPS:Operation Per Second,数据库每秒执行的操作数。 *业务模型编号:业务模型编号对应的业务模型,请参见表2。 不同业务模型和实例规格下,针对弱一致性,预置1亿行数据量,测试的OPS*数据(表格中黑色字体),详见表2中加粗内容。 表2 测试数据 实例规格 4U16GB 8U32GB 16U64GB 32U128GB 业务模型编号 s1 18448 27976 33296 51920 业务模型编号 s2 9004 14565 19961 26589 业务模型编号 s3 15431 27476 32161 50332 业务模型编号 s4 14926 25745 33258 48924 业务模型编号 s5 11541 14272 17733 23160 业务模型编号 s6 15637 17452 27827 49384 *OPS:Operation Per Second,数据库每秒执行的操作数。 *业务模型编号:业务模型编号对应的业务模型,请参见表2。 父主题: 副本集
  • 支持审计的关键操作列表 通过云审计服务,您可以记录与GeminiDB Mongo相关的操作事件,便于日后的查询、审计和回溯。 表1 GeminiDB Mongo的关键操作列表 操作名称 资源类型 事件名称 创建实例 instance NoSQLCreateInstance 删除实例 instance NoSQLDeleteInstance 重启实例 instance NoSQLRestartInstance 恢复到新实例 instance NoSQLRestoreNewInstance 磁盘扩容 instance NoSQLExtendInstanceVolume 重置密码 instance NoSQLResetPassword 修改实例名称 instance NoSQLRenameInstance 规格变更 instance NoSQLResizeInstance 绑定弹性公网IP instance NoSQLBindEIP 解绑弹性公网IP instance NoSQLUnBindEIP 实例冻结 instance NoSQLFreezeInstance 实例解冻 instance NoSQLUnfreezeInstance 创建备份 backup NoSQLCreateBackup 删除备份 backup NoSQLDeleteBackup 设置备份策略 backup NoSQLSetBackupPolicy 添加实例标签 tag NoSQLAddTags 修改实例标签 tag NoSQLModifyInstanceTag 删除实例标签 tag NoSQLDeleteInstanceTag 创建参数模板 parameterGroup NoSQLCreateConfigurations 修改参数模板 parameterGroup NoSQLUpdateConfigurations 修改实例参数 parameterGroup NoSQLUpdateInstanceConfigurations 复制参数模板 parameterGroup NoSQLCopyConfigurations 重置参数模板 parameterGroup NoSQLResetConfigurations 应用参数模板 parameterGroup NoSQLApplyConfigurations 删除参数模板 parameterGroup NoSQLDeleteConfigurations 切换SSL instance NoSQLSwitchSSL 修改实例安全组 instance NoSQLModifySecurityGroup 恢复已有实例 backup NoSQLRestoreOldInstance 实例导出参数模板 instance NoSQLSaveConfigurations 回收站策略 instance NoSQLModifyRecyclePolicy 父主题: 审计
  • 事件监控支持的事件说明 表1 云数据库 GeminiDB事件监控支持的事件说明 事件来源 事件名称 事件ID 事件级别 事件说明 处理建议 事件影响 NoSQL 创建实例业务失败 NoSQLCreateInstanceFailed 重要 一般是由于实例配额不足或底层资源不足等原因导致。 先释放不再使用的实例再尝试重新发放,或者提交工单调整配额上限。 无法创建数据库实例。 变更规格失败 NoSQLResizeInstanceFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源再重试规格变更操作。 业务中断。 添加节点失败 NoSQLAddNodesFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源,删除添加失败的节点,重新尝试添加新节点。 无 删除节点失败 NoSQLDeleteNodesFailed 重要 一般是由于底层释放资源失败导致。 重新尝试删除节点。 无 扩卷失败 NoSQLScaleUpStorageFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源再重试扩卷操作。 如果磁盘满,会导致业务中断。 重置密码失败 NoSQLResetPasswordFailed 重要 一般是由于重置密码命令超时导致。 重新尝试重置密码操作。 无 修改参数模板失败 NoSQLUpdateInstanceParamGroupFailed 重要 一般是由于修改参数模板命令超时导致。 重新尝试修改参数模板操作。 无 设置备份策略失败 NoSQLSetBackupPolicyFailed 重要 一般是由于数据库连接异常导致。 重新重试设置备份策略操作。 无 创建手动备份失败 NoSQLCreateManualBackupFailed 重要 一般是备份文件导出失败或上传失败等原因导致。 提交工单让运维处理。 无法备份数据。 创建自动备份失败 NoSQLCreateAutomatedBackupFailed 重要 一般是备份文件导出失败或上传失败等原因导致。 提交工单让运维处理。 无法备份数据。 实例运行状态异常 NoSQLFaultyDBInstance 重要 由于灾难或者物理机故障导致实例故障时,会上报该事件,属于关键告警事件。 提交工单。 可能导致数据库服务不可用。 实例运行状态异常已恢复 NoSQLDBInstanceRecovered 重要 针对灾难性的故障,NoSQL有高可用工具会自动进行恢复或者手动恢复,执行完成后会上报该事件。 不需要处理。 无 节点运行状态异常 NoSQLFaultyDBNode 重要 由于灾难或者物理机故障导致数据库节点故障时,会上报该事件,属于关键告警事件。 检查数据库服务是否可以正常使用,并提交工单。 可能导致数据库服务不可用。 节点运行状态异常已恢复 NoSQLDBNodeRecovered 重要 针对灾难性的故障,NoSQL有高可用工具会自动进行恢复或者手动恢复,执行完成后会上报该事件。 不需要处理。 无 实例主备切换 NoSQLPrimaryStandbySwitched 重要 在手动触发的主备倒换或节点故障自动触发的故障倒换场景下,会上报该事件。 不需要处理。 无 出现热点分区键 HotKeyOccurs 重要 客观上是因为主键设置不合理,使得热点数据集中分布在一个分区。客户端不合理的应用程序设计,造成对某一key的频繁读写。 1. 选择合理的分区键。 2. 业务增加缓存,业务应用先从缓存中读取热点数据。 影响业务请求成功率,存在影响集群性能及稳定性的风险。 出现超大分区键 BigKeyOccurs 重要 主键设计不合理,单个分区的记录数或数据量过大,引起了节点负载不均。 1. 选择合理的分区键 2. 基于现有分区键,增加分区键散列。 随着数据量增长,集群稳定性会下降。 数据盘空间不足 NoSQLRiskyDataDiskUsage 重要 数据盘空间不足,产生此告警。 请参见对应服务用户指南中“扩容磁盘”的内容,进行磁盘扩容。 实例被设为只读模式,数据无法写入。 数据盘空间已扩容并恢复可写 NoSQLDataDiskUsageRecovered 重要 数据盘空间已扩容并恢复可写,产生此事件。 无需处理。 无 创建索引失败 NoSQLCreateIndexFailed 重要 业务负载超过实例规格瓶颈,此时再创建索引会耗费更多实例资源,导致响应变慢甚至卡顿,最终超时,引起索引创建失败。 1、根据业务负载,选择匹配的实例规格 2、在业务低峰期创建索引 3、使用后台方式创建索引 4、索引字段,结合业务进行合理选择。 索引创建失败或不完整,导致索引无效,需要删掉索引重新创建。 发生写入降速 NoSQLStallingOccurs 重要 写入速度快,接近集群规模和实例规格范围允许最大写能力,从而触发数据库自身的限流机制,会发生请求失败情况 1. 根据业务的最大写请求速率,调整集群规模或者节点规格 2. 衡量业务的最大写请求速率,分散业务写峰值速率 影响业务的请求的成功率 发生写入停止 NoSQLStoppingOccurs 重要 写入速度过快,达到集群规模和实例规格范围允许最大写能力,从而触发数据库自身的限流机制,会发生请求失败情况 1. 根据业务的最大写请求速率,调整集群规模或者节点规格 2. 衡量业务的最大写请求速率,分散业务写峰值速率 影响业务的请求的成功率 重启数据库失败 NoSQLRestartDBFailed 重要 一般是由于实例状态异常等原因导致。 提交工单让运维处理。 数据库实例状态可能存在异常。 恢复到新实例失败 NoSQLRestoreToNewInstanceFailed 重要 一般是由于底层资源不足等原因导致。 提交工单让运维在后台协调资源,重新尝试添加新节点。 无法恢复到新的数据库实例。 恢复到已有实例失败 NoSQLRestoreToExistInstanceFailed 重要 一般是由于备份文件下载或恢复失败等原因导致。 提交工单让运维处理。 当前数据库实例可能处于不可用状态。 删除备份文件失败 NoSQLDeleteBackupFailed 重要 一般是由于备份文件从obs删除失败导致。 重新尝试删除备份文件。 无 切换慢日志明文开关失败 NoSQLSwitchSlowlogPlainTextFailed 重要 一般是由于接口不支持切换等原因导致。 请查阅NoSQL用户指南,确认接口支持打开慢日志明文开关。提交工单让运维处理。 无 绑定EIP失败 NoSQLBindEipFailed 重要 一般是由于节点状态不正常,节点已经绑定EIP或EIP非法等原因导致。 检查节点是否正常,EIP是否合法。 无法通过公网访问数据库实例。 解绑EIP失败 NoSQLUnbindEipFailed 重要 一般是由于节点状态不正常,节点已经未绑定EIP等原因导致。 检查节点和EIP状态是否正常。 无 修改参数失败 NoSQLModifyParameterFailed 重要 一般是由于参数取值非法等原因导致。 排查参数值是否符合在合法范围内,提交工单让运维处理。 无 参数模板应用失败 NoSQLApplyParameterGroupFailed 重要 一般是由于实例状态异常导致参数模板无法应用等原因导致。 提交工单让运维处理。 无 开启或关闭SSL失败 NoSQLSwitchSSLFailed 重要 一般是由于修改SSL命令超时导致。 重新提交一次或者提交工单处理,并先保持切换之前使用SSL的连接方式。 是否使用SSL连接。 单行数据量太大 LargeRowOccurs 重要 用户单行数据量过大,可能会导致查询超时,进而节点OOM异常等各种故障发生。 1. 对每列和每行的写入长度做限制,遵从规范,使得单行的的key和value长度和不超过阈值。 2. 排查业务是否出现异常写入和异常编码,导致写入大row。 过大的单行记录,随着数据量增长,集群稳定性会下降。 父主题: 事件监控
  • 操作步骤 获取GeminiDB Redis实例的负载均衡地址和端口信息。 负载均衡地址的查看方法请参见查看查看负载均衡地址及端口。 端口信息的获取方法请参见查看查看实例节点端口。 各实例地址的查看方法请参见查看查看内网IP地址或弹性公网IP。 登录弹性云服务器,具体操作请参见《弹性云服务器快速入门》中“登录弹性云服务器”。 安装.Net。Windows主机前往进入.NET官网下载,Linux主机需要安装 .NET Core 的密钥和存储库,再安装.Net运行时和SDK: sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-7.0 sudo yum install dotnet-runtime-7.0 运行 dotnet --version 你将会看到你的.Net版本信息。 使用StackExchange.Redis客户端连接GeminiDB Redis实例。 创建项目 在命令行窗口中运行以下命令创建一个新的C#控制台应用程序;或者在Visual Studio中创建一个新的C#控制台应用程序。 dotnet new console -o redisdemo 安装Redis的C#客户端 StackExchange.Redis包。Visual Studio中您可以从NuGet包管理器中安装StackExchange.Redis。或者dotnet项目所在的命令行窗口,运行以下命令: dotnet add package StackExchange.Redis 使用单机方式连接GeminiDB Redis using System; using StackExchange.Redis; namespace redisdemo { class Program { static void Main(string[] args) { // 创建一个连接到Redis服务器的ConnectionMultiplexer对象 string redisConnectionString = " 192.xx.xx.xx:6379"; // 步骤1获取到的负载均衡地址 ConfigurationOptions options = ConfigurationOptions.Parse(redisConnectionString); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 string password = Environment.GetEnvironmentVariable("EXAMPLE_PASSWORD_ENV"); options.Password = password; ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options); // 获取Redis数据库对象 IDatabase redisDb = redis.GetDatabase(); // 设置一个键值对 string key = "mykey"; string value = "myvalue"; redisDb.StringSet(key, value); string valueGet = redisDb.StringGet(key); Console.WriteLine($"键 {key} 对应的值为:{valueGet}"); } } } 预期输出 键 mykey 对应的值为:myvalue 使用集群方式连接GeminiDB Redis集群 using System; using StackExchange.Redis; namespace redisdemo { class Program { static void Main(string[] args) { ConfigurationOptions options = new ConfigurationOptions(); options.EndPoints.Add("192.xx.xx.xx:6379"); // 步骤1获得的实例集群节点1的地址和端口号 options.EndPoints.Add("192.xx.xx.xx:6379"); // 步骤1获得的实例集群节点2的地址和端口号 options.Password = "your_password"; // 设置密码 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options); // 获取Redis数据库对象 IDatabase redisDb = redis.GetDatabase(); // 设置一个键值对 string key = "mykey"; string value = "myvalue"; redisDb.StringSet(key, value); string valueGet = redisDb.StringGet(key); Console.WriteLine($"键 {key} 对应的值为:{valueGet}"); } } } 预期输出 键 mykey 对应的值为:myvalue
  • 性能测试结果 基于上述样本,预先注入1TB+数据并进行压力测试,测试结果如下: 数据压缩率: 写入1.1TB数据(约38亿条),压缩后数据占用约为155GB,数据压缩比约为13.8%; 性能表现: 维持业务总QPS达到约160w,此时读请求总流量约为1.5Gb/s,实例CPU利用率在60%-70%。 平均时延约为0.7ms,P99长尾时延约为1.77ms。 本次测试结果表明,在大规模RTA场景,GeminiDB Redis有稳定的时延性能,同时基于数据压缩和支持计算/存储独立选配的特性,非常适合作为广告业务的KV数据库选型。 父主题: GeminiDB Redis接口广告RTA场景性能数据
  • 使用SingleServer模式连接实例 样例代码: import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; public class SingleServerTests { private static void testSingleServer() { Config config = new Config(); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); config.useSingleServer().setAddress("redis://172.xx.xx.xx:8635") .setPassword(password); RedissonClient redisson = Redisson.create(config); execute(redisson); // send requests to database redisson.shutdown(); } public static void main(String[] args) { testSingleServer(); } }
  • 使用Sentinel模式连接实例 样例代码: import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import static org.redisson.config.ReadMode.MASTER; public class SingleServerTests { public static void testSentinel() { Config config = new Config(); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); config.useSentinelServers() .setMasterName(master_name) .setCheckSentinelsList(false) .setReadMode(MASTER) .setPassword(password) .addSentinelAddress("redis://172.xx.xx.xx:8635"); RedissonClient redisson = Redisson.create(config); execute(redisson); // send requests to database redisson.shutdown(); } public static void main(String[] args) { testSentinel(); } } 上述代码中“172.xx.xx.xx”为待连接GeminiDB Redis实例的负载均衡地址。 您可以单击实例名称,进入“基本信息”页面,在网络信息区域获取“负载均衡地址”。 图2 查看负载均衡地址 上述代码中的“8635”为待连接GeminiDB Redis实例的端口,具体请以实际端口为准。获取端口的方法请参见查看IP地址和端口。 GeminiDB Redis只是实现了Sentinel模式的接入方式,不采用原生sentinel的可用性功能。所以样例代码中,master_name固定为“mymaster”,必须设置“CheckSentinelsList”为fasle,必须设置ReadMode为MASTER。 GeminiDB Redis支持与限制的命令,详情请参见开发运维规范。 由于GeminiDB Redis和开源Redis集群计算hash算法不同,因此GeminiDB Redis的部分命令需要给对应的key打上hash tag,否则会出现非预期的行为。hash tag使用建议参考开发运维规范。
  • 使用ClusterServer模式连接实例 样例代码: import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; public class ClusterServerTests { private static void testClusterServer() { Config config = new Config(); config.useClusterServers() .addNodeAddress("172.xx.xx.xx:8635").setPassword(password); RedissonClient redisson = Redisson.create(config); execute(redisson); // send requests to database redisson.shutdown(); } public static void main(String[] args) { testClusterServer(); } } 上述代码中“172.xx.xx.xx”为待连接GeminiDB Redis实例的负载均衡地址。 您可以单击实例名称,进入“基本信息”页面,在网络信息区域获取“负载均衡地址”。 图3 查看负载均衡地址 上述代码中的“8635”为待连接GeminiDB Redis实例的端口,具体请以实际端口为准。获取端口的方法请参见查看IP地址和端口。 GeminiDB Redis支持与限制的命令,详情请参见开发运维规范。 由于GeminiDB Redis和开源Redis集群计算hash算法不同,因此GeminiDB Redis的部分命令需要给对应的key打上hash tag,否则会出现非预期的行为。hash tag使用建议参考开发运维规范。
  • 修订记录 发布日期 修订记录 2023-08-30 第三十五次正式发布。 新增计费说明。 2023-07-18 第三十四次正式发布。 新增入门实践 2023-06-30 第三十三次正式发布。 新增事件监控。 2023-05-30 第三十二次正式发布。 新增实例会话。 新增命令重命名。 2023-04-28 第三十一次正式发布。 实例规格说明,单节点最小持久化数据存储空间(GB)变更为原来的一半。 GeminiDB Redis支持的监控指标,新增“redis669_connection_usage”和“redis670_hit_rate”两个指标。 2023-03-31 第三十次正式发布。 新增操作系统更新。 2023-03-06 第二十九次正式发布。 账号管理,账号管理支持账号变更(如创建账号、修改账号、删除账号)。 2022-07-07 第二十八次正式发布。 命令兼容列表,新增布隆过滤器使用说明。 2022-06-02 第二十七次正式发布。 购买实例(集群版),规格选择模式新增快速选择模式。 购买实例(集群版),实例类型支持Proxy通用版、实例版本支持5.0及以下。 通过负载均衡地址连接实例(推荐),负载均衡地址展示端口信息。 2022-04-27 第二十六次正式发布。 刷新客户端通过代码连接实例示例。 2022-03-15 第二十五次正式发布。 新增控制台连接GeminiDB Redis。 新增keyspace通知功能。 2022-03-07 第二十四次正式发布。 新增常见问题:GeminiDB Redis是否支持多DB。 购买实例(集群版),修改实例名称,优化中文名称长度。 2022-01-27 第二十三次正式发布。 包周期实例支持规格变更。 支持批量续费、退订、按需计费转包年/包月、包年/包月转按需计费操作。 2022-01-10 第二十二次正式发布。 更新使用规范。 2021-09-27 第二十一次正式发布。 购买实例(集群版)、通过内网IP连接实例、通过弹性公网IP连接实例、设置SSL数据加密,支持公网SSL协议访问加密。 3.3.13.2-慢日志,支持慢日志。 2021-06-30 第二十次正式发布。 修改实例安全组,GeminiDB Redis支持修改安全组。 购买实例(集群版),GeminiDB Redis实例名称支持中文。 2021-06-15 第十九次正式发布。 调整文档结构。 2021-04-30 第十八次正式发布。 实例规格说明,增加不同规格实例支持的最小存储容量。 实例规格说明,存储空间上限从内存的4倍调整成8倍。 2021-04-15 第十七次正式发布。 调整文档结构。 GeminiDB Redis监控指标更新。 GeminiDB Redis购买页面优化。 2021-01-30 第十六次正式发布。 GeminiDB Redis支持绑定解绑弹性公网IP。 GeminiDB Redis购买页面优化。 实例操作列增加规格变更、添加节点和磁盘扩容入口。 2020-12-30 第十五次正式发布。 GeminiDB Redis支持负载均衡地址。 2020-11-30 第十四次正式发布。 GeminiDB Redis增加命令限制列表。 2020-10-30 第十三次正式发布。 资源标签支持20个配额。 扩容磁盘支持每次至少选择1GB扩容量。 GeminiDB Redis支持通过高级运维功能。 GeminiDB Redis支持通过控制台修改密码。 2020-08-30 第十一次正式发布。 GeminiDB Redis支持如下功能: 支持修改实例名称 支持实例回收站 支持包周期计费模式 新增监控指标 2020-06-30 第九次正式发布。 GeminiDB Redis支持跨AZ级容灾。 2020-05-30 第九次正式发布。 GeminiDB Redis支持存储扩容。 GeminiDB Redis支持重启实例。 GeminiDB Redis支持全量备份恢复到新实例。 GeminiDB Redis支持自动备份管理。 GeminiDB Redis支持手动备份管理。 2020-01-20 第五次正式发布。 GeminiDB Redis公测。
  • 使用连接池方式连接实例的Java代码示例 package nosql.cloud.huawei.jedis; import redis.clients.jedis.*; public class MainBitMao { public static void main(String[] args) { // 初始化Jedis资源池配置 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 设置资源池中的最大连接数 jedisPoolConfig.setMaxTotal(10); // 设置资源池允许的最大空闲连接数 jedisPoolConfig.setMaxIdle(10); // 设置资源池确保的最少空闲连接数 jedisPoolConfig.setMinIdle(2); // 根据配置初始化Jedis资源池 // note: 若版本不支持user ACL机制, user必须为null JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 8635, null, "********"); // 从资源池里获取连接 try (Jedis jedis = jedisPool.getResource()){ // 初始化key value String key = "test_key", value = "test_value"; // do something... // set存储(key, value)对 jedis.set(key, value); // get获取key对应的value值 jedis.get(key); // do something... } // 关闭资源池 jedisPool.close(); } }
  • 连接方式介绍 GeminiDB Redis兼容开源Redis接口,支持应用程序使用多种SDK访问。同时还提供控制台、内网、公网的访问途径。 表1 连接方式 连接方式 使用场景 说明 控制台连接 GeminiDB Redis支持通过管理控制台的Web客户端连接Redis实例 - 内网连接 介绍通过内网IP、内网域名或负载均衡地址连接GeminiDB Redis实例的方法。 该方式适用于当应用部署在弹性云服务器上,且该弹性云服务器与数据库实例处于同一区域、同一VPC内时连接数据库实例。 推荐使用负载均衡地址或内网域名的方式,可靠性高,可消除单点故障影响。 安全性高,可实现数据库实例的较好性能。 公网连接 介绍通过公网域名、弹性公网IP或负载均衡器绑定弹性公网IP连接GeminiDB Redis实例的方法。 该方式适用于不能通过内网方式访问数据库实例时,可以单独使用公网域名或弹性公网IP连接弹性云服务器(或公网主机)与数据库实例。 为了获得更快的传输速率和更高的安全性,建议您将应用迁移到与您的数据库实例在同一VPC子网内,使用内网连接。 推荐负载均衡器绑定弹性公网IP的方式,可靠性高,可消除单点故障影响。 用户需要购买弹性公网IP,请参见弹性公网IP计费说明。 客户端连接 介绍通过不同程序客户端的方式访问GeminiDB Redis实例的方法,提供多种语言的客户端通过代码连接实例示例。 - 父主题: 步骤二:连接实例
  • 使用JedisPool访问(推荐) 样例代码 import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class JedisPoolTests { private static void testPool() { // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String pwd = System.getenv("EXAMPLE_PASSWORD_ENV"); JedisPool pool = new JedisPool(new GenericObjectPoolConfig(), "172.xx.xx.xx", 8635, 2000, pwd); Jedis jedis = pool.getResource(); try { System.out.println(jedis.hgetAll("676296")); System.out.println(jedis.set("key1", "value1")); } finally { jedis.close(); } pool.destroy(); } public static void main(String[] args) { testPool(); } }
  • 使用JedisCluster访问 样例代码 import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; public class ClusterTests { private static void testCluster() { String pwd = "a"; JedisCluster cluster = new JedisCluster(new HostAndPort("172.xx.xx.xx", 8635), 200, 2000, 5, pwd, new GenericObjectPoolConfig()); System.out.println(cluster.hgetAll("676296")); System.out.println(cluster.set("key1", "value1")); } public static void main(String[] args) { testCluster(); } }
共100000条