转载:http://www.csdn.net/article/2015-01-28/2823739/2

摘要:Etcd是CoreOS生态系统中处于连接各个节点通信和支撑集群服务协同运作的核心地位的模块,本文将主要介绍Etcd的RESTful API。如果说Etcd是CoreOS分布式架构的基石,Etcd的RESTful API就是架在这基石上的顶梁立柱。

Etcd的启动配置

Etcd的配置一般通过cloud-init在系统启动时就进行设定,具体设定方法与使用的平台有关。比如AWS、GCE这些会在启动Instance时有一步配置cloud-config里面。对于Vagrant启动的虚拟机,这个配置就是我们之前修改过的user-data文件。默认时候这个配置大致是这个样子的:

$ cat user-data                                           ...                                           etcd:                                           discovery:                                         https://discovery.etcd.io/09363c5fcdfcbd42ed60b8931263fda1  addr: $public_ipv4:4001                                           peer-addr: $public_ipv4:7001                                           ...

如何知道有哪些可用的配置参数呢?首先,通过 etcd -h 命令能够打印出所有Etcd启动时接收的参数项,将这些参数最开头的横杆去掉,并用冒号连接参数与值,写入                                             user-data文件后面,例如指定节点名称的参数是“-name=刘备”,写到                                                 user-data 文件里面就成了“name: 刘备”。Etcd的文档中也有针对特定情况应该采用的配置,限于篇幅,不展开说了。

怎样在运行期动态修改这些配置哩?额,其实大部分是不可以修改的。并且这部分的API在V0.4到V2.0的升级是不兼容的。下面是V0.4.x版本中与集群成员配置相关的Etcd键,注意这里使用的是7001端口,也就说这些API最初是设计给Etcd服务之间通信使用的。通过PUT操作修改相应键的值就能动态的对这些配置进行修改。

core@core-01 ~ $ curl -L                                             http://127.0.0.1:7001/v2/admin/config{                                               "activeSize": 9,                                               "removeDelay": 1800,                                               "syncInterval": 5                                             }                                             core@core-01 ~ $ curl -L                                             http://127.0.0.1:7001/v2/admin/machines[                                               {                                               "name": "0acdd9bf38194ea5ad1611ff9a4236f1",                                               "state": "leader",                                               "clientURL": "http://172.17.8.103:4001",                                               "peerURL": "http://172.17.8.103:7001"                                               },                                               {                                               "name": "f2558aaa231044f3abbe01510ac2b1d8",                                               "state": "follower",                                               "clientURL": "http://172.17.8.101:4001",                                               "peerURL": "http://172.17.8.101:7001"                                               },                                               {                                               "name": "f260afd8224c4854bdf8427d8451da23",                                               "state": "follower",                                               "clientURL": "http://172.17.8.102:4001",                                               "peerURL": "http://172.17.8.102:7001"                                               }                                             ]

这些API在V2.0修改到了2379端口下的/v2/members路径下,结构也不太一样了,参见                                                 官方文档

小技巧

  • 隐藏数据节点

在Etcd的存储系统中,所有以下划线开头的目录都被认为是“隐藏目录”。这种目录是不能通过 etcdctl ls 命令或                                                 HTTP GET访问其上级目录列出来的。而知道路径的准确名称的用户可以通过的完整路径以处理普通数据一样的方式对隐藏目录下的数据节点进行增删查改。

core@core-01 ~ $ curl -L                                                          http://127.0.0.1:4001/v2/keys/App/_message-XPUT -d value="Hello hidden        world" {                                                   "action":"set",                                                   "node": {                                                   "key":"/App/_message",                                                   "value":"Hello hidden world",                                                   "modifiedIndex":321911,                                                   "createdIndex":321911                                                   }                                                 }

然后直接使用GET访问 /App 目录看到的是一个空目录,但显示的获取                                                     /App/_message数据节点,却能发现这个键是确实存在的。也就是说,隐藏的目录或键不会被列出,只有知道完整路径的用户可以直接访问到。

core@core-01 ~ $ curl -L                                                     http://127.0.0.1:4001/v2/keys/App/{                                                       "action":"get",                                                       "node":{                                                       "key":"/App",  <-- 没有 node.nodes 数据                                                       "dir":true,                                                       "modifiedIndex":219320,                                                       "createdIndex":219320                                                       }                                                     }                                                     core@core-01 ~ $ curl -L                                                     http://127.0.0.1:4001/v2/keys/App/_message{                                                       "action": "get",                                                       "node": {                                                       "key": "/App/_message",                                                       "value": "Hello hidden world",                                                       "modifiedIndex": 219320,                                                       "createdIndex": 219320                                                       }                                                     }

在 v0.4 的API中,有一个存放了集群节点信息的隐藏键,可以通过curl -L     http://127.0.0.1:4001/v2/keys/_etcd命令查看到,这个键在                                                     V2.0 中合并到 /v2/member 中成为非隐藏的普通键了。

  • Json格式化

在控制台输出的Json内容难以直接阅读的,相关的格式化方法很多,这里推荐一个控制台下的开源工具软件jq,下载地址是:http://stedolan.github.io/jq/download/。它其实是一个Json数据的处理器,使用C语言编写,支持Windows、Linux、Mac等平台,使用起来十分方便。格式化Json数据可参考下面的例子,对于更完整的使用方法,请参考jq的官方文档。

wget                                                         http://stedolan.github.io/jq/download/linux64/jqchmod +x jq                                                         curl -L                                                         http://127.0.0.1:4001/v2/keys/coreos.com?recursive=true| ./jq '.'

小结

