Erlang分布式环境下注册名与调用方法

Erlang分布式环境下注册名与调用方法

在分布式环境下进行远程调用
标准的OTP模型是使用global参数注册server名,使用global参数进行调用

global注册时会将信息注册到kernel.global模块中.global模块会在分布式系统运行时运行

参见
kernel-3.2/doc/html/global.htmlstdlib-2.4/doc/html/gen_server.html#start_link-3
stdlib-2.4/doc/html/gen_server.html#cast-2

同样的,在gen_server文档中的一个细节是
如果start_link注册是使用的是global模式,在cast、call等调用时也要使用该模式才能正确调用

另:在不同节点上的代码要直接访问的部分一定要在调用节点本地有代码被加载,否则无法正确调用运行

下面的内容来自:https://veniceweb.googlecode.com/svn/trunk/public/daily_tech_doc/erlang_global_20091109.txt

 

重点介绍erlang的global模块.

1. 介绍:
这个全局服务是通过一个global_name_server的process来提供的,这个进程存在于每一个erlang node, 这个全局名字
服务在每个节点启动的时候自动启动.

这个模块在所有的链接的erlang节点的集群中实现了register_name/2和whereis_name/1的功能.一个注册名是一个pid的别名,
这个名字服务进程管理这些注册的pid,如果一个process终止,名字将自动被注销unregistered.

这些注册名储存在name table中,这个name table在每一个节点上都存在,因此名字服务的调用是快速的,当一个操作改变了
name table, 所有的节点的name table都会自动被更新.

2. 单个节点的例子:
-module(test).
-export([start/1, rpc_call/2, handle_msg/1]).

start(Name) ->
Pid = spawn(?MODULE, handle_msg, [Name]),
register(Name, Pid).          %% 在本地node注册process的名字

rpc_call(Name, Msg) ->
Name ! {Msg, self()},         %% 向本地node的process发消息
receive
{Reply, Name} ->
Reply
end.

handle_msg(Name) ->
receive
{stop, Pid} ->
Pid ! {stop, Name};
{Msg, Pid} ->
Pid ! {“received your msg: ” ++ Msg, Name},
handle_msg(Name)
end.

测试:
启动一个本地的process, 并注册一个名字pid1, 调用whereis/1测试,返回Pid,
测试通过名字pid1对进程发消息,
之后停止process, 再次调用whereis/1测试,返回undefined
test:start(pid1).
true
whereis(pid1).
<0.64.0>
test:rpc_call(pid1, “test – 1”).
“received your msg: test – 1”
test:rpc_call(pid1, “test – 2”).
“received your msg: test – 2”
test:rpc_call(pid1, stop).
stop
whereis(pid1).
undefined

3. Erlang Nodes集群的例子:
-module(test).
-export([start/2, rpc_call/2, handle_msg/1]).

start(Name, Node) ->
Pid = spawn(Node, ?MODULE, handle_msg, [Name]),
global:register_name(Name, Pid).    %% 注册global的process的名字

rpc_call(Name, Msg) ->
global:send(Name, {Msg, self()}),   %% 向global的name消息发送方式
receive
{Reply, Name} ->
Reply
end.

handle_msg(Name) ->
receive
{stop, Pid} ->
Pid ! {stop, Name};
{Msg, Pid} ->
Pid ! {“received your msg: ” ++ Msg, Name},
handle_msg(Name)
end.

测试:
在同一台机器上启动三个节点的erlang集群:
erl -sname node1 -setcookie testcookie
erl -sname node2 -setcookie testcookie
erl -sname node3 -setcookie testcookie
在node1上启动服务:
(node1@dev-pc)> test:start(pid1, node()).
yes
(node1@dev-pc)> test:rpc_call(pid1, “msg – 1”).
“received your msg: msg – 1”
在node2和node3上测试效果:
(node3@dev-pc)> test:rpc_call(pid1, “msg – 3”).
“received your msg: msg – 3”

(node2@dev-pc)> test:rpc_call(pid1, “msg – 2”).
“received your msg: msg – 2”

