ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于ZooKeeper的三种分布式锁实现

2019-08-21 10:43:10  阅读:222  来源: 互联网

标签:风险 厂商 数据库 ZooKeeper 开源 三种 商业 成本 分布式


  数据库,作为IT系统的基础类软件,发挥着非常巨大的作用。那么企业在使用数据库时,有什么样的方式可以选择?不同方式又各有其什么特点呢?本文将从使用方式、适用场景、未来发展、成本因素(人力、财务、时间)及风险点等多角度分析十二种情况(前六种为本地方式,后六种为云端方式)。
  
  方式1:商业数据库 + 商业服务
  
  这是比较传统的一种方式。企业购买大型商业数据库软件,并对应购买服务支持工作。在过去三、四十年里,这是主流的一种使用方式。可以说也很好地满足了各类企业的快速发展。只是随着近二十年来,互联网化的变革,对此种方式产生了不小的冲击。
  
  这种方式适合传统企业,对数据库要求较高,自有技术能力有限,未来发展相对固定的情况,未来发展随着商业数据库的发展而变化,从总体来看,未来云化的需求对其冲击较大。此外,在国产化、自主可控化等要求下,也会对这个模式影响较大。
  
  成本因素
  
  从人力成本角度来看,整体投入不大,主要是由厂商提供。自有人员主要是完成审核、评估等工作。从财务成本分析,是几个方案中,相对最高的一种。经常见到“某国有银行,年度数据库采购xxxx万元的新闻”见诸报端。
  
  正因为财力投入较大,这种方式也一般仅限于大中型企业或某些特殊行业要求。对时间成本而言,是相对较少的。选择商业数据库+服务,也就是看重其多年产品研发技术积累和成熟的商业交付能力。无论是产品成熟度、稳定性;还是服务支持方面等,一般都是可在较短时间内交付的。
  
  风险分析
  
  技术风险:技术封闭、不开放;不符合自主可控要求。
  
  政治风险:如是外商产品,还易受到政治环境的影响。
  
  财务风险:容易受到厂商绑架,经济投入上不太可控。
  
  人员风险:受厂商技术人员技术能力水平影响很大,自有人员无法承担,长期得不到成长。
  
  功能风险:成熟商业产品,很难定制化满足客户个性需求;且存在与其他组件集成风险。
  
  转型风险:采用某商业产品后,想转型其他产品较为困难。
  
  其他说明
  
  商业产品,包含国产数据库及新兴数据库厂商。作为商业产品很好的补充,这两类方案在综合成本上是有优势的,但还需要在产品功能及服务能力上进一步加强。毕竟类似国外的商业产品服务,已经有四、五十年的积累。
  
  商业服务,除了原厂服务外,还包括第三方服务支持公司。在后者的选择上,针对国外和国内厂商服务,差异还是比较大的。近期看到国产包括新兴数据库厂商与第三方服务公司之间的合作,动作很多(包括培训、认证、交付等)。
  
  方式2:商业数据库 + 自主服务
  
  这一方式也较为常见。在前一方式中,随着企业使用商业软件的深入,自有服务需求就变得迫切起来。通过建立自有服务体系,可以更好地满足企业自身需求。这种方式,适合有一定技术积累的传统企业。未来发展随着商业数据库的发展而变化,总体相对稳定。
  
  成本因素
  
  从人力成本来看,相较于前者有更多的投入。商业数据库产品推广多年,相关人才保有量很大,因此一般很容易招聘到需要的人才,且往往价格也不太高。这与后面的开源软件,形成鲜明的对比。财务成本投入仍然相对较大,商业软件的采购费用占整体的大头。
  
  从时间成本看,较前者有所增加,但整体仍然偏少。这主要是因为商业数据库成熟的生态,很容易搭建出运维体系;且人才方面,也较容易去补充。
  
  风险分析
  
  在风险方面,与前者类似。其中技术风险上,自有人员对商业产品的把控,较原厂还是有所差距。当然对应人员风险就降低,通过自有人员对产品把控力更大。
  
  其他说明
  
  在某些关键核心领域,仍然建议采用原厂支持,减低技术风险。
  
  方式3:开源数据库 + 商业服务
  
  随着开源数据库的日益成熟,越来越多的企业开始使用开源数据库。但相较于商业数据库,开源方案对企业自有技术能力要求较高。因此,很多考虑搭上开源浪潮的企业,采用这种方式。适用于转型中的企业,从商业走向开源,这种方式可以在一定程度上规避风险。但一般为过渡阶段,长期来看还是要培养企业自有的服务能力。
  
  成本因素
  
  人力成本来看,处于中等水平,相较于商业服务,其综合人力成本有所降低的。财务成本投入大体中等左右,但服务厂商不同差异较大。时间成本投入较少,但相较于商业方案,需要企业对商业服务做更多的技术考察。因此在初始的评测阶段,往往需要投入较多的时间。
  
  风险分析
  
  技术风险:开源数据库自身技术风险、企业技术选型风险及商业服务能力风险。
  
  人员风险:受厂商技术人员技术能力水平影响很大,需要认真评估。
  
  功能风险:一般而言,开源数据库在功能上相较于商业数据库,还是有所欠缺。因此这部分要仔细评估。
  
  public class NodeBlocklessLock extends ZooKeeperBase implements ZooKeeperLock {
  
  /** 尝试获取锁 */
  
  public boolean lock(String guidNodeName, String clientGuid) {
  
  boolean result = false;
  
  if (getZooKeeper(www.kunlunyulegw.com).exists(guidNodeName, false) == null) {
  
  getZooKeeper().create(guidNodeName, clientGuid.getBytes(),
  
  ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  
  byte[] data = getZooKeeper().getData(guidNodeName, false, null);
  
  if (data != null && clientGuid.equals(new String(data))) {
  
  result = true;
  
  }
  
  }
  
  return result;
  
  }
  
  /** 释放锁 */
  
  public boolean release(String guidNodeName, String clientGuid) {
  
  boolean result www.csyldl.com= false;
  
  Stat stat = new Stat();
  
  byte[] data = getZooKeeper(www.dfgjyl.cn).getData(guidNodeName, false, stat);
  
  if (data != null && clientGuid.equals(new String(data))) {
  
  getZooKeeper().delete(guidNodeName, stat.getVersion());
  
  result = true;
  
  }
  
  return result;
  
  }
  
  /** 锁是否已经存在 */
  
  public boolean exists(String guidNodeName) {
  
  boolean result = false;
  
  Stat stat = getZooKeeper(www.yuxinyulept.com).exists(guidNodeName, false);
  
  result = stat != null;
  
  return result;
  
  }
  
  }
  
  3.3   基于子节点实现的分布式锁基类
  
  ChildrenNodeLock.java
  
  public abstract class ChildrenNodeLock extends ZooKeeperBase implements ZooKeeperLock {
  
  /** 获取当前节点的前一个节点,如果为空表示自己是第一个 */
  
  protected String getPrevElementName() {
  
  List<String> elementNames = getZooKeeper(www.zongxyuLe.com).getChildren(this.guidNodeName, false);
  
  long curElementSerial = Long.valueOf(
  
  elementNodeFullName.substring((this.guidNodeName + "/" + childPrefix).length()));
  
  String prevElementName =www.yongshenyuL.com null;
  
  long prevElementSerial = -1;
  
  for (String oneElementName : elementNames) {
  
  long oneElementSerial = Long.parseLong(www.xingtuylgw.com oneElementName.substring(childPrefix.length()));
  
  if (oneElementSerial www.tongyayule.com< curElementSerial) {
  
  // 比当前节点小
  
  if (oneElementSerial > prevElementSerial) {
  
  prevElementSerial = oneElementSerial;
  
  prevElementName = oneElementName
  
  与商业服务不同,目前在开源服务方面,各厂商能力参差不齐,也没有较为统一的标准。有些开源数据库,是有所谓“原厂”类商业支持,但在国内声小势微。
  
  方式4:开源数据库 + 自主服务
  
  这是典型的“互联网”玩法,也是较为常见的一种方式。适用于规模较大,企业定制化要求较高的场景。发展成熟可考虑向企业内部私有云或数据库产品、方案方向发展,甚至对外赋能。
  
  成本因素
  
  这种方式的人力成本相对较高,但根据企业的使用规模、难度差异较大。开源数据库的发展也经历了一段时间,市场上人才保有量也逐步提升。但对于高端人才,仍然相对稀缺,人才成本也较高。财务方面,主要也表现在人力成本上。
  
  此外,对于基础设施上也需要有一定投入,甚至可能比商业方案投入更大。时间成本较高,企业要建立成熟的开源数据库运维体系,是需要一定时间积累。
  
  风险分析
  
  风险分析与上者类似,突出人员风险,需长期培养投入。
  
  方式5:开源定制数据库 + 商业服务
  
  这是方案3的一种特殊情况。企业不是使用原生开源产品,而是使用第三方公司定制开源方案,可能是纯软件,也可能是软硬一体式。这类方式,会针对开源软件的不足,做定制化改进,满足企业级软件的需求。
  
  但这种方式一般企业无法自己独立运维,需要借助第三方公司的商业支持。对数据库的企业级特性有较高要求,但原生开源数据库又无法满足的情况。对于短期内有去除商业数据库的需求场景,非常适合。随着国内对开源数据库使用水平不断深入,有越来越多的此类初创型企业出现。非常看好这种模式的未来发展。
  
  成本因素
  
  人力成本,主要来自于第三方服务,总体不高。财务成本,主要看方案情况,差异较大。时间成本,可视同纯商业方案。
  
  风险分析
  
  技术风险:定制化部分不开放,企业不可把控;此外,原生开源的版本变化,可能短期无法适用到方案中
  
  人员风险:受厂商技术人员技术能力水平影响很大,需要认真评估。
  
  转型风险:受限于方案,存在一定转型的风险。
  
  方式6:私有云 + 云化服务
  
  最后一种企业私有化部署方案,是一种云化折中方案。受限于一些特殊国情,有些企业无法直接使用公有云,但又急需类似公有云的平台能力。因此,某些云厂商或数据库厂商提供了一种私有云化部署方案。可简单理解为将云搬回家。
  
  过去有种说法,说私有云会逐步萎缩,公有云会一统天下。但从近两年的国内云市场发展来看,私有云的发展速度某些指标甚至超过公有云。当我们现在大谈”toB”市场成为下一个蓝海时,这种模式也是toB服务市场的一个重要组成部分。这种方式,适合于大型企业,长期看好。
  
  成本因素
  
  从成本角度来看,人力成本投入不大,主要取决于厂商人员投入。财力方面,虽然相较于大型商业解决方案,有一定的成本优势,但优势不甚明显。时间成本上,也要长于传统方案,毕竟这不是单一技术平台的更换,而是涉及到Iaas、Paas等诸多层面。
  
  风险分析
  
  其风险点除了在财力方面,更多是考虑在对厂商的技术依赖性。相较于传统方案,这种方式的依赖性甚至更高。厂商一般提供很好的私有云,及对应其自有公有云的打通方案;但对其他公有云或企业自有平台,则较难打通。
  
  方式7:裸云 + 开源数据库 + 自主服务
  
  这是一种上云使用的初级阶段,企业仅使用云的Iaas部分,其余均自建。这种方式可充分利用公有云带来的弹性优势,将企业原有的技术积累延续到云端。对于企业来说,这种方式也是最为“平滑”的,甚至应用可以不做更多感知,仍然像使用企业内部IT资源一样,使用公有云资源。很适合于有多云、跨云需求的场合。但缺点是无法利用云厂商技术能力带来的附加值。
  
  成本因素
  
  从成本角度来看,企业可做到”最优”。仅使用裸机的情况下,完全可以按”价低者得”的策略,优化选择。在一定规模情况下,公有云还是有其价格优势,何况还可以充分利用弹性能力,动态缩减,根据企业发展随时调整IT投入。人员方面,与企业自主运维变化不大。时间方面,因为底层交付速度的提升,还是有一定的提高。
  
  风险分析
  
  风险不大,仅仅是依赖公有云底层,很容易迁移到其他云厂商或迁回自有。
  
  方式8:裸云 + 商业数据库 + 第三方服务/自主服务
  
  这是一种较为特殊的情况。企业选择将商业数据库,构建在公有云上。但其没有选择云厂商提供的,而是自主构建或选择第三方厂商协助完成。这往往是一些中小型的企业,其规模不足以支持私有化部署,而应用又依赖于商业数据库产品。企业想要充分利用云的弹性,因此组合出这种使用方式。
  
  成本因素
  
  财务成本来说,主要是针对基础设施层面,会较自建有所节省。人力、时间方面,差异不大。
  
  风险分析
  
  风险在于,某些商业数据库针对云场景的不予支持,企业有一定技术风险。要么有比较强大的自主技术能力,要么依赖于第三方服务厂商。
  
  方式9:云数据库(开源) + 云平台服务
  
  这是云厂商推出的最为“传统”的数据库服务,也是目前最多的一种选择。云厂商基于开源的数据库版本+自有的平台服务,构建其数据库产品。其核心的数据库与开源的版本,是完全一致的,各家比拼的更多是平台服务能力。这种方式对于企业的运维要求很低,基本可以依赖于云厂商提供的能力(除了个别高可用、容灾需求外)。这一方案比较适合于初期上云企业,可逐步摸索云与原有方式的区别。
  
  成本因素
  
  财务成本来说,与商业方案比较无疑是有优势的,但与自主开源对比,几乎没有优势。其更多的是在快速交付、扩缩容等方面产品特点。此外,对于人力成本来说,因运维类工作大幅度降低,因此是可以节约一定人力,压缩自有人员规模。时间成本方面,也有所提升。
  
  风险分析
  
  数据库自身风险不大,毕竟其使用的与开源同一版本,技术上可迁移至其他云厂商。当数据库版本升级后,也可以享受到对应的技术红利。但对平台服务,是存在一定依赖的,各家能力不同,需要有适应过程。此外,运维依赖云厂商,也存在一定技术风险。自主的技术能力,会逐步丧失。
  
  方式10:云数据库(开源定制) + 云平台服务
  
  云厂商除了提供与开源一致版本外,一般还提供私有定制版本。它往往是基于某开源数据库某一版本的深度定制,针对某些特性做了加强。当然有些以反馈社区的方式,回馈给开源(可能未来会merge入新版),但很多仅存在在”云私有DB”。如企业有针对某一特殊场景(如秒杀)或其他方面(如金融级数据同步)的强需求,可考虑使用此方案。当
  
  然使用也意味着与云厂商深度绑定。此外,在平台服务方面,与上面情况类似。这种方案比较适合于对数据库有一定要求,而原生开源版本又不支持的情况。
  
  成本因素
  
  与上一种方式类似。
  
  风险分析
  
  风险在于绑定单一厂商,一般很难下来。这与使用大型商业数据库的情况类似。当然可以在应用端做个设计,尽量减少对特性的依赖。此外,因为是定制版本,未来开源版本的升级可能不会短时间内支持,甚至可能不会考虑支持,完全走向独立分支的道路。针对这点,企业也是需要关注的。
  
  方式11:云原生数据库(自研) + 云平台服务
  
  某些大的云厂商,除了上述两种外,可通过自研数据库方式,增加未来的产品竞争力。从最新的Gather报告来看,更多的云厂商加入进来,这也给数据库整体市场带来了活力。从预测来看,均一致看好云原生数据库的未来发展。相较于前两种方式,这类数据库更是诞生于云,从设计之初就更多考虑了云化环境特点,因此极具竞争力。
  
  当然,从目前来看,现有云原生还处于”初级”阶段,未来在解决了更大规模扩展性、多读多写能力等后,其将真正进入井喷式发展。现有各大厂,在这一领域纷纷重点布局,加大投入。对企业而言,无疑又多了一种选择,特别是某些场景(如海量数据等),原生开源、扩展开源产品均无法满足。
  
  成本因素
  
  目前各厂商都在不遗余力地推广,因此从成本上企业还是可以受益的;但从长期来看,还需要进一步观察。从人员来说,企业也是需要一定投入,毕竟这是一种全新的数据库,虽然云厂商提供了很好的交互平台,但还是需要企业做一定的技术储备,因此人员上还需要些投入。时间上来看,对于这个比较新的产品,还需要做更多的测试评估工作,因此也是需要多些投入。
  
  风险分析
  
  风险类似上面,甚至有过之。企业应用将完全依赖于厂商产品。尽管很多是宣传兼容开源或商业数据库,但毕竟不是同一产品。这点还需要企业仔细评估。此外,针对兼容性、备份恢复、高可用、数据同步、跨云容灾等,都是值得投入研究的。
  
  方式12:云数据库(自研) + 云服务 + 云托管平台
  
  这是一类小众的方案,其背景是缘起于数据库厂商与云厂商的蛋糕划分问题。有些数据库厂商(如MongoDB)不希望将云数据库市场由云厂商主导,而是希望可由自身主导,构建不依赖于云厂商的独立生态。目前这种方式国内见得不多,此处暂不评论了。

标签:风险,厂商,数据库,ZooKeeper,开源,三种,商业,成本,分布式
来源: https://blog.csdn.net/li123128/article/details/99941216

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有