Etcd是一个比較新的分布式协调框架,由CoreOS的开发团队开发,如今才仅仅到0.4.6版本号,还没公布1.0版本号

我看了一下GitHub上作者们的提交记录,如今应该还在如火如荼的开发以及改动Bug中,预计要有点耐心再等一等了。。。

并且2014年7月25号CoreOS(server操作系统)公布了自己的第一个稳定版本号,当中包含:

  • Linux 3.15.2
  • Docker 1.0.1
  • Support on all major cloud providers, including Rackspace Cloud, Amazon EC2 (including HVM), and Google Compute Engine
  • Commercial support via CoreOS Managed Linux

可是他们说为了这个版本号的CoreOS的稳定,临时决定不把Etcd和Fleet包括进来。。。这两个玩意的稳定版本号之后才会搞进CoreOS。。。

从网上搜etcdkeyword,基本上就仅仅能看到“开源中国”的介绍:

etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。etcd 的灵感来自于 ZooKeeper 和 Doozer,側重于:

  • 简单:支持 curl 方式的用户 API (HTTP+JSON)
  • 安全:可选 SSL client证书认证
  • 高速:单实例可达每秒 1000 次写操作
  • 可靠:使用 Raft 实现分布式

Etcd is written in Go and uses the raft consensus algorithm to manage a highly-available replicated log.

一、安装和測试

安装很easy,大概经历下面几个步骤吧:

1、下载VMWare9.0虚拟机和一个Ubuntu12 desktop版的ISO,安装好Ubuntu,以及root用户,vim软件等的初始化设置。(必须安装Linux-64bit,否则执行时etcd会出错)

2、下载Go语言编译器,用来编译Etcd的,下载地址是:http://tip.golang.so/dl/,上面有解压说明教程。

3、下载CURL,用于在Linux终端发送HTTP请求到Etcdserver,网上有它的编译和安装教程,比方这个http://blog.csdn.net/lifan5/article/details/7350154

4、下载etcd源代码,到GitHub下载就能够,下载了以后解压,然后用Go编译器进行编译,它的GitHub网页上有说明。

5、环境都搞完了以后就能够启动etcd了,然后你能够先照着上面的API教程操作一把:https://github.com/coreos/etcd/blob/master/Documentation/api.md

二、.NETclient代码測试

我准备先开发.NET的client,由于这个眼下急需。

下载 drusellers/etcetera

然后用VS202打开自行编译成DLL,将DLL增加到自己的新的project中。

1、节点存活周期測试:

普通创建的节点(不加TTL)在ETCD崩溃或者重新启动之后,不会被删除,下次再启动Etcd这些节点还会在,值也不会变。

2、节点监视

设置和监视单层节点,正常工作:

  1. static string registryCenterIP = "192.168.195.128";
  2. static int registryCenterPort = 4001;
  3. static string sysFlag = "systemA";
  4. static string URL = "http://" + registryCenterIP + ":" + registryCenterPort + "/v2/keys/" + sysFlag + "/";
  5. static EtcdClient client = new EtcdClient(new Uri(URL));
  6.  
  7. static void Main(string[] args)
  8. {
  9. client.Set("config1", "value1");
  10. client.Watch("config1", FollowUp_Config);
  11.  
  12. Thread.Sleep(3000);
  13.  
  14. client.Set("config1", "value2"); //watch回调函数会被触发

设置和监视多层节点,将无论用:

  1. static string registryCenterIP = "192.168.195.128";
  2. static int registryCenterPort = 4001;
  3. static string sysFlag = "systemA";
  4. static string URL = "http://" + registryCenterIP + ":" + registryCenterPort + "/v2/keys/" + sysFlag + "/";
  5. static EtcdClient client = new EtcdClient(new Uri(URL));
  6.  
  7. static void Main(string[] args)
  8. {
  9. client.Set("config1/x", "value1");
  10. client.Watch("config1/x", FollowUp_Config);
  11.  
  12. Thread.Sleep(3000);
  13.  
  14. client.Set("config1/x", "value2"); //watch回调函数不会被触发

由于config1和你预想的不一样,实际上config1不是一个文件夹,由于内部实现没有解析这种格式,然后为config1创建一个相应的文件夹。

而是提供了一个createDir()的接口来创建文件夹。

所以在为config1创建了文件夹的前提下,监视config1/x的watch回调函数才会被触发:

  1. client.CreateDir("config1");
  2.  
  3. client.Set("config1/x", "value1");
  4. client.Watch("config1/x", FollowUp_Config);
  5.  
  6. Thread.Sleep(3000);
  7.  
  8. client.Set("config1/x", "value2"); //watch回调函数会被触发

另外更重要的一点,设置对节点的watch仅仅是一次有效的!!!

比方以下代码:

  1. static string registryCenterIP = "192.168.195.128";
  2. static int registryCenterPort = 4001;
  3. static string sysFlag = "systemA";
  4. static string URL = "http://" + registryCenterIP + ":" + registryCenterPort + "/v2/keys/" + sysFlag + "/";
  5. static EtcdClient client = new EtcdClient(new Uri(URL));
  6.  
  7. static void Main(string[] args)
  8. {
  9. client.Watch("conf", FollowUp_Config);
  10.  
  11. Thread.Sleep(2000);
  12. client.Set("conf", "value1"); //会触发watch回调函数
  13.  
  14. Thread.Sleep(2000);
  15. client.Set("conf", "value2"); //不会触发watch回调函数
  16.  
  17. Thread.Sleep(2000);
  18. client.Set("conf", "valuejiyiqin"); //不会触发watch回调函数
  19.  
  20. Thread.Sleep(2000);
  21. client.Delete("conf"); //不会触发watch回调函数

必需要连续设置watch才会有效:

  1. static string registryCenterIP = "192.168.195.128";
  2. static int registryCenterPort = 4001;
  3. static string sysFlag = "systemA";
  4. static string URL = "http://" + registryCenterIP + ":" + registryCenterPort + "/v2/keys/" + sysFlag + "/";
  5. static EtcdClient client = new EtcdClient(new Uri(URL));
  6.  
  7. static void Main(string[] args)
  8. {
  9. client.Watch("conQ", FollowUp_Config);
  10. Thread.Sleep(2000);
  11. client.Set("conQ", "value1"); //会触发watch回调函数
  12.  
  13. client.Watch("conQ", FollowUp_Config);
  14. Thread.Sleep(2000);
  15. client.Set("conQ", "value2"); //会触发watch回调函数
  16.  
  17. client.Watch("conQ", FollowUp_Config);
  18. Thread.Sleep(2000);
  19. client.Delete("conQ"); //会触发watch回调函数

3、文件夹监视

假设要监视config1文件夹,须要在Watch函数的第三个參数recursive = true?指定为true,这样才会触发回调函数。

并且监视仅仅是一次有效,比方这样:

  1. static string registryCenterIP = "192.168.195.128";
  2. static int registryCenterPort = 4001;
  3. static string sysFlag = "systemA";
  4. static string URL = "http://" + registryCenterIP + ":" + registryCenterPort + "/v2/keys/" + sysFlag + "/";
  5. static EtcdClient client = new EtcdClient(new Uri(URL));
  6.  
  7. static void Main(string[] args)
  8. {
  9. client.CreateDir("config2");
  10. client.Watch("config2", FollowUp_Config, true);
  11.  
  12. Thread.Sleep(2000);
  13. client.Set("config2/x", "value1"); //会触发watch回调函数
  14.  
  15. Thread.Sleep(2000);
  16. client.Set("config2/x", "value2"); //不会触发watch回调函数
  17.  
  18. Thread.Sleep(2000);
  19. client.Set("config2/y", "valuejiyiqin"); //不会触发watch回调函数
  20.  
  21. Thread.Sleep(2000);
  22. client.Delete("config2/x"); //不会触发watch回调函数

这样才会全部在这个文件夹以下的增删该操作都会触发回调函数:

  1. static string registryCenterIP = "192.168.195.128";
  2. static int registryCenterPort = 4001;
  3. static string sysFlag = "systemA";
  4. static string URL = "http://" + registryCenterIP + ":" + registryCenterPort + "/v2/keys/" + sysFlag + "/";
  5. static EtcdClient client = new EtcdClient(new Uri(URL));
  6.  
  7. static void Main(string[] args)
  8. {
  9. client.CreateDir("config2");
  10.  
  11. client.Watch("config2", FollowUp_Config, true);
  12. Thread.Sleep(2000);
  13. client.Set("config2/x", "value1"); //会触发
  14.  
  15. client.Watch("config2", FollowUp_Config, true);
  16. Thread.Sleep(2000);
  17. client.Set("config2/x", "value2"); //会触发
  18.  
  19. client.Watch("config2", FollowUp_Config, true);
  20. Thread.Sleep(2000);
  21. client.Set("config2/y", "valuejiyiqin"); //会触发
  22.  
  23. client.Watch("config2", FollowUp_Config, true);
  24. Thread.Sleep(2000);
  25. client.Delete("config2/x"); //会触发

4、同一个进程下监视多个节点,同一时候设置节点值

不要尝试在一个进程中,用一个线程开启对多个节点的监视,然后又在另外一个线程中设置被监视的节点值,然后眼巴巴地期望监视回调函数呗调用,像这样:

  1. static void Main(string[] args)
  2. {
  3. IRegistryCenterClient rCenter = new RegistryCenterClient(registryCenterIP, registryCenterPort, sysFlag);
  4. client.Watch(sysFlag + "/config/" + "user1DBConstr", FollowUp_Config, true);
  5. client.Watch(sysFlag + "/config/" + "user2DBConstr", FollowUp_Config2, true);
  6. Console.WriteLine("设置监视完毕");
  7.  
  8. Thread thread1 = new Thread(Server3);
  9. thread1.Start();
  10.  
  11. Thread.Sleep(15000);
  12. }
  13.  
  14. private static void Server3()
  15. {
  16. IRegistryCenterClient rCenter = new RegistryCenterClient(registryCenterIP, registryCenterPort, sysFlag);
  17.  
  18. Thread.Sleep(4000);
  19. rCenter.SetConfigItem("user1DBConstr", "v7");
  20. }

回调函数不会被调用,无论你加不加watch中的recursive參数,也无论你的回调函数指定的是同一个还是不同的,总之不会被调用。

现象就是卡住不动,像这样:

然后我调试了一下,发现是set操作向etcd写值失败!!!原因是response中指示错误。

我很操心是这个C#的etcdclient有问题,然后立马去掉thread1线程的创建,仅仅保留上面的两段监视代码,像这样:

  1. static void Main(string[] args)
  2. {
  3. IRegistryCenterClient rCenter = new RegistryCenterClient(registryCenterIP, registryCenterPort, sysFlag);
  4. client.Watch(sysFlag + "/config/" + "user1DBConstr", FollowUp_Config, true);
  5. client.Watch(sysFlag + "/config/" + "user2DBConstr", FollowUp_Config2, true);
  6. Console.WriteLine("设置监视完毕");
  7.  
  8. //Thread thread1 = new Thread(Server3);
  9. //thread1.Start();
  10.  
  11. Thread.Sleep(15000);
  12. }

然后打开Linux终端,直接用CURL命令给这两个节点写值,发现回调函数呗调用了,然后我推断是不是不能在一个进程里面做这些事情,可能etcetra在多线程方面还是有些问题,所以我又一次创建了一个project,在这个project里面写一个程序给上面监视的两个节点写值,像这样:

  1. static void Main(string[] args)
  2. {
  3. IRegistryCenterClient rCenter = new RegistryCenterClient(registryCenterIP, registryCenterPort, sysFlag);
  4. rCenter.SetConfigItem("user1DBConstr", "v7");

发现监视回调函数被调用了。

果然是同一个进程里面不能同一时候监视多个节点,然后在还有一个线程中给节点写值。

这个问题測试的时候必需要注意!!!

etcetera的Bug???

(1)同一个进程以下不能同一时候监视三个及以上节点

同一个进/线程中使用etcd 的这个C#client同一时候监视三个或者以上的节点不行,开启终端设置这几个节点的值仅仅有监视的前两个节点的回调函数会触发,第三个节点以及之后的节点的回调函数都不会触发了。

(2)Clustering模式以下无法创建文件夹:

我有这么一段代码:

  1. try
  2. {
  3. if (source != null && source is ServiceInfo)
  4. {
  5. ServiceInfo serviceInfo = source as ServiceInfo;
  6.  
  7. string serviceDir = sysFlag + "/service/" + serviceInfo.serviceName;
  8. client.CreateDir(serviceDir);
  9.  
  10. string key = serviceDir + "/" + serviceInfo.serviceIP;
  11. string value = JsonSerializer.GetJsonByObject(serviceInfo);
  12. client.Set(key, value, nodeTTL);
  13. logger.Info("注冊服务成功:[key]" + key + ",[value]" + value);
  14. }
  15. }
  16. catch (Exception ee)
  17. {
  18. logger.Info("[KeepAliveTimer]注冊服务失败,原因是:" + ee.Message);
  19. }

启动单个etcdserver节点跑起来没有问题,在创建文件夹的时候也都可以创建。

可是当使用Clustering模式的时候,创建文件夹这段代码就会抛出异常,原因是Invalid JSON string。

可是我打开Linux终端执行以下命令:

  1. curl -L http://127.0.0.1:4001/v2/keys/CBIP/service/HelloService -XPUT -d dir=true

创建文件夹是没有不论什么问题的。

我预计就是etcetera的问题,须要查看源代码确认调试一下。

这些问题须要在深入研究其源代码进行确认!

未完待续。。。

By 季义钦 jiq408694711@163.com

Etcd学习(一)安装和.NETclient測试的更多相关文章

  1. 基于MySQL元数据的Hive的安装和简单測试

    引言: Hive是一种强大的数据仓库查询语言,类似SQL,本文将介绍怎样搭建Hive的开发測试环境. 1. 什么是Hive? hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为 ...

  2. Redis安装及简单測试

    摘要: Redis是眼下业界很受到欢迎的一个内存数据库,一般用作系统的中间缓存系统,用以提升总体商业系统的吞吐量和响应速度.本文将简要介绍安装的主要过程以及给出一个简要的測试代码. 1.  系统环境和 ...

  3. ubuntu 14.04 LTS 安装webbentch压力測试工具

    近期在做 压力測试工具,除了apache的ab測试工具外,发现webbentch工具也不错,这里简介下这两个工具. 一.webbentch安装: wget http://blog.s135.com/s ...

  4. 学习使用Jmeter做压力測试(一)--压力測试基本概念

    一.性能測试的概念         性能測试是通过自己主动化的測试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行測试.负载測试和压力測试都属于性能測试,两者能够结合进行. 通过负载測试, ...

  5. etcd学习之安装与命令

    ETCD学习 下载etcd #下载 wget https://github.com/etcd-io/etcd/releases/download/v3.3.18/etcd-v3.3.18-linux- ...

  6. 移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践

    这篇是计算机类的优质预售推荐>>>><移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践> 国内顶级互联网公司測试实战经验总结.阿里.腾讯.京东.携程.百 ...

  7. Mahout学习之Mahout简单介绍、安装、配置、入门程序測试

    一.Mahout简单介绍 查了Mahout的中文意思--驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的 ...

  8. 淘宝分布式 key/value 存储引擎Tair安装部署过程及Javaclient測试一例

    文件夹 1. 简单介绍 2. 安装步骤及问题小记 3. 部署配置 4. Javaclient測试 5. 參考资料 声明 1. 以下的安装部署基于Linux系统环境:centos 6(64位),其他Li ...

  9. 腾讯云安装openvz,高速搭建測试环境

    CSDN送了腾讯云的測试资格,准备拿来作为cici的软件公布首页,想在上面做个demo,无奈没有设备环境,于是想要用openvz来虚拟一些vps: 第一步:选择腾讯云的os模板,centos6.3 第 ...

随机推荐

  1. python - StringIO文本缓冲

    参考:http://pymotwcn.readthedocs.org/en/latest/documents/StringIO.html 类StringIO提供了一个在内存中方便处理文本的类文件(读, ...

  2. js 支持的原始数据类型

    原始数据类型: 数值型: 1.十进制数 <script> var a =12; a = -12 a = 12.4 a =.23e2 //=>23 a = 2e3 //=>200 ...

  3. 解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误

    重新启动服务器,访问web服务发现无法浏览,登陆服务器之 后进到nginx使用./nginx -s reload重新读取配置文件,发现报nginx: [error] open() "/usr ...

  4. 2基本概念--python深度机器学习

    参考彭亮老师的视频教程:转载请注明出处及彭亮老师原创 视频教程: http://pan.baidu.com/s/1kVNe5EJ 基本概念:训练集,测试集,特征值,监督学习,非监督学习,半监督学习,分 ...

  5. MS Writer Code Test

    #include<iostream> using namepspace std; int main() { cout<<"Hello World"<& ...

  6. 关于Java(标识符规则)

    Java 是大小写敏感的语言. Java 标识符组成 Java 标识符组成: 字母,数字,下划线和美元符 $ Java 标识符规则 仅包含 字母,数字,下划线和美元符 开头不能使数字 不能使 Java ...

  7. myeclipse spket spket-1.6.23.jar 破解安装教程

    一年前安装文档就写过了,今天写破解文档,本来开发js/ext是想用aptana的,但是安装包100多M,我还是用spket吧(才11M),这个需要破解一下license,否则用不了. 一 安装教程如下 ...

  8. 【技术贴】同一台机器Tomcat7多版本共存配置文档

    首先准备好自己下载的Tomcat7的绿色版,一定要是解压的绿色版不能使exe安装包.因为exe安装版很多变量不好配置,我以前最喜欢exe版了,方便快捷,但是我发现还是绿色解压版比较好,优化配置等也很好 ...

  9. JAVA存取对象属性时,如果开程多线程,记得对相关存取方法作原子化操作定义

    最显著的应用当然是银行存款和取款,不要存在存取数字和实际发生不一样的情况. synchronized关键字. class BankAccount { private int balance = 100 ...

  10. Maven实战七

    转载:http://www.iteye.com/topic/973166 前言 Maven,发音是[`meivin],"专家"的意思.它是一个很好的项目管理工具,很早就进入了我的必 ...