我们使用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服务器),管理节点位于不同的主机上.
我的程序的一部分要求我能够随机洗牌列表元素.我需要一个函数,当我给它一个列表时,它将伪随机地重新排列列表中的元素.
排列方式的更改 必须在每次调用时都显示相同的列表.
我的实现似乎工作得很好,但我觉得它相当长,并且正在增加我的代码库,而且,我觉得它不是这样做的最佳解决方案.所以我需要一个更短的实现.这是我的实现:
-module(shuffle). -export([list/1]). -define(RAND(X),random:uniform(X)). -define(TUPLE(Y,Z,E),erlang:make_tuple(Y,Z,E)). list(L)-> Len = length(L), Nums = lists:seq(1,Len), tuple_to_list(?TUPLE(Len,[],shuffle(Nums,L,[]))). shuffle([],_,Buffer)-> Buffer; shuffle(Nums,[Head|Items],Buffer)-> {Pos,NewNums} = pick_position(Nums), shuffle(NewNums,Items,[{Pos,Head}|Buffer]). pick_position([N])-> {N,[]}; pick_position(Nos)-> T = lists:max(Nos), pick(Nos,T). pick(From,Max)-> random:seed(begin (case random:seed(now()) of undefined -> NN = element(3,now()), {?RAND(NN),?RAND(NN),?RAND(NN)}; Any -> Any end) end ), T2 = random:uniform(Max), case lists:member(T2,From) of false -> pick(From,Max); true -> {T2,From -- [T2]} end.
在shell中运行它:
F:\> erl Eshell V5.8.4 (abort with ^G) 1> c(shuffle). {ok,shuffle} 2> shuffle:list([a,b,c,d,e]). [c,b,a,e,d] 3> shuffle:list([a,b,c,d,e]). [e,c,b,d,a] …
使用ORACLE 10g时遇到了这个问题.我在这里阅读了这个问题的答案(ora-00972标识符太长了oracle 10g)堆栈溢出但它们没有为我工作.也许我的情况有所不同.
现在我有这些表名:WIMAX_TRAFFIC_STATS
和WIMAX_RADIO_STATS
.当我尝试通过ODBC连接将数据插入到它们时Erlang/OTP
,我得到了错误:
{error,"[DataDirect][ODBC Oracle Wire Protocol driver][Oracle]ORA-00972:所以,我搜索谷歌并找到答案说,也许我的表名太长了.所以我在下面做了这个并再次尝试:
identifier is toolong SQLSTATE IS: HY000"}
SQL> ALTER TABLE WIMAX_RADIO_STATS RENAME TO WR; Table altered. SQL> ALTER TABLE WIMAX_TRAFFIC_STATS RENAME TO WT; Table altered.我仍然得到同样的错误.其他来源sya,它可能是我在我的一些专栏中写的数据.我的表定义如下:
SQL> DESCRIBE WT; Name Null? Type ----------------------------------------- -------- ----------------- SDATE DATE ELEMENT_TYPE VARCHAR2(50) MANAGED_ELEMENT VARCHAR2(50) USER_LABEL VARCHAR2(200) JOB_ID VARCHAR2(50) MEAS_TYPE VARCHAR2(50) MEAS_VALUE VARCHAR2(50)
我在那里写的数据值都不比列长度定义长.我真的好奇.我试图在表中编写长度小于10个字符但仍然出现此错误的字符串.请帮助一些身体!
EDIT
SAMPLE查询请求如下:
INSERT INTO WT(element_type,managed_element,user_label,job_id,meas_type,
meas_value) VALUES("BreezeMAX MBS",
"SubNetwork=ASN,MeContext=,ManagedElement=MBS.172.17.9.9",
"BMAX-Shoal2[MTN-Egate]",
"99297","rbMngmntPortPacketsDiscardedOnRx","0"); …
JQuery Ninja如何尽可能快地跨越到ExtJS?鉴于ExtJS 3.x现已过时,如何快速掌握Ext JS 4中的概念.几乎无法在线查找Ext JS 4的书籍.文档非常前瞻但复杂.Ext Js有很多组件,每个组件都有几个API,例如Grid有很多方法来操作它的视图等什么学习流程可能对我来说很快就不会跳过任何关于组件,视图,控制器等的东西我想写好Ext从现在开始的2个月内的JS代码.请建议学习Ext JS 4的方法
注意:作者从未在旧版本或新版本中使用过Ext Js
在Erlang中,当您有一个可打印字符列表时,它是一个字符串,但字符串也是一个项目列表,列表的所有功能都可以应用到字符串中.理想情况下,数据结构:字符串在erlang中不存在.
我的部分代码需要确保某些东西不仅是一个列表,而且是一个字符串.(一个真正的字符串).它需要将列表分开,例如 [1,2,3,a,b,"josh"]
,从字符串中分离出来 "Muzaaya"
.保护表达式is_list/1
将对true
字符串和列表说明.没有这样的警卫,所以这意味着我需要一个代码片段来确保我的数据是一个字符串.在这种情况下,字符串是仅可打印的列表(字母,两种情况,上部和下部),并且可以包含数字,例如is_string/1
"Muzaaya2536 618 Joshua"
.我需要一个代码片段(Erlang)来检查我并确保变量是一个字符串,而不仅仅是一个列表.谢谢
我正在尝试与Pusher.com创建和维护的第三方实时Web消息系统进行交互.现在,除非我生成HMAC SHA256 hex digest
我的数据,否则我无法通过API发送任何内容.编写的示例源代码ruby
可能试图说明这一点:
# Dependencies # gem install ruby-hmac # require 'rubygems' require 'hmac-sha2' secret = '7ad3773142a6692b25b8' string_to_sign = "POST\n/apps/3/channels/test_channel/events\nauth_key=278d425bdf160c739803&auth_timestamp=1272044395&auth_version=1.0&body_md5=7b3d404f5cde4a0b9b8fb4789a0098cb&name=foo" hmac = HMAC::SHA256.hexdigest(secret, string_to_sign) puts hmac # >> 309fc4be20f04e53e011b00744642d3fe66c2c7c5686f35ed6cd2af6f202e445
我检查了erlang加密库,我甚至无法生成SHA256 hex digest
"直接"
我如何在Erlang中完成这一切?帮助....
*更新*
我在这里找到了解决方案:在erlang中使用sha256加密,他们把我带到了erlsha2.但尽管如此,我如何生成HMAC
一个的SHA256 hexdigest
该模块的输出?
我正在使用复制的mnesia数据库运行两个erlang节点.每当我尝试启动其中一个而mnesia不在另一个上运行时,mnesia:wait_for_tables(?TABS,?TIMEOUT)将挂在它调用的节点上.我需要有一个结构(如果两个节点都没有运行),我可以开始使用一个而另一个停止运行,然后决定将另一个运行起来但继续运行良好.我需要确保正在运行的第一个节点在启动时更新了后一个节点.这是否一定要我让一个作为主人?
%%%已编辑.............................................. .............................
哦,我知道了.我使用的数据库有几个碎片表.一些片段已经分布在整个网络中以实现负载平衡.因此,一个主机上的Mnesia会尝试在网络上加载它们并因为另一个主机上的mnesia停机而失败!
我想这与mnesia主节点无关.但是我仍然很想理解它的重要性,因为我之前没有使用它,但是,我总是使用分布式模式.
再次感谢...
在我最近询问有关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 …
截至目前,我使用较新版本的CouchBase的唯一方法是通过memcached客户端.我使用Erlang作为编程语言,所以我抓住了自己的Erlang Memcached客户端.我注意到这个客户端通过erlang:term_to_binary/1 and erlang:binary_to_term/1
在发送和接收来自memcached的数据时将它们从二进制转换为二进制来串行化和反序列化erlang术语(Key和Value).
在设置CouchBase时,我们被要求选择memcached存储桶或CouchBase存储桶(vbuckets).现在,我选择了CouchBase(因为我需要持久性).我开始使用erlang memcached客户端与设置进行交互,没关系,我保存了erlang术语并从数据库中获取了erlang术语.然而,问题从这里开始:
1.由于数据序列化,对象作为附件被接收.即使作为JSON从Erlang发送,它们也作为二进制数据发送,这对CouchBase(或Memcached?)没有任何意义.
{ "_id": "mykey", "_rev": "1-000010fb1a2b02ef0000000d59960000", "$flags": 38489, "$expiration": 0, "$att_reason": "invalid_json", "_attachments": { "value": { "content_type": "application/content-stream", "revpos": 2, "digest": "md5-n3mJhf2kKVQtkIunIbCJZQ==", "length": 13, "stub": true } } }
B+ Tree
在Erlang中是否存在任何已知的数据结构开源实现?