﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ivaneeo's blog-随笔分类-erlang-分布式语言</title><link>http://blogjava.net/ivanwan/category/36393.html</link><description>自由的力量，自由的生活。</description><language>zh-cn</language><lastBuildDate>Sat, 05 Apr 2014 04:49:57 GMT</lastBuildDate><pubDate>Sat, 05 Apr 2014 04:49:57 GMT</pubDate><ttl>60</ttl><item><title>RabbitMQ 3.3.0远程guest能访问</title><link>http://www.blogjava.net/ivanwan/archive/2014/04/04/411974.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Fri, 04 Apr 2014 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2014/04/04/411974.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/411974.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2014/04/04/411974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/411974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/411974.html</trackback:ping><description><![CDATA[<div>/etc/rabbitmq.conf:<br /><br />[</div><div>&nbsp; &nbsp; {rabbit, [{loopback_users, []}]}</div><div>].</div><img src ="http://www.blogjava.net/ivanwan/aggbug/411974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2014-04-04 21:28 <a href="http://www.blogjava.net/ivanwan/archive/2014/04/04/411974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Starting a set of Erlang cluster nodes </title><link>http://www.blogjava.net/ivanwan/archive/2011/03/18/346552.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Fri, 18 Mar 2011 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2011/03/18/346552.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/346552.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2011/03/18/346552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/346552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/346552.html</trackback:ping><description><![CDATA[<p>This tutorial explains how to configure your cluster computers to easily start a set of Erlang nodes on every machine through SSH. It shows how to use the slave module to start Erlang nodes that are linked to a main controler.</p>
<h2><a name="StartingasetofErlangclusternodes-ConfiguringSSHservers"></a>Configuring SSH servers</h2>
<p>SSH server is generally properly installed and configured by Linux distributions, if you ask for SSH server installation. The SSH server is sometime called sshd, standing for SSH deamon.</p>
<p>You need to have SSH servers running on all your cluster nodes.</p>
<h2><a name="StartingasetofErlangclusternodes-ConfiguringyourSSHclient%3Aconnectionwithoutpassword"></a>Configuring your SSH client: connection without password</h2>
<h3><a name="StartingasetofErlangclusternodes-SSHclientRSAkeyauthentification"></a>SSH client RSA key authentification</h3>
<p>To be able to manage your cluster as a whole, you need to set up your SSH access to the cluster nodes so that you can log into them without being prompt for a password or passphrase. Here are the needed steps to configure your SSH client and server to use RSA key for authentification. You only need to do this procedure once, for each client/server.</p>
<ol>
    <li>Generate an SSH RSA key, if you do not already have one:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">ssh-keygen -t rsa
    </pre>
    </div>
    </div>
    </li>
    <li>Copy the id_rsa.pub file to the target machine:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">scp .ssh/id_rsa.pub userid@ssh2-server:id_rsa.pub
    </pre>
    </div>
    </div>
    </li>
    <li>Connect through SSH on the server:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">ssh userid@ssh2-server
    </pre>
    </div>
    </div>
    </li>
    <li>Create a .ssh directory in the user home directory (if necessary):
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">mkdir .ssh
    </pre>
    </div>
    </div>
    </li>
    <li>Copy the contents of the id_rsa.pub file to the authorization file for protocol 2 connections:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">cat id_rsa.pub &gt;&gt;$HOME/.ssh/authorized_keys
    </pre>
    </div>
    </div>
    </li>
    <li>Remove the id_rsa.pub file:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">rm $HOME/id_rsa.pub
    </pre>
    </div>
    </div>
    <p>Alternatively, you can use the command ssh-copy-id ssh2-server, if it is available on your computer, to replace step 2 to 6. ssh-copy-id is for example available on Linux Mandrake and Debian distributions.</p>
    </li>
