关于服务名

最简单的服务名
给定某个服务,比如passport。那么有一个域名 passport.srv 对应的 A 记录,就是 ip:port。对应 TXT 记录就可以是访问的用户名和密码这些信息。

分集群调度
passport.srv 这样的模型意味着所有人调过来,都是同样的一个 ip:port 的集合,都是同样的用户名和密码。如果要分集群调度,则需要添加caller

[caller].passport.srv

比如 idc1.passport.srv 和 idc2.passport.srv 这样给不同的 idc 就可以配置不同的 passport

注册 v.s. 发现
注册和发现是两个概念。注册代表我这个服务启动了。提供给其他人发现代表管理员认为这个服务已经good to go了。这个管理员也可以是某个自动化的检查程序。

published.passport.srv 和 staging.passport.srv 可以用于区分开来这两个概念

数据分片
和数据相关的服务意味着它们之间不能对等替换。不同的数据分片其实是不同的服务。比如

shard1.order.srv,shard2.order.srv 和 shard999.order.srv

master节点
master节点的特殊之处在于

一个时刻只能有一个master
master具有很强的时效性,主从切换了之后必须”立即“生效
所以一般认为DNS是不行的,服务注册和发现的管道是不行的,得用zookeeper才行。但是这是一个误区。master的传播其实不需要”立即“

master节点的正确使用方式是给master一个任期。这个任期可以是基于真实的时间的(要容忍时间同步偏差),也可以基于逻辑时间的(vector clock)。在给定任期内,master节点一旦被选举出来,就是不变的。master节点的变化只能体现在后面的任期里。因为如果master不能稳定保持一段时间,master自身的所有read-modify-write操作都是不安全的,因为读取出来了,然后失去了master,然后再写入就无法保证不和新的master发生冲突。

所以给master节点分配服务名,应该是

termxxx.master.db.srv

类似这样的格式。把任期或者租约加到服务名里。

gossip
服务发现就是一个广播消息的过程。无论是无状态的服务名,还是有状态的服务名都可以用服务发现广播出去。gossip就是一种更快的广播模型而已。比1对N直接拷贝要快。比多层级人工规划的拷贝路径要更健壮。

发表新评论