首页 文章 精选 留言 我的

精选列表

搜索[运维],共10003篇文章
优秀的个人博客,低调大师

OpenKruise:解放 DaemonSet 运维之路

简介: 我们希望 OpenKruise 让每一位 Kubernetes 开发者和阿里云上的用户都能便捷地使用上阿里巴巴内部云原生应用所统一使用的部署发布能力! 作者| 王思宇(酒祝) 前言 OpenKruise是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment/StatefulSet 等控制器,但 OpenKruise 提供了更多的增强功能,如:优雅原地升级、发布优先级/打散策略、多可用区 workload 抽象管理、统一 sidecar 容器注入管理等,都是经历了阿里巴巴超大规模应用场景打磨出的核心能力。这些 feature 帮助我们应对更加多样化的部署环境和需求、为集群维护者和应用开发者带来更加灵活的部署发布组合策略。 目前在阿里巴巴内部云原生环境中,应用全部统一使用 OpenKruise 的能力做 Pod 部署、发布管理,而不少业界公司和阿里云上的客户由于 K8s 原生 Deployment 等负载不能完全满足需求,也转而采用 OpenKruise 作为应用部署载体。我们希望 OpenKruise 让每一位 Kubernetes 开发者和阿里云上的用户都能便捷地使用上阿里巴巴内部云原生应用所统一使用的部署发布能力! 背景 如何在 Kubernetes 集群中部署节点组件呢?相信大家对 DaemonSet 并不陌生,它能够帮助我们将定义好的 Pod 部署到所有符合条件的 Node 上,这大大减轻了过去我们维护节点上各类守护进程的痛苦。 在阿里巴巴内部的云原生环境中,存在不少网络、存储、GPU、监控等等相关的节点组件都是通过 DaemonSet 部署管理的。但是随着近两年 Kubernetes 集群规模越来越大,所有核心业务逐渐全量上云原生之后,我们越发感受到原生 DaemonSet 很难满足大规模、高可用的复杂场景需求。 大家可以理解为原生的 DaemonSet 确实解决了 0 -> 1 的问题,避免了直接管理 Node 上各类软件包和守护进程的难题,能做到用一致化的 Pod 来部署节点组件。但是在部署之后呢?我们面临的是 1 -> N 的不断迭代升级的问题了,而在升级能力方面,原生 DaemonSet 做的实在有些敷衍了事的感觉。 apiVersion: apps/v1 kind: DaemonSet spec: updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 2 # ... apiVersion: apps/v1 kind: DaemonSet spec: updateStrategy: type: OnDelete # ... 以上是原生 DaemonSet 支持的两种升级方式。相信多数人使用 DaemonSet 基本都是默认的 RollingUpdate 滚动升级,这本身是没问题的,问题就在于滚动升级时只支持了 maxUnavailable 一个策略,这就让我们很难接受了。目前阿里巴巴内的 Kubernetes 不少已经做到单集群上万节点,这些节点可能有不同的机型、拓扑、核心程度、内核版本等等,而 DaemonSet 升级也覆盖到这上万节点上的 daemon Pod、涉及所有节点上的应用 Pod。 面对如此复杂和规模化的环境,原生 DaemonSet 没有灰度、没有分批、没有暂停、没有优先级,仅仅用一个 maxUnavailable 策略显然是无法满足的。要知道 daemon Pod 即使配置了 readinessProbe 往往也只能检查容器内进程是否启动运行,而对于进程的运行情况很难考量。 因此,即使 DaemonSet 发布了一个代码有 bug 的版本,只要进程能正常启动则 maxUnavailable 策略就无法保护,DaemonSet 会一直发布下去;如果升级开始了一段时间后才发现问题,那此时很可能故障范围就已经覆盖到整个集群了。 为了避免这个问题,我们曾经一度改为使用 OnDelete 策略、在发布平台上控制发布顺序和分批,但终态上我们还是希望将 workload 的能力下沉归还到 workload,形成闭环,避免将完整的能力分散到多个模块。因此随着 OpenKruise 的成熟和在阿里内外的铺开,我们总结了内部对 DaemonSet 的通用化发布需求、将其沉淀到 OpenKruise 中,称之为 Advanced DaemonSet。 目前阿里巴巴和蚂蚁集团内部的大部分 DaemonSet 都已经统一到 Advanced DaemonSet 部署管理,并且随着 OpenKruise v0.6.0 版本的推出之后,外部一些公司如位于以色列的 Bringg 都已经开始对接使用。 能力解析 Advanced DaemonSet 中主要增加的 API 字段如下: const ( + // StandardRollingUpdateType replace the old daemons by new ones using rolling update i.e replace them on each node one after the other. + // this is the default type for RollingUpdate. + StandardRollingUpdateType RollingUpdateType = "Standard" + // SurgingRollingUpdateType replaces the old daemons by new ones using rolling update i.e replace them on each node one + // after the other, creating the new pod and then killing the old one. + SurgingRollingUpdateType RollingUpdateType = "Surging" ) // Spec to control the desired behavior of daemon set rolling update. type RollingUpdateDaemonSet struct { + // Type is to specify which kind of rollingUpdate. + Type RollingUpdateType `json:"rollingUpdateType,omitempty" protobuf:"bytes,1,opt,name=rollingUpdateType"` // ... MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty" protobuf:"bytes,2,opt,name=maxUnavailable"` + // A label query over nodes that are managed by the daemon set RollingUpdate. + // Must match in order to be controlled. + // It must match the node's labels. + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,3,opt,name=selector"` + // The number of DaemonSet pods remained to be old version. + // Default value is 0. + // Maximum value is status.DesiredNumberScheduled, which means no pod will be updated. + // +optional + Partition *int32 `json:"partition,omitempty" protobuf:"varint,4,opt,name=partition"` + // Indicates that the daemon set is paused and will not be processed by the + // daemon set controller. + // +optional + Paused *bool `json:"paused,omitempty" protobuf:"varint,5,opt,name=paused"` + // Only when type=SurgingRollingUpdateType, it works. + // The maximum number of DaemonSet pods that can be scheduled above the desired number of pods + // during the update. Value can be an absolute number (ex: 5) or a percentage of the total number + // of DaemonSet pods at the start of the update (ex: 10%). The absolute number is calculated from + // the percentage by rounding up. This cannot be 0. The default value is 1. Example: when this is + // set to 30%, at most 30% of the total number of nodes that should be running the daemon pod + // (i.e. status.desiredNumberScheduled) can have 2 pods running at any given time. The update + // starts by starting replacements for at most 30% of those DaemonSet pods. Once the new pods are + // available it then stops the existing pods before proceeding onto other DaemonSet pods, thus + // ensuring that at most 130% of the desired final number of DaemonSet pods are running at all + // times during the update. + // +optional + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,7,opt,name=maxSurge"` } type DaemonSetSpec struct { // ... + // BurstReplicas is a rate limiter for booting pods on a lot of pods. + // The default value is 250 + BurstReplicas *intstr.IntOrString `json:"burstReplicas,omitempty" protobuf:"bytes,5,opt,name=burstReplicas"` } 按节点灰度 在一个大规模 Kubernetes 集群中往往存在很多种差异化的节点类型,比如机型、拓扑、核心程度、内核版本等,因此在 DaemonSet 发布的时候我们支持根据 Node 的标签来匹配发布哪些 Node 上的 Pod。 apiVersion: apps.kruise.io/v1alpha1 kind: DaemonSet spec: # ... updateStrategy: type: RollingUpdate rollingUpdate: selector: matchLabels: nodeType: canary 比如上述配置了滚动升级下的 selector 策略,则 DaemonSet 只会在符合 selector 条件的 Node 上把 Pod 做滚动升级。如果 selector 改变,则 DaemonSet 会按照新的 selector 做升级,对已经是最新版本的 Pod 不会做变动。 因此,用户可以通过多次修改 selector,来实现不同类型 Node 的前后发布顺序。这个优先顺序可以是特定一批用于灰度的非核心节点,也可以是一些逻辑资源池等。 按数量灰度 如果说你不关心节点类型,Advanced DaemonSet 同样提供了按数量灰度的能力: apiVersion: apps.kruise.io/v1alpha1 kind: DaemonSet spec: # ... updateStrategy: type: RollingUpdate rollingUpdate: partition: 100 这里的 partition 和 OpenKruise 中其他 CloneSet、Advanced StatefulSet 类似,都表示了维持旧版本的数量,也就是说 Kruise 控制器会选择status.DesiredNumberScheduled - partition数量的 Pod 滚动升级为新版本。 比如当前集群中 DaemonSet 部署的节点数量是 120 个,当滚动升级时如果设置了 partition 为 100,则 DaemonSet 只会选择 20 个 Pod 滚动到新版本。只有当用户再次下调 partition,DaemonSet 才会继续按要求数量来继续升级。 多维度灰度 上述两种灰度策略相信都不难理解,那么如果同时配置了按节点和按数量两种灰度策略,会怎么样呢? apiVersion: apps.kruise.io/v1alpha1 kind: DaemonSet spec: # ... updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 5 partition: 100 selector: matchLabels: nodeType: canary 想搞清楚这个问题,其实看懂 Advanced DaemonSet 的发布策略计算逻辑就很好理解了,有兴趣的同学可以跳去看一下:https://github.com/openkruise/kruise/blob/master/pkg/controller/daemonset/update.go#L459 参考上面这个 YAML,如果用户同时配置了 partition 和 selector,那么控制器在发布的时候会先按照 selector 匹配符合条件的 Node,再按照 partition 计算其中能够发布的数量。当然,如果你还配置了原生 DaemonSet 就支持的 maxUnavailable,那么最后还会按照 unavailable 的数量再次限制实际能滚动升级的数量。 简单来说,最终真正执行滚动升级的 Pod,一定是要同时满足所有配置的灰度策略。 热升级 标准的 DaemonSet 滚动升级过程,是通过先删除旧 Pod、再创建新 Pod 的方式来做的。在绝大部分场景下这样的方式都是可以满足的,然而如果这个 daemon Pod 的作用还需要对外提供服务,那么滚动的时候可能对应 Node 上的服务就不可用了。 为了提供高可用能力,我们对 DaemonSet 也提供了 surging 发布策略。(回顾一下原生 Deployment 或者 OpenKruise 的 CloneSet,在这些面向无状态服务的 workload 中如果配置了 maxSurging,则发布时会先多扩出来 maxSurging 数量的 Pod,再逐渐删掉旧版本的 Pod。) apiVersion: apps.kruise.io/v1alpha1 kind: DaemonSet spec: # ... updateStrategy: rollingUpdate: type: Surging # defaults to Standard maxSurge: 30% 首先,在滚动升级中配置type: Surging,这个类型默认是 Standard -- 也就是先删再扩,而一旦设置为 Surging 则变为先扩再缩。也就是在滚动升级时,DaemonSet 会先在要发布的 Node 上新建一个 Pod,等这个新版本 Pod 变为 ready 之后再把旧版本 Pod 删除掉。 另外在流式的策略上,maxUnavailable 是用于 Standard 类型的,对应了在滚动升级时最多在多少个 Node 上删除 Pod。而 maxSurge 策略是用于 Surging 类型的,对应了在滚动升级时最多在多少个 Node 上多扩出一个 Pod。 发布暂停 此外,Advanced DaemonSet 还支持了 paused 一键暂停发布。这个比较好理解,就不细表述了。 apiVersion: apps.kruise.io/v1alpha1 kind: DaemonSet spec: # ... updateStrategy: rollingUpdate: paused: true 总结 总的来看,OpenKruise 在原生 DaemonSet 基础上增加了一系列面向生产场景的发布策略,让 DaemonSet 的升级过程更加安全、可控、自动化。 后续 OpenKruise 还会持续在应用部署/发布能力上做出更深的优化,我们也欢迎每一位云原生爱好者来共同参与 OpenKruise 的建设。与其他一些开源项目不同,OpenKruise 并不是阿里内部代码的复刻;恰恰相反,OpenKruise Github 仓库是阿里内部代码库的 upstream。因此,每一行你贡献的代码,都将运行在阿里内部的所有 Kubernetes 集群中、都将共同支撑了阿里巴巴全球顶尖规模的云原生应用场景! 原文链接 本文为阿里云原创内容,未经允许不得转载。

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

