构建一个分布式操作系统的简单方案—答陈硕的“分布式系统中的进程标识”一文

时间:2021-11-27 14:24:32

 

 

对分布式系统中的进程标识”一文的疑问

     刚才看到陈硕先生的一篇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。”

1catuuidutime这些程序都要提供一个内嵌的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)

这样的keyvalue结构。

 

     这样就可以找到一个程序的所有进程,一个程序的所有有效 还可以定义多个类似的ListHashtable,方便管理和查询。

 

使用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内可以同时启动很多虚拟机。


     这些虚拟机供外部用户通过sshvnc等方式使用。假设我

们使用kvm,当然使用任何其hypervisor对于sshDos来说

都是一样的。


      因为我们这个是虚拟机集群,我假设我们使用了统一的分布式文件系统。


      如SANHFSCeph等分布式文件系统。这样,我们不需要把vmimg从一个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的命令。 ProxyNaming

Server上查询应该使用哪一个Host Server


       通过编写一个程序,我们可以知道vm内部每一个进程的资源使用情况。 编写一个VM内部运行的监控程序,然后通过kvm模拟的串口等
设备发送到Host上。
        这样Naming Server就可以通过ssh得到VM内部各个进程的运行情况。知道VM的操作系统是否运行正常,各个服务是否运行正常
       Vm内的一些服务是非常关键的,如sshServer,还有用户启动的服务器,如apachetomcat等。Naming Server都可以知道的一清二楚。
 
      你还可以使用sshDos分布式操作系统满足你的任意需求,因此sshDos是一个通用的分布式操作系统,而不是专用的分布式系统。
     

PS:       因为CSDN Blog的格式不好调整,因此我写了一份本文的PDF文档供大家下载《
构建一个分布式操作系统的简单方案1.2》,地址:http://download.csdn.net/source/3140753