• go etcd


    etcd介绍

    GitHub:https://github.com/coreos/etcd

    官网:https://coreos.com/etcd/

    下载:https://github.com/coreos/etcd/releases/

    概念:高可用的分布式key-value存储,可以用于配置共享和服务发现。

    具有以下优点:
    • 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过gRPC提供接口调用
    • 安全:支持TLS通信,并可以针对不同的用户进行对key的读写控制
    • 高性能:10,000 /秒的写性能

    类似项目:zookeeper和consul

    开发语言:Go

    接口:提供restful的http接口,使用简单

    实现算法:基于raft算法的强一致性、高可用的服务存储目录

    etcd的应用场景:

    • 服务发现和服务注册
    • 配置中心
    • 分布式锁
    • master选举

    etcd单机部署

    1、下载安装包etcd-v3.2.7-linux-amd64.tar.gz

    tar -zxvf etcd-v3.2.7-linux-amd64.tar.gz
    cd etcd-v3.2.7-linux-amd64

    2、服务启动

    nohup etcd--data-dir /var/lib/data.etcd --listen-client-urls http://10.10.83.162:2379--advertise-client-urls http://10.10.83.162:2379 & > /var/log/etcd.log &

    etcd集群部署

    集群搭建有三种方式,分布是静态配置,etcd发现,dns发现

    三种发现方式:Static,etcd Discovery,DNS Discovery。 
    ● Static适用于有固定IP的主机节点 
    ● etcd Discovery适用于DHCP环境 
    ● DNS Discovery依赖DNS SRV记录 

    1、部署环境

    操作系统:centos6.8

    3台服务器:10.10.83.162、10.10.83.163、10.10.83.229

    2、配置项说明

    • --name  
    etcd集群中的节点名,这里可以随意,可区分且不重复就行  
    • --data-dir
    指定节点的数据存储目录
    • --wal-dir
    指定节点的was文件的存储目录,若指定了该参数,wal文件会和其他数据文件分开存储。
    • --listen-peer-urls
    监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
    • --initial-advertise-peer-urls 
    建议用于节点之间通信的url,节点间将以该值进行通信。
    • --listen-client-urls
    监听的用于客户端通信的url,同样可以监听多个。
    • --advertise-client-urls
    建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信。
    • --initial-cluster-token
    节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响。
    • --initial-cluster
    也就是集群中所有的initial-advertise-peer-urls 的合集
    • --initial-cluster-state
    新建集群的标志

    静态配置

    https://coreos.com/etcd/docs/latest/op-guide/clustering.html

    静态配置主要预先将集群的配置信息分配好,然后将集群分布启动,集群将根据配置信息组成集群。这里按如下的配置信息分别启动三个etcd。
    • 10.10.83.162
    ./etcd --name infra0 --initial-advertise-peer-urls http://10.10.83.162:2380 
    --listen-peer-urls http://10.10.83.162:2380 
    --listen-client-urls http://10.10.83.162:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.10.83.162:2379 
    --initial-cluster-token etcd-cluster-1 
    --initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 
    --initial-cluster-state new
    
    • 10.10.83.163
    ./etcd --name infra1 --initial-advertise-peer-urls http://10.10.83.163:2380 
    --listen-peer-urls http://10.10.83.163:2380 
    --listen-client-urls http://10.10.83.163:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.10.83.163:2379 
    --initial-cluster-token etcd-cluster-1 
    --initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 
    --initial-cluster-state new
    
    • 10.10.83.229
    ./etcd --name infra2 --initial-advertise-peer-urls http://10.10.83.229:2380 
    --listen-peer-urls http://10.10.83.229:2380 
    --listen-client-urls http://10.10.83.229:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.10.83.229:2379 
    --initial-cluster-token etcd-cluster-1 
    --initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 
    --initial-cluster-state new
    

    按如上配置分别启动集群,启动集群后,将会进入集群选举状态

    • 查看集群成员
    ./etcdctl  member list
    

    • 查看集群健康状态
    ./etcdctl cluster-health

    etcd发现

    静态配置前提是在搭建集群之前已经提前知道各节点的信息,而实际应用中可能存在预先并不知道各节点ip的情况,这时可通过已经搭建的etcd来辅助搭建新的etcd集群,具体过程如下:

    分为私有方式和公有方式

    1、私有方式

    首先需要在已经搭建的etcd集群。这种启动方式,依赖另外一个ETCD集群,在该集群中创建一个目录,并在该目录中创建一个_config的子目录,并且在该子目录中增加一个size节点,指定集群的节点数目。

    curl -X PUT http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3

     返回

    {"action":"set","node":{"key":"/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size","value":"3","modifiedIndex":16,"createdIndex":16}}
    

    如上表示创建一个集群大小为3的etcd发现url,创建成功后按如下配置启动各节点

    ./etcd --name infra0 --initial-advertise-peer-urls http://10.10.83.162:2380 
    --listen-peer-urls http://10.10.83.162:2380 
    --listen-client-urls http://10.10.83.162:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.10.83.162:2379 
    --discovery http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
    
    ./etcd --name infra1 --initial-advertise-peer-urls http://10.10.83.163:2380 
    --listen-peer-urls http://10.10.83.163:2380 
    --listen-client-urls http://10.10.83.163:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.10.83.163:2379 
    --discovery http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
    
    ./etcd --name infra2 --initial-advertise-peer-urls http://10.10.83.229:2380 
    --listen-peer-urls http://10.10.83.229:2380 
    --listen-client-urls http://10.10.83.229:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.10.83.229:2379 
    --discovery http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
    

    如上当所有etcd均注册到用于发现的url后,独立的各节点将形成集群。

    2、公有方式

    如果没有搭建好的etcd集群用于注册和发现,可使用etcd公有服务来进行服务注册发现。

    curl https://discovery.etcd.io/new?size=3 
    

    返回

    https://discovery.etcd.io/580e3f6a132634250f2f790ac159f44e
    

    将返回的url替换上面的 --discovery部分,启动各个节点etcd,建立集群。

    dns发现

    dns 发现主要通过dns服务来记录集群中各节点的域名信息,各节点到dns服务中获取相互的地址信息,从而建立集群。etcd各节点通过--discovery-serv配置来获取域名信息。

    部署方式参考官方介绍

    etcd集群运行过程中的改配

    主要用于故障节点替换,集群扩容需求。

    1、从集群中删除老member

    ./etcdctl member remove 169547ffdcc5110d

    2、向集群中新增新member

    ./etcdctl member add infra2 http://10.10.83.163:2380 
    

    3、删除老节点data目录

    4、在新member上启动etcd进程

    nohup ./etcd --name infra1 --initial-advertise-peer-urls http://10.10.83.163:2380 --listen-peer-urls http://10.10.83.163:2380 --listen-client-urls http://10.10.83.163:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.10.83.163:2379 --initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 --initial-cluster-state existing & 
    

    集群可服务性对故障的容忍度

    以3节点集群为例。

    结论:

    • 在1个member故障时,即小部分节点故障: 集群处于健康态,读写都正常。
    • 在2个member故障时,即大部分节点故障情况:集群整体状态为”不健康“,剩下的member也为”不健康“。只能read,但不能write,可能是因为剩下的member竞选leader失败,拿不到多数票。
    • 在大部分节点恢复后,集群整体状态为”健康“,每个member也为”健康“

    使用示例

    package main
    
    import (
    	"fmt"
    	etcd_client "github.com/coreos/etcd/clientv3"
    	"time"
    )
    
    func main() {
    
    	cli, err := etcd_client.New(clientv3.Config{
    		Endpoints:   []string{"10.10.83.162:2379", "10.10.83.163:2379", "10.10.83.229:2379"},
    		DialTimeout: 5 * time.Second,
    	})
    	if err != nil {
    		fmt.Println("connect failed, err:", err)
    		return
    	}
    
    	fmt.Println("connect succ")
    	defer cli.Close()
    }
    

      

  • 相关阅读:
    [转]Nvidia 的Shadow 文章收集
    [转]Linear Depth Buffer(线性深度缓冲区)
    [转]ParallelSplit Shadow Maps on Programmable GPUs
    [转]Learning to Love your Zbuffer.
    SQL SERVER存储过程中使用事务
    VS2005+SQL2005 Reporting Service动态绑定报表(Web)
    Sql批量删除/插入
    存储过程中执行动态Sql语句
    存储过程中使用事务
    真正的全动态报表:RDLC+ReportViewer
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/7560460.html
Copyright © 2020-2023  润新知