[{"data":1,"prerenderedAt":332},["ShallowReactive",2],{"site-data":3,"article-44":143,"article-show-hot-44":166,"article-show-new-44":256},{"settings":4,"categorys":35,"tree":97,"models":118,"search_model_select":128,"nav_list":130},{"changefreq":5,"changyan_app_id":6,"changyan_app_key":6,"copy":7,"description":8,"editor":9,"file":6,"guest_feedback":10,"head_html":6,"icp":11,"index_banner":12,"index_banner_bg":13,"is_excel":14,"is_watermark":10,"keywords":15,"links":16,"logo":17,"lzcms_banner":6,"lzcms_banner_link":18,"member_register_enabled":14,"qq_app_id":6,"qq_app_key":6,"qr_code":6,"search_model":19,"site_closedreason":6,"site_idea":6,"site_idea1":20,"site_idea2":21,"site_idea3":22,"site_name":23,"site_statistice":6,"site_status":14,"site_url":18,"sitemap_model":19,"stationmaster_motto":24,"stationmaster_name":25,"stationmaster_occupation":26,"stationmaster_qq":27,"stationmaster_qqnet":28,"stationmaster_qqnet_code":29,"threshold":14,"title_add":30,"watermark":6,"watermark_alpha":31,"watermark_height":32,"watermark_locate":33,"watermark_width":34},"weekly","","版权所有 © \u003Ca class=\"site_url\" href=\"https://zhl123.com\">2026 zhl123.com\u003C/a>","linux、Python、mysql、docker、k8s技术交流","layedit","0","粤ICP备15054664号-1","/uploads/images/20181109/7a86191de8b8bb60e9c6b54d8b27c5cc.jpg","#xe604","1","linux、Python、mysql、docker、k8s","{\"1\":{\"id\":\"1\",\"link_url\":\"https://linux.org\",\"logo\":\"\",\"name\":\"linux\",\"sort\":\"0\",\"status\":\"1\"}}","/uploads/images/20181109/e7305012448aed257176dd591846f50a.png","https://zhl123.com","2","学无止境\n学习，探索，研究，从不了解到了解，从无知到掌握，到灵活运用，在不断的学习中加深认识。由浅入深，由表及里。","业精于勤\n“业精于勤荒于嬉”，精深的业技靠的是勤学、刻苦努力，靠的是争分夺秒的勤学苦练才会有精深的技术。得在认真，失在随便。","工匠精神\n精益求精，注重细节，追求完美和极致，不惜花费时间精力，孜孜不倦，反复改进产品，把99%提高到99.99%。","linux","业精于勤、学无止境、工匠精神","廖地金","高级Linux运维工程师","1256636645","592958303","\u003Ca target=\"_blank\" href=\"//shang.qq.com/wpa/qunwpa?idkey=09be7d1a682073783fd636102e666393169b8a8aac8f3393da1de57bcaa821a0\">\u003Cimg border=\"0\" src=\"//pub.idqqimg.com/wpa/images/group.png\" alt=\"Linux技术\" title=\"Linux技术\">\u003C/a>"," | Python | mysql | docker | k8s 技术交流","100","300","9","500",{"0":36,"17":51,"18":60,"19":63,"20":67,"21":71,"22":76,"25":80,"26":83,"27":89,"29":94},{"children":37},{"0":38,"25":43,"26":48},[39,40,41,42],25,21,22,26,[44,45,46,47],17,18,19,20,[49,50],27,29,{"create_time":6,"description":6,"id":44,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":23,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":53,"subtitle":6,"update_time":6,"url":59},"index",1,"list","article",2,"文章模型","show","/article/lists?category_id=17",{"create_time":6,"description":6,"id":45,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":61,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":56,"subtitle":6,"update_time":6,"url":62},"python","/article/lists?category_id=18",{"create_time":6,"description":6,"id":46,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":64,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":65,"subtitle":6,"update_time":6,"url":66},"容器技术",3,"/article/lists?category_id=19",{"create_time":6,"description":6,"id":47,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":68,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":69,"subtitle":6,"update_time":6,"url":70},"负载均衡",4,"/article/lists?category_id=20",{"create_time":6,"description":6,"id":40,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":72,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":74,"subtitle":6,"update_time":6,"url":75},"分享无价",0,5,"/article/lists?category_id=21",{"create_time":6,"description":6,"id":41,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":77,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":78,"subtitle":6,"update_time":6,"url":79},"随笔",6,"/article/lists?category_id=22",{"create_time":6,"description":6,"id":39,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":81,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":73,"subtitle":6,"update_time":6,"url":82},"学无止境","/article/lists?category_id=25",{"create_time":6,"description":6,"id":42,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":84,"model_id":65,"model_name":85,"name":86,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":87,"subtitle":6,"update_time":6,"url":88},"picture","图集模型","关于",8,"/picture/lists?category_id=26",{"create_time":6,"description":6,"id":49,"image_url":6,"index_template":52,"is_cover":53,"is_menu":73,"keywords":6,"list_template":54,"model_code":90,"model_id":53,"model_name":91,"name":92,"parent_id":42,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":47,"subtitle":6,"update_time":6,"url":93},"page","单页模型","关于博主","/page/27",{"create_time":6,"description":6,"id":50,"image_url":6,"index_template":52,"is_cover":73,"is_menu":73,"keywords":6,"list_template":54,"model_id":73,"name":95,"parent_id":42,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":47,"subtitle":6,"update_time":6,"url":96},"留言","/feedback",[98,108,110,112],{"children":99,"create_time":6,"description":6,"id":39,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":81,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":73,"subtitle":6,"update_time":6,"url":82},[100,102,104,106],{"children":101,"create_time":6,"description":6,"id":44,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":23,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":53,"subtitle":6,"update_time":6,"url":59},[],{"children":103,"create_time":6,"description":6,"id":45,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":61,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":56,"subtitle":6,"update_time":6,"url":62},[],{"children":105,"create_time":6,"description":6,"id":46,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":64,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":65,"subtitle":6,"update_time":6,"url":66},[],{"children":107,"create_time":6,"description":6,"id":47,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":68,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":69,"subtitle":6,"update_time":6,"url":70},[],{"children":109,"create_time":6,"description":6,"id":40,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":72,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":74,"subtitle":6,"update_time":6,"url":75},[],{"children":111,"create_time":6,"description":6,"id":41,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":77,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":78,"subtitle":6,"update_time":6,"url":79},[],{"children":113,"create_time":6,"description":6,"id":42,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":84,"model_id":65,"model_name":85,"name":86,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":87,"subtitle":6,"update_time":6,"url":88},[114,116],{"children":115,"create_time":6,"description":6,"id":49,"image_url":6,"index_template":52,"is_cover":53,"is_menu":73,"keywords":6,"list_template":54,"model_code":90,"model_id":53,"model_name":91,"name":92,"parent_id":42,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":47,"subtitle":6,"update_time":6,"url":93},[],{"children":117,"create_time":6,"description":6,"id":50,"image_url":6,"index_template":52,"is_cover":73,"is_menu":73,"keywords":6,"list_template":54,"model_id":73,"name":95,"parent_id":42,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":47,"subtitle":6,"update_time":6,"url":96},[],{"1":119,"2":120,"3":121,"4":122,"5":125},{"id":53,"index_template":52,"list_template":54,"name":91,"show_template":58,"status":73,"tablename":90},{"id":56,"index_template":52,"list_template":54,"name":57,"show_template":58,"status":73,"tablename":55},{"id":65,"index_template":52,"list_template":54,"name":85,"show_template":58,"status":73,"tablename":84},{"id":69,"index_template":52,"list_template":54,"name":123,"show_template":58,"status":73,"tablename":124},"链接模型","link",{"id":74,"index_template":52,"list_template":54,"name":126,"show_template":58,"status":73,"tablename":127},"下载模型","download",[129],{"id":56,"name":57,"tablename":55},[131,137,139,141],{"children":132,"create_time":6,"description":6,"id":39,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":81,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":73,"subtitle":6,"update_time":6,"url":82},[133,134,135,136],{"create_time":6,"description":6,"id":44,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":23,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":53,"subtitle":6,"update_time":6,"url":59},{"create_time":6,"description":6,"id":45,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":61,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":56,"subtitle":6,"update_time":6,"url":62},{"create_time":6,"description":6,"id":46,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":64,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":65,"subtitle":6,"update_time":6,"url":66},{"create_time":6,"description":6,"id":47,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":68,"parent_id":39,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":69,"subtitle":6,"update_time":6,"url":70},{"children":138,"create_time":6,"description":6,"id":40,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":72,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":74,"subtitle":6,"update_time":6,"url":75},[],{"children":140,"create_time":6,"description":6,"id":41,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":77,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":78,"subtitle":6,"update_time":6,"url":79},[],{"children":142,"create_time":6,"description":6,"id":42,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":84,"model_id":65,"model_name":85,"name":86,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":87,"subtitle":6,"update_time":6,"url":88},[],{"article":144,"breadcrumb":155,"category":158,"next":159,"prev":162,"second_categorys":164,"seo":165},{"id":145,"category_id":40,"title":146,"keywords":147,"description":148,"image_url":6,"content":149,"content_md":150,"url":151,"hits":152,"is_recommend":73,"is_top":73,"create_time":153,"update_time":154},44,"ceph工作原理及安装 ","安装","一、概述\nCeph是一个分布式存储系统，诞生于2004年，最早致力于开发下一代高性能分布式文件系统的项目。随着云计算的发展，ceph乘上了OpenStack的春风，进而成为了开源社区受关注较高的项目之一。\nCeph有以下优势：\n1. CRUSH算法\nCrush算法是ceph的两大创新之一，简单来说，ceph摒弃了传统的集中式存储元数据寻址的方案，转而使用CRUSH算法完成数据的寻址操作。CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离，能够实现各类负载的副本放置规则，例如跨机房、机架感知等。","\u003Cdiv>\u003Ch3>一、概述\u003C/h3>\n\u003Cp>Ceph是一个分布式存储系统，诞生于2004年，最早致力于开发下一代高性能分布式文件系统的项目。随着云计算的发展，ceph乘上了OpenStack的春风，进而成为了开源社区受关注较高的项目之一。\u003Cbr>\nCeph有以下优势：\u003C/p>\n\u003Ch6>1. CRUSH算法\u003C/h6>\n\u003Cp>Crush算法是ceph的两大创新之一，简单来说，ceph摒弃了传统的集中式存储元数据寻址的方案，转而使用CRUSH算法完成数据的寻址操作。CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离，能够实现各类负载的副本放置规则，例如跨机房、机架感知等。Crush算法有相当强大的扩展性，理论上支持数千个存储节点。\u003C/p>\n\u003Ch6>2. 高可用\u003C/h6>\n\u003Cp>Ceph中的数据副本数量可以由管理员自行定义，并可以通过CRUSH算法指定副本的物理存储位置以分隔故障域，支持数据强一致性； ceph可以忍受多种故障场景并自动尝试并行修复。\u003C/p>\n\u003Ch6>3.  高扩展性\u003C/h6>\n\u003Cp>Ceph不同于swift，客户端所有的读写操作都要经过代理节点。一旦集群并发量增大时，代理节点很容易成为单点瓶颈。Ceph本身并没有主控节点，扩展起来比较容易，并且理论上，它的性能会随着磁盘数量的增加而线性增长。\u003C/p>\n\u003Ch6>4. 特性丰富\u003C/h6>\n\u003Cp>Ceph支持三种调用接口：\u003Ccode>对象存储\u003C/code>，\u003Ccode>块存储\u003C/code>，\u003Ccode>文件系统挂载\u003C/code>。三种方式可以一同使用。在国内一些公司的云环境中，通常会采用ceph作为openstack的唯一后端存储来提升数据转发效率。\u003C/p>\n\u003Chr>\n\u003Ch3>二、CEPH的基本结构\u003C/h3>\n\u003Ch6>Ceph的基本组成结构如下图：\u003C/h6>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"865\" data-height=\"612\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-bc9f2628d9203b8f.png\" data-original-width=\"865\" data-original-height=\"612\" data-original-format=\"image/png\" data-original-filesize=\"121721\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-bc9f2628d9203b8f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Cp>Ceph的底层是RADOS，RADOS本身也是分布式存储系统，CEPH所有的存储功能都是基于RADOS实现。RADOS采用C++开发，所提供的原生Librados API包括C和C++两种。Ceph的上层应用调用本机上的librados API，再由后者通过socket与RADOS集群中的其他节点通信并完成各种操作。\u003C/p>\n\u003Cp>RADOS GateWay、RBD其作用是在librados库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。其中，RADOS GW是一个提供与Amazon S3和Swift兼容的RESTful API的gateway，以供相应的对象存储应用开发使用。RBD则提供了一个标准的块设备接口，常用于在虚拟化的场景下为虚拟机创建volume。目前，Red Hat已经将RBD驱动集成在KVM/QEMU中，以提高虚拟机访问性能。这两种方式目前在云计算中应用的比较多。\u003C/p>\n\u003Cp>CEPHFS则提供了POSIX接口，用户可直接通过客户端挂载使用。它是内核态的程序，所以无需调用用户空间的librados库。它通过内核中的net模块来与Rados进行交互。\u003C/p>\n\u003Chr>\n\u003Ch4>三、Ceph的基本组件\u003C/h4>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"641\" data-height=\"565\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-04452ca7376f5bd3.png\" data-original-width=\"641\" data-original-height=\"565\" data-original-format=\"image/png\" data-original-filesize=\"155638\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-04452ca7376f5bd3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/641/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Ch4>如上图所示，Ceph主要有三个基本进程\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Ch6>Osd\u003C/h6>\n\u003Cp>用于集群中所有数据与对象的存储。处理集群数据的复制、恢复、回填、再均衡。并向其他osd守护进程发送心跳，然后向Mon提供一些监控信息。\u003Cbr>\n当Ceph存储集群设定数据有两个副本时（一共存两份），则至少需要两个OSD守护进程即两个OSD节点，集群才能达到active+clean状态。\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Ch6>MDS(可选)\u003C/h6>\n\u003Cp>为Ceph文件系统提供元数据计算、缓存与同步。在ceph中，元数据也是存储在osd节点中的，mds类似于元数据的代理缓存服务器。MDS进程并不是必须的进程，只有需要使用CEPHFS时，才需要配置MDS节点。\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Ch6>Monitor\u003C/h6>\n\u003Cp>监控整个集群的状态，维护集群的cluster MAP二进制表，保证集群数据的一致性。ClusterMAP描述了对象块存储的物理位置，以及一个将设备聚合到物理位置的桶列表。\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch3>四、OSD\u003C/h3>\n\u003Ch6>首先描述一下ceph数据的存储过程，如下图：\u003C/h6>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"859\" data-height=\"428\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-5391d742db74161f.png\" data-original-width=\"859\" data-original-height=\"428\" data-original-format=\"image/png\" data-original-filesize=\"108980\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-5391d742db74161f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/859/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Cp>无论使用哪种存储方式（对象、块、挂载），存储的数据都会被切分成对象（Objects）。Objects size大小可以由管理员调整，通常为2M或4M。每个对象都会有一个唯一的OID，由ino与ono生成，虽然这些名词看上去很复杂，其实相当简单。ino即是文件的File ID，用于在全局唯一标示每一个文件，而ono则是分片的编号。比如：一个文件FileID为A，它被切成了两个对象，一个对象编号0，另一个编号1，那么这两个文件的oid则为A0与A1。Oid的好处是可以唯一标示每个不同的对象，并且存储了对象与文件的从属关系。由于ceph的所有数据都虚拟成了整齐划一的对象，所以在读写时效率都会比较高。\u003C/p>\n\u003Cp>但是对象并不会直接存储进OSD中，因为对象的size很小，在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址，速度都是很缓慢的；并且如果将对象直接通过某种固定映射的哈希算法映射到osd上，当这个osd损坏时，对象无法自动迁移至其他osd上面（因为映射函数不允许）。为了解决这些问题，ceph引入了归置组的概念，即PG。\u003C/p>\n\u003Cp>PG是一个逻辑概念，我们linux系统中可以直接看到对象，但是无法直接看到PG。它在数据寻址时类似于数据库中的索引：每个对象都会固定映射进一个PG中，所以当我们要寻找一个对象时，只需要先找到对象所属的PG，然后遍历这个PG就可以了，无需遍历所有对象。而且在数据迁移时，也是以PG作为基本单位进行迁移，ceph不会直接操作对象。\u003C/p>\n\u003Cp>对象时如何映射进PG的？还记得OID么？首先使用静态hash函数对OID做hash取出特征码，用特征码与PG的数量去模，得到的序号则是PGID。由于这种设计方式，PG的数量多寡直接决定了数据分布的均匀性，所以合理设置的PG数量可以很好的提升CEPH集群的性能并使数据均匀分布。\u003C/p>\n\u003Cp>最后PG会根据管理员设置的副本数量进行复制，然后通过crush算法存储到不同的OSD节点上（其实是把PG中的所有对象存储到节点上），第一个osd节点即为主节点，其余均为从节点。\u003C/p>\n\u003Ch6>下面是一段ceph中的伪代码,简要描述了ceph的数据存储流程\u003C/h6>\n\u003Cpre class=\"hljs bash\">\u003Ccode class=\"bash\">\nlocator = object_name\nobj_hash =  \u003Cspan class=\"hljs-built_in\">hash\u003C/span>(locator)\npg = obj_hash % num_pg\nosds_for_pg = crush(pg)    \u003Cspan class=\"hljs-comment\"># returns a list of osds\u003C/span>\nprimary = osds_for_pg[0]\nreplicas = osds_for_pg[1:]\n\u003C/code>\u003C/pre>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"865\" data-height=\"563\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-e681ba8ea46e9e94.png\" data-original-width=\"865\" data-original-height=\"563\" data-original-format=\"image/png\" data-original-filesize=\"446667\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-e681ba8ea46e9e94.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Cp>上图中更好的诠释了ceph数据流的存储过程，数据无论是从三中接口哪一种写入的，最终都要切分成对象存储到底层的RADOS中。逻辑上通过算法先映射到PG上，最终存储近OSD节点里。图中除了之前介绍过的概念之外多了一个pools的概念。\u003C/p>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"865\" data-height=\"603\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-f4c07108b522495d.png\" data-original-width=\"865\" data-original-height=\"603\" data-original-format=\"image/png\" data-original-filesize=\"345474\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-f4c07108b522495d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Cp>Pool是管理员自定义的命名空间，像其他的命名空间一样，用来隔离对象与PG。我们在调用API存储即使用对象存储时，需要指定对象要存储进哪一个POOL中。除了隔离数据，我们也可以分别对不同的POOL设置不同的优化策略，比如副本数、数据清洗次数、数据块及对象大小等。\u003C/p>\n\u003Ch6>OSD是强一致性的分布式存储，它的读写流程如下图\u003C/h6>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"676\" data-height=\"662\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-273bab330dcc5066.png\" data-original-width=\"676\" data-original-height=\"662\" data-original-format=\"image/png\" data-original-filesize=\"53046\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-273bab330dcc5066.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/676/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\u003Cbr>\n\u003Cp>　　Ceph的读写操作采用主从模型，客户端要读写数据时，只能向对象所对应的主osd节点发起请求。主节点在接受到写请求时，会同步的向从OSD中写入数据。当所有的OSD节点都写入完成后，主节点才会向客户端报告写入完成的信息。因此保证了主从节点数据的高度一致性。而读取的时候，客户端也只会向主osd节点发起读请求，并不会有类似于数据库中的读写分离的情况出现，这也是出于强一致性的考虑。由于所有写操作都要交给主osd节点来处理，所以在数据量很大时，性能可能会比较慢，为了克服这个问题以及让ceph能支持事物，每个osd节点都包含了一个journal文件，稍后介绍。\u003C/p>\n\n\u003Cp>数据流向介绍到这里就告一段落了，现在终于回到正题：osd进程。在ceph中，每一个osd进程都可称作是一个osd节点，也就是说，每台存储服务器上可能包含了众多的osd节点，每个osd节点监听不同的端口，类似于在同一台服务器上跑多个mysql或redis。每个osd节点可以设置一个目录作为实际存储区域，也可以是一个分区，一整块硬盘。如下图，当前这台机器上跑了两个osd进程，每个osd监听4个端口，分别用于接收客户请求、传输数据、发送心跳、同步数据等操作。\u003C/p>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"887\" data-height=\"357\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-55a046b73dd2c046.png\" data-original-width=\"887\" data-original-height=\"357\" data-original-format=\"image/png\" data-original-filesize=\"143756\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-55a046b73dd2c046.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/887/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Cp>如上图所示，osd节点默认监听tcp的6800到6803端口，如果同一台服务器上有多个osd节点，则依次往后排序。\u003C/p>\n\u003Cp>在生产环境中的osd最少可能都有上百个，所以每个osd都有一个全局的编号，类似osd0，osd1，osd2........序号根据osd诞生的顺序排列，并且是全局唯一的。存储了相同PG的osd节点除了向mon节点发送心跳外，还会互相发送心跳信息以检测pg数据副本是否正常。\u003C/p>\n\u003Ch6>之前在介绍数据流向时说过，每个osd节点都包含一个journal文件，如下图：\u003C/h6>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"865\" data-height=\"430\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-03bf5d334982893b.png\" data-original-width=\"865\" data-original-height=\"430\" data-original-format=\"image/png\" data-original-filesize=\"588592\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-03bf5d334982893b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\u003Cbr>\n\u003Cp>　　默认大小为5G，也就说每创建一个osd节点，还没使用就要被journal占走5G的空间。这个值是可以调整的，具体大小要依osd的总大小而定。\u003C/p>\n\n\u003Cp>Journal的作用类似于mysql innodb引擎中的事物日志系统。当有突发的大量写入操作时，ceph可以先把一些零散的，随机的IO请求保存到缓存中进行合并，然后再统一向内核发起IO请求。这样做效率会比较高，但是一旦osd节点崩溃，缓存中的数据就会丢失，所以数据在还未写进硬盘中时，都会记录到journal中，当osd崩溃后重新启动时，会自动尝试从journal恢复因崩溃丢失的缓存数据。因此journal的io是非常密集的，而且由于一个数据要io两次，很大程度上也损耗了硬件的io性能，所以通常在生产环境中，使用ssd来单独存储journal文件以提高ceph读写性能。\u003C/p>\n\u003Chr>\n\u003Ch3>五、monitor节点\u003C/h3>\n\u003Cp>Mon节点监控着整个ceph集群的状态信息，监听于tcp的6789端口。每一个ceph集群中至少要有一个Mon节点，官方推荐每个集群至少部署三台。Mon节点中保存了最新的版本集群数据分布图（cluster map）的主副本。客户端在使用时，需要挂载mon节点的6789端口，下载最新的cluster map，通过crush算法获得集群中各osd的IP地址，然后再与osd节点直接建立连接来传输数据。所以对于ceph来说，并不需要有集中式的主节点用于计算与寻址，客户端分摊了这部分工作。而且客户端也可以直接和osd通信，省去了中间代理服务器的额外开销。\u003C/p>\n\u003Cp>Mon节点之间使用Paxos算法来保持各节点cluster map的一致性；各mon节点的功能总体上是一样的，相互间的关系可以被简单理解为主备关系。如果主mon节点损坏，其他mon存活节点超过半数时，集群还可以正常运行。当故障mon节点恢复时，会主动向其他mon节点拉取最新的cluster map。\u003C/p>\n\u003Cp>Mon节点并不会主动轮询各个osd的当前状态，相反，osd只有在一些特殊情况才会上报自己的信息，平常只会简单的发送心跳。特殊情况包括：1、新的OSD被加入集群；2、某个OSD发现自身或其他OSD发生异常。Mon节点在收到这些上报信息时，则会更新cluster map信息并加以扩散。\u003C/p>\n\u003Cp>cluster map信息是以异步且lazy的形式扩散的。monitor并不会在每一次cluster map版本更新后都将新版本广播至全体OSD，而是在有OSD向自己上报信息时，将更新回复给对方。类似的，各个OSD也是在和其他OSD通信时，如果发现对方的osd中持有的cluster map版本较低，则把自己更新的版本发送给对方。\u003C/p>\n\u003Ch6>推荐使用以下的架构\u003C/h6>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"865\" data-height=\"508\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-3899e81a8696756c.png\" data-original-width=\"865\" data-original-height=\"508\" data-original-format=\"image/png\" data-original-filesize=\"101432\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-3899e81a8696756c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Cp>这里的ceph除了管理网段外，设了两个网段，一个用于客户端读写传输数据。另一个用于各OSD节点之间同步数据和发送心跳信息等。这样做的好处是可以分担网卡的IO压力。否则在数据清洗时，客户端的读写速度会变得极为缓慢。\u003C/p>\n\u003Chr>\n\u003Ch3>六、MDS\u003C/h3>\n\u003Cp>Mds是ceph集群中的元数据服务器，而通常它都不是必须的，因为只有在使用cephfs的时候才需要它，而目在云计算中用的更广泛的是另外两种存储方式。\u003C/p>\n\u003Cp>Mds虽然是元数据服务器，但是它不负责存储元数据，元数据也是被切成对象存在各个osd节点中的，如下图：\u003C/p>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"865\" data-height=\"487\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-f2795a94651531b9.png\" data-original-width=\"865\" data-original-height=\"487\" data-original-format=\"image/png\" data-original-filesize=\"407436\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-f2795a94651531b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Cp>在创建CEPHFS时，要至少创建两个POOL，一个用于存放数据，另一个用于存放元数据。Mds只是负责接受用户的元数据查询请求，然后从osd中把数据取出来映射进自己的内存中供客户访问。所以mds其实类似一个代理缓存服务器，替osd分担了用户的访问压力,如下图：\u003C/p>\n\u003Cdiv class=\"image-package\">\n\u003Cdiv class=\"image-container\">\n\u003Cdiv class=\"image-container-fill\">\u003C/div>\n\u003Cdiv class=\"image-view\" data-width=\"865\" data-height=\"506\">\u003Cimg data-original-src=\"//upload-images.jianshu.io/upload_images/1328767-b39c0a9dbb6b9060.png\" data-original-width=\"865\" data-original-height=\"506\" data-original-format=\"image/png\" data-original-filesize=\"45896\" class=\"\" src=\"//upload-images.jianshu.io/upload_images/1328767-b39c0a9dbb6b9060.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp\">\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"image-caption\">\u003C/div>\n\u003C/div>\n\u003Chr>\n\u003Ch3>七、cephfs的简易安装\u003C/h3>\n\u003Cp>在安装ceph之前推荐把所有的ceph节点设置成无需密码ssh互访，配置hosts支持主机名互访，同步好时间，并关闭iptables和selinux。\u003C/p>\n\u003Ch5>１、实验环境说明：\u003C/h5>\n\u003Cp>当前实验环境使用了4台主机node1~node4，node1为管理节点。\u003C/p>\n\u003Ch5>2、部署工具：\u003C/h5>\n\u003Cp>Ceph官方推出了一个用python写的工具 cpeh-deploy，可以很大的简化ceph集群的配置过程，建议大家用用。它的yum仓库地址，下载地址如下：\u003C/p>\n\u003Cpre class=\"hljs cpp\">\u003Ccode class=\"cpp\">\nhttp:\u003Cspan class=\"hljs-comment\">//download.ceph.com/rpm-firefly/el6/noarch/\u003C/span>\n\u003C/code>\u003C/pre>\n\u003Ch5>3、安装步骤\u003C/h5>\n\u003Cul>\n\u003Cli>\n\u003Ch6>在管理主机上安装工具（通常是跳板机）\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>yum install -y ceph-deploy\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>创建工作目录，用于存放生成的配置文件和秘钥等信息\u003C/h6>\n\u003Cpre class=\"hljs bash\">\u003Ccode class=\"bash\">Mkdir /ceph；\u003Cspan class=\"hljs-built_in\">cd\u003C/span> /ceph\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>下载yum源,下载地址如下\u003C/h6>\n\u003Cpre class=\"hljs cpp\">\u003Ccode class=\"cpp\">http:\u003Cspan class=\"hljs-comment\">//download.ceph.com/rpm-firefly/el6/noarch/\u003C/span>\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003C/ul>\n\u003Cp>```\u003C/p>\n\u003Cul>\n\u003Cli>\n\u003Ch6>在node1~4上把上面的网址设置为yum源\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>\nyum install –y ceph\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>到管理主机上的/ceph目录操作,创建一个新集群，并设置node1为mon节点\u003C/h6>\n\u003Cpre class=\"hljs cpp\">\u003Ccode class=\"cpp\">ceph-deploy \u003Cspan class=\"hljs-keyword\">new\u003C/span> node1\n\n执行完毕后，可以看到/ceph目录中生成了三个文件，其中有一个配置文件可以做各种参数优化，据说ceph的优化参数接近\u003Cspan class=\"hljs-number\">1000\u003C/span>项。（注意，在osd进程生成并挂载使用后，想修改配置需要使用命令行工具，修改配置文件是无效的，所以需要提前规划好优化的参数。）\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>在ceph.conf中添加四个最基本的设置\u003C/h6>\n\u003Cpre class=\"hljs ruby\">\u003Ccode class=\"ruby\">\n echo \u003Cspan class=\"hljs-string\">\"osd pool default size = 4\"\u003C/span> \u003Cspan class=\"hljs-meta\">&gt;&gt; \u003C/span>ceph.conf\n echo \u003Cspan class=\"hljs-string\">\"osd_pool_default_min_size = 3\"\u003C/span> \u003Cspan class=\"hljs-meta\">&gt;&gt; \u003C/span>ceph.conf\n echo \u003Cspan class=\"hljs-string\">\"public network = 192.168.120.0/24\"\u003C/span> \u003Cspan class=\"hljs-meta\">&gt;&gt; \u003C/span>ceph.conf\n echo \u003Cspan class=\"hljs-string\">\"cluster network =  10.0.0.0/8\"\u003C/span> \u003Cspan class=\"hljs-meta\">&gt;&gt; \u003C/span>ceph.conf\n\n 设置每个pool默认的副本数是两个（所有文件一共存四份，如果不设置此项则默认为三份副本）；设置最小副本数为\u003Cspan class=\"hljs-number\">3\u003C/span>，也就是说，\u003Cspan class=\"hljs-number\">4\u003C/span>份副本的环境下有一个副本损坏了，其他osd可以照常相应用户的读写请求；设置公共网络地址段，即用于相应客户读写的网段；设置集群工作网段，用于集群同步数据、发送心跳等使用的网段。\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003C/ul>\n\u003Cul>\n\u003Cli>\n\u003Ch6>激活监控节点\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>\n ceph-deploy mon create-initial\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>接下来创建osd节点，本例中使用整个分区作为osd节点的物理存储区域\u003C/h6>\n\u003Cpre class=\"hljs javascript\">\u003Ccode class=\"javascript\">\nceph-deploy osd prepare node2:\u003Cspan class=\"hljs-regexp\">/dev/\u003C/span>sdb1 node3:\u003Cspan class=\"hljs-regexp\">/dev/\u003C/span>sdb1 node4:\u003Cspan class=\"hljs-regexp\">/dev/\u003C/span>sdb1\nceph-deploy osd prepare node2:\u003Cspan class=\"hljs-regexp\">/dev/\u003C/span>sdb1 node3:\u003Cspan class=\"hljs-regexp\">/dev/\u003C/span>sdb1 node4:\u003Cspan class=\"hljs-regexp\">/dev/\u003C/span>sdb1\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>将管理节点上的配置文件同步到其他节点上\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>\nceph-deploy --overwrite-conf admin node{1..4}\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>建立元数据服务器\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>\nceph-deploy mds create node1\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>创建两个池，最后的数字是PG的数量\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>ceph osd pool create test1 256\nceph osd pool create test2 256\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003C/ul>\n\u003Cul>\n\u003Cli>\n\u003Ch6>创建cephfs文件系统，注意一个ceph只能创建一个cephfs\u003C/h6>\n\u003Cpre class=\"hljs cpp\">\u003Ccode class=\"cpp\">\nceph fs \u003Cspan class=\"hljs-keyword\">new\u003C/span> cephfs test2 test1\n\n默认第一个池会存储元数据\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003C/ul>\n\u003Ch6>到此一个简单的cephfs集群就诞生了，可以使用\u003Ccode>ceph –s\u003C/code>查看，如果是\u003Ccode>HEALTH_OK\u003C/code>状态说明配置成功\u003C/h6>\n\u003Chr>\n\u003Ch3>八、cephfs的删除\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Ch6>remove所有节点上的ceph\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>\nceph-deploy purge node{1..4}\n\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Ch6>清除所有数据\u003C/h6>\n\u003C/li>\n\u003C/ul>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>\nceph-deploy purgedata node{1..4}\n\n\u003C/code>\u003C/pre>\n\u003Cul>\n\u003Cli>\n\u003Ch6>清除所有秘钥文件\u003C/h6>\n\u003Cpre class=\"hljs undefined\">\u003Ccode>\nceph-deploy forgetkeys\n\u003C/code>\u003C/pre>\n\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch3>九、结语\u003C/h3>\n\u003Cp>目前来说，ceph在开源社区还是比较热门的，但是更多的是应用于云计算的后端存储。官方推荐使用ceph的对象式存储，速度和效率都比较高，而cephfs官方并不推荐直接在生产中使用。以上介绍的只是ceph的沧海一粟，ceph远比上面介绍的要复杂，而且支持很多特性，比如使用纠删码就行寻址，所以大多数在生产环境中使用ceph的公司都会有专门的团队对ceph进行二次开发，ceph的运维难度也比较大。但是经过合理的优化之后，ceph的性能和稳定性都是值得期待的。\u003C/p>\u003C/div>\u003Cbr>\u003Cbr>转载至https://www.jianshu.com/p/25163032f57f\u003Cbr>\u003Cbr>","### 一、概述\n\nCeph是一个分布式存储系统，诞生于2004年，最早致力于开发下一代高性能分布式文件系统的项目。随着云计算的发展，ceph乘上了OpenStack的春风，进而成为了开源社区受关注较高的项目之一。\n\nCeph有以下优势：\n\n###### 1. CRUSH算法\n\nCrush算法是ceph的两大创新之一，简单来说，ceph摒弃了传统的集中式存储元数据寻址的方案，转而使用CRUSH算法完成数据的寻址操作。CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离，能够实现各类负载的副本放置规则，例如跨机房、机架感知等。Crush算法有相当强大的扩展性，理论上支持数千个存储节点。\n\n###### 2. 高可用\n\nCeph中的数据副本数量可以由管理员自行定义，并可以通过CRUSH算法指定副本的物理存储位置以分隔故障域，支持数据强一致性； ceph可以忍受多种故障场景并自动尝试并行修复。\n\n###### 3.  高扩展性\n\nCeph不同于swift，客户端所有的读写操作都要经过代理节点。一旦集群并发量增大时，代理节点很容易成为单点瓶颈。Ceph本身并没有主控节点，扩展起来比较容易，并且理论上，它的性能会随着磁盘数量的增加而线性增长。\n\n###### 4. 特性丰富\n\nCeph支持三种调用接口：`对象存储`，`块存储`，`文件系统挂载`。三种方式可以一同使用。在国内一些公司的云环境中，通常会采用ceph作为openstack的唯一后端存储来提升数据转发效率。\n\n---\n\n### 二、CEPH的基本结构\n\n###### Ceph的基本组成结构如下图：\n\n![](//upload-images.jianshu.io/upload_images/1328767-bc9f2628d9203b8f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp)\n\nCeph的底层是RADOS，RADOS本身也是分布式存储系统，CEPH所有的存储功能都是基于RADOS实现。RADOS采用C++开发，所提供的原生Librados API包括C和C++两种。Ceph的上层应用调用本机上的librados API，再由后者通过socket与RADOS集群中的其他节点通信并完成各种操作。\n\nRADOS GateWay、RBD其作用是在librados库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。其中，RADOS GW是一个提供与Amazon S3和Swift兼容的RESTful API的gateway，以供相应的对象存储应用开发使用。RBD则提供了一个标准的块设备接口，常用于在虚拟化的场景下为虚拟机创建volume。目前，Red Hat已经将RBD驱动集成在KVM/QEMU中，以提高虚拟机访问性能。这两种方式目前在云计算中应用的比较多。\n\nCEPHFS则提供了POSIX接口，用户可直接通过客户端挂载使用。它是内核态的程序，所以无需调用用户空间的librados库。它通过内核中的net模块来与Rados进行交互。\n\n---\n\n#### 三、Ceph的基本组件\n\n![](//upload-images.jianshu.io/upload_images/1328767-04452ca7376f5bd3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/641/format/webp)\n\n#### 如上图所示，Ceph主要有三个基本进程\n\n- ###### Osd\n\n用于集群中所有数据与对象的存储。处理集群数据的复制、恢复、回填、再均衡。并向其他osd守护进程发送心跳，然后向Mon提供一些监控信息。\n当Ceph存储集群设定数据有两个副本时（一共存两份），则至少需要两个OSD守护进程即两个OSD节点，集群才能达到active+clean状态。\n- ###### MDS(可选)\n\n为Ceph文件系统提供元数据计算、缓存与同步。在ceph中，元数据也是存储在osd节点中的，mds类似于元数据的代理缓存服务器。MDS进程并不是必须的进程，只有需要使用CEPHFS时，才需要配置MDS节点。\n- ###### Monitor\n\n监控整个集群的状态，维护集群的cluster MAP二进制表，保证集群数据的一致性。ClusterMAP描述了对象块存储的物理位置，以及一个将设备聚合到物理位置的桶列表。\n\n---\n\n### 四、OSD\n\n###### 首先描述一下ceph数据的存储过程，如下图：\n\n![](//upload-images.jianshu.io/upload_images/1328767-5391d742db74161f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/859/format/webp)\n\n无论使用哪种存储方式（对象、块、挂载），存储的数据都会被切分成对象（Objects）。Objects size大小可以由管理员调整，通常为2M或4M。每个对象都会有一个唯一的OID，由ino与ono生成，虽然这些名词看上去很复杂，其实相当简单。ino即是文件的File ID，用于在全局唯一标示每一个文件，而ono则是分片的编号。比如：一个文件FileID为A，它被切成了两个对象，一个对象编号0，另一个编号1，那么这两个文件的oid则为A0与A1。Oid的好处是可以唯一标示每个不同的对象，并且存储了对象与文件的从属关系。由于ceph的所有数据都虚拟成了整齐划一的对象，所以在读写时效率都会比较高。\n\n但是对象并不会直接存储进OSD中，因为对象的size很小，在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址，速度都是很缓慢的；并且如果将对象直接通过某种固定映射的哈希算法映射到osd上，当这个osd损坏时，对象无法自动迁移至其他osd上面（因为映射函数不允许）。为了解决这些问题，ceph引入了归置组的概念，即PG。\n\nPG是一个逻辑概念，我们linux系统中可以直接看到对象，但是无法直接看到PG。它在数据寻址时类似于数据库中的索引：每个对象都会固定映射进一个PG中，所以当我们要寻找一个对象时，只需要先找到对象所属的PG，然后遍历这个PG就可以了，无需遍历所有对象。而且在数据迁移时，也是以PG作为基本单位进行迁移，ceph不会直接操作对象。\n\n对象时如何映射进PG的？还记得OID么？首先使用静态hash函数对OID做hash取出特征码，用特征码与PG的数量去模，得到的序号则是PGID。由于这种设计方式，PG的数量多寡直接决定了数据分布的均匀性，所以合理设置的PG数量可以很好的提升CEPH集群的性能并使数据均匀分布。\n\n最后PG会根据管理员设置的副本数量进行复制，然后通过crush算法存储到不同的OSD节点上（其实是把PG中的所有对象存储到节点上），第一个osd节点即为主节点，其余均为从节点。\n\n###### 下面是一段ceph中的伪代码,简要描述了ceph的数据存储流程\n\n```\nlocator = object_name\nobj_hash =  hash(locator)\npg = obj_hash % num_pg\nosds_for_pg = crush(pg)    # returns a list of osds\nprimary = osds_for_pg[0]\nreplicas = osds_for_pg[1:]\n```\n\n![](//upload-images.jianshu.io/upload_images/1328767-e681ba8ea46e9e94.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp)\n\n上图中更好的诠释了ceph数据流的存储过程，数据无论是从三中接口哪一种写入的，最终都要切分成对象存储到底层的RADOS中。逻辑上通过算法先映射到PG上，最终存储近OSD节点里。图中除了之前介绍过的概念之外多了一个pools的概念。\n\n![](//upload-images.jianshu.io/upload_images/1328767-f4c07108b522495d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp)\n\nPool是管理员自定义的命名空间，像其他的命名空间一样，用来隔离对象与PG。我们在调用API存储即使用对象存储时，需要指定对象要存储进哪一个POOL中。除了隔离数据，我们也可以分别对不同的POOL设置不同的优化策略，比如副本数、数据清洗次数、数据块及对象大小等。\n\n###### OSD是强一致性的分布式存储，它的读写流程如下图\n\n![](//upload-images.jianshu.io/upload_images/1328767-273bab330dcc5066.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/676/format/webp)\n\n　　Ceph的读写操作采用主从模型，客户端要读写数据时，只能向对象所对应的主osd节点发起请求。主节点在接受到写请求时，会同步的向从OSD中写入数据。当所有的OSD节点都写入完成后，主节点才会向客户端报告写入完成的信息。因此保证了主从节点数据的高度一致性。而读取的时候，客户端也只会向主osd节点发起读请求，并不会有类似于数据库中的读写分离的情况出现，这也是出于强一致性的考虑。由于所有写操作都要交给主osd节点来处理，所以在数据量很大时，性能可能会比较慢，为了克服这个问题以及让ceph能支持事物，每个osd节点都包含了一个journal文件，稍后介绍。\n\n数据流向介绍到这里就告一段落了，现在终于回到正题：osd进程。在ceph中，每一个osd进程都可称作是一个osd节点，也就是说，每台存储服务器上可能包含了众多的osd节点，每个osd节点监听不同的端口，类似于在同一台服务器上跑多个mysql或redis。每个osd节点可以设置一个目录作为实际存储区域，也可以是一个分区，一整块硬盘。如下图，当前这台机器上跑了两个osd进程，每个osd监听4个端口，分别用于接收客户请求、传输数据、发送心跳、同步数据等操作。\n\n![](//upload-images.jianshu.io/upload_images/1328767-55a046b73dd2c046.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/887/format/webp)\n\n如上图所示，osd节点默认监听tcp的6800到6803端口，如果同一台服务器上有多个osd节点，则依次往后排序。\n\n在生产环境中的osd最少可能都有上百个，所以每个osd都有一个全局的编号，类似osd0，osd1，osd2........序号根据osd诞生的顺序排列，并且是全局唯一的。存储了相同PG的osd节点除了向mon节点发送心跳外，还会互相发送心跳信息以检测pg数据副本是否正常。\n\n###### 之前在介绍数据流向时说过，每个osd节点都包含一个journal文件，如下图：\n\n![](//upload-images.jianshu.io/upload_images/1328767-03bf5d334982893b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp)\n\n　　默认大小为5G，也就说每创建一个osd节点，还没使用就要被journal占走5G的空间。这个值是可以调整的，具体大小要依osd的总大小而定。\n\nJournal的作用类似于mysql innodb引擎中的事物日志系统。当有突发的大量写入操作时，ceph可以先把一些零散的，随机的IO请求保存到缓存中进行合并，然后再统一向内核发起IO请求。这样做效率会比较高，但是一旦osd节点崩溃，缓存中的数据就会丢失，所以数据在还未写进硬盘中时，都会记录到journal中，当osd崩溃后重新启动时，会自动尝试从journal恢复因崩溃丢失的缓存数据。因此journal的io是非常密集的，而且由于一个数据要io两次，很大程度上也损耗了硬件的io性能，所以通常在生产环境中，使用ssd来单独存储journal文件以提高ceph读写性能。\n\n---\n\n### 五、monitor节点\n\nMon节点监控着整个ceph集群的状态信息，监听于tcp的6789端口。每一个ceph集群中至少要有一个Mon节点，官方推荐每个集群至少部署三台。Mon节点中保存了最新的版本集群数据分布图（cluster map）的主副本。客户端在使用时，需要挂载mon节点的6789端口，下载最新的cluster map，通过crush算法获得集群中各osd的IP地址，然后再与osd节点直接建立连接来传输数据。所以对于ceph来说，并不需要有集中式的主节点用于计算与寻址，客户端分摊了这部分工作。而且客户端也可以直接和osd通信，省去了中间代理服务器的额外开销。\n\nMon节点之间使用Paxos算法来保持各节点cluster map的一致性；各mon节点的功能总体上是一样的，相互间的关系可以被简单理解为主备关系。如果主mon节点损坏，其他mon存活节点超过半数时，集群还可以正常运行。当故障mon节点恢复时，会主动向其他mon节点拉取最新的cluster map。\n\nMon节点并不会主动轮询各个osd的当前状态，相反，osd只有在一些特殊情况才会上报自己的信息，平常只会简单的发送心跳。特殊情况包括：1、新的OSD被加入集群；2、某个OSD发现自身或其他OSD发生异常。Mon节点在收到这些上报信息时，则会更新cluster map信息并加以扩散。\n\ncluster map信息是以异步且lazy的形式扩散的。monitor并不会在每一次cluster map版本更新后都将新版本广播至全体OSD，而是在有OSD向自己上报信息时，将更新回复给对方。类似的，各个OSD也是在和其他OSD通信时，如果发现对方的osd中持有的cluster map版本较低，则把自己更新的版本发送给对方。\n\n###### 推荐使用以下的架构\n\n![](//upload-images.jianshu.io/upload_images/1328767-3899e81a8696756c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp)\n\n这里的ceph除了管理网段外，设了两个网段，一个用于客户端读写传输数据。另一个用于各OSD节点之间同步数据和发送心跳信息等。这样做的好处是可以分担网卡的IO压力。否则在数据清洗时，客户端的读写速度会变得极为缓慢。\n\n---\n\n### 六、MDS\n\nMds是ceph集群中的元数据服务器，而通常它都不是必须的，因为只有在使用cephfs的时候才需要它，而目在云计算中用的更广泛的是另外两种存储方式。\n\nMds虽然是元数据服务器，但是它不负责存储元数据，元数据也是被切成对象存在各个osd节点中的，如下图：\n\n![](//upload-images.jianshu.io/upload_images/1328767-f2795a94651531b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp)\n\n在创建CEPHFS时，要至少创建两个POOL，一个用于存放数据，另一个用于存放元数据。Mds只是负责接受用户的元数据查询请求，然后从osd中把数据取出来映射进自己的内存中供客户访问。所以mds其实类似一个代理缓存服务器，替osd分担了用户的访问压力,如下图：\n\n![](//upload-images.jianshu.io/upload_images/1328767-b39c0a9dbb6b9060.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/865/format/webp)\n\n---\n\n### 七、cephfs的简易安装\n\n在安装ceph之前推荐把所有的ceph节点设置成无需密码ssh互访，配置hosts支持主机名互访，同步好时间，并关闭iptables和selinux。\n\n##### １、实验环境说明：\n\n当前实验环境使用了4台主机node1~node4，node1为管理节点。\n\n##### 2、部署工具：\n\nCeph官方推出了一个用python写的工具 cpeh-deploy，可以很大的简化ceph集群的配置过程，建议大家用用。它的yum仓库地址，下载地址如下：\n\n```\nhttp://download.ceph.com/rpm-firefly/el6/noarch/\n```\n\n##### 3、安装步骤\n\n- ###### 在管理主机上安装工具（通常是跳板机）\n\n```\nyum install -y ceph-deploy\n```\n- ###### 创建工作目录，用于存放生成的配置文件和秘钥等信息\n\n```\nMkdir /ceph；cd /ceph\n```\n- ###### 下载yum源,下载地址如下\n\n```\nhttp://download.ceph.com/rpm-firefly/el6/noarch/\n```\n\n```\n\n- ###### 在node1~4上把上面的网址设置为yum源\n\n```\nyum install –y ceph\n```\n- ###### 到管理主机上的/ceph目录操作,创建一个新集群，并设置node1为mon节点\n\n```\nceph-deploy new node1\n\n执行完毕后，可以看到/ceph目录中生成了三个文件，其中有一个配置文件可以做各种参数优化，据说ceph的优化参数接近1000项。（注意，在osd进程生成并挂载使用后，想修改配置需要使用命令行工具，修改配置文件是无效的，所以需要提前规划好优化的参数。）\n```\n- ###### 在ceph.conf中添加四个最基本的设置\n\n```\necho \"osd pool default size = 4\" >> ceph.conf\n echo \"osd_pool_default_min_size = 3\" >> ceph.conf\n echo \"public network = 192.168.120.0/24\" >> ceph.conf\n echo \"cluster network =  10.0.0.0/8\" >> ceph.conf\n\n 设置每个pool默认的副本数是两个（所有文件一共存四份，如果不设置此项则默认为三份副本）；设置最小副本数为3，也就是说，4份副本的环境下有一个副本损坏了，其他osd可以照常相应用户的读写请求；设置公共网络地址段，即用于相应客户读写的网段；设置集群工作网段，用于集群同步数据、发送心跳等使用的网段。\n```\n\n- ###### 激活监控节点\n\n```\nceph-deploy mon create-initial\n```\n- ###### 接下来创建osd节点，本例中使用整个分区作为osd节点的物理存储区域\n\n```\nceph-deploy osd prepare node2:/dev/sdb1 node3:/dev/sdb1 node4:/dev/sdb1\nceph-deploy osd prepare node2:/dev/sdb1 node3:/dev/sdb1 node4:/dev/sdb1\n```\n- ###### 将管理节点上的配置文件同步到其他节点上\n\n```\nceph-deploy --overwrite-conf admin node{1..4}\n```\n- ###### 建立元数据服务器\n\n```\nceph-deploy mds create node1\n```\n- ###### 创建两个池，最后的数字是PG的数量\n\n```\nceph osd pool create test1 256\nceph osd pool create test2 256\n```\n\n- ###### 创建cephfs文件系统，注意一个ceph只能创建一个cephfs\n\n```\nceph fs new cephfs test2 test1\n\n默认第一个池会存储元数据\n```\n\n###### 到此一个简单的cephfs集群就诞生了，可以使用ceph –s查看，如果是HEALTH_OK状态说明配置成功\n\n---\n\n### 八、cephfs的删除\n\n- ###### remove所有节点上的ceph\n\n```\nceph-deploy purge node{1..4}\n```\n- ###### 清除所有数据\n\n```\nceph-deploy purgedata node{1..4}\n```\n\n- ###### 清除所有秘钥文件\n\n```\nceph-deploy forgetkeys\n```\n\n---\n\n### 九、结语\n\n目前来说，ceph在开源社区还是比较热门的，但是更多的是应用于云计算的后端存储。官方推荐使用ceph的对象式存储，速度和效率都比较高，而cephfs官方并不推荐直接在生产中使用。以上介绍的只是ceph的沧海一粟，ceph远比上面介绍的要复杂，而且支持很多特性，比如使用纠删码就行寻址，所以大多数在生产环境中使用ceph的公司都会有专门的团队对ceph进行二次开发，ceph的运维难度也比较大。但是经过合理的优化之后，ceph的性能和稳定性都是值得期待的。\n\n转载至https://www.jianshu.com/p/25163032f57f","/article/44",6635,"2016-07-25 17:10:11","2018-10-18 17:12:08",[156,157],{"id":40,"name":72,"url":75},{"id":145,"name":146,"url":151},{"create_time":6,"description":6,"id":40,"image_url":6,"index_template":52,"is_cover":53,"is_menu":53,"keywords":6,"list_template":54,"model_code":55,"model_id":56,"model_name":57,"name":72,"parent_id":73,"seo_description":6,"seo_keywords":6,"seo_title":6,"show_template":58,"sort":74,"subtitle":6,"update_time":6,"url":75},{"title":160,"url":161},"rabbitmq集群安装","/article/71",{"title":163,"url":75},"返回列表",[],{"description":148,"keywords":147,"title":146},[167,176,185,194,203,212,221,230,239,247],{"id":168,"category_id":44,"title":169,"keywords":170,"description":171,"image_url":6,"url":172,"hits":173,"is_recommend":73,"is_top":73,"create_time":174,"update_time":175},101,"开启 HTTPS 并获得 ssllabs 满分的过程","开启,获得,满分,过程","准备工作确保你要申请证书的域名都解析到了这台服务器上，且能直接通过域名访问。使用官网推荐的CertBot获取证书。在CertBot官网选择一下环境(比如我选Nginx on Ubuntu 17.04)就可以看到入门教程了。安装CertBot12345apt-get updateapt-get install software-properties-commonadd-apt-repository ppa:certbot/certbotapt-get updateapt-get","/article/101",18546,"2019-11-26 16:12:11","2019-11-26 16:23:16",{"id":177,"category_id":44,"title":178,"keywords":179,"description":180,"image_url":6,"url":181,"hits":182,"is_recommend":73,"is_top":73,"create_time":183,"update_time":184},113,"在CentOS 7中添加命令自动补全功能","命令自动补全,centos","在CentOS 7中，默认情况下并不会安装命令补全包，需要手动安装才能使用命令补全功能。以下是在CentOS 7中安装命令补全包的方法：1. bash-completion：这是一个针对Bash shell的命令补全软件包，可以提供对系统命令、用户自定义命令和文件路径的自动补全功能。可以通过以下命令安装：```sudo yum install bash-completion```安装完成后，需要在/etc/profile配置文件中添加以下内容：```if [ -f /etc/bash_compl","/article/113",14948,"2023-05-16 10:54:01","2023-05-16 10:57:28",{"id":186,"category_id":44,"title":187,"keywords":188,"description":189,"image_url":6,"url":190,"hits":191,"is_recommend":53,"is_top":73,"create_time":192,"update_time":193},94,"Centos7 安装 openvas ","openvas,开放式漏洞评估系统，installing openvas centos-7","一、描述OpenVAS，即开放式漏洞评估系统，是一个用于评估目标漏洞的杰出框架。功能十分强大，最重要的是，它是“开源”的——就是免费的意思啦～它与著名的Nessus“本是同根生”，在Nessus商业化之后仍然坚持开源，号称“当前最好用的开源漏洞扫描工具”。最新版的Kali Linux(kali 3.0)不再自带OpenVAS了，所以我们要自己部署OpenVAS漏洞检测系统。其核心部件是一个服务器，包括一套网络漏洞测试程序，可以检测远程系统和应用程序中的安全问题。但是它的最常用用途是检测目标网络或","/article/94",14690,"2019-01-14 17:43:42","2019-01-14 18:16:36",{"id":195,"category_id":44,"title":196,"keywords":197,"description":198,"image_url":6,"url":199,"hits":200,"is_recommend":73,"is_top":73,"create_time":201,"update_time":202},99,"Centos7 利用iptables防止nmap工具防端口扫描","iptables","一、Nmap介绍       Nmap（NetworkMapper）是一款开放源代码的网络探测和安全审核工具。它用于快速扫描一个网络和一台主机开放的端口，还能使用TCP/IP协议栈特征探测远程主机的操作系统类型。nmap支持很多扫描技术，例如：UDP、TCPconnect()、TCPSYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(XmasTree)、SYN扫描和null扫描。Nmap最初是用于Unix系统","/article/99",14415,"2019-07-09 21:27:00","2019-07-09 21:57:53",{"id":204,"category_id":46,"title":205,"keywords":206,"description":207,"image_url":6,"url":208,"hits":209,"is_recommend":73,"is_top":73,"create_time":210,"update_time":211},61,"Docker 推荐的启动方式","推荐,启动,方式","# cat DockerfileFROM openjdk:8-alpineWORKDIR /ADD ./target/*.jar app.jarEXPOSE 9999COPY docker-entrypoint.sh /RUN chmod +x /docker-entrypoint.shENTRYPOINT [“/docker-entrypoint.sh”]CMD [“java”,”-server”,”-Duser.timezone=GMT+08″,”-jar”,”/app.jar”]# cat","/article/61",14347,"2018-10-22 13:55:47","2018-10-22 13:56:10",{"id":213,"category_id":44,"title":214,"keywords":215,"description":216,"image_url":6,"url":217,"hits":218,"is_recommend":73,"is_top":73,"create_time":219,"update_time":220},107,"Acme.sh 给 SSL 证书自动续期失败的解决方法","HTTP/1.1 200 OK,Server: Bayou Tech Web Srv 1.0,Content-Encoding: none,Content-Length: 5,Content-Type","一、Acme.sh 自动续期失败的症状问题描述如下，续期的时候，提示如下错误：root@dc:~# \"/data/acme.sh\"/acme.sh --cron --home \"/data/acme.sh\" &gt; /dev/null[Sun Nov 10 23:52:17 CST 2020] Error, can not get domain token entry example.com[Sun Nov 10 23:52:17 CST 2020] Please check log file","/article/107",12618,"2021-09-03 10:44:18","2021-09-03 10:46:23",{"id":222,"category_id":44,"title":223,"keywords":224,"description":225,"image_url":6,"url":226,"hits":227,"is_recommend":53,"is_top":73,"create_time":228,"update_time":229},93,"ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台","Filebeat,Kafka","一、说明1.Filebeat是一个日志文件托运工具，在你的服务器上安装客户端后，filebeat会监控日志目录或者指定的日志文件，追踪读取这些文件（追踪文件的变化，不停的读）2.Kafka是一种高吞吐量的分布式发布订阅消息系统，它可以处理消费者规模的网站中的所有动作流数据3.Logstash是一根具备实时数据传输能力的管道，负责将数据信息从管道的输入端传输到管道的输出端；与此同时这根管道还可以让你根据自己的需求在中间加上滤网，Logstash提供里很多功能强大的滤网以满足你的各种应用场景4.El","/article/93",12190,"2018-12-24 16:40:08","2018-12-26 11:53:38",{"id":231,"category_id":46,"title":232,"keywords":233,"description":234,"image_url":6,"url":235,"hits":236,"is_recommend":53,"is_top":73,"create_time":237,"update_time":238},81,"kubernetes 1.12.1 高可用安装之部署Dashboard","安装Dashboard","创建Dashboard需要CoreDNS部署成功之后再安装Dashboard。[root@master01 ~]# wget https://zhl123.com/download/k8s/Dashboard.tgz[root@master01 ~]# tar xf Dashboard.tgz[root@master01 ~]# kubectl create -f Dashboard/[root@master01 Dashboard]# kubectl get svc -n kube-syste","/article/81",12037,"2018-10-26 09:54:41","2018-10-26 16:59:19",{"id":240,"category_id":44,"title":241,"keywords":6,"description":242,"image_url":6,"url":243,"hits":244,"is_recommend":73,"is_top":73,"create_time":245,"update_time":246},100,"用 Nginx 给 Cookie 增加 Secure 和 HttpOnly","在 nginx 的 location 中配置12# 只支持 proxy 模式下设置，SameSite 不需要可删除，如果想更安全可以把 SameSite 设置为 Strictproxy_cookie_path / \"/; httponly; secure; SameSite=Lax\";示例1234567891011121314151617181920212223242526server {    listen 443 ssl http2;    server_name www.zhl123.cn","/article/100",11848,"2019-11-26 16:10:57","2019-11-26 16:23:45",{"id":248,"category_id":44,"title":249,"keywords":250,"description":251,"image_url":6,"url":252,"hits":253,"is_recommend":73,"is_top":73,"create_time":254,"update_time":255},41,"Tomcat 安全配置与性能优化","tomcat，性能优化","1. JVM&nbsp;1.1. 使用 Server JRE 替代JDK。&nbsp;服务器上不要安装JDK，请使用 Server JRE. 服务器上根本不需要编译器，代码应该在Release服务器上完成编译打包工作。&nbsp;理由：一旦服务器被控制，可以防止在其服务器上编译其他恶意代码并植入到你的程序中。&nbsp;1.2. JAVA_OPTS&nbsp;export JAVA_OPTS=\"-server -Xms512m -Xmx4096m &nbsp;-XX:PermSize=64M -","/article/41",11623,"2016-09-01 17:06:36","2018-10-18 17:06:58",[257,265,273,281,289,297,305,313,322,331],{"id":258,"category_id":40,"title":259,"keywords":6,"description":260,"image_url":6,"url":261,"hits":262,"is_recommend":73,"is_top":73,"create_time":263,"update_time":264},123,"Agent Skill 精选集：最值得收藏的 Agent Skills Top 10","如果你正在用 Claude Code 或 Codex，一定对&nbsp;Agent Skills&nbsp;不陌生。通过安装&nbsp;Agent Skills，你可以让这些 AI 助手变得更强——不用每次都解释你的需求，它们直接就知道该怎么做。最近有人在 GitHub 上做了一个采样调查，统计了哪些 Skills 的质量最佳和最受欢迎。我整理了这份&nbsp;Top 10 榜单，加上使用场景和适合人群，帮你快速找到最有用的那几个。Top 10 最受欢迎的 Agent Skills1. Skil","/article/123",270,"2026-01-19 18:49:12","2026-01-19 18:52:01",{"id":266,"category_id":44,"title":267,"keywords":6,"description":268,"image_url":6,"url":269,"hits":270,"is_recommend":73,"is_top":73,"create_time":271,"update_time":272},122,"Nginx性能调优18条黄金法则：支撑10万并发的配置模板","一、概述1.1 背景介绍说实话，Nginx调优这事儿我踩过无数坑。记得2019年双11，我们电商平台流量暴涨，Nginx直接扛不住了，QPS从平时的2万飙升到8万，响应时间从50ms飙到了2秒，最后还是靠临时加机器扛过去的。那次事故之后，我花了大半年时间专门研究Nginx的性能极限，总结出了这20条黄金法则。Nginx作为目前最流行的Web服务器和反向代理，官方数据显示单机可以轻松处理10万+的并发连接。但实际生产环境中，很多同学拿到默认配置就直接上了，结果发现连1万并发都扛不住。问题不在Ngi","/article/122",337,"2026-01-12 11:11:50","2026-01-12 11:12:28",{"id":274,"category_id":46,"title":275,"keywords":6,"description":276,"image_url":6,"url":277,"hits":278,"is_recommend":73,"is_top":73,"create_time":279,"update_time":280},121,"Docker 镜像优化与安全扫描：将镜像体积压缩 70%","1. 适用场景 & 前置条件项目要求适用场景容器化应用镜像体积过大（> 500MB），构建时间长（> 10分钟），存在安全漏洞（CVE高危）OSRHEL/CentOS 7.9+ 或 Ubuntu 20.04+内核Linux Kernel 3.10+软件版本Docker 20.10+ 或 Podman 3.0+，Trivy 0.40+（安全扫描工具）资源规格2C4G（最小）/ 4C8G（推荐），磁盘 50GB+（存储镜像与缓存）网络可访问 Docker Hub/阿里云镜像仓库（","/article/121",309,"2026-01-06 11:54:35","2026-01-06 12:01:59",{"id":282,"category_id":44,"title":283,"keywords":6,"description":284,"image_url":6,"url":285,"hits":286,"is_recommend":73,"is_top":73,"create_time":287,"update_time":288},120,"用 Prometheus Recording Rules 把告警噪声砍掉 70%(二)","五、故障排查和监控5.1 故障排查◆ 5.1.1 日志查看# 查看 Prometheus 日志中的规则评估错误journalctl -u prometheus | grep -i&nbsp;\"rule\"&nbsp;|&nbsp;tail&nbsp;-50# 查看规则评估耗时curl -s http://localhost:9090/api/v1/rules | jq&nbsp;'.data.groups[].rules[] | select(.health != \"ok\")'# Kubernet","/article/120",282,"2026-01-06 11:53:50","2026-01-06 11:54:33",{"id":290,"category_id":44,"title":291,"keywords":6,"description":292,"image_url":6,"url":293,"hits":294,"is_recommend":73,"is_top":73,"create_time":295,"update_time":296},119,"用 Prometheus Recording Rules 把告警噪声砍掉 70%(一)","一、概述1.1 背景介绍在大规模微服务架构下，Prometheus 告警系统往往会陷入一个尴尬的境地：告警太多，运维团队开始选择性忽略；告警太少，真正的故障又可能漏掉。我在某电商平台负责监控体系建设时，团队每天要处理超过 2000 条告警，其中 70% 以上是重复的、关联的或者短暂抖动产生的噪声。Recording Rules 是 Prometheus 提供的预计算机制，可以将复杂的查询表达式预先计算并存储为新的时间序列。通过合理设计 Recording Rules，我们不仅能显著降低 Prom","/article/119",301,"2026-01-06 11:51:58","2026-01-06 11:53:45",{"id":298,"category_id":44,"title":299,"keywords":6,"description":300,"image_url":6,"url":301,"hits":302,"is_recommend":73,"is_top":73,"create_time":303,"update_time":304},118,"GitOps 落地实践：ArgoCD + Kustomize 实现声明式基础设施管理(二)","四、最佳实践和注意事项4.1 最佳实践4.1.1 性能优化优化点一：减少 Git 轮询频率# argocd-cm ConfigMapapiVersion:&nbsp;v1kind:&nbsp;ConfigMapmetadata:&nbsp;&nbsp;name:&nbsp;argocd-cm&nbsp;&nbsp;namespace:&nbsp;argocddata:&nbsp;&nbsp;timeout.reconciliation:&nbsp;300s&nbsp;&nbsp;# 默认 180","/article/118",305,"2026-01-06 11:49:00","2026-01-06 11:49:34",{"id":306,"category_id":44,"title":307,"keywords":6,"description":308,"image_url":6,"url":309,"hits":310,"is_recommend":73,"is_top":73,"create_time":311,"update_time":312},117,"GitOps 落地实践：ArgoCD + Kustomize 实现声明式基础设施管理(一)","一、概述1.1 背景介绍GitOps 作为云原生时代的运维范式，将 Git 作为基础设施和应用配置的单一事实来源，通过声明式配置和自动化同步机制，实现了配置管理的版本控制、审计追溯和快速回滚。ArgoCD 作为 CNCF 毕业项目，提供了完整的 GitOps 工作流，支持多集群管理、RBAC 权限控制、SSO 集成等企业级特性。结合 Kustomize 的配置管理能力，能够优雅地解决多环境配置差异、敏感信息管理、配置复用等问题。在传统的 CI/CD 流程中，往往由 CI 工具直接执行 kubec","/article/117",310,"2026-01-06 11:45:03","2026-01-06 11:48:56",{"id":314,"category_id":40,"title":315,"keywords":316,"description":317,"image_url":6,"url":318,"hits":319,"is_recommend":73,"is_top":73,"create_time":320,"update_time":321},116,"运维部门年度2025工作总结与2026工作规划应该如何写？","运维部门年度2025工作总结,2026工作规划","2025年，运维部在公司“数字化转型深化”战略引领下，以“稳定为基、效率为纲、安全为盾、创新为翼”为核心导向，全面支撑核心业务系统运行、推动技术架构迭代、强化团队能力建设。 全年实现核心业务系统可用性99.985%，较2024年提升0.02个百分点；故障平均恢复时间（MTTR）从42分钟压缩至29分钟，下降31%；云资源成本同比降低16.8%，自动化运维覆盖率从65%提升至83%，未发生重大生产安全事故，圆满完成年度目标。现将全年工作及2026年规划汇报如下：2025年核心工作成果（数","/article/116",297,"2026-01-06 11:20:58","2026-01-06 11:44:04",{"id":323,"category_id":40,"title":324,"keywords":325,"description":326,"image_url":6,"url":327,"hits":328,"is_recommend":73,"is_top":73,"create_time":329,"update_time":330},115,"Kubernetes 100个常用命令","100 个 Kubectl 命令","这篇文章是关于使用 Kubectl 进行 Kubernetes 诊断的指南。列出了 100 个 Kubectl 命令，这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于：•&nbsp;集群信息•&nbsp;Pod 诊断•&nbsp;服务诊断•&nbsp;部署诊断•&nbsp;网络诊断•&nbsp;持久卷和持久卷声明诊断•&nbsp;资源使用情况•&nbsp;安全和授权•&nbsp;节点故障排除•&nbsp;其他诊断命令：文章还提到了许多其他命令，如资源扩展和自动扩","/article/115",3642,"2023-11-02 14:09:30","2023-11-02 14:10:05",{"id":177,"category_id":44,"title":178,"keywords":179,"description":180,"image_url":6,"url":181,"hits":182,"is_recommend":73,"is_top":73,"create_time":183,"update_time":184},1784716028642]