分享

Erlang集群节点集合的启动

 Foxmouse 2012-06-15
一、配置SSH客户端:无需密码的连接
1. SSH客户端RSA key授权
i). 生成SSH RSA key:
ssh-keygen -t rsa
全回车取缺省,将在~/.ssh目录下将生成id_rsa和id_rsa.pub俩文件

ii) 将生产的公共RSA key拷贝到目标机器上:
a).将id_rsa.pub文件拷贝到目标机器上:
scp ~/.ssh/id_rsa.pub userid@ssh2_server:id_rsa.pub

b). ssh登陆目标机器,在目标机器的~/.ssh目录下生成文件内容:
cat id_rsa.pub >>$HOME/.ssh/authorized_keys
删掉id_rsa.pub

以上两步命令可以用一条命令实现:
ssh-copy-id ssh2-server

本质上都是把master上生成的id_rsa.pub文件拷贝到slave机器./ssh目录下,同时改名为authorized_keys
这一步完成后,从master机器上登录slave机器直接
ssh slave
就行了,不用输入密码。

同样的,slave到master也得这样:不用输入密码直接ssh

集群内所有的机器相互之间都要这样实现无密码输入就能直接ssh

2. 在启动master节点的那个机器上,启动SSH-agent软件并添加你的用户ID
这样每次连接时就不需要passphrase了,办法是让ssh-agent记住你
i) 首先确认你的机器上有ssh-agent在运行(一般都没有)
ps aux|grep ssh-agent

查看ssh-agent运行在当前窗口管理器(或者shell)下
pstree

如果不是,在shell中创建一个ssh-agent会话:
ssh-agent screen
这回启动了一个带ssh-agent的screen会话窗口,以后这个screen控制台内的所有命令都要经过ssh-agent

ii) 添加你的ID
ssh-add

你可以查看当前ssh-agent中已添加的ID
ssh-add -l
也可以删除一个ID
ssh-add -d



3. 集群的路由进出
当建立集群后,经常需要访问作为网关(或者负载均衡器)的前端计算机。要访问其它节点,你需要告诉作为网管的机器将你的请求路由到机器节点中。

例如,假设你的网关是80.65.232.137。控制用的计算机在集群之外,这个机器是操作员用于控制集群的计算机。集群内部网络是192.0.0.0。在你的客户计算机上,启动命令:
route add -net 192.0.0.0 gw 80.65.232.137 netmask 255.255.255.0
这个命令需要确保网关计算机上IP forwarding 可用

要确保正确的路由,可以维护一个常用的/etc/hosts文件,该文件中记录了你的集群中的所有计算机,例子中,集群有7台计算机组成.
10.9.195.12   controler
80.65.232.137 gateway
192.0.0.11    eddieware
192.0.0.21    yaws1
192.0.0.22    yaws2
192.0.0.31    mnesia1
192.0.0.32    mnesia2

也可以设置DNS服务器,但对小网络来说/etc/hosts文件就已经足够了


二、启动Erlang master节点并建立Erlang集群
一旦通过SSH连接集群不再提示输入密码后建立一个Erlang集群将变得非常容易。

1. 启动Erlang master节点的模块:
Erlang代码  收藏代码
  1. -module(cluster).  
  2. -export([slaves/1]).  
  3.   
  4. %% Argument:  
  5. %% Hosts: List of hostname (string)  
  6. slaves([]) ->  
  7. ok;  
  8. slaves([Host|Hosts]) ->  
  9.   Args = erl_system_args(),  
  10.   NodeName = "cluster",  
  11.   {ok, Node} = slave:start_link(Host, NodeName, Args),  
  12.   io:format("Erlang node started = [~p]~n", [Node]),  
  13.   slaves(Hosts).  
  14.   
  15. erl_system_args()->  
  16.   Shared = case init:get_argument(shared) of  
  17.     error -> " ";  
  18.     {ok,[[]]} -> " -shared "  
  19.   end,  
  20.   lists:append(["-rsh ssh -setcookie ",  
  21.                 atom_to_list(erlang:get_cookie()),  
  22.                 Shared, " +Mea r10b "]).  
  23.   
  24. %% Do not forget to start erlang with a command like:  
  25. %% erl -rsh ssh -sname clustmaster  


启动master
Shell代码  收藏代码
  1. mremond@controler:~/cvs/cluster$ erl -rsh ssh -sname demo  
  2. Erlang (BEAM) emulator version 5.3 [source] [hipe]  
  3. Eshell V5.3 (abort with ^G)  
  4. (demo@controler)1> cluster:slaves(["gateway""yaws1""yaws2""mnesia1""mnesia2""eddieware"]).  
  5. Erlang node started = [cluster@gateway]  
  6. Erlang node started = [cluster@yaws1]  
  7. Erlang node started = [cluster@yaws2]  
  8. Erlang node started = [cluster@mnesia1]  
  9. Erlang node started = [cluster@mnesia2]  
  10. Erlang node started = [cluster@eddieware]  
  11. ok  


这里的要点是:集群间所有节点(至少是master对所有slave节点)之间都要能实现“相互”无密码输入的ssh登录

我想无密码输入的原理可能是:
机器A生成RSA key,有一个公开的密钥,别的机器B要想无密码ssh这同机器,B必须在本地拥有A的公开密钥
分享到:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多