• 关于

    停止node服务器

    的搜索结果

回答

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?”尽管不是针对所有人的,但 Node 可能是某些人的正确选择。 为试图解释什么是 Node.js,本文探究了它能解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 何时是和何时不是一个好的解决方案。本文不涉及如何编写一个复杂的 Node 应用程序,也不是一份全面的 Node 教程。阅读本文应该有助于您决定是否应该学习 Node,以便将其用于您的业务。 Node 旨在解决什么问题? Node 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”。当前的服务器程序有什么问题?我们来做个数学题。在 Java™ 和 PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要 2 MB 配套内存。在一个拥有 8 GB RAM 的系统上,理论上最大的并发连接数量是 4,000 个用户。随着您的客户端基础的增长,您希望您的 web 应用程序支持更多用户,这样,您必须添加更多服务器。当然,这会增加业务成本,尤其是服务器成本、运输成本和人工成本。除这些成本上升外,还有一个技术问题:用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。例如,在 Java 中,静态变量和缓存需要在每个服务器上的 JVMs 之间共享。这就是整个 web 应用程序架构中的瓶颈:一个服务器能够处理的并发连接的最大数量。 Node 解决这个问题的方法是:更改连接连接到服务器的方式。每个连接都创建一个进程,该进程不需要配套内存块,而不是为每个连接生成一个新的 OS 线程(并向其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。事实上,Node 通过将整个系统中的瓶颈从最大连接数量更改到单个系统的流量来改变服务器面貌。 现在您有了一个能处理数万条并发连接的程序,那么您能通过 Node 实际构建什么呢?如果您有一个 web 应用程序需要处理这么多连接,那将是一件很 “恐怖” 的事!那是一种 “如果您有这个问题,那么它根本不是问题” 的问题。在回答上面的问题之前,我们先看看 Node 如何工作以及它被设计的如何运行。 Node 肯定不是什么 没错,Node 是一个服务器程序。但是,它肯定不 像 Apache 或 Tomcat。那些服务器是独立服务器产品,可以立即安装并部署应用程序。通过这些产品,您可以在一分钟内启动并运行一个服务器。Node 肯定不是这种产品。Apache 能添加一个 PHP 模块来允许开发人员创建动态 web 页,使用 Tomcat 的程序员能部署 JSPs 来创建动态 web 页。Node 肯定不是这种类型。 在 Node 的早期阶段(当前是 version 0.4.6),它还不是一个 “运行就绪” 的服务器程序,您还不能安装它,向其中放置文件,拥有一个功能齐全的 web 服务器。即使是要实现 web 服务器在安装完成后启动并运行这个基本功能,也还需要做大量工作。 Node 如何工作 Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?没错,您没有看错。服务器端 JavaScript 是一个相对较新的概念,这个概念是大约两年前在 developerWorks 上讨论 Aptana Jaxer 产品时提到的(参见 参考资料)。尽管 Jaxer 一直没有真正流行,但这个理念本身并不是遥不可及的 — 为何不能在服务器上使用客户机上使用的编程语言? 什么使 V8?V8 JavaScript 引擎是 Google 用于他们的 Chrome 浏览器的底层 JavaScript 引擎。很少有人考虑 JavaScript 在客户机上实际做了些什么?实际上,JavaScript 引擎负责解释并执行代码。使用 V8,Google 创建了一个以 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。它不仅限于在一个浏览器中运行。因此,Node 实际上使用 Google 编写的 V8 JavaScript 引擎并将其重建为在服务器上使用。太完美了!既然已经有一个不错的解决方案可用,为何还要创建一种新语言呢? 事件驱动编程 许多程序员接受的教育使他们认为,面向对象编程是完美的编程设计,而对其他编程方法不屑一顾。Node 使用一个所谓的事件驱动编程模型。 清单 1. 客户端上使用 jQuery 的事件驱动编程 复制代码 代码如下: // jQuery code on the client-side showing how Event-Driven programming works // When a button is pressed, an Event occurs - deal with it // directly right here in an anonymous function, where all the // necessary variables are present and can be referenced directly $("#myButton").click(function(){ if ($("#myTextField").val() != $(this).val()) alert("Field must match button text"); }); 实际上,服务器端和客户端没有任何区别。没错,这没有按钮点击操作,也没有向文本字段键入的操作,但在一个更高的层面上,事件正在 发生。一个连接被建立 — 事件!数据通过连接接收 — 事件!数据通过连接停止 — 事件! 为什么这种设置类型对 Node 很理想?JavaScript 是一种很棒的事件驱动编程语言,因为它允许匿名函数和闭包,更重要的是,任何写过代码的人都熟悉它的语法。事件发生时调用的回调函数可以在捕获事件处编写。这样,代码容易编写和维护,没有复杂的面向对象框架,没有接口,没有在上面架构任何内容的潜能。只需监听事件,编写一个回调函数,然后,事件驱动编程将照管好一切! 示例 Node 应用程序 最后,我们来看一些代码!让我们将讨论过的所有内容综合起来,创建我们的第一个 Node 应用程序。由于我们已经知道,Node 对于处理高流量应用程序很理想,我们就来创建一个非常简单的 web 应用程序 — 一个为实现最大速度而构建的应用程序。下面是 “老板” 交代的关于我们的样例应用程序的具体要求:创建一个随机数字生成器 RESTful API。这个应用程序应该接受一个输入:一个名为 “number” 的参数。然后,应用程序返回一个介于 0 和该参数之间的随机数字,并将生成的数字返回调用者。由于 “老板” 希望它成为一个广泛流行的应用程序,因此它应该能处理 50,000 个并发用户。我们来看看代码: 清单 2. Node 随机数字生成器 复制代码 代码如下: // these modules need to be imported in order to use them. // Node has several modules. They are like any #include // or import statement in other languages var http = require("http"); var url = require("url"); // The most important line in any Node file. This function // does the actual process of creating the server. Technically, // Node tells the underlying operating system that whenever a // connection is made, this particular callback function should be // executed. Since we're creating a web service with REST API, // we want an HTTP server, which requires the http variable // we created in the lines above. // Finally, you can see that the callback method receives a 'request' // and 'response' object automatically. This should be familiar // to any PHP or Java programmer. http.createServer(function(request, response) { // The response needs to handle all the headers, and the return codes // These types of things are handled automatically in server programs // like Apache and Tomcat, but Node requires everything to be done yourself response.writeHead(200, {"Content-Type": "text/plain"}); // Here is some unique-looking code. This is how Node retrives // parameters passed in from client requests. The url module // handles all these functions. The parse function // deconstructs the URL, and places the query key-values in the // query object. We can find the value for the "number" key // by referencing it directly - the beauty of JavaScript. var params = url.parse(request.url, true).query; var input = params.number; // These are the generic JavaScript methods that will create // our random number that gets passed back to the caller var numInput = new Number(input); var numOutput = new Number(Math.random() * numInput).toFixed(0); // Write the random number to response response.write(numOutput); // Node requires us to explicitly end this connection. This is because // Node allows you to keep a connection open and pass data back and forth, // though that advanced topic isn't discussed in this article. response.end(); // When we create the server, we have to explicitly connect the HTTP server to // a port. Standard HTTP port is 80, so we'll connect it to that one. }).listen(80); // Output a String to the console once the server starts up, letting us know everything // starts up correctly console.log("Random Number Generator Running..."); 将上面的代码放到一个名为 “random.js” 的文件中。现在,要启动这个应用程序并运行它(进而创建 HTTP 服务器并监听端口 80 上的连接),只需在您的命令提示中输入以下命令:% node random.js。下面是服务器已经启动并运行时它看起来的样子: 复制代码 代码如下: root@ubuntu:/home/moila/ws/mike# node random.js Random Number Generator Running... 访问应用程序 应用程序已经启动并运行。Node 正在监听任何连接,我们来测试一下。由于我们创建了一个简单的 RESTful API,我们可以使用我们的 web 浏览器来访问这个应用程序。键入以下地址(确保您完成了上面的步骤):localhost/?number=27。 您的浏览器窗口将更改到一个介于 0 到 27 之间的随机数字。单击浏览器上的 “重新载入” 按钮,将得到另一个随机数字。就是这样,这就是您的第一个 Node 应用程序! Node 对什么有好处? 到此为止,应该能够回答 “Node 是什么” 这个问题了,但您可能还不清楚什么时候应该使用它。这是一个需要提出的重要问题,因为 Node 对有一些东西有好处,但相反,对另一些东西而言,目前 Node 可能不是一个好的解决方案。您需要小心决定何时使用 Node,因为在错误的情况下使用它可能会导致一个多余编码的 LOT。 它对什么有好处? 正如您此前所看到的,Node 非常适合以下情况:您预计可能有很高的流量,而在响应客户端之前服务器端逻辑和处理所需不一定是巨大的。Node 表现出众的典型示例包括: 1.RESTful API 提供 RESTful API 的 web 服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合 Node 的理想情况,因为您可以构建它来处理数万条连接。它还不需要大量逻辑;它只是从一个数据库查找一些值并组合一个响应。由于响应是少量文本,入站请求时少量文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的 API 需求。 2.Twitter 队列 想像一下像 Twitter 这样的公司,它必须接收 tweets 并将其写入一个数据库。实际上,每秒几乎有数千条 tweets 达到,数据库不可能及时处理高峰时段需要的写入数量。Node 成为这个问题的解决方案的重要一环。如您所见,Node 能处理数万条入站 tweets。它能迅速轻松地将它们写入一个内存排队机制(例如 memcached),另一个单独进程可以从那里将它们写入数据库。Node 在这里的角色是迅速收集 tweet 并将这个信息传递给另一个负责写入的进程。想象一下另一种设计 — 一个常规 PHP 服务器自己试图处理对数据库的写入 — 每个 tweet 将在写入数据库时导致一个短暂的延迟,这是因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理 2000 条入站 tweets。每秒 100 万条 tweets 需要 500 个服务器。相反,Node 能处理每个连接而不会阻塞通道,从而能捕获尽可能多的 tweets。一个能处理 50,000 条 tweets 的 Node 机器只需要 20 个服务器。 3.映像文件服务器 一个拥有大型分布式网站的公司(比如 Facebook 或 Flickr)可能会决定将所有机器只用于服务映像。Node 将是这个问题的一个不错的解决方案,因为该公司能使用它编写一个简单的文件检索器,然后处理数万条连接。Node 将查找映像文件,返回文件或一个 404 错误,然后什么也不用做。这种设置将允许这类分布式网站减少它们服务映像、.js 和 .css 文件等静态文件所需的服务器数量。 它对什么有坏处? 当然,在某些情况下,Node 并非理想选择。下面是 Node 不擅长的领域: 1.动态创建的页 目前,Node 没有提供一种默认方法来创建动态页。例如,使用 JavaServer Pages (JSP) 技术时,可以创建一个在这样的 JSP 代码段中包含循环的 index.jsp 页。Node 不支持这类动态的、HTML 驱动的页面。同样,Node 不太适合作为 Apache 和 Tomcat 这样的网页服务器。因此,如果您想在 Node 中提供这样一个服务器端解决方案,必须自己编写整个解决方案。PHP 程序员不想在每次部署 web 应用程序时都编写一个针对 Apache 的 PHP 转换器,当目前为止,这正是 Node 要求您做的。 2. 关系数据库重型应用程序 Node 的目的是快速、异步和非阻塞。数据库并不一定分享这些目标。它们是同步和阻塞的,因为读写时对数据库的调用在结果生成之前将一直阻塞通道。因此,一个每个请求都需要大量数据库调用、大量读取、大量写入的 web 应用程序非常不适合 Node,这是因为关系数据库本身就能抵销 Node 的众多优势。(新的 NoSQL 数据库更适合 Node,不过那完全是另一个主题了。) 结束语 问题是 “什么是 Node.js?” 应该已经得到解答。阅读本文之后,您应该能通过几个清晰简洁的句子回答这个问题。如果这样,那么您已经走到了许多编码员和程序员的前面。我和许多人都谈论过 Node,但它们对 Node 究竟是什么一直很迷惑。可以理解,他们具有的是 Apache 的思维方式 — 服务器是一个应用程序,将 HTML 文件放入其中,一切就会正常运转。而 Node 是目的驱动的。它是一个软件程序,使用 JavaScript 来允许程序员轻松快速地创建快速、可伸缩的 web 服务器。Apache 是运行就绪的,而 Node 是编码就绪的。 Node 完成了它提供高度可伸缩服务器的目标。它并不分配一个 “每个连接一个线程” 模型,而是使用一个 “每个连接一个流程” 模型,只创建每个连接需要的内存。它使用 Google 的一个非常快速的 JavaScript 引擎:V8 引擎。它使用一个事件驱动设计来保持代码最小且易于阅读。所有这些因素促成了 Node 的理想目标 — 编写一个高度可伸缩的解决方案变得比较容易。 与理解 Node 是 什么同样重要的是,理解它不是 什么。Node 并不是 Apache 的一个替代品,后者旨在使 PHP web 应用程序更容易伸缩。事实确实如此。在 Node 的这个初始阶段,大量程序员使用它的可能性不大,但在它能发挥作用的场景中,它的表现非常好。 将来应该期望从 Node 得到什么呢?这也许是本文引出的最重要的问题。既然您知道了它现在的作用,您应该会想知道它下一步将做什么。在接下来的一年中,我期待着 Node 提供与现有的第三方支持库更好地集成。现在,许多第三方程序员已经研发了用于 Node 的插件,包括添加文件服务器支持和 MySQL 支持。希望 Node 开始将它们集成到其核心功能中。最后,我还希望 Node 支持某种动态页面模块,这样,您就可以在 HTML 文件中执行在 PHP 和 JSP(也许是一个 NSP,一个 Node 服务器页)中所做的操作。最后,希望有一天会出现一个 “部署就绪” 的 Node 服务器,可以下载和安装,只需将您的 HTML 文件放到其中,就像使用 Apache 或 Tomcat 那样。Node 现在还处于初始阶段,但它发展得很快,可能不久就会出现在您的视野中。 答案来源于网络

养狐狸的猫 2019-12-02 02:17:03 0 浏览量 回答数 0

回答

WEB服务器中的504一般是由于CGI服务器(一般是PHP,也可能是NODE或其他)未正常运行,启动或重启即可。根本解决该问题应该观察web服务器与CGI服务的性能配合,找到引起CGI服务异常停止的原因,CGI服务的日志可以提供有用的信息,很卡也说明配置有需要改善之处。请登录服务器检查配置。

望星星降 2019-12-01 23:58:09 0 浏览量 回答数 0

问题

关闭控制台后,NestJS服务器死了吗?

祖安文状元 2020-01-16 17:35:53 0 浏览量 回答数 1

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

问题

配置 webpack出现 ERRCONTENTLENGTHMISMATCH

o浅底 2019-12-01 20:58:04 2993 浏览量 回答数 3

回答

微信公众平台的上传服务是使用“\r\n”结尾的,只有遇到了“\r\n”以后才会停止对 form-data 的解释,而 node-form-data 的默认实现是不发送最后的“\r\n”的,因此,微信的服务器并不能对这种请求进行完整解释。这个应该算是微信服务器的 bug 。 解决办法就是找到一种方法使微信服务器完整地接受 form-data 的 media 参数部分。一种潜在的方法是再增加一个 form-data 的参数,使得微信能够完整地处理 media 的部分。 例如: var r = request.post({ url: "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" + access_token + "&type=image", // json: true, headers: { 'accept': '/' } }, function (err, res, body) { console.log(body); }); var form = r.form(); form.append('media', fs.createReadStream("/usr/share/pixmaps/debian-logo.png")); form.append('hack', ''); 这样就可以解决上传的问题了。######为什么我在本地测试可以上传.放到服务器上就传不上了41005

kun坤 2020-05-29 18:22:31 0 浏览量 回答数 0

问题

windows下配置mysql集群:配置报错 

kun坤 2020-06-02 16:42:46 0 浏览量 回答数 1

问题

windows下配置mysql集群 :报错

kun坤 2020-06-14 17:56:02 0 浏览量 回答数 1

问题

windows下配置mysql集群-mysql报错

montos 2020-06-01 21:21:42 0 浏览量 回答数 1

问题

windows下配置mysql集群,数据库报错

python小菜菜 2020-06-01 15:56:00 0 浏览量 回答数 1

问题

windows下配置mysql集群,数据库报错

python小菜菜 2020-06-01 15:35:58 0 浏览量 回答数 1

回答

弹性高性能计算E-HPC的管理控制台提供了E-HPC集群节点相关的节点查询、重启、重置、删除、停机等功能,以及调度器管理功能,如节点队列创建、迁移、删除。 进入节点管控界面 进入E-HPC管理控制台,点选左侧栏的节点和队列标签,进入如下界面: node-management_summary 选择节点 选出需要调整的节点主要有以下步骤: 选择地域 关于地域的说明,请参考地域和可用区 节点所属集群所在的地域即为节点所在地域,需通过地域筛选出节点所在集群。 选择集群 在地域标签下方,点击集群选择框旁边的下拉菜单,根据集群名称可选择节点所在的集群。 选择节点类型 E-HPC集群主要有三种节点类型,可在节点类型按钮旁边的下拉框选择节点。 (1)管控节点,包括调度服务器和域帐户服务器。 调度服务器:主要作用是运行PBS或SLURM等调度工具的服务端,处理作业提交、管理调度等。 域帐户服务器:集中管理E-HPC集群内用户帐户。 (2)计算节点 运行高性能计算作业的服务器,其配置决定了E-HPC集群总体性能。 (3)登录节点 E-HPC集群普通用户能够操作的唯一节点类型。您可在登录节点上进行软件调试、编译和安装,作业提交等操作。 管理节点 完成以上节点所在地域、集群以及节点类型选择后,您可从节点概要信息表中找到需要调整的节点,在右侧操作栏点击“重启”或“更多”按钮,进行重启节点、重置节点、删除节点、查看详情等操作;对于多个节点,可进行批量停机、启动、删除操作。 重启节点 注意:如无特殊需要(如故障修复等),请勿对处于运行中状态的节点执行重启操作。 点击重启按钮,在弹出界面选择普通重启或强制重启。 node-management_node_reboot 普通重启:向节点上运行的操作系统(如CentOS)远程发送重启指令,由操作系统完成终止进程,系统重启等操作。相当于物理机按下Ctrl+Alt+Del触发的重启。 强制重启:直接重启节点运行的虚拟机,相当于物理机按下Reset按钮。一般是普通重启无效时才使用强制重启方式。 提醒:当节点重启无法修复故障时可尝试 重置节点。 重置节点 注意:如无特殊需要(如故障修复等),请勿对处于运行中状态的节点执行重置操作。 点开更多下拉菜单,点击重置节点按钮,确认后即触发节点重置流程: 把当前节点恢复到刚创建ECS实例云服务器的初始状态 重新安装初始化E-HPC管控系统,如调度配置或域帐号管理配置等 重新安装E-HPC集群软件栈 加入E-HPC集群 3. 删除节点 注意:仅计算节点可从集群移除,管控节点和登录节点不可删除。且删除计算节点是目前集群缩容的唯一途径。若需增加计算节点,请参考集群扩容。 单个节点删除:点开更多按钮下拉菜单,点击删除节点按钮,确认后节点将释放。 批量节点删除:勾选需要删除的计算节点,点击界面上方批量删除按钮,确认后选中节点将被全部释放。 4. 停机和启动 注意:仅计算节点可进行停机操作,管控节点和登录节点不可停机。 E-HPC控制台支持批量节点的停机和启动操作。 节点停机:首先,勾选需要停机的节点,然后点击上方停机按钮,确认后选中的节点将全部被停机。 节点启动:同理,勾选需要启动的节点(说明:节点已处在停机状态,否则不可启动),点击上方启动按钮,确认后停机节点将在5分钟左右被全部启动。 节点启动推荐使用上面的方法。 除了以上启动方式外,您也可以进入云服务器ECS管理控制台,选择左侧的 实例 标签,跳转后选择您集群所在region,找到被停止的实例,点击 实例ID 进入停止实例页面,最后在右上角,点击启动按钮,启动该节点。操作完成之后,再去E-HPC管理控制台的节点界面,查看节点启动成功。 调度器管理 为更高效的管理大量运行作业的计算节点,E-HPC推出调度器管理功能,将运行不同作业或执行不同任务的节点进行分类,加入到不同的队列进行分类管理。如下图所示: newqueue 首先,选择集群节点类型为计算节点,点击新建队列按钮,在弹出框输入队列名称,确认后队列创建完成。 说明:新建的队列,可以在”队列”栏的下拉框中查看。 其次,新创建的队列中不包含节点,您可以勾选需要移动到新队列的节点,然后点击移动到队列按钮,在弹出框选择目标队列,确认后即可完成迁移。 最后,删除不需要的队列时,只需要在“队列”栏选择需要删除的队列名称,然后点击删除队列按钮,确认后即可完成删除操作。 说明: 1. 默认队列不可删除;2. 使用pbs调度器的集群,队列中存在节点时不可删除;

1934890530796658 2020-03-23 17:11:57 0 浏览量 回答数 0

问题

云服务器 ECS Linux 磁盘空间常见问题处理方法有哪些

boxti 2019-12-01 22:05:04 1363 浏览量 回答数 0

回答

问题描述 在Linux系统的云服务器ECS实例内创建文件时,出现类似如下空间不足的提示。 No space left on device … 问题原因 导致该问题的可能原因如下所示。 磁盘分区空间使用率达到百分之百。 磁盘分区inode使用率达到百分之百。 存在僵尸文件。 注:已删除文件因句柄被占用未释放,导致相应空间未释放的文件。 挂载点覆盖。 注:在原有文件系统的相应目录下已经存在大量文件。挂载新磁盘后,导致使用df命令能统计到相关空间使用,而使用su命令统计不到。 解决方案 阿里云提醒您: 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 要解决该问题,请根据不同的问题原因,通过如下方式进行处理。 分区容量满 inode容量满 修改inode数量 僵尸文件分析删除 挂载点覆盖 分区容量满的处理 登录服务器,使用df -h命令查看磁盘使用率,其中的 Mounted on 指挂载的目录。 进入根目录,执行如下指令,逐级查看哪个目录占用磁盘空间较大,进入该目录,直到找到最精确的的文件或目录。du -sh *系统显示类似如下。 du -sh * 系统显示类似如下。 最后,结合业务情况等判断对相关文件或目录进行删除,或者购买更大的数据盘分担处理。 inode容量满的处理 通过如下操作,解决inode容量满的问题。 查询inode使用情况 Linux的inode节点中,记录了文件的类型、大小、权限、所有者、文件连接的数目、创建时间与更新时间等重要的信息,还有一个比较重要的内容就是指向数据块的指针。一般情况不需要特殊配置,如果存放文件很多,则需要配置。有时磁盘空间有剩余但是不能存放文件,可能是由于inode耗尽所致。 执行df -i命令,可以查询inode的使用情况。 如果inode使用率达到或者接近100%,可以通过如下两种方式进行处理。 清除inode占用高的文件或者目录。 修改inode数量。 清除inode占用高的文件或者目录 如果不方便格式化磁盘以增加inode数量,可以参考如下步骤,清理inode占用量高的文件或者目录。 登录服务器,执行如下命令,分析根目录下的每个二级目录下有多少个文件。 for i in /*; do echo $i; find $i | wc -l; done 系统显示类似如下。 然后,逐层进入inode占用最高的目录,继续执行上述指令,逐步定位占用过高空间的文件或目录,最后进行相应清理。 修改inode数量 如果不允许清理磁盘中的文件,或者清理后inode使用率仍然较高,则需要通过如下步骤,增加inode节点数量。 注:inode的调整需要重新格式化磁盘,请确保数据已经得到有效备份后,再进行以下操作。 执行如下命令,卸载系统文件。 umount /home 执行如下命令,重新建立文件系统,指定inode节点数。 mkfs.ext3 /dev/xvdb -N 1638400 注:本文指定inode节点数1638400,现场实际环境请以实际为准。 执行如下命令,修改fstab文件。 vim /etc/fstab 执行如下命令,查看修改后的inode节点数。 dumpe2fs -h /dev/xvdb | grep node 系统显示类似如下。 僵尸文件分析与删除 如果磁盘和inode都没有问题,则需要查看是否存在未被清除句柄的僵尸文件。这些文件实际上已经被删除,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间。如果这些文件过多,会占用很大的磁盘空间。参考以下步骤查看并删除僵尸文件。 远程登录服务器。 执行如下命令,安装lsof。 yum install lsof -y 执行如下命令,查看僵尸文件占用情况。 lsof |grep delete | more 系统显示类似如下。 如果这些文件过多,会占用很大的磁盘空间。可以通过如下方法来释放句柄,以清除僵尸文件。 重启服务器,验证效果。重启服务器,系统会退出现有的进程,开机后重新加载。该过程会释放调用的deleted文件的句柄。 根据lsof命令列出的pid进程号,使用kill命令正常停止或结束占用这些文件的服务进程。 注:如果服务器正在运行业务,可能会影响到业务,请慎重操作。 挂载点覆盖 先取消磁盘挂载,再检查原挂载目录下的空间占用情况。

1934890530796658 2020-03-26 09:28:02 0 浏览量 回答数 0

回答

问题描述 在Linux系统的云服务器ECS实例内创建文件时,出现类似如下空间不足的提示。 No space left on device … 问题原因 导致该问题的可能原因如下所示。 磁盘分区空间使用率达到百分之百。 磁盘分区inode使用率达到百分之百。 存在僵尸文件。 注:已删除文件因句柄被占用未释放,导致相应空间未释放的文件。 挂载点覆盖。 注:在原有文件系统的相应目录下已经存在大量文件。挂载新磁盘后,导致使用df命令能统计到相关空间使用,而使用su命令统计不到。 解决方案 阿里云提醒您: 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 要解决该问题,请根据不同的问题原因,通过如下方式进行处理。 分区容量满 inode容量满 修改inode数量 僵尸文件分析删除 挂载点覆盖 分区容量满的处理 登录服务器,使用df -h命令查看磁盘使用率,其中的 Mounted on 指挂载的目录。 进入根目录,执行如下指令,逐级查看哪个目录占用磁盘空间较大,进入该目录,直到找到最精确的的文件或目录。du -sh *系统显示类似如下。 du -sh * 系统显示类似如下。 最后,结合业务情况等判断对相关文件或目录进行删除,或者购买更大的数据盘分担处理。 inode容量满的处理 通过如下操作,解决inode容量满的问题。 查询inode使用情况 Linux的inode节点中,记录了文件的类型、大小、权限、所有者、文件连接的数目、创建时间与更新时间等重要的信息,还有一个比较重要的内容就是指向数据块的指针。一般情况不需要特殊配置,如果存放文件很多,则需要配置。有时磁盘空间有剩余但是不能存放文件,可能是由于inode耗尽所致。 执行df -i命令,可以查询inode的使用情况。 如果inode使用率达到或者接近100%,可以通过如下两种方式进行处理。 清除inode占用高的文件或者目录。 修改inode数量。 清除inode占用高的文件或者目录 如果不方便格式化磁盘以增加inode数量,可以参考如下步骤,清理inode占用量高的文件或者目录。 登录服务器,执行如下命令,分析根目录下的每个二级目录下有多少个文件。 for i in /*; do echo $i; find $i | wc -l; done 系统显示类似如下。 然后,逐层进入inode占用最高的目录,继续执行上述指令,逐步定位占用过高空间的文件或目录,最后进行相应清理。 修改inode数量 如果不允许清理磁盘中的文件,或者清理后inode使用率仍然较高,则需要通过如下步骤,增加inode节点数量。 注:inode的调整需要重新格式化磁盘,请确保数据已经得到有效备份后,再进行以下操作。 执行如下命令,卸载系统文件。 umount /home 执行如下命令,重新建立文件系统,指定inode节点数。 mkfs.ext3 /dev/xvdb -N 1638400 注:本文指定inode节点数1638400,现场实际环境请以实际为准。 执行如下命令,修改fstab文件。 vim /etc/fstab 执行如下命令,查看修改后的inode节点数。 dumpe2fs -h /dev/xvdb | grep node 系统显示类似如下。 僵尸文件分析与删除 如果磁盘和inode都没有问题,则需要查看是否存在未被清除句柄的僵尸文件。这些文件实际上已经被删除,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间。如果这些文件过多,会占用很大的磁盘空间。参考以下步骤查看并删除僵尸文件。 远程登录服务器。 执行如下命令,安装lsof。 yum install lsof -y 执行如下命令,查看僵尸文件占用情况。 lsof |grep delete | more 系统显示类似如下。 如果这些文件过多,会占用很大的磁盘空间。可以通过如下方法来释放句柄,以清除僵尸文件。 重启服务器,验证效果。重启服务器,系统会退出现有的进程,开机后重新加载。该过程会释放调用的deleted文件的句柄。 根据lsof命令列出的pid进程号,使用kill命令正常停止或结束占用这些文件的服务进程。 注:如果服务器正在运行业务,可能会影响到业务,请慎重操作。 挂载点覆盖 先取消磁盘挂载,再检查原挂载目录下的空间占用情况。

1934890530796658 2020-03-26 09:27:40 0 浏览量 回答数 0

问题

云服务器 ECS Linux 磁盘空间满(含 inode 满)问题如何排查

boxti 2019-12-01 22:04:42 1547 浏览量 回答数 0

回答

教程资源类 freeCodeCamp/freeCodeCamp 免费代码训练营 EbookFoundation/free-programming-book 免费编程图书 sindresorhus/awesome awesome 列表的列表。这个项目起源于某个人做了一个 awesome-php 的 php 优质资源 列表,然后大家就做了 awesome-python,awesome-vue 等各种列表,这个项目又把 各种 awesome 列表收集了起来。 CyC2018/CS-Notes 国人编写的计算机基础教程,中文 jwasham/coding-interview-university 面试考点总结 h5bp/Front-end-Developer-Interview-Questions 前端工程师面试问题 vinta/awesome-python Python 的一些优质资源. 前面提到的 awesome 系列列表,不再赘述 airbnb/javascript Airbnb 的 js 编码规范,值得参考。 github/gitignore GitHub 提供的各种项目的 gitignore 文件模板,省了自己写了 getify/You-Dont-Know-JS 前端(JS)的一些坑的总结 vuejs/awesome-vue Vue 的一些优质资源. awesome 系列,不再赘述 前端 UI 框架/库 twbs/bootstrap Twitter 推出的前端 UI 框架,有网格系统和各种组件,曾经常年在 GitHub 上排名第一,可以说是后端工程师画界面的利器。 竞品:Semantic UI, pure-css FontAwesome/Font-Awesome 字体和图标库,可以使用 SVG 和字体等等多种格式。 ant-design/ant-design 蚂蚁金服出的 react/vue 组件库,前一阵大名鼎鼎的“圣诞彩蛋”就是这个库搞得。主要 提供 React 的组件库,用于企业中后端的后台的建设。关于 React/Vue 和前端的组 件化是一个很有意思的话题,可以查阅相关资料。 和 Bootstrap 等的区别在于,Bootstrap 更偏向于 UI 方面,是 CSS 框架,而 antd 则是完整的包括 UI 和功能在内的 React 组件。可以理解为 Bootstrap 只做了“皮”, 而 antd 是 “皮” + “骨”。 Semantic-Org/Sematic-UI 和 Bootstrap 类似的一个组件库。Semantic UI 更强调使用语义化的 class 来定义样式 google / material-design-icons Google 推出的 Material 风格图标库。 daneden/animate.css CSS 动画效果库 大前端框架和库 vuejs/vue Vue 是国人推出的一个前端框架,可以通过写不同的 Vue 组件来组成一个完整的应用, 支持服务端渲染(SSR)。和 React 一样,Vue 也使用了 Virtual-DOM 技术来提高性能。 facebook/react facebook 推出的一个前端框架,特点是每个组件的 HTML/JS/CSS 组合在一起,使用 Virtual-DOM 渲染。在 React 出现之前,前端框架普遍采用了后端广泛使用的 MVC 模式,强调 HTML/JS/CSS 三者要分离,而 React 则反其道而行之,强调从组件构建, 可以说 React 的出现是前端界的一场革命。 facebook/react-native 使用 React 的语法来构建 native app,注意这里并不是使用一个 iOS 或者 Android 的 WebView 中嵌套了一个 webapp,而是直接使用 JS 来操作原生组件。 angular/angular.js Google 推出的前端框架,没用过 reactjs/redux react.js 的一个组件,用来管理数据。 meteor/meteor 前几年火过一阵,号称要统一前后端,然而我从来没搞明白到底是干啥的,如今热度已经 大减了。HN 上甚至直接有人问 Is meteor.js dead? webpack/webpack 用于打包前端资源 chartjs/Chart.js 前端数据可视化组件 electron 可以使用前端的工具链来编写桌面应用,同时能够跨平台。 jQuery 老牌的跨浏览器兼容库。随着浏览器的发展,现在使用 jQuery 的越来越少了。 create-react-app 用来构造 react app 的辅助工具。 d3.js 前端数据可视化组件 后端工具 elasticsearch 使用 Java 编写的一个搜索工具,要实现全文搜索的话,选择 ES 就对了。 moby Docker 的内核. Docker 可以让你打包应用的所有环境, 像虚拟机一样隔离, 但是又不像虚拟机 一样过多消耗资源. 库 ReactiveX/RxJava TODO 一种编程模式,现在还不是很了解。 机器学习 TensorFlow Google 推出的深度学习库, 目前占主流地位. 语言 Microsoft/TypeScript 微软推出的一个 JavaScript 的超集。我们知道 JavaScript 是一个动态弱类型的语言, 这种特性在小项目上很方便,然而随着前端项目越来越大,强类型对于程序正确性的保证 就显得越来越重要了。TypeScript 重点就在于增强了类型,甚至名字都叫 TypeScript。 强类型的语言是近年来语言的发展趋势,新语言诸如 Rust、Go、Swift 都是强类型的 语言。而一些老语言,比如 Python 也加入了 Type Hint 的功能来增强类型支持。 Apple/swift Apple 推出的新语言,用来代替 Obj-C。 golang Google 推出的编程语言。特点是通过 Goroutine 支持高并发。 nodejs 可以在服务器上运行的 js。 通用工具类 hakimel / reveal.js 使用 js 来做 PPT 的一个框架或者说工具 GoogleChrome/puppeteer Google 推出的操作 Chrome 浏览器的 node.js API。可以用在自动化测试和爬虫等领域。 官方 API 的推出基本上意味着第三方工具已经失去意义了。比如说 Phantom.js 直接宣 布停止维护了。 atom GitHub 推出的一个代码编辑器。 oh-my-zsh zsh 的增强组件集,可以让你的 shell 异常强大, 建议刚学命令行的可以体验一下. vscode 微软推出的代码编辑工具,目前占据了市场优势地位。 Web 框架 rails Ruby 的一个 MVC 模式的 web 框架,当年可谓大红大紫,现在似乎热度有所衰减了, 可能是因为大家都不写 Web 应用了。 expressjs Node.js 的一个 Web 框架。 http://socket.io 实现 WebSocket 的一个库,使用 node.js 编写。WebSocket 是在浏览器和服务器之间 实现全双工通信的一个协议。 laravel 一个比较现代的 PHP MVC web 框架,不过 PHP 这几年的热度衰减也很厉害,好多搞 PHP 的都直接转 Go 了。 内核 torvalds/linux 这个不用说了吧。评论里提到 Linux 的贡献者在 GitHub 上显示为正无穷, 厉害了.

有只黑白猫 2020-01-15 16:53:45 0 浏览量 回答数 0

回答

使用了3个后端架构 Spring Boot 小程序云应用支持部署Spring Boot框架的小程序应用,确保您要部署的小程序应用满足云应用的要求。 Spring Boot框架应用配置要求 将使用Spring Boot技术栈的代码部署到云端服务器上时,会启动一个Nginx服务器和一个Spring Boot的应用服务器。部署Spring Boot框架的应用,需要满足以下要求: 软件包格式:JAR文件 JVM版本:Java 8及以下 端口:服务监听端口为8080 启动/停止:无特殊要求,标准Spring Boot方式 自定义Nginx配置测试 小程序云应用通过一层Nginx代理对外提供服务,可以通过在发布包中提供对应环境的Nginx配置文件来自定义Nginx配置。如果没有提供,或文件名称不符,则自动使用默认的配置。 您可以在resources下可以创建nginx目录,目录下的nginx-test.conf文件以及nginx-prod.conf文件将分别作为为测试环境和生产环境的nginx配置文件。 测试环境默认配置: worker_processes 1; error_log /home/admin/logs/nginx-error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name 127.0.0.1:8080; location / { proxy_pass http://127.0.0.1:8080; } } } 生产环境默认配置: worker_processes 1; error_log /home/admin/logs/nginx-error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 443; server_name 127.0.0.1:8080; ssl on; ssl_certificate /home/admin/sslcert/cert.pem; ssl_certificate_key /home/admin/sslcert/cert.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8080; } } server { listen 80; server_name 127.0.0.1:8080; rewrite ^(.*)$ https://$host$1 permanent; } } Node.js 小程序云应用支持部署Node.js框架的小程序应用,确保您要部署的小程序应用满足云应用的要求。 Node.js框架应用配置要求 部署Node.js框架的应用,需要满足以下要求: 软件包格式:.tar.gz文件,且源文件打包到.tar.gz文件的根目录 端口:服务监听端口为7001 启动/停止:在package.json文件中实现了start、stop命令 自定义Nginx配置测试 小程序云应用通过一层Nginx代理对外提供服务,可以通过在发布包中提供对应环境的Nginx配置文件来自定义Nginx配置。如果没有提供,或文件名称不符,则自动使用默认的配置。 您可以在上传的发布包的根目录创建一个conf目录,目录下的nginx-test.conf文件以及nginx-prod.conf文件将分别作为为测试环境和生产环境的nginx配置文件。 测试环境默认配置: user admin; worker_rlimit_nofile 100000; events { use epoll; worker_connections 20480; } error_log /home/admin/logs/nginx-error.log; http { default_type application/octet-stream; index index.html index.htm; access_log /home/admin/logs/nginx-access.log; upstream nodejs { server 127.0.0.1:7001; keepalive 10; } server { listen 80 default_server; server_name _; location / { proxy_pass http://nodejs; } } } 生产环境默认配置: user admin; worker_rlimit_nofile 100000; events { use epoll; worker_connections 20480; } error_log /home/admin/logs/nginx-error.log; http { default_type application/octet-stream; index index.html index.htm; access_log /home/admin/logs/nginx-access.log; upstream nodejs { server 127.0.0.1:7001; keepalive 10; } server { listen 80; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 443 ssl default_server; ssl_certificate /home/admin/sslcert/cert.pem; ssl_certificate_key /home/admin/sslcert/cert.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; location / { proxy_pass http://nodejs; } } } PHP 小程序云应用支持部署PHP框架的小程序应用,确保您要部署的小程序应用满足云应用的要求。 PHP框架应用配置要求 部署PHP框架的应用,需要满足以下要求: 软件包格式:.zip文件,且源文件打包到.zip文件的根目录 监听端口:9000 默认的web server路径是/public。如需修改路径,例如改为/public_html,可在软件包根目录上创建包含如下内容的_buildpack文件: app_entry=public_html 自定义php扩展:扩展安装基于YUM命令,扩展必须在YUM仓库中存在。可在软件包根目录上创建包含如下内容的_buildpack文件(多个扩展用空格分隔): php_extensions=php-extesion-name1 php-extension-name2 扩展安装的日志保存在/home/admin/logs/ext-install-info.log和/home/admin/logs/ext-install-err.log中。 自定义Nginx配置测试 小程序云应用通过一层Nginx代理对外提供服务,可以通过在发布包中提供对应环境的Nginx配置文件来自定义Nginx配置。如果没有提供,或文件名称不符,则自动使用默认的配置。 您可以在上传的发布包的根目录创建一个nginx目录,目录下的nginx-test.conf文件以及nginx-prod.conf文件将分别作为为测试环境和生产环境的nginx配置文件。 测试环境默认配置: #user nginx; worker_processes 1; error_log /home/admin/logs/nginx-error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; set $root_path /home/admin/app-run/app_entry; root $root_path; index index.php index.html; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; break; } } location ~ \.php$ { try_files $uri =404; #root html; #fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } } 生产环境默认配置: worker_processes 1; error_log /home/admin/logs/nginx-error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; keepalive_timeout 65; server { listen 443; server_name localhost; set $root_path /home/admin/app-run/app_entry; root $root_path; index index.php index.html; ssl on; ssl_certificate /home/admin/sslcert/cert.pem; ssl_certificate_key /home/admin/sslcert/cert.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; break; } } location ~ \.php$ { try_files $uri =404; #root html; #fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } # 80 to 443 server { listen 80; server_name 127.0.0.1:8080; rewrite ^(.*)$ https://$host$1 permanent; } }

南霸天霸南北 2020-02-17 18:07:59 0 浏览量 回答数 0

回答

本文介绍如何为Docker 数据目录挂载数据盘。挂载数据盘可以扩容Docker数据目录,从而当在机器上运行的容器或者镜像数量不断增加时,保证有足够的磁盘空间可以满足使用需求。 Docker 数据目录 Docker的数据通过联合文件系统的方式存储到磁盘上。Docker默认的容器和镜像数据存储在/var/lib/docker目录下。您可以通过du命令查看这个目录目前占用的磁盘大小。 du -h --max-depth=0 /var/lib/docker 7.9G /var/lib/docker 更换Docker的数据盘 很多Docker镜像较大,因此可能几个镜像就会占用大量磁盘空间。较大的镜像或较多的容器,都会导致磁盘空间的不足。为了满足您增加镜像或容器的需求,您需要为Docker的数据目录增加数据盘。 增加数据盘 完成以下步骤,为Docker的数据目录增加数据盘: 创建ECS数据盘,并挂载到需要扩容的机器上。请参见创建按量付费云盘。 通过云服务器 ECS 控制台创建需要配置的云盘。 单击左侧导航栏中的实例。 单击目标ECS实例ID,进入实例详情页。 单击左侧导航栏中的本实例磁盘。 单击右上角的挂载云盘。 在弹出的对话框中,选择创建的磁盘作为目标磁盘。单击确定。 单击执行挂载,挂载新磁盘到目标ECS实例,并记录挂载点/dev/xvd或者/dev/vd。 登录ECS实例,对刚才挂载的磁盘进行格式化。 执行ls -l /dev/xvd或者ls -l /dev/vd命令,验证是否和上述步骤中记录的挂载点一致。 通过fdisk命令对磁盘进行分区,然后使用mkfs.ext4命令格式化磁盘。 格式化磁盘 移动Docker数据到新的磁盘。 如果不希望中断节点上正在运行的应用,您需要对应用进行迁移。迁移swarm集群,请参见指定多节点调度。迁移Kubernetes集群,请参见Safely Drain a Node while Respecting Application SLOs。 停止Docker Daemon和kubelet,保证迁移时的数据完整。可以使用service kubelet stop和service docker stop 命令进行停止。 移动Docker的目录到一个备份的目录。例如:mv /var/lib/docker /var/lib/docker_data。 然后把新的格式化好的磁盘挂载到/var/lib/docker和/var/lib/kubelet目录。例如: echo "/dev/xvdb1 /var/lib/container/ ext4 defaults 0 0" >>/etc/fstab echo "/var/lib/container/kubelet /var/lib/kubelet none defaults,bind 0 0" >>/etc/fstab echo "/var/lib/docker /var/lib/docker none defaults,bind 0 0" >>/etc/fstab mkdir /var/lib/docker mount -a 把之前备份的Docker数据移动到新的磁盘上。例如:mv /var/lib/docker_data/* /var/lib/docker/。 启动Docker Daemon和kubelet,并检查数据位置。 启动Docker Daemon和kubelet,命令分别是service docker start和service kubelet start。 执行df命令,可看到/var/lib/docker挂载到了新的磁盘上。如果需要启动Kubernetes集群,请跳过此步骤。 启动集群 执行 docker ps命令,查看容器是否丢失。根据需要,重启相关容器。如没有设置restart:always标签的容器。 设置标签 您可以通过调度的方式使被迁移走的容器回归到这个节点上来。 更多容器服务的相关内容,请参见容器服务。

1934890530796658 2020-03-31 14:53:49 0 浏览量 回答数 0

回答

本文介绍如何为Docker 数据目录挂载数据盘。挂载数据盘可以扩容Docker数据目录,从而当在机器上运行的容器或者镜像数量不断增加时,保证有足够的磁盘空间可以满足使用需求。 Docker 数据目录 Docker的数据通过联合文件系统的方式存储到磁盘上。Docker默认的容器和镜像数据存储在/var/lib/docker目录下。您可以通过du命令查看这个目录目前占用的磁盘大小。 du -h --max-depth=0 /var/lib/docker 7.9G /var/lib/docker 更换Docker的数据盘 很多Docker镜像较大,因此可能几个镜像就会占用大量磁盘空间。较大的镜像或较多的容器,都会导致磁盘空间的不足。为了满足您增加镜像或容器的需求,您需要为Docker的数据目录增加数据盘。 增加数据盘 完成以下步骤,为Docker的数据目录增加数据盘: 创建ECS数据盘,并挂载到需要扩容的机器上。请参见创建按量付费云盘。 通过云服务器 ECS 控制台创建需要配置的云盘。 单击左侧导航栏中的实例。 单击目标ECS实例ID,进入实例详情页。 单击左侧导航栏中的本实例磁盘。 单击右上角的挂载云盘。 在弹出的对话框中,选择创建的磁盘作为目标磁盘。单击确定。 单击执行挂载,挂载新磁盘到目标ECS实例,并记录挂载点/dev/xvd或者/dev/vd。 登录ECS实例,对刚才挂载的磁盘进行格式化。 执行ls -l /dev/xvd或者ls -l /dev/vd命令,验证是否和上述步骤中记录的挂载点一致。 通过fdisk命令对磁盘进行分区,然后使用mkfs.ext4命令格式化磁盘。 格式化磁盘 移动Docker数据到新的磁盘。 如果不希望中断节点上正在运行的应用,您需要对应用进行迁移。迁移swarm集群,请参见指定多节点调度。迁移Kubernetes集群,请参见Safely Drain a Node while Respecting Application SLOs。 停止Docker Daemon和kubelet,保证迁移时的数据完整。可以使用service kubelet stop和service docker stop 命令进行停止。 移动Docker的目录到一个备份的目录。例如:mv /var/lib/docker /var/lib/docker_data。 然后把新的格式化好的磁盘挂载到/var/lib/docker和/var/lib/kubelet目录。例如: echo "/dev/xvdb1 /var/lib/container/ ext4 defaults 0 0" >>/etc/fstab echo "/var/lib/container/kubelet /var/lib/kubelet none defaults,bind 0 0" >>/etc/fstab echo "/var/lib/docker /var/lib/docker none defaults,bind 0 0" >>/etc/fstab mkdir /var/lib/docker mount -a 把之前备份的Docker数据移动到新的磁盘上。例如:mv /var/lib/docker_data/* /var/lib/docker/。 启动Docker Daemon和kubelet,并检查数据位置。 启动Docker Daemon和kubelet,命令分别是service docker start和service kubelet start。 执行df命令,可看到/var/lib/docker挂载到了新的磁盘上。如果需要启动Kubernetes集群,请跳过此步骤。 启动集群 执行 docker ps命令,查看容器是否丢失。根据需要,重启相关容器。如没有设置restart:always标签的容器。 设置标签 您可以通过调度的方式使被迁移走的容器回归到这个节点上来。 更多容器服务的相关内容,请参见容器服务。

1934890530796658 2020-03-31 14:54:27 0 浏览量 回答数 0

回答

本文介绍如何为Docker 数据目录挂载数据盘。挂载数据盘可以扩容Docker数据目录,从而当在机器上运行的容器或者镜像数量不断增加时,保证有足够的磁盘空间可以满足使用需求。 Docker 数据目录 Docker的数据通过联合文件系统的方式存储到磁盘上。Docker默认的容器和镜像数据存储在/var/lib/docker目录下。您可以通过du命令查看这个目录目前占用的磁盘大小。 du -h --max-depth=0 /var/lib/docker 7.9G /var/lib/docker 更换Docker的数据盘 很多Docker镜像较大,因此可能几个镜像就会占用大量磁盘空间。较大的镜像或较多的容器,都会导致磁盘空间的不足。为了满足您增加镜像或容器的需求,您需要为Docker的数据目录增加数据盘。 增加数据盘 完成以下步骤,为Docker的数据目录增加数据盘: 创建ECS数据盘,并挂载到需要扩容的机器上。请参见创建按量付费云盘。 通过云服务器 ECS 控制台创建需要配置的云盘。 单击左侧导航栏中的实例。 单击目标ECS实例ID,进入实例详情页。 单击左侧导航栏中的本实例磁盘。 单击右上角的挂载云盘。 在弹出的对话框中,选择创建的磁盘作为目标磁盘。单击确定。 单击执行挂载,挂载新磁盘到目标ECS实例,并记录挂载点/dev/xvd或者/dev/vd。 登录ECS实例,对刚才挂载的磁盘进行格式化。 执行ls -l /dev/xvd或者ls -l /dev/vd命令,验证是否和上述步骤中记录的挂载点一致。 通过fdisk命令对磁盘进行分区,然后使用mkfs.ext4命令格式化磁盘。 格式化磁盘 移动Docker数据到新的磁盘。 如果不希望中断节点上正在运行的应用,您需要对应用进行迁移。迁移swarm集群,请参见指定多节点调度。迁移Kubernetes集群,请参见Safely Drain a Node while Respecting Application SLOs。 停止Docker Daemon和kubelet,保证迁移时的数据完整。可以使用service kubelet stop和service docker stop 命令进行停止。 移动Docker的目录到一个备份的目录。例如:mv /var/lib/docker /var/lib/docker_data。 然后把新的格式化好的磁盘挂载到/var/lib/docker和/var/lib/kubelet目录。例如: echo "/dev/xvdb1 /var/lib/container/ ext4 defaults 0 0" >>/etc/fstab echo "/var/lib/container/kubelet /var/lib/kubelet none defaults,bind 0 0" >>/etc/fstab echo "/var/lib/docker /var/lib/docker none defaults,bind 0 0" >>/etc/fstab mkdir /var/lib/docker mount -a 把之前备份的Docker数据移动到新的磁盘上。例如:mv /var/lib/docker_data/* /var/lib/docker/。 启动Docker Daemon和kubelet,并检查数据位置。 启动Docker Daemon和kubelet,命令分别是service docker start和service kubelet start。 执行df命令,可看到/var/lib/docker挂载到了新的磁盘上。如果需要启动Kubernetes集群,请跳过此步骤。 启动集群 执行 docker ps命令,查看容器是否丢失。根据需要,重启相关容器。如没有设置restart:always标签的容器。 设置标签 您可以通过调度的方式使被迁移走的容器回归到这个节点上来。 更多容器服务的相关内容,请参见容器服务。

1934890530796658 2020-03-31 15:46:41 0 浏览量 回答数 0

问题

主库上的vip漂移到备库后,就不能用vip地址及备库上pool的端口号去连接数据库了

zzl630176776 2019-12-01 20:21:00 2384 浏览量 回答数 1

回答

问题原因 导致该问题的可能原因包括: 磁盘分区空间使用率达到百分之百。 磁盘分区inode使用率达到百分之百。 僵尸文件:已删除文件因句柄被占用未释放导致相应空间未释放。 挂载点覆盖:在原有文件系统的相应目录下已经存在大量文件。挂载了新磁盘后,导致使用 df 命令能统计到相关空间使用,而使用 su 命令统计不到。 处理办法 不同的原因需要通过不同的方法解决: 分区容量满 inode容量满 修改inode数量 僵尸文件分析删除 挂载点覆盖 分区容量满 如果是分区容量满导致磁盘空间满,按以下步骤操作: 远程连接Linux实例。 运行 df -h 查看磁盘使用率。返回结果如下图所示。 注意: 返回结果里 Mounted on 下显示的是挂载目录。 查看磁盘使用率 循环执行如下指令,找到容量比较大的目录并进入目录,直到找到最精确的文件或目录,再结合业务情况等判断,删除相关文件或目录。您也可以购买更大的数据盘来分担处理。 cd / du -sh * inode容量满 如果是inode容量满导致磁盘空间满,按以下步骤操作: 远程连接Linux实例。 运行以下命令分析根目录下每个目录下面有多少个文件。 for i in /*; do echo $i; find $i | wc -l; done 返回结果如下图所示。 查根目录下有多少个文件 逐层进入inode占用最高的目录,继续执行上述指令,逐步定位占用过高空间的文件或目录,最后进行相应清理。 修改inode数量 ECS Linux 实例的inode节点中,记录了文件的类型、大小、权限、所有者、文件连接的数目、创建时间与更新时间等重要的信息,还有一个比较重要的内容就是指向数据块的指针。一般情况不需要特殊配置;如果存放文件很多,需要配置。有时磁盘空间有剩余但是不能存放文件,可能是由于inode耗尽所致。 按以下步骤调整inode节点数量: 注意: inode的调整需要重新格式化磁盘,请确保您已经备份了数据再执行以下操作。 远程连接Linux实例。 运行以下命令查询inode使用情况。 df -i 返回结果如下图所示。 查看inode使用情况 运行以下命令卸载系统文件。假设卸载的文件系统为 /home。 umount /home 运行以下命令重新建立文件系统,指定inode节点数。 mkfs.ext3 /dev/xvdb -N 1638400 (可选)运行命令 vim /etc/fstab 修改fstab文件。 运行以下命令查看修改后的inode节点数。 dumpe2fs -h /dev/xvdb | grep node 返回结果如下图所示。 查看修改后的inode节点数 僵尸文件分析删除 如果磁盘和inode都没有问题,则需要查看是否存在未被清除句柄的僵死文件。这些文件实际上已经被删除,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间。如果这些文件过多,会占用很大的磁盘空间。 按以下步骤查看并删除僵尸文件: 远程连接Linux实例。 运行以下命令安装lsof。 yum install lsof -y 运行以下命令查看僵尸文件占用情况。 lsof |grep delete | more 返回结果示例如下图所示。 查看僵尸文件数量 采用以下方法释放句柄,以清除僵尸文件: 重启服务器。 正常停止或杀掉占用这些文件的服务进程。 挂载点覆盖 先取消磁盘挂载,再检查原挂载目录下的空间占用情况。

KB小秘书 2019-12-02 02:06:55 0 浏览量 回答数 0

回答

一 容器 在学习k8s前,首先要了解和学习容器概念和工作原理。 什么是容器? 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。 容器的优势 容器使软件具备了超强的可移植能力。 对于开发人员 – Build Once, Run Anywhere 容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。 对于运维人员 – Configure Once, Run Anything 只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。 Docker概念 “Docker” 一词指代了多个概念,包括开源社区项目、开源项目使用的工具、主导支持此类项目的公司 Docker Inc. 以及该公司官方支持的工具。技术产品和公司使用同一名称,的确让人有点困惑。 我们来简单说明一下: IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用容器。 开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。 Docker Inc. 公司凭借 Docker 社区产品起家,它主要负责提升社区版本的安全性,并将技术进步与广大技术社区分享。此外,它还专门对这些技术产品进行完善和安全固化,以服务于企业客户。 借助 Docker,您可将容器当做轻巧、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境,从而有助于您针对云来优化您的应用。 Docker有三大核心概念: 镜像(Image)是一个特殊的文件系统,提供容器运行时所需的程序、库、配置等,构建后不会改变 容器(Container)实质是进程,拥有自己独立的命名空间。 仓库(Repository)一个仓库可以包含多个标签(Tag),每个标签对应一个镜像 容器工作原理 Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。 二 Kubernetes入门知识指南 Kubernets的知识都可以在官方文档查询,网址如下: https://kubernetes.io/zh/docs/home/ Kubernetes基础知识 Kubernetes是什么? Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 为什么需要 Kubernetes 容器是打包和运行应用程序的好方式。在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果由操作系统处理此行为,会不会更容易? Kubernetes 为您提供: 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 存储编排 Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。 自动部署和回滚 您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。 自动二进制打包 Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。 自我修复 Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。 密钥与配置管理 Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。 Kubernetes 组件 初学者首先要了解Kubernetes的基本概念,包括master、node、pod等。 Master Master是Kubernetes集群的大脑,运行着的守护进程服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和Pod网络等。 kube-apiserver 主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。 kube-apiserver 在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩。 etcd etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。 您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。 kube-scheduler 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。 调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。 kube-controller-manager 在主节点上运行控制器的组件。 从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。 这些控制器包括: 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌. 云控制器管理器-(cloud-controller-manager) cloud-controller-manager 运行与基础云提供商交互的控制器 cloud-controller-manager 仅运行云提供商特定的控制器循环。您必须在 kube-controller-manager 中禁用这些控制器循环,您可以通过在启动 kube-controller-manager 时将 --cloud-provider 参数设置为 external 来禁用控制器循环。 cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展。在以前的版本中,核心的 Kubernetes 代码依赖于特定云提供商的代码来实现功能。在将来的版本中,云供应商专有的代码应由云供应商自己维护,并与运行 Kubernetes 的云控制器管理器相关联。 以下控制器具有云提供商依赖性: 节点控制器(Node Controller): 用于检查云提供商以确定节点是否在云中停止响应后被删除 路由控制器(Route Controller): 用于在底层云基础架构中设置路由 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器 数据卷控制器(Volume Controller): 用于创建、附加和装载卷、并与云提供商进行交互以编排卷 Node 节点组件在每个节点上运行,维护运行 Pod 并提供 Kubernetes 运行环境。 kubelet 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。 kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。 kube-proxy kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。 kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。 如果有 kube-proxy 可用,它将使用操作系统数据包过滤层。否则,kube-proxy 会转发流量本身。 容器运行环境(Container Runtime) 容器运行环境是负责运行容器的软件。 Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。 Pod 在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod。Pod是管理,创建,计划的最小单元. 一个Pod相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。 Pod 的context可以理解成多个linux命名空间的联合 PID 命名空间(同一个Pod中应用可以看到其它进程) 网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限) IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信) UTS 命名空间(同一个Pod中的应用共享一个主机名称) 同一个Pod中的应用可以共享磁盘,磁盘是Pod级的,应用可以通过文件系统调用。 由于docker的架构,一个Pod是由多个相关的并且共享磁盘的容器组成,Pid的命名空间共享还没有应用到Docker中 和相互独立的容器一样,Pod是一种相对短暂的存在,而不是持久存在的,正如我们在Pod的生命周期中提到的,Pod被安排到结点上,并且保持在这个节点上直到被终止(根据重启的设定)或者被删除,当一个节点死掉之后,上面的所有Pod均会被删除。特殊的Pod永远不会被转移到的其他的节点,作为替代,他们必须被replace. 三 通过kubeadm方式创建一个kubernetes 对kubernetes的概念和组件有所了解以后,就可以通过kubeadm的方式创建一个kubernetes集群。 安装前准备工作 创建虚拟机 创建至少2台虚拟机,可以在本地或者公有云。 下载部署软件 需要下载的软件包括calico、demo-images、docker-ce、kube、kube-images、kubectl、metrics-server 安装部署 具体安装过程参考官网文档: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/ 四 安装后的练习 安装后详读官方文档,做下面这些组件的练习操作,要达到非常熟练的程度。 Node Namespace Pod Deployment DaemonSet Service Job Static Pod ConfigMap Secrets Volume Init-containers Affinity and Anti-Affinity Monitor and logs Taints and Tolerations Cordon and Drain Backing up etcd 这些内容都非常熟练以后,基本就达到了入门的水平。

红亮 2020-03-02 11:09:17 0 浏览量 回答数 0

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。

有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0

回答

Java Java核心技术·卷 I(原书第10版)| Core Java Volume 讲的很全面,书中的代码示例都很好,很适合Java入门。 但是作者不太厚道的是把现在没人用的GUI编程放在了第一卷,基本上10~13章是可以不用读的。 Java性能权威指南|Java Performance: The Definitive Guide 市面上介绍Java的书有很多,但专注于Java性能的并不多,能游刃有余地展示Java性能优化难点的更是凤毛麟角,本书即是其中之一。 通过使用JVM和Java平台,以及Java语言和应用程序接口,本书详尽讲解了Java性能调优的相关知识,帮助读者深入理解Java平台性能的各个方面,最终使程序如虎添翼。 实战Java高并发程序设计|葛一鸣 由部分段落的行文来看,搬了官方文档。 也有一些第一人称的叙述和思考,也能看出作者也是花了一点心思的。胜在比较基础,涉及到的知识点也还很全面(讲到了流水线计算和并发模型这些边边角角的),但是由于是编著,全书整体上不够统一和深入,适合作为学习高并发的第一本工具书。 Java 8实战 对Java8的新特性讲解的十分到位,尤其是lamdba表达式和流的操作。 再者对于Java8并发处理很有独到见解。对于并行数据处理和组合式异步编程还需要更深的思考才能更加掌握。 推荐给再用java8但没有去真正了解的人看,有很多你不知道的细节、原理和类库设计者的用心良苦在里面、内容没有很难,抽出几个小时就能看完,花费的时间和收获相比,性价比很高。 Java并发编程实战 先不谈本书的内容如何,光书名就足够吸引不少目光。“并发”这个词在Java世界里往往和“高级、核心”等字眼相联系起来,就冲着这两个字,都将勾起软件工程师们埋藏在心底那种对技术的探索欲和对高级API的驾驭感。 程序员嘛,多少都有点职业病。其实Java对“并发”优化从未停止过,从5.0到7.0,几乎每个版本的新特性里,都会针对前一版本在“并发”上有所改进。这种改进包括提供更丰富的API接口、JVM底层性能优化等诸多方面。 Thinking in Java 很美味的一本书,不仅有icecreamm,sundae,sandwich,还有burrito!真是越看越饿啊~ Effective Java中文版(第3版)|Effective Java Third Edition Java 高阶书籍,小白劝退。介绍了关于Java 编程的90个经验技巧。 作者功力非常强悍,导致这本书有时知识面迁移很广。总之,非常适合有一定Java开发经验的人阅读提升。 深入理解Java虚拟机(第3版)| 周志明 浅显易懂。最重要的是开启一扇理解虚拟机的大门。 内存管理机制与Java内存模型、高效并发这三章是特别实用的。 Java虚拟机规范(Java SE 8版)|爱飞翔、周志明 整本书就觉得第二章的方法字节码执行流程,第四章的前8节和第五章能看懂一些。其他的过于细致和琐碎了。 把Java字节码讲的很清楚了,本质上Java虚拟机就是通过字节码来构建的一套体系罢了。所以字节码说的非常细致深入。 数据&大数据 数据结构与算法分析|Data Structures and Algorithm Analysis in Java 数据结构是计算机的核心,这部书以java语言为基础,详细的介绍了基本数据结构、图、以及相关的排序、最短路径、最小生成树等问题。 但是有一些高级的数据结构并没有介绍,可以通过《数据结构与算法分析——C语言描述》来增加对这方面的了解。 MySQL必知必会 《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。 书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通过重点突出的章节,条理清晰、系统而扼要地讲述了读者应该掌握的知识,使他们不经意间立刻功力大增。 数据库系统概念|Datebase System Concepts(Fifth Edition) 从大学读到现在,每次拿起都有新的收获。而且这本书还是对各个数据相关领域的概览,不仅仅是数据库本身。 高性能MySQL 对于想要了解MySQL性能提升的人来说,这是一本不可多得的书。 书中没有各种提升性能的秘籍,而是深入问题的核心,详细的解释了每种提升性能的原理,从而可以使你四两拨千斤。授之于鱼不如授之于渔,这本书做到了。 高可用MySQL 很实用的书籍,只可惜公司现有的业务和数据量还没有达到需要实践书中知识的地步。 利用Python进行数据分析|唐学韬 内容还是跟不上库的发展速度,建议结合里面讲的库的文档来看。 内容安排上我觉得还不错,作者是pandas的作者,所以对pandas的讲解和设计思路都讲得很清楚。除此以外,作者也是干过金融数据分析的,所以后面专门讲了时间序列和金融数据的分析。 HBase 看完影印版第一遍,开始以为会是大量讲API,实际上除了没有将HBase源代码,该讲的都讲了,CH8,9章留到最后看的,确实有点顿悟的感觉,接下来需要系统的看一遍Client API,然后深入代码,Come ON! Programming Hive Hive工具书,Hive高级特性。 Hadoop in Practice| Alex Holmes 感觉比action那本要强 像是cookbook类型的 整个过完以后hadoop生态圈的各种都接触到了 这本书适合当参考手册用。 Hadoop技术内幕|董西成 其实国人能写这样的书,感觉还是不错的,不过感觉很多东西不太深入,感觉在深入之前,和先有整体,带着整体做深入会更好一点, jobclient,jobtracer,tasktracer之间的关系最好能系统化 Learning Spark 很不错,core的原理部分和api用途解释得很清楚,以前看文档和代码理解不了的地方豁然开朗。 不足的地方是后几章比较弱,mllib方面没有深入讲实现原理。graphx也没有涉及 ODPS权威指南 基本上还算一本不错的入门,虽然细节方面谈的不多,底层也不够深入,但毕竟是少有的ODPS书籍,且覆盖面很全,例子也还行。 数据之巅|徐子沛 从一个新的视角(数据)切入,写美国历史,统计学的发展贯穿其中,草蛇灰线,伏脉千里,读起来波澜壮阔。 消息队列&Redis RabbitMQ实战 很多年前的书了,书中的例子现在已经不适用了,推荐官方教程。 一些基础还是适用,网上也没有太多讲rab的书籍,将就看下也行,我没用过所以…. Apache Kafka源码剖析|徐郡明 虽然还没看,但知道应该不差。我是看了作者的mybatis源码分析,再来看这本的,相信作者。 作者怎么有这么多时间,把框架研究的这么透彻,佩服,佩服。 深入理解Kafka:核心设计与实践原理|朱忠华 通俗易懂,图文并茂,用了很多图和示例讲解kafka的架构,从宏观入手,再讲到细节,比较好,值得推荐。 深入理解Kafka是市面上讲解Kafka核心原理最透彻的,全书都是挑了kafka最核心的细节在讲比如分区副本选举、分区从分配、kafka数据存储结构、时间轮、我认为是目前kafka相关书籍里最好的一本。 Kafka 认真刷了 kafka internal 那章,看了个talk,算是入了个门。 系统设计真是门艺术。 RocketMQ实战与原理解析|杨开元 对RocketMQ的脉络做了一个大概的说明吧,深入细节的东西还是需要自己看代码 Redis设计与实现|黄健宏 部分内容写得比较啰嗦,当然往好了说是对新手友好,不厌其烦地分析细节,但也让整本书变厚了,个人以为精炼语言可以减少20%的内容。 对于有心一窥redis实现原理的读者来说,本书展露了足够丰富的内容和细节,却不至于让冗长的实现代码吓跑读者——伪代码的意义在此。下一步是真正读源码了。 Redis 深度历险:核心原理与应用实践|钱文品 真心不错,数据结构原理+实际应用+单线程模型+集群(sentinel, codis, redis cluster), 分布式锁等等讲的都十分透彻。 一本书的作用不就是系统性梳理,为读者打开一扇窗,读者想了解更多,可以自己通过这扇窗去Google。这本书的一个瑕疵是最后一章吧,写的仓促了。不过瑕不掩瑜。 技术综合 TCP/IP详解 卷1:协议 读专业性书籍是一件很枯燥的事,我的建议就是把它作为一本手册,先浏览一遍,遇到问题再去详细查,高效。 Netty in Action 涉及到很多专业名词新概念看英文原版顺畅得多,第十五章 Choosing the right thread model 真是写得太好了。另外结合Ron Hitchens 写的《JAVA NIO》一起看对理解JAVA NIO和Netty还是很有帮助的 ZooKeeper 值得使用zookeeper的人员阅读, 对于zookeeper的内部机制及api进行了很详细的讲解, 后半部分深入地讲解了zookeeper中ensemble互相协作的流程, 及group等高级配置, 对zookeeper的高级应用及其它类似系统的设计都很有借鉴意义. 从Paxos到Zookeeper|倪超 分布式入门鼻祖,开始部分深入阐述cap和base理论,所有的分布式框架都是围绕这个理论的做平衡和取舍,中间 zk的原理、特性、实战也讲的非常清晰,同时讲cap理论在zk中是如何体现,更加深你对cap的理解. 深入理解Nginx(第2版)|陶辉 云里雾里的快速读了一遍,主要是读不懂,读完后的感受是设计的真好。 原本是抱着了解原理进而优化性能的想法来读的,却发现书中的内容都是讲源码,作者对源码的注释超级详细,非常适合开发者,但不适合使用者,给个五星好评是因为不想因为我这种菜鸡而埋没了高质量内容。 另外别人的代码写的真好看,即便是过程式语言程序也吊打我写的面向对象语言程序。 作者是zookeeper的活跃贡献者,而且是很资深的研究员,内容比较严谨而且较好的把握住了zk的精髓。书很薄,但是没有废话,选题是经过深思熟虑的。 深入剖析Tomcat 本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。本书从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。 深入理解计算机系统 | 布莱恩特 无论是内容还是纸张印刷,都是满分。计算机学科的集大成之作。引导你如何练内功的,算是高配版本的计算机导论,目的是釜底抽薪引出来操作系统、组成原理这些专业核心的课程。帮助我们按图索骥,点亮一个一个技能树。 架构探险分布式服务框架 | 李业兵 刚看前几章的时候,心里满脑子想得都是这特么贴一整页pom文件代码上来干鸡毛,又是骗稿费的,买亏了买亏了,后来到序列化那章开始,诶?还有那么点意思啊。 到服务注册中心和服务通讯,60块钱的书钱已经赚回来了。 知识是无价的,如果能花几十块钱帮你扫了几个盲区,那就是赚了。 深入分析JavaWeb技术内幕 | 许令波 与这本书相识大概是四年前是在老家的北方图书城里,当时看到目录的感觉是真的惊艳,对当时刚入行的自己来说,这简直就是为我量身定做的扫盲科普集啊。 但是可惜的是,这本书在后来却一直没机会读上。然后经过四年的打怪升级之后,这次的阅读体验依旧很好。 其中,java编译原理、 Servlet工作原理、 Tomcat、spring和iBatis这几章的收获很大。 前端 jQuery 技术内幕| 高云 非常棒的一本书,大大降低了阅读jquery源码的难度(虽然还是非常难)。 Head First HTML与CSS(第2版) 翻了非常久的时间 断断续续 其实从头翻到尾 才发现一点都不难。 可我被自己的懒惰和畏难情绪给拖累了 简单说 我成了自己往前探索的负担。网页基础的语法基本都涵盖了 限于文本形态 知识点都没法像做题一样被反复地运用和复习到。通俗易懂 这不知算是多高的评价? 作为入门真心算不错了 如果更有耐心 在翻完 HTML 后 对 CSS 部分最好是可以迅速过一遍 找案例练习估计更好 纸上得来终觉浅 总是这样。 JavaScript高级程序设计(第3版) JavaScript最基础的书籍,要看认真,慢慢地看,累计接近1000小时吧。而且对象与继承,性能优化,HTML5 api由于没有实践或缺乏代码阅读量导致看的很糊涂,不过以后可以遇到时再翻翻,或者看更专业的书。 深入理解ES6 Zakas的又一部杰作,他的作品最优秀的地方在于只是阐述,很少评价,这在帮助我们夯实基础时十分有意义,我也喜欢这种风格。 我是中英文参照阅读的,译本后半部分有一些文字上的纰漏,但是总体来说忠实原文,水平还是相当不错,希望再版时可以修复这些文字问题。 高性能JavaScript 还是挺不错的。尤其是对初学者。总结了好多程序方面的好习惯。 不过对于老手来说,这些常识已经深入骨髓了。 深入浅出Node.js|朴灵 本书是我看到现在对Node.JS技术原理和应用实践阐述的最深入,也最全面的一本书。鉴于作者也是淘宝的一位工程师,在技术总是国外好的大环境下,没有理由不给本书五颗星。 作者秉着授人于鱼不如授人于渔的精神,细致入微的从V8虚拟机,内存管理,字符串与Buffer的应用,异步编程的思路和原理这些基础的角度来解释Node.JS是如何工作的,比起市面上众多教你如何安装node,用几个包编写一些示例来比,本书绝对让人受益匪浅。 认真看完本书,几乎可以让你从一个Node的外行进阶到专家的水平。赞! 总结 其实我觉得在我们现在这个浮躁的社会,大家闲暇时间都是刷抖音,逛淘宝,微博……他们都在一点点吞噬你的碎片时间,如果你尝试着去用碎片的时间看看书,我想时间久了你自然能体会这样的好处。 美团技术团队甚至会奖励读完一些书本的人,很多公司都有自己的小图书馆,我觉得挺好的。 文章来自:敖丙

剑曼红尘 2020-03-20 14:52:22 0 浏览量 回答数 0

问题

社区系统 Icarus 1.3.0

寒喵 2019-12-01 21:51:20 1292 浏览量 回答数 0

问题

程序员报错QA大分享(1)

问问小秘 2020-06-18 15:46:14 8 浏览量 回答数 1

回答

E-HPC自动化伸缩可以根据您配置的策略动态分配云资源,例如您可以设置根据实时负载自动增加或者减少云资源。E-HPC自动化伸缩可以为您: 减少管理运维集群的人力成本。 保证可用性的前提下,最大限度减少云资源消耗,降低集群成本。 提高容错能力,自动化伸缩自动检测节点状态,停止处于错误状态下的节点,并创建新的节点。 提高可用性,保证集群有充足的云资源。 配置自动伸缩服务 用户创建集群的时候,默认自动伸缩服务是没有启用的,用户如果希望使用的话,可以通过E-HPC控制台做如下配置。 autoscale 功能配置选项 自动化伸缩提供如下配置选项: 是否启动扩容(EnableGrow): 是否启用自动扩容。 扩容时间间隔(GrowIntervalInMinutes): 每轮资源扩展的时间间隔。默认值2分钟,最小值2分钟,最大值10分钟。 扩容超时时间(GrowTimeoutInMinutes): 等待启动节点的超时时间。默认值20分钟,最小值10分钟,最大值60分钟。如果超时时间后,节点依然未达到运行状态,将会把这个节点重置,用于新的扩容。 额外节点百分比(ExtraNodesGrowRatio): 额外扩张节点的百分比,默认值0,最小值0, 最大值100。例如,根据作业负载需要新增100个计算节点,ExtraNodesGrowRatio值为2,那么最终扩展的节点数量是102。场景如下。 一个需要32个节点才能运行的mpi作业,如果将集群扩充至刚好32个节点,若其中一个节点启动失败或者启动过慢,就会导致其他31个节点一直处于空闲状态。但如果配置了额外节点百分比,将集群扩展至35个节点,就会一定程度上降低这种情况发生的概率,而且作业正常运行后,多启动的资源很快会被释放。 此配置在保证可用性的同时,减少了资源的等待浪费,且只增加用户很少的成本(几乎可以忽略)。 扩容比例(根据工作负载)(GrowRatio): 扩展比例(百分比)默认值100,最小值1,最大值100。比如当前根据作业负载需要新增10个计算节点,如果GrowRatio配置为50,就新增5个计算节点。场景如下。 有10个作业需完成,且每个作业只需要运行几分钟。默认自动伸缩会扩容10个节点,每个节点启动初始化都需要几分钟的时间,而节点进入运行状态后,运行作业也是只需要几分钟。这种情况下,有的用户会希望只扩容5个节点,同时运行5个作业,等这5个作业运行结束,再继续在这5个节点上运行剩余的5个作业。 通过这个配置选项,用户可以根据作业类型,运行时间长短对默认自动伸缩进一步优化,提高集群资源利用率。 集群最大计算节点数(MaxNodesInCluster):集群最多可以扩展的节点数量,默认值100,最小值1。 是否启动缩容(EnableShrink):是否启用自动缩容。 缩容时间间隔(ShrinkIntervalInMinutes): 每轮资源收缩的时间间隔,默认2分钟,最小值2分钟,最大值10分钟。 说明:ShrinkInterval必须大于等于GrowInterval,确保空闲节点不被任何作业所需要的前提下,释放节点 节点连续空闲次数(ShrinkIdleTimes): 资源收缩检查时,一个节点连续处于空闲的次数。默认值3,最小值2。最大值5。如果一个计算节点连续空闲超过3次,就会被释放。所以默认配置下,一个资源的连续空闲时间超过6分钟,就会被释放。 例外节点列表(ExcludeNodes): 不使用自动伸缩的节点列表,以半角逗号分割。用户如果希望一直保留一个最小规模的集群,可以使用此配置项。 多队列调度自动伸缩的策略 在多种类型业务和计算的驱动下,您可能需要在一个E-HPC集群里面运行不同类型的作业,而每种类型的作业对资源的需求是不一样的,例如,前处理作业需要普通8核32GiB内存的ECS虚拟机,后端计算性任务需要使用裸金属服务器。E-HPC为您提供了支持多队列部署的功能以及自动伸缩支持多队列的弹性配置策略。 E-HPC支持多队列部署功能如下所示: 扩容的时候支持指定新的实例类型 创建集群和扩容的时候支持加入指定队列,如果队列不存在则会自动创建队列 提交作业的时候支持提交到指定的队列 支持跨AZ扩容和缩容,以解决单个AZ域内资源库存不足的问题 2. 自动伸缩服务支持多队列弹性策略的配置,队列配置说明: 队列名称(QueueName):为集群和节点指定的队列名称。 是否启动扩容(EnableGrow)和缩容(EnableShrink):是否启动队列的自动扩容和缩容。 实例类型(InstanceType):队列目标扩容的类型。 竞价策略(SpotStrategy):扩充的实例需要配置的竞价方式。有三种选择:不使用抢占实例;设置上限价格的抢占实例;系统自动出价,最高按量付费价格。 每小时最高价格(SpotPriceLimit):在竞价策略为“设置上限价格的竞价实例”时,需要设定每小时最高价格区间。 3. 跨AZ自动伸缩,队列配置详细信息 选择自动伸缩页面中需要操作的队列,如low队列,点击最右侧编辑按钮,跳转至如下页面,开始配置: queueconfiguration 配置步骤及说明: 1) 打开启动扩容,启动缩容按钮; 2) 在队列配置栏下选择目标可用区和目标虚拟交换机ID,如果目标可用区没有可用的虚拟交换机,可以点击页面中“创建子网(交换机)”按钮进行创建; 3) 选择目标扩容实例类型,或者可以手动输入;根据实际情况选择竞价策略; 4) 点击“增加”按钮,添加配置信息到配置清单中。 注意:集群在扩容时,按照配置清单中的由上而下的顺序扩容,只有当上一个实例类型库存不存在或者库存不足时才会跳开上一个,开始扩容下一个实例类型。 5)点击左下角“确认”按钮,完成队列信息配置。 使用场景及配置 总的来说,自动伸缩服务适合于不使用包年包月服务的用户,比如: 用户每天集中提交一批作业,使用HPC集群几个小时进行大规模计算, 然后释放资源。 用户不定期的会提交作业,但不是每天24小时满负荷运行的。 针对不同的作业类型,用户可以使用不同的配置项参数,根据自己的HPC集群实际使用情况进行自定义配置。例如批量作业,作业数量大,单作业运行用时短,则用户可以通过配置扩容比例(GrowRatio)来调节扩容的比例。若用户提交1000个作业,每个作业虚使用一个CPU,运行1分钟。则用户可以配置GrowRatio为10,那么就会扩容100个CPU。 使用E-HPC集群运行lammps算例 1)创建集群, 选择安装的软件列表。 软件配置 2)在软件配置界面的高级配置下,指定集群需要加入的队列,如low队列,此时该队列会自动创建。同时,也可以在节点和队列界面单独创建队列,具体操作请参照 节点管理。 3)配置自动伸缩: 启用自动扩容和缩容,启动目标队列的扩容和缩容,完成目标队列的信息配置。(对于pbspro来说,workq是默认队列,会自动创建,当新增加的nodes未指定队列时会默认加入到workq队列) 4)自动伸缩启动之后,如果没有作业运行,几分钟之后,指定队列的计算节点都会被释放。 5)通过控制台创建集群用户,用户组可以是普通权限组或者sodo权限组,本例设置为普通权限组。 6)用户把相应的数据,及程序放到NAS共享存储上。 7)创建并提交作业:用户可通过在线新建编辑,或者OSS文件上传的方式来进行SubmitJob的操作。具体操作流程,请参看 作业管理 模块的描述,进行作业信息配置和作业脚本文件创建。 例如 job.sh 脚本文件里的内容如下,可以看出需要1个计算节点。 job 8)两分钟左右,从控制台可以看到,low队列自动扩容了一个计算节点。 9)几分钟后,计算节点ready,同时可以看到作业开始运行,并运行完成。 在作业运行完毕之后,可以通过控制台看到作业详情。 jobdetail 10)几分钟之后,扩容产生的计算节点被释放。 11)从操作日志可以看到,扩容和缩容的日志记录。其中,第一次缩容(DeleteNode)为集群原来的节点,第二次缩容为提交作业后扩容产生的Node。joblog SGE(SunGridEngine)支持自动伸缩配置 SGE队列如果为空,没有任何计算节点的时候,用户提交作业的时候,会提交失败,或者作业不会被分配到默认队列中。因此如果在SGE集群中使用自动伸缩,可以使用如下的方式之一: 保持队列中至少有一个节点,在自动伸缩配置页面,设置“例外节点列表”包含这个节点这样保证集群至少有一个计算节点, 如果集群需要保持最小规模的话,推荐使用这种方式 添加dummynode到队列中,可以参考以下的设置 以下操作都是在调度节点上执行 1, 在/etc/hosts增加以下记录 127.0.0.1 dummynode0 2,将dummnynode0加入默认节点组 qconf -aattr hostgroup hostlist dummynode0 @allhosts 用户也可以使用类似命令将dummnynode0加入到别的节点组或者队列

1934890530796658 2020-03-23 17:13:25 0 浏览量 回答数 0

问题

【javascript学习全家桶】934道javascript热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:22 6202 浏览量 回答数 1

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站