iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Docker自发现注册服务基础etcd的部署及使用方法
  • 652
分享到

Docker自发现注册服务基础etcd的部署及使用方法

2023-06-19 10:06:18 652人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关Docker自发现注册服务基础etcd的部署及使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 背景自发现服务基础需要一个高可用键值存储系统, 很容易联想到re

这期内容当中小编将会给大家带来有关Docker自发现注册服务基础etcd的部署及使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1. 背景

自发现服务基础需要一个高可用键值存储系统, 很容易联想到redis, memcached等KV内存数据库, 但是我最后选择了etcd, 主要是因为他天生就是为集群化而设计的, 并且生来就是用作conf的节点数据同步.

1) etcd为coreos的一个基础部件, 也是用于保存配置信息, 在这里我们主要讨论非coreos系统的etcd部署及使用

2) 目前etcd最新版本为: v2.3.6, 测试版为: v3.x, 我们基于v2版本进行演练

2. 注意

我的所有docker镜像都是基于alpine 3.x版本进行构建, 如果需要其他版本请自行修改

3. 准备

1) etcd官方地址

https://GitHub.com/coreos/etcd

2) linux最新版本下载地址

Https://github.com/coreos/etcd/releases/download/v2.3.6/etcd-v2.3.6-linux-amd64.tar.gz

3) 构建基于alpine的etcd docker镜像

FROM alpine:3.3MaiNTAINER Etcd Maintainers "kekuer@gmail.com"RUN ETCD_VER=2.3.6 && \   echo "http://127.0.0.1:8098/main" > /etc/apk/repositories && \  apk --update add curl && \  mkdir src && \  cd src && \  curl -O http://127.0.0.1:8080/etcd-v${ETCD_VER}-linux-amd64.tar.gz && \  tar xzvf etcd-v${ETCD_VER}-linux-amd64.tar.gz && \cd etcd-v${ETCD_VER}-linux-amd64 && \cp etcd etcdctl /usr/bin/ && \apk --update del curl && \rm -rf /var/cache/apk/* /srcENTRYPOINT ["/usr/bin/etcd"]

注意:  
根据自己的alpine 镜像地址修改repository地址, 构建自己的alpine本地镜像, 请参考我的另外一篇文章: Alpine Linux Repository本地镜像制作

我在这里做了一个文件池, 放在一台服务器上, 如果你们相应的文件池服务器, 修改etcd下载地址为: https://github.com/coreos/etcd/releases/download/v${ETCD_VER}/etcd-v${ETCD_VER}-linux-amd64.tar.gz

4. 概念

1) 静态配置和自发现

a) 静态配置: 通过initial-cluster启动参量来启动etcd服务, 用于已经预知集群地址

-initial-cluster infra0=http://172.0.1.10:2380,http://172.0.1.11:2380,infra2=http://172.0.1.12:2380 \-initial-cluster-state new

或者使用环境变量

ETCD_INITIAL_CLUSTER="infra0=http://172.0.1.10:2380,infra1=http://172.0.1.11:2380,infra2=http://172.0.1.12:2380"ETCD_INITIAL_CLUSTER_STATE=new

b) 自发现模式: 通过指定discovery发现服务token地址来自动配置集群服务

可以使用官方地址: https://discovery.etcd.io/new?size=3, 当然在国内最好还是自己构建一个etcd-discovery服务, 使用之前构建的etcd镜像, 跑一个docker container, 并放开discovery端口, 我这里使用的是80端口, container内部端口是2379

docker run --name etcd-discovery -d --restart=always --log-opt max-size=100m -p 80:2379 -v /docker/mount/etcd-discovery/:/etcd funwun.io/etcd:1.4 \  -data-dir /etcd \ -snapshot-count=100 \  -listen-client-urls http://0.0.0.0:2379 \  -advertise-client-urls http://0.0.0.0:2379