作为CoreOS最核心的服务,Etcd主要的功劳在于设计了一种简便、高效、可靠的集群应用程序配置共享的解决方案,并提供了编程语言无关RESTful                                                            API。围绕着这个悍将,CoreOS实现了集群的自组建(Discovery)、服务的跨节点调度(Fleet)、有序的集群重启(Locksmith)等许多分布式服务,极大的简化了集群的操作。同时由于Raft算法通过平等投票方式选择Leader节点,使用Etcd组成的网络具有一种高度扁平的系统结构,减少了层级带来的集群繁琐管理和资源浪费。扁平化的组织,不论是管人还是管机器,都真心好使,这是题外话。

这个系列写到这里,如果有人再要问我,CoreOS到底牛B在什么地方。我想在设计层面,Etcd至少功居前列。以下是我认为CoreOS三个最值得圈点的优秀之处:

  • 高度精简的发行版和只读系统分区:不仅大大减少了系统的资源占用,更重要的意义在于迫使用户养成使用容器运行应用的习惯。就像智能手机系统给每个软件都包装了一个沙盒,其带来的安全和管理的好处远远大于使用沙盒带来的开销;
  • 平滑升级的系统:这里只强调平滑升级,而不是官方大力宣传的AB双分区升级概念。其实即便使用了双分区,依然不可避免的需要重启完成升级,和单分区后台升级带来的好处并不是十分明显。而平滑升级却意味着操作系统可以长期运行,而不用担心版本过老又无法更新带来的漏洞问题;
  • 稳定可靠的分布式配置系统(也就是Etcd服务),以及基于这个服务实现的一整套集群解决方案。这里包括刚刚提及的集群自组建,以及Fleet、Locksmith、Confd、Flannel、甚至Deis等众多基于Etcd构建的服务。

个人的薄见,不代表任何官方观点,欢迎共同探讨。

在下一篇中,我们将走进另一个大家应当早已熟识的鲸鱼朋友,Docker。聊聊它与CoreOS之间的那段佳事。 (作者/林帆 责编/周小璐)

[CoreOS 转载] CoreOS实践指南(六):分布式数据存储Etcd(下)的更多相关文章

  1. [CoreOS 转载] CoreOS实践指南(五):分布式数据存储Etcd(上)

    转载:http://www.csdn.net/article/2015-01-22/2823659 摘要:在“漫步云端:CoreOS实践指南”系列的前几篇,分别介绍了如何架设CoreOS集群,系统服务 ...

  2. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

  3. [CoreOS 转载] CoreOS实践指南(四):集群的指挥所Fleet

    转载:http://www.csdn.net/article/2015-01-14/2823554/2 摘要:CoreOS是采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...

  4. [CoreOS 转载] CoreOS实践指南(一)

    转载:http://www.csdn.net/article/2014-12-29/2823356 摘要:CoreOS是一个采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...

  5. [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务

    转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...

  6. [CoreOS 转载] CoreOS实践指南(三):系统服务管家Systemd

    转载:http://www.csdn.net/article/2015-01-08/2823477 摘要:CoreOS是采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件工程 ...

  7. [CoreOS 转载]CoreOS实践指南(二):架设CoreOS集群

    转载:http://www.csdn.net/article/2015-01-04/2823399 摘要:CoreOS是一个采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...

  8. 转载:Google 官方应用架构的最佳实践指南 赞👍

    官方给的实践指南,很有实际的指导意义,  特别是对一些小公司,小团队,给了很好的参考意义. 原文地址: https://developer.android.com/topic/libraries/ar ...

  9. kafka原理和实践(六)总结升华

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

随机推荐

  1. Splunk及splunkforward简单部署配置

    部署环境 操作系统 服务器操作系统版本:CentOS release 6.5 (Final) 2.6.32-431.el6.x86_64 软件 软件版本:splunk-6.4.0 tar: splun ...

  2. 用scala实现一个sql执行引擎-(上)

    前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说, ...

  3. OkHttp使用进阶 译自OkHttp Github官方教程

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/3997368.html 没有使用过OkHttp的,可以先看Ok ...

  4. ceph placement group状态总结

    一.归置组状态 1. Creating 创建存储池时,它会创建指定数量的归置组.ceph 在创建一或多个归置组时会显示 creating;创建完后,在其归置组的 Acting Set 里的 OSD 将 ...

  5. 不均匀的Windows处理器编组

    不均匀的Windows处理器编组 之前写过一篇文章,关于SQLSERVER能识别多少个逻辑CPU的,前些天在论坛里有人问Windows处理器编组是如何划分的?? SQLSERVER到底能识别多少个逻辑 ...

  6. [转]编译VC++程序warning C4819快速解决

    文章来自:http://www.cppblog.com/API/archive/2012/11/12/195056.aspx 编译VC++程序的时候出现如下提示警告: warning C4819: T ...

  7. Nginx学习笔记(五) 源码分析&内存模块&内存对齐

    Nginx源码分析&内存模块 今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现.还有内存对齐的内容~~不懂的可以看看~~ src/os/unix/Ngx_al ...

  8. AngularJs 基础(60分钟入门)

    AngularJS 是一个创建富客户端应用的JavaScript MVC框架.你仍然需要具有服务端后台,但大多数的用户交互逻辑将放到客户端上处理.它可以创建单页的应用程序,一个页面的应用仅仅需要HTM ...

  9. atitit.提升软件开发效率大的总结O5

    atitit.提升软件开发效率大的总结O5 #---平台化.组件化 1 #--cbb公用模块的建设 1 #---内部最佳流程方法跟实践的总结 2 #---内部知识体系的建设 2 #---问题Qa库的建 ...

  10. paip.输入法编程--英文ati化By音标原理与中文atiEn处理流程 python 代码为例

    paip.输入法编程--英文ati化By音标原理与中文atiEn处理流程 python 代码为例 #---目标 1. en vs enPHati 2.en vs enPhAtiSmp 3.cn vs ...