</ol>
<h3><a name="StartingasetofErlangclusternodes-AddingyouridentitytotheSSHagentsoftware"></a>Adding your identity to the SSH-agent software</h3>
<p>After the previous step, you will be prompted for the passphrase of your RSA key each time you are initialising a connection. To avoid typing the passphrase many time, you can add your identity to a program called ssh-agent that will keep your passphrase for the work session duration. Use of the SSH protocol will thus be simplified:</p>
<ol>
    <li>Ensure a program called ssh-agent is running. Type:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">ps aux | grep ssh-agent
    </pre>
    </div>
    </div>
    <p>to check if ssh-agent is running under your userid. Type:</p>
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">pstree
    </pre>
    </div>
    </div>
    <p>to check that ssh-agent is linked to your current window manager session or shell process.</p>
    </li>
    <li>If ssh-agent is not started, you can create an ssh-agent session in the shell with, for example, the screen program:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">ssh-agent screen
    </pre>
    </div>
    </div>
    <p>After this command, SSH actions typed into the screen console will be handle through the ssh-agent.</p>
    </li>
    <li>Add your identity to the agent:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">ssh-add
    </pre>
    </div>
    </div>
    <p>Type your passphrase when prompted.</p>
    </li>
    <li>You can list the identity that have been added into the running ssh-agent:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">ssh-add -l
    </pre>
    </div>
    </div>
    </li>
    <li>You can remove an identity from the ssh-agent with:
    <div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
    <div class="codeContent panelContent">
    <pre class="code-none">ssh-add -d
    </pre>
    </div>
    </div>
    </li>
</ol>
<p>Please consult ssh-add manual for more options (identity lifetime, agent locking, ...)</p>
<h2><a name="StartingasetofErlangclusternodes-Routingtoandfromthecluster"></a>Routing to and from the cluster</h2>
<p>When setting up clusters, you can often only access the gateway/load balancer front computer. To access the other node, you need to tell the gateway machine to route your requests to the cluster nodes.</p>
<p>To take an example, suppose your gateway to the cluster is 80.65.232.137. The controler machine is a computer outside the cluster. This is computer where the operator is controling the cluster behaviour. Your cluster internal adresses form the following network: 192.0.0.0. On your client computer, launch the command:</p>
<div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
<div class="codeContent panelContent">
<pre class="code-none">route add -net 192.0.0.0 gw 80.65.232.137 netmask 255.255.255.0
</pre>
</div>
</div>
<div class="panelMacro">
<table class="noteMacro">
    <colgroup>
    <col width="24">
    <col></colgroup>
    <tbody>
        <tr>
            <td valign="top"><img border="0" alt="" align="absMiddle" src="/doc/images/icons/emoticons/warning.gif" width="16" height="16" /></td>
            <td>This will only works if IP forwarding is activated on the gateway computer.</td>
        </tr>
    </tbody>
