Jump to Navigation

配置服务设计

背景

现在,一个完整的系统一般从设计上都是松耦合的,可能包含不同的子系统,并且子系统都可能是定制化开发的。像定制化开发的redis、beanstalkd这类服务,用于实现更好高可用等目标。还有可能开发的各种独立的队列worker程序。

虽然这些程序上有调度维护和管理,但其相关配置一般如果没有统一的方式,容易造成配置数据的混乱,出现多份配置的问题,配置不一致的问题,配置更新的非原子化,维护成本高等问题。

目标

配置服务用途比较多,有php层次的,有定制服务层次的,或者有完全自主开发的服务层次的。有些是一次读取,有些则需要运行时多次读取。需要对这些不同需求综合考虑,实现以下目标:

1、服务化的

2、可靠的

3、高效的

4、可扩展的

5、可维护的

6、易用的

7、一致性的

基于以上场景,根据需求,引入一种配置服务etcd模块,并在此模块为基础上,构建统一的配置服务系统,将在根本上改善有关配置数据的诸多问题。

Etcd是一种使用go语言实现的高效的分布式的配置服务,通过Raft分布式算法实现无主分布式服务。利用 etcd 的特性,应用程序可以在集群中共享信息、配置或作服务发现,etcd 会在集群的各个节点中复制这些数据并保证这些数据始终正确。

架构设计

etcd架构

Etcd存储部分自成一个分布式集群,集群内使用Raft算法自主选举主节点,保证数据的一致性。对外使用时,(虚)主节点透明,不需要应用层了解当前哪个是主节点,应用层使用更方便。

Etcd proxy作为透明代理,可以与应用部署在同一服务器,应用读取配置时访问本机代理服务端口即可。

应用层的写入需要与etcd存储集群直接连接,写入配置数据。这么设计的原因在于,一般配置信息的特点是写入次数非常少,并且一般需要通过配置管理工具写入配置,所以写入过程不再使用proxy模式。

配置数据实际存储在etcd集群的所有服务器上,通过自身分布式binlog相互同步,并且保证数据的一致性。

Etcd集群最大允许n-3个结点挂掉,仍旧能够支持集群的正常运转。这里不能最小保留两个节点,是由于2个节点在选举中无法形成有效多数派。

效率测试

单节点模式,测试环境为i3 CPU,SATA硬盘的笔记本:

写入QPS,可达到1000+/s。

读取QPS,可达6000-7000/s。

三节点模式

待测试

节点数与效率

待测试总结

优化

Etcd的存储使用磁盘,如果使用SSD,则能够进一步提高效率。

调整磁盘持久化刷新相关参数,会有些作用。

允许(暂时)非一致性读取,提高读取效率。

更多CPU核心数,能够有效提高效率。

不足探讨

参数太复杂,要简化。

通过hack其代码,简化掉需要本机ip的参数,或者指定一个绑定本机ip地址。

只有命令行管理,相对不直观。

可以实现一个简单的管理系统,如类似redisadmin这种,方便做一些查询或者快速手动修改。

读取优化。

当前etcd的读取可能使用了一致性保证机制,可以做进一步优化读取,改为弱一致性读取。甚至可以考虑配置在内存中缓存,读取时直接内存读取。

与同类服务比较

与etcd同类的项目主要有ZooKeeper,Doozer等。

其中又以ZooKeeper为主要代表,在此以ZooKeeper为例子说明一下两者的异同。

从功能上讲,两者侧重点不同。Zookeeper侧重的集群协调服务。Etcd更侧重配置分享与服务发现。

算法上,etcd 的Raft算法较Zookeeper的Paxos算法功能一样,但更简单,容易理解与实现。

从使用上,Zookeeper需要特定客户端,使用复杂。

综上所述,在用作配置服务时,etcd更合适。

应用示例

除了单节点模式,etcd最少需要3个节点,实现正常的集群内主节点选举。 以下以3个节点为例子,简要说明一下原装etcd的使用。

name en0 10.97.27.195:2375

en1 10.97.27.195:2377

en2 10.97.27.195:2379

en0:
./etcd -name en0 -initial-advertise-peer-urls http://10.97.27.195:2376 \
 -listen-peer-urls http://10.97.27.195:2376 \
  --advertise-client-urls http://10.97.27.195:2375 \
 -listen-client-urls http://10.97.27.195:2375 \
 -initial-cluster en0=http://10.97.27.195:2376,en1=http://10.97.27.195:2378,en2=http://10.97.27.195:2380 \
-initial-cluster-state new

en1:
./etcd -name en1 -initial-advertise-peer-urls http://10.97.27.195:2378 \
-listen-peer-urls http://10.97.27.195:2378 \
--advertise-client-urls http://10.97.27.195:2377 \
-listen-client-urls http://10.97.27.195:2377 \
-initial-cluster en0=http://10.97.27.195:2376,en1=http://10.97.27.195:2378,en2=http://10.97.27.195:2380 \
-initial-cluster-state new

en2:
./etcd -name en2 -initial-advertise-peer-urls http://10.97.27.195:2380 \
-listen-peer-urls http://10.97.27.195:2380 \
--advertise-client-urls http://10.97.27.195:2379 \
-listen-client-urls http://10.97.27.195:2379 \
-initial-cluster en0=http://10.97.27.195:2376,en1=http://10.97.27.195:2378,en2=http://10.97.27.195:2380 \
-initial-cluster-state new
Category:

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut