分布式系统中的进程标识

昨天跟朋友聊天,谈到了分布式系统中如何为进程取标识符(process identifier),写篇博客简单总结一下我的观点:以四元组 ip:port:start_time:pid 作为分布式系统中进程的全局唯一标识符(gpid)
摘要由CSDN通过智能技术生成

陈硕 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

昨天跟朋友聊天,谈到了分布式系统中如何为进程取标识符(process identifier),写篇博客简单总结一下我的观点。

本文假定一台机器 (host) 只有一个 IP,不考虑 multihome 的情况。同时假定分布式系统中的每一台机器都正确运行了 NTP,各台机器的时间大体同步。

“进程 process”是操作系统的两大基本概念之一,指的是在内存中运行的程序。在日常交流中,“进程”这个词通常不止这一个意思。有时候我们会说 “httpd 进程”或者“mysqld 进程”,指的其实是 program,而不一定是特指某一个“进程”——某一次 fork() 系统调用的产物。一个“httpd 进程”重启了,它还是“一个 httpd 进程”。本文讨论的是,如何为一个程序每次运行 的进程取一个唯一标识符。也就是说,httpd 程序第一次运行,进程是 httpd_1,它原地重启了,进程是 httpd_2。

本文所指的“进程标识符”是用来唯一标识一个程序的“一次运行”的。每次启动一个进程,这个进程应该被赋予一个唯一的标识符,与当前正在运行的所有进程都不同;不仅如此,它应该与历史上曾经运行过,目前已消亡的进程也都不同(这两条的直接推论是,与将来可能运行的进程也都不同)。“为每个进程命名”在分布式系统中有相当大的实际意义,特别是在考虑 failover 的时候。因为一个程序重启之后的新进程和它的“前世进程”的状态通常不一样,凡是与它打交道的其他进程(s)最好能通过它的进程标识符变更来很容易地判断该程序已经重启,而采取必要的救灾措施,防止搭错话。

 

本文先假定每个服务端程序的端口是静态分配的,在公司内部有一个公用 wiki 来记录端口和程序的对应关系(然后通过 NIS 或 DNS 发布)。比如端口 11211 始终对应 memcached,其他程序不会使用 11211 端口;3306 始终留给 mysqld;3690 始终留给 svnserve。在分布式系统的初级阶段,这是通常的做法;到了高级阶段,多半会用动态分配端口号,因为端口号只有 6 万多个,是稀缺资源,在公司内部也有分配完的一天。本文只考虑 TCP 协议,不考虑 U

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值