• [热门活动] 【舌尖上的中间件】迎中秋,度国庆,美味大闸蟹任你抢!
    本次活动有效参与人数未达到50人,未达到开奖条件,依据活动规则不予开奖。非常感谢本次参与活动的用户哦,下次与您再约!眼看着中秋节就要到了,过完中秋节又是国庆节,过节怎么可以少得了美食呢!首届【舌尖上的中间件】隆重开启啦~~参与活动,美味大闸蟹送!送!!送!!!活动时间:2018年9月19日-2018年10月12日活动参与方式:完成三个步骤,即可有机会赢得大闸蟹礼券哦~~第一步:点击领取分布式数据库中间件DDM实例;登录/注册>>成功领取实例第二步:创建逻辑库  根据要求完成创建即可。(温馨提示:创建逻辑库时需要RDS实例,没有领取RDS实例的用户可前往免费试用专区领取哦,传送门>>免费体验专区) 详细的操作指导,可以参考帮助文档哦,操作指导>>点这里第三步、截图逻辑库详情,回帖回帖内容需要包含以下内容:产品使用心得+建议(20字以上)+华为云用户名+逻辑库详情的截图 奖品设置及规则:阳澄湖大闸蟹礼券(8只装礼盒)图片仅供参考,具体以实物为准一等奖2名:在前50楼的回帖中抽取2名,获得大闸蟹礼券3张(有效楼层满50层开奖)二等奖4名:在前100楼的回帖中抽取4名,获得大闸蟹礼券2张(有效楼层满100层开奖)三等奖8名:在前200楼的回帖中抽取8名,获得大闸蟹礼券1张(有效楼层满200层开奖)说明:1、 本次活动仅限未领取过分布式数据库中间件DDM的用户参加,老用户参与即视为无效;2、 活动回帖不可盗用他人截图,否则视为无效;不可重复盖楼,多次盖楼视为一次有效回帖温馨提示:1、 我们在10月15日公示获奖者名单。同时会在3个工作日内联系获奖者,在公示后7个工作日内统一发放奖品。2、 有效楼层指按照要求参与活动,不同ID,且不同实名认证用户。3、 每个ID只能中奖一次,如果重复中奖,顺延至下一楼层。4、 禁止华为云及其业务外包方员工参加(除非作出说明),若参加后获奖(含员工小号获奖),则取消获奖资格。5、 请遵守华为云社区常规活动规则。 
  • 分布式数据库中间件实现原理之平滑扩容
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例平滑扩容平滑扩容是一种水平扩容方式,通过增加RDS实例的数量来提升总体数据存储容量,把分库平滑扩容到新增加的RDS实例上,保证所有的数据都是均衡分布在每个分库上。随着业务增长,逻辑库存储空间不足,并发压力较大,可以通过增加RDS实例来提高数据存储能力与并发支持能力,对DDM实例逻辑库进行平滑扩容,详细配置请参见逻辑库平滑扩容。逻辑库扩容涉及到数据迁移。具体分以下情况:所有全局表将复制一份,存储到新增RDS实例的对应分片中。分片表数据将会重新分配和存储。单表存储在默认分片上,扩容过程无需迁移单表数据。 说明:RDS存储空间不足时,建议对逻辑库下的某一RDS实例进行磁盘扩容,扩充RDS实例存储空间,详细操作请参见磁盘扩容。“拆分算法”为“Range”的逻辑表在进行平滑扩容时,只在新的分片上创建物理表,不做数据迁移。扩容成功后,用户需要手动修改“Range”表的分片规则,加入新分片的规则。平滑扩容请遵循如下规则:RDS实例与DDM实例需要在相同VPC,且RDS实例没有被其它DDM实例使用。逻辑库下必须有表才能进行平滑扩容。实例存在节点故障情况下不能进行扩容。在最终一致性和强一致性的事务模型下不允许逻辑库扩容。一个DDM实例内,只允许同时对一个实例逻辑库进行平滑扩容操作;不同的DDM实例内,可以同时扩容实例逻辑库。不允许使用正在扩容中的RDS实例进行建库建表操作。最多仅支持扩容50个RDS实例。扩容最大规格为:每个分片不超过20张表。每张表不超过800万数据。平滑扩容原理如下图所示。图1 平滑扩容原理 
  • 分布式数据库中间件实现原理之读写分离
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例读写分离DDM服务实现了自动读写分离,用户购买了RDS只读实例后,将只读实例信息同步到DDM中即可,无需再做其他配置。DDM支持用户在SQL中自定义读写分离策略,具体用法请参考如何实现读写分离。同时DDM还支持在管理控制台配置RDS读策略,具体配置定参见如何配置RDS读写分离。数据库中对计算和缓存资源消耗较多的往往是密集或复杂的SQL查询。当系统资源被查询语句消耗,反过来会影响数据写入操作,进而导致数据库整体性能下降,响应缓慢。因此,当数据库CPU和内存资源占用居高不下,且读写比例较高时,可以为数据库添加只读实例。添加只读实例的作用有以下:将查询非事务性查询SQL路由到只读实例中执行,主实例上执行事务性SQL,在很大程度上缓解主实例上的S锁与X锁的竞争。对只读实例上的表可配置不提供事务支持的数据库引擎,进而提升查询效率。增加只读实例,也相当于数据库横向扩展,直接增加负载能力,同时增加数据冗余,确保数据库高可用。图1 读写分离示意图  说明:DDM会在一个RDS实例上创建多个分片。为了方便描述,上图假设一个DDM实例在RDS实例上只创建一个分片。
  • 分布式数据库中间件实现原理之路由分发
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例路由分发在分布式数据库中,路由分发的作用即将SQL语句进行解析,并转发到正确的分片上,保证SQL执行后得到正确的结果,并且节约QPS资源。例如:订单支付系统包含了shard0、shard1、shard2三个分片,订单号2017010112345678的订单数据存储在shard0分片上,则应该将以下语句路由分发到shard0分片上执行。select Customer, OrderStatus, CreateDate from Orderwhere OrderId = '2017010112345678';如果同时路由分发到shard0、shard1、shard2三个分片,会造成多余的查询,浪费资源;如果路由到shard1、shard2分片,则得不到正确的返回结果。DDM对单张表的路由解析流程如下:图1 单张表的路由解析流程 
  • 分布式数据库中间件实现原理之数据分片
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例数据分片是解决数据库存储容量限制的直接途径,数据分片包括垂直分片与水平分片两种方式。垂直分片垂直分片又叫纵向分割,即以逻辑表为单位,把原有数据库切分成多个数据库。切分后不同的表存储在不同的数据库上。垂直分片与业务架构设计有密切的联系。比如从业务领域对系统进行架构优化,分成多个子业务系统,各个子业务系统耦合度较低。子业务系统间以接口方式进行数据通信和数据交换。图1 垂直分片示意图 垂直拆分后业务清晰,拆分规则明确,系统之间容易整合与扩展。一般用于数据库上层架构设计。水平分片水平分片又叫横向分割,即以逻辑表中的数据行记录为单位,把原有逻辑数据库切分成多个物理数据库分片,表数据记录分布存储在各个分片上。DDM的分库分表,即为水平分片。当业务架构无法继续细分,而数据库中单张表数据量太大,查询性能下降时,适用于水平方式的数据分片。通过水平分片,既解决单库容量问题,同时提高并发查询性能。图2 水平分片示意图 DDM实现了自动水平分片,应用无需关心某个数据该存储在哪一块分片上。对逻辑表水平分片需要依据一定的分片规则,例如一个订单跟踪系统(见图2),我们选取订单号(OrderId)作为拆分键,分别对“订单流水表”、“订单详情表”以及“物流跟踪表”进行水平拆分,拆分算法以Hash为例,对拆分键的值Hash后求模,分片计算规则如下:H(Key(OrderId)) = Hash(Key(OrderId))%N其中,N表示一共有N个数据分片,H(Key(OrderId))表示该订单经过订单号Hash并求模后存储的分片编号。图3 分片后数据存储示意图  说明:对于水平分片的拆分算法,除了Hash拆分算法外,DDM当前还支持选择Range和日期函数对数据进行拆分,详细信息请参见按范围进行数据分片。
  • 分布式数据库中间件 如何配置读写分离
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例配置读写分离华为云分布式数据库中间件DDM支持配置RDS读策略,实现读写分离,可以根据数据读取压力负载情况,登录DDM管理控制台(RDS导入管理 > 更多 > 设置RDS读策略)合理配置读写分离策略,提高查询性能。RDS读写分离策略分为四种,详情如下表所示。表1 读策略详细信息RDS读写分离策略全读主均衡读只读实例均衡自定义读策略说明读请求只会分发到主实例上,即关闭读写分离。读请求在主实例和只读实例上平均分发。读请求在只读实例上平均分发,不会分发到主实例上。读请求根据自定义的相对权重分发到各个实例上。适用场景强一致性读。读压力较大时配置读负载均衡,接受数据短时间不一致。希望读不影响主实例,接受数据短时间不一致。读压力较大时控制读主的比例,接受数据短时间不一致。约束限制无。存在只读实例。主实例和只读实例允许短时间不一致。存在只读实例。主实例和只读实例允许数据短时间不一致。如果只读实例全部故障则临时全读主。存在只读实例。主实例和只读实例允许数据短时间不一致。如果只读实例全部故障则临时全读主。说明:2018-07-05 24:00之前创建的DDM实例,如果RDS有只读实例,仅支持只读实例均衡。由于RDS只读实例和主实例之间的数据同步可能存在延迟,从只读实例上读取的可能不是最新的数据,可通过加事务或者hint强制分发到主实例上。配置实例读写分离的相对权重值。相对权重:全读主:读请求分发到该实例的相对权重。均衡读:读请求分发到该实例的相对权重,均衡读策略相对权重固定为50,读请求在所有实例间平均分发。只读实例均衡:读请求分发到该实例的相对权重,只读实例均衡,主实例相对权重固定为0,只读实例相对权重固定位50,请求在所有只读实例间平均分发。自定义读:读请求分发到该实例的相对权重,比如一个主实例和两个只读实例,相对权重分别设置为20、80、100,则读请求分发到主实例的概率为20/(20+80+100)%=10%,分发到两个只读实例的概率分别为40%、50%。例如:RDS实例A有2个只读实例B和C,读权重如下表所示。表2 实例相对权重示例读策略主实例A读相对权重只读实例B相对权重只读实例C相对权重全读主10000均衡读505050只读实例均衡05050自定义读2080100
  • 分布式数据库中间件DDM 如何进行分片
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例在分布式数据库中,可以通过分片存储方式,轻松解决大数据量单表容量达到单机数据库存储上线的瓶颈,因此创建逻辑库和逻辑表时,需要根据实际情况确定逻辑表是否进行分片以及按什么规则分。说明:分片存储后,需要尽量避免跨库JOIN操作带来的性能与资源消耗问题。逻辑表是否分片DDM逻辑表支持全局表、分片表、单表三种类型。用户可以按照数据表的实际使用需求,选择最合适的逻辑表类型创建。单表只在第一个分片创建表以及存储数据。全局表在每一个分片创建表并且存储全量数据。分片表在每一个分片创建表,数据按照拆分规则分散存储在分片中。按什么规则分逻辑表的拆分键选择非常重要。建议按实际业务场景选择拆分键,不同逻辑表,如果具有E-R关系,建议选择相同字段做拆分键,避免跨库JOIN操作,详情请参见如何选择拆分键和拆分算法。在实际使用中,请结合以下建议评估是否进行分片:数据量在1000万以下的表,不建议分片。通过建立合适的索引,采取读写分离策略,单表也可以很好的解决性能问题。数据量在1000万以上的表,建议分片。将数据分片存储后,既能解决单张表容量过大带来的性能瓶颈,同时提高并发支持。注意要选择合适的拆分键,提前做好规划。业务读取尽量少用多表JOIN,同一个事务避免跨分片。查询条件尽量带上拆分键,避免全分片表扫描。
  • 分布式数据库中间件DDM 如何解决jdbc驱动方式连接DDM异常问题
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例MySQL驱动( jdbc)通过Loadbalance方式连接DDM,在某些场景下连接切换时会陷入死循环,最终导致栈溢出。问题定位查看APP日志,定位异常原因。例如,从以下日志中分析出异常最终原因为栈溢出。Caused by: java.lang.StackOverflowErrorat java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)at java.nio.ByteBuffer.allocate(ByteBuffer.java:335)at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:795)at java.nio.charset.Charset.encode(Charset.java:843)at com.mysql.jdbc.StringUtils.getBytes(StringUtils.java:2362)at com.mysql.jdbc.StringUtils.getBytes(StringUtils.java:2344)at com.mysql.jdbc.StringUtils.getBytes(StringUtils.java:568)at com.mysql.jdbc.StringUtils.getBytes(StringUtils.java:626)at com.mysql.jdbc.Buffer.writeStringNoNull(Buffer.java:670)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2636)分析溢出源。例如,从以下日志可以分析出,溢出原因为驱动内部陷入死循环。at com.mysql.jdbc.LoadBalancedConnectionProxy.pickNewConnection(LoadBalancedConnectionProxy.java:344)at com.mysql.jdbc.LoadBalancedAutoCommitInterceptor.postProcess(LoadBalancedAutoCommitInterceptor.java:104)at com.mysql.jdbc.MysqlIO.invokeStatementInterceptorsPost(MysqlIO.java:2885)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2808)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2483)at com.mysql.jdbc.ConnectionImpl.setReadOnlyInternal(ConnectionImpl.java:4961)at com.mysql.jdbc.ConnectionImpl.setReadOnly(ConnectionImpl.java:4954)at com.mysql.jdbc.MultiHostConnectionProxy.syncSessionState(MultiHostConnectionProxy.java:381)at com.mysql.jdbc.MultiHostConnectionProxy.syncSessionState(MultiHostConnectionProxy.java:366)at com.mysql.jdbc.LoadBalancedConnectionProxy.pickNewConnection(LoadBalancedConnectionProxy.java:344)查看使用的MySQL版本,为5.1.44。查看该版本源代码,发现获取连接时,LoadBalance会根据负载均衡策略更新连接,并将老连接的配置复制给新连接,在新连接AutoCommit为true,新连接部分参数和老连接不一致,loadBalanceAutoCommitStatementThreshold参数没有配置的场景下,会陷入死循环,更新连接函数调用同步参数函数,同步参数又调用更新连接,最终导致栈溢出。解决方法在连接DDM的URL添加loadBalanceAutoCommitStatementThreshold=5&retriesAllDown=10参数。//使用负载均衡的连接示例//jdbc:mysql:loadbalance://ip1:port1,ip2:port2..ipN:portN/{db_name}String url = "jdbc:mysql:loadbalance://192.168.0.200:5066,192.168.0.201:5066/db_5133?loadBalanceAutoCommitStatementThreshold=5&retriesAllDown=10";loadBalanceAutoCommitStatementThreshold:表示连接上执行多少个语句后会重新选择连接。假设loadBalanceAutoCommitStatementThreshold设为5,则当执行5个sql后(Queries或者updates等),将会重新选择连接。若为0表示“粘性连接,不重新选择连接”。关闭自动提交时(autocommit=false)会等待事务完成再考虑是否重新选择连接。retriesAllDown:当所有的连接地址都无法连接时,轮询重试的最大次数。重试次数达到阈值仍然无法获取有效连接,将会抛出SQLException。
  • 分布式数据库中间件DDM 全局表和单表的使用场景
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例定义单表指数据只存储在其中一个默认分片上的表;全局表指在所有分片上都存储全量数据,提升JOIN效率。单表DDM管理控制台不提供单表创建操作,用户可以通过MySQL客户端或应用程序连接到DDM实例后自行创建。如果一张表的数据,数据量预估在1000万以下,且没有与其他分片表进行关联查询的需求,建议将其设置为单表类型,存储在默认分片中。全局表在业务数据库中,存在一些数据量不大,更新频度低,但常常需要用来做关联查询的表。为了支持这类表与分片表进行JOIN操作,DDM设计了一类“全局表”,具有以下特点:全局表在各分片表中数据一致。数据**、更新与删除会实时在每一个分片表中执行一次。对全局表的查询,仅在一个分片表中执行。任何表都可以与全局表进行JOIN操作。例如:电商企业的订单管理系统,需要查询统计广东地区的订单数据。假如涉及到省份地区表与订单流水表进行JOIN查询,由于订单数据量庞大,订单流水表需要分片存储,因此可以考虑将省份地区表设计为“全局表”,避免跨库JOIN操作。关于全局表的设置,可参考用户指南中关于“创建逻辑表”的入门指导,在新建逻辑表时,将逻辑表类型选择为“全局表”。注意:全局表操作 、不带分片条件的sql语句等全表扫描类语句,并发不要太高(或者选择在业务空闲时进行),否则可能报“后端rds连接数可能不够用”的错误。
  • 分布式数据库中间件DDM 如何选择逻辑库分片数
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例如何选择单RDS分片数量在DDM实例创建逻辑库时,对需要水平拆分的表,需要选择合适的RDS实例数量和单RDS分片数量,通过预估分片表的数据量,规划出逻辑库分片数量,可以避免各个分片的上单张表数据容量过高。逻辑库选择“非拆分”模式时,一个逻辑库仅对应一个RDS实例,在该RDS实例上仅创建1个分片。逻辑库选择“拆分”模式时,一个逻辑库可以对应多个RDS实例,在每个RDS实例上缺省创建8个分片,可根据需要配置为16、32、64、128个分片,分片数一旦配置将不支持修改。单RDS分片数需根据需要合理规划,当单RDS实例规格超过规格上限时将会直接系统影响性能,在总分片数固定的前提下,要评估单RDS实例规格,权衡RDS实例数量和单RDS分片数的关系。分片估算公式如下:总分片数={总记录数}/{单表记录数}={RDS实例数}*{单RDS分片数}{单RDS实例记录数}={单表记录数}*{单RDS分片数}单RDS存储容量={单RDS实例记录数}*{单记录字节数}单RDS实例规格=存储容量、吞吐性能、响应延迟、连接数、物理资源等对需要水平拆分的表,评估未来1-2年后的业务规模,可参考下表评估单RDS分片数。表1 业务规格评估参考项计算方法参考用户取值示例总记录数根据业务规模评估按实际填写10亿条=1,000,000,000单表记录数根据业务规模评估按实际填写1000万条总分片数{总记录数}/{单表记录数}(等价{RDS实例数}*{单RDS分片数})按实际填写100RDS实例数参考如何选择RDS实例数量。按实际填写4单RDS分片数{总分片数}/{ RDS实例数}支持取值范围枚举:[8,16,32,64,128]单RDS分片数需根据实际情况合理规划,当分片数过多导致单RDS实例规格超过规格上限时将会直接系统影响性能。低规格实例的分片数若过多,建议增加调整实例规格或者实例数量。按实际填写32
  • 分布式数据库中间件DDM 如何选择RDS实例数量
    官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例RDS实例作为数据存储引擎,在数据库存储与性能设计方面需要合理规划。自行评估满足业务所需要的数据库性能指标。如存储容量、数据库吞吐量、最大数据库连接数等。选择合适的RDS实例规格,以下以8核32GB为例,具体请参见选择数据库实例规格。计算每个单项指标需要RDS实例数的最小值。如下表所示。表1 指标计算参考单项指标总基线(举例)单RDS基线(举例)单项指标RDS实例数(举例)参考计算方法{总存储容量}2000GB500GB4{总记录数}*{单记录占用字节数}{总吞吐量QPS}40000230002业务支持{每秒最大请求数}*{单个请求访问数据库次数}.........................计算RDS实例数量。取每个单项指标需要RDS实例数的最大值,即上表中“单项指标RDS实例数”列最大取值。单张表数据量达到1000万以上,如果不做拆分,则查询效率会略受影响。数据库架构师在规划RDS实例存储空间时,建议预估未来至少一到两年内的数据量。如果查询并发压力较大,可以考虑对RDS实例增加只读实例。通过在云监控云监控中找到对应的RDS实例,查看RDS实例的CPU和内存等性能指标的使用情况,进而判断RDS实例的并发压力。如果总体业务吞吐量较高,或者现有RDS实例的资源占用较高,可以适当增加RDS实例,提高数据库并行计算能力。
  • 分布式数据库中间件DDM 切换事务日志节点后如何迁移事务日志节点数据
    简述本文主要介绍当DDM逻辑库关联的事务日志节点切换后,如何把旧事务日志节点上(简称旧RDS)存储的数据迁移到新事务日志节点(简称新RDS)。迁移前注意事项必须先切换事务日志节点后,再进行事务日志节点数据迁移操作。迁移数据期间请务必停止对该逻辑的进行相关业务操作。准备一台与旧RDS、新RDS网络互通的ECS。将数据从原RDS导出在ECS上使用mysql连接旧RDS。mysql -h ${旧RDS地址} -P${旧RDS端口} -u${旧RDS用户名} –p找到分布式事务在RDS上专用的数据库,命名规则为:“dtx”+“_”+“逻辑库名”。如下图所示,dtx_db_4702即为存储分布式事务数据的专用库。查看该库中的表数据。对该RDS上的四张系统表进行备份,其中“ddm_tx_node”表不需要进行备份。说明:备份前需要停止相关业务操作。mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --single-transaction --hex-blob --complete-insert --set-gtid-purged=OFF --quick --no-create-info --skip-comments --skip-lock-tables --add-locks=false {DB_NAME}{TABLE_NAME} > mysq_table_data.sqlDB_ADDRESS:待导出数据的数据库连接地址。DB_PORT:数据库侦听端口DB_USER:数据库用户DB_NAME:数据库名称TABLE_NAME:待导出表名,可以多个同类型的表,用空格隔开。mysq_table_data.sql:生成的表数据文件名,可自定义例如:mysqldump -h 192.168.2.183 -P 3306 -u root -p --single-transaction --hex-blob --complete-insert --set-gtid-purged=OFF --quick --no-create-info --skip-comments --skip-lock-tables --add-locks=false dtx_db_4702 ddm_tx_binlog ddm_tx_lock ddm_tx_rollback ddm_tx_rollback_his > mysql_oldtable_data.sql将数据导入到新RDS开启应用程序访问DDM数据库只读开关。执行如下命令导入表数据文件。mysql -f -h {RDS_ADDRESS} -P {RDS_PORT} -u {RDS_USER} -p {DB_NAME} < mysql_table_data.sqlDDM_ADDRESS为新RDS的IP地址。DDM_PORT为新RDS的侦听端口。DDM_USER为登录新RDS的用户名。DB_NAME为新RDS上的逻辑库名称。mysq_table_data.sql为待导入的表数据文件名,需与导出文件名统一。导入完成后启动对DDM逻辑库相关业务操作。验证是否能正常读取、写入数据。正常:数据迁移完成。异常:请联系技术支持定位处理。
  • 分布式数据库中间件 如何选择合适的分布式事务模型
    开始前先撒一波福利,感兴趣的小伙伴抓住机会哦。官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例华为云分布式数据库中间件DDM当前支持单机、最大努力提交、最终一致性和强一致性四种事务模型,详情如下表所示。事务模型   优势不足单机执行效率高,由底层数据库提供强一致性的保证。如果事务涉及到多分片,DDM将拒绝执行,返回错误。最大努力提交支持跨分片事务,执行结果相对独立,互不干涉。执行效率低于单机。如果有分片提交失败时,不提供事务补偿,因此会出现部分执行成功部分执行失败。最终一致性支持跨分片事务,且保证各分片事务最终执行结果一致。执行效率低于最大努力提交。如果有分片提交失败时,会进行事务补偿,事务补偿阶段,客户端查询结果不是最新结果(即存在中间状态)。强一致性支持跨分片事务,在最终一致性基础上,增强了事务一致性保证,即任何时间点各分片的数据都是事务结束后的。执行效率低于最终一致性。在事务执行结束前可能存在等待。注意:DDM的事务模型建立在逻辑库层面上,一个逻辑库只能选择一种事务模型。在创建逻辑库时需要规划好存储的数据结构与SQL的需求,如是否需要跨分片,是否必须保证事务强一致性等,根据需求选择合适的事务模型。单机基本概述只能在单个分片上执行,如果事务涉及到多分片,DDM将拒绝执行,返回错误。原理下图所示。适用场景适合业务拆分比较合理,在应用层有独自完善的事务处理框架,到DDM的事务都是单分片事务,单分片事务由底层数据库提供强一致性的保证。单机事务模型下,如果出现跨分片的事务,会报错进行提示,避免达不到预期目的。图1 单机最大努力提交基本概述事务在各分片上分别提交,互不干涉,提交结果尽最大可能保持一致,但有部分提交成功部分提交失败的可能,原理如下图所示。适用场景适合绝大部分不涉及金钱往来的业务,在性能和一致性之间比较好的一个平衡。事务中commit时因为是往多个节点发送执行,有部分commit成功部分commit失败的可能性,但是可能性比较低,只有在commit的时间窗内出现异常才有可能出现此种情况。图1 最大努力提交最终一致性基本概述事务在各分片上的提交结果不保证始终一致,如果有分片提交失败,DDM会对其他提交成功的分片提供补偿机制撤消之前的修改,从而确保各分片事务状态最终一致。原理跟强一致性类似,请参见强一致性。说明:最终一致性与强一致性原理基本一致,区别在于:最终一致性场景下,如有并发的查询请求,查询到的结果可能事务处理中部分分片已完成提交的结果,即存在中间状态。强一致性场景下,如有并发的查询请求,查询结果是事务提交完成后的结果,即不存在中间状态。适用场景适合对一致性要求比较高的场景,最终一致性解决了最大努力提交模型下部分commit成功部分失败的问题。如果对部分读的sql一致性要求比较高,还可以通过select for update或者lock in share mode来避免读取到不一致状态(部分成功部分失败)。例如:select col1, col2,...coln from table1 where col1={拆分键} for update;select col1, col2,...coln from table1 where col1={拆分键} lock in share mode;where条件中建议带上拆分键。强一致性基本概述在最终一致性基础上,增强了事务一致性保证,即任何时间点,各分片的数据都是事务开始前或者事务提交后的。原理如下图所示。适用场景适合对一致性有极端要求的场景,既要保证提交原子性、并且所有查询都必须避免脏读。一致性级别越高,付出性能代价会越大,请根据业务需要选择合适的模型。说明:在强一致性模型下,为了保证强一致性,会对所有select加共享锁,共享锁在对同一条数据并发加锁或解锁时可能会导致死锁,请根据业务场景,对相关select加排它锁for update进行规避。
  • 分布式数据库中间件 如何选择拆分键和拆分算法
    开始前先撒一波福利,感兴趣的小伙伴抓住机会哦。官网正在进行一系列的体验活动,了解更多详情请移步官网看看大大大福利~~各种配置太麻烦? 轻轻的点击下图,试试一键式免费开通DDM实例拆分键和拆分算法是在华为云分布式数据库中间件DDM控制台创建逻辑表时进行配置,本文主要介绍如何选择拆分键和拆分算法。拆分算法拆分算法即将逻辑表中数据拆分到多个数据库分片上的算法,华为云分布式数据库中间件DDM当前支持hash和range两种拆分算法。hash将数据均匀分布在各个分片。适用于SQL查询条件使用“=”、“IN”之类运算符相对较多的场景。range将数据表内的记录按照算法原数据的取值范围进行分片存储。适用于SQL查询条件使用“>”、“<”、“BETWEEN ... AND ...”之类运算符相对较多的场景。拆分算法的使用,需要结合业务查询场景进行评估,以选择最佳拆分算法,提升DDM效率。拆分键拆分键是在水平拆分逻辑表的过程中,用于生成路由结果的表字段,指定表字段后,可以进一步选择日期函数,也可以手动输入“日期函数(字段名)”。数据表字段必须是日期类型(date、datetime、timestamp),日期函数适用于需要按时间(年、月、日、周及其组合)对数据进行拆分的场景。DDM根据拆分键与拆分算法计算路由结果,对分片表的数据进行自动水平拆分,分发到数据分片中。选取拆分算法与拆分键一般遵循以下规则:尽可能使数据均匀分布到各个分片上。该拆分键是最频繁或者最重要的查询条件。优选主键作为拆分键,因为主键作为查询条件时,查询速度最快。有明确主体的业务场景分片表的数据量一般都达到千万级,因此选择合适的拆分算法和拆分键非常重要。如果能找到业务主体,并且确定绝大部分的数据库操作都是围绕这个主体的数据进行的,那么可以选择这个主体所对应的表字段作为拆分键,进行水平拆分。业务逻辑主体与实际应用场景相关,下列场景都有明确的业务逻辑主体。银行类客户业务应用,业务逻辑主体是客户,可使用客户对应的表字段(例如客户号)作为拆分键。部分业务系统的业务场景为围绕银行卡/账号的,可以选取卡/账号作为拆分键。电商类应用,如果业务场景是围绕商品进行操作,业务逻辑主体是商品,可使用商品对应的表字段(例如商品编码)作为拆分键。游戏类的应用,主要围绕玩家数据进行操作,业务逻辑主体是玩家,可使用玩家对应的表字段(例如玩家id)作为拆分键。以银行类客户业务为例,建表SQL语句如下:CREATE TABLE PERSONALACCOUNT (    ACCOUNT VARCHAR(20) NOT NULL PRIMARY KEY,    NAME VARCHAR(60) NOT NULL,    TYPE VARCHAR(10) NOT NULL,    AVAILABLEBALANCE DECIMAL(18,2) NOT NULL,    STATUS CHAR(1) NOT NULL,    CARDNO VARCHAR(24) NOT NULL,    CUSTOMID VARCHAR(15) NOT NULL) ENGINE=INNODB DEFAULT CHARSET=UTF8;建表示例如下图所示。无明确主体的业务场景如果业务场景中找不到合适的主体,也可以选择那些数据分布较为均匀的属性所对应的表字段作为拆分键。例如日志分析场景,日志系统中可能包含各类复杂的信息,这时您可以选择时间字段作为拆分键。选择时间字段作为拆分键时,支持对拆分键使用日期函数拆分。为了方便清理和转储,采用range拆分算法,对时间字段用日期函数转换成年,表示按年存储到各个分片上,如下图所示。建表SQL语句:CREATE TABLE LOG (    LOGTIME DATETIME NOT NULL,    LOGSOURCESYSTEM VARCHAR(100),    LOGDETAIL VARCHAR(10000));
  • 【寻找人气王】邀新用户免费体验云服务,百元话费等你拿!
    华为云分布式数据库DDM是解决数据库容量、性能瓶颈和分布式扩展问题的中间件服务,能有效提升数据库读写性能,重要的是现在可以免费体验哟!只要回帖提供自己及4名好友新创建的DDM实例截图,即可获得50元话费!成功邀请8名可获得100元话费!多请多得,以此类推~活动结束后还将根据成功邀请的人数,评选出一名“分享人气王”,额外奖励一台小天鹅蓝牙音箱!DDM领取链接:https://console.huaweicloud.com/ddm/?region=cn-south-1#/ddm/manager/ddmmanager/?quickCreate=true&forum活动时间:2018.7.19 ~2018.7.31 回复格式:华为云用户名(非社区昵称)+邀请者的华为云用户名+ DDM实例截图(见2楼回帖示例) 注:邀请的好友必须为活动当天起首次体验分布式数据库中间件DDM产品的新用户,之前已领取试用过的账号无效哦! 确认过眼神,你就是我们要找的人~还在犹豫什么,赶紧行动吧!恭喜用户名tzdddl成功邀请了5位新用户,获得本次人气王的称号,按照活动规则奖励50元话费+小天鹅蓝牙音箱1台!用户名MR-hou和xiao邀请新用户数未达到活动规则要求,再接再厉哦请获奖用户按照“ID+华为云用户名+收件人姓名+手机号码+收货地址”的格式将以上信息在8月31日前直接发送到公众号“中间件小哥”(扫描下方二维码即可关注),小哥会尽快将奖品送出哈~