华为云用户手册

  • 备份方案 GeminiDB Cassandra实例支持自动备份和手动备份两种方案。 自动备份 您可以在管理控制台设置自动备份策略,系统将会按照自动备份策略中设置的备份时间段和备份周期进行自动备份,并且会按照设置的备份保留天数对备份文件进行存放。 自动备份的备份文件不支持手动删除,可通过修改自动备份策略调整备份保留天数,超出备份保留天数的已有备份文件会被自动删除。 手动备份 手动备份是由用户根据自身业务特点随时启动的数据库实例的全量备份,会一直保存,直到用户手动删除。 建议您定期对数据库进行备份,当数据库故障或数据损坏时,可以通过备份恢复数据库,从而保证数据可靠性。 表1 备份方案 备份方案 使用场景 自动备份 系统按照自动备份策略,对数据库进行自动备份,您可以根据业务需求修改自动备份策略。 手动备份 根据自身业务特点手动启动数据库实例的全量备份。 跨区域备份 用户可以在异地区域使用目标区域的备份文件恢复到新的实例,用来恢复业务。 创建库表级备份 当数据库或表被恶意或误删除,可依赖实例的备份保障数据安全。
  • 备份原理 GeminiDB Cassandra有专门负责备份管理的节点(seed节点)。如图1所示,GeminiDB Cassandra的备份在seed节点上进行,通过对数据进行秒级快照,并将生成的备份文件以压缩包的形式存储在对象存储服务(OBS)中,不会额外占据GeminiDB Cassandra实例的存储空间。备份上传过程中会消耗一定的CPU,因此会存在CPU上涨的现象,一般涨幅范围在5%~15%,该现象属于正常现象。 图1 备份原理
  • 备份存储 GeminiDB Cassandra的备份数据存储至对象存储服务(Object Storage Service,简称OBS),在提高数据容灾能力的同时有效降低磁盘空间占用。 购买实例存储空间后,GeminiDB Cassandra将同比例赠送备份存储空间,用于存储备份数据。例如,您购买的实例存储空间为100GB时,会得到赠送的100GB备份存储空间。当备份数据没有超出100GB,将免费存储在OBS上;当备份数据超出100GB,超出部分将根据OBS的计费规则收费,详情请参见OBS计费详情。
  • 使用GeminiDB Cassandra时要注意什么 实例的操作系统,对用户都不可见,这意味着,只允许用户应用程序访问数据库对应的IP地址和端口。 对象存储服务(Object Storage Service,简称OBS)上的备份文件以及GeminiDB Cassandra使用的系统容器,都对用户不可见,它们只对GeminiDB Cassandra后台管理系统可见。 申请数据库实例后,您还需要做什么。 申请实例后,您不需要进行数据库的基础运维(比如高可用、安全补丁等),但是您还需要重点关注以下事情: 数据库实例的CPU、IOPS、空间是否足够。 数据库实例是否存在性能问题,是否需要优化等。 父主题: 产品咨询
  • 数据库实例规格 同一实例类型根据内存的配置不同分为多种实例规格,针对不同的应用场景,您可以选择不同规格的实例。 本章节主要介绍GeminiDB Cassandra实例支持的实例规格信息。数据库实例规格与所选的CPU机型相关,请以实际环境为准。 表1 GeminiDB Cassandra集群实例规格 CPU类型 规格名称 vCPU(个) 内存(GB) 最小存储空间(GB) 最大存储空间(GB) x86 geminidb.cassandra.large.4 2 8 100 12,000 geminidb.cassandra.xlarge.4 4 16 100 24,000 geminidb.cassandra.xlarge.8 4 32 100 24,000 geminidb.cassandra.2xlarge.4 8 32 100 48,000 geminidb.cassandra.2xlarge.8 8 64 100 48,000 geminidb.cassandra.4xlarge.4 16 64 100 96,000 geminidb.cassandra.4xlarge.8 16 128 100 96,000 geminidb.cassandra.6xlarge.8 24 192 100 144,000 geminidb.cassandra.8xlarge.4 32 128 100 192,000 geminidb.cassandra.8xlarge.8 32 256 100 192,000 父主题: 产品介绍
  • 如何使用COPY命令导出、导入数据 下面将以具体的示例介绍从预置数据到导出数据、导入数据的完整过程。 预置数据 创建keyspace。 CREATE KEYSPACE cycling WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3}; 创建table。 CREATE TABLE cycling.cyclist_name ( id UUID PRIMARY KEY, lastname text, firstname text ); 插入数据。 INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (5b6962dd-3f90-4c93-8f61-eabfa4a803e2, 'VOS','Marianne'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (e7cd5752-bc0d-4157-a80f-7523add8dbcd, 'VAN DER BREGGEN','Anna'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (e7ae5cf3-d358-4d99-b900-85902fda9bb0, 'FRAME','Alex'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (220844bf-4860-49d6-9a4b-6b5d3a79cbfb, 'TIRALONGO','Paolo'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47, 'KRUIKSWIJK','Steven'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (fb372533-eb95-4bb4-8685-6ef61e994caa, 'MATTHEWS', 'Michael'); 从“cyclist_name”表中导出、导入数据。 将“cyclist_name”表中的“id”和“lastname”列导出到CSV文件。 COPY cycling.cyclist_name (id,lastname) TO '../cyclist_lastname.csv' WITH HEADER = TRUE; 图1 导出成功 上述命令执行成功后,会在当前目录的上一层目录中创建“cyclist_lastname.csv”文件。如果该文件已经存在,则会将其覆盖。 将“cyclist_name”表中的“id”和“first name”列导出到另一个CSV文件。 COPY cycling.cyclist_name (id,firstname) TO '../cyclist_firstname.csv' WITH HEADER = TRUE; 图2 导出成功 上述命令执行成功后,会在当前目录的上一层目录中创建“cyclist_firstname.csv”文件。如果该文件已经存在,则会将其覆盖。 将“cyclist_name”表中的数据删除。为了您的数据安全,暂不支持TRUNCATE命令。 DELETE FROM cycling.cyclist_name WHERE id = 'fb372533-eb95-4bb4-8685-6ef61e994caa'; 查看此时表中无数据。 SELECT * FROM cycling.cyclist_name ; 图3 查询数据 导入“cyclist_firstname.csv”文件。 COPY cycling.cyclist_name (id,firstname) FROM '../cyclist_firstname.csv' WITH HEADER = TRUE; 图4 导入成功 校验新导入的数据。 SELECT * FROM cycling.cyclist_name; 图5 导入成功 导入“cyclist_lastname.csv”文件。 COPY cycling.cyclist_name (id,lastname) FROM '../cyclist_lastname.csv' WITH HEADER = TRUE; 图6 导入数据 校验数据是否更新。 SELECT * FROM cycling.cyclist_name; 查询结果显示, 图7 导入成功
  • COPY语法 COPY TO命令 COPY table_name [( column_list )] TO 'file_name' [, 'file2_name', ...] | STDOUT [WITH option = 'value' [ADN ...]] COPY FROM命令 COPY table_name [( column_list )] FROM 'file_name' [, 'file2_name', ...] | STDIN [WITH option = 'value' [ADN ...]] COPY支持一个或多个以逗号分隔的文件名或python glob表达式的列表。 上述COPY命令中出现的一些常见语法符号可以参见表1的约定。
  • 计费构成分析 可以将GeminiDB Cassandra的使用阶段按照计费模式分为两段: 2023/03/18 15:30:00 ~ 2023/03/20 10:30:00:按需计费 2023/03/18 15:30:00 ~ 2023/03/20 9:00:00期间 实例规格:2vCPUs,8GB 节点数量:3 使用存储空间:100GB 使用备份空间:100GB 公网带宽:6Mbit/s 在2023/03/20 9:00:00 ~ 2023/03/20 10:30:00期间 实例规格:4vCPUs,16GB 节点数量:3 使用存储空间:200GB 使用备份空间:210GB(备份按需计费时间:2023/03/20 10:00:00~2023/03/20 10:30:00) 公网带宽:6Mbit/s 2023/03/20 10:30:00 ~ 2023/04/20 23:59:59:包年/包月计费 实例规格:4vCPUs,16GB 节点数量:3 使用存储空间:200GB 使用备份空间:300GB(备份按需计费时间:2023/04/10 23:59:59 ~ 2023/04/20 23:59:59) 公网带宽:6Mbit/s 计费时长:1个月 此案例中的单价仅为示例,且计算出的费用为估算值。单价的变动和实际场景中计算出来的费用可能会有偏差。请以华为云官网发布的数据为准。 按需计费 在2023/03/18 15:30:00 ~ 2023/03/20 9:00:00期间按照2vCPUs 8GB规格计费,计费时长为41.5小时,费用计算如下: 在2023/03/20 9:00:00 ~ 2023/03/20 10:30:00期间按照4vCPUs 16GB规格计费,计费时长为1.5小时,费用计算如下: 包年/包月计费 在2023/03/20 10:30:00 ~ 2023/04/20 23:59:59期间为包年/包月计费,计费时长为1个月,费用计算如下: 由此可见,在3~4月份,GeminiDB Cassandra总共产生的费用为:256.51 + 17.70 + 4407.10 = 4681.31 元。
  • 计费场景 某用户于2023/03/18 15:30:00购买了一个按需计费的GeminiDB Cassandra实例,规格配置如下: 规格:2vCPUs,8GB 节点数量:3 公网带宽:6Mbit/s 用了一段时间后,用户发现实例当前规格无法满足业务需要,于2023/03/20 9:00:00扩容规格为4vCPUs,16GB。因为该实例打算长期使用下去,于2023/03/20 10:30:00将实例转为包年/包月计费,购买时长为1个月。那么在3~4月份,该实例总共产生多少费用呢?
  • 规格性能说明 GeminiDB Cassandra的性能规格说明请参考表1。 表1 GeminiDB Cassandra性能规格说明 vCPU(个) 单节点的最大数据量(GB) 单节点的最大TPS 2 200 250 4 250 1,000 8 250 2,500 16 500 5,000 24 500 7,000 32 500 10,000 TPS主要与实例的vCPU个数有关。 当单节点数据量或TPS超过性能规格说明时,会出现时延高、请求失败、OOM等问题,建议尽快扩容,否则因未及时扩容导致的问题不在SLA承诺范围内。
  • 计费模式概述 GeminiDB Cassandra提供包年/包月和按需计费两种计费模式,以满足不同场景下的用户需求。 包年/包月:一种预付费模式,即先付费再使用,按照订单的购买周期进行结算。购买周期越长,享受的折扣越大。一般适用于设备需求量长期稳定的成熟业务。 按需计费:一种后付费模式,即先使用再付费,按照实例实际使用时长计费,秒级计费,按小时结算。按需计费模式允许您根据实际业务需求灵活地调整资源使用,无需提前预置资源,从而降低预置过多或不足的风险。一般适用于电商抢购等设备需求量瞬间大幅波动的场景。 表1列出了两种计费模式的区别。 表1 计费模式 计费模式 包年/包月 按需计费 付费方式 预付费。 按照订单的购买周期结算。 后付费。 按照实例实际使用时长计费。 计费周期 按订单的购买周期计费。 秒级计费,按小时结算。 适用计费项 实例规格(vCPU和内存)、存储空间、备份空间、弹性公网IP 实例规格(vCPU和内存)、存储空间、备份空间、弹性公网IP 变更计费模式 支持变更为按需计费模式。但包年/包月资费模式到期后,按需的资费模式才会生效。详情请参考包年/包月转按需。 支持变更为包年/包月计费模式。详情请参考按需转包年/包月。 变更规格 支持变更实例规格。 支持变更实例规格。 适用场景 适用于可预估资源使用周期的场景,价格比按需计费模式更优惠。对于长期使用者,推荐该方式。 适用于计算资源需求波动的场景,可以随时开通,随时删除。 父主题: 计费模式
  • 计费示例 假设您在2023/03/08 15:50:04购买了一个包年/包月GeminiDB Cassandra实例(规格:2 vCPUs 8GB,节点数量:3,存储空间:100GB,备份空间:110GB(赠送100GB,后续收费空间10GB)),计费资源包括实例规格(vCPU、内存、节点数量)、存储空间、备份空间、公网带宽。购买时长为一个月,并在到期前手动续费1个月,则: 第一个计费周期为:2023/03/08 15:50:04 ~ 2023/04/08 23:59:59 第二个计费周期为:2023/04/08 23:59:59 ~ 2023/05/08 23:59:59 2023/04/08 23:59:59~2023/05/01 23:59:59期间,使用免费备份空间50GB。 2023/05/01 23:59:59~2023/05/08 23:59:59期间,使用计费备份空间10GB,计费时长168小时。 图1给出了上述示例配置的费用计算过程。 图中价格仅为示例,实际计算请以云数据库 GeminiDB价格详情中的价格为准。 图1 包年/包月GeminiDB Cassandra费用计算示例 按需计费模式下,各计费项的计费示例请参见计费示例。
  • 计费说明 GeminiDB Cassandra的计费项由实例规格费用、存储空间费用、备份空间费用和公网流量费用组成。具体内容如表1所示。 标 * 的计费项为必选计费项。 表1 GeminiDB Cassandra实例计费项 计费项 计费项说明 适用的计费模式 计费公式 * 实例规格 计费因子:vCPU和内存,不同规格的实例类型提供不同的计算和存储能力。 包年/包月、按需计费 实例规格单价 * 购买时长 实例规格单价请参见云数据库 GeminiDB价格详情中的“集群-规格费用”。 * 存储空间 计费因子:存储空间,按统一标准进行计费。 包年/包月、按需计费 存储空间单价 * 存储容量 * 购买时长 请参见云数据库 GeminiDB价格详情中的“集群磁盘空间计费信息”。 备份空间 计费因子:备份空间,按统一标准进行计费。 按需计费 备份空间单价 * 备份收费容量 * 购买时长 请参见云数据库 GeminiDB价格详情中的“备份空间计费信息”。 说明: 计费时长:备份超过免费空间大小的使用时长。 公网流量 如有互联网访问需求,您需要购买弹性公网IP。 计费因子:带宽费、流量费和IP保有费。 包年/包月计费模式支持按带宽计费方式,收取带宽费。 按需计费模式支持按带宽计费、按流量计费和加入共享带宽三种计费方式,分别收取带宽费+IP保有费、流量费+IP保有费、带宽费+IP保有费。 包年/包月、按需计费 带宽费支持使用带宽加油包抵扣,流量费支持使用共享流量包抵扣。 按固定带宽值采用阶梯计费 0Mbit/s~5Mbit/s(含):均为一个统一的单价 大于5Mbit/s:按每Mbit/s计费 公网带宽单价请参见弹性云服务器价格详情中的“带宽价格”,或者弹性公网IP价格详情。
  • 修订记录 发布日期 修订记录 2023-08-30 第三十五次正式发布。 新增计费说明。 2023-07-18 第三十四次正式发布。 新增入门实践。 2023-06-30 第三十三次正式发布。 新增事件监控。 2023-05-30 第三十二次正式发布。 新增查看增量备份文件。 2023-04-28 第三十一次正式发布。 新增通过Go连接实例。 新增增量备份策略。 2023-03-31 第三十次正式发布。 新增操作系统更新。 2023-01-05 第二十九次正式发布。 支持设置跨区域备份策略。 2022-08-11 第二十八次正式发布。 购买实例,支持磁盘加密。 新增常见问题:资源冻结/释放/删除/退订。 2022-07-07 第二十七次正式发布。 升级内核小版本,支持补丁升级功能。 2022-06-01 第二十六次正式发布。 异地双活原理介绍,支持异地双活功能。 2022-02-15 第二十五次正式发布。 购买实例,修改实例名称,优化中文名称长度。 删除节点,GeminiDB Cassandra包年/包月实例支持缩容节点数量。 创建容灾实例,支持同个VPC下跨子网创建灾备实例。 2022-01-27 第二十四次正式发布。 实例续费,按需计费实例转包周期,包周期实例转按需计费,退订包周期实例,支持批量操作。 2021-11-20 第二十三次正式发布。 购买实例,存储空间自动扩容,支持扩容。 2021-09-27 第二十二次正式发布。 删除节点,支持删除节点。 2021-06-30 第二十一次正式发布。 购买实例,GeminiDB Cassandra实例名称支持中文。 修改实例安全组,GeminiDB Cassandra支持修改安全组。 2021-06-23 第二十次正式发布。 通过Java连接实例,增加Java连接GeminiDB Cassandra实例的方法。 2021-06-15 第十九次正式发布。 调整文档结构。 2021-04-30 第十八次正式发布。 数据库实例规格,增加不同规格实例支持的最小存储容量。 2021-04-15 第十七次正式发布。 调整文档结构。 购买页优化性能规格描述。 2021-01-30 第十六次正式发布。 实例操作列增加规格变更、添加节点和磁盘扩容入口。 2020-12-30 第十五次正式发布。 GeminiDB Cassandra支持创建容灾实例。 2020-10-30 第十三次正式发布。 资源标签支持20个配额。 扩容磁盘支持每次至少选择1GB扩容量。 GeminiDB Cassandra支持包周期实例的计算规格降配变更。 2020-09-30 第十二次正式发布。 支持实例配额管理。 GeminiDB Cassandra增加磁盘使用率指标监控。 2020-08-30 第十一次正式发布。 GeminiDB Cassandra支持如下功能: 支持修改实例名称 支持实例回收站 支持导出日志文件 2020-07-30 第十次正式发布。 GeminiDB Cassandra支持时间点恢复。 2020-06-30 第九次正式发布。 GeminiDB Cassandra支持如下功能: 购买包周期实例 包周期实例续费 按需实例转包周期实例 包周期实例转按需计费实例 退订包周期实例 支持SSL加密 支持跨AZ级容灾 2020-04-30 第八次正式发布。 新增监控指标。 2020-03-31 第七次正式发布。 新增创建参数模板。 新增导出参数模板。 新增比较参数模板。 新增复制参数模板。 新增重置参数模板。 新增应用参数模板。 新增查看参数模板应用记录。 新增修改参数模板描述。 新增删除参数模板。 新增部分支持的监控指标,请参见GeminiDB Cassandra支持的监控指标。 2020-03-13 第六次正式发布。 支持慢日志。 2020-01-20 第五次正式发布。 GeminiDB Cassandra支持规格变更。 2019-11-18 第四次正式发布。 支持重置管理员密码。 支持重启数据库实例。 支持修改数据库实例名称。 2019-10-22 第三次正式发布。 对接标签管理服务。 2019-09-11 第二次正式发布。 支持添加和删除GeminiDB Cassandra实例的节点。 支持扩容GeminiDB Cassandra实例的磁盘容量。 2019-07-18 第一次正式发布。
  • 操作步骤 获取GeminiDB Cassandra实例的内网IP地址、端口。 内网IP地址和端口的获取方法请参见查看IP地址和端口。 登录弹性云服务器,具体操作请参见《弹性云服务器快速入门》中“登录弹性云服务器”。 编辑连接GeminiDB Cassandra实例的代码。 import com.datastax.driver.core.*; Cluster cluster = null; try { cluster = Cluster.builder() .addContactPoint("127.0.0.1")//此处为步骤1中获取到的GeminiDB Cassandra实例的内网IP .withPort(8635) //此处为步骤1中获取到的GeminiDB Cassandra实例的端口 .build(); Session session = cluster.connect(); ResultSet rs = session.execute("select release_version from system.local"); Row row = rs.one(); System.out.println(row.getString("release_version")); } finally { if (cluster != null) cluster.close(); } 运行示例代码,确认结果是否正常。
  • 相关知识 创建集群实例。 如下代码示例,可以快速创建一个集群实例: Cluster cluster = Cluster.builder() .withClusterName("myCluster") //集群名称可选 .addContactPoint("127.0.0.1") // 连接点,业务连接集群时第一次连接的节点IP,可配置多个 .build(); 设置集群配置。 必须要指定的选项是指定连接点(ContactPoint),一般情况下建议配置三个连接点IP,这样当其中一个无法连接时,还可以尝试其他的连接点。 可以配置的配置项有: AuthProvider:认证方式 LoadBalancingPolicy:负载均衡的策略。负载均衡策略决定了业务请求到Cassandra集群的负载分流的方式, 建议设置为RoundRobinPolicy,这样保持压力能够随机均匀的落在整个集群中。 可选项有DCAwareRoundRobinPolicy,HostFilterPolicy,LatencyAwarePolicy,RoundRobinPolicy,TokenAwarePolicy和WhiteListPolicy。 Metrics:计量相关 NettyOptions:Cassandra driver使用Netty实现作为内部异步编程框架,所以暴露了一些options给用户自定义配置。 QueryOptions:查询相关options,可以设置查询一致性级别、设置fetch_size、设置刷新节点拓扑频率、刷新元数据频率等。 ReconnectionPolicy:当节点连接断开以后的重连策略,可以指定如下重连策略: ConstantReconnectionPolicy:常数级别的重连策略 ExponentialReconnectionPolicy:指数递增重连策略 RetryPolicy:重试策略,当请求失败的时候,会根据指定的重试策略进行再次请求,默认为DefaultRetryPolicy。 其他可选的重试策略还有:DowngradingConsistencyRetryPolicy,FallthroughRetryPolicy,IdempotenceAwareRetryPolicy和LoggingRetryPolicy,用户也可以根据业务自行定制重试策略。 Session会话。 正常情况下,session和keyspace是不绑定的,所以在查询的时候是需要指定表的keyspace的,如下所示: Session session = cluster.connect(); session.execute("select * from myKeyspace.myTable where id = 1"); //需要手动指定myKeysapce的keyspace前缀 以下是几种绑定keysapce的常见方法: 创建session会话时候指定keyspace Session session = cluster.connect("myKeyspace"); 查询指定keyspace前缀 session.execute("select * from otherKeyspace.otherTable where id = 1"); session.execute 切换keyspace session.execute("USE myKeyspace"); CRUD(增删改查)操作 直接使用CQL语句实现增删改查操作 //创建表 session.execute("CREATE TABLE test (k int,p int,s int ,v int,PRIMARY KEY (k, p));"); //插入 session.execute("INSERT INTO test(k, p, v) VALUES (0, 3, 1);"); //查询 session.execute("SELECT * FROM test;"); //更新 session.execute("UPDATE test SET v=100 where k = 0 and p = 3;") //删除 session.execute("DELETE FROM test where k = 0 and p = 3;") 使用QueryBuilder //查询 ResultSet rs = session.execute( QueryBuilder.select("k", "p", "v", "s") .from("keyspace", "test") .where(QueryBuilder.eq("k", 0)) .and(QueryBuilder.eq("p", 3)); //插入 session.execute( QueryBuilder.insertInto("keyspace", "test") .values(new String[]{"k", "p", "v"}, new Object[]{0, 3, 0})); //更新 session.execute( QueryBuilder.update("keyspace", "test") .with(QueryBuilder.set("v", 100)) .where(QueryBuilder.eq("k", 0)) .and(QueryBuilder.eq("p", 3)); //删除 session.execute(QueryBuilder.delete() .from("keyspace", "test") .where(QueryBuilder.eq("k", 0)) .and(QueryBuilder.eq("p", 3)) 使用PreparedStatement Cassandra也有类似于JDBC那样使用预编译占位符,当使用PreparedStatement的时候,Cassandra server端会解析query语句并且在server端进行缓存,然后返回一个唯一标识符给cassandra driver。 如下图所示: 图1 原理图 当用户绑定并且执行编译statement时,cassandra driver只会发送唯一标识符和数据,cassandra server会跳过解析query语句过程。 图2 原理图 预编译占位符在重复执行大量相同CQL,只是数据不一样的场景性能上有很大优势。 private static final String GET_TEST = "select * from test where k = ? and p = ?;"; private static final String INSERT_TEST = "INSERT INTO test(k, p, v) VALUES (?, ?, ?);"; private static final String UPDATE_TEST = "UPDATE test SET v=100 where k = ? and p = ?;"; private static final String DELETE_TEST = "DELETE FROM test where k = ? and p = ?;"; //查询 PreparedStatement prepareStatement = session.prepare(GET_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement).bind(0,3); ResultSet rs = session.execute(bindStatement); //插入 PreparedStatement prepareStatement = session.prepare(INSERT_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement) .bind(0, 3, 0); session.execute(bindStatement); //更新 PreparedStatement prepareStatement = session.prepare(UPDATE_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement) .bind(0, 3); session.execute(bindStatement); //删除 PreparedStatement prepareStatement = session.prepare(DELETE_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement) .bind(0, 3); session.execute(bindStatement); BATCH操作 cassandra driver也支持用户批量进行插入操作,可以将多个statement添加进BatchStatement统一执行。 如下代码示例: Session session = SessionRepository.getSession(); //插入 BoundStatement insertBind = new BoundStatement( session.prepare("insert into keysapce.test(k, p, v) values(?,?,?);")) .bind(0, 3, 0); //更新 BoundStatement updateBind = new BoundStatement( session.prepare("update keyspace.test set v=? where k=? and p=?;")) .bind(0, 3, 100"); //删除 BoundStatement deleteBind = new BoundStatement( session.prepare("delete from keyspace.test where k=? and p=?;")) .bind(1, 3); // GeminiDB Cassandra只支持unlogged batch BatchStatement batchStatement = new BatchStatement(Type.UNLOGGED); batchStatement.add(insertBind); batchStatement.add(updateBind); batchStatement.add(deleteBind); session.execute(batchStatement);
  • 操作系统更新 GeminiDB Cassandra实例需要适时进行操作系统更新,以提高数据库性能和数据库的整体安全状况。 实例内核版本升级时,GeminiDB Cassandra会根据操作系统的实际情况,决定是否更新以及更新适合的操作系统冷补丁版本。 操作系统更新不会更改数据库实例的版本或数据库实例信息。 此外,GeminiDB Cassandra会在用户设置的运维时间段内,通过热补丁方式及时修复影响重大的操作系统漏洞。 父主题: 变更实例
  • 监控指标 如下监控指标需要在实例节点查看,具体方法请参见查看监控指标。 表1 GeminiDB Cassandra支持的监控指标 指标ID 指标名称 指标含义 取值范围 测量对象 监控周期(原始指标) nosql005_disk_usage 存储容量使用率 该指标为存储容量使用率。 单位:% 0~100 % GeminiDB Cassandra实例 1分钟 nosql006_disk_total_size 存储容量总容量 该指标为实例的存储容量总容量。 单位:GB ≥ 0 GB GeminiDB Cassandra实例 1分钟 nosql007_disk_used_size 存储容量使用量 该指标为实例的存储容量使用量。 单位:GB ≥ 0 GB GeminiDB Cassandra实例 1分钟 nosql009_dfv_write_delay 存储写时延 该指标用于统计某段时间写入数据到存储层的平均时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 nosql010_dfv_read_delay 存储读时延 该指标用于统计某段时间从存储层读取数据的平均时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra001_cpu_usage CPU使用率 该指标用于统计测量对象的CPU使用率。 单位:% 0~100 % GeminiDB Cassandra实例的节点 1分钟 cassandra002_mem_usage 内存使用率 该指标用于统计测量对象的内存使用率。 单位:% 0~100 % GeminiDB Cassandra实例的节点 1分钟 cassandra003_bytes_out 网络输出吞吐量 该指标用于统计平均每秒从测量对象的所有网络适配器输出的流量。 单位:Bytes/s ≥ 0 Bytes/s GeminiDB Cassandra实例的节点 1分钟 cassandra004_bytes_in 网络输入吞吐量 该指标用于统计平均每秒从测量对象的所有网络适配器输入的流量。 单位:Bytes/s ≥ 0 Bytes/s GeminiDB Cassandra实例的节点 1分钟 cassandra014_connections 活动连接数 该指标用于统计当前Cassandra实例节点的活动连接数。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra015_read_latency 读耗时 该指标用于统计数据库读请求的平均耗时。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra016_write_latency 写耗时 该指标用于统计数据库写请求的平均耗时。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra037_pending_write 挂起的写任务数 描述当前排队等待的写任务数。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra038_pending_read 挂起的读任务数 描述当前排队等待的读任务数。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra044_range_slice_latency scan耗时 描述平均scan耗时。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra049_dropped_mutation 写丢弃次数 描述平均写丢弃次数。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra052_dropped_read 读丢弃次数 描述平均读丢弃次数。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra092_load_info 节点负责的数据量 节点负责的数据量大小。 单位:Bytes ≥ 0 Bytes GeminiDB Cassandra实例的节点 1分钟 cassandra093_write_count_latency 累计写请求 节点启动累计的写请求个数。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra094_write_1min_rate 最近一分钟平均写速率 最近一分钟内的平均写速率。 单位:Counts/s ≥ 0 Counts/s GeminiDB Cassandra实例的节点 1分钟 cassandra095_write_p75_latency p75写时延 p75写时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra096_write_p95_latency p95写时延 p95写时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra097_write_p99_latency p99写时延 p99写时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra098_read_count_latency 累计读请求 节点启动累计的读请求个数。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra099_read_1min_rate 最近一分钟平均读速率 最近一分钟内的平均读速率。 单位:Counts/s ≥ 0 Counts/s GeminiDB Cassandra实例的节点 1分钟 cassandra100_read_p75_latency p75读时延 p75读时延 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra101_read_p95_latency p95读时延 p95读时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra102_read_p99_latency p99读时延 p99读时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra103_range_slice_count_latency 累计range读请求 累计range读请求。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra104_range_slice_1min_rate 最近一分钟平均range读速率 最近一分钟平均range读速率。 单位:Counts/s ≥ 0 Counts/s GeminiDB Cassandra实例的节点 1分钟 cassandra105_range_slice_p75_latency p75range读时延 p75range读时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra106_range_slice_p95_latency p95range读时延 p95range读时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra107_range_slice_p99_latency p99range读时延 p99range读时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra163_write_p999_latency p999写时延 p999写时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra164_read_p999_latency p999读时延 p999读时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra165_large_partition_num 大key数量 当前节点大key的数量。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟 cassandra166_write_max_latency 最大写时延 最大写时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra167_read_max_latency 最大读时延 最大读时延。 单位:ms ≥ 0 ms GeminiDB Cassandra实例的节点 1分钟 cassandra168_imbalance_table_num 表数据分布不均匀的个数 表级别的数据分布不均匀的表数量。 单位:Counts ≥ 0 Counts GeminiDB Cassandra实例的节点 1分钟
  • 测试结果 性能结果 表6 性能数据 qps_avg统计 节点规格 客户端并发数 预置数据量 _read95_update5 _update50_read50 _read65_update25_insert10 _insert90_read10 开源Cassandra集群性能数据 4U6GB 32 50 2884 5068 8484 10694 8U32GB 64 100 2796 2904 5180 7854 16U64GB 128 200 5896 14776 14304 15707 32U128GB 256 400 8964 22284 19592 22344 GeminiDB Cassandra集群性能数据 4U6GB 32 50 8439 10565 9468 23830 8U32GB 64 100 24090 24970 21716 44548 16U64GB 128 200 48985 51335 43557 67290 32U128GB 256 400 91280 85748 74313 111540 GeminiDB Cassandra与开源Cassandra性能比 4U6GB 32 50 2.93 2.08 1.12 2.23 8U32GB 64 100 8.62 8.60 4.19 5.67 16U64GB 128 200 8.31 3.47 3.05 4.28 32U128GB 256 400 10.18 3.85 3.79 4.99 测试结论 社区版Cassandra对读较不友好,GeminiDB Cassandra在读时延的性能表现上,要优于社区版数十倍。 在写性能表现上,GeminiDB Cassandra与社区版基本保持一致。 社区版和GeminiDB Cassandra在节点扩容过程中,对业务都有轻度的影响。 GeminiDB Cassandra扩容较快,影响业务的时间较为短暂,为10s,且不涉及参数调整,扩容过程十分钟。 社区版根据数据量的大小,参数的设置,整个扩容流程比较长,对性能的影响也参差不齐,50G预置数据,在实验场景中,扩容会超过30分钟。 计算公式:最快迁移速度=(nodetool setstreamthroughput 32设置的迁移流量限制,默认为200Mbps)*原节点数。 本测试过程中,最快的迁移速度=32Mbps/s*3=12MB/S=720MB/min=0.703GB/min,计算可得50GB数据在此场景下迁移的最快时间是:50/0.703=71.1分钟。
  • 压测工具环境 压测机器规格 表3 压测机器规格 名称 测试客户端ECS CPU 16vCPUs 内存 64GB 操作系统 Centos7.4 压测工具信息 表4 压测工具信息 测试工具 YCSB 版本 0.12.0 下载地址 https://github.com/brianfrankcooper/YCSB curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.12.0/ycsb-0.12.0.tar.gz
  • 测试环境 开源Cassandra测试环境 表1 开源Cassandra测试环境 名称 开源Cassandra集群 Cassandra版本 3.11.5 集群节点数 3 操作系统版本 Centos7.4 ECS规格 通用增强型4vCPUs | 16GB 通用增强型8vCPUs | 32GB 通用增强型16vCPUs | 64GB 通用增强型32vCPUs | 128GB GeminiDB Cassandra测试环境 表2 GeminiDB Cassandra测试环境 名称 GeminiDB Cassandra集群 区域 华东-上海二 集群节点 3 可用区 可用区三 版本 3.11 规格 4vCPUs | 16GB 8vCPUs | 32GB 16vCPUs | 64GB 32vCPUs | 128GB
  • 事件监控简介 事件监控提供了事件类型数据上报、查询和告警的功能。方便您将业务中的各类重要事件或对云资源的操作事件收集到云监控服务,并在事件发生时进行告警。 事件即云监控服务保存并监控的GeminiDB Cassandra资源的关键操作,您可以通过“事件”了解到谁在什么时间对系统哪些资源做了什么操作,如修改实例名称、规格变更等。 事件监控为您提供上报自定义事件的接口,方便您将业务产生的异常事件或重要变更事件采集上报到云监控服务。 事件监控默认开通,您可以在事件监控中查看系统事件和自定义事件的监控详情,目前支持的系统事件请参见事件监控支持的事件说明。 父主题: 事件监控
  • 如何使用索引 创建索引 CREATE INDEX artist_names ON playlists( artist ); 注意:如果原表中有大量数据,会涉及到索引数据的重建,只有当索引数据重建完成以后才能查询索引。 您可以通过查询系统的“IndexInfo”,查看索引是否重建完成。如果有您创建的索引的名字,表示索引数据已经重建完成。 图3 查询结果 通过直接指定索引列,查询索引。 图4 查询结果 每张表可以创建多个索引,且索引会影响写入性能。
  • 二级索引原理 二级索引的实现其实就是创建一张隐式的表,该表的Primary Key是创建索引的列,该表的值是原表的Primary Key。 假设有一张playlists表,表结构如下: CREATE TABLE playlists ( id int, song_id int, song_order int, album text, artist text, title text, PRIMARY KEY (id, song_id)); 查询结果如下: 图1 查询结果 如果对artist字段建立索引,则索引隐式的表的结构如下所示: 图2 查询结果 其中,artist是索引表的Primary Key,id列、song_id列是索引表的普通列,即原表的Primary Key。
  • 架构介绍 下图是GeminiDB Cassandra的服务部署架构。 计算节点: Tenant APP:用户的app。 GeminiDB Cassandra:数据库服务进程,对等节点之间全负荷分担;通过Gossiper协议交换元数据,根据一致性哈希环原理负责数据的处理和转发,由管控HA监控,故障后会自动拉起;3AZ形式部署在MCS容器上。 PlogClient:访问底层DFV Pool的客户端组件,部署在Host OS,由同一个物理机上Cassandra进程共享。 Config(文件元数据):Config节点,部署在MCS容器上,负责数据库所存储数据的元数据管理,完成实例级的全局文件系统向底层DFV plog块的映射。 NameNode:数据库元数据节点,基于Config的ZK选主。 JournalNode:数据库元数据日志节点,服务NameNode。三节点部署,单点故障业务无感知,两节点故障业务故障。 Zookeeper(ZK):管理NameNode选举。三节点,两节点故障业务无感知。 ZKFC:NameNode的监控进程。 PlogClient:访问底层DFV Pool的客户端组件,部署在Host OS,由同一个物理机上NameNode进程共享。 DFV Pool(存储池):提供存储服务。 Zookeeper(ZK):独立物理机,3AZ 9节点,存储Pool元数据,当故障的节点数不超过一半时,可正常使用。 PlogManager:管理存储元数据,1主多备,一个节点故障,可在其他节点自动拉起。 PlogServer:存储节点,全负荷分担。
  • 典型应用 互联网应用 GeminiDB Cassandra的超强读写、弹性扩展,以及高强度的故障容忍,能够支持大并发低延时的访问需求,具备高可用和弹性扩容能力,使其适用于具有产品目录、推荐、个性化引擎、交易流水等功能的大数据量的互联网网站。 优势: 大规模集群部署 单套集群最大支持100个节点部署,适用于写入规模和数据量大的互联网场景。 高可用易扩展 单节点宕机不会影响整个集群的可用性,计算节点和存储空间可独立快速扩容,扩容期间业务无感知。 实时高并发写入 实时高并发写入,适合电商领域高并发海量订单,写入性能高。 工业数据采集 GeminiDB Cassandra兼容Cassandra生态,帮助客户整合多种终端采集来源,实时存储采集的指标,提供聚合分析,实时统计等功能。 优势: 大规模集群部署 适用于工业制造海量指标采集存储的场景。 高可用高性能 支持7*24小时在线持续高并发写入。 极速备份恢复 通过存储快照技术实现极速备份恢复能力。 分钟级扩容 轻松应对作业/项目高峰。
  • 表设计规则 规则1:表的设计要考虑兼容性。 只允许新增字段,不允许删除字段。 规则2:表名和数据库名不超过48字节。 规则3:表默认按照最佳性能规格创建。如果对表性能要求不高,可以创表时指定性能参数“Z00_THROUGHPUT”, 可选项有big、medium、small。默认不指定为big,由于存储引擎使用Rocksdb需要预分配内存,所以实例创表数目有一定限制,具体请参见GeminiDB Cassandra创表时需要注意什么。 建议:需要的时候,通过反范式化和冗余来提升读性能。
  • 索引规范 规则1:尽可能把所有查询都设计为主键形式的查询,不要对二级索引过度依赖。 规则2:创建索引后需要等待索引构建完成后才能使用索引字段进行查询。 规则3:避免对索引字段频繁更新。 规则4:不建议重复值过多表列建立索引,比如表有一亿条数据,某一列的数据都是一样的或者少数几种,这种情况不建议在该列建索引列。 规则5:counter列不能进行索引。 规则6:频繁更新或者删除的列,不建议在该列建索引列。 规则7:建议索引配合分区键使用,否则会增加节点间消息转发,造成资源消耗过大导致oom或者cpu飙高。
  • 连接方式介绍 GeminiDB Cassandra提供使用数据管理服务(Data Admin Service,简称DAS)、内网和公网的连接方式。 表1 连接方式 连接方式 使用场景 说明 DAS连接 无需使用IP地址,通过控制台即可登录实例。 易用、安全、高级、智能。 默认为您开通了远程主机登录权限,推荐您使用更安全便捷的数据管理服务连接实例。 内网连接 系统默认提供内网IP地址。 当应用部署在弹性云服务器上,且该弹性云服务器与数据库实例处于同一区域、同一VPC内时,建议使用内网IP通过弹性云服务器连接数据库实例。 安全性高,可实现数据库实例的较好性能。 公网连接 不能通过内网IP地址访问数据库实例时,使用公网访问,建议单独绑定弹性公网IP连接弹性云服务器(或公网主机)与数据库实例。 降低安全性。 为了获得更快的传输速率和更高的安全性,建议您将应用迁移到与您的数据库实例在同一VPC子网内,使用内网连接。 用户需要购买弹性公网IP,请参见弹性公网IP计费说明。 Java连接 提供Java语言连接GeminiDB Cassandra实例的示例。 - Go连接 提供Go语言连接GeminiDB Cassandra实例的示例。 - 父主题: 连接实例
  • 创表参数 吞吐量参数:Z00_THROUGHPUT,默认值为 big。 低吞吐量 CREATE TABLE test1 (k int,p int,s int static,v int,PRIMARY KEY (k, p)) WITH Z00_THROUGHPUT = 'small'; 中吞吐量 CREATE TABLE test2 (k int,p int,s int static,v int,PRIMARY KEY (k, p)) WITH Z00_THROUGHPUT = 'medium'; 高吞吐量 CREATE TABLE test3 (k int,p int,s int static,v int,PRIMARY KEY (k, p)) WITH Z00_THROUGHPUT = 'big'; 指定表tokens数目:表示创建表时候表的tokens数目,tokens数目必须大于1。 CREATE TABLE test4 (k int,p int,s int static,v int,PRIMARY KEY (k, p)) WITH Z01_TABLE_TOKENS = 24; 表参数:Z00_BUFFER_SIZE 、Z00_BUFFER_NUMBER(不推荐使用)。 创表时可以指定存储层memtable的大小和个数。 Z00_BUFFER_SIZE为map类型,指定对应cf name和value值 ,value值取值范围2~32之间。 CREATE TABLE test6 (k int,p int,s int static,v int,PRIMARY KEY (k, p)) WITH Z00_BUFFER_SIZE = {'default': 16}; Z00_BUFFER_NUMBER为map类型,指定对应cf name和value值,取值范围2~8之间。 CREATE TABLE test5 (k int,p int,s int static,v int,PRIMARY KEY (k, p)) WITH Z00_BUFFER_NUMBER = {'default': 3}; 如果创建完成的表需要调整表规格,比如达到表上限,需要将表规格调小,以创建更多的表,则可以通过如下参数调整。 将所有创建表调小为medium,则可以多建一倍数量的表 ALTER TABLE keyspace_name.table_name WITH Z00_THROUGHPUT = 'medium'; 将所有创建表调小为small,则可以多建两倍数量的表 ALTER TABLE keyspace_name.table_name WITH Z00_THROUGHPUT = 'small';
共100000条