首页 文章 精选 留言 我的

精选列表

搜索[混元翻译],共10000篇文章
优秀的个人博客,低调大师

DriveScale:为初始者混搭服务器和存储

DriveScale是一家初创公司,今年年初从此前3年的隐身模式走出来,推出了可以动态地将外部连接的JBOD作为本地设备呈现给服务器的硬件和软件。它的想法是提供可组合的服务器-存储结合体,用于改变Hadoop类型的分布式工作负载。 这么做的目的是分享超大规模数据中心的特性,而不涉及到这么大规模,也不需要企业进行DIY。DriveScale表示,现有的服务器和存储产品设计对于分布式Hadoop类型的工作负载来说太死板了,通常存在不同程度的配置不足或者过量配置服务器和存储资源。 服务器和存储应该作为单独的资源池进行管理。据悉,DriveScale公司有很多前Sun和思科公司的员工,有不错的可信度,值得考虑。 技术 软件构成系统:这是带有本地(在机架中)磁盘存储的服务器,当大数据Hadoop工作负载发生变化的时候可以分解,然后可以重新组合成为新的配置。 它所做的是,DriveScale软件对磁盘驱动器机箱中的存储进行虚拟化,然后跨10GbitE连接呈现给机架中的服务器。此外有一个机架顶部的以太网交换机,服务器和SAS JBOD存储机箱有以太网端口。采用SAS的DriveScale适配器(虚拟化卡)是介于服务器和存储以太网端口之间的。 该适配器采用一个以太网控制器(2 x 10GbitE)以及一个SAS(2 x 12Gbit/s 4通道)控制器。一个1U的DriveScale一体机设备容纳4个这样的适配卡,连接到TOR以太网交换机。这个适配卡机箱有80Gbit/s的带宽。服务器访问磁盘是通过这个以太网和DriveScale系统的。显然这个以太网和SAS连接为磁盘访问贡献了一些延迟,大约是200微秒。 该服务器运行Linux系统,有一个DriveScale软件代理。DriveScale有一个管理工具,用于组合(配置或者分配)存储给一台或者多台服务器,配置软件代理。 这个代理呈现已经被组合成为服务器的存储,本地(直连)到这个服务器,使用DriveScale服务器代理以及适配卡,隐藏了它实际上是通过以太网外部连接的事实。 还有一个SaaS整体管理工具。用户通过GUI或者RESTful API控制DriveScale。JBOD未来还可以涵盖SSD。 创建、创始人和资金 DriveScale在2013年由首席科学家Tom Lyon和首席执行官Satya Nishtala创建的时候,接收到了300万美元的种子资金。Lyon最早是Sun公司的员工,他和Nishtala当时为Banman工作。他们是Nuovo的创始人,这个分拆出来的公司开发了思科的UCS服务器。在Sun的时候,Lyon致力于Sparc处理器的设计以及SunOS,而Nishyala则负责Sun存储、UltraSparc工作组服务器以及工作站产品。 DriveScale公司的首席执行官是Gene Banman,工程师设计副总裁是Duane Northcutt,他是前Sun公司的硬件架构师。前Sun首席执行官和共同创始人Scott McNealy以及研究Java的James Gosling是该公司咨询顾问。 该公司今年年初进行了1500万美元的A轮融资,由Pelion Venture Parnters主导,Nautilus Venture Partners以及Foxconn的Ingrasys参与。Ingrasys是Foxconn的全资子公司,帮助开发和制造DriveScale一体机。 DriveScale称,现在是解耦设计的一个好时机。它的技术可以让企业拥有类似互联网公司(Amazon、Facebook和Google等)的那种横向扩展架构,让他们更加灵活地扩展服务器和存储资源。 原文发布时间为:2016年6月27日 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

[翻译]Hello, wasm-pack - cargo.toml

