华为云用户手册

  • URI URI格式 GET https://{Endpoint}/v3/{project_id}/backups/download-file?instance_id={instance_id}&backup_id={backup_id} URI样例 https://dds.cn-north-1.myhuaweicloud.com/v3/97b026aa9cc4417888c14c84a1ad9860/backups/download-file?instance_id=befb1cfe1f96403780396b0c54f85d11in02&backup_id=bd062e1af2d248b3bb4cd3dbb4183888br02 backup_id可以通过查询备份列表获取。
  • 请求消息 参数说明 表1 请求参数 名称 类型 IN 是否必选 描述 X-Auth-Token String header 是 从IAM服务获取的用户Token。请参考认证鉴权。 X-Language String header 否 语言。 project_id String path 是 项目ID。请参考获取项目ID章节获取项目编号。 instance_id String path 是 实例ID,可以调用“查询实例列表和详情”接口获取。如果未申请实例,可以调用“创建实例”接口创建。 backup_id String query 是 备份ID。
  • 响应消息 参数说明 表2 参数说明 名称 参数类型 是否必选 说明 files Array of objects 是 备份包含的文件列表。 详情请参见表3。 bucket String 是 文件所在的桶名。 表3 files字段数据结构说明 名称 参数类型 是否必选 说明 name String 是 文件名。 size Long 是 文件大小,单位:KB。 download_link String 是 文件下载链接。 link_expired_time String 是 下载链接过期时间,格式为“yyyy-mm-ddThh:mm:ssZ”。其中,T指某个时间的开始,Z指时区偏移量,例如UTC时间偏移显示为+0000。 响应示例 { "files": [ { "name": "43e4feaab48f11e89039fa163ebaa7e4br02.xxx", "size": 2803, "download_link":"https://obs.domainname.com/rdsbucket.username.1/xxxxxx", "link_expired_time":"2018-08-016T10:15:14+0000" } ], "bucket": "rdsbucket.bucketname" }
  • URI URI格式 POST https://{Endpoint}/v3/{project_id}/instances/{instance_id}/kill-op-rule URI样例 https://dds.cn-north-1.myhuaweicloud.com/v3/2900b7b8d03e4619b8db8d43bc6234ee/instances/6390733773d64a748f3a7bc88df22384in02/kill-op-rule 表1 请求参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 从IAM服务获取的用户Token。请参考认证鉴权。 project_id 是 String 租户在某一Region下的项目ID。请参考获取项目ID章节获取项目编号。 instance_id 是 String 实例ID,可以调用“查询实例列表和详情”接口获取。如果未申请实例,可以调用“创建实例”接口创建。
  • 请求消息 参数说明 表2 Query参数 参数 是否必选 参数类型 描述 operation_types 是 Array of strings Sql语句操作类型。最多支持同时选择6种语句类型。同时选择多种类型时,匹配任意一种类型时规则生效。 insert,表示插入语句。 update,表示更新语句。 query,表示查询语句。 command,表示命令语句。 remove,表示删除语句。 getmore,表示获取更多数据语句。 namespaces 否 Array of strings 表命名空间。取值格式:库名或者库名.表名。同时配置多组信息时,匹配任意一组信息时规则生效。 目前仅支持配置一组信息 可为空,表示不做限制。 单独库名,表示对某个库下的所有集合生效。 库名.表名,表示对具体库下的具体的集合生效。 client_ips 否 Array of strings 客户端连接IP。 只支持IPV4。 可为空,表示不做限制。 最多支持配置5个IP,同时配置多个IP时,匹配任意一个IP时规则生效。 plan_summary 否 String 执行计划。默认值空,表示不做限制。 COLLSCAN SORT_KEY_GENERATOR SKIP LIMIT GEO_NEAR_2DSPHERE GEO_NEAR_2D AGGREGATE OR max_concurrency 否 Integer 最大并发数。 取值:不能为负数,可为空,默认为0,表示不做限制,最小值为1,最大值为100000。 max_concurrency和secs_running不可同时为0。 secs_running 否 Integer 单条操作最大运行时长。 可为空,默认为0,表示不做限制。单位:s。最小值为2,最大值为86400。 secs_running和max_concurrency不可同时为0。 node_type 是 String 节点类型。 mongos_shard,表示同时在mongos和shard节点生效。 mongos,表示只在集群mongos节点生效。 shard,表示只在集群shard节点生效。 replica,表示只在副本集节点生效。 请求示例 { "operation_types" : [ "query", "insert" ], "namespaces" : [ "db.collections" ], "client_ips" : [ "172.168.201.144" ], "plan_summary" : "COLLSCAN", "max_concurrency" : 0, "secs_running" : 5, "node_type" : "replica" }
  • mongo shell连接 前提条件 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。 curl ip:port 返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。 在MongoDB官网,下载与数据库实例版本号一致的客户端安装包。解压后获取其中的“mongo”文件,并上传到弹性云服务器。 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。 连接命令 SSL开启 ./mongo ip:port --authenticationDatabase admin -u username -p password --ssl --sslCAFile $path to certificate authority file --sslAllowInvalidHostnames SSL关闭 ./mongo ip:port --authenticationDatabase admin -u username -p password 表1 参数说明 参数 说明 ip 如果通过弹性云服务器连接,“ip”是主机IP,即“基本信息”页面该实例的“内网地址”。 如果通过连接了公网的设备访问,“ip”为该实例已绑定的“弹性公网IP”。 port 端口,默认8635,当前端口,参考“基本信息”页面该实例的“数据库端口”。 username 当前用户名。 password 当前用户的密码。 path to certificate authority file SSL证书的路径。 注意事项 如果开启SSL,连接命令中必须包含“--ssl”和“--sslCAFile”选项。 数据库认证“--authenticationDatabase”必须为“admin”,rwuser用户必须要在admin上认证。 更多信息,请参见《文档数据库服务快速入门》中各实例类型下“连接实例”的内容。
  • python mongo客户端 前提条件 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。 curl ip:port 返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。 在弹性云服务器上安装Python以及第三方安装包pymongo。推荐使用pymongo2.8版本。 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。 连接代码 SSL开启 import ssl import os from pymongo import MongoClient # 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全 # 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV rwuser = os.getenv('EXAMPLE_USERNAME_ENV') password = os.getenv('EXAMPLE_PASSWORD_ENV') conn_urls="mongodb://%s:%s@ip:port/{mydb}?authSource=admin" connection = MongoClient(conn_urls % (rwuser, password),connectTimeoutMS=5000,ssl=True, ssl_cert_reqs=ssl.CERT_REQUIRED,ssl_match_hostname=False,ssl_ca_certs=${path to certificate authority file}) dbs = connection.database_names() print "connect database success! database names is %s" % dbs SSL关闭 import ssl import os from pymongo import MongoClient # 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全 # 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV rwuser = os.getenv('EXAMPLE_USERNAME_ENV') password = os.getenv('EXAMPLE_PASSWORD_ENV') conn_urls="mongodb://%s:%s@ip:port/{mydb}?authSource=admin" connection = MongoClient(conn_urls % (rwuser, password),connectTimeoutMS=5000) dbs = connection.database_names() print "connect database success! database names is %s" % dbs 注意事项 {mydb}代表要连接数据库的名称。 URL中的认证数据库必须为“admin”,即“authSource=admin”。
  • java mongo客户端 前提条件 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。 curl ip:port 返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。 参考MongoDB兼容性列表,下载兼容数据库实例版本的mongo jar包。 在弹性云服务器上安装jdk。 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。 连接代码 用keytool工具手动生成trustStore: // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); keytool -import -file /var/chroot/mongodb/CA/ca.crt -keystore /home/Mike/jdk1.8.0_112/jre/lib/security/mongostore -storetype pkcs12 -storepass ${password} “/var/chroot/mongodb/CA/ca.crt”为根证书路径。 “/home/Mike/jdk1.8.0_112/jre/lib/security/mongostore”为生成的trustStore的路径。 SSL开启 import java.util.ArrayList; import java.util.List; import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import com.mongodb.MongoClientURI; import com.mongodb.MongoClientOptions; public class MongoDBJDBC { public static void main(String[] args){ try { System.setProperty("javax.net.ssl.trustStore", "/home/Mike/jdk1.8.0_112/jre/lib/security/mongostore"); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); System.setProperty("javax.net.ssl.trustStorePassword", password); ServerAddress serverAddress = new ServerAddress("ip", port); List addrs = new ArrayList(); addrs.add(serverAddress); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String rwuserPassword = System.getenv("EXAMPLE_PASSWORD_ENV"); MongoCredential credential = MongoCredential.createScramSha1Credential("rwuser", "admin", rwuserPassword.toCharArray()); List credentials = new ArrayList(); credentials.add(credential); MongoClientOptions opts= MongoClientOptions.builder() .sslEnabled(true) .sslInvalidHostNameAllowed(true) .build(); MongoClient mongoClient = new MongoClient(addrs,credentials,opts); MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb"); MongoCollection collection = mongoDatabase.getCollection("testCollection"); Document document = new Document("title", "MongoDB"). append("description", "database"). append("likes", 100). append("by", "Fly"); List documents = new ArrayList(); documents.add(document); collection.insertMany(documents); System.out.println("Connect to database successfully"); } catch (Exception e) { System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } } 样例代码: javac -cp .:mongo-java-driver-3.2.0.jar MongoDBJDBC.java java -cp .:mongo-java-driver-3.2.0.jar MongoDBJDBC SSL关闭 import java.util.ArrayList; import java.util.List; import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import com.mongodb.MongoClientURI; import com.mongodb.MongoClientOptions; public class MongoDBJDBC { public static void main(String[] args){ try { ServerAddress serverAddress = new ServerAddress("ip", port); List addrs = new ArrayList(); addrs.add(serverAddress); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String rwuserPassword = System.getenv("EXAMPLE_PASSWORD_ENV"); MongoCredential credential = MongoCredential.createScramSha1Credential("rwuser", "admin", rwuserPassword.toCharArray()); List credentials = new ArrayList(); credentials.add(credential); MongoClient mongoClient = new MongoClient(addrs,credentials); MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb"); MongoCollection collection = mongoDatabase.getCollection("testCollection"); Document document = new Document("title", "MongoDB"). append("description", "database"). append("likes", 100). append("by", "Fly"); List documents = new ArrayList(); documents.add(document); collection.insertMany(documents); System.out.println("Connect to database successfully"); } catch (Exception e) { System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }
  • 规避建议 MongoDB官方建议:在每次删除数据库或集合后,在所有mongos节点上,通过命令db.adminCommand("flushRouterConfig"),刷新路由。 参考链接: https://docs.mongodb.com/manual/reference/method/db.dropDatabase/index.html#replica-set-and-sharded-clusters https://jira.mongodb.org/browse/SERVER-17397 其他规避建议: 对于集群模式,建议开启数据库的分片功能,再对其中的集合进行分片。 对于未开启分片功能的数据库。在删除数据库或集合之后,不建议创建同名的数据库或集合。 如果因业务需求,需要创建同名的数据库或集合,请在删除数据库或集合之后,创建同名的数据库或集合之前,登录到所有的mongos节点上,执行刷新路由表的操作。
  • 分片概念 分片是指将一个集合的数据,根据指定的shard key,相对均匀地分布保存在多个shard server上。这种指定了shard key的集合,称为分片集合。但是,如果并未对集合进行分片,则该集合的数据,只会全部存储在某一个shard server上。DDS集群模式允许分片集合和未分片集合在数据库中同时存在。 未分片的集合可以通过命令sh.shardCollection转为分片集合。对集合进行分片之前,需确保集合所属的数据库开启了分片功能,您可以通过命令sh.enableSharding开启分片功能。
  • dds mongos路由缓存机制 用户数据存储在shard server中,元数据存储在config server中。路由信息属于元数据信息,即存储在config server中。当用户通过dds mongos对集群进行数据访问时,dds mongos会根据config server中的路由信息,将用户请求发送到对应的shard server上,进行数据访问。 但是,如果dds mongos在每次处理数据访问时,都从config server获取路由信息,很大程度上会影响性能。因此,在实现机制上,添加了缓存机制:将config server的路由信息缓存在dds mongos本地。该场景下,不但在config server中会存储路由信息,dds mongos的本地缓存中也可能会缓存路由信息。 dds mongos中并不是一定会存在缓存的路由信息,如果dds mongos上没有进行过任何数据操作,就没有缓存信息。并且,dds mongos上缓存的路由信息,也不一定是最新的config server的路由信息。因为dds mongos上缓存的路由信息,不是实时或者定时刷新的,而是lazy模式,是在特定的场景下被动触发的,包含但可能不限于如下几种触发场景: dds mongos启动时,从config server获取最新的路由信息,并缓存在本地。 dds mongos第一次处理相关数据的请求:由于mongos本地没有缓存该相关数据的路由信息,将会触发更新相关的config server路由信息到dds mongos本地缓存的逻辑,在继续处理后续请求时,dds mongos已经缓存了相关数据的路由信息,会直接使用缓存中的路由信息来访问shard server。 在dds mongos上手工执行路由刷新命令。 被动触发dds mongos的路由缓存刷新,只是刷新用户请求涉及到的元数据信息,而非刷新缓存中的全部内容。 缓存刷新的范围以DB为单位。
  • 使用场景 当未对数据进行分片时,若系统中存在多个dds mongos,通过不同的dds mongos进行数据访问时,可能出现不同dds mongos上本地缓存的路由信息不一致的情况。场景示例: 通过mongos1创建A数据库,未开启分片。写入数据1后,数据1被全部分到shard server1上存储。然后,在mongos2上对数据进行查询。此时,mongos1和mongos2上,均存在缓存的A数据库的路由信息。 通过mongos2执行了A数据库的删除操作。此时,config server和shard server1中的A数据库信息都被删掉。而mongos1无法识别数据1已经被删除。 通过mongos1向A数据库中写入数据2时,由于存在缓存,所以无法识别A数据库已经被删除的场景。参照已经存在的路由信息,数据2被存储到shard server1上。然后,通过mongos2向A数据库中写入数据3时,由于能够识别出A数据库已经被删除,所以会在config server和shard server2中生成新的A数据库的信息。 此时,mongos1和mongos2中缓存的路由信息不一致,关联不同的shard server,且仅能看到部分数据,导致数据异常。 图2 mongos缓存缺陷的场景 客户端通过不同mongos,所查询到的数据不同: mongos1:可以查到数据2,无法查询到数据3。 mongos2:可以查询到数据3,无法查询到数据2。
  • 概览 本手册基于华为云文档数据库服务实践所编写,用于指导您完成相关设置,购买更符合业务的数据库实例。 服务 章节名称 简介 文档数据库服务 安全最佳实践 介绍在DDS使用过程中的安全最佳实践,旨在为提高整体安全能力提供可操作的规范性指导。 连接DDS实例的常用方式 介绍DDS的常用连接方式。 其他云MongoDB迁移到DDS 介绍DDS数据迁移的操作。 本地MongoDB迁移到DDS ECS自建MongoDB迁移DDS 如何实现副本集高可用和读写分离 介绍如何连接副本集实例以实现高可用性能。 通过设置数据分片提升性能 介绍如何设置集群分片来提高数据库性能。 如何通过SQL优化来提升DDS性能 介绍DDS的使用建议。 如何规避dds mongos路由缓存缺陷 介绍如何规避集群mongos路由缓存缺陷。 排查DDS实例CPU使用率高的问题 介绍如何排查CPU使用率高的问题。 排查DDS实例内存占用较高的问题 介绍如何排查内存占用高的问题。 排查DDS实例连接数耗尽的问题 介绍如何排查连接数耗尽的问题。 创建用户并授权使用DDS只读权限 介绍如何通过IAM授权DDS只读权限。 合理使用DDL(Data Definition Languages)语句 介绍数据库中存储实体的语言,例如创建、修改和删除数据库、集合的结构。
  • DDS节点脱节原理和说明 副本集架构由主节点、备节点和隐藏节点组成,DDS自动搭建三节点的副本集供用户使用,节点之间数据自动同步,保证数据的高可靠性。对于需要保证高可用的中小型业务系统,推荐使用副本集。 主节点:即Primary节点,用于读写请求。 备节点:即Secondary节点,用于读请求。 隐藏节点:即Hidden节点,用于业务数据的备份。 用户可以直接操作主节点和备节点。若主节点故障,系统自动分配新的主节点。副本集架构如下图所示。 图1 三节点副本集架构 DDS只能在主节点写入数据,主节点写入数据时,会同时生成oplog,Secondary和Hidden通过从主节点读取oplog进行回放,达到数据的最终一致。 oplog的存储量由oplogSize(默认磁盘容量的10%)决定。 主备时延是如何产生的? 如果主节点写入速度太快,超过备节点oplog的读取回放速度,此时就产生了主备时延。 何时会脱节? 因为oplog存储容量有限,如果到达容量上限,就会淘汰掉最早的oplog。备节点读取oplog,每次都会记录最后一条读取的oplog,如果主备时延达到一定程度,备节点发现上次回放的oplog点位已经被淘汰掉,此时备节点就无法继续读取oplog,说明备节点已经脱节。 如何有效防止备节点脱节? 业务需要设置majority级别的writeConcern写入数据,表示将数据写入到大多数节点。 适当增加oplog的存储空间上限,如需修改,可以通过控制台界面修改参数值oplogSizePercent,具体步骤请参见修改DDS实例参数。 将创建索引等耗时较长的DDL操作,以及数据备份操作放在业务低峰期执行,同时尽可能避免突发大量增删改操作。 如果没有以majority级别的writeConcern写入数据,发生主备倒换时,未同步到备节点的数据有丢失风险。
  • 创建OBS桶并上传备份文件 如果上传的备份文件大于5GB,请按照OBS服务提供的超过5GB如何上传操作指导执行。 如果上传的备份文件较小,且小于5GB,请执行如下步骤: 创建OBS桶。 在创建过程中,以下两个参数请按要求设置,其他详细的创建步骤,请参考《对象存储服务用户指南》的“创建桶”章节。 选择“区域”。 OBS桶所在区域必须跟Redis目标实例所在区域相同。 设置“存储类别”,当前支持“标准存储”、“低频访问存储”和“归档存储”。 请不要选择“归档存储”,否则会导致备份文件数据导入失败。 设置完成后,单击“立即创建”,等待OBS桶创建完成。 在OBS管理控制台的桶列表中,单击1中创建的OBS桶名称,进入“概览”页面。 在左侧导航栏,单击“对象”。 在“对象”页签下,单击“上传对象”,系统弹出“上传对象”对话框。 指定对象的存储类别。 请不要选择“归档存储”,否则会导致备份文件数据导入失败。 上传对象。 您可以拖拽本地文件或文件夹至“上传对象”区域框内添加待上传的文件,也可以通过单击“上传对象”区域框内的“添加文件”,选择本地文件添加。 单次最多支持100个文件同时上传,总大小不超过5GB。 图1 批量上传对象 可选:勾选“KMS加密”,用于加密上传文件。 单击“上传”,完成备份文件上传到OBS桶。
  • 操作场景 当前GeminiDB Redis支持将其他云厂商Redis、自建Redis的数据通过GeminiDB控制台导入到GeminiDB Redis。 您需要先将其他云厂商Redis、自建Redis的数据备份下载到本地,然后将备份数据文件上传与GeminiDB Redis实例同一租户下相同Region下的OBS桶中,最后在GeminiDB控制台创建数据导入任务,将数据导入到GeminiDB Redis实例中。
  • 入门实践 当您购买并连接了GeminiDB Redis数据库实例后,可以根据自身的业务需求使用GeminiDB Redis提供的一系列常用实践。 表1 常用最佳实践 实践 描述 数据迁移 阿里云数据库Redis/Tair到GeminiDB Redis的迁移 本实践主要介绍阿里云数据库Redis/Tair到GeminiDB Redis的迁移方案。使用阿里云的数据迁移工具DTS中的数据迁移功能,该功能支持将阿里云Redis服务的数据迁移至其他Redis服务中,利用该工具避开阿里云 Redis服务屏蔽sync和psync命令限制,实现数据从阿里云Redis服务迁移至华为云GeminiDB Redis中。 腾讯云Redis到GeminiDB Redis的迁移 本实践主要介绍腾讯云Redis到GeminiDB Redis的迁移方案。使用腾讯云的数据迁移工具DTS中的数据同步功能,该功能支持将腾讯云 Redis服务的数据迁移至ECS自建Redis中,利用该工具避开腾讯云 Redis服务屏蔽分片实际IP,实现数据从腾讯云 Redis服务迁移至华为云GeminiDB Redis中。 自建Redis到GeminiDB Redis的迁移 本实践主要介绍自建Redis到GeminiDB Redis的迁移方案。使用Redis-Shake迁移工具进行源端Redis到目标端GeminiDB Redis的迁移。迁移过程支持全量+增量迁移,支持单机/主从/Cluster集群/RDB文件等多种Redis数据源。 RDB文件恢复到GeminiDB Redis(推荐) 本实践主要介绍RDB到GeminiDB Redis的迁移方案。使用Redis-Shake迁移工具进行源端RDB到目标端GeminiDB Redis的迁移。迁移过程支持全量+增量迁移。 Kvrocks到GeminiDB Redis的迁移 本实践主要介绍Kvrocks到GeminiDB Redis的迁移方案。使用开源工具kvrocks2redis进行Kvrocks到GeminiDB Redis的迁移,在此基础上,从GeminiDB Redis源码层面对Kvrocks的namespace功能进行适配。 Pika到GeminiDB Redis的迁移 本实践主要介绍Pika到GeminiDB Redis的迁移方案。pika-port伪装成Pika的从节点运行,通过主从复制的方式进行数据迁移。Pika主节点通过比较pika-port和自己的binlog偏移量判断做全量迁移还是增量迁移。如果需要做全量迁移,Pika主节点会将全量数据快照发送给pika-port,pika-port将解析后的快照数据发送给GeminiDB Redis。全量迁移结束后进入增量迁移,pika-port将增量数据解析后以redis命令的形式发送给GeminiDB Redis。 SSDB到GeminiDB Redis的迁移 本实践主要介绍SSDB到GeminiDB Redis的迁移方案。ssdb-port作为源端SSDB数据库的主节点的从节点(replica)运行,通过主从复制的方式进行数据迁移。将获取到的数据解析、转换为Redis支持的格式,并发送到配置文件中指定的Redis实例。全量同步完成后,SSDB中新增的数据也会同步到Redis实例中。 LevelDB到GeminiDB Redis的迁移 本实践主要介绍LevelDB到GeminiDB Redis的迁移方案。使用自研迁移工具leveldb-port,和LevelDB部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。 RocksDB到GeminiDB Redis的迁移 本实践主要介绍RocksDB到GeminiDB Redis的迁移方案。使用自研迁移工具rocksdb-port,和RocksDB部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。 AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移 本实践主要介绍AWS ElasticCache for Redis到GeminiDB Redis的迁移方案。AWS ElasticCache for Redis通过备份导出RDB文件后,通过Redis-Shake迁移工具的数据恢复(restore)将数据迁移到GeminiDB Redis。 数据备份 管理自动备份 介绍如何在数据库实例的备份时段中创建数据库实例的自动备份,系统根据您指定的备份保留期保存数据库实例的自动备份。 管理手动备份 介绍如何为数据库实例手动备份数据,用户可以通过手动备份恢复数据,从而保证数据可靠性。 数据恢复 恢复备份到新实例 介绍如何使用已有的自动备份或手动备份恢复实例数据到新建实例,恢复后的数据与该备份生成时的实例数据一致。 日志管理 慢日志 GeminiDB Redis支持查看数据库级别的慢日志,执行时间的单位为ms。通过该日志,可查找出执行效率低的语句,以便优化。 父主题: 快速入门
  • GeminiDB Redis是否支持多DB GeminiDB Redis的多DB功能已于2022年3月底上线,此前创建的实例暂不支持该功能,也不支持通过升级开启该功能。 使用GeminiDB Redis多DB功能时,您需要关注以下约束与限制: DB数支持的范围为0~999。 不支持swapdb命令。 dbsize结果非实时刷新,flushdb后dbsize返回的结果不会立刻降为0,会在一段时间后变为0。 不支持在Lua脚本中使用select和flushdb命令。 不支持在事务中使用select和flushdb命令。 暂不支持move命令。 父主题: 数据库使用
  • 使用须知 添加节点会触发快速负载均衡,可能出现请求超时,影响仅为秒级。建议业务侧有自动重试机制。 实例状态为正常、恢复检查中时可以添加节点。 实例进行添加节点时,该实例不可被删除。 如果搭建双活关系,不允许在主实例和备实例同时进行添加节点、删除节点和规格变更操作。 添加节点可能导致当前磁盘容量不足以支撑实例运行,需要先扩容磁盘,再添加节点。不同规格实例支持的存储容量,请参考实例规格说明。 当实例的存储容量不足以支撑添加节点时,您可以先扩容存储容量,再添加节点。 当有节点处于关机状态时,不能添加节点。 添加节点目前只支持集群版实例。
  • 运维规范 在日常运维工作中需关注以下运维规范,预防潜在风险并掌握关键应急方案。 表2 GeminiDB Redis运维规范 编号 运维规范 说明 1 确保您的华为云账号绑定的电话号码、电子邮箱等联系方式有效,以便及时收到服务相关通知信息。 华为云服务会在变更、升级、故障通知等必要场景通过网站、邮箱、短信、站内信等方式向您送达通知信息,请确保账号绑定的联系方式有效。 2 订阅重要告警 订阅例如大Key访问、存储容量高、连接数使用率高、CPU使用率高等告警,从而在数据库实例出现风险时提早发现并及时处理。 推荐告警配置请参考设置告警规则。 3 使用负载均衡地址访问时,需要配置访问控制管理,而不是安全组。 负载均衡地址不支持安全组,创建完成后请配置IP访问控制,如未配置白名单,所有与VPC互通的IP地址均可访问实例。具体操作请参考设置负载均衡地址黑白名单。 4 配置实例自动扩容 GeminiDB Redis支持自动扩容,可以有效避免数据量突增问题。建议参见存储空间自动扩容开启自动扩容。 5 保持负载处于健康水位 如业务数据量长期高于80%,建议及时扩容。 如业务流量超过实例QPS基准,或CPU利用率长期高于80%,建议及时升级规格或增加节点,避免过载影响业务访问。 在业务流量、连接数等指标突增导致实例算力资源超载的紧急场景,应通过水平添加节点快速提升集群算力。垂直升配CPU规格为滚动模式,耗时较长,不建议用于紧急场景。 6 重命名高危命令 对于高危命令(如flushall、keys),建议您禁用或重命名,以增强实例的安全性。具体操作请参考文档命令重命名。 7 定期进行大key在线诊断 大Key访问是Redis使用中的常见问题。建议在控制台定期查看实例的大Key诊断报告。具体操作请参考大Key诊断。 9 割接结束后执行dbsize dbsize可以保证最终一致性,例如,在割接场景,无过期key,数据导入完成后的的数分钟执行,可得到准确值,确保数据导入前后的一致。
  • 开发规范 在开发业务程序时需重点关注以下开发规范,避免因使用方式不当影响业务稳定。 表1 GeminiDB Redis开发规范 编号 开发规范 说明 1 业务程序需具备合理的自动重连机制。 在规格变更、补丁升级、HA倒换、网络链路抖动或丢包等场景中,业务程序与数据库实例的连接可能出现短暂中断。业务程序应当支持自动重连。 说明: 尽量避免使用Lettuce客户端,因为该客户端在请求多次超时后,不再发起自动重连。建议使用更稳定的Jedis客户端替换Lettuce客户端。 2 业务程序需使用连接池并配置足够连接数。 为避免并发激增时程序获取不到连接,建议业务程序使用连接池,并配置合理的连接池参数。客户端的连接池推荐配置请参考客户端连接池参数配置。 3 针对部分重要操作,业务程序需要具备合理的命令重试机制。 在连接中断或请求超时等场景,业务程序请求可能会短时内执行失败。因此,针对部分重要操作需要设计业务容错机制,使用合理的命令重试间隔和次数,确保重要数据写入或修改成功。 4 使用正确的高可用连接地址,避免单点故障场景影响业务。 业务程序内网连接数据库时,应使用负载均衡地址,实现高可用。应避免将业务程序直连到某个单独的计算节点。 说明: 针对公网访问数据库的场景,同样应避免将业务程序直连到某个单独的计算节点,请参考通过弹性负载均衡绑定弹性公网IP连接实例使用外置ELB进行配置。 5 使用连接池,避免使用单连接以及大量短连接。 由于单连接有高可用风险,而短连接性能差且会消耗大量数据库CPU和网络资源,容易造成瓶颈,因此建议业务程序使用主流SDK的连接池连接GeminiDB Redis实例。 6 当实例中Key数量大于1000个时,禁止执行Keys命令 Keys命令是典型的高危命令,会一次性获取整个实例中的全部数据内容并返回给客户端。当实例中Key数量较多时,执行Keys命令会引起请求阻塞或实例状态异常。 7 避免元素Value过大,避免单Key包含的元素数量过多。 根据最佳实践,建议String类型Key的Value小于10KB,Hash/List/Zset/Set等类型Key中包含元素数小于5000,且单个元素Value小于1KB。 说明: 与社区Redis一样,GeminiDB Redis对大Key存储并不做严格约束,因此需要用户根据规范合理开发业务程序。 8 避免单个命令中一次性操作过多元素或产生过大的网络收发包。 建议MSET/MGET等批量操作Key命令中同时操作的Key数量小于1000。 建议HMSET、HGETALL、LRANGE、ZADD、ZRANGE等同时操作Key中多元素的命令同时操作元素数量小于1000。 由于社区Redis语法中ZREMRANGEBYSCORE命令不提供limit参数,无法控制单次删除的元素数量,建议使用ZRANGEBYSCORE (带limit)+ZREM的先查后删方式替代。 说明: 与社区Redis一样,GeminiDB Redis对大Key访问并不做严格约束,因此需要用户根据规范合理开发业务程序。 9 合理打散Key分布,避免出现热点Key或热点hashtag瓶颈。 对单个Key或具有同hashtag的一组Key的高频访问依赖会产生热Key问题,容易引发计算资源倾斜,请求排队,响应变慢等瓶颈问题。热Key的产生往往来自业务设计对Key的拆分程度不足,需要业务拆分优化。 说明: 反面案例: 对全局超大排行榜高频集中访问。 全实例中仅保存几个Hash Key,每个Key用于存储一整张表格的信息量。 商品库存业务中,全实例Key仅使用少量hashtag分桶,导致热点hashtag查询排队。 10 单次Pipeline中打包命令数量建议小于100条。 使用Pipeline时应遵循“单次少量,分多次”原则。 根据使用经验,并非Pipeline打包数量越大性能越好,不合理的Pipeline用法将可能导致实例CPU、带宽等资源瓶颈,甚至引起请求阻塞。 说明: 与社区Redis相比,GeminiDB Redis对Pipeline的使用并不做严格约束,因此需要用户根据规范合理开发业务程序。 11 避免在Lua脚本中引入高耗时代码。 使用Lua脚本时应遵循轻量化原则,避免引入执行命令次数过多、长时间sleep、大的循环语句等不合理用法。 12 避免在事务中打包过多命令。 使用事务时应遵循轻量化原则,避免单次事务中打包过多命令或复杂度过高的命令。执行的事务中包含命令过多会引起请求阻塞或实例状态异常。 13 避免在不同数据类型下使用相同的Key名称。 社区Redis强制禁止在不同数据类型下使用相同的Key名称。虽然GeminiDB Redis对此不做强制约束,但开发时应当避免此类用法,保持程序清晰和易维护。
  • 迁移场景 表1 迁移场景 序号 源端 目标端 迁移方案 1 阿里云Redis/Tair GeminiDB Redis 阿里云数据库Redis/Tair到GeminiDB Redis的迁移 2 腾讯云Redis GeminiDB Redis 腾讯云Redis到GeminiDB Redis的迁移 3 自建Redis/Codis GeminiDB Redis 自建Redis到GeminiDB Redis的迁移 4 RDB GeminiDB Redis RDB文件恢复到GeminiDB Redis(推荐) 5 自建Kvrocks GeminiDB Redis Kvrocks到GeminiDB Redis的迁移 6 自建Pika GeminiDB Redis Pika到GeminiDB Redis的迁移 7 自建SSDB GeminiDB Redis SSDB到GeminiDB Redis的迁移 8 自建LevelDB GeminiDB Redis LevelDB到GeminiDB Redis的迁移 9 自建RocksDB GeminiDB Redis RocksDB到GeminiDB Redis的迁移 10 AWS ElasticCache for Redis GeminiDB Redis AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移
  • 迁移工具 DRS服务:华为云数据复制服务DRS(Data Replication Service)提供数据库零停机的迁移上云体验,支持全量数据迁移和增量数据迁移,为您提供安全稳定高可靠的迁移链路,详情请参考迁移方案概览。 Redis-Shake工具:Redis-Shake是一款开源迁移工具,支持全量扫描(rump)、数据恢复(restore)、增量同步(sync)等迁移方式,灵活方便。将工具下载到一台ECS上即可用命令行形式方便迁移。
  • 存储容量满设置只读 为保护GeminiDB Redis实例的正常运行,在存储空间即将被写满的时候,数据库会被设置成只读状态,该状态下只支持数据的读取,不支持写入和更新,可以通过扩容存储容量来解除该状态,重新获得写入和更新的能力。 表1 磁盘满只读说明 存储容量 说明 小于600GB 存储容量使用率达到97%时,实例状态被设置为只读。 存储容量使用率下降到85%,实例自动解除只读状态。 大于或等于600GB 存储容量剩余空间小于18GB,实例状态被设置为只读。 存储容量剩余空间大于或等于90GB,实例自动解除只读状态。
  • 一站式接入 场景介绍 一站式接入购买物理连接,指华为云向用户提供整合基础运营商网络资源和端口的一站式上云服务。 整体接入流程请参考图4 一站式接入功能目前已开通区域:华北-北京一、华北-北京四、华东-上海一、华东-上海二、华南-广州、华南-深圳、西南-贵阳一。 图4 一站式物理连接接入流程 操作步骤 提交需求信息。 登录控制台,选择并进入云专线服务,在物理连接页面单击 “一站式接入”,进入物理连接需求信息页面。 根据界面提示,在物理连接需求信息页面配置机房信息、华为云接入点等信息,详细请参照表3输入相关参数。 图5 一站式接入 表3 购买物理连接参数 参数 说明 您的机房地址 用户填写机房地址,需要精确到房间和机柜号。例如上海市浦东新区华京路xx号xx楼xx机房xx机柜。 可进线的专线运营商 用户机房允许进线的运营商。 设备端口类型 用户机房出口设备的端口类型,物理线路会连接到此端口。 区域 物理连接开通的区域。用户可以在管理控制台左上角或购买页面切换区域。 华为云接入点 物理连接接入点的位置。 端口类型 物理连接接入端口的类型:1GE,10GE、40GE、100GE。 物理连接名称 用户将要创建的物理连接的名称(可自定义)。 专线带宽 物理连接的带宽大小,请在下拉框中选择对应的带宽。 计费模式 专线服务付费方式,目前仅支持包年方式付费。 购买时长 购买服务的时长。 企业项目 企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 联系人姓名 用户侧专线负责人姓名。 联系人手机 用户侧专线负责人手机号码。 联系人Email 用户侧专线负责人邮箱地址。 单击“提交”。 华为云工勘。 华为云评估用户需求和运营商资源,与用户确认可满足用户需求的产品信息,回填信息后将订单返回给用户。 华为云工勘一般需要3个工作日。 确认配置支付订单。 在物理连接页面,单击目标物理连接操作列的“确认配置”。 在确认配置页面,确认物理连接配置方案和费用信息,单击“立即支付”。 用户在购买前须阅读并接受《一站式接入服务声明》,并在确认配置页面中勾选。 在购买页面,选择付款方式,单击“确认付款”。 用户选择“申请线上合同请款后支付”时,前往合同页面中申请并下载合同,线下申请款项后再完成支付;您已选择的折扣优惠会保存至相应的待支付订单。 华为云施工。 运营商线路施工。 华为云与用户侧进线对接。 机房楼内线施工。 工勘回填信息为一站式接入高级且包括楼内线产品时涉及机房楼内线施工。 端口开通。 开通确认。 在物理连接页面,单击目标物理连接操作列的“确认施工完成”。 在弹窗中,单击“确认”。确认物理连接已创建完成,华为云开始计费。
  • 修改个人密码 登录云堡垒机系统。 选择右上角用户名,单击“个人中心”,进入个人中心管理页面。 图1 个人中心页面 在“基本信息”页签,单击“修改密码”,弹出修改密码窗口。 图2 修改个人密码 输入当前密码,并自定义新密码。 新密码要求: 长度范围:8~32个字符,不能低于8个字符,且不能超过32 个字符。 规则要求:可设置英文大写字母(A~Z)、英文小写字母(a~z)、数字(0~9)和特殊字符(!@$%^-_=+[{}]:,./?~#*),且需同时至少包含其中三种。 不能包含用户名或倒序的用户名。 单击“确定”,返回个人基本信息页面。 退出登录,再次登录新密码即生效。
  • 绑定手机令牌 登录云堡垒机系统。 选择右上角用户名,单击“个人中心”,进入个人中心管理页面。 图1 个人中心页面 选择“手机令牌”页签,进入个人手机令牌管理页面。 按照界面提示和实际令牌类型,执行绑定操作。 微信小程序手机令牌 打开手机微信,依次按照操作指导,获取绑定动态口令,输入6位“动态密码”,验证通过绑定手机令牌。 APP版手机令牌 打开已安装好的手机令牌APP,扫描页面操作指导步骤2的二维码,获取绑定动态口令,输入6位“动态密码”,验证通过绑定手机令牌。 “手机令牌”页签更新为已绑定手机令牌页面
  • 我的日志 选择“我的日志”页签,可查看个人“系统登录日志列表”、“系统操作日志列表”和“资源登录日志列表”。 个人用户不能清理个人日志,日志仅能由有系统管理权限的用户统一管理,详细说明请参见数据维护。 系统登录日志列表 主要包括登录时间、登录用户来源IP、登录方式、登录结果等信息。 系统操作日志列表 主要包括操作时间、操作用户来源IP、操作的模块、操作内容、操作结果等信息。 资源登录日志列表 主要包括资源名称、资源协议类型、资源账户、登录资源用户来源IP、登录起止时间、会话时长等信息。 图6 我的日志列表
  • 快速安装 在不同操作系统,下载obsutil的方式也有所不同,下载后无需安装,即可开始使用。 执行以下命令前要求云服务器已连接到互联网,否则安装OBS Util客户端失败。 Windows操作系统 在浏览器中打开表格中对应的下载地址将obsutil工具下载至本地。 下载完成后,将其解压至指定文件夹。 在解压后的文件夹中双击运行obsutil.exe即可开始使用。 您也可以使用cmd进入obsutil.exe的上一级目录执行obsutil命令。两种方式的命令行结构有所不同,详细请参见命令行结构。 Linux操作系统 打开命令行终端,执行wget命令下载obsutil工具。 Linux AMD 64位(Linux x86 64位): wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz Linux ARM 64位: wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_arm64.tar.gz wget后的URL参数是安装包的下载网址,您无需适配,只需要复制并运行上方提供的命令,直接下载即可。 您也可以在一台Windows计算机上下载到软件包后,通过常见的跨平台传输工具(比如WinSCP)传输至您的Linux运行机。 在软件包所在目录,执行以下解压命令。 tar -xzvf obsutil_linux_amd64.tar.gz 进入obsutil所在目录,执行以下命令,为obsutil增加可执行权限。 chmod 755 obsutil 您必须为obsutil增加可执行权限,否则会在查询obsutil版本号时出现No such file or directory报错。 继续在目录中执行以下命令,如果能顺利返回obsutil版本号,说明安装成功。 ./obsutil version macOS 在浏览器中打开表格中对应的下载地址将obsutil工具下载至本地。 下载完成后,将其解压至指定文件夹。 打开命令行终端,进入obsutil所在目录,执行以下命令,为obsutil增加可执行权限。 chmod 755 obsutil
  • 下载地址 针对不同操作系统,obsutil的下载地址如表1所示。 表1 下载地址 操作系统 下载地址 如何使用 查看帮助 Windows 64位 obsutil_windows64 obsutil_windows64_sha256 下载完成后,您可以从这里获取如何快速使用obsutil。 常见功能: 列举桶 上传对象 列举对象 您可以从这里获取如何借助obsutil的命令行帮助进一步熟悉工具使用方法。 Linux AMD 64位 (Linux x86 64位) obsutil_linux_amd64 obsutil_linux_amd64_sha256 Linux ARM 64位 obsutil_linux_arm64 obsutil_linux_arm64_sha256 macOS 64位 obsutil_mac64 obsutil_mac64_sha256 obsutil版本修订记录信息:ChangeLog。下载地址中带有sha256后缀的链接,指的是对应软件包的校验文件。例如:Windows x64版本的下载链接是obsutil_windows64 ,它的校验文件下载链接则是obsutil_windows64_sha256。
共100000条