首页
小游戏
壁纸
留言
视频
友链
关于
Search
1
上海市第八人民医院核酸检测攻略(时间+预约+报告)-上海
299 阅读
2
上海烟花销售点一览表2022-上海
241 阅读
3
新款的 Thinkbook 16+ 值不值得买?-知乎热搜
219 阅读
4
如何看待网传小米 MIUI 13 内置国家反诈中心 APP?-知乎热搜
214 阅读
5
窦唯到底厉害在哪里?-知乎热搜
192 阅读
免费代理IP
免费翻墙节点
文章聚合
掘金
知乎
IT之家
本地宝
观察者网
金山词霸
搜韵网
新华网
其他
登录
/
注册
Search
标签搜索
知乎热搜
IT之家热榜
广州
深圳
北京
观察者网头条
前端
上海
后端
知乎日报
Android
iOS
人工智能
阅读
工具资源
杭州
诗词日历
每日一句
郑州
设计
看啥
累计撰写
129,720
篇文章
累计收到
46
条评论
首页
栏目
免费代理IP
免费翻墙节点
文章聚合
掘金
知乎
IT之家
本地宝
观察者网
金山词霸
搜韵网
新华网
其他
页面
小游戏
壁纸
留言
视频
友链
关于
搜索到
1336
篇与
的结果
2022-10-19
青训营 - 快乐出发 Flag 打卡活动「第一阶段统计」结果新鲜出炉~-掘金
一、活动介绍青训营 - 快乐出发 Flag 打卡活动,是由青训营官方发起的面向在校大学生的打卡活动,同学们报名活动后,通过设定目标,每日打卡的形式参与活动,青训营官方将定期进行打卡天数统计,赢得奖品的同时,也获得一份自律的生活习惯!加油吧,少年!详情戳:https://juejin.cn/post/7140110639271247903二、统计时效10月18日为第一次统计时间统计区间:个人第一次打卡日 - 10月17日个人详细打卡天数及活动链接已发送至各位同学后台,请及时查收~三、奖励原则🌺 打卡30次及以上:掘金马克杯🌺 打卡21次 - 29次(包括21 & 29次):运动毛巾🌺 打卡14次 - 20次(包括14 & 20次):矿石2000🌺 打卡7次 - 13次(包括7 & 13次):矿石1000注:单次统计信息时:第一打卡 - 最后一次打卡区间,累计未打卡超过4次(包括4次),无奖品~(该项单次统计结算,不累计。已报名还未打卡 & 已累计4次未打卡的小伙伴们,大家可以在10月18日后继续进行打卡赢奖品!)四、申诉原则 报名使用的账号与实际打卡账号不一致,导致系统未识别到,需要调整 uid 。 实际打卡天数统计有误,需要调整打卡数量。(此处需附有当天打卡证明哦)。 注:每天只能打卡1次哦~大家在申诉前,请先确认好自己打卡的天数。例如:小明从9月13日开始打卡,截止10月17日,小明最多可打卡天数为:35天。五、写在最后“一无所知的世界,走下去,才会有惊喜”在第一次统计过程中,看到了大家坚持的模样,平时不经意间的点滴积累,总会在你需要的时候挺身而出,赋予你前所未有的力量。积累是一个好习惯,而习惯就像雨水,润物细无声,却又有穿石的力量。坚持是一件很酷的事情,已报名但还没有参与进来的同学,也期待在下次统计时看到大家努力的身影,一起打卡赢奖励和一份自律的生活习惯~以上文章来自[掘金]-[青训营官方账号]本程序使用github开源项目RSSHub提取聚合!
2022年10月19日
0 阅读
0 评论
0 点赞
2022-10-19
云原生爱好者周刊:野心很大的云原生数据库 SurrealDB-掘金
开源项目推荐SurrealDBSurrealDB 是一个开源的端到端云原生数据库,同时支持 Table、Document 和 Graph 等多种数据模型,对外提供 SurrealQL、GraphQL、Rest 与 WebSocket 等多种查询方式,支持实时查询和权限等高级特性,既可以嵌入式部署,也可以在云端扩展为分布式的数据库。pg_watch_demo这个项目在 PostgreSQL 中通过 trigger 和 notify 模拟了 Etcd 的 watch 机制,包含以下功能: watch (*); 从历史数据中读取 value。比如从 revision 中读取 key; 修改 key; 删除 key; 通过 revision 或者 date retention 进行压缩(compact)。 dnslookupdnslookup 是使用 Go 语言编写的 DNS 查询命令行客户端,支持 DOH、DOT、DOQ、DNSCrypt 等各种 DNS 协议。FrankenPHPFrankenPHP 是使用 Go 编写的高性能、开源的 PHP 应用服务器,与 php-fpm 不同,FrankenPHP 只有一个二进制文件,使用常驻进程来和 PHP 应用进行交互,不需要在每次请求时创建并杀掉一个新的 PHP 进程。RoadRunner另一款使用 Go 编写的 PHP 应用服务器,与 FrankenPHP 类似。HelixHelix 是一个使用 Rust 语言编写的现代化文本编辑器,兼容 vim 的快捷键和操作体验,内置语法高亮等多种高级功能。商业产品推荐Slim.AISlim.AI 是基于 docker-slim 这个开源项目的商业服务,可以通过可观测性来保障镜像中的软件供应链安全,删除镜像中无用的文件和软件包,压缩镜像大小,减少攻击面和漏洞数量。KubeSphere Cloud 轻量集群服务这是青云推出的一款完全开箱即用的 Kubernetes 集群托管服务,支持秒级启用 Kubernetes 集群,同时提供一键部署 KubeSphere 容器平台,可以快速得到完整可用的轻量集群资源。如果你想快速获取一个可用的 Kubernetes 集群来进行学习体验、教学培训、测试验证、商务演示等用途,可以试试这个服务,目前有俩小时的免费使用时间限制,上述场景已经够用了。文章推荐Apache APISIX 集成开源函数计算平台 OpenFunctionApache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX 不仅支持插件动态变更和热插拔,而且拥有众多实用的插件。OpenFunction 是一个云原生的开源 FaaS 平台,旨在让用户专注于自己的业务逻辑,而不必维护底层运行时环境和基础设施。本文介绍了 Apache APISIX 新的无服务插件 OpenFunction 的功能与集成细节。忙碌的开发人员的 Go Profiling、跟踪和可观察性指南这是一本实用指南,针对的是对使用 profiling、跟踪和其他可观察性技术改进程序感兴趣的忙碌的 gopher。如果你对 Go 的内部实现不熟悉,建议你先阅读整个介绍。之后,你可以自由地跳到你感兴趣的任何章节。云原生动态Fluent Bit 超过 30 亿次下载Fluent Bit 在 10 月初突破了 30 亿下载量。从 2019 年到 2021 年,Fluent Bit 下载量基本上每年增长两倍。然而,该比率在 2022 年大幅增加。今年前三个月,Fluent Bit 每天被下载 200 万到 300 万次。目前,这个数字平均每天为 1300-1400 万次。Fluent Bit 是一个CNCF 毕业项目,隶属于 Fluentd,与其他基础技术如 Kubernetes 和 Prometheus 一起。这是一个高度可伸缩的应用程序,它采用供应商中立的方法,从不同的来源收集日志和指标,处理它们,并将它们发送到多个目的地。本月晚些时候,该社区将发布 Fluent Bit v2,该版本将增加对分布式追踪数据(或追踪)的支持,使 Fluent Bit 与 CNCF 孵化项目OpenTelemetry 完全兼容。Grafana 9.2 发布除了公共仪表盘的新开发和对 Google Analytics 4 属性的支持之外,Grafana 9.2 还提供了与支持团队就仪表盘问题进行联系的新方法、Grafana Loki 的简化查询变量编辑器、访问控制的改进等等。该版本主要变化如下: 新的仪表盘帮助选项 Grafana Loki 的简化查询变量编辑 改进了 Google Cloud Monitoring 插件的 UI 扩展了 JOIN 转换以支持 INNER JOINS 和 OUTER JOINS 在 Terraform 中创建和分配角色 创建和编辑团队时的角色选择器 …… HashiCorp 通过持续验证增强 Terraform 漂移检测HashiCorp为 Terraform 发布了许多新功能,包括持续验证和无代码配置。这两个功能目前都处于面向 Terraform Cloud Business 用户的测试版中。其他版本包括本机开放策略代理 (OPA)支持和Azure 提供程序自动化。新的连续验证功能建立在先前发布的漂移检测之上。通过持续验证,可以定义大约每 24 小时检查一次的前置条件和后置条件。漂移检测确定真实世界的基础设施是否与 Terraform 状态文件匹配,而持续验证可验证这些自定义条件在 Terraform 提供基础设施后是否继续通过。Linux 打包系统中发现安全漏洞Canonical 的 snap 和 Red Hat 的 flatpaks 一样,都是基于容器的 Linux 软件打包和部署程序。虽然 snaps 与 Ubuntu Linux 关联最密切,但它用于在许多 Linux 发行版上分发和安装 Linux 程序。Qualys 研究团队发现了几个难以发现的 snap Linux 安全问题。这些安全漏洞很严重。在最坏的情况下,这个 7.8 通用漏洞评分系统 (CVSS) 评级的安全漏洞可用于在默认 Ubuntu 安装上获得完全的 root 权限。本文由博客一文多发平台 OpenWrite 发布!以上文章来自[掘金]-[KubeSphere]本程序使用github开源项目RSSHub提取聚合!
2022年10月19日
0 阅读
0 评论
0 点赞
2022-10-19
希尔排序--思想及其代码实现-掘金
希尔排序的思想及代码实现希尔排序的基本思想希尔排序简单点来说,就是直接插入排序的优化,能比直接插入排序应对更多的情况,但两者还是有些区别:ps:如果有不清楚直接插入排序的兄弟可以这篇文章,里面有详细的介绍: https://juejin.cn/post/7154975522340995102在我们排序时,假设我们想用直接插入排序来排,但是要排序的数组刚好是个逆序的,那它的时间复杂度就会比较大,也就是说执行的过程会更多更繁琐,而为了优化这种排序的过程,我们可以先对这种数组进行预排序,预排序就是先让这个数组进行粗略的排序,目的就是让数组更接近有序,而不是一个完全的逆序数组,这样直接插入排序在执行的时候,效率就会变高,这就是希尔排序的思想。那么怎么进行预排序呢?我们可以把他们分成几个组,来进行排序,比如下面这个数组(假设最后的结果为升序):我们可以先令gap等于3(后面会解释gap到底怎么取值),意思就是把该数组每3个空分一个组,如下图(end为数组的下标):在我们分好组之后,接下来就可以开始预排序了,也就是一组一组的排序,排序方式跟直接插入排序一样:如上图所示,排序从蓝色分组中的第一组的第二个数5开始,跟直接插入排序一样,将前面的9看作已经排好的数组,5小于9,因此9要往后移,注意移动的时候是以gap为单位移动的;蓝色这第一组排完序后,end++,开始对绿色分组中的第一组开始排序,tmp也变成的绿色这第一组中要插入的数据,完成这几步操作后数组的状态如下图所示: 如上图所示,此时排序从绿色分组中的第一组开始,因此arr[end]指向该分组中的第一个元素1,tmp指向的7为此时要插入的元素,重复直接插入排序的步骤,1和7排完序后,end++,tmp则变成紫色这一组中要插入的数据,如下图所示: 用直接插入排序的方法,重复以上操作。直到这一步(如下图所示):首先我们还是用直接插入排序的方式来排,5小于9,因此9要往后移,5要往前移到9原来的位置,然后end以gap为单位,向前移到8的位置,再让tmp和8进行比较,然后重复上述操作,因为原来end是指的8的位置,因此在这个基础上,end++,如下图所示: 由此可以发现,tmp此时已经越界了,end所在的位置刚好是n-gap-1,因此可以将该条件作为排序终止的条件,此时gap为3的排序就完成了。这时的数组已经接近有序了,但希尔排序并不是只需要排这一轮,gap的值在每一轮排序终止后都会减少,因为gap的值每减少一次,数组就会更接近有序,当gap值为1时,此时的希尔排序就相当于直接插入排序了,那么究竟怎么控制gap的值呢?//如何控制gap的值: int gap = n; while (gap > 1) { gap = gap / 2; //用于控制gap的值 //此处省略排序的主体 } 如上述代码所示,我们可以用while来控制gap的值,gap的值在每一轮排序终止后,都会整除一次2,但是为什么是除2呢?因为gap的值不管为多少,在整除n次2以后,最终的值都会变成1,满足直接插入排序的条件,比如当gap为5,整除2后会变成2,再整除2后就变成了1希尔排序的代码实现当我们了解上述希尔排序的主要思想后,就可以来写代码了,废话不多说,直接放代码:#include /*printf*/ void PrintArray(int* arr, int len) /*打印数组内容*/ { for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } printf(" "); } void ShellSort(int* arr, int n) /*希尔排序*/ { int gap = n; //gap:分组的依据,gap的值每减小一次,排序就会越接近有序 while (gap > 1) //当gap的值为1时,排序就相当于直接插入排序 { gap = gap / 2; //控制gap的值,使其最终能够等于1,满足直接插入排序的条件 for (int i = 0; i < n - gap; i++) //end排完序后的位置为n-gap-1,因此将n-gap作为终止条件 { int end = i; int tmp = arr[end + gap]; //将要插入的数据存到tmp当中 while (end >= 0) { if (arr[end] > tmp) { arr[end + gap] = arr[end]; //如果tmp的值较小,则arr[end]以gap为单位向后移动 end = end - gap; //gap继续向前比较 } else { break; //排序完成后退出循环 } } arr[end + gap] = tmp; //此时tmp后面的值都比它大,前面要么没有数据,要么都比它小 //tmp成功插入 } } PrintArray(arr, n); /*打印函数*/ } int main() { int arr[] = { 9,1,2,5,7,4,8,6,3,5 }; int len = sizeof(arr) / sizeof(arr[0]); //计算数组的长度 ShellSort(arr, len); /*希尔排序*/ return 0; } 运行结果:以上就是本篇文章的全部内容,如果你觉得对你多少有些帮助,可以点个赞或者收藏一波支持一下哦,欢迎各位大佬批评指正,咱们下次再见!以上文章来自[掘金]-[苟熊岭熊哒]本程序使用github开源项目RSSHub提取聚合!
2022年10月19日
0 阅读
0 评论
0 点赞
2022-10-19
PMO与项目经理(PM)有什么区别?这又和PMP证书有何联系?-掘金
对于这类型的区别问题,一般都有一个相同的思路,分享给大家:首先分别认识它们名词解释,然后再是使用范围,最后是各自的发展穿插关系。 先分别说说PM和PMO分别是什么? 然后再对比他们的区别和现状。 最后看看PM和PMO的发展穿插! 一、项目经理&PMO分别是什么?1. PMO是什么?(1)定义PMO项目经理(Project Management Office Manager),也称为项目管理办公室经理、项目管理中心或者项目管理部。一般来说,PMO就是负责公司项目管理政策、标准的制定,统筹、协调、监督公司内部项目的开展,保障各类项目的整体进度及质量,这些比较零碎的管理上的活。(2)基本类型而PMO在企业组织里面一般有3种的基本定位类型:保证型、控制型、战略型。这3个类型的等级是逐步提高的,一张图看清楚,要做PMO,得往控制型和战略型走起。(3)PMO的三大作用对内解决问题定标准,对外客户交涉和交付支持,当然最重要的是给人员赋能。要搞清楚,PMO不是单纯的PM,为了完成项目交付而存在的,如果只是这个目的,项目经理就够了,PMO的存在,是为了让负责交付项目的项目经理更加优秀。让项目经理知道什么是好的标准,要怎么做?现在我们有客户成功经理这个岗位,性质有点相似,就是帮助直接负责项目成功的人成功。2. 普通项目经理PM(Project Manager)项目经理是执行组织委派其实现项目目标的个人。基于企业组织结构的不同,项目经理可能要向职能经理汇报,也可能向项目集经理或者项目组合经理汇报。项目经理是一个职位,它的工作是给这个项目进行策划并执行,对项目的质量、进度、成本等问题进行监督和把控。项目经理的工作内容是协调项目资源,梳理项目组织架构,整合项目计划;全生命周期监控管理整个项目, 不是管人,是管项目。二、有什么区别?其实二者的区别还是挺明显的,一个是组织,一个是人。只是PMO的知名度和价值没得到很明确的公认,有些外行总是傻傻搞不清楚。他们都有一个相同之处:在于都是围绕的项目展开,对项目最终负责。1. 目标不同目标的前提是客户的需求,需求不同,所以目标也就不同。项目经理负责的是在项目各种的约束条件下,完成特定的项目成果性目标,而PMO是具有特殊授权的组织机构,其工作目标包含组织级的观点。项目经理关注项目目标,PMO关注大型项目的范围变化。2. 公认的价值性和有效性项目经理已经有了很强的普及性,而且也有PMP这种权威的项目管理人士的专业认证,含金量和推广度都很高。但PMO目前为止还没有一个普遍公认的PMO结构,并且在很多企业的PMO都是临时小作坊,领导走了也就散了,经常就沦为「保证型」的PMO组织,变成项目经理的后勤部队。不过呢,PMO的设立也很灵活,可以为某个项目设立一个PMO,在部门里也可以设一个管整个部门的所有项目,还可以给整个组织设一个,这样,如果组织需要,其实一个企业组织里是可以同时存在3级这样PMO的。虽然PMO公认的价值性比较低,但是它在组织里面的使用率还是很高的。3. 工作内容&范围PM和PMO的工作内容也有着明显的区别,我总结了两个要素,分别是:对资源的使用、管理范围。项目经理对项目资源做合理调配和控制,目的是为了更好地实现项目目标;而PMO对所有项目之间的共享组织资源进行优化使用。项目经理管理的内容很广,包括进度、费用、成本和质量等;而PMO管理整体的风险、整体的机会和所有的项目依赖关系。三、PM和PMO的发展穿插其实PM和PMO的整个职业发展是可以穿插进行的,无论是PM的初级还是PMO的初级,都只是停留在打杂的阶段,对个人成长并没有帮助。我见到很多人并不是真正意义上的项目经理,他们完全不懂做项目管理,只是因为在那个团队里最大,就成了项目经理。这放在过去和一些传统企业还行,但现在这个敏捷时代,马上就要跟不上节奏了。所以无论是PM还是在PMO组织里,都需要有完善的项目管理知识体系,成为专业的项目经理。要咋做,先把专业项目管理资格认证PMP证书给考了,打好基础,边学边实践。那有了基础之后要怎么去穿插发展呢?我整了个表格,看着直观些!四、写在最后之前说项目经理和产品经理,是一个正确的做事,一个做正确的事。同样的,在PM和PMO之间,PM的角色仍是针对项目本身去把这个项目完成,根据PMP的项目管理知识体系,根据5大过程组和10大知识领域的方法论和执行,最终成功交付项目,让相关利益人满意,就是完整的项目管理周期。成败与否需要PM的全程参与。而PMO更重要的是做正确的事,跳出项目这个单独的视角,凡事以组织为中心,因为PMO的领导是高层,它要做的就是把高层的决策付诸实践,生死存亡都在高层手里。所以对于PMO来说,重要不是你想做什么,而是组织需要你做什么。所站维度越高,看待事物越简单越本质,这就是逆向思维。 [1] 如果大家想要了解PMP认证,可以进群找伙伴一些学习了解,甚至可以直接询问老师, **如果你已经在考,那群里的资料大家也可自行下载。**qqun :https://jq.qq.com/?_wv=1027&k=lIFjpyxU 以上文章来自[掘金]-[西西梨]本程序使用github开源项目RSSHub提取聚合!
2022年10月19日
2 阅读
0 评论
0 点赞
2022-10-19
Ceph集群CephFS文件存储核心概念及部署使用-掘金
1.1.CephFS文件存储简介官方文档:https://docs.ceph.com/en/pacific/cephfs/传统的文件存储通常使用的是NAS存储,通过NFS协议来实现,NFS类型的文件存储可以同时共享给多个客户端使用,传输协议简单,只要有网络就可以实现。对于存储而言,高可用性是必须具备的,一旦存储宕机,就会影响应用程序的使用,而NAS存储最典型的缺点就是单点故障。在Ceph分布式存储系统中有关于文件存储的存储类型,称之为CephFS,CephFS是一个符合POSIX的文件系统,构建在Ceph对象存储Rados之上,CephFS可以为各种应用程序提供最先进的、多用途、高可用性和高性能的文件存储。CephFS文件系统至少需要一个MDS(Metadata Server组件)来存储文件系统的元数据信息,因此在使用CephFS文件存储之前,首先要在集群中部署MDS组件,我们希望CephFS文件存储具备高可用性,所以MDS组件一般都会在集群中部署多个,大多数情况下都是三个MDS组件。CephFS支持用户级别和内核级别的挂载使用,可扩展性极高,并且可以同时让多个Client客户端进行读写。简而言之:CephFS文件存储就是提供类似NFS服务的共享存储系统,相当于基于NFS的分布式文件存储系统,多个客户端可以同时去挂载这个文件存储系统,并且还可以提供高可靠服务。1.2.CephFS文件存储架构CephFS文件系统的核心组件有: MDS:MDS组件主要用于保存文件的元数据信息,会单独存放在一个Pool资源池中。 MDS支持高可用性,默认采用主备模式,也可以配置成多主模式。 Client:客户端。 RADOS:CephFS也是基于RADOS来实现文件存储的,CephFS文件存储中的文件数据与文件的元数据都是单独在不同的Pool资源池中存储的。 Ceph集群如果想要实现CephFS文件存储,首先需要在集群中准备MDS组件,MDS组件主要是来保存文件存储中文件的元数据信息,一般会部署三个MDS组件,形成高可用模式,其中一个MDS的Active状态提供服务,另外两个都是Standby的状态,当Active状态的MDS挂掉后,Standby状态的MDS之间会就进行选举,选举成功的MDS节点就会成为集群中的Active。MDS组件会将文件的元数据信息写在Journal日志中,最终Journal日志中的文件元数据信息会写入到一个Metadata的Pool资源池中,所有的MDS节点都会连接这个Pool资源池,并且MDS各节点之间会交换元数据信息,当Active状态的MDS组件挂掉了,选举出来的MDS会从Metadata Pool资源池获取整个集群中所有文件的元数据信息。CephFS会将用户写入的文件数据与文件的元数据分开存放在不同的Pool资源池中,将数据与元数据分开存储。Client客户端可以直接在存放数据的Pool资源池中写入文件数据,写入的文件依旧会被拆分成多个Object对象文件,这些Object对象文件写入到PG中,最后通过CRUSH算法存储在多个OSD中。1.3.CephFS文件系统的应用场景与特性应用场景: 为K8S集群Pod资源提供持久化存储。 多个服务器同时挂载一个文件系统,同时进行读写。 CephFS文件系统多MDS的优势及特点: 当元数据默认的单个MDS成为瓶颈时,配置多个活跃的MDS守护进程,提升集群性能。 多个活跃的MDS有利于性能提升。 多个活跃的MDS可以实现MDS负载均衡。 多个活跃的MDS可以实现多租户资源隔离。 它能够将文件系统树分割成子树,每个子树可以交给特定的MDS进行权威管理,从而达到了随着元数据服务器数量的增加,集群性能线性地扩展。 每个子树都是基于元数据在给定目录树中的热动态创建的。 一旦创建了子树,它的元数据就被迁移到一个未加载的MDS。 后续客户端对先前授权的MDS的请求被转发。 2.在Ceph集群中部署MDS组件 1.在集群所有节点都安装mds组件 yum -y install ceph-mds 2.将所有的ceph节点都部署mds组件形成高可用集群 [
[email protected]
~]# cd /data/ceph-deploy/ [
[email protected]
ceph-deploy]# ceph-deploy mds create ceph-node-1 ceph-node-2 ceph-node-3 3.查看集群状态 [
[email protected]
ceph-deploy]# ceph -s cluster: id: a5ec192a-8d13-4624-b253-5b350a616041 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node-1,ceph-node-2,ceph-node-3 (age 19h) mgr: ceph-node-1(active, since 19h), standbys: ceph-node-2, ceph-node-3 mds: 3 up:standby osd: 6 osds: 6 up (since 18h), 6 in (since 18h) rgw: 1 daemon active (ceph-node-1) task status: data: pools: 7 pools, 320 pgs objects: 252 objects, 161 KiB usage: 6.1 GiB used, 54 GiB / 60 GiB avail pgs: 320 active+clean 可以看到集群中已经有3个MDS组件了,但是状态都处于standby,那是因为集群中还没有创建CephFS文件系统,导致MDS组件无法选举。3.在Ceph集群中创建一个CephFS文件存储系统一个Cephfs文件存储系统至少需要两个Rados资源池,一个资源池用于存放文件数据,另一个资源池用于存放文件的元数据信息,如果元数据资源池中的任何数据丢失,都有可能导致整个文件系统无法访问。对元数据资源池建议使用较低延迟的OSD,例如可以使用SSD硬盘的OSD,元数据资源池的延迟直接会影响在客户端中文件系统操作的延迟。3.1.为CephFS文件存储系统创建Pool资源池创建好这两个Pool资源池后,只能为一个cephfs文件存储系统使用,如果集群中需要创建多个cephfs文件系统,则需要创建多个元数据池和数据池,一个元数据资源池和数据资源池只能为一个Cephfs文件系统提供使用。 1.创建元数据资源池 [
[email protected]
~]# ceph osd pool create cephfs_metadata 16 16 pool 'cephfs_metadata' created 2.创建数据资源池 [
[email protected]
~]# ceph osd pool create cephfs_data 16 16 pool 'cephfs_data' created 3.查看创建的资源池 [
[email protected]
~]# ceph osd lspools 1 ceph-rbd-data 2 .rgw.root 3 default.rgw.control 4 default.rgw.meta 5 default.rgw.log 6 default.rgw.buckets.index 7 default.rgw.buckets.data 8 cephfs_metadata 9 cephfs_data 3.2.创建CephFS文件系统命令格式:ceph fs new {cephfs_name} {metadata_pool} {data_pool} 1.创建cephfs文件存储 [
[email protected]
~]# ceph fs new cephfs-storage cephfs_metadata cephfs_data new fs with metadata pool 8 and data pool 9 2.查看创建的cephfs文件存储 [
[email protected]
~]# ceph fs ls name: cephfs-storage, metadata pool: cephfs_metadata, data pools: [cephfs_data ] [
[email protected]
~]# ceph fs volume ls [ { "name": "cephfs-storage" } ] 3.3.再次观察Ceph集群的状态 [
[email protected]
~]# ceph -s cluster: id: a5ec192a-8d13-4624-b253-5b350a616041 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node-1,ceph-node-2,ceph-node-3 (age 24h) mgr: ceph-node-1(active, since 24h), standbys: ceph-node-2, ceph-node-3 mds: cephfs-storage:1 {0=ceph-node-1=up:active} 2 up:standby #当创建完cephfs文件系统后,mds组件自动选举一个mds组件为active状态,其余为standby状态 osd: 6 osds: 6 up (since 23h), 6 in (since 23h) rgw: 1 daemon active (ceph-node-1) task status: data: pools: 9 pools, 352 pgs objects: 274 objects, 164 KiB usage: 6.1 GiB used, 54 GiB / 60 GiB avail pgs: 352 active+clean 4.内核级别挂载CephFS文件系统挂载的操作文档:https://docs.ceph.com/en/pacific/cephfs/mount-using-kernel-driver/4.1.无需认证的方式挂载CephFS文件系统1)在客户端中创建挂载目录 [
[email protected]
~]# mkdir /cephfs_data 2)使用内核级别挂载Cephfs文件系统CephFS系统可以理解为也是一个磁盘,类型是ceph的类型,直接可以通过mount命令进行挂载。命令格式:mount -t ceph {monitor_addr}:/ /{path} -o name=admin挂载时最好指定所有monitor组件的地址,否则当有一个monitor组件产生问题,就会影响挂载。 1.首先确认mount是否支持ceph类型的文件系统,如果不支持则去安装ceph-common包 [
[email protected]
~]# which mount.ceph /usr/sbin/mount.ceph 2.挂载cephfs文件系统 [
[email protected]
~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ /cephfs_data/ -o name=admin #这个admin用户是ceph集群默认的用户,不需要指定secret key 3.查看是否挂载成功 [
[email protected]
~]# df -hT /cephfs_data/ 文件系统 类型 容量 已用 可用 已用% 挂载点 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ ceph 17G 0 17G 0% /cephfs_data 4.此时就可以在挂载目录中写入数据了。 4.2.使用认证方式挂载CephFS文件系统1.获取admin用户的Key [
[email protected]
~]# cat /etc/ceph/ceph.client.admin.keyring [client.admin] key = AQBIWUhiEmaFOBAA6Jr6itUeHiLVVOeYFVpRog== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" 2.通过认证方式挂载CephFS文件系统[
[email protected]
~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ /cephfs_data/ -o name=admin,secret=AQBIWUhiEmaFOBAA6Jr6itUeHiLVVOeYFVpRog== 3.查看是否挂载成功[
[email protected]
~]# df -hT /cephfs_data/ 文件系统 类型 容量 已用 可用 已用% 挂载点 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ ceph 17G 0 17G 0% /cephfs_data 4.设置开机自动挂载[
[email protected]
~]# vim /etc/fstab 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ /cephfs_data ceph name=admin,secret=AQBIWUhiEmaFOBAA6Jr6itUeHiLVVOeYFVpRog== 0 0 也可以将用户的Key写入到一个文件中,然后引用这个文件,如下所示:1.将key写入到一个文件中 [
[email protected]
~]# ceph-authtool -p /etc/ceph/ceph.client.admin.keyring > admin.key [
[email protected]
~]# chmod 600 admin.key 2.挂载时引用这个Key文件 [
[email protected]
~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ /cephfs_data/ -o name=admin,secretfile=/root/admin.key 3.开机自动挂载 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ /cephfs_data ceph name=admin,secretfile=/root/admin.key 0 0 5.用户空间挂载CephFS文件系统1.安装ceph-fuse客户端 [
[email protected]
~]# yum -y install ceph-fuse 2.创建挂载点 [
[email protected]
~]# mkdir /cephfuse-data 3.使用fuse挂载 [
[email protected]
~]# ceph-fuse -n client.admin -m 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789 /cephfuse-data/ 2022-04-03 23:37:18.794 7f5574ca7f80 -1 init, newargv = 0x5615fadddb50 newargc=9ceph-fuse[31903]: starting ceph client ceph-fuse[31903]: starting fuse 4.查看挂载的文件系统 ceph-fuse[31903]: starting fuse [
[email protected]
~]# df -HT /cephfuse-data/ 文件系统 类型 容量 已用 可用 已用% 挂载点 ceph-fuse fuse.ceph-fuse 19G 0 19G 0% /cephfuse-data 6.查看CephFS的状态[
[email protected]
~]# ceph fs status cephfs-storage 以上文章来自[掘金]-[jiangxl]本程序使用github开源项目RSSHub提取聚合!
2022年10月19日
0 阅读
0 评论
0 点赞
2022-10-18
在北京这种城市,周末假期怎么整才算浪......-掘金
以上文章来自[掘金]-[酱爆大头菜]本程序使用github开源项目RSSHub提取聚合!
2022年10月18日
0 阅读
0 评论
0 点赞
2022-10-18
年度大促将至,企业如何进行性能压测-掘金
作者:拂衣为什么要做压测随着无线设备的普及和 5G 的大力建设,越来越多的线上系统、小程序成为了人们生活中必不可少的工具。与此同时,年底各类大促活动接踵而至,对于这些电商软件而言,都会面对一个问题:系统能承受多少用户同时访问,面对突发的流量洪峰,能否保证系统无故障稳定运行?为了回答这个问题,就需要在系统上线前做多轮压力测试,提前模拟出复杂的, 高仿真的线上流量来验证整体系统的高可用性, 这也是实施系统高可用方案的关键环节。另外,通过不同阶段的压测,也完成对系统的容量规划、瓶颈探测,对系统整体能力进行验收,确保在流量洪峰来临前,系统确实能够承受即将来临的真实线上压力。从某种意义上来说,压测是系统稳定性的验证者。如何实施一次准确的性能压测1. 准备压测环境压测的执行环境是一个老生常谈的话题,如果直接在生产环境执行压测,会有 2 个问题: 会影响线上业务,对正常访问系统的用户造成影响2.会污染线上数据,将压测数据写入线上数据库为了解决这 2 个问题,一般业内采用如下几种方案: 以上方案各有优缺点,适用场景也不尽相同,可以根据自己项目所处的阶段灵活选择方案。2. 构建压测脚本业内常用的压测工具包括 JMeter、Gatling、Locust、k6、Tsung、阿里云 PTS 等。这些工具无一例外,都需要将压测业务的 API,编排为一个压测脚本。这一步工作的重点在确认压测的 API,不要有遗漏,且 API 编排的顺序要符合用户的操作逻辑。对于电商业务的压测来说,如果脚本中遗漏了登录鉴权 API,那后面的订单、物流、库存等 API 都会在权限校验这步就报错,不会执行正常的业务逻辑,也就无法模拟真实的业务场景。以上压测工具编排脚本都有 2 个方式: 手动输入脚本,这需要脚本的编写人员对业务非常熟悉,保证不会遗漏 API。 自动录制脚本,上述开源压测工具都提供了录制请求的代理功能,开启并配置代理后,只要在页面上模拟用户的操作和点击行为,即可自动录制请求,并生成压测脚本。同时 PTS 还提供了 Chrome 录制插件(链接1),免代理配置,可以一键生成 JMeter 和 PTS 压测脚本。提升了脚本编写的效率,也能保证不遗漏 API。 为了避免复杂脚本中遗漏 API 的风险,推荐使用录制功能生成脚本。3. 确认压力模型这一步是在配置压测中模拟的压力峰值、不同 API 的压力分布比例以及压力值递增模型。压力值指的是模拟并发用户数,或每秒发送的请求数。 施压模式 在设置之前,需要确认施压模式,业内主要有 2 种施压模式: 虚拟用户(VU)模式,可以理解为一个线程模拟一个真实用户,压测时线程一直循环执行,模拟用户不停地发送请求。 吞吐量模式,即每秒请求数(QPS),可以直接衡量服务端的吞吐量。在项目验收阶段,很重要的一个指标就是系统的吞吐量,即可支持的QPS。对于这种压测场景,更推荐使用吞吐量模式,可以直观的看到施压机每秒发出的请求数,并和服务端的吞吐量直接对应起来。 各 API 压力分布比例 确认了施压模式后,需要配置不同 API 的压力分布比例。每个 API 的准确压力分布比例,也是一次成功压测中不可获取的因素。 压力值递增模型 常见有脉冲模型,阶梯递增,均匀递增。脉冲模型会模拟流量在瞬间突然增大,常用于秒杀、抢购的业务场景。递增模型可以模拟在一定时间段内,用户量不断增大,常用于模拟有预热的业务场景。除了常规的递增模型,最好在压测中可以实现手动调速功能,一是可以模拟一些非常规的流量递增情况,二是可以反复调整压力值,来复现和排查问题。 施压流量地域分布 确定了压力值和递增模型后,还需要确定施压流量的地域分布,应尽量拟合真实的用户分布,才能保证测试结果真实可信。对于区域性的在线业务,施压机分布在当地的同一机房,是可以理解的。如果是全国性的在线业务,施压机也应该按照用户分布,在全国各地域部署。4. 执行压测,观察压测指标压测中核心指标分为:请求成功率,请求响应时间(RT),系统吞吐量(QPS) 请求成功率不止要看全局的请求成功率,还要关注一些核心 API 的成功率,避免整体成功率达标,核心 API 成功率不足的情况。 请求响应时间,需要关注 99、95、90、80...等一些关键分位的指标是否符合预期,而平均响应时间没有太大的参考意义,因为压测需要保证绝大部分用户的体验,在不清楚离散程度的情况下,平均值容易造成误判。 系统吞吐量是衡量系统能承受多大访问量的指标,是压测不可缺少的标准。 上面三个指标遇到拐点时,就可以认为系统已经出现性能瓶颈,可以停止压测或调小压力值,准备分析、定位性能问题了。除了这三个业务指标,同时还应该同时观测系统的应用监控、中间件监控和硬件监控的一些指标,包括但不限于:服务器: 网络吞吐量 CPU使用率 内存使用率 磁盘吞吐量 ...... 数据库: 连接数 SQL 吞吐量 慢 SQL 数 索引命中率 锁等待时间 锁等待次数 ..... 中间件: JVM GC 次数 JVM GC 耗时 堆内、堆外内存使用量 Tomcat 线程池活跃线程数 ...... 更多压测时需要关注的指标,见文末文档 [ 2]如果系统已经达到预期,往往还可以可以按照 10-20%的比例,不断加大压力值,为系统做一次峰值“摸高”,观察系统的极限值是多少,做到心里有底。5. 复盘,性能优化压测结束,如果未达到预期,可以配合监控排定位,分析性能问题,性能优化完成后,在下一轮压测中继续验证。测试中问题分析和调优的方法这里不展开描述,可以参考文末文档 [ 3]如果系统表现已经符合预期,可以用压测得到的系统吞吐量指标,配置流控、降级、系统或隔离规则,保障系统稳定性。阿里云性能测试 PTS,助您系统无忧性能测试 PTS(Performance Testing Service)是一款阿里云 SaaS 化的性能测试工具,从最早为了精准模拟双十一流量洪峰诞生,到现在已经走过了 10 个年头。每年支持包括双十一在内的全集团范围的几万次压测任务,是阿里内部双十一技术架构的"提前验证者"。技术让利 1:自研 PTS 压测引擎,压力模型准,性能优PTS 完全自研的压测引擎,在并发模型的实现上相较传统线程模型性能更优。并且支持 API 维度的吞吐量配置,比开源工具更精细,可以准确模拟流量漏斗模型。PTS 压测还支持多种客户端的流量录制功能,可以快速构建压测脚本,并支持完全白屏化的操作,让压测脚本构建的门槛大大降低。技术让利 2:全面兼容 JMeter,上线 JMeter 插件PTS 在全面兼容 JMeter 的同时,针对 JMeter 分布式压测做了很多优化:优化点 1:全球分布施压机,即压即用,可支持百万并发,千万 QPS 压测优化点 2:支持吞吐量模式,可以设置全局目标 QPS,更直观衡量服务端性能优化点 3:支持压测中调速,可以灵活调整并发或 QPS,不断逼近性能极限点优化点 4:支持浏览器插件录制,一键导出 JMeter 脚本,无需配置代理,大大降低构建脚本的工作量优化点 5:针对分布式压测,支持自动切分文件,支持全局生效 Timer、Controller 组件,零门槛开启分布式压测优化点 6:发布 JMeter PTS 插件,使用 JMeter GUI 客户端即可发起云端分布式压测,无缝衔接脚本调试和执行阶段 [ 4]技术让利 3:VPC 内网压测在全面正式压测前,重点微服务应用需要在日常态做单应用的压测,摸清楚局部的性能极限。对于部署在阿里云上的服务,单个微服务应用不会暴露公网入口,这时就需要压测工具有打通 VPC 内网的能力。PTS 支持 VPC 内网压测,可以在压测时快速打通施压机与用户 VPC 网络,保证内网压测的网络畅通。在压测结束后,也会即时关闭网路通道,保证网络安全。用户只需要在压测配置中,选择微服务应用所在的 VPC 内网、安全组、交换机,即可开启 VPC 内网压测。让您的服务无需暴露公网入口,也可以探测出性能指标。操作示例如下:技术让利 4:流量地域定制大部分业务的用户并不是按地域均分的,相反,往往很不均匀。要模拟真实流量分布,施压机需要在各地分散部署,并且支持按地域、按量分配,在压测时,还要支持实时的统一调度。如果施压机都分布在一个 Region,甚至是一个可用区内,那是无法模拟出来自全球用户请求的。使用阿里云性能测试服务(PTS)压测时,开启流量地域定制功能,只需简单勾选地域,即可指定施压机的地域分布,目前支持全球 22 个地域定制。技术让利 5:问题诊断工具压测的目的是发现性能问题,在压测报告中,PTS 有异常请求状态码的统计,并提供了请求采样日志,可以直观的看到请求、响应的全部信息,对于响应时间较长的请求,也会直观的展示请求在各个阶段的耗时。对于 Java 应用,PTS 提供了基于 Java Agent 的问题诊断工具,只需在 Java 应用上挂载探针,即可自动获取应用、API、机器维度的秒级监控。对于报错的请求,可以直接定位到调用链上报错的方法堆栈,省去了大量排查问题的时间,是定位问题的“利器”。定位报错方法堆栈示例如下:相关链接[1] Chrome录制插件使用指导:https://help.aliyun.com/document_detail/187749.html[ 2] 压测指标:https://help.aliyun.com/document_detail/29338.html[3] 测试问题分析及调优:https://help.aliyun.com/document_detail/29342.html[4] JMeter插件使用指导:https://help.aliyun.com/document_detail/379921.html[5] PTS产品购买页:https://common-buy.aliyun.com/?commodityCode=ptsbag以上文章来自[掘金]-[阿里云云原生]本程序使用github开源项目RSSHub提取聚合!
2022年10月18日
0 阅读
0 评论
0 点赞
2022-10-17
动态规划(Dynamic Programming)问题-掘金
自下而上是通过 迭代 实现的:自下而上就是先从子问题开始计算,重复计算推算出问题的解。斐波那契数列[1、1、2、3、5、8、13、21、34、……]以如下递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)如果求F(n)的值,在已知F(0)=0, F(1)=1时,通过F(0)和F(1)计算F(2),然后使用计算结果计算F(3)…重复计算可以求解F(n)。// 伪代码如下: F = array of length (n + 1) F[0] = 0 F[1] = 1 for i from 2 to n: F[i] = F[i - 1] + F[i - 2] 2. 自上而下自上而下通过 递归 实现,并且通过 记忆化 提高效率(其实就是递归+记忆化搜索)继续以斐波那契数列的递推公式为例,如果我们想求解F(n),我们需要求解F(n-1)和F(n-2);求解F(n-1)需要F(n-2)和F(n-3) ,求解F(n-2)需要F(n-3) 和F(n-4)…一直递归到已知的F(0)=0和F(1)=1自上而下的缺点也很明显,在计算中存在了大量的重复计算,导致效率不高解决方法也很简单,用空间换时间,也就是记忆化:将函数调用的结果存储在哈希图或数组中,这样当再次进行相同的函数调用时,我们可以返回记忆的结果,避免重复计算。//伪代码如下: memo = hashmap Function F(integer i): if i is 0 or 1: return i if i doesn't exist in memo: memo[i] = F(i - 1) + F(i - 2) return memo[i] 总结可能有人要问:“这两个方法哪个更好呢?”动态规划问题可以用二者任意一种方法实现,每个方法都有各自的优点: 自下而上的运行速度更快 (递归效率低) 自上而下的实现更简单 (使用递归,我们不用在意子问题的逻辑顺序;而自下而上的方法中,我们需要解决子问题的逻辑顺序) 文章开头问题及图片的出处:《力扣 62.不同路径》,dp问题非常经典的一道题目,感兴趣的小伙伴可以尝试一下。祝你今天愉快,你明天的愉快留着我明天再祝。——王小波以上文章来自[掘金]-[SpongeNoob]本程序使用github开源项目RSSHub提取聚合!
2022年10月17日
0 阅读
0 评论
0 点赞
2022-10-17
Linux文件系统与日志分析(包含inode号 关闭防火墙)-掘金
一、inode和block1、inode和block概述 文件数据包括元信息与实际数据。 文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。 block(块) 连续的八个扇区组成一个block 是文件存取的最小单位 inode(索引节点) 中文译名为“索引节点”,也叫 i 节点 用于存储文件元信息 一个文件必须占用一个inode ,至少占用一个block 2、inode和block关系 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。 一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。 文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。 因此,一个文件必须占用一个inode,并且至少占用一个block。 inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名。 所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找自己文件夹中的目录项,之后找到对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。 二、inode 详细介绍1、inode 的内容1)inode 表结构每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data)。元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。每一个inode表记录对应保存了文件的元信息: inode number 节点号 文件类型 文件的读、写、执行权限 文件属主的UID 文件属组的GID 链接数(指向这个文件名路径名称个数) 该文件的大小和不同的时间戳 指向磁盘上文件的数据块指针 有关文件的其他数据 2)Linux系统文件三个主要的时间属性 atime(access time):最近访问 最后一次访问文件的时间 mtime(modify):最近更改 最后一次更改文件内容的时间 ctime(change time):最近改动 最后一次改变文件元信息的时间 注意: 不打开文件的话,atime不变。例如使用echo追加内容,atime不会变,因为文件没有被打开访问。 修改文件内容的话,mtime会变,ctime也会变。 如果只修改文件的权限,ctime变,mtime不变。 3)目录文件的结构目录是个特殊文件,目录文件的内容保存了此目录中文件的列表,以及inode number对应关系。 目录文件的结构非常简单,就是一系列目录项(dirent)的列表。 每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。 一个目录是目录下的文件名和文件inode号之间的映射。 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。 Linux系统内部不使用文件名,而使用inode号码来识别文件。 对于用户,文件名只是Inode号码便于识别的别称。 ps:目录文件本身的大小,是根据所含目录项统计的,不是目录内所有子文件的大小总和。三、inode的号码用户通过文件名打开文件时,系统内部的过程: 用户访问文件时,系统先去查找文件所属目录中的目录项,根据文件名找到对应的inode号码。 通过inode号码,获取inode信息。 根据inode信息,判断用户是否具备访问权限。 如果有访问权限,则利用指针去指向实际数据所在的block,读出数据。 如果没有访问权限,则返回Permission denied。根据inode信息,利用指针去指向实际数据所在的block,读出数据。 查看inode号码的方法: ls -i 命令:查看文件名对应的inode号码 stat 命令:查看文件inode信息中的inode号码 [
[email protected]
data]# ls -i 64 aa 64 bb 64 mail [
[email protected]
data]# stat /data/aa 文件:"/data/aa" 大小:37 块:0 IO 块:4096 目录 设备:811h/2065d Inode:64 硬链接:2 权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root) 最近访问:2022-03-08 08:48:00.762262741 +0800 最近更改:2022-03-08 08:47:58.462261957 +0800 最近改动:2022-03-08 08:47:58.462261957 +0800 创建时间:- 四、inode 与文件存储1、硬盘分区后的结构2 访问文件的简单流程五、inode 的大小 inode也会消耗硬盘空间 每个inode的大小一般是128字节或256字节 格式化文件系统时确定inode的总数 如果磁盘还有空间,但inode号被全部占用,也无法创建新文件。 inode号在同一个文件系统内唯一,在不同的文件系统中可以重复。 使用 "df -i" 命令可以查看每个硬盘分区的inode总数和已经使用的数量 [
[email protected]
~]# df -i 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 /dev/mapper/centos-root 5242880 147510 5095370 3% / devtmpfs 229398 441 228957 1% /dev tmpfs 233378 1 233377 1% /dev/shm tmpfs 233378 655 232723 1% /run tmpfs 233378 16 233362 1% /sys/fs/cgroup /dev/sda1 524288 330 523958 1% /boot /dev/sdb5 1048576 3 1048573 1% /data/bb /dev/mapper/vg01-lvmail 6815744 3 6815741 1% /data/mail /dev/sdb1 5242880 7 5242873 1% /data/aa tmpfs 233378 9 233369 1% /run/user/42 tmpfs 233378 1 233377 1% /run/user/0 六、inode的特殊作用由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象:1)当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件。包含特殊字符的文件,也可以 "rm -rf ./-f1.txt" 或 "rm -- -f.txt" 进行删除。 示例: [
[email protected]
aaa]# ls -i //查看文件的inode号 8922118 -f1.txt 8922126 -f2.txt [
[email protected]
aaa]# find -inum 8922118 -delete //通过inode号删除文件 [
[email protected]
aaa]# find -inum 8922126 -exec rm -rf {} ; //通过inode号删除文件 [
[email protected]
aaa]# ls //查看目录内容,文件已被删除 [
[email protected]
aaa]# 2)在同一个文件系统中移动或重命名文件时,只改变文件名,不影响inode号码。 [
[email protected]
aaa]# ls -i ff.txt 8922129 ff.txt [
[email protected]
aaa]# mv ff.txt ../dir01/kk.txt [
[email protected]
aaa]# ls -i ../dir01/kk.txt 8922129 ../dir01/kk.txt 3)打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名。七、命令和inode号之间的关系cp 命令: 分配一个空闲的inode号,在inode表中生成新条目 在目录中创建一个目录项,将名称与inode编号关联 拷贝数据生成新的文件 rm 命令: 硬链接数递减,从而释放的inode号可以被重用 把数据块放在空闲列表中 删除目录项 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖 mv命令: 如果mv命令的目标和源在同一设备,不影响inode表(除时间戳)或磁盘上的数据位置;系统会删除旧的目录对应关系,新建目录对应关系。 八、硬链接和软链接 ln 源文件 目标文件 //创建硬链接文件 ln -s 源文件或目录 目标文件 //创建软连接文件 注意:创建软链接时,源文件必须使用绝对路径。九、删除文件后空间不释放的处理方法删除文件后,如果磁盘空间没有释放,是因为文件正在被其他人打开。 其他人退出使用该文件后空间会被释放。可以使用 w 命令或 lsof 命令查看是否有人在使用该文件。 [
[email protected]
~]# w 22:23:08 up 1:14, 4 users, load average: 0.17, 0.14, 0.08 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.72.1 21:17 4.00s 0.12s 0.03s vim 1.txt root pts/1 192.168.72.1 21:17 1:05m 4.45s 4.43s top root pts/2 192.168.72.1 22:22 4.00s 0.02s 0.00s w root pts/3 192.168.72.1 22:22 11.00s 0.04s 0.01s top 如果确定有人打开了该文件,可以使用三种方法释放空间: 1.echo " " > f1.txt //将被打开的文件变成空文件,依赖shell环境 2.cat /dev/null > f1.txt //导入空文件 3.lsof | grep f1.txt //查看被删除的文件和对应PID,之后杀死该进程 kill -9 PID 注意:删除文件前,一定要确认清除该文件是否为有效文件。十、日志文件介绍与分析1、日志文件介绍日志的功能: 用于记录系统、程序运行中发生的各种事件 通过阅读日志,有助于诊断和解决系统故障 日志文件的分类: 内核及系统日志:这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置,决定将内核消息及各种系统程序消息记录到什么位置。日志格式基本相似。 用户日志:记录用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。 程序日志:有些应用程序会选择由自己独立管理一份日志文件(而不是交给rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。记录格式不统一。 日志保存位置: 默认位于:/var/log 目录下 主要日志文件介绍:2、内核及系统日志由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf。 软件包:rsyslog-8.24.0-12.el7.x86_64 (可使用 ”rpm -q“ 命令查看) 主要程序:/sbin/rsyslogd 配置文件:/etc/rsyslog.conf (可使用 ”rpm -qc“ 命令查看) 日志消息的级别: 日志记录的一般格式: 事件产生的时间。 产生事件的服务器的主机名。 产生事件的服务名或程序名。 事件的具体信息。 3、用户日志分析保存了用户登录、退出系统等相关信息: /var/log/lastlog:最近都用户登录事件。二进制文件,使用 lastlog 命令查看。 /var/log/secure:与用户验证有关的安全性事件。 /var/log/wtmp:用户登录、注销,及系统开、关机事件。二进制文件,使用 last 命令查看。 /var/run/utmp:当前登录的每个用户的详细信息。二进制文件,使用w、who、users等命令查看。 分析工具: users、who、w、last、lastb 示例:1)users:查询最近三次登录的用户信息。users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。2)who:查看当前登录的用户、终端、登录时间、IP地址。who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用户名、终端类型、登录日期及远程主机。3)w:查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。4)last: 读取 /var/log/wtmp 文件,显示登录系统的用户信息。last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。5)lastb:读取 /var/log/btmp 文件,显示登入系统失败的用户信息lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。4、程序日志分析由相应的应用程序独立进行管理: Web服务:/var/log/httpd/ access_log、error_log 代理服务:/var/log/squid access.log、cache.log FTP服务:/var/log/xferlog 分析工具: 文本查看、grep过滤检索、Webmin管理套件中查看 awk、sed等文本过滤、格式化编辑工具 Webalizer、Awstats等专用日志分析工具 5、日志管理策略 及时做好备份和归档 延长日志保存期限 控制日志访问权限 日志中可能会包含各类敏感信息,如账户、口令等。 集中管理日志 将服务器的日志文件发到统一的日志文件服务器 便于日志信息的统一收集、整理和分析 杜绝日志信息的意外丢失、恶意篡改或删除 十一、内核及系统日志管理1、系统日志相关服务CentOS 5 之前版本采用的日志管理系统服务 syslogd: system application 记录应用日志 klogd: linux kernel 记录内核日志 事件记录格式: 日期时间 主机 进程[pid]: 事件内容 C/S架构: 通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理 1、sysklogd 系统日志服务介绍CentOS 5 之前版本采用的日志管理系统服务 syslogd: system application 记录应用日志 klogd: linux kernel 记录内核日志 事件记录格式: 日期时间 主机 进程[pid]: 事件内容 C/S架构: 通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理 2、rsyslog 系统日志服务rsyslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计。尽管rsyslog最初是常规的syslogd,但发展成为一种瑞士军刀式的记录工具,能够接受来自各种来源的输入,并将其转换,然后输出到不同的目的地。当应用有限的处理时,RSYSLOG每秒可以将超过一百万的消息传递到本地目的地。即使在远程的目的地和更精细的处理中,性能通常也被认为是惊人的”。官网:www.rsyslog.com/rsyslog 特性: 多线程 UDP, TCP, SSL, TLS, RELP MySQL, PGSQL, Oracle实现日志存储 强大的过滤器,可实现过滤记录日志信息中任意部分 自定义输出格式 [
[email protected]
~]#rpm -qi rsyslog Name : rsyslog Version : 8.24.0 Release : 12.el7 Architecture: x86_64 Install Date: 2021年08月06日 星期五 20时59分53秒 Group : System Environment/Daemons Size : 2001814 License : (GPLv3+ and ASL 2.0) Signature : RSA/SHA256, 2017年08月11日 星期五 03时43分05秒, Key ID 24c6a8a7f4a80eb5 Source RPM : rsyslog-8.24.0-12.el7.src.rpm Build Date : 2017年08月07日 星期一 08时56分12秒 Build Host : c1bm.rdu2.centos.org Relocations : (not relocatable) Packager : CentOS BuildSystem Vendor : CentOS URL : http://www.rsyslog.com/ Summary : Enhanced system logging and kernel message trapping daemon Description : Rsyslog is an enhanced, multi-threaded syslog daemon. It supports MySQL, syslog/TCP, RFC 3195, permitted sender lists, filtering on any message part, and fine grain output format control. It is compatible with stock sysklogd and can be used as a drop-in replacement. Rsyslog is simple to set up, with advanced features suitable for enterprise-class, encryption-protected syslog relay chains. 3、ELKELK:由Elasticsearch、Logstash、Kibana三个软件组成。 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能 Logstash对日志进行收集、分析,过滤,并将其存储供以后使用 Kibana 可以提供的日志分析友好的 Web 界面 2、rsyslog管理1 系统日志术语 facility:设施,从功能或程序上对日志进行归类 #内置分类 auth(验证), authpriv, cron(定时任务), daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog #自定义的分类 local0-local7 Priority 优先级别,从低到高排序 debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic) 参看帮助: man 3 syslog,man logger [
[email protected]
~]# yum -y install man-pages [
[email protected]
~]# man 3 syslog level This determines the importance of the message. The levels are, in order of decreasing impor‐ tance: LOG_EMERG system is unusable LOG_ALERT action must be taken immediately LOG_CRIT critical conditions LOG_ERR error conditions LOG_WARNING warning conditions LOG_NOTICE normal, but significant, condition LOG_INFO informational message LOG_DEBUG debug-level message 服务名称(即什么服务产生的日志):2 rsyslog 相关文件 程序包:rsyslog 主程序:/usr/sbin/rsyslogd CentOS 6:/etc/rc.d/init.d/rsyslog {start|stop|restart|status} CentOS 7,8:/usr/lib/systemd/system/rsyslog.service 配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf 库文件: /lib64/rsyslog/*.so 3 rsyslog 配置文件/etc/rsyslog.conf 配置文件格式(由三部分组成): MODULES:相关模块配置 GLOBAL DIRECTIVES:全局配置 RULES:日志记录相关的规则配置 查看/etc/rsyslog.conf 文件中的RULES模块:RULES配置格式: facility.priority; #分类 优先级 # priority 的表示 # *: 所有级别 none:没有级别,即不记录 PRIORITY:指定级别(含)以上的所有级别 =PRIORITY:仅记录指定级别的日志信息 文件路径:通常在/var/log/,文件路径前的-表示异步写入。 用户:将日志事件通知给指定的用户,* 表示登录的所有用户。 日志服务器:@host,把日志送往至指定的远程UDP日志服务器;@@host,将日志发送到远程TCP日志服务器。 管道: | COMMAND,转发给其它命令处理。 3、rsyslog 应用实例1 将ssh服务的日志单独设置实验步骤:步骤1:修改rsyslog服务的配置文件/etc/rsyslog.conf,设置LOCAL0对应的日志路径。 [
[email protected]
~]# vim /etc/rsyslog.conf ------------------------ local0.* /var/log/sshd.log 步骤2:修改ssh服务的配置文件/etc/ssh/sshd_config,将ssh的日志修改为记录在LOCAL0对应的路径下。(ssh服务的日志默认放在authpriv服务对应的路径下,需先将该行注释掉。) [
[email protected]
~]# vim /etc/ssh/sshd_config ------------------------ #SyslogFacility AUTHPRIV //原路径,注释掉这一行 SyslogFacility LOCAL0 //添加自定义路径 步骤3:重启 rsyslog 服务和 ssh 服务。 [
[email protected]
~]# systemctl restart {rsyslog,sshd} 步骤4:打开第二台机器,远程连接原服务器。故意输错2次密码,稍后查看原服务器的日志。 [
[email protected]
~]# ssh 192.168.72.10
[email protected]
's password: Permission denied, please try again.
[email protected]
's password: Permission denied, please try again.
[email protected]
's password: 步骤5:查看原服务器的日志记录。/var/log/sshd.log 成功记录了第二台机器的行为。 [
[email protected]
~]# tail -3 /var/log/sshd.log Mar 12 01:32:04 localhost sshd[8398]: Connection closed by 192.168.72.129 port 55592 [preauth] Mar 12 01:32:29 localhost sshd[9433]: Failed password for root from 192.168.72.129 port 55594 ssh2 Mar 12 01:32:48 localhost sshd[9433]: Failed password for root from 192.168.72.129 port 55594 ssh2 2 网络日志(远程日志功能)远程日志,即通过网络,将本地的日志远程备份到另一台机器,这样,就算本机系统崩溃,我们可以查看另一台机器备份的日志,来排查故障。实验思路:假设服务器A需要将日志备份到服务器B,那么A是发送方,B是接收方。接收方需要开启TCP功能(或UDP功能)和514接口,发送方需填写想要传输的日志和接收方的地址。实验步骤:步骤1:接收方开启TCP功能和514端口(编辑rsyslog的配置文件 /etc/rsyslog.conf)。关闭防火墙systemctl stop firewalld //关闭防火墙编辑配置文件,开启TCP功能和514端口(去掉这两行原有的#号);重启rsyslog 服务;检查514端口是否开启。 [
[email protected]
~]# systemctl stop firewalld //关闭防火墙 [
[email protected]
~]# vim /etc/rsyslog.conf //编辑配置文件 ------------------------ # Provides TCP syslog reception $ModLoad imtcp //开启TCP功能 $InputTCPServerRun 514 //开启514端口 [
[email protected]
~]# systemctl restart rsyslog //重启日志服务 [
[email protected]
~]# ss -ntap | grep 514 //检查514端口是否开启 LISTEN 0 25 *:514 *:* users:(("rsyslogd",pid=12528,fd=3)) FIN-WAIT-2 0 0 192.168.72.129:514 192.168.72.10:42556 LISTEN 0 25 :::514 :::* users:(("rsyslogd",pid=12528,fd=4)) 步骤2:发送方填写需要传输的日志和接收方的IP地址(编辑配置文件 /etc/rsyslog.conf)。关闭防火墙;编辑配置文件,填写需要传输的日志和接收方地址;重启rsyslog 服务;测试日志打印。(@地址表示使用UDP功能;@@地址表示使用TCP地址) [
[email protected]
log]# systemctl stop firewalld //关闭防火墙 [
[email protected]
log]# vim /etc/rsyslog.conf //编辑配置文件 ------------------------ *.info;mail.none;authpriv.none;cron.none @@192.168.72.129 [
[email protected]
log]# systemctl restart rsyslog //重启日志服务 [
[email protected]
log]# logger "this test 777777" //测试日志打印 [
[email protected]
log]# tail -1 /var/log/messages //查看日志记录 Mar 8 12:14:51 localhost root: this test 777777 步骤3:查看接收方能否成功接收日志记录。接收方服务器成功记录测试日志。 [
[email protected]
~]# grep 7777 /var/log/messages Mar 8 12:12:44 localhost root: this test 777777 Mar 8 12:14:51 localhost root: this test 777777 Mar 8 12:21:20 localhost root: this test 777777 Mar 8 12:23:30 localhost root: this test 777777 十一、日志管理工具 journalctlCentOS 7 以后,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核及系统日志和应用日志)。日志的配置文件: /etc/systemd/journald.conf journalctl命令格式: journalctl [OPTIONS...] [MATCHES...] 示例:1)journalctl,查看所有日志。 默认情况下,只保存本次启动的日志。 [
[email protected]
~]# journalctl | head -- Logs begin at 六 2022-03-12 18:55:23 CST, end at 六 2022-03-12 19:05:17 CST. -- 3月 12 18:55:23 localhost.localdomain systemd-journal[87]: Runtime journal is using 8.0M (max allowed 91.1M, trying to leave 136.7M free of 903.6M available → current limit 91.1M). 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuset 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpu 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuacct 3月 12 18:55:23 localhost.localdomain kernel: Linux version 3.10.0-693.el7.x86_64 (
[email protected]
) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017 3月 12 18:55:23 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet 3月 12 18:55:23 localhost.localdomain kernel: Disabled fast string operations 3月 12 18:55:23 localhost.localdomain kernel: e820: BIOS-provided physical RAM map: 3月 12 18:55:23 localhost.localdomain kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable 2)journalctl -k, 只查看内核日志(不显示应用日志)。 [
[email protected]
~]# journalctl -k |head -- Logs begin at 六 2022-03-12 18:55:23 CST, end at 六 2022-03-12 19:13:14 CST. -- 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuset 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpu 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuacct 3月 12 18:55:23 localhost.localdomain kernel: Linux version 3.10.0-693.el7.x86_64 (
[email protected]
) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017 3月 12 18:55:23 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet 3月 12 18:55:23 localhost.localdomain kernel: Disabled fast string operations 3月 12 18:55:23 localhost.localdomain kernel: e820: BIOS-provided physical RAM map: 3月 12 18:55:23 localhost.localdomain kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable 3月 12 18:55:23 localhost.localdomain kernel: BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved 3)journalctl -b ,查看本次启动的日志。journalctl -b -0,查看本次启动的日志。journalctl -b -1,查看上一次启动的日志。以此类推。 [
[email protected]
~]# journalctl -b -0 |head -5 //查看本次启动的日志 -- Logs begin at 六 2022-03-12 18:55:23 CST, end at 六 2022-03-12 19:20:01 CST. -- 3月 12 18:55:23 localhost.localdomain systemd-journal[87]: Runtime journal is using 8.0M (max allowed 91.1M, trying to leave 136.7M free of 903.6M available → current limit 91.1M). 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuset 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpu 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuacct 4)查看指定时间的日志。 journalctl --since="2022-03-05 18:10:30" journalctl --since "20 min ago" journalctl --since yesterday journalctl --since "2022-03-05" --until "2022-03-10 03:00" journalctl --since 09:00 --until "1 hour ago" 5) journalctl -n ,显示尾部指定行数。默认10行。 journalctl -n //显示尾部的最新10行日志 journalctl -n 20 //显示尾部的最新20行日志 6)journalctl -f,实时滚动显示最新日志(显示最新10行) [
[email protected]
~]# journalctl -f -- Logs begin at 六 2022-03-12 18:55:23 CST. -- 3月 12 19:11:12 localhost.localdomain systemd[1]: Starting Cleanup of Temporary Directories... 3月 12 19:11:12 localhost.localdomain systemd[1]: Started Cleanup of Temporary Directories. 3月 12 19:13:14 localhost.localdomain chronyd[815]: Selected source 111.230.189.174 3月 12 19:20:01 localhost.localdomain systemd[1]: Started Session 6 of user root. 3月 12 19:20:01 localhost.localdomain systemd[1]: Starting Session 6 of user root. 3月 12 19:20:01 localhost.localdomain CROND[20970]: (root) CMD (/usr/lib64/sa/sa1 1 1) 3月 12 19:30:01 localhost.localdomain systemd[1]: Started Session 7 of user root. 3月 12 19:30:01 localhost.localdomain systemd[1]: Starting Session 7 of user root. 3月 12 19:30:01 localhost.localdomain CROND[33816]: (root) CMD (/usr/lib64/sa/sa1 1 1) 3月 12 19:32:32 localhost.localdomain chronyd[815]: Source 84.16.67.12 replaced with 139.199.214.202 7) 查看指定服务的日志 journalctl /usr/lib/systemd/systemd 8)查看指定进程的日志 journalctl _PID=1 //查看某个路径的脚本的日志 journalctl /usr/bin/bash 9)查看指定用户的日志 journalctl _UID=33 --since today 10)查看某个 Unit 的日志;实时滚动显示某个 Unit 的最新日志 journalctl -u nginx.service journalctl -u nginx.service --since today journalctl -u nginx.service -f //实时滚动显示某个 Unit 的最新日志 11)合并显示多个 Unit 的日志 journalctl -u nginx.service -u php-fpm.service --since today 12)查看指定优先级的日志,表示仅显示小于或等于此等级的日志 (也就是重要程度等于或高于此等级的日志)。 共有8级 0: emerg 1: alert 2: crit 3: err 4: warning 5: notice 6: info 7: debug journalctl -p 3 -b //显示重要程度等于和高于err的日志 13)其他选项 #日志默认分页输出,--no-pager 改为正常的标准输出 journalctl --no-pager #以 JSON 格式(单行)输出 journalctl -b -u nginx.service -o json #以 JSON 格式(多行)输出,可读性更好 journalctl -b -u nginx.serviceqq -o json-pretty #显示日志占据的硬盘空间 journalctl --disk-usage #指定日志文件占据的最大空间 journalctl --vacuum-size=1G #指定日志文件保存多久 journalctl --vacuum-time=1years 以上文章来自[掘金]-[清香西北风]本程序使用github开源项目RSSHub提取聚合!
2022年10月17日
0 阅读
0 评论
0 点赞
2022-10-17
Linux网络服务之DHCP-掘金
一、关于DHCP服务1、DHCP是什么DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),由Internet工作任务小组设计开发,专门用于为TCP/IP网络中计算机自动分配TCP/IP参数的协议。DHCP是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。 默认情况下,DHCP作为Windows Server的一个服务组件不会被系统自动安装,还需要管理员手动安装并进行必要的配置。DHCP采用C/S架构,C-client(客户机),S-server(服务器),客户机/服务器架构DHCP服务采用传输层UDP协议,客户机使用UDP协议的68端口,服务器使用UDP的67端口。2、DHCP好处 减少管理员的工作量 避免输入错误的可能 避免IP地址冲突 当更改lP地址段时,不需要重新配置每个用户的IP地址 提高了IP地址的利用率 方便客户端的配置 3、DHCP的分配方式 自动分配:分配到一个IP地址后永久使用 手动分配:由DHCP服务器管理员专门指定IP地址 动态分配:使用完后释放该IP,供其它客户机使用 注:一般在公司中,邮件服务器、打印机、扫描仪需要固定IP地址。二、DHCP的租约过程 客户机从DHCP服务器获得IP地址的过程称为DHCP的租约过程,分为4个步骤:1、客户机请求IP地址(DHCP Discover) 当一个DHCP客户机启动时,客户机还没有IP地址,客户机要通过DHCP获取一个合法的地址。 此时DHCP客户机以广播方式发送DHCP Discover报文发现信息来寻找DHCP服务器。 2、服务器响应(DHCP Offer) DHCP服务器接收到来自客户机请求lP地址的信息时,在自己的IP地址池中查找是否有合法的IP地址提供给客户机。 如果有,DHCP服务器将此IP地址做上标记,加入到DHCP Offer的消息中,然后广播一则DHCP Offer消息(包含IP地址、子网掩码、DNS、租期等)。 3、客户机选择IP地址(DHCP Request) DHCP客户机从接收到的第一个DHCP Offer消息中提取IP地址, 之后广播发送DHCP Request消息,通告给局域网中所有的DHCP服务器,它选择了哪个DHCP服务器的哪个IP以及租约期限。 让未被选中的DHCP服务器,把未使用的地址收回。同时发出IP地址的DHCP服务器将该地址保留,该地址就不能再分配给另一个DHCP客户机。 4、服务器确定租约(DHCP Ack) DHCP服务器接收到DHCP Request消息后,以DHCP ACK消息的形式向客户机广播成功确认,该消息包含有IP地址的有效租约和其他可配置的信息。 当客户机收到DHCP ACK消息时,配置IP地址,完成TCP/IP的初始化。 备注:重新登录: DHCP客户机每次重新登录网络时,不需要再发送DHCP Discover信息,而是直接发送包含前一次所分配的IP地址的DHCP Request请求信息。 更新租约: 当DHCP服务器向客户机出租的IP地址租期达到50%时,就需要更新租约; 客户机直接向提供租约的服务器发送DHCP Request包,要求更新现有的地址租约。 当租约到期前,DHCP服务器还没有收到客户机的请求,就会释放该IP地址。 三、使用 DHCP动态配置主机地址1、DHCP服务优点 为大量客户机自动分配地址,提供集中管理 减轻管理和维护成本、提高网络配置效率 2、可分配的地址信息主要包括 网卡的IP地址、子网掩码 对应的网络地址、广播地址 默认网关地址 DNS服务器地址 3、DHCP共有八种报文四、DHCP配置文件DHCP服务的配置文件为/etc/dhcp/dhcpd.conf。配置文件参数含义: # 设置全局配置参数 option domain-name "example.org"; //指定默认域名 option domain-name-servers 202.106.0.20,202.106.148.1; //指定DNS服务器地址 default-lease-time 600; //默认租约600秒(10分钟) max-lease-time 7200; //最大租约为7200秒(2小时) ddns-update-style none; //禁用DNS动态更新 # subnet网段声明(作用于整个子网段,部分配置参数优先级高于全局配置参数) subnet 192.168.100.0 netmask 255.255.255.0 { //声明要分配的网段地址 range 192.168.100.128 192.168.100.200; //设置地址池 option routers 192.168.100.10; //指定默认网关地址 # host主机声明(给单机分配固定的IP地址) host hgstname{ //指定需要分配固定IP地址的客户机名称 hardware ethernet 00:c0:c3:22:46:81; //指定该主机的MAC地址 fixed-address 192.168.4.100; //指定保留给该主机的IP地址 五、实验:设置DHCP服务器并分配地址实验要求:将Linux虚拟机设置成DHCP服务器,自动分配IP地址给Windows10 虚拟机。实验思路: Linux虚拟机关闭防火墙和selinux。 安装 dhcp 软件包,并查看配置文件。 将Linux虚拟机的网络模式改成仅主机模式。修改网卡配置文件,之后重启网络服务。 编辑dhcp服务的配置文件/etc/dhcp/dhcpd.conf,设置网段、地址池、网关地址。之后重启dhcp服务。 验证Windows10虚拟机虚拟机能否获取DHCP服务器分配的IP地址。 实验步骤:步骤1、Linux虚拟机关闭防火墙和selinux。 [
[email protected]
~]# systemctl stop firewalld.service [
[email protected]
~]# setenforce 0 步骤2、安装 dhcp 软件包,并查看配置文件 [
[email protected]
~]# yum install dhcp -y //安装dhcp [
[email protected]
~]# rpm -qc dhcp /etc/dhcp/dhcpd.conf //dhcp的配置文件 /etc/dhcp/dhcpd6.conf /etc/openldap/schema/dhcp.schema /etc/sysconfig/dhcpd /var/lib/dhcpd/dhcpd.leases /var/lib/dhcpd/dhcpd6.leases [
[email protected]
~]# cat /etc/dhcp/dhcpd.conf //查看配置文件,为空文件 # # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.example //系统提示可以参考该文件的设置 # see dhcpd.conf(5) man page # 步骤3、将Linux虚拟机的网络模式改成仅主机模式。步骤4、修改网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens33,之后重启网络服务。 [
[email protected]
~]# vim /sysconfig/net-scripts/ifcfg-ens33 //修改网卡配置文件 [
[email protected]
~]# systemctl restart network //重启网络服务 [
[email protected]
~]# ifconfig ens33 ens33: flags=4163 mtu 1500 inet 192.168.137.100 netmask 255.255.255.0 broadcast 192.168.137.255 inet6 fe80::a5da:ff58:2c32:2b5f prefixlen 64 scopeid 0x20 ether 00:0c:29:18:b5:ff txqueuelen 1000 (Ethernet) RX packets 471514 bytes 311413414 (296.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 228702 bytes 61948898 (59.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 这里的IP地址需要和网卡vim1在同一网段,否则无效步骤5、编辑dhcp服务的配置文件/etc/dhcp/dhcpd.conf,设置网段(要和虚拟网络编辑器中的保持一致)、地址池、网关地址。之后重启dhcp服务。 # 将模板文件复制为配置文件 [
[email protected]
~]# cd /usr/share/doc/dhcp-4.2.5/ [
[email protected]
dhcp-4.2.5]# ls dhcpd6.conf.example dhcpd.conf.example ldap [
[email protected]
dhcp-4.2.5]# cp dhcpd.conf.example /etc/dhcp/dhcpd.conf cp:是否覆盖"/etc/dhcp/dhcpd.conf"? yes # 编辑dhcp配置文件 [
[email protected]
~]# vim /etc/dhcp/dhcpd.conf ------------------------------------ 27 subnet 192.168.137.0 netmask 255.255.255.0 { //设置子网IP、子网掩码 28 range 192.168.137.20 192.168.137.80; //设置地址池 29 option routers 192.168.137.10; //设置网关地址 30 } # 重启dhcp服务 [
[email protected]
~]# systemctl restart dhcpd //重启dhcp服务 [
[email protected]
~]# systemctl status dhcpd //查看dhcp状态,已启动 ● dhcpd.service - DHCPv4 Server Daemon Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled) Active: active (running) since 三 2022-03-16 22:17:19 CST; 5s ago Docs: man:dhcpd(8) man:dhcpd.conf(5) Main PID: 87982 (dhcpd) Status: "Dispatching packets..." CGroup: /system.slice/dhcpd.service └─87982 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group ... 步骤6、验证Windows10虚拟机虚拟机能否获取DHCP服务器分配的IP地址。Windows10虚拟机,将网络类型修改成“仅主机模式”。释放IP地址,之后重新获取IP地址。 windows命令: ipconfig #查看网卡信息 ipconfig /release #释放地址 ipconfig /renew #重新获取地址 ipconfig /all #可以看到详情信息 六、DHCP中继原理当企业的内部网络规模较大时,通常被划分为多个不同的子网,网络内配置了VLAN,网络内配置了VLAN,VLAN能隔离广播,而DHCP协议使用广播。DHCP服务器在VLAN 100中,就只有VLAN 100内的客户机能从此内获得IP地址。两种解决办法: 为每个网段安装一台DHCP服务器,但这种方式存在资源上的浪费,而且不利于集中管理。 在连接不同网段的设备上开启DHCP中继功能,将DHCP这种特殊的广播信息在VLAN之间转发,让其他VLAN的客户机也能从DHCP服务器获得IP地址。 以上文章来自[掘金]-[清香西北风]本程序使用github开源项目RSSHub提取聚合!
2022年10月17日
2 阅读
0 评论
0 点赞
1
2
...
134