</table>
</div>
<p>To ensure proper routing, you can maintain an common /etc/hosts file with entries for all computers in your cluster. In our example, with a seven-computers cluster, the file /etc/hosts could look like:</p>
<div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
<div class="codeContent panelContent">
<pre class="code-none">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
</pre>
</div>
</div>
<p>You could also add a DNS server, but for relatively small cluster, it is probably easier to manage an /etc/hosts file.</p>
<h2><a name="StartingasetofErlangclusternodes-StartingErlangnodesandsettinguptheErlangcluster"></a>Starting Erlang nodes and setting up the Erlang cluster</h2>
<p>Starting a whole Erlang cluster can be done very easily once you can connect with SSH to all cluster node without being prompt for a password.</p>
<h3><a name="StartingasetofErlangclusternodes-StartingtheErlangmasternode"></a>Starting the Erlang master node</h3>
<p>Erlang needs to be started with the -rsh ssh parameters to use ssh connection to the target nodes within the slave command, instead of rsh connection. It also need to be started with network enable with the -sname node parameter.</p>
<p>Here is an example Erlang command to start the Erlang master node:</p>
<div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
<div class="codeContent panelContent">
<pre class="code-none">erl -rsh ssh -sname clustmaster
</pre>
</div>
</div>
<p>Be carefull, your master node short name has to be sufficent to route from the slave nodes in the cluster to your master node. The slave:start timeout if it cannot connect back from the slave to your master node.</p>
<h3><a name="StartingasetofErlangclusternodes-Startingtheslavenodes%28cluster%29"></a>Starting the slave nodes (cluster)</h3>
<p>The custom function cluster:slaves/1 is a wrapper to the Erlang slave function. It allows to easily start a set of Erlang node on target hosts with the same cookie.</p>
<div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
<div class="codeContent panelContent">
<pre class="code-none">-module(cluster).
-export([slaves/1]).
%% Argument:
%% Hosts: List of hostname (string)
slaves([]) -&gt;
ok;
slaves([Host|Hosts]) -&gt;
Args = erl_system_args(),
NodeName = "cluster",
{ok, Node} = slave:start_link(Host, NodeName, Args),
io:format("Erlang node started = [~p]~n", [Node]),
slaves(Hosts).
erl_system_args()-&gt;
Shared = case init:get_argument(shared) of
error -&gt; " ";
{ok,[[]]} -&gt; " -shared "
end,
lists:append(["-rsh ssh -setcookie",
atom_to_list(erlang:get_cookie()),
Shared, " +Mea r10b "]).
%% Do not forget to start erlang with a command like:
%% erl -rsh ssh -sname clustmaster
</pre>
</div>
</div>
<p>Here is a sample session:</p>
<div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
<div class="codeContent panelContent">
<pre class="code-none">mremond@controler:~/cvs/cluster$ erl -rsh ssh -sname demo
Erlang (BEAM) emulator version 5.3 [source] [hipe]
Eshell V5.3 (abort with ^G)
(demo@controler)1&gt; cluster:slaves(["gateway", "yaws1", "yaws2", "mnesia1", "mnesia2", "eddieware"]).
Erlang node started = [cluster@gateway]
Erlang node started = [cluster@yaws1]
Erlang node started = [cluster@yaws2]
Erlang node started = [cluster@mnesia1]
Erlang node started = [cluster@mnesia2]
Erlang node started = [cluster@eddieware]
ok
</pre>
</div>
</div>
<p>The order of the nodes in the cluster:slaves/1 list parameter does not matter.</p>
<p>You can check the list of known nodes:</p>
<div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
<div class="codeContent panelContent">
<pre class="code-none">(demo@controler)2&gt; nodes().
[cluster@gateway,
cluster@yaws1,
cluster@yaws2,
cluster@mnesia1,
cluster@mnesia2,
cluster@eddieware]
</pre>
</div>
</div>
<p>And you can start executing code on cluster nodes:</p>
<div style="border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px" class="code panel">
<div class="codeContent panelContent">
<pre class="code-none">(demo@controler)3&gt; rpc:multicall(nodes(), io, format, ["Hello world!~n", []]).
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
{[ok,ok,ok,ok,ok,ok],[]}
</pre>
</div>
</div>
<div class="panelMacro">
<table class="noteMacro">
    <colgroup>
    <col width="24">
    <col></colgroup>
    <tbody>
        <tr>
            <td valign="top"><img border="0" alt="" align="absMiddle" src="/doc/images/icons/emoticons/warning.gif" width="16" height="16" /></td>
            <td>If you have trouble with slave start, you can uncomment the line:<br />
            %%io:format("Command: ~s~n", [Cmd])<br />
            before the open_port instruction:<br />
            open_port({spawn, Cmd}, [stream]),<br />
            in the slave:wait_for_slave/7 function.</td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/ivanwan/aggbug/346552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2011-03-18 17:09 <a href="http://www.blogjava.net/ivanwan/archive/2011/03/18/346552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Erlang的Unicode支持</title><link>http://www.blogjava.net/ivanwan/archive/2009/10/28/300065.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Wed, 28 Oct 2009 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2009/10/28/300065.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/300065.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2009/10/28/300065.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/300065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/300065.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 勤奋的&nbsp;litaocheng&nbsp;同学，在每日超负荷的加班工作之余，仍然刻苦学习笔耕不辍，为我们不断带来劲爆文章，这一篇《Erlang的Unicode支持》为我们介绍了 R13 的最新特性，也是最被大家期望的特性——内置的 Unicode 支持。废话少说，直接上正文。在R13A中， Erlang加入了对Unicode的支持。本文涉及到的数据类型包括：list, binary， ...&nbsp;&nbsp;<a href='http://www.blogjava.net/ivanwan/archive/2009/10/28/300065.html'>阅读全文</a><img src ="http://www.blogjava.net/ivanwan/aggbug/300065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2009-10-28 15:19 <a href="http://www.blogjava.net/ivanwan/archive/2009/10/28/300065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】erlang 网络调优实战</title><link>http://www.blogjava.net/ivanwan/archive/2009/10/27/299927.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 27 Oct 2009 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2009/10/27/299927.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/299927.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2009/10/27/299927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/299927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/299927.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前些天给echo_server写了个非常简单的连接压力测试程序,下载:&nbsp;stress_test.erl    -module(stress_test).&nbsp;    &nbsp;    -export([start/0,&nbsp;tests/1]).&nbsp;    &nbsp;    start()&nbsp;-&gt;&nbsp;    ...&nbsp;&nbsp;<a href='http://www.blogjava.net/ivanwan/archive/2009/10/27/299927.html'>阅读全文</a><img src ="http://www.blogjava.net/ivanwan/aggbug/299927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2009-10-27 15:49 <a href="http://www.blogjava.net/ivanwan/archive/2009/10/27/299927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unit Test in Erlang</title><link>http://www.blogjava.net/ivanwan/archive/2009/10/27/299926.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 27 Oct 2009 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2009/10/27/299926.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/299926.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2009/10/27/299926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/299926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/299926.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Erlang被称作是&#8220;工业级的语言&#8221;，在测试领域，理应是有相当成熟度的。而，Joe老先生本人，也是崇尚&#8220;拿测试结果说话&#8221;的人（在《Programming Erlang》书中，上来就搞测试，然后再开讲的例子比比皆是）。就连 Erlang/OTP 本身的代码质量也是有严密的测试作为保障的。所以，如果在Erlang领域，你见到远比其他语言为多的测试相关工具...&nbsp;&nbsp;<a href='http://www.blogjava.net/ivanwan/archive/2009/10/27/299926.html'>阅读全文</a><img src ="http://www.blogjava.net/ivanwan/aggbug/299926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2009-10-27 15:48 <a href="http://www.blogjava.net/ivanwan/archive/2009/10/27/299926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Erlang: Let’s talk to java</title><link>http://www.blogjava.net/ivanwan/archive/2009/10/27/299924.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 27 Oct 2009 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2009/10/27/299924.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/299924.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2009/10/27/299924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/299924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/299924.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 试了一下传说中的 JInterface ，使用 OtpErlang.jar 的整个过程其实非常简单，似乎比 JMS 的程序都简单。首先，我们要用 java 实现的原始 erlang 程序如下，没错，就是巨简单的 echo ，我们的目标是要把它用 java 来改写，不仅写服务端，也要写客户端。下载:&nbsp;echo_client.erl    -module(echo_c...&nbsp;&nbsp;<a href='http://www.blogjava.net/ivanwan/archive/2009/10/27/299924.html'>阅读全文</a><img src ="http://www.blogjava.net/ivanwan/aggbug/299924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2009-10-27 15:46 <a href="http://www.blogjava.net/ivanwan/archive/2009/10/27/299924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>