Cargo.toml cargo.toml是Rust 包管理器 cargo 的清单文件。这个文件包 name、 version 和包的依赖,在 Rust 中,我们一般称之为 crate。 在示例中给出了一系列信息,但是我们主要讨论如下三点: crate-type wasm-bindgen 依赖 [features] 和 wee_alloc、console_error_panic_hook 依赖 1.crate-type [lib] crate-type = ["cdylib", "rlib"] Rust-wasm 包与通常的 crate 有一点不同,作为 WebAssembly 项目, 我们需要在 cargo.toml 中加入该说明。 如果你熟悉其他的 Rust crate,那么你肯定知道,大多的 crate 的类型是 rlib(默认), 或者是二进制形式的 bin(这种形式不需要 crate-type 注解), 并且 [lib] 注解在普通的 Cargo 项目中并不需要指定。 crate-type = ["cdylib"] 指示你的工程将会被编译为动态系统库 [dynamic system library], 但是对于 WebAssembly,他将会编译为一个没有启动函数的 .wasm 文件,在 Linux 平台上,他将会创建.so 文件,在macOS 上将会创建.dylib文件,在 windows 平台上将会创建 *.dylib 文件。 我们通常指定 crate-type = ["rlib"] 来确保我们的库可以用 wasm-pack 来做单元测试(稍后会看到)。如果没有这个配置,我们将不能测试我们的库,因为 cdylib 包类型和 wasm-pack 的单元测试类型相冲突。 你可以使用此链接获取更多关于包类型的知识。 2. wasm-bindgen 依赖 wasm-bindgen 在WebAssembly 中是一个重要的依赖。 这个包允许我们使用 [wasm-bindgen] 为在 JavaScript 和 Rust 生成的 wasm 之间的代码打标签。以使我们使用它的属性可以导入 JS 并且导出 Rust。 wasm-bindgen = "0.2" 当我们讨论 lib.rs 生成什么内容的时候,将会看到更多关于怎么使用这个库。如果你从 JavaScript 技术栈过来,你可能注意到了当我们添加依赖的时候并没有加 ^ 或者 ~ ,看起来像是我们只要 0.2 这个版本。然而,事实并非如此!在 Rust 里, ^ 是默认的,你可使用这个 链接查看更多信息 3. [features] 和 wee_alloc, console_error_panic_hook dependencies 作为我们设计模板的工作的一部分,该模板可帮助人们发现针对特定用例的有用包,该模板包括两个依赖项,这对于开发Rust-wasm包的人们可能非常有用:console_error_panic_hook 和 wee_alloc。 因为这些依赖关系主要在 Rust-wasm 包开发工作流程的特定部分中有用,所以我们还设置了一些粘合代码,使我们既可以将它们都包含为依赖关系,又可以选择将它们包含在内。 [features] default = ["console_error_panic_hook"] [dependencies] wasm-bindgen = "0.2" # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires # all the `std::fmt` and `std::panicking` infrastructure, so isn't great for # code size when deploying. console_error_panic_hook = { version = "0.1.1", optional = true } # `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size # compared to the default allocator's ~10K. It is slower than the default # allocator, however. # # Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. wee_alloc = { version = "0.4.2", optional = true } 在我们的代码中,只有在启用某些 [features] 的情况下,我们才会将代码的某些部分标记为正在运行,特别是 console_error_panic_hook 和 wee_alloc。默认情况下,仅启用 console_error_panic_hook。要禁用或启用任一功能,默认情况下,我们可以在 [features] 下编辑 default 数组。 要了解有关这些功能的更多信息,我们将在 src/lib.rs 和 src/utils.rs 部分中深入讨论它们。 简要地,它们包括: console_error_panic_hook ,用于将奔溃消息记录到开发人员控制台的功能。 wee_alloc,一个使代码量更小而优化的分配器。

优秀的个人博客,低调大师

组复制官方翻译二、Group Replication Background