Docker 环境搭建和运维

1、docker安装 2、镜像制作 构建镜像有两种方式: docker build -t quality-dataadapter:v2.4 ./ A、Dockerfile: RROM openjdk:8 ADD ["quality-dataadapter-1.0-SNAPSHOT.jar", "/quality-dataadapter.jar"] EXPOSE 26001 ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+8","-Dfile.encoding=UTF-8","-Dquality.db.path=/config","-Dspring.config.file:./config/","-Dspring.profiles.active=dev","/quality-dataadapter.jar"] FROM 构建镜像的起点镜像 ADD 增加文件到镜像中, 第一个参数为当前系统中的文件,第二个参数是制作成镜像的文件局对路径 EXPOSE 暴露的端口 ENTRYPOINT 容器启动后,第一个运行的程序 B、容器commit: docker commit -m "配置环境完成" -a "jDK8 版本" 0b2r16ace5tm quality-dataadapter:v2.4 -m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。 3、镜像站搭建 4、docker部署 1、获取镜像包 docker save -o dockerPackage.tar dockerContainer:v2.4 2、将镜像包导入到本地仓库 docker load --input dockerPackage.tar 或 docker load < dockerPackage.tar 3、启动容器 docker run -d --name quality-adapter -p 26001:26001 -v /docker/adapter/config:/config -v /docker/adapter/logs:/logs -v /app:/app quality-dataadapter:V2.4 --name 启动的容器名 -p 容器端口与宿主机端口的映射 前面那个是宿主机端口,后面那个是容器端口 -v 将容器路径挂在到宿主机上,前一个参数为宿主机路径,后一个为容器的路径 此处有一个个人经验,如果容器启动后又迅速关闭,那么容器启动是执行的进程必定是有问题。此时最好的办法是,在打镜像时,ENTRYPOINT设置为top指令,在启动容器时,使用-dit指令,则可以启动容器后通过top指令将容器挂起。然后进入容器,排查启动指令在哪一步出现问题。 4、进入docker docker exec -it 0b2r16ace5tm /bin/bash --it 容器id 5、管理镜像仓库中的镜像 查看镜像仓库中的镜像 docker images 删除镜像 docker rmi ab2r16rcevtm 镜像id

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