4. 分布式的知识补充:
<1> 如何在调用远程node上的方法?
rpc:call(Node, Mod, Func, [Arg1, … ArgN]).
会在Node上进行一次Mod:Func(Arg1, … ArgN)调用.

节点名的形式是: NodeName@Host, NodeName和Host都是atom(), 其实整个节点名就是一个atom().

<2> 在不需要DNS的情况下使用erl -sname node1,
需要DNS的情况下使用erl -name node2

<3> 设置cookie:
erl -setcookie testcookie
或者erlang:set_cookie(Node, testcookie)

<4> 如何保持两个node上的代码版本一致?
可以使用nl(Mod), 这个操作会使所有互联的节点上加载Mod.

<5> 判断节点的连通性: net_adm:ping(Node)

<6> node() -> Node 返回本地节点的名字
nodes() -> [Node] 返回网络上与当前节点连接的所有其它节点列表

SS客户端支持负载均衡与服务器优选

SS客户端支持负载均衡与服务器优选

最新版Shadowsocks-win-2.5.1已经支持多服务器负载均衡与优选功能了
在选择服务器的菜单中已经有了“负载均衡”和“高可用”的选项了
再也不会因为视频大流量导致TCP链接被临时阻断了
看视频时使用负载均衡能够使得YTB视频加载更快
浏览网页时使用高可用提高网页加载速度..

看了一下Git上该项目的说明,可以自己实现IStrategy类改进负载均衡的算法。
而看了一下当前默认的负载均衡算法,TCP部分使用的是随机分配算法,UDP部分使用的是标准的求余分布.

下面是负载均衡部分的服务器分布代码

2015-07-31 20_12_32-shadowsocks-csharp - Microsoft Visual Studio(管理员)

public Server GetAServer(IStrategyCallerType type, IPEndPoint localIPEndPoint)
{
    var configs = _controller.GetCurrentConfiguration().configs;
    int index;
    if (type == IStrategyCallerType.TCP)
    {
        index = _random.Next();
    }
    else
    {
        index = localIPEndPoint.GetHashCode();
    }
    return configs[index % configs.Count];
}

我感觉负载均衡算法如果能够再加入可用性测试的部分就更好.
像我这种有五六个服务器的使用这个样的会更好….

archlinux 安装bftpd服务器

archlinux 安装bftpd服务器

惯例的参考:http://bftpd.sourceforge.net/doc/en/bftpd-tutorial.html

pacman -S bftpd

安装后bftpd.conf配置文件在/etc目录下

几乎不用修改即可使用

独立模式启动服务器

/usr/sbin/bftpd -d

直接以IP默认端口连接  以非root账户登录

终止则直接杀死进程即可

killall bftpd

需要以后台服务方式运行则最方便的方法是使用xinetd超级服务器

pacman -S xinetd

安装

启动并设置自启动

systemctl start xinetd
systemctl enable xinetd

在/etc/xinetd.conf文件中添加以下内容让xintetd托管bftpd

service ftp
{
 disable = no
 socket_type = stream
 wait = no
 user = root
 server = /usr/sbin/bftpd
 log_on_success += HOST PID
 log_on_failure += HOST
 nice = 10
}

完成

archlinux安装Yaourt

archlinux安装Yaourt

参照:https://wiki.archlinux.org/index.php/Yaourt_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29

首先,使用添加源的方法已经无法安装yaourt了
所以使用第二个方法

首先安装 base-devel包(needed 前面是两个英文短横线,WP会自动转义)

pacman -S --needed base-devel

全部安装完成后检查fakeroot 和 sudo是否安装好

可以直接再安装一下

pacman -S fakeroot
pacman -S sudo

有关sudo的相关配置参见我的linux安装文档 点这里

Note:必须在非root用户下才能使用makepkg 指令

之后使用你喜欢的下载器或者安装wget来执行wiki中的步骤(其中wget 可能要安装才能用)

安装 package-query:

wget https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
tar zxvf package-query.tar.gz
cd package-query
makepkg -si
cd ..

安装 yaourt:

wget https://aur.archlinux.org/packages/ya/yaourt/yaourt.tar.gz
tar zxvf yaourt.tar.gz
cd yaourt
makepkg -si
cd ..

