配置服务设计
背景
现在,一个完整的系统一般从设计上都是松耦合的,可能包含不同的子系统,并且子系统都可能是定制化开发的。像定制化开发的redis、beanstalkd这类服务,用于实现更好高可用等目标。还有可能开发的各种独立的队列worker程序。
虽然这些程序上有调度维护和管理,但其相关配置一般如果没有统一的方式,容易造成配置数据的混乱,出现多份配置的问题,配置不一致的问题,配置更新的非原子化,维护成本高等问题。
目标
配置服务用途比较多,有php层次的,有定制服务层次的,或者有完全自主开发的服务层次的。有些是一次读取,有些则需要运行时多次读取。需要对这些不同需求综合考虑,实现以下目标:
1、服务化的
2、可靠的
3、高效的
4、可扩展的
5、可维护的
6、易用的
7、一致性的
基于以上场景,根据需求,引入一种配置服务etcd模块,并在此模块为基础上,构建统一的配置服务系统,将在根本上改善有关配置数据的诸多问题。
Etcd是一种使用go语言实现的高效的分布式的配置服务,通过Raft分布式算法实现无主分布式服务。利用 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
- 浏览 1485 次
添加新评论