运维shel小编(2)

第一章:shell历史与变量 2.1、shell历史与bash简介 Shell就是一个用于客户交互操作硬件的一个中间件。由于linux版本众多,shell也有很多种,/bin/bash是linux默认的shell。 Bashshell的功能: Tab自动补全、历史命令、命令别名、标准输入输出、重定向操作和管道功能。 History查看历史history-c清除历史,!n使用命令历史 Alias查看别名 >输出 1>和2>分别是正确输出和错误输出 |管道命令,用于将上一个执行结果向下传递 2.2shell变量的应用 变量:就是用一个特定字符串代替不固定的内容。Shell变量为linux提供了灵活的参数,包括变量名和变量值两部分。 变量赋值格式:变量名=变量值 变量查看的方式:echo$变量名 Env用于查看全局变量,set所有变量 通过键盘输入内容为变量值的格式为:read[-p“信息”]变量名 对于引用时符号注意事项:双引号“”表示引用变量值,单引号''表示$视为普通值,反撇号``意思为将结果输出给变量。 如果引用变量,它会认为$a11111看成一个整体变量,需要用${a}用 测试一个shell脚本,格式如下,但是我们却看不到结果,因为全局变量才会被启用 全局变量才会被启用,我们可以使用export变量名将结果变为全局变量,然后就可以引用了。unset进行取消变量。 键盘键入变量 2.3shell的其它变量 环境变量配置文件/etc/profile我们可以通过path增加环境变量路径,将该路径下变量变为全局变量 位置变量是指,一个数组可以使用$1-9来引用变量值 预定义变量:$#:返回命令行中参数个数,$*:显示参数内容,$?:返回上一条命令的状态,为0表示正常,$$:当前进程号,$0:当前执行进程。 2.4shell脚本简介与简单实例 Shell脚本是用于完成特定的、较复杂任务的一种自动化文本。是高级管理员必备的工具。 1、一个与键盘交互的shell脚本 2.完成一个简单的数值运算,对于计算我们使用(())双重的括号来进行数学运算。 3.每隔三天对数据库进行一次完整备份,并记录磁盘信息 本文转自zsaisai 51CTO博客,原文链接:http://blog.51cto.com/3402313/1003939

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