安装完成后记得使用以下指令更新数据库(devel aur前面是两个英文短横线)

yaourt -Sy --devel --aur

也可以直接如下更新整个系统

同步数据库,升级软件包,搜索 AUR 和 devel (all packages based on cvs, svn, git, bzr(…)-version) 升级:(devel aur前面是两个英文短横线)

yaourt -Syu --devel --aur

下面这条命令将会检查升级包括AUR软件包在内的所有系统软件:

yaourt -Syua 

然后就可以愉快地像使用pacman一样使用yaourt了

另外:可以使用如下指令合并.pacman/pacnew

yaourt -C

Editer时可以对新旧文件进行对比
但是需要调用vimdiff
所以需要安装vim

另,yaourt的快捷合并pacnew额功能不能完全替代手工管理
所以对于危险的配置文件更新
比如sudo的配置文件就需要手动更新替换(sudo配置文件需要专用的visudo进行编辑并进行语法检查后保存,否证配置文件失效会导致无法进root,系统报销)


上面的方法的下载地址貌似改了路径 已经404了

安装部分改为以下方法

git clone https://aur.archlinux.org/package-query.git
cd package-query
makepkg -si
cd ..
git clone https://aur.archlinux.org/yaourt.git
cd yaourt
makepkg -si
cd ..

因此安装依赖包也改变为

pacman -S --needed base-devel
pacman -S git wget

参照:https://archlinux.fr/yaourt-en

 

raspberry pi 2 安装archlinux arm 版

raspberry pi 2 安装archlinux arm 版

首先:第一点:很重要所以放在第一:

树莓派也是标准的计算机,也要按照正常的操作流程来开关机,否则会出现各种稀奇古怪匪夷所思的问题
树莓派的小黄灯在闪或者亮的时候代表在进行磁盘操作

很重要所以放在第一

然后安装教程:http://archlinuxarm.org/platforms/armv7/broadcom/raspberry-pi-2

说说其中的重点

不要指望能在windows下进行这个操作

mkfs.vfat指令不能用就去安装dosfstools这个包

pacman -S dosfstools

笔记本自带的读卡器不能被VM虚拟机正确识别,所以需要使用USB读卡器

解压文件时要使用root权限解压出来的文件的权限才够高,sudo并做不到

sudo su

另外在这里吐槽一下某些教程动不动就说要打开root用户啦
用root用户才方便啦
sudo好麻烦啦
不知道是些什么心态

另:原版arch的操作在arm上并没有什么不一样
该怎么做就可以怎么做

archlinux搭建SS服务器

archlinux搭建SS服务器

参考:https://wiki.archlinux.org/index.php/Shadowsocks_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29

说一下步骤以及WIKI上不清楚的地方

首先是安装SS

pacman -S shadowsocks

再cd到 /etc/shadowsocks/ 目录创建 xxx.josn 的服务器配置文件(同时这里放置的也是客户端配置文件)

服务器版本配置文件内容(这里是重点,网上好像都没说清楚):

{
	"server":"0.0.0.0",
	"server_port":443,
	"local_port":1080,
	"password":"your-passwd",
	"timeout":300,
	"method":"aes-256-cfb",
}

其实和客户端配置文件几乎一样
只是服务器的重要在于server_port、password、method这三个
两个local并没有存在的意义
server也直接0.0.0.0就ok

客户端连接时直接匹配server_port、password、method就可以正确连接上服务器
至于fast_open这个linux特有特性,我客户端使用的是windows所以并不关心,也无法测试

然后
配置文件写好后
启动服务

systemctl start shadowsocks-server@xxx

上面指令最后@后面的xxx就是json配置文件的名字(无后缀)(注意这里没有通常的.service)

这时可以用以下命令查看是否启动完

systemctl

如果有问题可以使用如下指令查看详细错误信息

systemctl status shadowsocks@xxx

同时也可以连接试试看

确认正常后替换start为enable设置自启动

systemctl enable shadowsocks@foo

显示创建链接成功就ok了

重启服务器测试是否自动启动
之后就可以愉快地SS了~~~