• [下午茶时光] 【Day 44--2018/3/28】分布式存储系统的一致性是什么?
    本帖最后由 Sabrina 于 2018-3-28 15:36 编辑 13353 【下午茶时光——业界热点陪你喝咖啡】 分布式存储系统的一致性是什么? [indent]在分布式存储系统的使用中,我们经常会提到“一致性”这个词,但是这个术语在不同的系统、不同人的心目中有不同的内涵,很容易造成混淆。本文帮大家厘清在分布式存储的背景下,一致性究竟代表着什么意涵~ [/indent]“一致性”这个词经常出现在分布式系统相关的描述中,究竟指的是什么呢?写在前面在分布式存储系统的使用中,我们经常会提到“一致性”这个词,但是这个术语在不同的系统、不同人的心目中有不同的内涵,很容易造成混淆。想象一个最简单的存储系统,只有一个客户端(单进程)和一个服务端(单进程服务)。客户端顺序发起读写操作,服务端也顺序处理每个请求,那么无论从服务器视角还是从客户端视角,后一个操作都可以看到前一个操作的结果。然后,系统变的复杂一些,系统还是单个服务进程(单副本),但是有多个客户端并发进行操作。这个模型下,多个客户端的操作会互相影响,比如一个客户端会读到不是自己写的数据(另一个客户端写入的)。一般单机并发程序就是这样的模型,比如多个线程共享内存的程序中。13354然后,系统向另外一个方向变的复杂一些,为了让后端存储系统更健壮(目的不仅如此),我们可以让两个不同的服务进程(位于不同的机器上)同时存储同一份数据的拷贝,然后,通过某种同步机制让这两个拷贝的数据保持一致。这就是我们所说的“多副本”。假设还是一个客户端进程顺序发起读写操作,每个操作理论上可以发给两个副本所在的任意一个服务。那么,如果副本之间是数据同步不及时,就可能发生前面写入的数据读不到,或者前面读到的数据后面读不到等情况。结合前两种模型,在一类真实的系统中,实际存在多个同时执行读写操作的客户端同时读写多个副本的后端存储服务。如果这些不同客户端的读写操作涉及到同一个数据项(比如,文件系统中,同一个文件的同一个位置范围;或者数据库系统中同一个表的同一行),那么他们的操作会互相影响。比如,A、B两个客户端,操作同一行数据,A修改这行,是不是要求B立即能够读到这个最新数据呢?在多副本的系统中,如果不要求上述保证,那么可能可以允许A和B分别操作不同的副本。更进一步,前面的系统模型中,假设每个服务进程拥有和管理着一份“全量”的数据。而更复杂的系统中,每个服务进程中,只服务整个数据集的一个子集。例如单机往往是无法容纳全部数据的一份副本的,所以,数据库表和表的分区是分散在多机上提供服务,每个服务进程只负责某些表分区的一个副本。在这样的系统中,如果一个读写操作涉及到的多个分区位于多个服务进程中,可能出现更复杂的读写语义的异常情况。比如,一个写操作W中修改了两个不同服务进程的两个不同的分区的副本上的两个不同的数据项,随后的一个读取这两个数据项的读操作,是否允许读到W对一个数据项的修改,而读不到对另一个数据项的修改?综上,我们要讨论的通用的分布式存储系统具有如下特性:[*]数据分为多个分片存储在多台服务节点上 [*]每个分片有多个副本,存储在不同的服务节点上 [*]许多客户端并发访问系统,执行读写操作,每个读写操作在系统中需要花费不等的时间与数据库事务一致性的差异数据库事务的ACID的中也有一个一致性(consistency),但彼一致性非此一致性。ACID中的一致性是指,数据库的事务的执行,或者说事务观察到的数据,总是要满足某些全局的 一致性 约束条件,如唯一性约束,外键约束等。这个概念和数据库的数据是否多副本没关系。而本文的一致性在多副本的语境下才有意义。所以,数据库事务的一致性,是指数据项之间总是满足某些约束条件,或者说整个数据库在满足约束条件的意义上是正确的。更让人崩溃的是,事务的隔离性也容易和这里的一致性混淆,因为它和一致性模型类似,限定了某种并发操作的执行顺序。事务的隔离性是指并发执行的事务,能以多大的程度看到看到彼此。这个概念也和数据是否多副本没有关系,单副本的单机数据库也需要支持不同的隔离级别。比如,如果数据库设定为可串行化(serializable)隔离级别,那么并发事务的执行结果,必须等价为让这些事务以某种顺序串行执行的结果。事务的隔离性,是为了并发程序(客户端程序)正确性而生的一种编程抽象,可以类比多线程程序访问共享数据时候需要解决的竞争。在实际系统中,事务是由一系列读写操作组成的,原子的事务的中间状态是可能被并发的其他事务“观察”到的。而在一致性模型的讨论中,我们假设读写操作在服务端是“瞬时”完成的,也就是说,读写操作本身是原子的。客户端视角一致性模型在多副本的存储系统中,无论采用什么样的多副本同步协议,为了保证多个副本能够一致,本质上都要求做到:[*]同一份数据的所有副本,都能够接收到全部写操作(无论需要花费多久时间) [*]所有副本要以某种确定顺序执行这些写操作客户视角的一致性模型定义了下面4种不同的保证。[*]单调读。如果一个客户端读到了数据的某个版本n,那么之后它读到的版本必须大于等于n。 [*]读自己所写。如果一个客户端写了某个数据的版本n,那么它之后的读操作必须读到大于等于版本n的数据。 [*]单调写。单调写保证同一个客户端的两个不同写操作,在所有副本上都以他们到达存储系统的相同的顺序执行。单调写可以避免写操作被丢失。 [*]读后写。读后写一致性,保证一个客户端读到版本n数据后(可能是其他客户端写入的),随后的写操作必须要在版本号大于等于n的副本上执行。系统对外提供的不同的一致性级别,实际上提供了这其中某几个保证。不同的一致性级别,限定了系统允许的操作执行顺序,以及允许读到多旧的数据。为什么要定义不同的一致性级别呢?对用户来说,当然越严格的一致性越好,在异常和复杂场景下,严格的一致性级别可以极大地简化应用的复杂度。但是天下没有免费的午餐,一般来说,越严格的一致性模型,意味着性能(延迟)、可用性或者扩展性(能够提供服务的节点数)等要有所损失。CosmosDB 的一致性级别Azure Cosmos DB2是一个支持多地部署的分布式NoSQL数据库服务。它提供了丰富的可配置的一致性级别。以下五种一致性级别,从前向后可以提供更低的读写延迟,更高的可用性,更好的读扩展性。1.强一致性[*]保证读操作总是可以读到最新版本的数据(即可线性化) [*]写操作需要同步到多数派副本后才能成功提交。读操作需要多数派副本应答后才返回给客户端。读操作不会看到未提交的或者部分写操作的结果,并且总是可以读到最近的写操作的结果。 [*]保证了全局的(会话间)单调读,读自己所写,单调写,读后写 [*]读操作的代价比其他一致性级别都要高,读延迟最高2.有界旧一致性(bounded staleness)[*]保证读到的数据最多和最新版本差K个版本 [*]通过维护一个滑动窗口,在窗口之外,有界旧一致性保证了操作的全局序。此外,在一个地域内,保证了单调读。3.会话一致性[*]在一个会话内保证单调读,单调写,和读自己所写,会话之间不保证 [*]会话一致性能够提供把读写操作的版本信息维护在客户端会话中,在多个副本之间传递会话一致性的读写延迟都很低4.前缀一致性[*]前缀一致保证,在没有更多写操作的情况下,所有的副本最终会一致 [*]前缀一致保证,读操作不会看到乱序的写操作。例如,写操作执行的顺序是`A, B, C`,那么一个客户端只能看到`A`, `A, B`, 或者`A, B, C`,不会读到`A, C`,或者`B, A, C`等。 [*]在每个会话内保证了单调读5.最终一致性.[*]最终一致性保证,在没有更多写操作的情况下,所有的副本最终会一致 [*]最终一致性是很弱的一致性保证,客户端可以读到比之前发生的读更旧的数据 [*]最终一致性可以提供最低的读写延迟和最高的可用性,因为它可以选择读取任意一个副本Cosmos DB的文档中提到了一个有趣的数字。大约有73%的用户使用会话一致性级别,有20%的用户使用有界旧一致性级别。Cassandra的一致性级别Cassandra 是一个使用多数派协议的NoSQL存储系统,通过控制读写操作访问的副本数和副本的位置,可以实现不同的一致性级别。注意,作为NoSQL系统,Cassandra只提供单行操作的原子性,多行操作不是原子的。下面的读写操作,都是指单行操作。对于NoSQL系统,一般支持的写操作叫做PUT(有些系统叫做UPSERT)。这个语义,可以近似(在不考虑二级索引的时候)等价于关系数据库的INSERT ON DUPLICATE KEY UPDATE语句。本文前面所讲的“写操作”也是泛指这种语义。这个语义有什么特殊之处呢? 第一, 它是幂等的 。所以PUT操作可以重复执行,不怕消息重传。第二, 它是覆盖(overwrite)语义 。所以,NoSQL系统的最终一致性,允许对于同一行数据的写操作可以乱序,只要写操作不断,最终各个副本会一致。而关系数据库的insert和update等修改语句,内部实现都是即需要读也需要写。所以,关系数据库的多副本一致性,假设简单地把SQL修改语句同步到多个副本的方式来实现,必须要以相同的顺序执行才能保证结果一致(当然,实际系统不能这么实现)。写操作配置写操作一致性配置定义了对于写操作在哪些副本上成功之后,才能返回给客户端。[*]ALL: 写操作需要同步到所有副本并应用到内存中。提供了最强的一致性保证,但是单点故障会引起写入失败,造成系统不可用。 [*]EACH_QUORUM: 在每个机房(数据中心)中,写操作同步到多数派副本节点中。在多数据中心部署的集群中,可以在每个数据中心提供QUORUM一致性保证。 [*]QUORUM: 写操作同步到多数派副本节点中。当少数副本宕机的时候,写操作可以持续服务。 [*]LOCAL_QUORUM: 写操作必须同步到协调者节点所在数据中心的多数派副本中。这种模式可以避免多数据中心部署时,跨机房同步引起的高延迟。在单机房内,可以容忍少数派宕机。 [*]ONE: 写操作必须写入最少一个副本中。 [*]TWO: 写操作必须写入至少两个副本中。 [*]THREE: 写操作必须写入至少三个副本中。 [*]LOCAL_ONE: 写操作必须写入本地数据中心至少一个副本中。在多机房部署的集群中,可以达到和ONE相同的容灾效果,并且把写操作限制在本地机房。读操作配置[*]每个读操作可以设定如下不同的一致性配置。 [*]ALL: 读操作在全部副本节点应答后才返回给客户端。单点单机会引起写操作失败,造成系统不可用。 [*]QUORUM: 读操作在多数派副本返回应答后返回给客户端。 [*]LOCAL_QUORUM: 读操作在本机房多数派副本返回应答后返回给客户端。可以避免跨机房访问的高延迟。 [*]ONE: 最近的一个副本节点应答后即返回给客户端。可能返回旧数据。 [*]TWO: 两个副本节点应答后即返回给客户端。 [*]THREE: 三个副本节点应答后返回给客户端。 [*]LOCAL_ONE: 本机房最近的一个副本节点应答后返回客户端。系统一致性级别从系统层面来看,Cassandra提供了强一致性和最终一致性两种一致性级别。不考虑多机房因素,通过设置上述读写操作的一致性配置,当写入副本数与读取副本数之和大于总副本数的时候,可以保证读操作总是可以读取最新被写入的数据,即强一致性保证。如果写入副本数与读取副本数之和小于总副本数的时候,读操作可能无法读到最新的数据,而且读操作可能读到比之前发生的读操作更旧的数据,所以这种情况下是最终一致性。而副本位置是选择整个集群、每个机房还是本地机房等因素,是为了在不同的容灾场景下,对跨机房通讯引入的高延迟进行优化,固有的一致性级别并不受影响。例如,写操作用EACH_QUORUM,读操作用LOCAL_QUORUM,还是提供了强一致性保证,但是不同机房的读操作都变成本地的了,读延迟较低。但是,和写操作用QUORUM模式相比,某个机房发生了多数派宕机(总副本数还是少数派),就会导致写操作失败。再如,读写操作都用LOCAL_QUORUM,那么协调者节点所在机房内是强一致性的,与协调者节点不在一个机房的读操作则可能读到旧数据。本文转载自QceanBase 作者:竹翁
  • [介绍/入门] 分布式消息服务之AMQP快速入门之搭建开发环境——准备环境!
    本帖最后由 云彩飞扬 于 2018-3-23 14:36 编辑 开发环境Eclipse:Eclipse 3.6.0及以上版本,可至Eclipse官方网站下载。JDK:Java Development Kit 1.8.111及以上版本,可至Oracle官方下载页面下载。Maven:Apache Maven 3.0.3及以上版本。获取队列ID和消费组的ID使用SDK接口访问DMS服务,需要先创建队列和消费组,步骤如下:[*]登录管理控制台。 [*]单击“服务列表”,选择“应用服务 > 分布式消息服务”,进入分布式消息服务信息页面。 [*]单击左侧菜单栏的“队列管理”。 [*]在“队列管理”页面,单击页面上方的“创建队列”。 每个用户默认最多可以创建5个队列,您可以在“删除队列”按钮上面看到您还可以创建多少个队列。如果您想创建更多队列,请联系客服申请增加配额。 [*]填写队列名称和描述信息。 表1 参数说明 参数说明当前区域表示当前创建队列的区域。队列名称队列的名称,必须唯一。DMS为您自动生成了队列名称,您可以根据需要修改,队列名称只能包含a~z,A~Z,0-9,-,_,长度是[1,64]。创建队列后不能修改名称。队列类型选择“AMQP队列”。描述(可选)队列描述不能包含,长度是[0,160]。如图1所示。图1 创建AMQP队列 [*]单击“确定”。创建队列完成。 [*]单击队列名称,显示队列详情,获取队列ID,如图2所示。 图2 获取队列ID [*]单击“创建消费组”。进入“创建消费组”页面。 [*]填写消费组的名称。 DMS为您自动生成了消费组名称,您可以根据需要修改,消费组的名称只能包含a~z,A~Z,0~9,-,_,长度是[1,32]。同个队列的消费组名称不能重复。 [*]单击“确定”。创建消费组完成,获取消费组ID,如图3所示。 图3 获取消费组ID 获取project id在调用接口的时候,需要填入项目编号project_id,所以需要先在管理控制台上获取到项目编号,步骤如下:[*]注册并登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页面的“项目列表”中查看项目ID。 图4 获取项目ID 获取AK/SK[*]登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页,单击“管理访问密钥”页签。 [*]单击“新增访问密钥”,进入“新增访问密钥”页面。 [*]输入当前用户的登录密码。 [*]通过邮箱或者手机进行验证,输入对应的验证码。 [*]单击“确定”,下载访问密钥。 说明:为防止访问密钥泄露,建议您将其保存到安全的位置。 [*]保存文件到本地,从下载的credentials.csv文件中获取“Access Key Id”和“Secret Access Key”。获取区域和EndpointRegion域名端口号中国华北区1dms-amqp.cn-north-1.myhuaweicloud.com60020中国华东区2dms-amqp.cn-east-2.myhuaweicloud.com60020中国华南区1dms-amqp.cn-south-1.myhuaweicloud.com60020购买弹性云服务器[*]使用DMS AMQP SDK之前,需要购买弹性云服务器ECS,否则公网无法直接访问DMS,购买方法请参考“购买弹性云服务器”。 说明:弹性IP用于登录弹性云服务器,以及上传文件等。 [*]配置内网DNS。 说明:新创建的ECS不需要再配置DNS,如果使用已有的旧的ECS,则需要配置DNS的IP。华北区的DNS IP:100.125.1.250华东区的DNS IP:100.125.17.29华南区的DNS IP:100.125.1.250示例如下: 环境信息汇总表2 环境信息汇总 类型项目收集的信息(以下为示例,请根据实际情况替换)弹性云服务器弹性IP114.115.141.228用户名huaweicloud密码password分布式消息服务队列名称my-amqp-queue队列ID88d5e268-bb48-4dfe-9c8b-64a879aa6e28队列类型AMQP队列消费组名称my-amqp-group消费组IDg-fa621074-0302-4a8d-9953-565713286995访问密钥AK (Access Key Id)G6DNZF3TVBQIRENFOW4LSK (Secret Access Key)WoIgoldytZ5OWWTE7czQ7V5VNo57qKnFeVcRxP5P项目ID所属区域中国华北区1项目cn-north-1项目IDfdc60cfe407a4b2a96a498efda55c785区域和Endpoint区域名称中国华北区1Endpointdms-amqp.cn-north-1.myhuaweicloud.com端口号60020DNSDNS服务器IP华北:100.125.1.250华东:100.125.17.29华南:100.125.1.250
  • [介绍/入门] 分布式消息服务之AMQP快速入门之示例代码导读!
    DMSAmqpDemoClient示例代码中包含Sender和Receiver两个示例,Sender用于展示生产消息流程,Receiver用于展示消费和确认消息流程。生产消息[*]创建并启动Producer。 [code]ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup"); Destination queue = (Destination) context.lookup("myQueueLookup"); String projectId = (String) context.lookup("project"); String ak = (String) context.lookup("ak"); String sk = (String) context.lookup("sk"); Connection connection = factory.createConnection(projectId, ak + "\u0000" + sk); connection.setExceptionListener(new MyExceptionListener()); connection.start(); Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(queue);[/code] [*]构建要发送的消息并发送消息。 [code]Counter counter = new Counter(); for (int i = 1; i = count; i++) { TextMessage message = session.createTextMessage(s); messageProducer.send(message, new CompletionListener() { @Override public void onCompletion(Message message) { System.out.println("send successful"); if (counter.add() >= DEFAULT_COUNT) { System.exit(0); } } @Override public void onException(Message message, Exception e) { e.printStackTrace(); if (counter.add() >= DEFAULT_COUNT) { System.exit(0); } } }); if (i % 100 == 0) { System.out.println("Sent message " + i); } }[/code]3.消费消息[code]创建并启动消费实例。 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer messageConsumer = session.createConsumer(queue); 消费消息。 for (int i = 1; i = count; i++, actualCount++) { Message message = messageConsumer.receive(timeout); if (message == null) { System.out.println("Message " + i + " not received within timeout, stopping."); deductTimeout = true; break; } byte[] b = message.getBody(byte[].class); System.out.println("length of message is:" + b.length); System.out.println(new String(b)); System.out.println("Got message " + i); if (i % 100 == 0) { System.out.println("Got message " + i); } }[/code]
  • [介绍/入门] 分布式消息服务之AMQP快速入门之编译源码!
    [*]下载并解压DMS AMQP Demo示例工程代码。 [*]打开IDEA,通过“File -> New ->Project from Existing Sources…”菜单导入已存在的Maven工程,选择DmsAmqpDemoClient解压目录,导入Demo源代码。 [*]打开“File -> Project Structure”。 左侧选择Artifacts,新建,“JAR -> From modules with dependencies…” [*]Main Class选择“Sender”,单击“OK”。 [*]右侧勾选上“Build on make”。 [*]选择“Build -> Make Project” [*]构建输出位于DmsAmqpDemoClient工程的out\artifacts\DmsAmqpDemoClient_jar目录下,缺省文件名为DmsAmqpDemoClient.jar。 [*]使用DmsAmqpDemoClient.jar替换弹性云服务器DmsAmqpDemoClient/目录下的DmsAmqpDemoClient.jar文件,按照“运行示例工程”执行验证。
  • [介绍/入门] 分布式消息服务之AMQP快速入门环境准备!
    本帖最后由 云彩飞扬 于 2018-3-23 14:23 编辑 开发环境Eclipse:Eclipse 3.6.0及以上版本,可至Eclipse官方网站下载。JDK:Java Development Kit 1.8.111及以上版本,可至Oracle官方下载页面下载。Maven:Apache Maven 3.0.3及以上版本。创建消息队列通过浏览器登录华为云,在分布式消息服务控制台中创建队列,队列类型选择“AMQP队列”。请记录队列ID,后续访问需要使用。如果已创建过消息队列,可以跳过此步骤。创建消费组通过浏览器登录华为云,在分布式消息服务控制台中选择上文创建的消息队列,为该队列创建一个消费组。请记录消费组ID,后续访问需要使用。如果已为该消息队列创建过消费组,可以跳过此步骤。创建访问密钥通过浏览器登录华为云,选择“我的凭证”菜单,点击“管理访问密钥”标签,新增一组访问密钥,保存credentials.csv文件到本地。从credentials.csv文件中可以提取“Access Key Id”和“Secret Access Key”。如果之前已创建过访问密钥,可以跳过此步骤。获取项目ID通过浏览器登录华为云,选择“我的凭证”菜单,点击“项目列表”标签,根据所属区域记录对应的项目ID。获取区域和Endpoint Region域名端口号中国华北区1dms-amqp.cn-north-1.myhuaweicloud.com60020中国华东区2dms-amqp.cn-east-2.myhuaweicloud.com60020中国华南区1dms-amqp.cn-south-1.myhuaweicloud.com60020申请弹性云服务器通过浏览器登录华为云,在弹性云服务器控制台中申请创建一台Linux弹性云服务器,并绑定弹性IP。请记录弹性IP地址、用户名和密码,后续访问需要使用。如果已申请过华为云弹性云服务器,可以跳过此步骤。说明:弹性IP用于登录弹性云服务器,以及上传文件等。环境信息汇总表1 环境信息汇总 类型项目收集的信息(以下为示例,请根据实际情况替换)弹性云服务器弹性IP114.115.141.228用户名huaweicloud密码password分布式消息服务队列名称my-amqp-queue队列ID88d5e268-bb48-4dfe-9c8b-64a879aa6e28队列类型AMQP队列消费组名称my-amqp-group消费组IDg-fa621074-0302-4a8d-9953-565713286995访问密钥AK (Access Key Id)G6DNZF3TVBQIRENFOW4LSK (Secret Access Key)WoIgoldytZ5OWWTE7czQ7V5VNo57qKnFeVcRxP5P项目ID所属区域中国华北区1项目cn-north-1项目IDfdc60cfe407a4b2a96a498efda55c785区域和Endpoint区域名称中国华北区1Endpointdms-amqp.cn-north-1.myhuaweicloud.com端口号60020DNSDNS服务器IP华北:100.125.1.250华东:100.125.17.29华南:100.125.1.250
  • [介绍/入门] Kafka开发指南搭建开发环境之准备环境!
    本帖最后由 云彩飞扬 于 2018-3-21 15:02 编辑 开发环境Eclipse:Eclipse 3.6.0及以上版本,可至Eclipse官方网站下载。JDK:Java Development Kit 1.8.111及以上版本,可至Oracle官方下载页面下载。Maven:Apache Maven 3.0.3及以上版本。获取Kafka Topic和消费组的ID使用SDK接口访问DMS服务,需要先在Web Console创建队列和消费组,步骤如下:[*]登录管理控制台。 [*]单击“服务列表”,选择“应用服务 > 分布式消息服务”,进入分布式消息服务信息页面。 [*]单击左侧菜单栏的“队列管理”。 [*]在“队列管理”页面,单击页面上方的“创建队列”。 [*]填写队列名称和描述信息。 表1 参数说明 参数说明当前区域表示当前创建队列的区域。队列名称队列的名称,必须唯一。 DMS为您自动生成了队列名称,您可以根据需要修改,队列名称只能包含a~z,A~Z,0-9,-,_,长度是[1,64]。 创建队列后不能修改名称。队列类型选择“Kafka队列”。队列模式支持高吞吐和高可靠两种模式。 默认值:高吞吐。 高吞吐:消息副本异步落盘,具有较高的性能。 高可靠:消息多副本同步落盘,保证消息的可靠性。消息保留时长(小时)仅Kafka队列才有该参数。 指定kafka队列的消息保存时间,超过该时长的消息将会被删除,删除的消息无法被消费。 取值范围:1-72,必须为整数。 默认值:72小时。描述(可选)队列描述不能包含,长度是[0,160]。图1 创建Kafka队列 [*]单击“确定”。创建队列完成。 [*]单击队列名称,显示队列详情,获取Kafka Topic,如图2所示。 图2 获取Kafka Topic [*]单击“创建消费组”。进入“创建消费组”页面。 [*]填写消费组的名称。 DMS为您自动生成了消费组名称,您可以根据需要修改,消费组的名称只能包含a~z,A~Z,0~9,-,_,长度是[1,32]。同个队列的消费组名称不能重复。 [*]单击“确定”。创建消费组完成,选择已创建的消费组,获取消费组ID,如图3所示。 图3 获取消费组ID 获取project id在调用接口的时候,需要填入项目编号project_id,所以需要先在管理控制台上获取到项目编号,步骤如下:[*]注册并登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页面的“项目列表”中查看项目ID。 图4 获取项目ID 获取AK/SK[*]注册并登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页,单击“管理访问密钥”页签。 [*]单击“新增访问密钥”,进入“新增访问密钥”页面。 [*]输入当前用户的登录密码。 [*]通过邮箱或者手机进行验证,输入对应的验证码。 [*]单击“确定”,下载访问密钥。 说明:为防止访问密钥泄露,建议您将其保存到安全的位置。 [*]保存文件到本地,从下载的credentials.csv文件中获取“Access Key Id”和“Secret Access Key”。获取区域和EndpointRegion域名说明中国华北区1dms-kafka.cn-north-1.myhuaweicloud.com:37000在华为云(ECS)上搭建开发环境,使用该endpoint访问DMS服务。中国华东区2dms-kafka.cn-east-2.myhuaweicloud.com:37000中国华南区1dms-kafka.cn-south-1.myhuaweicloud.com:37000中国华北区1dms-kafka.cn-north-1.myhuaweicloud.com:37003在本地(公网)搭建开发环境,使用该endpoint访问DMS服务。环境信息汇总表2 环境信息汇总 类型项目收集的信息(以下为示例,请根据实际情况替换)弹性云服务器弹性IP114.115.141.228用户名huaweicloud密码password分布式消息服务队列名称my-kafka-queue队列ID4df89da6-ede4-4072-93e0-28dc6e866299队列类型Kafka队列Kafka Topick-bd67aaead60940d688b872c31bdc653b-4df89da6-ede4-4072-93e0-28dc6e866299消费组名称my-consumer-group消费组IDg-7ec0caac-01fb-4f91-a4f2-0a9dd48f8af7访问密钥AK (Access Key Id)VAODAIIJGPUAYTJRRLODSK (Secret Access Key)ZHN49c6bpwDiQvPqKJ5CxutJxqc04Glt9xSzxYWi项目ID所属区域中国华北区1项目cn-north-1项目IDbd67aaead60940d688b872c31bdc653b区域和Endpoint区域名称中国华北区1Endpointdms-kafka.cn-north-1.myhuaweicloud.com:37000DNSDNS服务器IP华北:100.125.1.250 华东:100.125.17.29 华南:100.125.1.250
  • [介绍/入门] 分布式消息服务之Kafka API快速入门编译示例源码
    本帖最后由 云彩飞扬 于 2018-3-20 10:42 编辑[*]下载并解压DmsKafkaDemo示例工程代码。 [*]打开Eclipse,通过“File -> Import…”,“Select an import source”选择“Exiting Projects Into Workspace”,选择DmsKafkaDemo解压目录,导入示例工程代码。 [*]选择“Project -> Build Project”,执行编译构建。 [*]鼠标右键单击DmsKafkaDemo项目,在弹出的上下文菜单中选择“Export…”,选择“Java -> JAR file”,填写待生成的JAR文件保存位置和名称,导出JAR文件。 [*]使用新生成的JAR文件替换弹性云服务器DmsKafkaDemo/dist/libs目录下的dms.kafka.demo.jar文件,按照“运行示例工程”执行验证。
  • [介绍/入门] 分布式消息服务之Kafka API快速入门运行示例工程!
    本帖最后由 云彩飞扬 于 2018-3-20 10:39 编辑[*]登录弹性云服务器。说明:用户可以直接在192网段的ECS虚拟机上运行。 [*]安装Java JDK或JRE,并配置JAVA_HOME与PATH环境变量,使用执行用户在用户家目录下修改.bash_profile,添加如下行。 export JAVA_HOME=/opt/java/jdk1.8.0_151export PATH=$JAVA_HOME/bin:$PATH执行source .bash_profile命令使修改生效。 说明:ECS虚拟机默认自带的JDK可能不符合要求,例如OpenJDK,需要配置为Oracle的JDK,可至Oracle官方下载页面下载Java Development Kit 1.8.111及以上版本。 [*]使用root用户编辑/etc/resolv.conf文件,配置DNS服务器地址。 在第一行增加如下:nameserver 100.125.1.250 [*]下载DmsKafkaDemo示例工程代码。 [*]解压DmsKafkaDemo.zip压缩包。 $ unzip DmsKafkaDemo.zip [*]进入DmsKafkaDemo/dist目录,该目录下包含预编译好的二进制文件和执行脚本。 $ cd DmsKafkaDemo/dist [*]编辑配置文件config/dms_kafka_client_jaas.conf,设置access_key、secret_key和project_id。 $ vim config/dms_kafka_client_jaas.conf设置内容如下(其中标红内容需要替换为实际值):KafkaClient { com.huawei.middleware.kafka.sasl.client.KafkaLoginModule required access_key=VAODAIIJGPUAYTJRRLOD secret_key=ZHN49c6bpwDiQvPqKJ5CxutJxqc04Glt9xSzxYWi project_id=bd67aaead60940d688b872c31bdc653b;}; [*]编辑配置文件config/producer.properties,设置topic和bootstrap.servers。 $ vim config/producer.properties设置内容如下(其中标红内容需要替换为实际值):topic=k-bd67aaead60940d688b872c31bdc653b-4df89da6-ede4-4072-93e0-28dc6e866299bootstrap.servers=dms-kafka.cn-north-1.myhuaweicloud.com:37000ssl.truststore.password=dms@kafkaacks=allretries=1batch.size=16384buffer.memory=33554432key.serializer=org.apache.kafka.common.serialization.StringSerializervalue.serializer=org.apache.kafka.common.serialization.StringSerializersecurity.protocol=SASL_SSLsasl.mechanism=DMS [*]编辑配置文件config/consumer.properties,设置topic、bootstrap.servers和group.id。 $ vim config/consumer.properties设置内容如下(其中标红内容需要替换为实际值):topic=k-bd67aaead60940d688b872c31bdc653b-4df89da6-ede4-4072-93e0-28dc6e866299bootstrap.servers=dms-kafka.cn-north-1.myhuaweicloud.com:37000group.id=g-7ec0caac-01fb-4f91-a4f2-0a9dd48f8af7ssl.truststore.password=dms@kafkasecurity.protocol=SASL_SSLsasl.mechanism=DMSkey.deserializer=org.apache.kafka.common.serialization.StringDeserializervalue.deserializer=org.apache.kafka.common.serialization.StringDeserializerauto.offset.reset=earliestenable.auto.commit=false [*]运行生产消息示例。 $ bash produce.sh [*]运行消费消息示例。 $ bash consume.sh
  • [介绍/入门] 分布式消息服务之Kafka API快速入门环境准备
    本帖最后由 云彩飞扬 于 2018-3-20 10:22 编辑 开发环境Eclipse:Eclipse 3.6.0及以上版本,可至Eclipse官方网站下载。JDK:Java Development Kit 1.8.111及以上版本,可至Oracle官方下载页面下载。Maven:Apache Maven 3.0.3及以上版本。创建Kafka队列通过浏览器登录华为云,在分布式消息服务控制台中创建队列,队列类型选择“Kafka队列”。请记录Kafka Topic ID,后续访问需要使用。如果已创建过Kafka队列,可以跳过此步骤。创建消费组通过浏览器登录华为云,在分布式消息服务控制台中选择上文创建的Kafka队列,为该队列创建一个消费组。请记录消费组ID,后续访问需要使用。如果已为该Kafka队列创建过消费组,可以跳过此步骤。创建访问密钥通过浏览器登录华为云,选择“我的凭证”菜单,单击“管理访问密钥”标签,新增一组访问密钥,保存credentials.csv文件到本地。从credentials.csv文件中可以提取“Access Key Id”和“Secret Access Key”。如果之前已创建过访问密钥,可以跳过此步骤。获取项目ID通过浏览器登录华为云,选择“我的凭证”菜单,单击“项目列表”标签,根据所属区域记录对应的项目ID。获取区域和EndpointRegion域名说明中国华北区1dms-kafka.cn-north-1.myhuaweicloud.com:37000在华为云(ECS)上运行Demo示例,使用该endpoint访问DMS服务。中国华东区2dms-kafka.cn-east-2.myhuaweicloud.com:37000中国华南区1dms-kafka.cn-south-1.myhuaweicloud.com:37000中国华北区1dms-kafka.cn-north-1.myhuaweicloud.com:37003在本地(公网)运行Demo示例,使用该endpoint访问DMS服务。申请弹性云服务器说明:在华为云(ECS)上运行DMS Demo示例,需要先申请弹性云服务器。 通过浏览器登录华为云,在弹性云服务器控制台中申请创建一台Linux弹性云服务器,并绑定弹性IP。请记录弹性IP地址、用户名和密码,后续访问需要使用。如果已申请过华为云弹性云服务器,可以跳过此步骤。说明:弹性IP用于登录弹性云服务器,以及上传文件等。 环境信息汇总表1 环境信息汇总类型项目收集的信息(以下为示例,请根据实际情况替换)弹性云服务器弹性IP114.115.141.228用户名huaweicloud密码password分布式消息服务队列名称my-kafka-queue队列ID4df89da6-ede4-4072-93e0-28dc6e866299队列类型Kafka队列Kafka Topick-bd67aaead60940d688b872c31bdc653b-4df89da6-ede4-4072-93e0-28dc6e866299消费组名称my-consumer-group消费组IDg-7ec0caac-01fb-4f91-a4f2-0a9dd48f8af7访问密钥AK (Access Key Id)VAODAIIJGPUAYTJRRLODSK (Secret Access Key)ZHN49c6bpwDiQvPqKJ5CxutJxqc04Glt9xSzxYWi项目ID所属区域中国华北区1项目cn-north-1项目IDbd67aaead60940d688b872c31bdc653b区域和Endpoint区域名称中国华北区1Endpointdms-kafka.cn-north-1.myhuaweicloud.comDNSDNS服务器IP华北:100.125.1.250华东:100.125.17.29华南:100.125.1.250
  • [介绍/入门] 分布式消息服务之Kafka开发指南概述
    Kafka API介绍DMS支持开源的Kafka接口,第三方应用程序直接使用原生Kafka client来接入DMS即可实现开源Kafka的消息处理能力。使用约束DMS Kafka一般可达到几千TPS(即每秒可处理的消息数),如果需要上万甚至10万TPS,请单独提交工单或联系客服进行特殊处理。Kafka client推荐使用0.10.2.1版本。使用Kafka SDK接口生产消息时,单条消息最大限制为10MB。使用WebConsole生产消息到Kafka队列时,最大限制依然是512KB。
  • [介绍/入门] 分布式消息服务之TCP API配置说明!
    [*](可选)配置DNS。公网无法直接访问DMS,必须要先创建ECS,在ECS上才可以访问DMS。新创建的ECS不需要再配置DNS,如果使用已有的ECS需要配置DNS。[*]华北区的DNS IP:100.125.1.250 [*]华东区的DNS IP:100.125.17.29 [*]华南区的DNS IP:100.125.1.250 [*]参考表1的配置示例的配置项。表1 dms.client.properties参数说明 参数说明dms.server.ipDMS服务端的地址,配置为IP或者域名。华北区域名:dms-tcp.cn-north-1.myhuaweicloud.com华东区域名:dms-tcp.cn-east-2.myhuaweicloud.com华南区域名:dms-tcp.cn-south-1.myhuaweicloud.comdms.server.portDMS服务TCP端口,配置为60010。dms.client.blocked.worker.num执行阻塞callback的线程数,默认为-1,小于0则默认使用CPU核数两倍。dms.client.conn.timeout连接超时时间,单位为毫秒,默认6000dms.client.reconn.attempt.times连接重试次数,默认3次。dms.client.reconn.attempt.interval连接重试间隔,单位为毫秒,默认3000。dms.client.request.timeout请求超时时间,单位为毫秒,默认60000。dms.client.start.timeout启动超时时间,单位为毫秒,默认60000。dms.client.project.idproject id,获取方法参见获取project id。dms.client.access.keyaccess key,获取方法参见获取AK/SK。dms.client.secret.keysecret key,获取方法参见获取AK/SK。[*]开始编写代码,API接口请参考获取SDK中的dms.sdk.api.chm文档。
  • [介绍/入门] 分布式消息服务之TCP API创建工程!
    本章节以新建名为“tcpdemo”的Maven Project为例。操作步骤[*]打开Eclipse,建议使用4.6以上版本,新建一个Maven Project,工程名自定义,这里以tcpdemo为例。[*]单击“Finish”。 [*]导入DMS TCP SDK的jar包。 [list=a] [*]右键单击新建的工程“tcpdemo”,新建一个Folder,命名为libs。 [*]将dms.sdk-1.0.0.jar和dms.protocol-1.0.0.jar复制到libs目录下。 [*]在pom.xml文件中增加如下行,将DMS TCP SDK的jar包导入Maven仓库。 com.huawei.middleware.dms dms.protocol 1.0.0 jar system ${basedir}/libs/dms.protocol-1.0.0.jar com.huawei.middleware.dms dms.sdk 1.0.0 jar system ${basedir}/libs/dms.sdk-1.0.0.jar [*]保存“pom.xml”。 [*]如果没有自动导入第三方依赖包,请参考“DmsTcpDemo示例”将third_lib.zip中的包导入Maven仓库。
  • [介绍/入门] 分布式消息服务之TCP API环境准备!
    本帖最后由 云彩飞扬 于 2018-3-19 14:47 编辑 开发环境Eclipse:Eclipse 3.6.0及以上版本,可至Eclipse官方网站下载。JDK:Java Development Kit 1.8.111及以上版本,可至Oracle官方下载页面下载。Maven:Apache Maven 3.0.3及以上版本。获取队列ID和消费组的ID使用SDK接口访问DMS服务,需要先创建队列和消费组,步骤如下:[*]登录管理控制台。 [*]单击“服务列表”,选择“应用服务 > 分布式消息服务”,进入分布式消息服务信息页面。 [*]单击左侧菜单栏的“队列管理”。 [*]在“队列管理”页面,单击页面上方的“创建队列”。 每个用户默认最多可以创建5个队列,您可以在“删除队列”按钮上面看到您还可以创建多少个队列。如果您想创建更多队列,请联系客服申请增加配额。 [*]填写队列名称和描述信息。 表1 参数说明参数说明当前区域表示当前创建队列的区域。队列名称队列的名称,必须唯一。DMS为您自动生成了队列名称,您可以根据需要修改,队列名称只能包含a~z,A~Z,0-9,-,_,长度是[1,64]。创建队列后不能修改名称。队列类型[*]普通队列:包括分区有序和全局有序 [*]AMQP队列:使用AMQP协议的队列。Advanced Message Queuing Protocol,是统一消息服务的应用层标准的高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 [*]Kafka队列:支持使用开源kafka客户端进行生产消息和消费消息,支持高吞吐和高可靠两种模式。队列模式队列类型为普通队列时,队列模式取值范围: [*]分区有序:的普通队列具有更高的并发性能,不保证先入先出(FIFO)的严格顺序。 [*]全局有序:的普通队列保证消息先入先出(FIFO)的严格顺序。 队列类型为Kafka队列时,队列模式取值范围: [*]高吞吐:消息副本异步落盘,具有较高的性能 [*]高可靠:消息多副本同步落盘,保证消息的可靠性。是否开启死信仅队列类型为普通队列时,才有该参数。是否开启死信消息,死信消息是指无法被正常消费的消息。当达到最大消费次数仍然消费失败后,DMS会将该条消息转存到死信队列中,有效期为72小时,用户可以根据需要对死信消息进行重新消费。消费死信消息时,只能消费该消费组产生的死信消息。全局有序的队列的死信消息依然按照先入先出(FIFO)的顺序存储在死信队列中。默认值:关闭。消息保留时长(小时)仅Kafka队列才有该参数。指定kafka队列的消息保存时间,超过该时长的消息将会被删除,删除的消息无法被消费。取值范围:1-72,必须为整数。默认值:72小时。最大消费次数仅开启死信时,才有该参数。消息进入死信队列前可重复接收次数。取值范围:1~100默认值:3描述(可选)队列描述不能包含,长度是[0,160]。图1 创建队列[*]单击“确定”。创建队列完成。 [*]单击队列名称,显示队列详情,获取队列ID,如图2所示。 图2 获取队列ID [*]单击“创建消费组”。进入“创建消费组”页面。 [*]填写消费组的名称。 DMS为您自动生成了消费组名称,您可以根据需要修改,消费组的名称只能包含a~z,A~Z,0~9,-,_,长度是[1,32]。同个队列的消费组名称不能重复。 [*]单击“确定”。创建消费组完成,获取消费组ID,如图3所示。 图3 获取消费组ID 获取project id在调用接口的时候,需要填入项目编号project_id,所以需要先在管理控制台上获取到项目编号,步骤如下:[*]注册并登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页面的“项目列表”中查看项目ID。 图4 获取项目ID 获取AK/SK[*]登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页,单击“管理访问密钥”页签。 [*]单击“新增访问密钥”,进入“新增访问密钥”页面。 [*]输入当前用户的登录密码。 [*]通过邮箱或者手机进行验证,输入对应的验证码。 [*]单击“确定”,下载访问密钥。 说明:为防止访问密钥泄露,建议您将其保存到安全的位置。 [*]保存文件到本地,从下载的credentials.csv文件中获取“Access Key Id”和“Secret Access Key”。 获取区域和Endpoint Region域名端口号中国华北区1dms-tcp.cn-north-1.myhuaweicloud.com60010中国华东区2dms-tcp.cn-east-2.myhuaweicloud.com60010中国华南区1dms-tcp.cn-south-1.myhuaweicloud.com60010购买弹性云服务器使用DMS TCP SDK之前,需要购买弹性云服务器ECS,否则公网无法直接访问DMS,购买方法请参考“购买弹性云服务器”。说明:弹性IP用于登录弹性云服务器,以及上传文件等。配置内网DNS。说明:新创建的ECS不需要再配置DNS,如果使用已有的旧的ECS,则需要配置DNS的IP。华北区的DNS IP:100.125.1.250华东区的DNS IP:100.125.17.29华南区的DNS IP:100.125.1.250示例如下:环境信息汇总表2 环境信息汇总类型项目收集的信息(以下为示例,请根据实际情况替换)弹性云服务器弹性IP114.115.141.228用户名huaweicloud密码password分布式消息服务队列名称my-tcp-queue队列ID5964181e-b67e-4d35-9281-a58c352abda6队列类型普通队列消费组名称my-tcp-group消费组IDg-c861aa48-a082-48ff-bc9d-ff36fe7aed38访问密钥AK (Access Key Id)VAODAIIJGPUAYTJRRLODSK (Secret Access Key)ZHN49c6bpwDiQvPqKJ5CxutJxqc04Glt9xSzxYWi项目ID所属区域中国华北区1项目cn-north-1项目IDbd67aaead60940d688b872c31bdc663b区域和Endpoint区域名称中国华北区1Endpointdms-tcp.cn-north-1.myhuaweicloud.com端口号60010DNSDNS服务器IP华北:100.125.1.250华东:100.125.17.29华南:100.125.1.250
  • [下午茶时光] 【Day 37--2018/3/16】PB级分布式存储“Ceph”的这些事儿
    本帖最后由 KING 于 2018-3-16 15:20 编辑12481 【下午茶时光——业界热点陪你喝咖啡】 PB级分布式存储“Ceph”的这些事儿 最近关于区块链用于存储应用的话题愈演愈烈,其实一定要清楚存储和存证的关系,简而言之区块链适合做存储的存证,并不适合做分布式的存储用,为了搞清楚这个问题,今天我们来看看一个分布式存储的代表Ceph是什么样子的,也就说明了区块链技术是否适合于作为存储出现。 Ceph是加州大学SantaCruz分校的Sage Weil(DreamHost的联合创始人)专为博士论文设计的新一代自由软件分布式文件系统。自2007年毕业之后,Sage开始全职投入到Ceph开 发之中,使其能适用于生产环境。Ceph的主要目标是设计成基于POSIX的没有单点故障的分布式文件系统,使数据能容错和无缝的复制。 12482 Ceph设计目标 开发一个分布式文件系统需要多方努力,但是如果能准确地解决问题,它就是无价的。 Ceph 的目标简单地定义为: 可轻松扩展到数 PB 容量、对多种工作负载的高性能(每秒输入/输出操作[IOPS]和带宽)、高可靠性不幸的是,这些目标之间会互相竞争(例如,可扩展性会降低或者抑制性能或者影响可靠性)。Ceph开发了一些非常有趣的概念(例如,动态元数据分区,数据分布和复制),这些概念在本文中只进行简短地探讨。Ceph的设计还包括保护单一点故障的容错功能,它假设大规模(PB 级存储)存储故障是常见现象而不是例外情况。最后,它的设计并没有假设某种特殊工作负载,但是包括适应变化的工作负载,提供最佳性能的能力。它利用POSIX 的兼容性完成所有这些任务,允许它对当前依赖 POSIX 语义(通过以 Ceph 为目标的改进)的应用进行透明的部署。最后,Ceph 是开源分布式存储,也是主线 Linux 内核(2.6.34)的一部分。 Ceph 架构 现在,让我们探讨一下Ceph 的架构以及高端的核心要素。然后我会拓展到另一层次,说明Ceph 中一些关键的方面,提供更详细的探讨。Ceph 生态系统可以大致划分为四部分(见图 1):客户端(数据用户),元数据服务器(缓存和同步分布式元数据),一个对象存储集群(将数据和元数据作为对象存储,执行其他关键职能),以及最后的集群监视器(执行监视功能)。 图 1. Ceph 生态系统的概念架构 12483 如图 1 所示,客户使用元数据服务器,执行元数据操作(来确定数据位置)。元数据服务器管理数据位置,以及在何处存储新数据。值得注意的是,元数据存储在一个存储集群(标为 “元数据 I/O”)。实际的文件 I/O 发生在客户和对象存储集群之间。这样一来,更高层次的 POSIX 功能(例如,打开、关闭、重命名)就由元数据服务器管理,不过 POSIX 功能(例如读和写)则直接由对象存储集群管理。 另一个架构视图由图 2 提供。一系列服务器通过一个客户界面访问 Ceph 生态系统,这就明白了元数据服务器和对象级存储器之间的关系。分布式存储系统可以在一些层中查看,包括一个存储设备的格式(Extentand B-tree-based Object File System [EBOFS] 或者一个备选),还有一个设计用于管理数据复制,故障检测,恢复,以及随后的数据迁移的覆盖管理层,叫做Reliable Autonomic Distributed Object Storage(RADOS)。最后,监视器用于识别组件故障,包括随后的通知。 图 2. Ceph 生态系统简化后的分层视图12486 Ceph 组件 了解了 Ceph 的概念架构之后,您可以挖掘到另一个层次,了解在 Ceph 中实现的主要组件。Ceph和传统的文件系统之间的重要差异之一就是,它将智能都用在了生态环境而不是文件系统本身。 图 3 显示了一个简单的 Ceph 生态系统。Ceph Client 是Ceph 文件系统的用户。Ceph Metadata Daemon 提供了元数据服务器,而 Ceph Object StorageDaemon 提供了实际存储(对数据和元数据两者)。最后,CephMonitor 提供了集群管理。要注意的是,Ceph 客户,对象存储端点,元数据服务器(根据文件系统的容量)可以有许多,而且至少有一对冗余的监视器。那么,这个文件系统是如何分布的呢? 图 3. 简单的 Ceph 生态系统12488 Ceph 客户端 因为 Linux 显示文件系统的一个公共界面(通过虚拟文件系统交换机 [VFS]),Ceph的用户透视图就是透明的。管理员的透视图肯定是不同的,考虑到很多服务器会包含存储系统这一潜在因素(要查看更多创建 Ceph 集群的信息,见 参考资料 部分)。从用户的角度看,他们访问大容量的存储系统,却不知道下面聚合成一个大容量的存储池的元数据服务器,监视器,还有独立的对象存储设备。用户只是简单地看到一个安装点,在这点上可以执行标准文件I/O。 Ceph 文件系统 — 或者至少是客户端接口 — 在 Linux 内核中实现。值得注意的是,在大多数文件系统中,所有的控制和智能在内核的文件系统源本身中执行。但是,在Ceph 中,文件系统的智能分布在节点上,这简化了客户端接口,并为Ceph 提供了大规模(甚至动态)扩展能力。 Ceph 使用一个有趣的备选,而不是依赖分配列表(将磁盘上的块映射到指定文件的元数据)。Linux 透视图中的一个文件会分配到一个来自元数据服务器的 inode number(INO),对于文件这是一个唯一的标识符。然后文件被推入一些对象中(根据文件的大小)。使用 INO 和object number(ONO),每个对象都分配到一个对象ID(OID)。在 OID 上使用一个简单的哈希,每个对象都被分配到一个放置组。放置组(标识为 PGID)是一个对象的概念容器。最后,放置组到对象存储设备的映射是一个伪随机映射,使用一个叫做Controlled Replication Under Scalable Hashing(CRUSH)的算法。这样一来,放置组(以及副本)到存储设备的映射就不用依赖任何元数据,而是依赖一个伪随机的映射函数。这种操作是理想的,因为它把存储的开销最小化,简化了分配和数据查询。分配的最后组件是集群映射。集群映射 是设备的有效表示,显示了存储集群。有了PGID 和集群映射,您就可以定位任何对象。Ceph 元数据服务器 元数据服务器(cmds)的工作就是管理文件系统的名称空间。虽然元数据和数据两者都存储在对象存储集群,但两者分别管理,支持可扩展性。事实上,元数据在一个元数据服务器集群上被进一步拆分,元数据服务器能够自适应地复制和分配名称空间,避免出现热点。如图4 所示,元数据服务器管理名称空间部分,可以(为冗余和性能)进行重叠。元数据服务器到名称空间的映射在Ceph 中使用动态子树逻辑分区执行,它允许 Ceph 对变化的工作负载进行调整(在元数据服务器之间迁移名称空间)同时保留性能的位置。 图 4. 元数据服务器的 Ceph 名称空间的分区12492 但是因为每个元数据服务器只是简单地管理客户端人口的名称空间,它的主要应用就是一个智能元数据缓存(因为实际的元数据最终存储在对象存储集群中)。进行写操作的元数据被缓存在一个短期的日志中,它最终还是被推入物理存储器中。这个动作允许元数据服务器将最近的元数据回馈给客户(这在元数据操作中很常见)。这个日志对故障恢复也很有用:如果元数据服务器发生故障,它的日志就会被重放,保证元数据安全存储在磁盘上。元数据服务器管理inode 空间,将文件名转变为元数据。元数据服务器将文件名转变为索引节点,文件大小,和Ceph 客户端用于文件 I/O 的分段数据。 Ceph 监视器 Ceph 包含实施集群映射管理的监视器,但是故障管理的一些要素是在对象存储本身中执行的。当对象存储设备发生故障或者新设备添加时,监视器就检测和维护一个有效的集群映射。这个功能按一种分布的方式执行,这种方式中映射升级可以和当前的流量通信。Ceph使用 Paxos,它是一系列分布式共识算法。 Ceph 对象存储 和传统的对象存储类似,Ceph存储节点不仅包括存储,还包括智能。传统的驱动是只响应来自启动者的命令的简单目标。但是对象存储设备是智能设备,它能作为目标和启动者,支持与其他对象存储设备的通信和合作。 从存储角度来看,Ceph 对象存储设备执行从对象到块的映射(在客户端的文件系统层中常常执行的任务)。这个动作允许本地实体以最佳方式决定怎样存储一个对象。Ceph的早期版本在一个名为 EBOFS 的本地存储器上实现一个自定义低级文件系统。这个系统实现一个到底层存储的非标准接口,这个底层存储已针对对象语义和其他特性(例如对磁盘提交的异步通知)调优。今天,B-tree文件系统(BTRFS)可以被用于存储节点,它已经实现了部分必要功能(例如嵌入式完整性)。因为 Ceph 客户实现 CRUSH,而且对磁盘上的文件映射块一无所知,下面的存储设备就能安全地管理对象到块的映射。这允许存储节点复制数据(当发现一个设备出现故障时)。分配故障恢复也允许存储系统扩展,因为故障检测和恢复跨生态系统分配。Ceph称其为 RADOS(见 图 3)。其他分布式文件系统 Ceph 在分布式文件系统空间中并不是唯一的,但它在管理大容量存储生态环境的方法上是独一无二的。分布式文件系统的其他例子包括Google File System(GFS),General Parallel File System(GPFS),还有 Lustre,这只提到了一部分。Ceph背后的想法为分布式文件系统提供了一个有趣的未来,因为海量级别存储导致了海量存储问题的唯一挑战。 本文作者:IBM,文章转自区块链大师
  • [介绍/入门] 分布式消息服务之TCP API示例工程代码导读
    本帖最后由 云彩飞扬 于 2018-3-16 11:55 编辑 DMS TCP Demo示例工程中包含DmsProducerDemo和DmsConsumerDemo两个示例,DmsProducerDemo用于展示生产消息流程,DmsConsumerDemo用于展示消费和确认消息流程。生产消息[*]创建并启动DmsProducer。 DmsProducer producer = new DmsProducerImpl();producer.start(); [*]构建要发送的消息内容。 List messages = new ArrayList();final int messageNum = 10;for (int i = 0; i messageNum; i++){ DmsMessage record = new DmsMessage(); record.setBody(("Hello DMS syn produce: " + i).getBytes()); messages.add(record);} [*]发送消息。 try{ List result = producer.produce(queueId, messages); result.forEach(r -> { System.out.println(r.getState()); });}catch (Throwable t){ t.printStackTrace();} [*]停止生产。 producer.stop();消费消息[*]创建并启动消费实例。 DmsConsumer consumer = new DmsConsumerImpl();consumer.start(); [*]消费消息。 List records = consumer.consume(queueId, groupId); [*]构建确认请求。 DmsCommitRequest commitRequest = new DmsCommitRequest();List messages = new ArrayList();for (DmsConsumeResult record : records){ System.out.println(record.getHandler()); DmsCommitItem commitItem = new DmsCommitItem(); //确认时需要回填对应消息handler commitItem.setHandler(record.getHandler()); //设置消息处理状态: true or false commitItem.setStatus(true); messages.add(commitItem);}//一次可确认多条消息commitRequest.setMessage(messages); [*]确认消息。 DmsCommitResult commitResult = consumer.commit(queueId, groupId, commitRequest); [*]停止消费。 consumer.stop();
总条数:521 到第 页
上滑加载中