https://dev.mysql.com/doc/refman/8.0/en/group-replication-background.html 这一章主要描述一些组复制的背景 构建一个容错系统最常用的方法就是让组件冗余,换句话说就是组件即便被移除掉,整个系统还是能够正常对外提供服务这无疑在不同层面上提出了更多的挑战需要注意的是,复制结构的数据库系统必须思考的一个事实就是:他们需要维护和管理一堆不同的sever此外,他们还必须解决分布式系统所面临的问题:比如 脑裂、网络分区等等 因此,最大的挑战就是去融合这种逻辑数据库,保证数据复制的一致性换句话说,为了让不同server都同意这个系统的状态,他们每一台server的数据修改都必须验证一致这就意味着他们需要运作的想一个状态机一样(分布式) MySQL Group Replication提供了一套分布式状态机制复制管理方法 对于要提交的事务,这个group采取大部分原则来投票,让事务全局有序决定commit还是拒绝这个事务都是由server自行判断,但是所有servers都会做出一样的决定如果网络产生了分区,脑裂产生导致成员之间无法达成一致投票决定,那么这个系统会停止运行直到这个问题被解决所以,他有一个内置、自动的脑裂包含机制在运行 以上所有的功能都是由Group Communication System (GCS) 协议来保证它有错误检测机制、组成员通信服务、安全可靠的顺序一致消息分发所有这些特性是搭建一个 数据完全一致性的系统 的关键要素在一些非常核心重要的技术点上 罗列了Paxos 算法的实现,它扮演着组复制通信引擎的角色,至关重要 18.1.1 Replication Technologies 在了解MGR内幕之前,这里先主要介绍下相关的背景概念、以及概述这章主要告诉我们,MGR需要什么,以及传统的异步复制和MGR直接的一些区别 18.1.1.1 Primary-Secondary Replication 传统的复制提供了一个简单的主从复制架构(Primary-Secondary)primary就是master,secondary就是slaves,可以有多个slavesmaster执行事务、commit事务,然后异步的将这些事务发送到slaves,让他们re-executed一遍(statement模式)或者 重新applied (ROW模式)它是share-nothing架构,即所有server都有一份完整的数据copy 还有一种传统复制叫:半同步复制它意味着:在commit的之前,master等待,直到slaves给master一个确认接收到事务的ack,master才恢复commit的操作 在上面的两幅图中,你能看到异步传统复制协议的基本架构,箭头代表client消息的流动和转变 18.1.1.2 Group Replication 组复制是一个实现了容错系统的技术组复制集群就是一堆机器,他们之间通过消息进行沟通communication 层:提供了一系列的保障机制,atomic message(原子广播) , total order message delivery(全局序列消息分发机制) MGR在此基础上构建并实现了一个multi-master的复制协议,它可以在任何server上写数据集群的本质就是多server,每个server可以独立的处理事务但是所有的读写(RW)事务都必须经过集群的审核所有的只读(RO)事务不受任何影响换句话说,对于RW事务,group只需要决定它应该commit还是拒绝commit,因此事务操作并不是单方面(origi server)的决定确切的说,当origin server准备进行事务commit的时候,这个server会自动广播这个写集然后,一个全局排序的事务产生了这意味着,所有的server都接收同样顺序的事务集由于是有序的,所有server应用相同顺序,相同数据的写集,因此他们的数据也是一致的 然而,如果是并发写在不同server的场景会遇到冲突因此,对应这种情况需要进行冲突检测,这个过程叫做认证 certification如果两个并发事务在不同server同时执行,并且更新了相同的row,那么他们就是冲突的那么它的解决方案就是,排在前面的事务会被标记commit,排在后面的会被拒绝(这个事务在origin server会回滚,其他server会被丢弃) 最后,MGR也是一种share-nothing架构,每个server都有一份完整的数据copy 18.1.2 Group Replication Use Cases 组复制提供了一个高容错性的系统,即使一些机器宕机,只要不是所有或者大多数机器不可用,那么整个系统还是可用状态总结下来,MGR保证数据库持续可用 18.1.2.1 Examples of Use Case Scenarios 以下就是典型的MGR使用案例 Elastic Replication 可伸缩的复制 Highly Available Shards 高可用的分片 Alternative to Master-Slave replication 可选择master-slave架构 Autonomic Systems 完全自动化的系统 18.1.3 Group Replication Details 18.1.3.1 Failure Detection 它提供一个错误检测机制,可以找到或报告出哪些servers没有回应,哪些server挂了在高一层次来将,错误检测机制就是一个分布式服务,用于提供哪些server挂掉或可能挂掉的情报信息之后,如果组成员通过某种协议认证了这个嫌疑犯(可能挂掉的家伙)已经真的挂了,那么集群就会决定这个嫌疑犯真的的确挂了这意味着,组的其他成员一致决定将这个嫌疑犯踢出集群 当Server A 在指定time-out时间内没有收到来自server B的回应,那么B就会被提升为嫌疑犯如果一个Server被其他group成员隔离,那么它就会怀疑所有其他的成员都挂了由于它不能达成投票的一致性认可(没有达到法定人数的确认),所以它认为的嫌疑犯就不能被确认为failed如果一个Server在这种情况下被隔离,那么他是不能执行local事务的 18.1.3.2 Group Membership MGR依赖组会员服务(Group Membership Service,简称GMS),它是内置的它定义了哪些servers是online并加入了这个group,这些online servers经常被称为view因此,这个组里面的任一online成员都有一个一致的view 如果servers同意让一个新server加入到这个group中来,那么这个group就好重新自动将其配置上,且重新触发形成一个新的view如果一个server非自愿的离开了group,那么错误检测机制就开始识别,也会重新配置上一个新的view上面提到的这些都需要一个协议,并且需要大多数人参与并认可的协议如果这个group没有满足达到这个协议认可的要求,那么自动配置将不会起作用,并且该系统会被阻塞来防止脑裂的产生最后,这意味着管理员需要手动介入来解决这个问题 18.1.3.3 Fault-tolerance MGR 是在Paxos分布式算法构建实现的,以此它需要满足大多数活跃成员进行投票选举的策略。有一个公式:n = 2 x f + 1 , n代表group的成员数,f代表允许挂掉的成员数 ,在这个公式下,整个集群是安全的 如果n=3,那么允许挂掉的server是1,也能满足要求,但是如果再挂一个呢, 其实就问题非常大了 集群成员数量n majority 可允许挂掉的server数量 1 1 0 2 2 0 3 2 1 4 3 1 5 3 2 6 4 2 7 4 3

