我需要构建一个依赖于在站点之间复制大文件的分布式系统.
我想过使用像bittorrent这样的p2p技术来节省带宽,提高可靠性.
我非常错吗?
有没有人构建过这样的解决方案?
你推荐哪些图书馆?
如果您设计一个易于横向扩展的分布式应用程序,或者您只想使用亚马逊,谷歌或微软的任何新"云计算"产品,那么您通常最终会使用一些典型的概念或组件:
现在,在设计和绘制使用这种模式的架构时,我可以使用任何常用的符号吗?甚至可以下载一些很酷的Visio模板?:)
它不一定是像UML这样的正式系统,但我认为如果有每个人都知道和理解的符号会很好,比如我们通常使用数据库或文档的形状.我认为不要将它与普通文件系统(本地或网络服务器/ SAN)或关系数据库等传统概念混淆是很重要的.
简单来说,我希望能够通过查看系统架构概述图得出有关应用程序可伸缩性或数据一致性问题的一些结论.
更新:非常感谢您的回答.我喜欢在传统符号上加上一个小"云符号"的想法.但是我打开这个帖子以防万一有人会找到特定的符号(可能在一本书中) - 或上传一些拉皮条Visio模板;)
似乎有相当多的网格计算框架,但是为了低延迟分布计算的目的,哪些实际上被投资银行用于很大程度?我有兴趣听到有关Windows,Linux和跨平台的答案.什么RPC机制似乎最受青睐?
我听说由于低延迟和低速的原因,计算本身通常用C++/C编写,因为在VM上运行的计算比本机代码慢几个数量级.这在实践中似乎是一种常见的情况吗?例如,分布式.NET网格框架运行用本机c ++/c编写的计算?
我们想构建一个媒体流服务器,并想知道选择硬件和软件时的策略.
我们的一些要求:
这里的情况与你们之前可能遇到的情况略有不同.专业系统管理员和开发人员的成本比在存储解决方案领域与硬件或软件供应商签订合同要便宜得多.我们扩展的方式是购买廉价的商品硬件,并且(可能)使用各种开源软件自行构建基础设施.
我们正在研究各种用于存储的分布式文件系统,例如MogileFS,GlusterFS,HDFS,看起来HDFS可能是领跑者.
如果你之前已经建立了类似的东西,请分享你的经验.
谢谢!
我正在编写一个涉及多个前端节点的分布式应用程序,除非它们是列表的一部分,否则需要拒绝对用户执行操作.
现在我们有超过4个节点,但只有一个运行DB2的数据库服务器通常需要维护.
现在我们正在轮询数据库以更新内存列表,这样如果用户从列表中删除,则更改会反映到所有4个节点.但是,如果在数据库关闭时重新启动其中一个节点,我们最终会得到一个空列表,这将拒绝我们不想要的所有用户请求.我们可以接受来自用户的请求,即使数据库已关闭,因为我们将它们缓冲在消息队列中,但我们想立即拒绝它们,如果它们需要被拒绝的话!
在我们的4个节点上运行Zookeeper实例并在Zookeeper中存储用户权限是否有意义.因此,阅读应该是快速的,并且数据具有高可用性和可靠性.我们不必再进行轮询,即使我们重新启动数据库,节点也可以从zookeeper获取配置!
我在一家小型软件公司工作,我的任务是研究分布式锁管理器供我们使用.它必须与Java和C++接口.
我已经使用ZooKeeper工作了几个星期,并根据文档实现了共享锁(读写锁).我现在需要实现死锁检测.如果每个客户端都可以维护锁的图形,那么它将是快速而简单的.但是,您无法可靠地查看ZooKeeper中节点发生的每个更改,因此无法保持准确的图形.这意味着每次检查死锁时,我都需要下载许多锁,这似乎不切实际.
另一种解决方案是在ZooKeeper服务器中实现死锁检测,我现在正在研究它.每个客户端都会在'/ waiting'中创建一个以其会话ID命名的节点,其数据将是其等待的锁.由于每个锁都有一个短暂的所有者,我将有足够的信息来检测死锁.
我遇到的问题是ZooKeeper服务器没有ZooKeeper客户端的同步保证.另外,ZooKeeper服务器没有像客户端那样很好地记录,因为你通常不应该触摸它.
所以我的问题是:如何使用Apache ZooKeeper实现死锁检测?我看到很多人推荐ZooKeeper作为分布式锁管理器,但如果它不能支持死锁检测,那么没有人应该将它用于此目的.
我有一个有效的解决方案.我无法保证其正确性,但它已通过我的所有测试.
我正在分享我的checkForDeadlock方法,这是死锁检测算法的核心.以下是您需要了解的其他信息:
waitNode = zooKeeper.create(waitingPath + "/" + sessionID, resource.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);checkForDeadlockDeadlockException如果发现死锁,则抛出一个.否则,它会正常返回.bySequenceNumber 是一个比较器,按照ZooKeeper附加到顺序znode末尾的序列对znodes进行排序.码:
private void checkForDeadlock(String pathToResource) throws DeadlockException {
// Algorithm:
// For each client who holds a lock on this resource:
// If this client is me, announce deadlock.
// Otherwise, if this client is waiting for a reserved resource, recursively check for deadlock …Run Code Online (Sandbox Code Playgroud) 我为即将推出的分布式NoSQL数据库系统制作了一个内部分布式时间服务器(没有主服务器).只要分布式系统中2/3的时钟正确,它就应该处理Byzantium时钟和时钟偏移问题.
然而,我想看看其他人是如何实现这种模式的(对基于IEEE 1588的主/从模式实现不感兴趣) - 最好是一些已经在使用的开源代码 - 断言我已经正确实现了它因为很难为它编写单元测试.
有谁知道这样的开源实现?我们使用C++的编程语言,所以我更喜欢C/C++引用,但只要代码具有人类可读性,它可能就不那么重要了.
以下是我的实现到目前为止的代码(为简单起见,部分伪代码):
/*!
\brief Maximum allowed clock skew in milliseconds
\details A network node that has a clock skew greater than this value will be ignore
* and an error message will be logged
\note Maximum divergence (drift) between two clocks on the network nodes will be 3x this amount if we
* have a worst case Byzantium clock issue
*/
#define MAX_ALLOWED_CLOCK_SCEW_MS 333
/*!
\class CTimeServer
\brief Internal distributed time server
\details …Run Code Online (Sandbox Code Playgroud) 目前,我正在使用JSON库来序列化发送方(JeroMQ)上的数据,并在接收方(C,ZMQ)进行反序列化.但是,在解析时,JSON库开始消耗大量内存,操作系统会终止进程.所以,我想按原样发送float数组,即不使用JSON.
现有的发件人代码在下面(syn0并且syn1是Double数组).如果syn0并且syn1每个大约100 MB,则在解析接收到的数组时,该进程将被终止,即下面的代码段的最后一行:
import org.zeromq.ZMQ
import com.codahale.jerkson
socket.connect("tcp://localhost:5556")
socket.send(json.JSONObject(Map("syn0"->json.JSONArray(List.fromArray(syn0Global)))).toString())
println("SYN0 Request sent”)
val reply_syn0 = socket.recv(0)
println("Response received after syn0: " + new String(reply_syn0))
logInfo("Sending Syn1 request … , size : " + syn1Global.length )
socket.send(json.JSONObject(Map("syn1"->json.JSONArray(List.fromArray(syn1Global)))).toString())
println("SYN1 Request sent")
val reply_syn1 = socket.recv(0)
socket.send(json.JSONObject(Map("foldComplete"->"Done")).toString())
println("foldComplete sent")
// Get the reply.
val reply_foldComplete = socket.recv(0)
val processedSynValuesJson = new String(reply_foldComplete)
val processedSynValues_jerkson = jerkson.Json.parse[Map[String,List[Double]]](processedSynValuesJson)
Run Code Online (Sandbox Code Playgroud)
可以在不使用JSON的情况下传输这些数组吗?
这里我在两个C程序之间传输一个float数组:
//client.c
int main (void)
{ …Run Code Online (Sandbox Code Playgroud) 在Tensorflow中,我们可以使用Between-graph Replication分布式培训来构建和创建多个Tensorflow会话.MonitoredTrainingSession()协调多个Tensorflow会话,并且有一个参数checkpoint_dir用于MonitoredTrainingSession()恢复Tensorflow会话/图形.现在我有以下问题:
tf.train.Saver()来恢复Tensorflow图saver.restore(...).但是我们如何通过使用来恢复它们MonitoredTrainingSession()?MonitoredTrainingSession()使用测试(或预测)模式?我阅读了Tensorflow Doc,但未找到这两个问题的答案.如果有人有解决方案我真的很感激.谢谢!
在牛皮纸中,第5.4.2节
如果领导者在提交条目之前崩溃,则未来的领导者将尝试完成复制条目。但是,领导者一旦将其存储在大多数服务器上,就无法立即得出结论,即上一个条目的条目已提交。可能存在这样的情况,旧的日志条目存储在大多数服务器上,但仍可能被将来的领导者覆盖。
作者提到,要避免上述情况
为了消除类似图8中的问题,Raft决不通过对副本数进行计数来提交前项的日志条目。通过计算副本数,仅提交领导者当前任期的日志条目;一旦以这种方式提交了当前术语的条目,则由于“日志匹配”属性而间接提交了所有先前的条目。
但是会不会仍然出现同样的问题?
鉴于作者提供的以下情况
当S5当选领导者时,它只会查看其当前已提交的日志,(term3, index1)这将覆盖term2所有关注者中的条目。
让领导者查看自己的已提交日志如何解决该问题?
distributed ×10
c++ ×2
java ×2
algorithm ×1
architecture ×1
bittorrent ×1
clock ×1
cloud ×1
consensus ×1
deadlock ×1
diagram ×1
grid ×1
jeromq ×1
json ×1
leader ×1
locking ×1
media ×1
p2p ×1
python ×1
raft ×1
replication ×1
restore ×1
scala ×1
session ×1
streaming ×1
tensorflow ×1
trading ×1
visio ×1
zeromq ×1