对分布式系统中的进程标识”一文的疑问
刚才看到陈硕先生的一篇blog:“分布式系统中的进程标识”,地址:http://www.cnblogs.com/Solstice/archive/2011/03/29/1998412.html
我不同意该文的观点,因此在这里抛砖引玉,提出一个构建一个分布式系统的简单方案。
文中说:“正确做法:以四元组 ip:port:start_time:pid 作为分布式系统中进程的 gpid,其中 start_time 是 64-bit 整数,表示进程的启动时刻。”
第一个问题:没有port的进程怎么命名?
文中这样回答:“根据陈硕在《分布式系统的工程化开发方法》一文中的观点“在程序里内置 http 服务器”,分布式系统中的每个进程都应该提供一个管理接口,对外提供一个维修探查通道,可以查看进程的全部状态。这个管理接口就是一个 TCP server,它会侦听某个 port。”
1,cat,uuid,utime这些程序都要提供一个内嵌的http服务器?有必要吗?第三方程序你怎么该?
2, 我至今没有见过一个操作系统自动给所有进程提供http服务的。如果真的应该在每一个程序里内置http服务,那么肯定有操作系统会提供这种服务。
3, 如果程序提供http服务,那么程序的安全就会有疑问。http通讯很容易被拦截。http服务如果开着,那么攻击方可以不停测试用户名、密码,从而攻进操作系统。成为安全隐患。
第二个问题:time作为唯一的区分是否可靠?
如果操作系统的时间发生调整,那么有可能time会回到从前,从而可能导致多个进程有一个进程号。可能性虽小,但不能排除。
构建一个分布式系统的简单方案
给进程唯一命名
陈硕的“分布式系统中的进程标识”一文讲的就是怎样给进程唯一命名的问题。 前一节中,我已经证明了该文提出的方法是不正确的。 现在讲一下我怎么解决这个问题。
很简单,执行uuid命令,就会返回一个全球唯一的字符串。这已经在理论上证明是不可能重复的。Uuid已经在数据库,.NET等众多应用程序中广发使用。
我们可以这样建立一个结构体,来标示一个进程:
struct Process{
char[32] uuid,
int ip,//(其实计算机也应该定义一个struct,使用uuid唯一标示。这里为了说明简单,一切从简了)
int pid,//进程号
char * program,
int valid //进程是否还存在
};
然后建立一个hashtable:(char * programName, struct Process* processes)
这样的key,value结构。
这样就可以找到一个程序的所有进程,一个程序的所有有效 还可以定义多个类似的List和Hashtable,方便管理和查询。
使用ssh实现远程调用
使用ssh可以实现远程调用任意远程计算机上的程序和资源。ssh就是一个安全的shell程序,通过ssl安全协议访问远程计算机。
因此,使用ssh就可以构建一个简单、安全、有效的分布式计算系统!
使用SSH的优点还有:
1,不再需要程序提供远程访问的途径。如陈硕的方案就是需要每一个程序都内嵌一个http服务器。ssh不需要。而且它可以访问远程计算机上的所有程序。
2,提供了安全访问的机制。Ssh建立在ssl上非常安全。
3,提供了授权的机制。ssh使用操作系统的用户登录。这样就可以使用操作系统本身的用户授权实现任意的授权。ssh用户可以有自己的home文件夹,可以设置用户使用的内存数,硬盘数,可以创建的进程数量等等。不允许访问其他文件,不允许运行其他用户的程序等等诸多优点。
通过加上一个包括:计算机,用户,程序,进程等对象的数据库管理系统,就可以使用ssh实现一个简单、安全、灵活、高效的分布式计算系统!
架构设计
我给这个想法起个名字sshDos,如果有时间,把它实现出来。
sshDos,不是用于dos操作系统的软件,Dos是分布式操作系统的缩写。sshDos值的是使用ssh技术构建的分布式操作系统。
使用ssh构建分布式操作系统这个想法始于去年的某一天的顿悟。后来一直都没有实施。惭愧!
架构图
远程客户。 管理终端
网络-------------------------------------------
ProxyCluster ManagerCluster
| |. |
| Naming server. Cluster
| db cluster
server cluster
上图中网络内的部分就是sshDos分布式操作系统。
主要分为三个部分:
1,命名服务器部分,这是整个系统的大脑。它保存了proxyCluster和serverCluster中所有服务器的信息。
服务器和代理必须向命名服务器注册才能使用。
命名服务器的数据保存在数据库集群中。
命名服务器是无状态的服务器集群。 可以使用memcache集群缓存数据,提高性能。
命名服务器提供类rest的openapi向外提供服务。
ManagerCluster是web形势的管理服务器,使用命名服务器提供的服务。管理员可以通过它检测运行状况,注册服务器和代理,取消注册,授权访问等等。
2,ProxyCluster,它们接受远程客户请求,并向serverCluster发送命令的服务器。
ProxyCluster使用命名服务器提供的api服务,查找合适的server。然后使用ssh向server发起请求。
3,serverCluster,这是真正执行工作的集群。它们都安装了ssh服务器,从而proxy和naming server可以访问它。
Naming Server对他执行配置,管理和监控等任务。
Proxy。向它发起工作负载。
此架构设计的优点:
1,整个系统的所有模块都是集群,可以热插拔任意节点,没有单点失效的问题。
2,使用ssh--安全的shell,因此可以向server发起任何命令。
因此,sshDos是一个通用的分布式操作系统。
他不是单纯的分布式map-reduce系统,不是超级计算机,不是分布式存储系统。但它也同时可以是它们全部。
只需要编写几个shell脚本,或者程序,然后发送给proxy,它就可以实现任意分布式功能。
3,可以使用linux的用户授权机制,控制不同用户使用的资源和权限,实现细粒度的管理。
使用sshDos的例子
我是做虚拟化的,就以虚拟化为例,说明sshDos分布式操作系统在虚拟化方面的使用例子。
虚拟机集群管理系统
需求
比如说,我们有一个虚拟化的服务器集群,需要对它进行管理。
这样,在sshDos中,worker
Cluster就是一个个Host,每一个Host内可以同时启动很多虚拟机。
这些虚拟机供外部用户通过ssh,vnc等方式使用。假设我
们使用kvm,当然使用任何其他hypervisor对于sshDos来说
都是一样的。
因为我们这个是虚拟机集群,我假设我们使用了统一的分布式文件系统。
如SAN,HFS,Ceph等分布式文件系统。这样,我们不需要把vm的img从一个host迁移到另一个Host上。只需要迁移kvm命令行(死迁移)和内存状态(活迁移)。
实现
worker Cluster就是一个个Host。通过Naming Server提供的Web形式的注册接口,
我们可以向sshDos分布式操作系统中添加和移除Host Server。
Naming Server 通过ssh访问每一Host。然后定时执行Host上的top程序,查看系统
的CPU,内存使用率,查看每一个CPU的使用率,从而获得每一个Host的实时压力,存放到
数据库和memcache中。kvm虚拟机在Host内就是一个进程。通过查看kvm进程的资源使用
率,我们就知道了kvm虚拟机的资源占用情况。
远程管理程序通过proxy
server发起要求启动一个vm的命令。
Proxy到Naming
Server上查询应该使用哪一个Host Server。
通过编写一个程序,我们可以知道vm内部每一个进程的资源使用情况。
编写一个VM内部运行的监控程序,然后通过kvm模拟的串口等
设备发送到Host上。
这样Naming
Server就可以通过ssh得到VM内部各个进程的运行情况。知道VM的操作系统是否运行正常,各个服务是否运行正常。
Vm内的一些服务是非常关键的,如sshServer,还有用户启动的服务器,如apache,tomcat等。Naming
Server都可以知道的一清二楚。
你还可以使用sshDos分布式操作系统满足你的任意需求,因此sshDos是一个通用的分布式操作系统,而不是专用的分布式系统。
PS: 因为CSDN Blog的格式不好调整,因此我写了一份本文的PDF文档供大家下载《
构建一个分布式操作系统的简单方案1.2》,地址:http://download.csdn.net/source/3140753