linux 安装snap7,基于linux7的ectd安装与部署

系统环境

iostat

Linux 3.10.0-693.17.1.el7.x86_64 (swarm1) 2018年03月28日 _x86_64_ (2 CPU)

cat /etc/redhat-release

CentOS Linux release 7.4.1708 (Core)

getenforce

Disabled

etcd简介

etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。

etcd作为服务发现系统,有以下的特点:

(1)简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单

(2)安全:支持SSL证书验证

(3)快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作

(4)可靠:采用raft算法,实现分布式系统数据的可用性和一致性

etcd项目地址:https://github.com/coreos/etcd/

etcd应用场景

etcd比较多的应用场景是用于服务发现,服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。

从本质上说,服务发现就是要了解集群中是否有进程在监听upd或者tcp端口,并且通过名字就可以进行查找和链接。

要解决服务发现的问题,需要下面三大支柱,缺一不可。

(1)一个强一致性、高可用的服务存储目录。

基于Ralf算法的etcd天生就是这样一个强一致性、高可用的服务存储目录。

(2)一种注册服务和健康服务健康状况的机制。

用户可以在etcd中注册服务,并且对注册的服务配置key TTL,定时保持服务的心跳以达到监控健康状态的效果。

(3)一种查找和连接服务的机制。

通过在etcd指定的主题下注册的服务业能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个proxy模式的etcd,这样就可以确保访问etcd集群的服务都能够互相连接。

dd16eda7db799a1001a7ec83c9abcaf7.png

etcd安装

etcd在生产环境中一般推荐集群方式部署。etcd目前默认使用2379端口提供HTTP API服务,2380端口和peer通信(这两个端口已经被IANA官方预留给etcd);在之前的版本中可能会分别使用4001和7001,在使用的过程中需要注意这个区别。

因为etcd是go语言编写的,安装只需要下载对应的二进制文件,并放到合适的路径就行。

etcd下载与启动

##etcd下载

mkdir -p /opt/etcd && cd /opt/etcd

curl -L https://github.com/coreos/etcd/releases/download/v3.3.2/etcd-v3.3.2-linux-amd64.tar.gz -o etcd-v3.3.2-linux-amd64.tar.gz

##解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端。

tar zxf etcd-v3.3.2-linux-amd64.tar.gz

mv etcd-v3.3.2-linux-amd64 etcd

pwd

/opt/etcd

cd etcd

ls

etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md

##如果在测试环境,启动一个单节点的etcd服务,只需要运行etcd命令就行。

./etcd

如下:

##前台运行,直接占用了当前终端。

2018-03-28 17:46:23.082655 I | etcdmain: etcd Version: 3.3.2

2018-03-28 17:46:23.082753 I | etcdmain: Git SHA: c9d46ab37

2018-03-28 17:46:23.082769 I | etcdmain: Go Version: go1.9.4

2018-03-28 17:46:23.082783 I | etcdmain: Go OS/Arch: linux/amd64

2018-03-28 17:46:23.082817 I | etcdmain: setting maximum number of CPUs to 2, total number of available CPUs is 2

。。。。。。

##从上面的输出中,我们可以看到很多信息。以下是几个比较重要的信息:

(1)name表示节点名称,默认为default。

(2)data-dir 保存日志和快照的目录,默认为当前工作目录default.etcd/目录下。

(3)在http://localhost:2380和集群中其他节点通信。

(4)在http://localhost:2379提供HTTP API服务,供客户端交互。

(5)heartbeat为100ms,该参数的作用是leader多久发送一次心跳到followers,默认值是100ms。

(6)election为1000ms,该参数的作用是重新投票的超时时间,如果follow在该时间间隔没有收到心跳包,会触发重新投票,默认为1000ms。

(7)snapshot count为10000,该参数的作用是指定有多少事务被提交时,触发截取快照保存到磁盘。

(8)集群和每个节点都会生成一个uuid。

(9)启动的时候会运行raft,选举出leader。

##添加etcd启动路径

cat >> /etc/profile << EOF

##etcd

export PATH=/opt/etcd/etcd:$PATH

export ETCDCTL_API=3

EOF

source /etc/profile

##查看下etcd路径

echo $PATH

/opt/etcd/etcd:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

说明:如果不设置 ETCDCTL_API=3,则默认是的API版本是2:

etcdctl version

etcdctl version: 3.3.2

API version: 2

正确设置后,API版本变成3:

etcdctl version

etcdctl version: 3.3.2

API version: 3.3

##上面的方法只是简单的启动一个etcd服务,但要长期运行的话,还是做成一个服务好一些。下面将以systemd为例,介绍如何建立一个etcd服务。

建立etcd服务

##设定etcd配置文件,建立相关目录

mkdir -p /var/lib/etcd/

mkdir -p /opt/etcd/config/

##创建etcd配置文件

cat <

#节点名称

ETCD_NAME=$(hostname -s)

#数据存放位置

ETCD_DATA_DIR=/var/lib/etcd

EOF

##创建systemd配置文件

cat <

[Unit]

Description=Etcd Server

Documentation=https://github.com/coreos/etcd

After=network.target

[Service]

User=root

Type=notify

EnvironmentFile=/opt/etcd/config/etcd.conf

ExecStart=/opt/etcd/etcd/etcd

Restart=on-failure

RestartSec=10s

LimitNOFILE=40000

[Install]

WantedBy=multi-user.target

EOF

##启动etcd

systemctl daemon-reload && systemctl enable etcd && systemctl start etcd

etcd基本使用