优秀的个人博客,低调大师

eval()不是魔鬼,只是被误解了(翻译)

原文来自:https://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/ 作者:Nicholas C.Zakas 在JavaScript中,我不确定是否有比eval()受到更多诽谤的。它就是个简单的函数被设计用来将字符串转换为可被执行的JavaScript代码。在我的早期的职业生涯里,它比任何其他的东西更受关注和误解。 大多数人认为‘eval()是魔鬼’这句话是Douglas Crockford说的。他说:“eval函数(及其亲属,Function,setTimeout,和setInterval)提供对JavaScript编译器的访问。这有时是必要的,但大多数情况,它证明这个存在是极其糟糕的代码。因为eval()这个特性常常被误用”。 因为道格拉斯的大多数作品并没有注明日期,所以,我不确定他是否是在2002年创造了这个术语。不管怎么说吧,不管是否真正理解了eval()的使用,他都成为了一个热门的短语。 尽管这种理论流行开来了(道格拉斯的坚持),但这并不意味着eval()的存在就有问题。使用eval()不会自动触发XSS攻击,或者你没有意识到的但存在的安全漏洞。就像工具一样,你要知道如何使用它,但即使你使用不正确,但潜在风险依然很低,并且是可容忍的。 误用(滥用) eval()之所以成为了魔鬼,是因为那些对JavaScript语言理解不够深的人误用的原因。你可能会奇怪,误用跟安全和性能好型没有关系吧。误用是不理解如何在JavaScript中构造和使用引用。假设你有几个表单input的名字包含数字,如:option1,option2,常见的代码实现如下: function isChecked(optionNumber) { return eval("forms[0].option" + optionNumber + ".checked"); } var result = isChecked(1); 在这种情况下,开发人员在尽力尝试写forms[0].option1.checked,而没有想我不用eval()该如何做。这样的情况出现在很多10年左右工作经验的开发者,它们不明白如何更好地使用。这里也不是说eval()在这里不合适,而是因为没有必要,你完全可以更简单的实现,用如下的代码: function isChecked(optionNumber) { return forms[0]["option" + optionNumber].checked; } var result = isChecked(1); 在很多情况下,你可以使用[]表示法来替换eval()的使用去构造属性名,这也是 [] 存在的一个原因。包括道格拉斯在内的早期博主们都是在讨论这个问题。 可调式性 不使用eval()的一个重要理由是为了达到调试的目的。以前,如果出现问题,不可能进入eval()代码。这就意味着你的代码运行在一个黑盒中,然后从中取出。现在Chrome开发工具可以调试eval()内的代码,但是有一个问题是,你必须等代码执行一次后才出现在源面板中。 不使用eval()可以令我们的代码调试起来更容易,跟方便的查看源代码。但这并不能说明eval()是魔鬼,这只是开发工作流程中的一点问题。 性能 对eval()的另一个重要影响是它的性能。在旧的浏览器中,你遇到了双重解释惩罚,也就是说,你的代码被解释,而eval()中的代码被解释。在没有编译JavaScript引擎的浏览器中,结果可能会慢十倍(甚至更糟)。 在现代编译JavaScript的引擎中,eval()仍然是一个问题。大多数引擎可以用两种方式运行代码:快速路径或慢路径。快速路径代码是一种稳定且可预测的代码,因此可以为更快的执行而编译。缓慢的路径代码是不可预测的,这使得编译很难,并且可能仍然使用一个解释程序运行。在你的代码中仅仅存在eval()意味着它是不可预测的,因此将在解释器中运行它以“旧浏览器”的速度运行,而不是“新浏览器”的速度(10倍的差异)。 同样的,eval()使YUI压缩器不可能在调用eval()的范围内munge变量名。由于eval()可以直接访问任何这些变量,重命名它们会引入错误(其他工具如闭包编译器和UglifyJS可能仍然会蒙混这些变量——最终导致错误)。 因此,在使用eval()时,性能仍然是一个大问题。但这很难让它成为邪恶,但这是一个需要注意的警告。 安全 在说到eval()的安全时,这是大部分人认为eval是魔鬼的有力佐证。大多数情况下,就是说XSS攻击,以及eval()如何向它们打开代码。在表面上,这种混淆是可以理解的,因为eval()在页面上下文中可执行任意代码。如果你接受用户输入并通过eval()运行它,这将是危险的。但是,如果你的输入不是来自用户,是否存在真正的危险? 我收到了不止一个的抱怨,在我的CSS解析器中使用eval()的一段代码中使用的代码使用eval()将字符串标记从CSS转换为JavaScript字符串值。除了创建自己的字符串解析器外,这是获得token的正确字符串值的最简单方法。到目前为止,还没有人能够或愿意提出一种攻击方案,在这种情况下,这段代码会引起麻烦,因为: eval()的值来自于tokenizer tokenizer已经验证了它是一个有效的字符串 代码最常在命令行上运行。 即使在浏览器中运行,该代码也被封闭在闭包中,不能直接调用。 当然,由于这段代码的主要目标是命令行,所以这个故事有点不同。 设计用于浏览器的代码面临不同的问题,但是eval()的安全性通常不是其中之一。同样,如果你以某种方式接收用户输入并将其传递给eval(),那么你就是在自找麻烦,不要这样做。但是,如果你使用eval()的输入,只有你控制并且不能被用户修改,那么就没有安全风险。 最常见的攻击是来自服务器的eval()代码。这一模式以引入JSON而著名,它之所以流行,是因为它可以通过eval()快速转换成JavaScript。实际上,Douglas Crockford自己在他的原始JSON实用程序中使用eval(),因为它可以转换速度。他确实添加了检查以确保没有真正的可执行代码,但是实现从根本上是eval()。 现在,大多数人都使用浏览器内置的JSON解析功能来实现这一目的,尽管有些人仍然通过eval()来获取任意的JavaScript,作为延迟加载策略的一部分。一些人认为,这才是真正的安全漏洞。如果正在进行中间人攻击,那么你将在页面上执行任意攻击代码。 中间人攻击被认为是eval()的永远存在的危险,会受到蠕虫的的攻击。但是,这是一个与我无关的场景,因为任何时候你不能相信你正在联系的服务器,就意味着有可能出现很多不好的事情。中间人攻击可以通过多种方式向页面注入代码: 返回通过 <script></script> 加载的JavaScript代码。 通过返回攻击者控制的JSON-P请求代码。 通过从一个Ajax请求返回attacker控制的代码,然后eval()。 此外,这样的攻击可以很容易地窃取cookie和用户数据,而不会改变任何东西,更不用说通过返回攻击者控制的HTML和CSS来进行网络钓鱼的可能性了。 简单地说,eval()不会像加载外部JavaScript那样打开中间人攻击。如果你不能信任服务器上的代码,那么你将遇到比eval()调用更大的问题。 结论 我不是说你应该跑出去,开始使用eval()。实际上,很少有好的用例来运行eval()。对于代码清晰性、调试性,以及不应该忽略的性能,确实存在一些问题。但是在eval()有意义的情况下,你不应该害怕使用它。不要第一次使用它,但是不要让任何人吓到你,认为你的代码在使用eval()时更加脆弱或不安全。 文章稍后可能还会继续修改,也欢迎各位批评指正。有问题或者有其他想法的可以在我的GitHub上pr。

