我们使用Mnesia作为非常大的系统的主数据库.Mnesia Fragmented Tables在测试期间表现良好.系统有大约15个表,每个表在2个站点(节点)上复制,每个表都是高度分散的.在测试阶段(主要关注可用性,效率和负载测试),我们接受了Mnesia的复杂结构的许多优点将为我们做,因为我们在服务之上运行的所有应用程序都是Erlang/OTP应用程序.我们运行Yaws 1.91作为主WebServer.
为了有效地配置分段表中,我们使用了一些谁已经在大型系统中使用Mnesia的引用:
它们是:Mnesia的一年后博客,博客的第2部分,其次是即使在这里,关于散列.这些博客文章帮助我们在这里和那里进行了微调,以获得更好的性能.
现在,问题.Mnesia有表格大小限制,是的,我们同意.但是,在任何地方都没有提到对片段数量的限制.出于性能原因,并且为了满足大数据的需要,有多少片段会让mnesia"好"?
在我们的一些表中,我们有64个片段.与n_disc_only_copies
集到集群中的节点的数量,使得每个节点具有每片段的副本.如果给定节点瞬间无法触及,这有助于我们解决mnesia写入失败的问题.同样在上面的博客中,他建议the number of fragments should be a power of 2
,这个声明(他说)是从mnesia记录的散列方式进行调查的.然而,我们需要对此进行更多的解释,以及在这里讨论两种权力:2,4,16,32,64,128,......?
该系统适用于HP Proliant G6,包含Intel处理器(2个处理器,每个4核,每个核心2.4 GHz速度,8 MB高速缓存),20 GB RAM大小,1.5 TB磁盘空间.现在,我们可以使用其中的两台高功率机器.应该在两者之间复制系统数据库.每个服务器运行Solaris 10,64位.
什么数量的碎片可能会使mnesia的表现开始降级?如果我们将给定表的片段数从64增加到128,这样可以吗?65536个片段(2 ^ 16)怎么样?我们如何通过使用碎片来扩展我们的mnesia以利用Terabyte空间?
请提供问题的答案,您可以提供有关可能增强系统的任何其他参数的建议.
注意:所有要保存数百万条记录的表都是按disc_only_copies
类型创建的,因此没有RAM问题.对于我们运行的少数RAM表,RAM就足够了.其他DBMS(如MySQL Cluster和CouchDB)也将包含数据,并且与我们的Mnesia DBMS使用相同的硬件.MySQL Cluster在两个服务器上复制(每个服务器包含两个NDB节点,一个MySQL服务器),管理节点位于不同的主机上.
erlang TCP/IP库是否有一些限制?我做了一些搜索,但找不到任何确定的答案.
我已将ERL_MAX_PORTS环境变量设置为12000并将Yaws配置为使用无限制连接.
我编写了一个简单的客户端应用程序,它连接到我为Yaws编写的appmod,并且正在通过同时启动X个客户端来测试同时连接的数量.
我发现当我到达大约100个客户端时,Yaws服务器停止接受更多的TCP连接和客户端错误
Error in process with exit value: {{badmatch,{error,socket_closed_remotely}}
我知道开放式同时连接的数量必须有限制,但100似乎非常低.我查看了所有的雅司文档,并删除了任何连接限制.
这是运行Snow Leopard的2.16Ghz Intel Core 2 Duo iMac.
对Vista机器的快速测试表明,我在大约300个连接处遇到了同样的问题.
我的考试不合理吗?也就是说同时打开100多个连接来测试雅虎的并发性是愚蠢的吗?
谢谢.
在我最近询问有关mnesia碎片的问题的解决方案之后,我仍然面临许多挑战.请考虑以下场景(我要问的问题基于以下内容):
您有一个数据驱动的企业应用程序,该应用程序应该
在企业内高度可用.如果内部信息源因任何原因而关闭,
企业应用程序必须切换到从异地(远程)恢复中心 获取数据
.您决定将数据库复制到企业内的两个节点
(称为DB侧A和DB侧B).这两个
硬件在单独的硬件上运行,但与快速以太网或光纤链路相连.
从逻辑上讲,您可以在这
两个Mnesia DB 之间创建某种隧道或安全通信.两个(A和B)应该具有相同的数据副本并且
始终保持同步.现在,同时,恢复中心也必须具有相同的数据副本并且
始终同步,以防因本地数据访问因攻击
或硬件故障而中断.因此,相同的数据库架构必须在3个复制
位点(A面,B面和恢复中心).
现在,在企业内,应用程序中间件能够在数据库站点之间切换数据请求.如果A已关闭,那么在应用程序未实现的情况下,请求将重新路由到数据库B,依此类推.中间件层可以配置为执行负载平衡(请求多路复用)或使用故障转移技术灵活.
进一步分析:
At Database/Schema creation time, all involved Nodes must be up and running
Mnesia. To achieve this, you create say: 'db_side_A@domain.com',
'db_side_B@domain.com' and finally, 'db_recovery_center@domain.com'
现在,在创建表时,您可能希望将mnesia表分段.所以你决定以下参数:
n_disc_only_copies =:= number of nodes involved in the pool =:= 3 Reason: You are following the …
在一个简单的基于Erlang YAWS的RESTful应用程序中,我希望有一组测试将HTTP请求发送到RESTful API,从服务器获取响应,然后测试这些响应.
如果每个"send-request-get-request-test"测试都可以在EUnit中运行(可以使用测试生成器),那就太好了.
我也希望能够用rebar
(make test
)运行这组测试.
最近,我用 ibrowse
在另一个应用程序(受Mochiweb),但我发现它安静的使用麻烦.
是否还有其他选项可以编写可以将HTTP请求发送到YAWS RESTful应用程序的Erlang/OTP测试?最常见的方法是什么?
我正在考虑使用Erlang,Mnesia和Yaws开发一个网络搜索引擎.是否有可能使用这些软件制作功能强大且速度最快的网络搜索引擎?它需要做什么以及我该如何开始?
我正在尝试管理Yast appmod.所以:
yaws.conf:
<server localhost>
port = 8005
listen = 127.0.0.1
docroot = /home/ziel/www/CatsScript/src/
appmods = </, myappmod>
</server>
Run Code Online (Sandbox Code Playgroud)
来自http://yaws.hyber.org/appmods.yaws myappmod.erl:
-module(myappmod2).
-author('klacke@bluetail.com').
-include("/home/ziel/erlang/yaws/include/yaws_api.hrl").
-compile(export_all).
box(Str) ->
{'div',[{class,"box"}],
{pre,[],Str}}.
out(A) ->
{ehtml,
[{p,[],
box(io_lib:format("A#arg.appmoddata = ~p~n"
"A#arg.appmod_prepath = ~p~n"
"A#arg.querydata = ~p~n",
[A#arg.appmoddata,
A#arg.appmod_prepath,
A#arg.querydata]))}]}.
Run Code Online (Sandbox Code Playgroud)
当我第一次使用它时它起作用了.但后来当我在myappmod.erl中更改了某些内容时,服务器的响应没有任何变化.比我删除myappmod.erl,但它仍然有效.我该怎么做才能做些改变?
我是YAWS和ERLANG的新手,想从一个不同的.erl文件调用一个函数到YAWS页面.
即我有一个名为webpage.yaws的页面,并有另一个名为utilities.erl的文件,并希望从webpage.yaws中的utilities.erl调用一个函数.
有任何想法吗?
谢谢
我一直在寻找有关部署和更新Erlang/OTP版本(一组应用程序)的"最佳实践",但是我找不到任何直接的解决方案描述,但只能找到一些"相关信息":
http://blog.equanimity.nl/blog/2013/06/04/continuous-integration-for-erlang-with-travis-ci/
https://www.youtube.com/watch?v=G0eBDWigORY
https://www.youtube.com/watch?v=0ZGHzI9F5YE
我所说的"直接解决方案"是对以下问题的回答:
鉴于生产Erlang/OTP集群的Erlang/OTP版本在几个Erlang节点上运行,这些节点充当高可用性(24/7)REST API,如何定期将新代码推送到该生产集群?有没有最好的做法来做那些像git push heroku master
Heroku一样简单的做法?如果没有,在生产中连续重新部署和Erlang/OTP软件的最简单方法是什么?
我已经阅读了"Erlang/OTP in Action"一书来了解如何处理Erlang/OTP应用程序和发行版,在我看来,简单的软件升级并不那么容易.使用reltool
时必须生成存档,将该存档移动到生产机器(scp
?),在那里解压缩,运行Erlang shell并将新模块加载到Erlang VM中.
另外,"Learn You Some Erlang"一书中指出了以下内容:
"...如果你可以避免整个过程(从现在开始称为relup)并通过重新启动VM并启动新应用程序来进行简单的滚动升级,我建议你这样做."
和
"有人说爱立信的部门使用relups会花费尽可能多的时间测试它们,就像测试应用程序本身一样."
此外,这是另一个建议,以避免生产中的Erlang版本的热交换.
如果这是真的,那么我没有看到'Erlang热代码升级'的任何用处,因为我必须在每次升级时重启VM.这让我不知道在生产中定期部署Erlang/OTP新代码的强大且经过测试的方法.
PS关于我的软件要求的一些注释.
erlang continuous-integration yaws high-availability erlang-otp
我对 erlang 和 yaws 很陌生。在尝试了该语言和简单的 yaws 功能(如 ehtml 和普通 appmods)后,我尝试编写一个 yapp。我跟着http://yaws.hyber.org/yapp_intro.yaws和https://github.com/davide/yawn/wiki让它或多或少地运行。它只是由一个 .app 文件和一个只有 out/1 的简单 test.erl/beam 组成。Yaws 可以正常启动并加载 yapp。当我在交互模式下运行 yaws 并调用 test:out(somehting) 它工作正常。当我浏览 url(使用浏览器或 curl)时,我得到一个
=ERROR REPORT==== Date ===
Yaws process died:...
Run Code Online (Sandbox Code Playgroud)
并没有返回给客户。我一直在尝试一些事情,但我还没有发现问题。
我相信问题出在我的 .app 文件中...我希望你能帮助我。我在下面添加了 .app 和我的 localhost-ssl.conf 的内容。
marc@server:~$ cat /usr/lib/yaws/lib/api/ebin/api.app
{application, api,
[{description,"cloudia api as yapp"},
{vsn,"0.1"},
{modules,[]},
{registered, []},
{env, [
{yapp_appmods,[{"/",test}]},
]}]}.
marc@server:~$ sudo cat /etc/yaws/conf.d/localhost-ssl.conf
<server localhost>
port = 443
listen = 0.0.0.0
docroot = /usr/share/yaws
arg_rewrite_mod = api
#dir_listings …
Run Code Online (Sandbox Code Playgroud) 我一直在构建一个实时通知系统。它\xe2\x80\x99是Web应用程序的一部分,但事件一发生就必须被看到。长轮询不是一个选择,因为当没有可用事件时,Web 服务器保持连接的成本很高,因此我不得不进行短暂的轮询。
\n\n每个客户端每隔 2 秒访问一次 Web 服务器(这是一个相当高的速率)。当事件可用时,它们会以 JSON 形式发送到 JavaScript 客户端。现在,这需要服务器设置来处理大量的短期连接。我已经使用 Yaws Web 服务器实现了一个这样的系统。然而,因为 Yaws 启动了相当多的其他服务,所以感觉很重,当连接超过 30,000 时,连接开始被拒绝或中止(可能是因为我在与 Yaws 运行相同的 Erlang VM 中运行一些 ETS 表 [分离这些可能需要rpc:call/4
,这\xe2\x80\x94我担心\xe2\x80\x94会增加延迟])。我知道需要进行一些特定于操作系统的调整,并且这些调整已经完成。
如果很容易将多个 Yaws 实例集群起来,这就不成问题了。在雅司病中,我使用了一些 appmod,并且我以 REST 方式做事。我在想 Cowboy Web 服务器可能会增强这里的功能。我以前没用过Cowboy,但我用过Misultin。看看 Cowboy,它是一个成熟的 OTP 应用程序,它似乎很容易集群,并且是轻量级的,可能会增加整个系统可以处理的客户端数量。存储位于 Mnesia 上,我可以轻松分配它以添加更多节点(可能通过复制),以便每个 Mnesia 实例前面都有一个 Cowboy 实例。
\n\n我的问题是:
\n\n我的猜测是否正确,如果我从 Yaws 切换到 Cowboy,我可能会显着提高性能?
雅司病有一个干净的 APIAppmods
通过#arg{}
记录。Cowboy 有相当于这两件事的东西吗(请举例说明)?
能Cowboy
处理文件上传吗?如果是这样,您认为在频繁上传文件的情况下使用哪种服务器(Yaws 或 Cowboy)更好?说明如何使用 Cowboy 完成文件上传。
可以在同一台机器上运行多个 Yaws 实例。您认为为每个服务器(物理机)创建许多 Yaws 实例并将客户端负载分布在这些实例上会有帮助吗?这样做我需要知道什么?
当我设置 …