etcdctl是一个命令行客户端,它能提供一些简洁的命令,供用户直接跟etcd服务打交道,而无需基于 HTTP API方式。可以方便我们在对服务进行测试或者手动修改数据库内容。建议刚刚接触etcd时通过etdctl来熟悉相关操作。这些操作跟HTTP API基本上是对应的。

etcd项目二进制发行包中已经包含了etcdctl工具,etcdctl支持的命令大体上分为数据库操作和非数据库操作两类。

##查看etcd版本

etcd --version

etcd Version: 3.3.2

Git SHA: c9d46ab37

Go Version: go1.9.4

Go OS/Arch: linux/amd64

##etcdctl参数和选项

etcdctl -h

##数据库操作

数据库操作围绕对键值和目录的CRUD完整生命周期的管理。

etcd在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如:testkey,此时实际上放在根目录/下面,也可以为指定目录结构,如/cluster1/node2/testkey,则将创建相应的目录结构。

说明:CRUD即Create,Read,Update,Delete是符合REST风格的一套API操作。

(1)put

etcdctl put foo "hello world"

OK

etcdctl put /root/wtf "datagrand"

OK

(2)get

etcdctl get foo

foo

hello world

etcdctl get /root/wtf

/root/wtf

datagrand

##当键不存在时,则会报错。例如:

etcdctl get /testdir/testkey2

Error: 100: Key not found (/testdir/testkey2) [5]

集群及go安装优化

##单独集群:只有一台服务器的集群。

部署etcd集群作为单独集群是直截了当的。仅用一个命令启动它

etcd或

systemctl daemon-reload && systemctl enable etcd && systemctl start etcd

##本地多成员集群

多成员集群:有多台台服务器的集群。

提供 Procfile 用于简化搭建本地多成员集群。通过少量命令来启动多成员集群:

##使用go get **** 命令安装程序

yum install -y go

系统会安装golang-1.8.3-1.el7.x86_64(按实际版本)

##执行 go version,查看当前 go 的当前版本

go version

go version go1.8.3 linux/amd64

##执行 go env,查看当前 go 的环境变量

go env

GOARCH="amd64"

GOBIN=""

GOEXE=""

GOHOSTARCH="amd64"

GOHOSTOS="linux"

GOOS="linux"

GOPATH="/root/go"

GORACE=""

GOROOT="/usr/lib/golang"

GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"

说明:golang1.8默认情况下,在 GOPATH 没有设置的情况下,使用的默认路径是 /root/go 。这个是非常不好的,因为 /root 目录权限非常特殊。

因此最好能自己设置 GOPATH,比如设置到自己的工作区目录。

mkdir -p /usr/local/go

##修改 /etc/profile,将go加入到path中

cat >> /etc/profile << EOF

export GOPATH=/usr/local/go

export PATH=/usr/local/go/bin:$PATH

EOF

source /etc/profile

##执行 go env,查看当前 go 的GOPATH

GOPATH="/usr/local/go"

说明:之后再通过 go get **** 命令安装程序时,新的程序就会被安装到 GOPATH/bin 下,然后由于GOPATH/bin 已经加入到 PATH,因此就可以很方便的使用新安装的程序。

多成员集群(一个node多个port)

##安装goreman

go get github.com/mattn/goreman

##查看下安装路径

which goreman

/usr/local/go/bin/goreman

##编辑Procfile文件

cat >> Procfile << EOF

##Use goreman to run `go get github.com/mattn/goreman`

etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof

etcd2: etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof

etcd3: etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof

EOF

##查看当前监控端口

netstat -lnp|grep etcd

tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 32618/etcd

tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 32618/etcd

##启动多成员集群

goreman -f /root/Procfile start

##查看监控端口

netstat -lnp|grep etcd

tcp 0 0 127.0.0.1:22379 0.0.0.0:* LISTEN 53932/etcd

tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 32618/etcd

tcp 0 0 127.0.0.1:22380 0.0.0.0:* LISTEN 53932/etcd

tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 32618/etcd

tcp 0 0 127.0.0.1:32379 0.0.0.0:* LISTEN 53926/etcd

tcp 0 0 127.0.0.1:12379 0.0.0.0:* LISTEN 53925/etcd

tcp 0 0 127.0.0.1:32380 0.0.0.0:* LISTEN 53926/etcd

tcp 0 0 127.0.0.1:12380 0.0.0.0:* LISTEN 53925/etcd

说明:启动的成员各自在 localhost:12379, localhost:22379, 和 localhost:32379 上监听客户端请求。

##通过使用 etcdctl 来查看已经启动的集群

etcdctl --write-out=table --endpoints=localhost:12379 member list

d9f18decb20f0121ea88d307d7c2bc0e.png

etcd存取数据测试

##向其中以port写入数据

etcdctl --endpoints=localhost:12379 put name "my name is wtf"

OK

##用其port提取数据

etcdctl --endpoints=localhost:22379 get name

name

my name is wtf

etcdctl --endpoints=localhost:32379 get name

name

my name is wtf

etcd的容错性

##kill某个成员

goreman run stop etcd2

说明:

使用etcdctl --write-out=table --endpoints=localhost:12379 member list查看时,etcd2还在,但netstat -lnp|grep etcd监控的端口已经停掉了,使用ps -ef | grep etcd | grep 127.0.0.1:22379查看下ectd2的pid为空。

##put数据

etcdctl --endpoints=localhost:12379 put key hello

OK

##get数据

etcdctl --endpoints=localhost:12379 get key

hello

##试图从被杀掉的成员获取key

etcdctl --endpoints=localhost:22379 get key

报错:Error: dial tcp [::1]:22379: getsockopt: connection refused

##重启被杀掉的成员

goreman run restart etcd2

##从重启的成员获取key

etcdctl --endpoints=localhost:22379 get key

hello

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值