可以将etcd用作可靠的数据库替代品吗?由于它是以持久方式分发和存储键/值对,因此它将是一个很好的替代nosql数据库.此外,它有一个很棒的API.有人可以解释为什么这不是一件事吗?
我得到的问题是etcd/consul/$试图解决的问题.服务消费者需要与服务提供商交谈,一个庞大流动的分布式系统需要一种机制来嫁给两者.
然而,"服务消费者在哪里满足他们的要求?"的问题.是旧的,IMO已经解决了MOM - 面向消息的中间件.
在MOM中,我们的想法是服务消费者并不关心服务提供商所在的位置.他们只是发送消息并让消息传递总线负责将消息路由到适当的消费者.可以有多个提供者都做同样的事情(基于队列的循环)或版本化的提供者(/ v1 /请求转到一个,/ v2 /请求转到另一个).
这是一个简单,强大的集成模式,它完全将服务接口与其实现分离.
然而,我看到了对发现服务提供商的这种奇怪的痴迷,这似乎在消费者和提供者之间创造了紧密的耦合(除了一些其他反模式之外).
那么,我在这里错过了什么?TIA.
我想找到一种方法将etcd集群部署为Docker Swarm服务,该服务将自动配置而无需任何交互.基本上,我想到了这个命令的精神:
docker service create --name etcd --replicas 3 my-custom-image/etcd
Run Code Online (Sandbox Code Playgroud)
我假设覆盖网络配置为安全并提供加密和身份验证,所以我相信我不需要TLS,甚至不需要--auto-tls.当这可以在另一层上解决时,不希望额外的头痛找到提供证书的方法.
我需要--name为每个实例都有一个唯一的,但是我可以从一个可以使用的入口点脚本中获得它export ETCD_NAME=$(hostname --short).
问题是,我坚持初始配置.根据聚类指南,有三个选项,但似乎都不适合:
etcd,我将获得节点容器的所有IP,但没有_etcd-server._tcp记录.ETCD_INITIAL_CLUSTER因为虽然我知道IP,但我不知道其他节点的名称,我不知道有任何方法可以解决这些问题.(我不打算将Docker API套接字暴露给etcd容器.)docker-compose.yml,它就会自动做正确的事情,没有问题就是这样".有什么技巧可以拉吗?
我打算将Spring Boot用于我的任务.它是一个连接数据库的典型服务器应用程序.我知道我可以使用Spring Configuration外部化我的属性,例如数据库连接细节.但我还有其他需要在运行时更新的动态属性.例如鳍状肢/特征标志.我的应用程序的某些功能需要动态控制,例如想象app.cool-feature.enable = true之类的属性,然后在一段时间后app.cool-feature.enable = false关闭相同的功能
有什么建议在运行时采集这种动态行为的最佳做法是什么?我可以想到以下选项来触发变更......
我知道我可以编写我自己的自定义代码来实现这个(这将是第三次),但只是想知道是否已经有我不知道的动态属性配置的标准方法/常见做法.如果它可以与Apache ZooKeeper,coreos etcd,Netflix策展人等其他解决方案一起使用并且与Spring紧密集成,那将会很棒.
思考?
我一直在玩,docker-compose并从码头中心网站拼凑了一个项目.
我想到的一件事就是我如何扩展个别服务(通过添加更多实例)并让现有实例以某种方式了解这些新实例.
例如,规范docker-compose示例包括以下群集:
我创建了集群,一切正常,但我尝试将另一个节点添加到集群:
$ docker-compose scale web=2
Creating and starting 2 ... done
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e83f6ed94546 packetops/web:latest "/bin/sh -c 'python /" 6 minutes ago Up About a minute 80/tcp swarm-slave/1_web_2
40e01a615a2f tutum/haproxy "python /haproxy/main" 7 minutes ago Up About a minute 443/tcp, 1936/tcp, 172.16.186.165:80->80/tcp swarm-slave/1_lb_1
f16357a28ac4 packetops/web:latest "/bin/sh -c 'python /" 7 minutes ago Up About a minute 80/tcp swarm-slave/1_lb_1/1_web_1,swarm-slave/1_lb_1/web,swarm-slave/1_lb_1/web_1,swarm-slave/1_web_1
8dd59686e7be redis "/entrypoint.sh …Run Code Online (Sandbox Code Playgroud) 现在我们构建一个实时分析系统,它应该是高度分布式的.我们计划使用分布式锁和计数器来确保数据的一致性,我们需要一种分布式映射来了解哪个客户端连接到哪个服务器.我之前没有分布式系统的经验,但我认为我们有两个选择:
Java的+ Hazelcast
Golang + ETCD
但是在主题背景下彼此的利弊是什么?
我有两个服务A和B.
A在启动时设置etcd中的值,比如它从环境文件中获取的公共IP地址:
ExecStartPost=/usr/bin/etcdctl set /A_ADDR $COREOS_PUBLIC_IPV4
Run Code Online (Sandbox Code Playgroud)
B在启动时需要该值,以及它自己的IP地址.所以这样的事情会很好:
ExecStart=/usr/bin/docker run -e MY_ADDR=$COREOS_PUBLIC_IPV4 -e A_ADDR=$ETCD_A_ADDR mikedewar/B
Run Code Online (Sandbox Code Playgroud)
但这显然是不可能的,因为etcd变量不会像这样的systemd环境变量.相反,我可以做一些/usr/bin/bash -c 'run stuff'我的,ExecStart但它很尴尬,特别是因为我需要systemd扩展$COREOS_PUBLIC_IPV4和我的新bash shell扩展$(etcdctl get /A_ADDR).它也充满了代码味道,让我觉得我错过了一些重要的东西.
有人能告诉我从etcd获取值到我ExecStart声明中的"正确"方法吗?
- 更新
所以我一直在运行
ExecStart=/usr/bin/bash -c 'source /etc/environment && /usr/bin/docker run -e A_ADDR=$(/usr/bin/etcdctl get /A_ADDR) -e MY_ADDR=$COREOS_PUBLIC_IPV4 mikedewar/B'
Run Code Online (Sandbox Code Playgroud)
但它很难看.还是不敢相信我没有错过什么..
跨多个数据中心使用etcd是否安全?因为它将etcd端口暴露给公共互联网.在这种情况下我是否必须使用客户端证书或者etcd有某种授权?
我正在按照本教程进行服务发现http://jasonwilder.com/blog/2014/07/15/docker-service-discovery
简述:
我创建了一个运行在xyzd:4001的etcd主机
docker run -d --name etcd -p 4001:4001 -p 7001:7001 coreos/etcd
Run Code Online (Sandbox Code Playgroud)
在backend_serverip:8000和docker-register创建了一个运行容器的后端服务器
$ docker run -d -p 8000:8000 --name whoami -t jwilder/whoami
$ docker run --name docker-register -d -e HOST_IP=$(hostname --all-ip-addresses | awk '{print $1}') -e ETCD_HOST=x.y.z.d:4001 -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register
Run Code Online (Sandbox Code Playgroud)
在backend2_serverip:8000和docker-register创建了另一个运行容器的后端服务器
$ docker run -d -p 8000:8000 --name whoami -t jwilder/whoami
$ docker run --name docker-register -d -e HOST_IP=$(hostname --all-ip-addresses | awk '{print $1}') -e ETCD_HOST=x.y.z.d:4001 -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register
Run Code Online (Sandbox Code Playgroud)
创建了一个运行docker-discover和ubuntu映像的客户端
$ docker run -d --net …Run Code Online (Sandbox Code Playgroud) 我在我的ubuntu 16.04机器上安装了minikube并启动了一个集群,并附带一条消息
"Kubernetes is available at https://192.168.99.100:443"
接下来,我使用以下命令部署了nginx服务
> kubectl.sh run my-nginx --image=nginx --replicas=2 --port=80 --expose
> kubectl.sh get pods -o wide
NAME READY STATUS RESTARTS AGE NODE
my-nginx-2494149703-8jnh4 1/1 Running 0 13m 127.0.0.1
my-nginx-2494149703-q09be 1/1 Running 0 13m 127.0.0.1
> kubectl.sh get services -o wide
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes 10.0.0.1 <none> 443/TCP 14m <none>
my-nginx 10.0.0.83 <none> 80/TCP 13m run=my-nginx
> kubectl.sh get nodes -o wide
NAME STATUS AGE
127.0.0.1 Ready 16m
Run Code Online (Sandbox Code Playgroud)
问题:
1)节点127.0.0.1是我的本地开发机器吗?这让我最困惑.
2)以下理解是否正确:集群(节点,kubernetes API服务器)具有10.0.0.x中的内部IP地址,其对应的外部IP地址为192.168.99.x. …
etcd ×10
docker ×4
coreos ×3
java ×2
kubernetes ×2
consul ×1
database ×1
deployment ×1
distributed ×1
docker-swarm ×1
flannel ×1
go ×1
hazelcast ×1
mom ×1
nosql ×1
registry ×1
service ×1
spring ×1
spring-boot ×1
systemd ×1