注意:
recover etcd数据是一件比较繁琐的事情, 所以尽量把data挂载到host上, 如果是EC2的话, 最好是重新挂载一个EBS来作为所有docker的挂载盘 (我的习惯, 你们也可以提出自己的意见和建议)

snapshot-count的改小, 是因为我的机器都是1G内存的轻量host, 所以我要保证内存的使用情况


2) etcd节点

由于etcd采用Raft算法, 因此在做决策时需要多数节点的投票, 所以一般部署为奇数节点: 3, 5, 7

3) etcd四个主要概念

a) listen-peer-urls

用于节点与节点之间数据交换, 因此需要监听在其他节点可以访问的IP地址上

默认端口为: 2380 & 7001 (7001不推荐使用, 已基本废弃, 主要用于兼容老服务)

b) listen-client-urls

用户客户机访问etcd数据, 一般监听在本地, 如果需要集中管理, 可以监听在管理服务器可以访问的IP地址上

默认端口为: 2379 & 4001 (4001不推荐使用, 已基本废弃, 主要用于兼容老服务)

c) initial-advertise-peer-urls

该参数表示节点监听其他节点同步信号的地址

默认端口为: 2380 & 7001 (7001不推荐使用, 已基本废弃, 主要用于兼容老服务)

d) advertise-client-urls

在加入proxy节点后, 会使用该广播地址, 因此需要监听在一个proxy节点可以访问的IP地址上

默认端口为: 2379 & 4001 (4001不推荐使用, 已基本废弃, 主要用于兼容老服务)

5. 使用

1) 创建一个discovery服务配置信息

TOKEN=test-1curl -X PUT http://127.0.0.1/v2/keys/discovery/${TOKEN}/_config/size -d value=3

在这里, 我们使用的是test-1作为token, 你可以UUID一个来作为token

注意:
生产环境请注意该名称, 我不建议使用UUID来做token, 因为语义不明, 最好起一个自己能记住的名称, 方便以后辨识

2) 在3个节点服务器上分别启动etcd服务

a) 获取本地IP (此为举例, 我使用EC2, 因此以下shell已经足够, 如果网络配置较复杂的服务器上, 根据自行条件获取对应的对外IP)

IP=$(hostname --all-ip-addresses | awk '{print $1}') && echo $IP

b) 在3个服务器上启动etcd节点

docker run --name etcd -d --log-opt max-size=100m -p 2379:2379 -p 2380:2380 -v /docker/mount/etcd:/etcd funwun.io/etcd:1.4 \ -name ${IP} \ -data-dir /etcd \ -snapshot-count=1000 \ -listen-client-urls http://0.0.0.0:2379 \ -advertise-client-urls http://${IP}:2379 \ -listen-peer-urls http://0.0.0.0:2380 \ -initial-advertise-peer-urls http://${IP}:2380 \ -discovery http://172.0.0.1/v2/keys/discovery/test-1

c) 在集群初始化为3个节点的话, 必须凑齐3个节点, 服务才能正常运行, 超出部分将启动为proxy节点, 因此在第4个服务器上, 我们应该将节点启动为proxy

docker run --name etcd -d --log-opt max-size=100m --net=host -v /docker/mount/etcd:/etcd funwun.io/etcd:1.4 \ -name ${IP} \ -data-dir /etcd \ -snapshot-count=1000 \ --proxy on \ -listen-client-urls http://0.0.0.0:2379 \ -discovery http://172.31.16.100/v2/keys/discovery/test-1

注意:
name必须是唯一的, etcd是用这个来确定节点的, 如果使用--initial-cluster, 我们还会使用该名称作为集群的节点名称 (一般使用节点IP来作为名称, 你也可以使用hostname)

discovery地址修改为你的discovery服务地址

上述就是小编为大家分享的Docker自发现注册服务基础etcd的部署及使用方法了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Docker自发现注册服务基础etcd的部署及使用方法

本文链接: https://www.lsjlt.com/news/295426.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作