运维监控平台之ganglia

1、ganglia简介 Ganglia 是一款为 HPC(高性能计算)集群而设计的可扩展的分布式监控系统,它可以 监视和显示集群中的节点的各种状态信息,它由运行在各个节点上的 gmond 守护进程来采 集 CPU 、内存、硬盘利用率、 I/O 负载、网络流量情况等方面的数据,然后汇总到 gmetad 守护进程下,使用 rrdtool 存储数据,最后将历史数据以曲线方式通过 PHP 页面呈现。 Ganglia 的特点如下: 良好的扩展性,分层架构设计能够适应大规模服务器集群的需要 负载开销低,支持高并发 广泛支持各种操作系统( UNIX 等)和 cpu 架构,支持虚拟 2、ganglia组成 Ganglia 监控系统有三部分组成,分别是 gmond、 gmetad、 webfrontend,作用如下。 gmond: 即为 ganglia monitoring daemon,是一个守护进程,运行在每一个需要监测 的节点上,用于收集本节点的信息并发送到其他节点,同时也接收其他节点发过了 的数据,默认的监听端口为 8649。 gmetad: 即为 ganglia meta daemon,是一个守护进程,运行在一个数据汇聚节点上, 定期检查每个监测节点的 gmond 进程并从那里获取数据,然后将数据指标存储在 本地 RRD 存储引擎中。 webfrontend: 是一个基于 web 的图形化监控界面,需要和 Gmetad 安装在同一个节 点上,它从 gmetad 取数据,并且读取 RRD 数据库,通过 rrdtool 生成图表,用于 前台展示,界面美观、丰富,功能强大。下图是其结构 环境规划(centos6.7) 服务器端 172.16.80.117 客户端 172.16.80.117 172.16.80.116 3、ganglia的安装 [root@centos02tools]#wgetwget [root@centos02tools]#rpm-ivhepel-release-6-8.noarch.rpm [root@centos02tools]#yuminstallganglia-gmetad.x86_64ganglia-gmond.x86_64ganglia-gmond-python.x86_64-y 修改服务端配置文件 [root@centos02tools]#vim/etc/ganglia/gmetad.conf data_source"mycluster"172.16.80.117172.16.80.116 gridname"MyGrid" gangliaweb的安装(基于LNMP环境) [root@centos02tools]#tarxfganglia-web-3.7.2.tar.gz [root@centos02tools]#mvganglia-web-3.7.2/application/nginx/html/ganglia 修改gangliaweb的php配置文件 [root@centos02tools]#vim/application/nginx/html/ganglia/conf_default.php $conf['gweb_confdir']="/application/nginx/html/ganglia"; nginx配置 [root@centos02ganglia]#cat/application/nginx/conf/nginx.conf worker_processes2; events{ worker_connections1024; } http{ log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; includemime.types; default_typeapplication/octet-stream; sendfileon; keepalive_timeout65; server{ listen80; server_namewww.martin.commartin.com; location/{ roothtml/zabbix; indexindex.phpindex.htmlindex.htm; } location~.*\.(php|php5)?${ roothtml/zabbix; fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php; includefastcgi.conf; } access_loglogs/access_zabbix.logmain; } server{ listen80; server_nameganglia.martin.com; location/{ roothtml/ganglia; indexindex.phpindex.htmlindex.htm; } location~.*\.(php|php5)?${ roothtml/ganglia; fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php; includefastcgi.conf; } access_loglogs/access_bbs.logmain; } ###status server{ listen80; server_namestatus.martin.org; location/{ stub_statuson; access_logoff; } } } 访问测试,报错如下 Fatalerror:Errorsweredetectedinyourconfiguration. DWOOcompiledtemplatesdirectory'/application/nginx/html/ganglia/dwoo/compiled'isnotwriteable. Pleaseadjust$conf['dwoo_compiled_dir']. DWOOcachedirectory'/application/nginx/html/ganglia/dwoo/cache'isnotwriteable. Pleaseadjust$conf['dwoo_cache_dir']. in/application/nginx-1.6.3/html/ganglia/eval_conf.phponline126 解决办法: [root@centos02tools]#mkdir/application/nginx/html/ganglia/dwoo/compiled [root@centos02tools]#mkdir/application/nginx/html/ganglia/dwoo/cache [root@centos02tools]#chmod777/application/nginx/html/ganglia/dwoo/compiled [root@centos02tools]#chmod777/application/nginx/html/ganglia/dwoo/cache [root@centos02html]#chmod-R777/var/lib/ganglia/rrds 修改客户端配置文件(所有的客户端都需要做) [root@centos02tools]#vim/etc/ganglia/gmond.conf cluster{ name="mycluster"#这个名字要和服务器端定义的data_source后面的名字一样 owner="unspecified" latlong="unspecified" url="unspecified" } udp_send_channel{ #bind_hostname=yes#Highlyrecommended,soontobedefault. #Thisoptiontellsgmondtouseasourceaddress #thatresolvestothemachine'shostname.Without #this,themetricsmayappeartocomefromany #interfaceandtheDNSnamesassociatedwith #thoseIPswillbeusedtocreatetheRRDs. #mcast_join=239.2.11.71 host=172.16.80.117#这里我们采用单播方式,默认是组播 port=8649 #ttl=1 } udp_recv_channel{ #mcast_join=239.2.11.71 port=8649 #bind=239.2.11.71 retry_bind=true #SizeoftheUDPbuffer.Ifyouarehandlinglotsofmetricsyoureally #shouldbumpituptoe.g.10MBorevenhigher. #buffer=10485760 } 4、再次访问测试 这里是整个集群的一个总的汇总图,而不是单台服务器的图,下面我们打开单台服务器的图看看 再来看看对同一指标,每台服务器一起显示的图 5、扩展 Ganglia 监控功能的方法 默认安装完成的 Ganglia 仅向我们提供基础的系统监控信息,通过 Ganglia 插件可以实 现两种扩展 Ganglia 监控功能的方法。 1) 添加带内( in-band)插件,主要是通过 gmetric 命令来实现。 这是通常使用的一种方法,主要是通过 crontab 方法并调用 Ganglia 的 gmetric 命令来向 gmond 输入数据,进而实现统一监控。这种方法简单,对于少量的监控可以采用,但是对 于大规模自定义监控时,监控数据难以统一管理。 2) 添加一些其他来源的带外( out-of-band)插件,主要是通过 C 或者 Python 接口来 实现。 在 Ganglia3.1.x 版本以后,增加了 C 或 Python 接口,通过这个接口可以自定义数据收集 模块,并且可以将这些模块直接插入到 gmond 中以监控用户自定义的应用。 这里我们举例通过带外扩展的方式 来监控nginx的运行状态 配置ganglia客户端,收集nginx_status数据 [root@centos02nginx_status]#pwd /tools/gmond_python_modules-master/nginx_status [root@centos02nginx_status]#cpconf.d/nginx_status.pyconf/etc/ganglia/conf.d/ [root@centos02nginx_status]#cppython_modules/nginx_status.py/usr/lib64/ganglia/python_modules/ [root@centos02nginx_status]#cpgraph.d/nginx_*/application/nginx/html/ganglia/graph.d/ [root@centos02mysql]#cat/etc/ganglia/conf.d/nginx_status.pyconf # modules{ module{ name='nginx_status' language='python' paramstatus_url{ value='http://status.martin.org/' } paramnginx_bin{ value='/application/nginx/sbin/nginx' } paramrefresh_rate{ value='15' } } } collection_group{ collect_once=yes time_threshold=20 metric{ name='nginx_server_version' title="NginxVersion" } } collection_group{ collect_every=10 time_threshold=20 metric{ name="nginx_active_connections" title="TotalActiveConnections" value_threshold=1.0 } metric{ name="nginx_accepts" title="TotalConnectionsAccepted" value_threshold=1.0 } metric{ name="nginx_handled" title="TotalConnectionsHandled" value_threshold=1.0 } metric{ name="nginx_requests" title="TotalRequests" value_threshold=1.0 } metric{ name="nginx_reading" title="ConnectionsReading" value_threshold=1.0 } metric{ name="nginx_writing" title="ConnectionsWriting" value_threshold=1.0 } metric{ name="nginx_waiting" title="ConnectionsWaiting" value_threshold=1.0 } } 完成上面的所有步骤后,重启 Ganglia 客户端 gmond 服务,在客户端通过“ gmond–m” 命令可以查看支持的模板,最后就可以在 Ganglia web 界面查看 Nginx 的运行状态

资源下载

更多资源
Mario

Mario

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

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册