优秀的个人博客,低调大师

Openstack 安装部署指南翻译系列 之 网络

网络包括两种类型,网络选项1:提供商网络(Provider networks)和网络选项2:自助网络(Self-service networks),其中网络选项2:自助网络(Self-service networks)能够实现更加高级的网络功能,能够实现网络选项1的所有功能,因此我们的项目选择网络选项2:自助网络(Self-service networks)。以下是虚拟网络选项的说明: 1.1.1.1.网络选项1:提供商网络(Providernetworks) 提供商网络选项以最简单的方式部署OpenStack网络服务,主要是第2层(桥接/交换)服务和网络的VLAN分段。本质上,它将虚拟网络与物理网络相结合,并依赖物理网络基础设施进行第3层(路由)服务。另外,DHCP服务为实例提供IP地址信息。 OpenStack用户需要有关底层网络基础设施的更多信息来创建一个完全匹配基础架构的虚拟网络。 此选项不支持自助服务(私有)网络,第3层(路由)服务以及高级服务,如 LBaaS和 FWaaS。如果希望这些功能,需要自助服务网络选项(Self-service networks)。 1.1.1.1.网络选项2:自助网络(Self-service networks) 自助服务网络选项通过层次3(路由)服务来提供提供商网络选项,使服务网络能够使用覆盖分段方法(如VXLAN)。基本上,它使用NAT将虚拟网络路由到物理网络。此外,此选项为高级服务(如LBaaS和FWaaS)提供了基础。 OpenStack用户可以创建虚拟网络,而无需了解数据网络上的基础架构。如果相应地配置了第二层插件,这也可以包括VLAN网络。 ' 本文转自yuweibing51CTO博客,原文链接:http://blog.51cto.com/yuweibing/1981168 ,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册