SegmentFault 民工哥技术之路最新的文章
2024-01-22T09:59:03+08:00
https://segmentfault.com/feeds/blogs
https://creativecommons.org/licenses/by-nc-nd/4.0/
打磨三年!重镑更新!Linux 运维工程师打怪升级进阶成神之路 4.0 (让体系化学习 Linux 运维不再难)!
https://segmentfault.com/a/1190000044576014
2024-01-22T09:59:03+08:00
2024-01-22T09:59:03+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>大家好,我是民工哥。</p><p><strong>经过近三年的打磨与总结</strong>,今天《 Linux 运维工程师打怪升级进阶成神之路》V4.0 版本发布了。</p><p><img src="/img/remote/1460000044576016" alt="图片" title="图片"></p><p>V 4.0 版本是在前面几个版本的基础上更加精细化了运维岗位所需的技能知识点,<strong>更详细、更全面,几乎囊括了 Linux 系统运维岗所需的所有技能体系</strong>(如:TCP/IP 网络协议栈、Linux 常用命令、企业常用服务与应用软件、常用工具软件、Shell 脚本编程、企业监控平台、集群运维与管理、Nginx 技术栈、MySQL、PostgreSQL、Redis、MongoDB、Elasticsearch、Git、大数据 Hadoop、Kafka、RabbitMQ、Zookeeper、Docker、Kubernetes、OpenStack、DevOps、Java大后端技术等等)。</p><p><img src="/img/remote/1460000044576017" alt="图片" title="图片"></p><ul><li>运维工程师进阶升级之路:<a href="https://link.segmentfault.com/?enc=VlH3AE1UA9WYlSIIfVfQsw%3D%3D.FCtUgtOOiI%2BOozQKZqViwLXIDNkkGvrSpyM02CgSPwgg9LIXjB2SBVgEIPqlwk7z" rel="nofollow">https://github.com/mingongge/BestSRE</a></li></ul><p>时间过的好快,<a href="https://link.segmentfault.com/?enc=BZz4GdIUapl6ZMlqeJMaNw%3D%3D.XOTKnKD%2BDbmGOKotgN5oxN9Inp63g42iEIEzYSgAHYH40LMKIEV7CBpwvGINXWgdD%2BJu%2Blo4npYvpSS%2B683%2BxVXPOiuqMzuO858DhewNIugRde2TmlHjWIcM3hGcqqUbBcp5V7fkHDOsATYCz2eya7sLceufdJ3Xxb%2F0LlQxBiy8eiywmy5M232S39%2FYA%2B5J0LzeN8DDTF5w1wSE7l96i7Gj0iTppzKc0iT0Zk4XNHqiYMaqFXqKyw7nz76N%2FMgIS%2BNRl5sUEtQL5%2FUh79yRt383yRKNVqUkW0M6pCXqVE8%3D" rel="nofollow">运维工程师打怪升级之路 1.0</a> 版本发布至今(第一个版本),已经过去四年多时间了。前一个版本 <a href="https://link.segmentfault.com/?enc=alr0ePDiRxecnLI3%2FUJfGg%3D%3D.b1fYeeM85lJUf5IcB6PSulQHes23cU1Zc6DKD7YS6%2By5AB1rPjzsEGzgIKClaDr8pF2619wXRGlwDJqzJk8m55VF7rmmGf6VXCb6Uqz4YK6Y2vPErH9ZuOfNW0S%2ByP7w2jy%2BQU8Hy4f22XuGEtv2%2FFe%2F4h8uMEDWNi5qK6lnO2a2ggtvp7XMpR8fYvee%2Bbnx" rel="nofollow">3.0 版本</a>发布至今也快三年了。</p><p><img src="/img/remote/1460000044576018" alt="图片" title="图片"></p><p>回头看看,写公众号也有六年多的时间了,做一件事很容易,但坚持做一件事情六年应该不是件容易的事。一路走来,收获了众多读者的肯定与支持,同时在自己的知识体系建立、建全上也取得了不小的成就。在这期间,我写的书:<a href="https://link.segmentfault.com/?enc=ikKmx5h5sByNYGdycyARqA%3D%3D.Md1189Sw5dn7R56Ehe5VMqMdjaegepWv2MDcgVXNnJJuZeBwlRWLXYypS5RSflEO71OGNtmwL3zzMKRJBHGX8%2FmwE2iPa2imjg%2FXnk1r5kv7XngKwNOvwzV%2B78crcMNK1DTUpUYsVG8Mie9F5l3tXw3cV0cRbOIftfA9UHwEGdcA9NZFDzbX%2B10sEOWzb2ty" rel="nofollow">Linux系统运维指南</a> 出版(2020年4月),同年10月,我拿到了2020年人民邮电出版社/异步社区《<a href="https://link.segmentfault.com/?enc=EhuKKxsPMVHP0OPQa37m5g%3D%3D.wngie%2BC3tsbyMeMZRDS6jatvZcAQtGWzLIECoc42hAesuc5Nh5tV0UUyj8lIrQMuofWgwtc%2FAlVo7zIdDlUxGeqqD68O1j5MxJPomXRRIBCWUwCEKwBFKdyNUc2NgI8fS14qVg4ovpKUFjxKE1lKbDYSutpXtRRhxC80KStQVTlhaR81NG9ihVSrqq3fzYPUx5JdQa3ZygHTXTZ5LYEq4VAR6%2F2Ijh%2FHPLA3O91ejrnKqfEXYcaIYEeKRZvUvdM9j1qW7kGUm4frUOr4bxwppygYI%2FwwtsDnBllgwrIBuQsCdMOf2VxHdA9cPsKi4udJrCKgzG3ECVARGzx3DcxpUA%3D%3D" rel="nofollow">最具影响力作者</a>》。除了感谢这个伟大的时代、家人、朋友,还要感谢无数支持我的读者们,谢谢你们。</p><p>其实,很多熟悉我的老读者都知道,我也算是 0 基础起步自学至今的(对于民工哥不是很了解的读者可以看看这篇文章:<a href="https://link.segmentfault.com/?enc=3XXGYIIsBsiP%2BdoGWwyGyw%3D%3D.Sp9AL0MEiPaTz%2B6Cm1Iuw7DCZotAgJYwO%2BTazTb2Xzk2Vbv%2FoZOQy7fTOPfJjnomOzn6KsIxGFBF5F0QxVu%2FmIbCqkjxLssuqVfqGDXxEOeUsrc%2BXC%2FK6R7ajvRTAZr6DDZtSK2eenfs1ji3nfaK%2FNc17lrEPx0FLhLjtAidHVksm%2BPwd9IU8QG7TYWoVlDTBAT4H4G0Dz37nwy853ZsISH%2BcrhwRixD4CCFQeyE2JFbDtdvRQzEbtL%2B0PgCVizWozJ4EEDX%2BcX6jMHYQfeXhy%2BA3pPmhI37GOalWcELYqovsX2%2BkYk3Qa9AlEenpQuKBzrfHAC8qHlTejgg%2Fc1ghg%3D%3D" rel="nofollow">杭漂十年,今撤霸都</a>!),所以,对于自学,我也总结了一些方法,或者说分享一下我的经验:<a href="https://link.segmentfault.com/?enc=Ba1gWgnKqCNDJlL7GpOy1w%3D%3D.qwbofCxrJ8wjDO1yTuBom%2FCDQWvMC05zWOTnO%2BuyTPrcHAJRM8EpdTeP06ttNQzXGBqTAo3asbLRhbZYgMISzK8iYJ5oMoisstiF7Q6WcbLvomMvY%2B6Jx2E1uQNJs%2B0d4iyZyWyC19NgwPVS95wvzFbg2p%2FjJw3WgXnYaJZkAwzCmuqg%2BBYWo7aHk52%2FE8EDF0lkyAH7dudfJJFGlMo1p%2B5AhNyVHX1elCQ3UuU1iLklETeZBPJpUuv0f%2BNOl0aodrlFJ%2Bj1Rp5w1uZDLvt92arNjUHdV1yMss4HfbpwQdw%3D" rel="nofollow">民工哥自学方法</a>。</p><p>回首那段自学的苦逼时光,确实很痛苦,那时互联网没有这么发达,查找资料也没有现在这么方便、丰富,很多时候只有靠自己看官方资料去慢慢摸索,一个错误几小时、几天可能都难以解决,然后通过不断地总结、再反复练习,方能掌握一个个知识点。</p><p>运维工程师这个岗位不同于其它的后端开发岗位,到底运维工程师平时做什么?<a href="https://link.segmentfault.com/?enc=wVtZxErBbB7AYBvKvnj6%2Bw%3D%3D.bXIxpLdwAyW7m7WPAb1xx9GWfAgsLapBCvUjMX0yDtmpN220AF3R8B4QZ1BDRPBaeQqUwTqid%2BafLRE3Pkkm0c%2B7mXw3DCsgB8YyXj0ypuxeZS9i0Q5rNVZmIIgKZ6i9VHQcnAOGDrxs%2BVZ0W5SnVzPOM7vFvoW4i9%2BfElbPkOS432H5wMP3lszvsL2DEGHwOm32KAgQIMGBaPc8C2XRVUVxso6GzQ7Mi0mFhWdpvUOZne1sTtOtYMWDmxzKqHESQWmiwgctMLgxUwYXCU7PYhHiC0Bx8Q9Wq8p%2FqTrLpso%3D" rel="nofollow">老司机告诉你:真正的运维工作是什么的?</a>。而且这个岗位对技能要求是越来越高,不仅仅要求需要知识的深度,还要求要有一定的广度,深度就是需要不断学习运维知识体系的知识,广度就是运维岗位上下游(测试与开发)岗位的一些知识体系,至少是需要做到了解基础的掌握程度。</p><p>因此,这就对运维工程师们提出了更高的要求,首先得有一颗不断学习的心,其次坚持的毅力是必须的,然后就是不断的实践、操作与总结,重复再重复, 时间久了才能形成自己的一套知识体系。</p><p>正因为这些原因,才有了上面的《运维工程师打怪升级进阶成神之路》的出现,初衷很简单,就是将我的所学与所总结的学习路线分享给大家,希望对后面的爱好者、学习 Linux 运维的朋友们有所帮助、有所借鉴。以便你们更好的学习与掌握其中的知识点,然后也能更轻松的运用到企业的实际工作中去。</p><p>注:文中的红色标记部分都是可以直接点击跳转到相应的文章或学习专栏的。</p><p><strong>让你</strong>体系化学习<strong> Linux 运维不再难!!!!</strong> </p><p>如有帮助,请点在看、转发朋友圈支持一下,感谢。所有的体系化的专栏内容,目前正在逐步整理成 PDF 文档中,后期会统一送出,大家持续关注本公众号每天的推送内容即可。<img src="/img/remote/1460000044576019" alt="图片" title="图片"></p><h2>网络基础</h2><p>这是每一个IT从业者必备的基础中的基础,比如:<a href="https://link.segmentfault.com/?enc=CZ8k1JnJhw3qyOpgXTPq9Q%3D%3D.q1jUZpVhixrWfAIYpocQBeWETxm%2Bf1qQ2MZUUh0rfPIz%2FyCu6hvqdDbEp8f%2BE6Sxtvh5K7wmL9UU1kyjdivaV8eWzxWB0KmZ%2BEtpAm57vv46PG2QgBe1rRl2e9KeeC2xbfWAhASoAQXOYEQz6UC6glqEJfzn6om8UzM82dcGVs8%3D" rel="nofollow"><strong>TCP/IP协议</strong></a>、路由基础。</p><p><img src="/img/remote/1460000044576020" alt="图片" title="图片"></p><p>这些<a href="https://link.segmentfault.com/?enc=opb8khOeG77%2BWQJqYJWUyw%3D%3D.vS2aKZ0o15K9ua3Zwxvj5AO8DSUIyVL%2BlZOpFcshNrqHLoqrDRa2XdZabGdO9wUaTflcA1FZnWqu6wQUMCRRzEdi9VJ%2FwxzURRw8pXkxYeQFgT%2BjH6P7azNn6Uzru42vaB%2FYjUPMiUWDpeyyQDtT67f0kt8buThGRvcgupl%2FhGN040zjIih8U57h4jvRxmqpNLQYDYNmuRekz6CEN8Un%2FKbQl8uXLmPmShScsqFZuO3wzu5MrFrH66HuVRpV8s1Eyd6Eh02EQuYaH7Pd7DHAZcAuZJjQxo3He4M%2FZ507QjTmyYSeZL%2Fnil4ys544PgtWfflJPJfOfF2j7e4Kt2mKmw%3D%3D" rel="nofollow">必备的 6 大计算机网络基础知识点</a>!是一定要熟悉与掌握的,否则无法展开后面的系统学习的。下面一张比较全的计算网络基础的学习思维导图:</p><p><img src="/img/remote/1460000044576021" alt="图片" title="图片"></p><p>如果你是有此方面基础的可不必学习了,如果是没有网络基础的,建议你去看一看我很早之前写过的一些关于网络方面的文章,这样也可以很快的熟悉这方面的知识点。所以,这块的知识点在 4.0 的版本中不再过多的赘述,有需求的自行查找资料与学习。</p><h2>系统基础</h2><p><img src="/img/remote/1460000044576022" alt="图片" title="图片"></p><p>首先就是系统的安装与基础配置:<a href="https://link.segmentfault.com/?enc=%2B%2F1tOZCKSqwTIMw%2FRrtObg%3D%3D.0HwAmmvfgeHOaWcMzIyhQQtqLz6JjeeJ6c8%2FiAWVvKex%2F7qXaR5fLWHQEXznJzM%2B9HBRay9guHwdca8S%2BtOgXM9qgfPnDxB6t5BWom5U6Cj2gdX9M5H3xANQ1TQHicREVOsRXF6N49FiZLmPquNp%2BdQPKnauwCeEN5KiTzUPsKs2YN18eCcRe3BBnUb0%2BdLjqu76fIJ5UQrJCqq6qtiQUhQgsfh9At%2FT6vah6l3%2F8fyv6X9e8OLQln7VvlMsZdjll3hBWnOW31lnaFI%2B1USjhgjFlEtx8t0V3LolAOIotFOqCBIBXpvp7s9BpJSkwMwAUH63Lx608vlArfG%2FSbu9PQ%3D%3D" rel="nofollow">Centos7安装教程</a>,有需求的可以参考这个教程,安装其实是非常简单的。</p><p>对于系统目录、文件系统、权限等内容。前面的版本也介绍的非常清楚,这里不再一一赘述。可以参考这里:<strong>Linux 系统基础入门知识点</strong>(<strong>公众号菜单-打怪升级-打怪基础</strong>)。</p><p><img src="/img/remote/1460000044576023" alt="图片" title="图片"></p><h2>常用命令</h2><p>这一块的知识点,在入门阶段是非常重要的一块,掌握的好坏直接影响到后面的具体操作与学习,而且,这里列举的这些常用管理命令,也是我们日常工作中要用到的(属于重点掌握内容之一)。</p><p><img src="/img/remote/1460000044576024" alt="图片" title="图片"></p><p>这部分详细介绍<a href="https://link.segmentfault.com/?enc=SwTUBhWzRJP7vSLRDDHyew%3D%3D.KIasYOjbIKwnbA960xasWqAQddiuVFyEBfs3xqyNdOPmWWPLtTxsA%2Fa6Byg3ScRQ97OB1cJJwRB%2Flw%2BKyr5lB2S1TSl2ouUnMzciC5S0cFO3gcgzR5ZWkeeiyNX%2FK115NDwn2%2FvxzmUrv5yPSsezjl43TMhYBZG%2BHqLaQDk%2BiLwr%2FtWmjMBCK06HG8YA9mh6" rel="nofollow">系统运维常用命令</a>及其参数说明,并且配有应用案例详解,基础必备!</p><p><img src="/img/remote/1460000044576025" alt="图片" title="图片"></p><ul><li><a href="https://link.segmentfault.com/?enc=g3fAyk9lSBEYJDetS3Inhg%3D%3D.bCFOMrTAsg4pe3X3lyyt22nsOFH91oH%2BZBu0igaq4lNYANI%2BVJ6kFXqoDS1Lda%2FBurUHliNkKbu6aRo2zT6oDg%3D%3D" rel="nofollow">https://github.com/mingongge/Learn-a-Linux-command-every-day</a></li></ul><h2>脚本入门与进阶</h2><p>这部分介绍<a href="https://link.segmentfault.com/?enc=QA4%2BkxpHqaUiE2qdhWJE%2Fg%3D%3D.eH6VWw3%2FTumWmu1i35es9iscLanr9XpxchZUdvL0%2FEFT4kaJdLiya3dxLl5T%2ByEEZlDXiGxqjxjBTp89bubeEIO9moqhRKk92hQor7PBMZ%2Fy3SqasxmB35LQtEo%2Fd3u4kdr7%2FC8QpKKKJdzNdI3PFpTgmWi%2B0%2FNu49yAbRLIJ4Bqei1stAFFkH0AJ2b0CN5o" rel="nofollow">Shell脚本编程</a>的基础入门与进阶知识,包括编写方法分享、案例分享。</p><p><img src="/img/remote/1460000044576026" alt="图片" title="图片"></p><p>虽然说现在Python在运维工作中已经使用很普遍,但是很多企业实际工作中的时候还是会用到 shell 脚本,它有助于你在工作环境中自动完成很多任务。在减少重复工作量的同时,也会提高不少工作效率!因此,Shell脚本编程也是运维工程师必备的工作技能之一!</p><p>更多详细内容可以查阅专栏:<a href="https://link.segmentfault.com/?enc=gF9l7FyoBtA3m0fLSL3q7g%3D%3D.5lliK3Ne%2FPz5cSWftErrYlMV5AJXrzCcbJFiGEYzzQjU9xL8aKB3R1sin3Nxvlx59BWouWiZn%2Bv6loW8svpilfmHTCch1xm8Dx93k0o5ndRXKfrEFDx8JAin9lc%2FPtj2Ai28GjhOjVIb8oNP7XKMaXlNtkyLqrdKia%2FX7GjBWIA%3D" rel="nofollow">Shell 脚本编程</a></p><h2>常用服务安装与配置</h2><p>企业常用服务的安装、配置与优化等,如:<a href="https://link.segmentfault.com/?enc=Py0fSwStFIVu8ZL9Hzxp9w%3D%3D.qygs8dgwEyBeCUijd7SuPuj3s4YxjxvR66NPz5wTjHqDMrZdIn3AGA7GpxhsXXx3z9%2BSKwX19Vpy766coRFagjWgWtCIeYPIPpiXxs3a7rc0Z1JZYG2phOYu9iuU1cddBKM9NDx4ppRp9KoaRMsgRlZ2wROsQnMFH1dydyDemn30ZoGmQnmQlS6nr4GYsUTrYYZYMXAAVAFOK%2B4r7BCeGv6gkbAWrr%2FLpaQJupVMNT0UUwlDy%2FmDOxcrIXcGvAbWYBhaXYwFBN21n8h%2BSQ9AOSntwDjKkoaQp900O20R%2B%2BgmNldwbL5D1XPNBiGrJz5X%2BQ0P8iFB7rjf9gnXMeIqUA%3D%3D" rel="nofollow">SSH</a> 服务、<code>NFS</code>网络文件系统、<code>DHCP</code>/<code>DNS</code>、数据同步服务、<code>FTP</code>、代理服务、自动化工具等。</p><p>更多的内容可以查阅专栏:<a href="https://link.segmentfault.com/?enc=dItX33bNf0akvKk8D1YY7A%3D%3D.Nh%2BBqRbURJQMt%2BgS6jgNsSE81Qm4sT0bfkkdx4awdSq9pakr2qVLYbajnpEzaqUDTYQLe8Rx6QQfG4upTTdKUu4r1Wpl7o%2BOh0RJyLNRrf00rdsHxkb1iPPKIovw6HFKWKnzswVPp0WNXgCFlO3Xn70D4YBcRN%2BcTjm90HG%2FSac%3D" rel="nofollow">玩转企业常用应用与服务</a></p><h2>Nginx 配置与优化</h2><p>基础的服务安装、配置文件介绍、虚拟主机配置实践、Nginx 优化配置详解、LNMP 架构 Nginx 反向代理负载均衡配置、Nginx+Tomcat 多实例及负载均衡配置、高可用、Nginx 版本的平滑升级与回滚、Nginx 限流配置、Nginx 日志生产实战、Nginx 配置文件在线生成工具介绍等。</p><p><img src="/img/remote/1460000044576028" alt="图片" title="图片"></p><p>详细内容可以查阅专栏:<a href="https://link.segmentfault.com/?enc=xTeoebWIxq2r48Zc7pW2TQ%3D%3D.ql8aOSyrFYy7RjkFcanXQvG3w16lWphpf8NbtmnXqYnE8qRcUBHOFFvqLVLi1sXf5VkpwNyYsvmvxwc8ZkwSA%2FBOTE4XIDidZiZPb3PAASrw%2BXm3%2F2BmVE2c%2BwPVM2kEhiymtkHcXnUR4bkqdqtNjB32DsYqdoVV0VLtR9y%2BtVE%3D" rel="nofollow">Nginx 学习专栏</a></p><h2>数据库</h2><h4>MySQL 数据库</h4><p>MySQL 数据库的基础知识,如:数据类型、存储引擎、性能优化(软、硬及sql语句),MySQL 数据库的高可用架构的部分,如:主从同步、读写分离的原理与实践、跨城容灾、数据的备份与恢复等,然后介绍了 MySQL 的管理命令、数据库语言的命令、库与表的管理工具、性能分析与工具的使用、MySQL 数据库服务器的硬件选型、性能监控、开发设计规范等知识。</p><p><img src="/img/remote/1460000044576029" alt="图片" title="图片"></p><p>详细内容可以查阅专栏:《<a href="https://link.segmentfault.com/?enc=HyeY24ZQ%2BbulPlP2qI1eYA%3D%3D.1a015oLO6XClC%2Fj8VrN9dz3FZhq%2BR%2ByFzU5f4%2F1vgVLTD12B4Cpuz%2BspW6o1SaGiBQCAMjqjsWkJx3F04QZNojjXDWqixK7AcXgiLKwAdBfax6vMC%2BQWuTvTCXius3Gii9uMLkPVglNwSdy0J7p1MgC7DSyDMxK4kiOgQrjvM7goTX4a3ZvpWR5487sRbdq0" rel="nofollow">MySQL 打怪升级进阶成神之路(2023 最新版)</a>》,数据库的基础知识可以看:<a href="https://link.segmentfault.com/?enc=cHAS93HpEj8oTBgHLUAUaw%3D%3D.CjUS3FOnAPjp9DB6bmMagmCG7LQ4LIj75WNsIQZ%2FBPYnB0II0xFcn1KIrT7PN4hNEKJ2thQ9lWpJ4jWR7r9DgJBKu2zjScaO09b0BxP5RRTDQ6nS2I5%2FQrmP6xsc8yeNaAdRDMUlAYtbMZ2gY6pE9T%2FgAv1skN7%2F5kM7TqIc6TM%3D" rel="nofollow"><strong>数据库基础入门</strong></a> 这个专栏。</p><h4>PostgreSQL 数据库</h4><p>PostgreSQL 是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进,PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSQL可以运行在所有主流操作系统上,包括Linux、Unix和Windows。</p><p><img src="/img/remote/1460000044576030" alt="图片" title="图片"></p><p>作为一种企业级数据库,PostgreSQL 以它所具有的各种高级功能而自豪,像多版本并发控制( MVCC )、按时间点恢复(PITR)、表空间、异步复制、嵌套事务、在线热备、复杂查询的规划和优化以及为容错而进行的预写日志等。它支持国际字符集、多字节编码并支持使用当地语言进行排序、大小写处理和格式化等操作。它也在所能管理的大数据量和所允许的大用户量并发访问时间具有完全的高伸缩性。</p><p>详细内容可以查阅专栏:《<a href="https://link.segmentfault.com/?enc=BWG2pwu2CJOZOj2WhTCizw%3D%3D.8TGAiM%2B6kdG7%2BKH6vnyr8kkdZ3yhqPp4irUrBq9kbqpmWcQpb2h%2BcsfBUfZRldkp8FoqVhiWmyEw5k8vuAmpgO45C8yl%2BZmDT54dIFjtYdIJN4xEtILgHl8jXElxGtz3MIN1E6NXa92tUWO8QVcd3b3oPaEJ7BuEAdpqEglAz2U%3D" rel="nofollow">PostgreSQL 打怪升级进阶成神之路(2023最新版)</a>》</p><h2>Nosql 数据库</h2><p>Nosql 数据库是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能。专注于key-value查询的redis、memcached、ttserver。<img src="/img/remote/1460000044576031" alt="图片" title="图片">我们这里会重点介绍:<code>Redis</code>、<code>MongoDB</code>、<code>ElasticSearch</code>。</p><h4>Redis</h4><p>Redis 是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash。</p><p><img src="/img/remote/1460000044576032" alt="图片" title="图片"></p><p>详细内容可查阅专栏:《<a href="https://link.segmentfault.com/?enc=pGd1ZHVeUin7fjMexS8e%2FA%3D%3D.0432bqTeY5NKJMtZL8w5zh0cFEhCsf2FsgW49Xe2KDBvuHlkZqHOo0mOkx5XG2H%2FSOz%2B7pW0v2H1o2WR6jyNSgpwLGHjoec6XbamXO2g2Se8G9r22rjJRX5sFBp0m2rYGMXXsj0eS4R7qPg2BkTUVbka1G%2BO8t6%2BK%2F5ZG2O%2B310%3D" rel="nofollow">Redis 打怪升级进阶成神之路(2023 最新版)</a>》</p><h4>MongoDB</h4><p>MongoDB 是面向文档的 NoSQL 数据库,用于大量数据存储。MongoDB 是一个在 2000 年代中期问世的数据库。属于 NoSQL 数据库的类别。</p><p><img src="/img/remote/1460000044576033" alt="图片" title="图片"></p><p>详细内容可查阅专栏:《<a href="https://link.segmentfault.com/?enc=hlR1VjKB35yjFXhnKSEFZw%3D%3D.nFz6UGNg1LeEmRwNZMVqrUVWJSJruvgGouwjt5pJfZPG549D4lPyM9W3lRpp%2FqnOEkI9mbJgHLHfgHUz9CT6xFaYAJbjStIKc2Gdnk9tEkTXHJ0jKyBRUdsH0EAWDGx0nfvXQ8cySMkCFg4WS3SOW8NEmCYAzjWHFU6GZWM2knM%3D" rel="nofollow">MongoDB 打怪升级进阶成神之路(2023 最新版)</a>》</p><h4>ElasticSearch</h4><p>ElasticSearch是一款非常强大的、基于Lucene的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。</p><p><img src="/img/remote/1460000044576034" alt="图片" title="图片"></p><p>它被用作全文检索、结构化搜索、分析以及这三个功能的组合。</p><p>详细内容可查阅专栏:《 <a href="https://link.segmentfault.com/?enc=vfjqLJdpLvVjDzi%2FjikIyA%3D%3D.Efmr6ZAdT4B4j7H5UsxerLfbt%2FdeiTQfOIn2%2Fa28KITj2fvXLaBUdj6rG8WA9slG5XhF72qVgI%2B0GrJTKCC%2FrD8Y%2Bvnrq27Y2A0Q2pt9QvOtgH8rKuRkeVnSMjHGbz6pv4AqRiLhif3bcq5d9XDGgoZMLTAsBKxhGpTL51cUD%2BI%3D" rel="nofollow">ElasticSearch 打怪升级进阶成神之路(2023 最新版)</a>》</p><h2>Tomcat 技术实践</h2><p>Tomcat 隶属于 Apache 基金会,是开源的轻量级 Web 应用服务器,使用非常广泛。客户端用户点击浏览器服务连接,浏览器通过客户端底层服务通过路由传送报文,目标服务器获取解析报文,Tomcat监听程序触发处理请求。</p><p><img src="/img/remote/1460000044576035" alt="图片" title="图片"></p><p>Tomcat 相关知识点在面试中出现的几率并不高,所以,很多人忽略了对 Tomcat 相关技能的掌握,其实它也是非常重要的知识点之一。</p><p>详细内容可查阅专栏:<a href="https://link.segmentfault.com/?enc=WtVeP3xHz7%2FJB6pkKKXYdg%3D%3D.Dg%2FfYKTNwXd%2BCwoLBoRPrE1eHMH%2BpYUXbPpZ7qirm8D7mpscm7IdBGryopXrO2GDZsR7jqdgHDMLjQVBakY0BgBKrMvel2tBx9OMYb2p1GBFILPWw9349fW9nP%2BnF%2Fo3VtoyN0Ay7UX2eAntd0cYeOkv%2FYWHxkn15uoXnzhfxmI%3D" rel="nofollow">Tomcat web 技术实践</a></p><h2>企业生产项目实践</h2><p>一个中小企业生产环境项目实践(将之前的知识连贯运用的实践):</p><ul><li><a href="https://link.segmentfault.com/?enc=m3kswxdTP5XL7ac2PWMO%2Fg%3D%3D.KTxEStcnSIFN8LU5VjlCFWqcM4dPAreOMhkPlyb6Wo%2F3kvauKpAeNUz7B3AWOg%2FSEmN0TrN7Kx8pHdL2nDH%2Fut5J2vklqkODUT4F3mpc1FuOu4i%2BTy%2B9cDTw%2BTrwJpYljxa4by38tkNMS5j4KDM8xKn8C0k%2FGqzJE5X5%2BnNP9O91rrg7ElaU9UCbx%2BrKfqUfqaI5vt0SUB5SiMQmQybC3GzScjtcNcOkE8%2F3Y94ueXrZ4qjZVrbzhvrCMmwLx%2BE4MyyskwyRF8FanvdKuTsZ97uWdS5ZS%2B0nDYO2%2FfiF%2Blw%3D" rel="nofollow">Linux 系统集群架构线上项目配置实战(一)</a></li><li><a href="https://link.segmentfault.com/?enc=5VmQUwTmb%2BdC0PNGguPAtg%3D%3D.l2CodQtmMmuav7JWpwK4eB9shb15o%2FCy1cq11wksnj%2BRH2cV3XJo2dUflk2r28Z1VDTuVbrxOaltbjHRJfpkLyy6sS%2F4Q56a9xC6Q1hE50UCvRZbtLlg4jrIrEjx%2Fy1Gk0uumH5LqCaOfULeZgWehuNc13HM1QAlrSMozuxHgkeRdwOVmZIKwjNwxaQpViiTDcYae%2B6m3UlhqIQpWqgWj52nEead9h7NhezZC5N34p5v6257oyHPnubTCWG5NXjC3Sk8MfzrenFvJ2xJJ%2FExACkawOEjpo6NF1NinwLp%2FxU%3D" rel="nofollow">Linux 系统集群架构线上项目配置实战(二)</a></li><li><a href="https://link.segmentfault.com/?enc=4J7YFOMiN1325lv%2Fwd%2F1OQ%3D%3D.Fr7K9Hi2Iq92I7hX3CkVvy7MwDzNk6JZt10t5CNiAehNJiYhH1FCVW8uuDe0%2F7cZ2fr0DpYiXv6Lm9gDDzTJK764t0oJgJ%2BFX8hygTmWWQUWCT2sShBPF7rtRcN2Xw0swDa0YBpS2e7%2FXVzTwGcCiqjXvjWw7o7HTM6171KuYFoVh9gpQ2HJRd%2FvhrPN%2Bq8AMKbUqQKASgSS4CHENq8zynM1HTYINwQri9Yeb%2FaH91ExkMxrKwNVy1NFaK7vGwz%2FKsOhl9MXlYs%2FYikw3tsiFB2auBrx9mm851LgVtxklH4%3D" rel="nofollow">Linux 系统集群架构线上项目配置实战(三)</a></li><li><a href="https://link.segmentfault.com/?enc=s411v97EC58%2B%2BrZx%2BrMsxw%3D%3D.rf6USZa0yIdD3l8q98EDCdN6GqgpASm3E75iTGxOfPTddqPFc1RRYRDmaTsuQraVGzXYAcNK4CCTCV8oJcfc8MpPnuYV%2Bd0gXO702x46YRugYHfU9%2BL3lvWgWkJo83d1TvKdHSRxuASp9Ve0gqzDmIeHpxUkajXH%2Fq%2BHQE7JhZjYDGoduuaAmSLI8sHvAPbFn2NivV7trvRHFUa6RgSM%2Bdls9Q%2FZElczM9MUMuErUhTo2vEasE3ek%2BzmFOpXa0vuB1%2FJsmD6KlZcznuS8jhhvBeMZ5EU2RPoxmxHNKqiC8k%3D" rel="nofollow">Linux 系统集群架构线上项目配置实战(四)</a></li><li><a href="https://link.segmentfault.com/?enc=sZB%2BJx8FCgueTcjGskXjFw%3D%3D.A78eDGgeEK6rQFciKiw8PJH%2BaL6CilBPMZJU2CYQ%2Bn7JheP30I0cFKQ0XoZ4SR1AhLbzQXHbcltoH9pz%2BELi7B0GIMJ9owyF0gE%2FVMiPLqVhNM4pYIcDrI8oisDF7UX1AgGLqdUFOvZajp7GZO1oiiyqeqYJMGx3i6WYH1MJy%2F%2Bmqw%2BhVGPBKW%2FleaodU0JmjrgRbCx0QtlePmr6gVjjPHvrKF1%2BLDloqR0N628BvPCvQ3hOi4q8wYaUQehhKL9y9x8jKmq7FhcDF5SfWnuNLHLZpfYV%2FCHr%2FL4%2BUWzOcjQ%3D" rel="nofollow">Linux 系统集群架构线上项目配置实战(五)</a></li></ul><h2>常用中间件服务</h2><p>介绍常用中间件服务(Kafka\Rabbitmq\Zookeeper等)相关的日常运维所需知识体系。</p><h4>Kafka</h4><p>Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目,该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。</p><p><img src="/img/remote/1460000044576036" alt="图片" title="图片"></p><p>关于消息中间件 Kafka 系列的学习文章,请参阅:<a href="https://link.segmentfault.com/?enc=UHLP%2Br3Aek%2BOq65iE5ctCQ%3D%3D.SVnpU3rh%2FZoI0Tng4ojc%2FH6Ycy8oP5oUsUy0XHK3vnckq9nostspj2K%2Bgi8jADjxK8dkfsfKKSO32%2BlUCGlYVZEUztDk5RzKEMb3zVAdCblSG2ySGlXigcVz2%2B4JlZWVBy43DbEueK3l%2FlYBnxqG%2F8plJ0tSC2FroKrGNPLxxcA%3D" rel="nofollow">Kafka 打怪升级进阶成神之路(2023最新版)</a>。</p><h4>Rabbitmq</h4><p>RabbitMQ是由erlang语言开发,基于AMQP协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。</p><p><img src="/img/remote/1460000044576037" alt="图片" title="图片"></p><ul><li>官网地址:<a href="https://link.segmentfault.com/?enc=Z7sOaL053UNQPPeKivNULA%3D%3D.GhNkOp3hyV9vYkpgPLJAmEdIuXUzEXkctiFZzSuM5X0%3D" rel="nofollow">https://www.rabbitmq.com</a></li><li>Git地址:<a href="https://link.segmentfault.com/?enc=txx6D1sCZ9xIqIwmej20JA%3D%3D.f5%2BasFarXq1ffKj6sq8QK%2FTSXfYuQ7kziCocMKdynmA%3D" rel="nofollow">https://github.com/rabbitmq</a></li></ul><p>RabbitMQ 是一个消息中间件:它接受并转发消息。</p><p>更多关于消息中间件 RabbitMQ 系列的学习文章,请参阅: <a href="https://link.segmentfault.com/?enc=EfzO0%2BZgfbUVQrsJ9K%2FZLA%3D%3D.1swZrAV1Iu4Y5RfiRzEd41MPJN9o6hNdd5tXc9wg2EkNiJQ9NX1OaJeN7yLrpquJqVa6rD2foJaG7v%2FLMb%2Bh0Jul3xs4errVckbcDh%2FoFNaLOdvKvk2orcsJXdlJzpGMPwcugCe0CwZuhh9gr%2F6ALNIMAD9A%2BSKBnmhqFvM%2Fq%2Fk%3D" rel="nofollow">RabbitMQ 打怪升级进阶成神之路(2023最新版)</a>,本系列持续更新中。</p><h4>Zookeeper</h4><p>zooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。</p><p><img src="/img/remote/1460000044576038" alt="图片" title="图片"></p><p>更多关于 Zookeeper 系列的学习文章,请参阅:<a href="https://link.segmentfault.com/?enc=ajfVuIT%2BrPU6kmSf2rOAeA%3D%3D.K%2BtkwHvqEHDqTjXih1akIoEhAAK21vUmgeQmQZ6IWEKiA7ACi7tePS1LggXmI7kFrQvbe7oyvopoW7dzGkogHQlE%2FCf6sIRp%2F6aeNzFo%2FtrXw81Yy0Yat9gGn0rwZPN1%2B1HLoOvFAihznouIspGusvBEpQc%2BBzYwJGzkXugrpno%3D" rel="nofollow">Zookeeper 打怪升级进阶成神之路(2023最新版)</a>。</p><h2>企业集群管理</h2><p>集群是一组协同工作的服务集合,用来提供比单一服务更稳定、更高效、更具扩展性的服务平台。当业务体量达到一定的量级的时候,单机或者多机的架构已不能再满足企业的业务需求,这时就需要进行架构的扩展与优化。</p><p>此时,我们便会引于负载均衡、高可用集群管理的架构,从而来满足我们不断增长的业务需求。</p><p>详细的内容可以查阅:<a href="https://link.segmentfault.com/?enc=AHwWzT18EMd2Ytm4Hf7Jnw%3D%3D.KB%2FUQik3JxHS%2BU%2B4l4ysBC%2BFVF%2Bd5V9eBpJ8ncwipGsgkxoSf2%2Bo0HYU9p9zApGmdHQ9v%2F8xrWTKkqz74IIfkwUVVFJxLzXXozkiE774iyju6ByeSS7iREgH6dKnjI%2F%2Bxrc3LrrMD88fkR%2BEAnsQXZA6Ylx5bfgMda68EQZMbZs%3D" rel="nofollow">构建企业级高可用集群架构实践</a></p><h2>Docker 容器技术</h2><p>介绍 docker入门、安装、常用的命令、三剑客、私有仓库搭建以及容器监控等方面的总结。</p><p><img src="/img/remote/1460000044576039" alt="图片" title="图片"></p><p>详细内容可查阅专栏:<a href="https://link.segmentfault.com/?enc=g4ThKaM1rfVjoyp3qlAH1A%3D%3D.TdM0rtKosZTXBdrjr9KMqsJr2Dm9y7yRNo1WW%2FE%2FIGY9Aw1Z%2Bj986aKD9B67S4u1Et9HF3TLUFeOOpMMVmrflQvdHUA2NR5FC4zriQA6nxO9f3%2Fiy6cUWJ0%2Fj8%2FxErfIEnna8UgvwaFIS80U8g6Zo4b9zGvhxvjzO%2BJayBKHTPg%3D" rel="nofollow">Docker</a></p><h2>企业云计算平台</h2><p>云计算平台也称为云平台,是指基于硬件资源和软件资源的服务,提供计算、网络和存储能力。云计算平台可以划分为3类:以数据存储为主的存储型云平台,以数据处理为主的计算型云平台以及计算和数据存储处理兼顾的综合云计算平台。</p><p><img src="/img/remote/1460000044576040" alt="图片" title="图片"></p><p>OpenStack 是由一系列具有 RESTful 接口的Web服务所实现的,是一系列组件服务集合。Openstack 是一个云平台管理的项目,我们可以使用Openstack来构建一个私有云架构,并提供IaaS的云服务。Openstack 包含三大项:计算、网络和存储。其主要目标是简化资源的配置和管理,把计算、网络和存储资源抽象成虚拟资源池,并根据需要对外提供服务。</p><p>更多关于企业云计算平台Openstack知识体系的学习请查阅专栏:<a href="https://link.segmentfault.com/?enc=zBLFTJ0Yr7kBYEr0vbsKqQ%3D%3D.6TDxu4lfOXYcs67%2BA1xL10ZJ%2Fie1ROxn%2BYIq0mOL5HCHw8w2L5K3ZFBd%2BSZ8%2F2JKS9WTTym06nAAcXKrsvjm%2FeI%2F7OD1EEeb0NbYb7vxO0hv4C6q91pxPOMmrC0NAr37uQYU8Cl24lyFWfaZXBfwXOVSwOx3dN840YZBxlL2GcM%3D" rel="nofollow">企业云计算平台 Openstack</a></p><h2>Kubernetes 技术实践</h2><p>介绍 Kubernetes 技术实践知识体系。从原理、部署开始,逐步深入去学各个知识点,比如:Pod 的实现原理、YAML语法、Kubectl使用指南、资源控制、数据存储、Harbor仓库、资源清单、服务发现、Ingress 服务、集群调度、集群管理工具、面试题、生产实践等。</p><p><img src="/img/remote/1460000044576041" alt="图片" title="图片"></p><p>详细内容可查阅专栏:<a href="https://link.segmentfault.com/?enc=cktYTFktf8UcBkzyHBHqYw%3D%3D.O8jr7YC5%2BLe0ipWLIzJp4HmuVmVG2OX9L0FdmRMgGmMyj2ylNiYW%2FTs8G83n9uKF3L4fLzSUv8HkGffjE5K88G8njutr%2F0kd9gnl2x4FwQLrMOgLbpUNv6sOx9NLHZ7f%2B4N6Wt2eBTl5FevyP8Uf0%2Bkwww%2BLpMhsRdaJ2lJowcU%3D" rel="nofollow">k8s 技术实践</a></p><h2>大数据运维体系</h2><h4>大数据概述</h4><p>大数据(big data),指的是在一定时间范围内不能以常规软件工具处理(存储和计算)的大而复杂的数据集。说白了大数据就是使用单台计算机没法在规定时间内处理完,或者压根就没法处理的数据集。</p><p><img src="/img/remote/1460000044576042" alt="图片" title="图片"></p><h4>大数据的特性</h4><ul><li><code>大量 (Volume)</code> :大数据的“大”首先体现在数据量上。在实际应用中,大数据的数据量通常高达数十 TB,甚至数百 PB。</li><li><code>高速 (Velocity)</code>:大数据的“高速”指高速接收乃至处理数据 — 数据通常直接流入内存而非写入磁盘。</li><li><code>多样化 (Variety)</code>:多样化是指数据类型众多。</li></ul><p>Hadoop 是用于处理大数据的工具之一。Hadoop 和其他软件产品通过特定的专有算法和方法来解释或解析大数据搜索的结果。</p><p><img src="/img/remote/1460000044576043" alt="图片" title="图片"></p><p>在大数据处理上,Hadoop并非是唯一的分布式处理架构,但是对于大部分的企业来说,基于Hadoop已经能够满足绝大部分的数据需求,因此才会成为现在的主流选择。</p><p>详细内容可查阅专栏:<a href="https://link.segmentfault.com/?enc=qBoQlWcgteye5L3Crg9gXA%3D%3D.aYU%2BTtyb611vNUhxZiYpwh%2FegqfQhXtM9UicL027R9%2Bl0N7utyuZlM6vKDuF9dFKGqLOY2TTF%2FJ5vdHkbmrZj94ijDo2XPMomb11YnCPpxV1VkW4OudK00Ms3nBOKe8P%2F5r509z0svzQsyOCbP4xEWIj4D%2FRIXdQHxGRERrWVaM%3D" rel="nofollow">大数据 Hadoop 系列</a></p><h2>分布式存储</h2><p>分布式文件系统是分布式领域的一个基础应用,其中最著名的毫无疑问是 HDFS/GFS/ceph/MinIO 。如今该领域已经趋向于成熟,但了解它的设计要点和思想,对我们将来面临类似场景/问题时,具有借鉴意义。</p><p><img src="/img/remote/1460000044576044" alt="图片" title="图片"></p><p>详细内容可查阅专栏:<a href="https://link.segmentfault.com/?enc=5oIOCbUoQBc1GWPusoKB8A%3D%3D.uD5wcWU1l7IG1p6gAFyqh7ojppDWaI9JmpXno9wb0yd%2B4l6TNAQLDHqvGmGr4cMXsFWiw%2BmN77Pf%2Bk3EOFK6bix2fYsgl8NNEethGmJcen%2FgSOWsqJw80EcyeR1CmQ0Akd9n9Xf%2FoEvFbHmGZR50Oly14B6WrQHtBtp4xzOQVaE%3D" rel="nofollow">分布式存储技术实践</a></p><h2>代码管理(Git)</h2><p>作为目前世界上最先进的分布式版本控制系统(没有之一),Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。随着时间的推移,Git 发展到今天,已经成为了众多开发者必备的开发工具。</p><p><img src="/img/remote/1460000044576045" alt="图片" title="图片"></p><p>详细内容可查阅专栏:<a href="https://link.segmentfault.com/?enc=Qc1VC5aGHx3WKgFf8c5oBA%3D%3D.Nfr9g%2F1%2FEwfaMxktO7xEf4IEHYI08Tm74D7UPiDXZQSUdSlFUnbdxyG6fXDdexQ5nKIHsOudWyqVYO7w%2FA0Zyx4fTPEdvtItcZXAkdKjtTgSbfb8febtqZxRS7xqG%2FCQgy615WXxpW%2B5crH8cf9UImGfRJeqjQA%2FaugfJnf3EHo%3D" rel="nofollow">Git 技术</a></p><h2>日志平台</h2><p>介绍日志平台相关的日常运维所需知识体系,日志管理也是日常工作中非常重要的一项内容。比较主流的是ELK stack和Graylog。ELK目前很多公司都在使用,是一种很不错的分布式日志解决方案。</p><p><img src="/img/remote/1460000044576046" alt="图片" title="图片"></p><p>详细内容可查阅专栏:<a href="https://link.segmentfault.com/?enc=sW7SHqVtoJaItV5zr4onhA%3D%3D.PTb8OQhknAixAyOyuaqZuevw346wkfsMm7%2F8N12hYTNhN9xcETuGUv%2FkHAzUzBGF%2BJ3%2BYSPAu4JCusIu7zV3grzE3bHFWHkqpsgYl6LdPRXXho%2BjCGLgB4CEkJKGHVoBo4BQLg0MDA7rKpH%2FxSqTG8o1Z4jHOB8c1t2XybyH6uQ%3D" rel="nofollow">日志平台</a>。</p><h2>自动化系列(DevOps)</h2><p>介绍企业自动化体系建设(DevOps)相关的日常运维所需知识学习。比如:Jenkins、CI/CD、服务发现、配置、容器管理、K8S包管理等工具。</p><p><img src="/img/remote/1460000044576047" alt="图片" title="图片"></p><p>详细内容可查阅专栏文章:<a href="https://link.segmentfault.com/?enc=GN87Qmpvg7YLHsr6eDHSVQ%3D%3D.X8X7mzdbQK0jJrTNYn%2BKQs9%2F1QxYnMn%2BNLHyLbsPmQOT8oJyR3xNvtdynmYfxh1ZCtIJ5hWEtVpZ6%2FVKUTGdaG0m6LPYmPuiTuJbPLsXKJfDz4Ign3sahdHrkeTbobMpiQg3UtGlRXdsAHq9%2BHsPs6dzJGvSjWMpXKpTY%2F6c01I%3D" rel="nofollow">构建企业DevOps自动化运维管理平台</a></p><h2>企业生产监控</h2><p>监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。企业生产环境监控系统介绍,包括但不限于各类工具(Zabbix、Prometheus 等)安装、配置、优化与实践经验总以及排错等,详细的监控工具使用可查阅专栏:<a href="https://link.segmentfault.com/?enc=e7zq%2B4H1PRS48R1xKHwqfQ%3D%3D.u66WGMazI4ms95SFNMffVIFnGcvhVsT1Eiy4aZQsMNg%2Fa%2BlMyy5DTcN%2FT6pSkKugUliB591Yc2CxaI4tzwHaAdUYr6WpubRPM17%2BJndR2qNe1id2Mpa6IXmzQPucEP%2Bjp0AFbE2b6blPzNhGxbI80%2Fs70M4VyCtB56s57WuASOg%3D" rel="nofollow">监控系统</a>。</p><p><img src="/img/remote/1460000044576048" alt="图片" title="图片"></p><p>更多关于企业级监控平台的建设与运维管理,可以参阅专栏:<a href="https://link.segmentfault.com/?enc=3AKbUhMnH7euaAAVNhBl2w%3D%3D.FGw16gfIgBWMaszUoXXsRn5T3g%2BFhjyhXSNkQLd0ZAQlhinlTHZNfhIxN4ipyl11PfF9s95wVf7Po6mLpURuDLYnqOs1CWadhyvzfkDoEyjCZHrfaKr9JCG5EF8bPWq%2FYFpmQw061LznSv9GIGFc%2FoQcSOr80Vi%2FJVAuu%2Fo44QE%3D" rel="nofollow">企业级监控平台</a></p><h2>常用工具</h2><p>介绍常用工具(命令工具、其它工具)相关的日常运维所需知识体系。</p><p><img src="/img/remote/1460000044576049" alt="图片" title="图片"></p><p>可以参阅专栏:<a href="https://link.segmentfault.com/?enc=uOa9GGV%2BOpMN%2BFvD7JYyAQ%3D%3D.ZQ1cEvh77wxygdTIozLyBXZV9WvvccbEa0yBBfows7irNCAeOve8FC83rSg0Jj84oPSnd1NE8liwlYa1veN2OKk9QRgmVBnOXl6%2FqQih7nEO%2FV%2BDtaJpVc7pRb2bEHcQMFOuNQ%2BLJYOz6YbEoEaWHtCIs06xfSwWjS6YC3b0rgw%3D" rel="nofollow">Tools</a> 去学习更多相关工具的原理与操作。</p><h2>Java 后端技术栈</h2><p>还可以进一步去了解一些后端的基础入门理论知识,通过熟悉上下游的知识体系,这样在工作中我们也不会那么容易被动,这就是运维为什么要不断学习的原因。</p><p><img src="/img/remote/1460000044576050" alt="图片" title="图片"></p><p>比如:了解一下关于<a href="https://link.segmentfault.com/?enc=ziU%2B4tJQM%2FmNC3lQRa%2BBCw%3D%3D.cViNBXxa4hnilOEn90slj5VfWx1zj4Nvpk9QY77krY%2FYGzkLecVdR6USJkP1doOeXgYmpOmx404hI0DHGkT2EeZN1FZ6cCQ%2BOQa%2Ftuolp78pNpjmwK70ZHqN2830vX9BT6k84K1dvHA5bqI2e2B9c%2B5TXrXuG3Ire2MlriowJF8%3D" rel="nofollow"><strong>Java后端技术</strong></a>、<a href="https://link.segmentfault.com/?enc=hf2oBWYFXPGEQ0hxfYj20A%3D%3D.6w1QjCR%2FbdLDddto2hp2pWQbq4X7xWrZQvGvjuxeCMMvwwuQX5%2FKcudaYrnsIfqqeMHxZHcN00rGnAmYEmI4foTfreetplSOZWg0apTlksAoyFY1HVwdofDhW4ccFQ4QIsRQ7HSTpd5XUjnrlwuLe1dwEWK38nxPqASKNlVLnsM%3D" rel="nofollow"><strong>微服务架构</strong></a>,轻量级 Java开发框架<a href="https://link.segmentfault.com/?enc=5WVPM%2FZzFbyjwwcvce2uVg%3D%3D.SLZ%2FB0tum1ZMBpg263%2F3A75LsbouDKvfgsKkzEXfi1UgRhbVG4tLV7PHMXwNJbZuE4NxoGIjgV7iEUHpZ9T5VRegmjp1uAy0g7Gwa4k9M2RuX7ydM4JTpRfOSWRMFvsYWE1j1gdv67HLIMsH5ee3Z6ChPvJzrauUuOxkX11Pzug%3D" rel="nofollow"><strong>Spring</strong></a> 等。</p><h2>企业面试</h2><p>介绍企业面试经验、各类面试题详解等(面试题与面试经验总结分享)。可以参阅专栏:<a href="https://link.segmentfault.com/?enc=jEE%2FG%2BSIutqgmoTHrmNjbQ%3D%3D.lALiCZNMcIhsPgg1NxdBjp7MnaWuhbVdGwvlFvKH9sPNMVCwVn5%2BXbqeaiEVUsS1ua7SfG56BryBikAFMmynHeabLbRvSRtzZSdqWo9Jxy2hu6n9Zgu3YiAwzDrVofclAmBIPi7fpWUVmEDsWz28bSYz0rjDU0lITSMba%2FwWHrQ%3D" rel="nofollow">企业面试题</a>。</p><p>学完这些内容这后,可以这么说,还是仅仅是开始,更多的还是要将所学的知识结合实际的生产环境,然后通过不断的实践去总结,慢慢的一点点去补充自己的整个知识体系的高墙,从而使之更坚固、更持久、更强大。</p><p>如有帮助,请点<strong>在看、转发朋友圈支持</strong>!感谢你的关注与支持。 </p><p><strong>路虽远,行则将至!</strong></p><p><strong>事虽难,做则必成!</strong></p>
别再傻傻地用 ifconfig 查地址了!这条命令足以让你摘掉小白工程师的帽子
https://segmentfault.com/a/1190000044505832
2023-12-26T22:19:03+08:00
2023-12-26T22:19:03+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>大家好,我是民工哥。</p><p>别再用 ifconfig 啦! 赶紧试试这个吧:iproute2 !</p><p>众所周知,在 Linux 系统中,ip 和 ifconfig 这个两命令的功能十分相似,ifconfig 是 net-tools 中已被弃用的一个命令,很多年前就已经没有维护了。但是今天我们不讨论与学习这个,来学习一个更强大的命令工具:iproute2。</p><h2>简介</h2><p>Iproute2 是一个在 Linux 下的高级网络管理工具软件。实际上,它是通过 rtnetlink sockets 方式动态配置内核的一些小工具组成的,从 Linux2.2 内核开始,Alexey Kuznetsov 实现了通过 rtnetlink sockets 用来配置网络协议栈,它是一个现代的强大的接口。</p><p>Iproute2 之所以出现,是因为,之前一直以来,互联网上的一些不关联的网络工具都被打包进了 net-tools,随着时间的推移,很多工具都已经没有维护了。所以,才使用了新的名字 iproute2 来替代net-tools工具包。</p><p>目前iproute2工具包内的工具,它们使用方式都非常的相似,且统一开发维护,这样也便于用户灵活的运用工具包内的工具。</p><h2>net-tools 和 iproute2 的对比</h2><p><img src="/img/remote/1460000044505834" alt="" title=""></p><h2>安装与使用</h2><h4>安装</h4><p>centos 安装 iproute2 命令</p><pre><code>yum install -y iproute</code></pre><p><img src="/img/remote/1460000044505835" alt="" title=""></p><pre><code>[root@CentOS7-1 ~]# ip -V
ip utility, iproute2-ss170501</code></pre><h6>常用命令及参数介绍</h6><pre><code>ip link #网络设备配置命令,如:启用/禁用某个网络设备,改变mtu及mac地址等
ip addr #管理某个网络设备与协议 (IP或IPv6) 有关的地址,与ip link类似
ip addrlabe #IPV6的地址标签,
ip route #管理路由· 如添加,删除等
ip rule #管理路由策略数据库
ip neigh #用于neighbor/ARP表的管理
ip tunnel #隧道配置
ip maddr #多播地址管理
ip mroute #多播路由管理
ip monitor #状态监控
ip xfrm #配置xfrm </code></pre><h4>使用</h4><h6>查看arp缓存表</h6><p><img src="/img/remote/1460000044505836" alt="" title=""><br>iproute2的核心命令是ip命令,下面一起来看看具体的操作。</p><h6>查看网络接口信息</h6><pre><code>[root@CentOS7-1 ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:25:62:6f brd ff:ff:ff:ff:ff:ff</code></pre><p>上面是查看所有的网络接口信息,也可以查看指定的接口信息:</p><pre><code>[root@CentOS7-1 ~]# ip link show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:25:62:6f brd ff:ff:ff:ff:ff:ff</code></pre><h6>配置网络接口</h6><p>通过使用以下命令来打开或关闭网络接口:</p><pre><code>ip link set ens33 up
ip link set ens33 down</code></pre><p>还可以使用 ip link 子命令来配置网络接口的属性。比如,如果你想打开或关闭网络接口的多播标志:</p><pre><code>ip link set ens33 multicast on
ip link set ens33 multicast off</code></pre><p>还可以通过下面的命令来修改 MTU 和分组队列的长度:</p><pre><code>ip link set ens33 mtu 1500
ip link set ens33 txqueuelen 1000</code></pre><h6>查看路由表</h6><p><img src="/img/remote/1460000044505837" alt="" title=""><br>linux 系统中,可以自定义从 1-252个路由表,其中,linux系统维护了4个路由表:</p><pre><code>0: #系统保留表
253: #defulte table 没特别指定的默认路由都放在改表
254: #main table 没指明路由表的所有路由放在该表,**默认表**
255: #locale table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改</code></pre><p>显示所有路由</p><pre><code>[root@CentOS7-1 ~]# ip route
default via 192.168.1.1 dev ens33 proto static metric 100
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.100 metric 100</code></pre><p><img src="/img/remote/1460000044505838" alt="" title=""></p><h6>路由策略 ip rule</h6><p>使用语法如下:</p><pre><code>Usage: ip rule [ list | add | del ] SELECTOR ACTION </code></pre><p>查看规则</p><pre><code>ip rule show</code></pre><p><img src="/img/remote/1460000044505839" alt="" title=""><br>上图所显示内容的第一个字段就是优先级别(prio),数字越小,代表优先级别越高,也代表这条规则越靠前。比如:在进行对数据包条件匹配时,优先级高的就越早被匹配到。从输出的数据中可以看出,默认优先级别 0、32766 及 32767 已被占用。</p><p>所以,如果在添加规则时没有特别指定prio优先,默认就是从32766开始向下递减,也就是说从32765开始,如需指定,可以使用下面的命令:</p><pre><code>ip rule add xxxxx xxxx table xxxx prio 6666</code></pre><p>添加规则,有两种方法:</p><ul><li><p>根据源IP地址</p><pre><code>ip rule add from 192.168.100.10 table 10
ip rule add from 192.168.100.0/24 table 20 </code></pre></li><li><p>根据目标IP地址</p><pre><code>ip rule add to 192.168.100.10 table 10
ip rule add to 192.168.100.0/24 table 20 </code></pre><p>ip route还可以结合iptables做高级路由策略,比如给数据包打上标记等等。</p></li></ul><p>这个工具包的功能十分强大,有兴趣的读者可以自行体验,也欢迎大家积极分享你在工作中所使用的好用、实用的工具、命令。</p><p>今天的分享就到这里了,如有帮助,欢迎一键三连(<strong>点赞、点在看、转发朋友圈</strong>)支持一下!</p>
原以为是 Xshell、Mobaxterm 的平替,没想到是个王者!这款开源跨平台终端管理工具真香
https://segmentfault.com/a/1190000044480722
2023-12-18T15:20:14+08:00
2023-12-18T15:20:14+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>大家好,我是民工哥!</p><p>做为程序员的我们,经常与服务器打交道,不可避免的要通过SSH去登录服务器进行一系列的操作,比如:登录服务器部署应用、调试API、检查代码运行情况等。</p><p>好工具是提高工作效率的必备神器!民工哥在此之前也介绍过不少的常用工具,以及它的使用与配置,大家可以点击文章上方的Tools专栏查阅。</p><p>提到SSH工具,大家首先肯定想到的就是Xshell,这个工具绝对是多数程序员的首选工具,功能比较强大,操作也比较简单。但 Xshell 免费版本不能在商业环境下使用(企业使用可能会有版权问题),还有就是不支持 Mac,如果想用 FTP 传输文件,需要单独下载 Xftp。</p><p>今天就给大家推荐一款超级好用的<strong>跨平台SSH终端管理工具:Termius!</strong></p><h2>Termius 简介</h2><p>Termius 是一款 Python 语言编写的开源 SSH 客户端工具软件。并且它<strong>支持 macOS、Windows、Linux、Android、iPad、iPhone 等目前所有的主流平台。</strong><img src="/img/remote/1460000044480724" alt="图片" title="图片"></p><ul><li>官网:<a href="https://link.segmentfault.com/?enc=dv%2Fbod4pI%2FjYfJ5G0RLoVg%3D%3D.17BV4jdMqhuoy9%2FjlrvmyGP6bkCBFum1GCdKqWgpwhM%3D" rel="nofollow">https://termius.com/</a></li></ul><p>Termius 不仅仅是一个 SSH 客户端工具,而是一个完整的命令行解决方案,它重新定义远程访问。且比 XShell、Putty 等传统 SSH 客户端更美观,还提供账户注册和数据同步、端口转发、命令补全、快捷输入等众多实用的功能。</p><p><strong>Termius 软件功能十分强大</strong>,可以同时运行多个后台SSH连接,多任务分视图支持,支持多次连接同一台主机或连接多台主机,使你可以轻松的管理你的 Linux 集群,随时随地的连接服务器。</p><h2>Termius 主要功能介绍</h2><p><img src="/img/remote/1460000044480725" alt="图片" title="图片"></p><ul><li>Termius 可用于所有主流系统</li><li>内置 RSA / DSA / ECDSA密钥生成器和Putty密钥导入器</li><li>SSH,Mosh 和 Telnet 协议支持,带 bash 的本地终端</li><li>没有广告</li><li>将密钥和服务器配对以便快速访问</li><li>创建组来定义共享设置和主题</li><li>12 种色彩丰富的主题和可调整的字体</li><li>黑暗模式</li><li>与同一主机建立多个连接或连接到多个主机</li><li>端口转发</li><li>通过命令行导入桌面的~/.ssh/config文件</li><li>SFTP 支持轻松复制文件</li><li>使用 AES-256 端到端加密同步所有设备的配置与密码</li><li>使用双重身份验证保障用户安全</li><li>通过 SSH 代理转发将您的密钥保存在您的机器上</li></ul><h2>安装使用</h2><p>直接在官方下载系统对应的安装包即可。<img src="/img/remote/1460000044480726" alt="图片" title="图片">这里下载的Windows版本的(下载地址:<a href="https://link.segmentfault.com/?enc=%2F8NVm%2FripXQNtGe2%2BJnECg%3D%3D.nARy4eBn2uiZDHxFgMzYiRa3jdRgEBoPWko1TZOiR0VUgFpA8Wr2l%2BCU%2BbWXaCXh" rel="nofollow">https://www.termius.com/download/windows</a>)。双击运行即可。<img src="/img/remote/1460000044480727" alt="图片" title="图片">登录成功之后的界面如下<img src="/img/remote/1460000044480728" alt="图片" title="图片">添加主机<img src="/img/remote/1460000044480729" alt="图片" title="图片">点击Connect之后<img src="/img/remote/1460000044480730" alt="图片" title="图片"><img src="/img/remote/1460000044480731" alt="图片" title="图片">成功登录服务器<img src="/img/remote/1460000044480732" alt="图片" title="图片">SFTP界面<img src="/img/remote/1460000044480733" alt="图片" title="图片">端口转发配置<img src="/img/remote/1460000044480734" alt="图片" title="图片">切换<img src="/img/remote/1460000044480735" alt="图片" title="图片">Termius 可以将我们的终端配置同步到其它的平台,包括连接设置、命令使用记录等数据,使用端到端的加端来确保数据安全并同步。<img src="/img/remote/1460000044480736" alt="图片" title="图片"></p><h6>安卓手机</h6><p><img src="/img/remote/1460000044480737" alt="图片" title="图片"></p><h6>苹果手机</h6><p><img width="394" height="570" src="/img/bVdaNC2" alt="image.png" title="image.png"></p><p>更多强大的功能,有兴趣的读者可以下载并体验一下,也欢迎前来交流使用心得,或者推荐其它更好的工具。</p>
今天卷完了!玩转企业常见应用与服务(2023 最新版)!
https://segmentfault.com/a/1190000044462590
2023-12-11T20:04:02+08:00
2023-12-11T20:04:02+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>大家好,我是民工哥!</p><p>在这之前,我们相继卷完了:关系型数据库 <a href="https://link.segmentfault.com/?enc=rNMjjuOTS2ncHuhOMs0XRw%3D%3D.HbETFNUGLTMwIXpTbel%2FFoQXqUPoRCdsmUiAjAV9RlZqpUvy1eJOv0CU9nVVwMPs6%2BySkw%2BAa7UcHOSX3wGEcx%2Bxbw2RaGC1q96umuHov2PWNldqkzfN2X5h64a3oUf3cZAUHtYKGDmrGtrLeo8r2RaI1Prva7JiVh%2FRZDpvkrFSRatQ1yqb%2FVubZaU880l5gqvb9Uf2m6GmOaXVkmM0zKe3Gf20IxEuWM8KBoOz2O9sAaJF4fgqqeW6UrtsgQkEmZDUOKGyDvFVlLQS7s5Ll%2FNJIWT1%2FokiDj1qPMrE3WQ%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=x1lWf3fHFd44lIKXeVXoCA%3D%3D.ofMM9vW8lpIokyHwKrkgR5pFwNFod6HP6Wpv54O0hswYbkt5hFFmcx1egSc52Z%2Bqdh%2B71C3ptUAaZBHLD25cRIo6xTxYPEp%2F69rHqQ9nQ9u9NE3jLWJ0nqapIS4kprsTnWG8lEmsXy2%2Fk25cQCL2HK3QKoNFaXbahXZ8pWFd9yASXbTVlecP%2B3GfaZOi9RQTmBknnSvroxTBYakaQgz%2FffY0ePXlnEIlmJNhcX1PWNbHqWYJEu5hjt2so0hs3Ek3NLuTGibvxyzWMudkNXRot33HHr%2B%2BeXRk0VNtoEOxZgk%3D" rel="nofollow">Redis</a> 、 <a href="https://link.segmentfault.com/?enc=ciGYY4eRsWPJxxum4%2B%2FkYg%3D%3D.2jjujH3%2BlfAp95SAh3ILB1bdoUiduR%2FBZRUjfpmCNVRL5WoqsCux%2FZk%2FYysRa8R7wpqlHWE9l4gzoFvPNBTVGobDDuLF23C%2FyzPArm96NGKLBQp5tN3ViM1ZqpCnT8HX582cHReA0k3qfnMWI1tynfvTMPAbqzcEDq5Ln3CffSDK4fwBwLvBTQQwvzqdtzKL0%2FtCy4wd8Sb88Bmlb89ZMPN%2BExATGYoer82%2BbnNHc9LqZCbqHkAYSeC0NaiYJjZRBuxnHR0jBuS4ZW7HxElTXhzK335W3dAo9Ywi9pyTCetJcubBxks3ZvFS434FLajsCN7nEM9Xf8PImCy77HtD6w%3D%3D" rel="nofollow">MongoDB</a> 、搜索引擎 <a href="https://link.segmentfault.com/?enc=CHA7XKiJivuOhhu5RpE7Cg%3D%3D.SbkM9KNykLZL0tkga0MvJkZ5pbVwaIws1IudoJlkqQjkgxmLg1u5yLl7CI%2FYbFvTYxJpr1sbeSsS%2BXQrE1d874wea3qfjoFROhyKRBhVUaVKsbdybzli2hhIAoR%2Bmc0du6piMQA%2Bn571GLohmqZYQSsHb87Uc40%2Fp06wiiYj5iv4%2B1n97wzOB6v9LtmpJSWYHsGUbdDG29jD5N2fKp7kVeecwoa7g8PybV2SwkPrPUxcC%2F4ZAOdX4GF9w24Z69XZd9lj2mH%2Fc%2BMurpTrSR0lBQALfX21bokdrvQDe34BV%2Bk%3D" rel="nofollow">ElasticSearch</a> 、<a href="https://link.segmentfault.com/?enc=KwbsAcm0VYHoMQ%2FHDYUCAg%3D%3D.idXFhZ4OexzRAGV93k5KolVeTkoFzw2Z0ebonEWSj0I%2Bj%2BPZm1xZWiHIjWkSgnAM7jKFse3W7zFZD9k%2Fdg25cIgmZLo1zqJFkHoETkUd5FCeQeupmisIutJcOhOhIDhTPCHe6HjwRpr2bm5F4wIfY4MFXsMsygV8Ry3odt6vz7STHZ8BHYRpyvIpl5lEQbyIBwehEBpjUoUZ7WasSZba7b1Laz%2F1uQ8H9EMVmJmghjcPTQirl4syGanoqjqLwwseQ0q0ege%2BJ8239Ek01HEkzOnz1KKGT6NH0x7xO25O7%2BQ%3D" rel="nofollow">大数据 Hadoop</a> 框架、<a href="https://link.segmentfault.com/?enc=Rik0E3O2j3vS8Z5uKYmg0A%3D%3D.g3WgKVK9R44Piy89j3PXLHj8iCH%2Fk2%2BgsoBHVdHPK9s4LW2ctEhUx7PqdNl9W9giOMIe1Q2P7R03NzqnEYkZf3PvX%2BaJvlbBO7zyyeA9c8l64S%2BOPAq%2B441PO4aAigE4mW7ztArTj1iJm0Rq1zZ5wAOaCO4TQXS7LwRPQP6%2FBHaejkychkzTLuQoC4sWxvjazOXtpKH5%2Flw%2B8cpW0k6QQk4C4JizrYmFqzw3UsSvOfOF%2FIC1AVj8ilgkKVBBzam15O6CNrgCfDvQe26Zoy1oGvmKjO21mPx4lfMLcFLUdNk%3D" rel="nofollow">PostgreSQL 数据库</a>、消息中间件 <a href="https://link.segmentfault.com/?enc=SqVkvv5rS5scMBr2EWw5Dw%3D%3D.Jtu3Ah%2FCqwVRWjKxBKBgqaU7%2F7gIXusgOmpDBajqx%2FeghtWHlfzWYErJrTXPVwHHkc7%2FcmaDlmQzm5jYzjbIN%2BVU6rNwt1GBi4u4mid%2BjUZVX5ShyRs1Epelq2wZu8%2BUXN6ARooZQDXLTy8nguP4%2FY9zYyjhfhqDMEMZkAam9iI%3D" rel="nofollow">Kafka</a>、分布式协调中间件 <a href="https://link.segmentfault.com/?enc=So%2BI%2BVQh6xQhxK6JWJeH2A%3D%3D.NRcItZ9YRQ0HzIi3ewKaTv2jP1jc0Boa5pPG%2B%2FDq9q%2BgjLmgU0%2FJmCdWjaXy2aoOz4%2B3kcZhCC19FLKjHxabQEuDtzbRRH8K9snP6u5Yua%2BuiGj6vHdr2jD66D9QX1NjqemBpfNkTSmn469WCIFJRiWT30HIUo1zf7hBina5Lf%2BROcKfqzYLWaGcKh7vg%2Bf1w0rINbjcwJKWe7A3QaOfpL5MaxafHOGocPCyev%2Ftfs%2FNxYOJew5htK4VWpswkmwIk5m%2FIyzthPUO8N28019TYj07nTX0NbUJLXKf0HmzGdHkIge10AJTPCKU5AZflA4IC8Vk9Gh4852QKmpMTKjGwQ%3D%3D" rel="nofollow">Zookeeper</a>、消息中间件 <a href="https://link.segmentfault.com/?enc=e9I%2BQ91cBsnGwG1l6NiKLg%3D%3D.BfFXMP3zjvPnkB5jL%2B6l1UIOwC8W8RNAg8wTNlxZ8S%2FALUJP1fFGK%2BVvq1ZNt8XKK2oEB4fdMvIBTLdk9%2BV4wxZUFM6t3AZMWZk5SIDT1h6Qf9jCt6nZU2BitcoMcwwT4E9z6jHwuUh5jvOXV%2FjSvHLVm%2BFwEJE4jYoJRJ0j5FzaJd0tkwwQNZ2dh%2BSujLcMT3EXul5YFMGacXIhcbU02Khz8Njsjy7mQLcoekDTUjbUaWVoQqYY4VG4CbFDJuF8i%2Bc%2BjLVIpmjcoYxwyYx5%2Bx5fJIc8QYVKfhvZSkIfggpFWVxGWlHzq0oUVX4A5fHzmM0m2yZQ0dETQr4l%2B4FsAA%3D%3D" rel="nofollow">RabbitMQ</a> 、构建<a href="https://link.segmentfault.com/?enc=mpYsOCD1GIwDWhQOnv%2Fq7w%3D%3D.Jc2xISvN34Xob0p%2Fq%2BCuKvujjwQOdbDh1fX0YowH0lMjj7dJj9WM0QQs7iJL826XOT1VKK6WuO6C0ML0iJ1sJFW3s1KQmwEErbG0le%2F4LhSO%2FhVouTk%2BjRphaadOoUQLzNdahUlw52NyJhKyDR7nw4OBP4tOwbxHRKU64Jxmt1T3QtiLy7sP9UG8T2CiFaP1wzcjPkzbV%2F4tOxEqaL%2FiqC55XjWypa0iItZD8f3T7ptO3dGughWNyCienAte7onXRgRczHrhaWE0ziCe9R78x6lPjSdqJyV8JSBoDwDiQGA%3D" rel="nofollow">企业级监控平台</a> 这些系列的知识体系。</p><p>今天开始,我们将踏上另一个系列的学习之路:企业常用服务软件。 </p><p>这是一个非常基础的知识点,学习完网络、系统基础,常用命令之后,就需要完成这部分内容的学习。</p><p>安装部署只是起步,真正在企业实际环境中运用自如才是王道。</p><p><img src="/img/remote/1460000044462592" alt="图片" title="图片"></p><p><a href="https://link.segmentfault.com/?enc=Z9rShdhI1t7okxOGYMR5Ag%3D%3D.Ft1fXvC0g6uKm17dT0KE2JGydazn6oHB67yK1WQbZnWiBiykiKdoBrJhZSRd%2BRn%2BfvbbhMuy9b%2B1nl56oCWW3U%2FHBETK4HtK2RaFBKl6ko%2Bb5N5XMGhfdvy8rOY4TNLKhDmQVt2ii8ApHRPAT4fnMfvfYgtWFoFaKqcpUwqKC%2BtsTvT9Dh%2FUByqzo8I90HrP7xcJSutxB8Zi4SJ%2Frbmq2CJcpO2ib%2B6lwxJkBU9vwHtCybXeDHV92NyiFLnKB%2BII4Nc1iKCBmOEd9aZrR9BTRoHAgpkdUrvkI%2BiNS2PAdN4%3D" rel="nofollow">玩转企业常见应用与服务系列(一):网络文件系统 NFS 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=AYvWQQjZP9x4%2BIElwhBw3Q%3D%3D.V0QlaL7OqAh0RrpDYZZ9IPbPXLSBCgHH2Q9ggVPm83dor0DjXaPIL%2BV42MAQBPtoDkAF06sPSPbmjBJ2mHUKabn9B6kcuurKMjfqdwn6R6CIBBPOm8GT2knJB6uUsbqUIV8BL5CPo2GVvbEJ7Wf%2B3Yy44OLLrHtAY8wp4xjQwnieuZYen1Uo14KoT0XJnhO4mNMBRTEOimyXpDe71pZ7hoVxKOLMQDeLPYnb7wDBP2QkgljcrDL80mkp0D77AqaBFrApXWe2Zlja1DffwvbTR2qYVhPAqnULzlxHzRtw7b0%3D" rel="nofollow">玩转企业常见应用与服务系列(二):文件共享服务 FTP 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=k8jQJJ7cD8vHadO0tcqK2g%3D%3D.Uwd1o0pOlJL5HkkHUTkqTPgXQqxLKdAorsCRmMKxY4wWJR6SLSE0TkLq%2Fu5u2y1aj2lEgDJbZny5Vq56Sc4mZawRvNkq%2BSTPCC%2Braua813mG2W3pzhXU9f3fcKbgJAmvlAS5OaImUbASdb3j7irSb4Us%2FkcuUyY9R83G40D1W4O5JKPhBPZKWQPDslhwtKDOyvl9UDNsqaA%2FZZOqtHKb0LCfoRdRIlsSLv1Eqk2LnZO3Z1iZ4p01gNl%2FGqhqLIsVlotMVaqFfg3PKwNWvaq154kc5cQ6cEksR3SBEAqLkqY%3D" rel="nofollow">玩转企业常见应用与服务系列(三):动态主机配置协议 DHCP 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=nVgZOUZx5n0oYWw2etnumA%3D%3D.HXB5NpGhAuL9Wm1pznUveXFbsZ7Lu5KpZmRU49MI5OU2DnWDtE6LUTPDLls2OYzZggEEFhp3u5zXFCtpDKn53GcDnTPUNjOlDDogOxdJ3WJ45PuFwAzL4cXGURlgUS6Y%2B%2FitMhc%2BztFl6pYEDkhkidfZhE2cmaGts80JWGd2wfMCJQ3RjIEYLXOxIwx%2B5u2DV7AK5CmsIH6QwXTjaJdpv4SS2zIgZFgydi9z8qvoz6EJC9ToK7BYBKgDkhAwk22lYuUBNKgcVOQtx1D2DUraMORrrrUt0c%2Fzl7dM5DBK3LM%3D" rel="nofollow">玩转企业常见应用与服务系列(四):域名系统 DNS 服务详解</a> </p><p><a href="https://link.segmentfault.com/?enc=LpYZ7%2FCIor0FPx43uzdv5A%3D%3D.fgFS7LHHRoX08ku8ymS0195RFV18d6fZEjh5Z5cAxUXSd%2BGT9QxbQPts9bN3xiTpZKhy1E04U5ArpTmaBuuuajsasp8gHfjvn2UyQlTjF7epg7eKafmM64sdtI6tzcmmWLK0LPG6tlV7DUpMrKhGTYGx%2BzocGqFbN46X4jJByso7PAJEuVh%2BWJN%2BTdx4QRu14whcl9BbQ1wuIIXIxxM6U2cwxRj%2BCpah%2F7v0025ICNERzIB96Ob8SOUl8HzgeNIveA4U2KgHbPQDZ6or9bhC3iWhpD7rSVFFXmVocFrd7Hg%3D" rel="nofollow">玩转企业常见应用与服务系列(五):网络文件共享服务 Samba 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=RRi%2B6oB%2BXxXCSEVo%2Br7x0A%3D%3D.HevLdF8mWtwTDmx1ncWCf1SLEzo4cOulw0zSdlrih0pHdiOtU5zh0szVF0t5prWUc0cbUkz%2FnqZdaEVMJvbugwHCss%2BQsdlwFvj1XsZUuwh3KCKKDSEZ%2FO01CysJn8XvTIZBlb68wExUvAcj9LPANduYdb7KG4sD%2BebaWOmGjkxSh%2FtkNTXxKDluJUrx5MNvk5ItQOQi%2FeRv6h%2BS%2FP7FxqKGWe960BZxVaIGLO0n9twSVwUGzFj2XWCxPwEpQ6i0CMRBJkjzLyOmMX97ahJm0yRu0apdQZXd3fDH2fy3BhU%3D" rel="nofollow">玩转企业常见应用与服务系列(六):数据同步服务 lsyncd 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=G8mvoBf8dx1qhtXDAXV%2FQw%3D%3D.j5WHB006rLQ2wxr2cToYn3DgvSj3WeNbmftP5uokVRYUDbmnb7bz1zKozpuTY%2F3XRSOiE%2FCyjs3xAa0%2FoPL9pbbRwneEX6KalDOZQ8fI8bPH7qkPlRoOUiZPh5dxmyjSL%2FR0LU%2FLTrHUqlQ0sAr6F%2FA%2FLzeZOmGEJJEj8TKWQAv%2B23%2FTMUIU04T6mArGEQ3t0QBfj0Btj64wO8t5hRgYMMoDqYffzZu8v9V%2Fa6CdUj7L%2FWYt26Xl5464OeS1DD5SCW0ym%2BAyHPb7X9uvJXNOTuqiJ7WPVZDITFvfYscKCCQ%3D" rel="nofollow">玩转企业常见应用与服务系列(七):邮件服务 Postfix 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=NBynnpL2ecDUCCq5R4ds9w%3D%3D.3Y96vulijFTIPSX4vla8ZOAyiDnu2eC1nUUbjEQNI01bTPEgJ08qlRA4%2BL46HDWfOxFvNc9Trz%2FZse2i%2Bo2PE15efTqRBO9lZDK23GXM6IEQBoJVlanhC%2Bih6rN9XhRPnrXEshrs%2B4uMvqujE3FNRQ0SqJ5MoAeBJqxHZLN22wxs0sE0AimqcN6wJ9IqMLE2adSg18PiNRjmDYfRNRDQx5XTWnz8Vg9ZyNDHbFeKihBRcsL2WlkdEm40DQuIjyV%2B%2FNd%2B3gBoJ4eFNfAor9cDs4z05qGFaQoKfHIbgR1Wyeg%3D" rel="nofollow">玩转企业常见应用与服务系列(八):开源代理服务软件 Squid 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=AKctshk53EiWVQcNz7bChQ%3D%3D.94whG1rhjJLPY%2FyNOj1DeZe8qpNCQ%2FUx8BgdRwFADVagVIpvBofJ3P040NkFC6b3FSrMiiB%2BDKE1mALZUXMx5F2%2B%2Fx1LdGnNyF1NpTsT0ATWZ9mrkSK96zxtA7F0XRu8OyEYltFmZOrcOI%2BjoicJf9hHFNy1GK3t867eFUc0Tume%2Brv5TaOlrymLweXMG8ri10jlOTh10RBeqtwnUbwaoVXtJAqmHmQmdLttD2T6y6eKJfuy4Fyd%2BK1eNM1iTV6C2EAgL1Jp%2BCazlWSS%2BTQi42KZB0ij6tTiVLSQPPBLOTI%3D" rel="nofollow">玩转企业常见应用与服务系列(九):开源 HTTP 加速器 Varnish 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=naNQpZG1sFcajs4wBHZl7A%3D%3D.Uyrd3bmVnvOcwtJuxy6GRsTn2pGh3wmvuqfX6YHkBJ50wPqeQEp%2FEg%2FkfYWxYUApwBa8bWRZVoLw%2BLe%2B90orB%2BKlHbkhAmlleDyupezz60Z%2FNKLe7FVdywMwusuVQMxD47hnBFzgKs6vkBgkF9AJ2jrc95F3bP73qEv0fPbW4L64fVF%2FMt%2F1v%2FHwFLK8VMaF9aEsYntWsPjhVJcRHmQiYHfmel4Q%2FyaoAzQTIZcAX139tkYk8uRS0%2B5Ow3M00PYOV0PEHbTirXgktKvlbVt%2B8wQY8quVwbyvKmHsiQzijYg%3D" rel="nofollow">玩转企业常见应用与服务系列(十):自动应答工具 expect 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=roumI%2B7SKBWWfS8JzWBAQw%3D%3D.1ED4UUYgc2l3JlWSCsaB3E9EZ4QTQshOqljsLWax4Ss28sshxdRE%2FVb3zY05LeWuPxH8BdYn%2Bxph8F2lptqVvD2WKPJO6cn8ISmG3xq8%2FEEpByB6GOKUk2FutL9apGJ9e%2BZNFIsNszbMsLxAAcXySsQTv6kLaHbwSi1NKmhRX6AF5SCDML755filIFcnA5CaPIZS5N8U2%2B3BHpyAYnS8bx9TeAknRopZszvOUhBD%2BMvS5oMFuQ6SaNA7bVigNVOK8NDf7SxbyZMu9UNfNRkTyjx%2FGpCGoDBgFHN9LB3vdyc%3D" rel="nofollow">玩转企业常见应用与服务系列(十一):进程管理工具 Supervisor 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=SUoIupOKm6m3VawtZyNUzg%3D%3D.sW92%2BJ3fYCBfiRmL6do7dXPwL51rq9L6cCtNBWCVDI2PInr%2FoUxLQBmtw87RavUIMmiyyDE20u9m46MyfIE9rAgGYOMFQ5pUiQlCckhjPR3%2BHM%2BUTXEnMxZtjLAQmXW6el7CXlcY%2FUWmNIDSuGCKh%2BBaai9qob921P079adciaBZBlcCDp3hbDkGybcPu2M0QTTFnSm8o7R%2FsIJ6tFfeM3Fjxk14Twok%2F3FMbArX7%2BvgpiOt%2FTINEOVxKN7Iebcg3qK9geID5%2BkFnDpztUtImnbF1RhvuErMI34IbKHYzj4%3D" rel="nofollow">玩转企业常见应用与服务系列(十二):HTTP 压力测试工具 wrk 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=7GNxWw%2FNTSHXFAAu%2FjYu6A%3D%3D.yRo6UsELk%2FqRG3YxQptW17zQXtwGVX923ioUvbuWDiARZoE1pg1sVc6Lh88CCroKUS1rbwmnYmVMaRh7RfDjaBygq0%2FoYnoTRRvsIvVJ%2Bft8ykXNiyOASv9ExD31%2B%2BQ9WGdd0W4qWJMV%2F%2FqnOwA8WSworT71IsVVcMehrNtRaqvx%2FjfWELWgAS7exfA5eFyCrlHzXX1HwnHgZ9XiUO7PST9BXc30r%2FuqYapXUY7MU9xZxgv9k3mAXDWJtzcjgTbfpszCqY8buCRV8hUcU9oOKkJhqUgBTikJYATWxxFc9ZI%3D" rel="nofollow">玩转企业常见应用与服务系列(十三):自动化安装工具 Cobbler 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=e2Y6z0bxbz%2F7rbeiynq11g%3D%3D.dTPpF7Z5FBSpBFv%2F7U1VQwfkGQqV7uJ3BNPBlH5jsLzLLcFPx2oWX1Il9GPjf7vPaasUWrYogCGuK7FXQMR1QEbvmP3aXrKUpAfHj8pi9hVRTOUtuhHzIGOhjuvjN%2BojqerG80vlzraDXwSiz5KjRiDeZri6s262zNSEK8yAVhTEl6KxTh08goz1loQJqzEdlLrhdcI%2FE2GZoUBPmj%2FAtsepuJXkcG1Z93hIUlS%2FciGklg4rqQlk5r5TyM5hcoLmTil1q0pHIhdofdjctvjAUf%2FktuSbnq2NqNzW57MT0WY%3D" rel="nofollow">玩转企业常见应用与服务系列(十四):自动化运维工具 Ansible 基础入门</a> </p><p><a href="https://link.segmentfault.com/?enc=GoL2YdCExBSlqtlFTFWsXA%3D%3D.UEeRcTRCSpGZicfdBy8Jq%2FQek%2BnsSc0CH1orxYx1J4R8VFJvCRxpDixnTsxvPeo90Nkt1N%2FQjcWCqI4wJtTIrzVjZ5A4H6V4AP9q7KjquTEbc%2FZXxYARTB0jttylKE64BivGy5WP5qx8fBegf5RZHCif6rBgN%2FQ8fiuB6wontawbKgJUc45A85IilKCIQSGMi3x2apumBj00ff8jfeEHd9KEmttF%2BcnwBhJ56o0L%2FznuWcoQml3YnP3wMPZKJpyoX%2FyFaJGYmu5fe8MQTSH%2BOBXYz6GS0jp1i6wMo104aWE%3D" rel="nofollow">玩转企业常见应用与服务系列(十五):Ansible palybook 原理与实践</a> </p><p>今天 ,终终终于卷完了!!!!</p><p>如有帮助,请点赞支持一波!!!</p>
终于卷到位了!构建企业级监控运维管理平台(2023 最新版)!
https://segmentfault.com/a/1190000044383235
2023-11-13T10:17:42+08:00
2023-11-13T10:17:42+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>大家好,我是民工哥!</p><p>前面给大家介绍了:关系型数据库 <a href="https://link.segmentfault.com/?enc=xlEV6EmgRkZbaeoq1nZYAA%3D%3D.ilRqGrv2RrG4lQR3vMVIlFUvnHsKjAj9YEvDDGK6bPaRpPJktwWDV8IANpFAUBtkwdW39vF4hx7IVr518M2t%2FIpiRP6MC%2FbL6WCsTto3ZVwOwnXulbr9DC8X3u67S6iTR7UetUxnZmdM4%2B567grb3kfb1j6qmaNb%2BJj91gsBmM5FbDOfpFj53EsIwc%2BmwyR%2B7hdSD5WL8l3jqcRMCJGr1Tnq4htG7RgRd0h%2FG9TY4IY2zf4diVIwuWVrDnNUlAh%2BYdouGpr6VQExwgoponI5zNoMZOmacJ2V7VyFy0RLM6k%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=fy70Lj%2BPrLR7Jo40KaiCIA%3D%3D.8GNOtxp4k1u1Bbq0B0cwSu1%2FBMuq7jT2xTjMHeW3zscSVB1FGiyoYgYwadZ0NYndQNVYUo5pSipJkU0r%2BlKHrzjKP0HCbnHeyx%2FQos0Khn%2BvwDYQ34yOLHwGGyCZ8kTF3K5mchGUm5TvFoQ19UxcBjPFZsm%2Fs6hPH9%2BxgL64zkPCiu62rwfMyl8TNGsFeDGAk5HhQqg1SlpGeD50SkVToaLrPOOIEiWFKv8pJq0yz0zl%2FUeOccbjthiF5Q0r7WHMRvJb%2Bs03nROYzGiJ1hptvOfNs4zwvbxXmsVWM2Jbey8%3D" rel="nofollow">Redis</a> 、 <a href="https://link.segmentfault.com/?enc=1JoEtdaVgK%2FdI5Flw1dtig%3D%3D.3r8xADC8If%2FMv2qKoe6wG%2FZSEUipmzVwAWzmif1zQORv995FH0B7mL1WDpFo81UvRH0TR7rO7RFZVl50AKNg%2FSCFWXY5npZW5kItzyRBBbBQT5pts4BNFw3FmQAIWnr0DbcxqyJS%2FLEk2g%2Bshvwdr6ORFvdOO%2Ft2Pu98zdlSoiplKZ48%2FPhZZilaNquh19d%2Bo7prR1o0v10OiJF8%2FzdP4zjCggWfGpolHd5t9ANwM%2BDyzIaDzVOB5iLRHb9KVPq4WfVgJXq8ZvEL1qS%2F29fRN5LbYp7lmqOJqNg42q2fcykzftWNLHHBfxOMJlGail%2BZn8tggdnbXWcXJpAt3AD1HA%3D%3D" rel="nofollow">MongoDB</a> 、搜索引擎 <a href="https://link.segmentfault.com/?enc=2AJ8kTy6Fe7UJZzW2jL2Ig%3D%3D.GVpON8xAeaOX%2FBuE1I4VnkIQjaKsb4vFK%2BzPKWBK0u0YPgs51YSIjo%2F7GWODI5Tx8C46GBEkHR%2B6zP80On8mP1qFkxiY6qrLVMCDCh10Hz6TtX01dNhJIEIFNTtcnnzbJZF30skLac7Jd5jo%2Bn8bdCIN2pJzvHz4KPIt6u%2F2irZ6x77CP4SaDyLFUW9etI8g%2Fv1gY9tlj99AmwgjOcUaqgWhncKFK0I8sP8PL%2BAgPv8dODK7BVXIjqncxCyNJGU%2F44hG4VGZUEirjrBpX0v23F%2B%2BpofN9NLldfm2I9Bv7Cg%3D" rel="nofollow">ElasticSearch</a> 、<a href="https://link.segmentfault.com/?enc=p5W75FVj2kKZ%2B7ds81BeYg%3D%3D.5Mc9SQ8ibjFrJhlX5seI%2B8ups4Cli%2FQ1aJCzo%2FjoVDhw5NZlHDGL5KiNvLqXK9Y3%2FpN9foOzyUSPcTcHyGmywL9qmahd%2Br2DpCcBbzyIfQIZDVDZxk0UFyRDjPun7MOI3uIEGCFpO1YSFX8WFjF80i0Ne0WR3fi3NgotDSw9XAje4NYEDX3T1oVGpCQd3KmPXWGJB884v%2FmnIl3qIC9VwlikCTXjv%2FwbwJ%2BuYMJvYRho5wKBngcYDo0P6o1oZOha80LCleaxV3%2B%2FnUh5HSLF7RohFKl8vwqthWdp6P2fb1I%3D" rel="nofollow">大数据 Hadoop</a> 框架、<a href="https://link.segmentfault.com/?enc=an2G93SNiqTEjXwxmJbfjw%3D%3D.hdNG108hY4otGc0DOKr1UXlGFYDGhdZZyKn4kPr0AJB863E9PLUQjP0JnmjjdooUUJifUPjarDlJNWQf3ehH3VxaW%2FFAUM5z%2FG5b4d5PSIFNVHpFvD8%2FUDHUAv60vqKU29BRJOlYz6QYA7RIHqGle0AfZo%2BLzvSOvaJCkbeS6nU4N%2FSXwGIrH30dIsuIodmVCKEtqy%2BpXgmL9Hc18hVkssx6VTQe0o2JUCXvQx4SC58PcViRNu8jzH%2BOOAb%2BUgy%2FZXx9Jgvqe3jzETf4%2BP4pib6ujKNiqSS9gmq1Q4AQp7I%3D" rel="nofollow">PostgreSQL 数据库</a>、<a href="https://link.segmentfault.com/?enc=cpXtfDQUx9XrRBfXdFq5CA%3D%3D.sfe6Y7PJYdtBp0Dw4hUL8t%2BKtbdfVHht%2BwdYypbiTMXnZymBENSsSKD2og68HGVtT9Qy%2BI2ZhHqomAVHB6M7MFRYi7ofN4ZmJE%2FQmOEoSfr4lHSfNbRpz3QFpAX8tnejuYHLH87v1nMQWdEWvTeDVzeSukoEwEO2DvRJMvPSxAOgl9R%2FCv%2Fft%2BzOwETzVBnjEJD8tBeQtKeM4SDxuZARVFfd8HsMMvbvbYAqG81Kv3uSFB4jp8SYzN8nqVxCFWKAx1Upmrh6wHFYN%2FnWmz4aAH0xEiKVirTeDWf5sGgvv%2Fo%3D" rel="nofollow">消息中间件 Kafka</a> <strong>、</strong><a href="https://link.segmentfault.com/?enc=MrRr3Mb8Ri6fIiSPPbbkcQ%3D%3D.kFam0dY3%2FKxlEd%2BVy4THDY%2FfUL42Dzx5UAP4w%2FkpnKltnoXZ6NTugY8Qta9tE8Tq85AifIJ1kq1XoosdtObE9uE0WI4yESOOlbhXU0r011zPVfgYpCAfyIsxS1j6JGoCh49HVnd3sRan6Hf760fXu9YX9gI%2FoSNxlHl4HVeK3%2FqYQKDpfPrSmQO11cZc1bqVU1wvHCD%2FW94MJWJwp42x6Z9hTGKF1PRUGdhhha43rOG5nSZTOZNAraAYUZKyj0a2u8VMMxbJ5LrEm2hdA2SrFNxR54zJuUh7ykYHnSuAuzk%3D" rel="nofollow">分布式协调中间件 Zookeeper</a>、消息中间件 <a href="https://link.segmentfault.com/?enc=6UVr5Tde1%2BpHq41Eo4D73Q%3D%3D.ghgGLA4xyPD%2FF0hlODh9uxKWJzNuyzHDm5a2wFd%2Fb8q%2F%2FMeKW8tDil4vvW3FMER2yTdPHiexWlGkQ3NeEDhwN8u5jApat8veeKhiWktInqE44S1M%2FC1H%2Fh1OJnbBQAZUQD%2BZsovHZJVN472bK6ywE0J9%2FDZhfW0%2FCk7kXQOVd6nR8u6lllD4VoF7XU%2FrPLoiboqYcrFUYRnBV2DmK14nUrd1xXNXyM2hu0qIzUvR07a8RfHFb0X9%2Bbr0uwGfTmb2NpCDotniVeWzKsF9dzjFfCz4nSdQhM37ydPMDbVPDOI%3D" rel="nofollow">RabbitMQ</a> 等知识体系学习的文章。</p><p>在当今这样的就业大背景下,<strong>卷是肯定的,强大自己也是必须的</strong>。所以,学习不能停,必须一直卷下去。截止今天,又一个知识体系的学习之旅:<strong>构建企业级监控运维管理平台</strong> 卷完了<strong>。</strong></p><p><img src="/img/remote/1460000044383237" alt="图片" title="图片"></p><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>如有帮助,请点在赞、转发支持一波!!!</strong></p><p>企业的IT架构逐步从传统的物理服务器,迁移到以虚拟机为主导的 IaaS 云,抑或当前流行的容器云PaaS 平台。无论基础架构如何调整,都离不开监控系统的支撑。</p><p><img src="/img/remote/1460000044383238" alt="图片" title="图片"></p><p>监控系统处理能提供实时监控和告警,还能辅助决策,所有决策都以数据为支撑,而非主观臆断。在大数据时代,数据变得越来越重要,监控数据不仅能提供实时状态展现,更能帮助故障回溯和预测风险等。当我们充分了解当前数据中心的真实资源使用情况时,才能绝对是否需要迁移服务、重新调度资源、清理垃圾数据及采购新的服务器。在故障发生后,通过分析历史监控数据,可以准确定位故障源,确定故障的发生时间及持续时间等,从而避免后续相关故障的发生。</p><ul><li>从监控对象的角度来看,可以将监控分为网络监控、存储监控、服务器监控和应用监控等。</li><li>从程序设计的角度来看,可以将监控分为基础资源监控、中间件监控、应用程序监控和日志监控。</li></ul><p>从监控对象的角度来看,可以将基础监控分为网络监控、存储监控和服务器监控。更多关于企业级监控平台系列的学习文章,请参阅:<a href="https://link.segmentfault.com/?enc=5HXgxwwzqxdQzFmvvr7E4Q%3D%3D.ogVe3sljioxJ0ioXdj%2BSwgqFDU95ienpT%2BHqD3XK3405caGwcP0%2BznhgdeSncu5lmvyb5XpP9UBl0n6Z9HnU6PhwdxgHj9fPNG3R9jseHdmsBXjHm%2FdY0wAEO3Je7%2BnJ4a986jMJvX5RUFhqjSLCnN9dUSdmz3%2F9Mng4mBMjRYw%3D" rel="nofollow">构建企业级监控平台</a>,本系列持续更新中。</p><p><a href="https://link.segmentfault.com/?enc=AeyoNkOlKx%2B%2FXXGinAb1Qw%3D%3D.4Zsnm8m8OBs6DTbEBnk5ZTQyd6sDeU3SLl0Sax998Ei%2BzEcZMJhcrwFsEUauPIbcvVTvs%2FSX9q5LbAFPjm6m6o2kOy8Vum6p7XzTZIRIySkvMlfA1dXF0PuzaEe7tX3ttbJACV9PKBk9qBlCwQb6qQta89Qu%2FpNxnsi8sMy4PfKrTY8ivaKH%2Brs9%2Fc7yN9uQSn2ToaAoh5XPEwZ7BDTPi%2F7ZbV4xzM%2B7RhyqfYxjwqyfC05nUtssnFxe2KG6UNwoftqubsVjDCafI1bYiPvtdRa2EciYHE%2FUGLf0VzSWyoE%3D" rel="nofollow">构建企业级监控平台系列(一):监控系统概述及发展趋势</a></p><p><a href="https://link.segmentfault.com/?enc=kvajFMCnfECGqlpeGae%2FBg%3D%3D.l%2BuJVY9aS7yTdmSgJleVBbtiGQcqfNM9qniZ1blSkiCP78PxArNSKRLBFOLOilWc84Nx0MSozg%2Bj3d64X5zZa1h4A%2BY1%2F%2FzvanDUFVOTvjDgB4s4IOjsQsF5wSH9Y5M3OPfhpmXS0yqstM795QNe1w1YfWZcaJvcrM2XhwrjIuifqP%2FUTmDPaqADmrKdizYMQFCPxu2m8S6zJryMS41aqWGoybUwkKxM0oU02L1%2BOI9R9nmZv2blIF0P6B9Io6%2B0jfMQ3w1LcIVtBz9d0PNSmZli09Lu3fFBceIgqaqOv4g%3D" rel="nofollow">构建企业级监控平台系列(二):如何做好企业监控系统运维管理?</a></p><p><a href="https://link.segmentfault.com/?enc=h7S%2B929DnPOICVYFipe0SA%3D%3D.zinWuJtrg1iBehNFJ1q2S6saVkwpaT9oVRYSGQ2ju9eRMzNm0IMU26SzcPXbOu1xfvjcjnSI%2FpuDjTpdqD4m%2B5MbK%2Bjxeek%2FXQ%2BEKJcQfcqIDK53iLbh0J0UyNPLsjWcLVXXKK4kpjAtXYrtwvED6bs9kraWt4lQCEx0NOKhrw0HHF3qrCy4JAsH2ktFDL26cK9p5JDFwGvsfKCDm5PZ%2BfD273a1CC48IdNlzDchfH%2FCTokx%2FzmQPXRxu2Ag8VY%2F4xHmG00E9OvycajdrESf1mwyCA6b8Rg5QdEu2kbWKpE%3D" rel="nofollow">构建企业级监控平台系列(三):企业常用监控工具介绍</a></p><p><a href="https://link.segmentfault.com/?enc=RR74qLWLxvkcdjukTibwKQ%3D%3D.BD1PwkvmDRPKNKTCmszXrXT1p5QAfAxaIDB%2Fy9nYVP7JbNmfdgmy0zNQwyJ4xT7yNVAOfWstlFEQR3V%2F7K4goVzDnhKlb3iEMfwd%2BbwWrb3BdGI0OUVnBq26T6CNVbr6OPteD%2BvtIKhYyU2aTsIzkec349nuHJuZLCYbdlfrHAJX8PCjncBi5ZAHEoOZ9C7OJIMjHIorV1VO4XYLX1EQh%2BhcFrfBPVlfbwlwNjcprNgWYc4COv4VZgtctd7KO8F%2Bh8L2rrVQkJEkJ9nAj%2BURaG7jX1lpdHv%2FyBQ9VwDhPa0%3D" rel="nofollow">构建企业级监控平台系列(四):企业数据库监控详解</a></p><p><a href="https://link.segmentfault.com/?enc=h5xuzgIKpQIJHcxBkd4yBg%3D%3D.32qPQgug2G4kzc5TR%2BYTk8D5K6W%2BmnBFjGymgC2%2FIrhrnw9mT2rGGQYGGrEFtzUSCsf%2FO9np7WU5eMy%2Fbv%2BZAo0%2BwotdZc9iVE9a%2FZixJPPp8ZIp5ailYa5Xn1GrQAkDnK6jyNfq0KVpB4N473%2BHlXLIqt6m0D8S6UgZp7pedS3ZVvmpmhlQbOdq%2BHOcaSGubOSxByagRMSieI87%2FrgW0HMeZFMJ7j%2B2YoKScN5sqshCi3KX12Kqo8TU8YlSLLxu5A7X52lb3F51S%2BP2yfWyUqX9jth%2Buw13%2FZO%2BcQgIzEs%3D" rel="nofollow">构建企业级监控平台系列(五):Zabbix、Prometheus 等开源监控系统对比分析</a> </p><p><a href="https://link.segmentfault.com/?enc=fnBqjAr23nAIqRJPCzESMg%3D%3D.HjGqAfZDcY8cu%2FiIkeAfjIW%2FHmUxkosQlD84xPNWprkJFh1RmDGM7nv%2FZ3qv22WyxU1pQtvA9L5bgNz%2BDwE56DjqqMILY3nisynqh%2FDNEOBWmSh4sjIgQBE0I6ZzdIebXGiXaUNMYGgaar4XYXHg8V%2BiDppSQMLBlLLcA0csCE3fQhbviviartNWuZ4qVyFqoWXvN8qLACeFHBFPAfcvIUUL2EedmXEsqyqZ8ton5BcBVBCOpXWr73gCh6x9Kny2Af0uuQ9Zm9iz4TawU3vpKclknL%2BFM13EGVY2yVcoIRM%3D" rel="nofollow">构建企业级监控平台系列(六):Zabbix 简介与安装部署</a> </p><p><a href="https://link.segmentfault.com/?enc=EMa6mQx2Wwiqd7v%2FnUT%2FHw%3D%3D.AczKKHbtaW5pUBESS%2BTncHTMvp6vt0lTk%2BwzujJO58jcTAzDFmdqx4d5L0rjVv%2BlEZzfX1nky9SdFlR78i0NnagtDewGdVw9sSdK9kJm%2FU%2F3cteItPznD04cn8NnV4IfCUyPab%2FyF2zRPRHiG1gwHebmuIUApB1UkmoiaUPk4ZMpiOljJVl89eHi6A56TRmdLEJeC44bFpmrWqWnl0O6R4FROkhc%2F0LrlmfzOr7RlgVB6Nib6G7I0cv5hrkCi6APkt0Tc8MiQF4KXkMC2cm1D0j1F%2BiTo6toy276hQ0eyEk%3D" rel="nofollow">构建企业级监控平台系列(七):Zabbix 基础配置介绍</a> </p><p><a href="https://link.segmentfault.com/?enc=i26pTk822l%2F4BecgtMqckA%3D%3D.pHnDGYDXg141Y0H2OI%2FjuBK7kFOAYRbh%2BQO8CzgE1QEEWxoUyMXZhR%2FaW561wYgLM2DqCkIIh4EF1wr8vpFGTrgvLEnemF79kwitWtgBHv2bcse2zqq%2FK8dlXU7SXxlS%2BTOa0Oxn1kz2pcKhADCD3dqMQBTiFH3l8wXW2XTiwXbIasfreRhq7nxSUzKm5C6PCbhKJKYGBMyF%2BYD81MrDs3WD5rkI19C1cpli4Dut5FNQHQC%2Bv2mox8XNo06d3UCfD%2FYBHny5iGHKgW2jzgV0dUV7ir0%2Bid8E94Xh8segncs%3D" rel="nofollow">构建企业级监控平台系列(八):Zabbix API 使用介绍</a> </p><p><a href="https://link.segmentfault.com/?enc=MupqLEtpOS5oV5PLhRpisQ%3D%3D.5qEXGSK4nE1eT61P3PWmucVwQaRCyTZvRwfIJ6nq7JFwxh6wutvmWnFHuwaWyRBQxT2InVC6Di8ts0Of7GysF8z5yxjhfPMcwjEpFqwuXwI1phGmtXNz8c4rjdaP1REU%2FQ%2FTtbIYO9o06GnA%2BGYEI43pORgfETd17p16IBE%2BoHe9GCa3haLQDhK1crCKCglRhC3krMApfqkX%2FZJ3BNleVqmQIBxJbaQ9qKbS1yzejWfGdrTkYFsVtCeeaDK%2BFBArhpkW%2BfyMJ0NwlszfETOPL249kA8hNGlp118F7PT%2FttA%3D" rel="nofollow">构建企业级监控平台系列(九):Zabbix 自动发现与自动注册</a> </p><p><a href="https://link.segmentfault.com/?enc=Gpxe6vG5E63OyisNdZJJUA%3D%3D.fkD2ugIco8Nr8a0ylmQiTqx7%2FRnBvvbR5LhnCnE7IoL0RCBl36tSbgtmPG0KY1uiFJTfspzsaZBF9Cx9hyJNQYOlcHLl8xatSwr%2FZsEQ55%2FsIqf%2F6D8sZ0%2BrvX0VacfS13LUD79RDUf%2FifZuxUEPSj15K897AdoBNdNmyHXBQlyiUSU6L982WJQ6VHpdnJ%2Fi8xRraBARMs0gSSi5dDwROuDxjFfyxK8kFVMv%2B%2BvB8sMFJwgA7JCkN4AidL3hNxWPbOEVUe8PmxqhSA0IzU2nHSAQzXwGA7L3DDSy5jEGBZ4%3D" rel="nofollow">构建企业级监控平台系列(十):Zabbix Proxy 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=BUDqe%2BLpjEO6hS2R2xGHiQ%3D%3D.2BJKv8nuvyRp4%2F7gFSR%2F5NMUAv9uXZo4LlnvOs1w%2FZWtxR4dfdkbIUFjyWTfc1z8YahRGYHXu%2F%2BjranPR%2FIQbEECtZuDxcf%2BN4YXlq6mZ9LD%2B5ICDRGnbRHe%2BS3JFf9rZLheGVLPweRyda6fS2yhgd5BZ5IO7qURvzP6fTcHsPh4pc43KxD3X3%2Fwdi9QYp%2FNT6zgBtCe6cJ816mNqdK2qi0dlovQHI%2Bw1W2Qhp5bKBnpnn72%2FIC4vzHGfkR3ZeSTXNaAwKYag4SiWIQ1VD9bjoYvU1Af20YEy1%2BbSIM9MxI%3D" rel="nofollow">构建企业级监控平台系列(十一):Zabbix 配置监控 Nginx、MySQL 等常见应用</a> </p><p><a href="https://link.segmentfault.com/?enc=HOxqR%2FTrwqDKOZBdB65pHA%3D%3D.47PF5YciHDVO7n%2ButQ2QXnpiua1x7yTpklnuIH8owaE0FXalR4Cn6FU5eJ%2FmYkwlz06SYUXcxtBoUA6O7otO8jF1bXr%2FvrN9xlN2erzQAIyIgN%2BDANVvzMDGC%2BK1GlJdEn5zvyYq%2F4vDkxi9zm2eTPHu%2FzZ8%2Bd2xyfhaIdGnMGjObATM%2BPhvh0E6N0TZVTH6U9OU7WXs2TIcyJXudQQNE26bTetEm86ERm4hKFM615T53RU2xhznQotgFqHp3xkDFr9jIzdQC%2FncJWFirS74%2BaDWBIM3Ny6Nsozuy2fJz2w%3D" rel="nofollow">构建企业级监控平台系列(十二):Prometheus 入门与安装</a> </p><p><a href="https://link.segmentfault.com/?enc=hxdI7JvEIPFP78l4STOKBw%3D%3D.e3dmhWTPaob2kc2M2D2fajcrZPJ9%2B4YKK6jTOP8X93KpIBD75L3B6cBN9wpa1bdTHLiWiEVFT8IFw5wwny%2FQbMfm%2BGSCUHq8QkWiUGUFTdRsKoPfAacXaV%2F%2Btw%2Be09vYx6F7n4DxsC1rBqlYPOmQesfbYGe7R5hWwgzfbgSfpobu%2F32YwY4R3PIXrcFGDqoPkZL3fxeHnr7NidE4FkOVHff7aFJiABtUwRXqcM%2Bu50RWjXMH2RVgk1dCe5ygQ04Y%2BA6m1z6tLgzToftgA101JDzM1RbumEXfJnGWR2WTjsI%3D" rel="nofollow">构建企业级监控平台系列(十三):Prometheus Server 配置详解</a> </p><p><a href="https://link.segmentfault.com/?enc=mvidWMWWQnYAyswXtJgWbA%3D%3D.UIa5%2FcGFgU34%2ByQmn%2BI9QcwQ3DWUBGArfG4szqwyYzxv8Sdub0FVRibXBWrix9d7535hFIhm4QU8VGYslXrncfZvzvSzvskUpojbFs9JymLaoSB7QUwBVPc%2FrPMkgpBr95xy%2F6SoVk7QMfI1RvdQ60nxaY2VfMviemeYMOzMfYxieRyyXEef28OOrL0MVH1MgCP96hR%2B28KyT9cdx%2FjaWPeXqsNh%2BVE%2FyPjjh1MmFTX%2BTSE5WGcismC5%2BxPVGKPDyU1OP7rxNybYHzZug2sCC%2Bl09L98KLNODzNn7H2x9Kc%3D" rel="nofollow">构建企业级监控平台系列(十四):Prometheus Operator 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=KzRqNJ7FQvkRlrvWSAqoCw%3D%3D.m2N3j85SsEjAxmH4UxK%2FoEVcOD60dodSlp2T1Aeufu2Om148SnVo3Mw2fcnWGZOP8mL61X4V6RRMi1pqoyb4sZLVf1n23tvD5YBPVGYOKUcuIz3RmkoAKSnttFLmToG9DGB%2FSfsbvdLkMTMJ6BTua8abD3iYGdJXH9CodM7p4KJ2eXIayxU8sXvhotkxkVGXRFI8KybvRzDpC1aLlSXUW%2FT9lu3iCoX4EiYtwQ9d10kNy7jStuFqUqcK87psIv%2FsZAYC2ne2eeyR8mP7If318%2B4zuVNSnkhiDay%2BUJlORto%3D" rel="nofollow">构建企业级监控平台系列(十五):Prometheus Exporter 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=f694G7hclfDft7MYsFpFCQ%3D%3D.fBlqzgBy1HwmRepxmGkCP0WeZWXEtOA2HQS71O9X0XexLzP1%2FrkuMHnwmic3ZhDsj%2B7rucY3phLapZ2IaEG1FnJPz2%2FrkkA2C0Z%2BDGpONTN7WeEyAFz5Dl6WfuQgJ8wFKQV5JtWX0AI3Vh72Z1fVFeZBuhIUGHikgKhQH91CX9BKny4GAII3m3isL%2BZ5Iz45jxRT8m9VuBDeVBTtbDfW%2B8ssy1EYMXy2OLcfD2Za9lMzodlFSlITrY1RtNoux7FDj8a2yJ6b1p3uRwsT2WWofoZ%2B07q8OcgBJ1bdsUU7ukg%3D" rel="nofollow">构建企业级监控平台系列(十六):Prometheus Node Exporter 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=By8Zd8F%2FXhoF3r6LVBu67w%3D%3D.a6sPpRDRSQVozH%2FSHnyqQAMi5EFWvrj13bocjHoBLZWyxvxHHzUeCS8UY8fgNT4bA%2FN7xSYGQeJpR75rSjvaCE6ad2%2BgsxBVt3rM4ZWc40yLd7pUCy5Z7jc8SszvoauMVzEhl00CLdH1R50dFLHKQyyv%2FS76Ul8ThPlt1OR9DpqkaM%2F%2FT32ipLZhKq7B8klXvDJoN72zaaHawFA3qErbE5er58cafhOYR9sbuDvb8p1dgI7iBWTz%2BJLXQqv8Bqu0X%2FMjWI%2FmyTB4IuUiYtyIyxofc2SV9WpGaQq8XkyrL70%3D" rel="nofollow">构建企业级监控平台系列(十七):Prometheus Label 原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=eb02lcwOx%2BXBdktvq2%2BhZQ%3D%3D.ttySrzBXkMylkc1IRNUntRVPzTKVk9C89%2BTh%2B4RN4vudBu6yaRNjcsrc32kk3VsRItF1ZQtfnAuU6I2r07JV%2Bldyusd71cncPp40kpJFjI7%2Bu5W%2FywzZXoA7ZHbeVrqnfx9Dg6brsQkH5YZEP08aY3kjCZJqAvCQrGxLmp0684w%2BHOluBcPM3oJx3q4bsbtR2ynk3yF2SMOS6JuTbvVNpApRxSYWLBxkM2oOx3utKnl0%2FdSzRyjWNzG0x%2Bk5J%2BncDzyQ%2Bw92t1%2FWjgZ%2BX99LunIra3vakIa%2Fbq7BIyrH4aE%3D" rel="nofollow">构建企业级监控平台系列(十八):Prometheus 数据查询语言 PromQL</a> </p><p><a href="https://link.segmentfault.com/?enc=yp7BblSdxjxJausUn9VjuA%3D%3D.TxJp67XmKPIP4cZuFhhV2dQWO1gM3o99o5ehsNCWiBQN6FREUTjF%2F%2FPv5%2FfRYP0NhC1dwdXE01dIK0DdH0a5NTL8S6%2FIl1qfVW4SNrbqffSEDU6AE3ku%2B2Dh68bH%2BWXwY7kZa5OriitmDhFXAzJyXdcCfauy8vN2xxXaY4%2FcHYrau48Iy%2B5wrwaofgSOnRbXAhpE5cqVcfOhOROpOXtoeatXmpyCYfERXyxAByVMc1NiczAHZ2bcqMoTLG6pvEDBdK29viNQ6%2BK3DGDzhUh3ysL1LExR0oP3NWQELmZPwgw%3D" rel="nofollow">构建企业级监控平台系列(十九):Prometheus 报警模块 AlertManager</a> </p><p><a href="https://link.segmentfault.com/?enc=34vIyRolhG3HKvgO7kpM5Q%3D%3D.0J3XJmRVa1t8VuZAHNEX4aRWizNMkIY%2Fwg8igocz0RimxJT%2FaePpnpBRMAv69b47GEZS3D0M4CEHno1ATFF4wS0LFJnX3QQWchn07QozQ7ORCemjFaN%2Fzp9eYTfO1IjP%2FEyD9RcZoyUBdqa8zaGEjOMx6j7SkLfRqtnp%2Bw1hAl6GOFhG3w747dfr%2FYzuM5R3R8gfHOkua9A%2FCqDTT98y7CqoxLOjMq5B65CJG6hJbF%2BuMvv2x7Meu8Vx07GpdUZcWROm63NgVdcGt4jBf6yb37PsPb9Vc0gyXfJPhgne%2Bg4%3D" rel="nofollow">构建企业级监控平台系列(二十):Prometheus Alertmanager 配置实现钉钉告警</a></p><p><a href="https://link.segmentfault.com/?enc=9jymQTgvm33Dfy%2FhRArAqQ%3D%3D.E8aoYHQdlaV0uKOQy4pYJUke84tXWx7Sjk2p%2BTgtGqStxs1iQfxnq%2BCpRReJGv4jw3FUvln3m94Vfika0aztcxBxqjLKcVKX%2F19ocQTFCiJ5lDRf8AONLekSHaxWscAs8VYlgcdpTLPP06bGrMnxSyvb%2BiA70EOaj8h58u%2FSOkmeHo3IcAAQ40%2BVF8L%2F3Rp3trdr8%2FbxK0%2FgZdEF20Uzhozaxihp07F9DyzUPY1vyWVL6%2Fz4uPIFqPTJrUKPREn6GU2sIscjcvDi1At5rRFzq81bOBpKUEmFZx3KJsZAIJc%3D" rel="nofollow">构建企业级监控平台系列(二十一):Prometheus Pushgateway 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=2Npt7w8zO%2FJeWz9hjubDNQ%3D%3D.Yn8%2Bj8czeJvJbL7DdbYVbXQ7XaWoulF2sfzS1J40t8KlcO7%2FHz%2B0DzBN9AhfTE81jXKoE1wWdxvRPZ8jY8mCvgIx%2BY5RG1ivof9HgJi%2BLhu01bwNh38ekKuUNo9UDx%2F6Dn%2FXwRt71PQ9IGx6gz1anSdui9leJaNGxhSxT0xUJ4CIDE3PV7TQoEkiDCiodmfcPZZ71ErfW%2FTrvouP62EDPVSYCp3fpvFDPwQk3yS%2BKPELHLkVnKNmnXcWaGSbWbaJCgTy8E7ERGIoSwvpSxoNDDL%2FLuO2DesLNZr3y0B%2BJMw%3D" rel="nofollow">构建企业级监控平台系列(二十二):Prometheus 基于 K8S 服务发现详解</a> </p><p><a href="https://link.segmentfault.com/?enc=BR2KZF3t80RZ0ExfuWCyAw%3D%3D.Feowj5VpFy1zJD3zX3bHi853S4x7WyN%2BNDmJDrk%2Bber4ImL70R9HDf8QNHzTXmCjXtkJdkEwzUBNi2F3fvE0FJL3TkqLDDwwHNY8dowJbtNfZ1hfzywf2J8ZGVYwVW8jHRUovQSd2NTj7CrAhtyj85ofHb%2BOkUzOXNCSa80euBMvqPZZ0iNjwJpsknHKsfE2ICyb8KDqq5AB5mCReJHT3W2axtVx9zO2MVnHbLftPSCO1XpYczU05p5SI%2BU9iNokJFjLh9a0gkNYoMVS39k2%2Fknyi%2BeNZ578bZOsHKt%2B3l8%3D" rel="nofollow">构建企业级监控平台系列(二十三):Prometheus 配置监控常用服务实践</a> </p><p><a href="https://link.segmentfault.com/?enc=S9IT5jCCuymmpcA3iNI1Ag%3D%3D.g0boiz4lZlv2CY3hK9Qi9m9o04aBGsNGfs7O9JUaSJJoGRUMZQ8k7gC3%2BzarScGc97HqaLPbNaa3OQnz3MAwPoPyLXMoTljXAWMXiM3gCTSpi5iIdkONyCKT7lsI9VyjBKLbpHtG3Vxv0iDX88f0Pq8KhQom7UYiGU6KTwhiaN6CdbadpOyVu%2FFhDu8c%2Bi0cJ7HL4QSQju%2BqBgA%2F5zoCdOKTvxEEluOkn19RLp8K%2FbOEy8XNm9DpK5lBQLhW3%2F2Xl3UhkEIS2Vx1sff7RSW9YhpcGdvRHcLhh6bcB%2FAF4sU%3D" rel="nofollow">构建企业级监控平台系列(二十四):Prometheus 配置 Grafana 展示与报警</a> </p><p><a href="https://link.segmentfault.com/?enc=nhwudPWlpg4owEk8%2BI9mxg%3D%3D.H9NNO8ndT9e7PR6dlfVlIXFV7viV2PVeD1x%2Bfb0ISFv3%2FBYY2%2Fzgx0mWXNKBGAPSFZYRodE%2Bww20fhVueoyepTEKh20PFclkgClwmJQAHzHhzi0CTgA1TOozRsqZKhV19A1dt4JImCBDwokSGtCaGZlFYB70k8oz8PaOabcXZLeZRFZde2qfDB3uzx4Jsdt0wV5qvstNTo9UcMWC7OnykpCBwvKGf%2BLXK9BY54rpW%2BD7XWAE3BWwHEIe8%2Flq8XILl%2B5vl1m9dnTiSUdpmVosv868f3BufX0bYgeBKR3ajDY%3D" rel="nofollow">构建企业级监控平台系列(二十五):Prometheus 高可用集群方案</a> </p><p><a href="https://link.segmentfault.com/?enc=nUeotnANEq%2BZ%2BGY9hEyfeQ%3D%3D.LkBrHlOSbkNIHR9i5aXmiAtKDYJRRhqz0mJVn7uiDhE3MXfyraQvNF791q9kO8BM2ILmsvM0j%2BokOBJekNKWDlva%2BSsIElZGYf78yDXzmSXDnIc3LZfQy05m0CVh8pEvWCCXVB5O%2BLyviNGzuB6qUJ2Nh8KUZZCWCU6z7AEciaqcuG02L2jlv74ah9vgyNKyeygCGgNpas0HjiQisyJ1H6S0x4YKkkQKtyftc88urmRyuQGzanfKYDgO5hrzaFK3vYkioFdWpx%2BKRVsxREyWmPOsY3g3lWiUgOCFhjfkJE0%3D" rel="nofollow">构建企业级监控平台系列(二十六):Prometheus 高可用架构 Thanos 实践</a> </p><p><a href="https://link.segmentfault.com/?enc=%2F%2Ftomh7C6k%2FzuFPqtrhYZA%3D%3D.IAhLsW35lmUtN%2FgCReuzy6yOh9BFKPrEKCliXz1FG%2BD2bNK%2FBJ7ZTQWC847Bu8VyLNxmPHR9xMXNfBj0rjbLUhqOGj3CYpIJclN1zzRac2Eesj6pKZ%2BMQBRMNscScaZtF%2BTWqEmxGMHQxuSQvF0J%2BBG%2BYkfP2lv53eprWqOEOHGJLjPALOeJmrtLFIBmCRWpuLbi91%2BRaat5M73bgvbXDXx%2FmKTNEfJziZEEASVmnR1fwNwc6b2A0LGMlaxnu%2BbeeNcvBrMvElikf0Y3JVE5lgviEyCJwUVD4OYWq5hzia4%3D" rel="nofollow">构建企业级监控平台系列(二十七):Grafana 基础入门与部署</a> </p><p><a href="https://link.segmentfault.com/?enc=x0w1S%2BETWc2rlZXbE09Ymg%3D%3D.vbaWzu3i8fiNjwh5ITRMq%2BOtXgYIC019ifoxSCuWFIZjR3tnGupDwVcQzUisM45JX%2BiqnpYdVE%2BrSF3HOcnDy6Ut1Uvl6SOOIrRJNsNc1Zlje6OH9BsZ9RBShmij3F5Ei3wVQQvdKkD%2FOCtJQRokZkGlBuCvOnI%2BjzGOg2HbuzYTHM%2FI7eCQEmnh2GDb%2FOHS9q0EarL%2BYZUWhzqfAOquqAV1HIH0JFdFWOfz5noA2RSklWOpOI1MzuFwv5ZmjM2V79Bb3q1CzO1y%2FvUKuiA6sjpGFklVW36eEpZgvcbuxyU%3D" rel="nofollow">构建企业级监控平台系列(二十八):Grafana 仪表盘 DashBoard</a> </p><p><a href="https://link.segmentfault.com/?enc=Q8nV0TWMior3y2s7BTVkIw%3D%3D.j9cRnEbKqqfiktCf0AETZYhySgdWynDVouYtUzc4P8Ptxf1NF%2FAUeZ5rVcpVZ8VUMmuddE3aOQ0lRjM%2FCb8Fc4lM33hPDUqRKpsH2g9GzGgC5G%2BaFoOA7X9iiwRkOah0kmNkUYUJ%2BqqsLJv4JpKOD4vSUeRNE%2FCrnGAUgu9CIKRBR0qROUc2ra6WPpKUzn8hiBKoY2CDZy2YvBRu4aGAZXwK9rDT4OlDGMsX%2B6OZ3Xhle1lGn%2F4UvFclknXjYcF4g6l43Czx2Bx3sLMNaaGCL%2BKBOFk0MYhZGJZpvMdxoQU%3D" rel="nofollow">构建企业级监控平台系列(二十九):Grafana Dashboard 变量</a> </p><p><a href="https://link.segmentfault.com/?enc=wNLlOn6twb4%2FPMLP5o2noA%3D%3D.SbKDl8Otf0T5dAOSUZWj9xYFwPWw6vMm%2Bk2t4n%2FdTyOJYLGeGq0zSOl9rHhQagirYuCfgTICA8iGhNABry1MlXUWsn8yh%2BuljGae3CTOM9p7ocPRHMfFfPgspklCdwY6%2Fx4gMMHu1rik5KpZJ2LPUJrJHxdnl%2BlysXZq39kBWvN0RIJ1h1LOA8JxajN%2Fk963uEYIWseij%2BbgPyyRqzbb2Jo07gKastF8efYnmfiyU1EeL4z8wRSD%2BnnsG7vgizevz%2BQc5Ntpx2cl%2B7m98dbgP0Bq4XPF2jYlIcECBlIqyn4%3D" rel="nofollow">构建企业级监控平台系列(三十):Grafana Panel 面板和 Time series 时间序列</a></p><p><a href="https://link.segmentfault.com/?enc=%2FDPa3FEZoEPemnLvULGytQ%3D%3D.IxK7Q7dMTCOQc6V4lesCHc0is%2FIXHTiDsSMoXp5Dz6hDGwNhyCY7pmSIr3Lou0U%2FgJ1iued04OvRojm3RF9kLEeeZsEZpLf6MYwgXSDbg2d5HuOk%2F5p5RkL9IftXTYF%2FRhB9hv0jBd2SpiA5NcGE4eZWdsYrOXq9IicOfskTrx5OS1wJuPbkO19FTpqsrGbX%2B4UtBVsjnOzqmuP58mpzy2tPwplqNB2%2Fx3k8b3DI%2BofNdIM8Zgrurte7dKAMaQcDWLHcHJiVtCuHMwaHyQ9JSJiDxZDtqAB2ZmjYr1alOUM%3D" rel="nofollow">构建企业级监控平台系列(三十一):Grafana 添加动态参数详解</a> </p><p><a href="https://link.segmentfault.com/?enc=Pn9%2Flz75L1rK22VE%2BFb5Zg%3D%3D.nRJFErot%2BbFcqDF%2BETl3dHulZdJoh97J%2F5xh0cg2o9rNP1qXph7YS7qvSOpojb8qLHTM93KwTKt2%2FZAhKm0pDBj2WJKwSqgGeDzAZBkZBATlcCnF1OqSFlTnBG0rszIUZYhPCDG9fLJj7rvjN4Z%2F7UJx9TDGNzMzFv0tow2%2FWjCrBdy0TiFvimtHIGq18o%2B2O2uIGHBh2AWYS8JGflxIfqH%2FYn8KoIXC0gtpx92vQFMthX%2FZeR9oa2VOgIskCKhyW5tYDP5RqoEXWOj25pSsp6AsFF76k7zu8Hd6hDEjNzc%3D" rel="nofollow">构建企业级监控平台系列(三十二):Grafana 可视化面板 Heatmap 与 Gauge</a> </p><p><a href="https://link.segmentfault.com/?enc=TvfxM6oWivT721IIDfY3Bw%3D%3D.uungG%2Bwc2d2pa2jI82mNIKqBlxt0l0dmtQVeh7AxjT9m9dqvtvF2xro%2FJu4Nv4dRQrNVHY7c8cJ0VDwLNgvQiki5hj%2F54V5D3GAKqUj%2BSMce9wK4KFakP%2ByolvIizO6kpX1WN6oOBKXYyY7y3LKueF9X3j07kCQRNKxj1Lo25GBZ0xBcxlRJV2ZIchOo28i7Bjx%2Fbh1%2BkR6QzPoc9m0%2FQqnwL2FeKjG3NcYGve0SMI4PbO%2FpqU%2B8d6FAs06bIBzi9EgceB0k8JUQB9QEUKUq5VDd0gmciQgwL3rnSYHAKSM%3D" rel="nofollow">构建企业级监控平台系列(三十四):Grafana 数据可视化工具安装与应用</a> </p><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>如有帮助,请点在赞、转发支持一波!!!</strong></p>
一款超牛逼的组网神器!吊打市面其它工具~
https://segmentfault.com/a/1190000044369501
2023-11-07T13:03:24+08:00
2023-11-07T13:03:24+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<h2>NetBird简介</h2><p>NetBird 是一个建立在WireGuard之上的开源网络管理平台,它允许计算机、设备和服务器通过快速加密隧道直接连接,无需配置或中央VPN服务器。它使专用网络变得安全,并创建了一个专用网络,在没有手动配置和专家的情况下应用安全实践。NetBird网络普遍适用于云、本地、边缘和容器环境,省去了打开端口、复杂防火墙规则和VPN网关的麻烦。</p><p><img src="/img/remote/1460000044369503" alt="图片" title="图片"></p><p>NetBird 没有集中式 VPN 服务器,您的计算机、设备、机器和服务器直接通过快速加密隧道相互连接。NetBird只需点击几下即可连接在任何地方运行的机器。使用NetBird部署安全的点对点VPN只需不到5分钟。</p><h2>NetBird 架构</h2><p><img src="/img/remote/1460000044369504" alt="图片" title="图片"></p><p>NetBird 服务端有 Management,Signal,Stun,Turn 四个后端组件外加一个前端。</p><p>传统VPN与NetBird对比:</p><p><img src="/img/remote/1460000044369505" alt="图片" title="图片"></p><p><img src="/img/remote/1460000044369506" alt="图片" title="图片"></p><h2>NetBird 部署使用</h2><h4>部署要求</h4><ul><li>A Linux VM with at least 1CPU and 2GB of memory.</li><li>The VM should be publicly accessible on TCP ports 80 and 443 and UDP ports: 3478, 49152-65535.</li><li>Public domain name pointing to the VM.</li></ul><h4>安装</h4><h6>Linux</h6><pre><code>sudo tee /etc/yum.repos.d/netbird.repo <<EOF
[netbird]
name=netbird
baseurl=https://pkgs.netbird.io/yum/
enabled=1
gpgcheck=0
gpgkey=https://pkgs.netbird.io/yum/repodata/repomd.xml.key
repo_gpgcheck=1
EOF</code></pre><pre><code># for CLI only
sudo yum install netbird
# for GUI package
sudo yum install libappindicator-gtk3 libappindicator netbird-ui</code></pre><p>脚本一键安装</p><pre><code>curl -OLs https://raw.githubusercontent.com/physk/netbird-installer/main/install.sh && sudo bash install.sh --quiet --install-ui --setup-key=77C9F991-DC68-46FA-B06C-E02FC102697F</code></pre><p><img src="/img/remote/1460000044369507" alt="图片" title="图片"></p><h6>macOS</h6><pre><code>curl -fsSL https://pkgs.netbird.io/install.sh | sh</code></pre><pre><code># for CLI only
brew install netbirdio/tap/netbird
# for GUI package
brew install --cask netbirdio/tap/netbird-ui</code></pre><p>详细的安装说明:<a href="https://link.segmentfault.com/?enc=CG%2BbnJycLDylKPOFRp%2FacQ%3D%3D.UOsJsICMpzhJWjyafvLHMXr2GB4tAWmwMi3w0TvP81Pn4j9ncv99P5uJVGVIOG6v" rel="nofollow">https://docs.netbird.io/how-to/installation</a></p><h4>使用</h4><p><img src="/img/remote/1460000044369508" alt="图片" title="图片"></p><p><img src="/img/remote/1460000044369509" alt="图片" title="图片"></p><p>刷新就可以看新增的设备了</p><p><img src="/img/remote/1460000044369510" alt="图片" title="图片"></p><p>参考:<a href="https://link.segmentfault.com/?enc=jZ99W8IwywLEEJjU2bjxmA%3D%3D.69%2BoG9bTZWImWnDZJL76qSJgVAfglDSwp3%2F9ADwWBLet%2Bwuaq3nU6rk1C2gtccQHxaVMYYK4asJ%2BUPKdbmxYfA%3D%3D" rel="nofollow">https://docs.netbird.io/how-to/add-machines-to-your-network</a></p><p>更多的功能介绍与具体操作可以访问官网或者 <a href="https://link.segmentfault.com/?enc=xxZI2r7vknGgV%2FvG89uNZQ%3D%3D.7Y%2BUdzhvCjavdDMY8nx517dwSZGcvXX28r8Izyd%2F%2B80BHXRBw91o7u5Q%2B3dBXghM" rel="nofollow">https://github.com/netbirdio/netbird</a> 查看详细的说明。</p>
待遇最好的 10 家央国企名单!
https://segmentfault.com/a/1190000044369474
2023-11-07T12:58:58+08:00
2023-11-07T12:58:58+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>大家好,我是民工哥!</p><p>今年和朋友聊天,聊的最多的就是找工作,都说找工作太难了,公司某某部门又裁员了,身边很多前同事、朋友都降薪找工作,甚至有的很长一段时间都是空窗期,真的,这几年,大家都难,无论是企业还是个人求职者。</p><p>进体制内,一直是这几年比较火的一个职场话题,其中的原因也很简单,大家出来上班,第一就是图个工资高,第二工作稳定啊,无非就这两点。</p><p>这两点也成了时下年轻人比较追崇的,前几年,大家都比较向往互联网大厂,福利好、工资高、牛人多、环境高大上等。</p><p>但是,这几年,画风突然变向了,大家都在求稳定,像国家电网、烟草局、银行等众多央国企业都为了大家的首选。</p><p>前些天,在网上看到这样一份榜单:<strong>待遇最好的 10 家央国企名单</strong>。其中烟草、电网和五大银行位列前三。</p><p>待遇最好的10家央国企到底是哪些呢?看下图:</p><p><img src="/img/remote/1460000044369476" alt="图片" title="图片"></p><h2>中国烟草总公司</h2><p><img src="/img/remote/1460000044369477" alt="图片" title="图片"></p><p>去年净利润 1.06 万亿元人民币,也是世界 500 强企业榜单中唯一一家实现净利润破万亿的中国企业。据中国烟草公司官网的数据显示:2020年度中国烟草总公司在岗职工年平均人数51.3万人,在岗职工年平均工资19.67万元。</p><p><img src="/img/remote/1460000044369478" alt="图片" title="图片"></p><p>福利待遇相当好(五险二金、住房补贴和各种节假日福利),工作稳定,就是难考进去。</p><h2>国家电网</h2><p>也是世界 500 强企业,前段时间 <a href="https://link.segmentfault.com/?enc=TZvOqbwlHTnX0eqLWCaa6g%3D%3D.WGJ8D52jAJn%2BVPL9DzvImVG8pN5G7IVSAHD4234aAhlRi8FAAojqtD29umy6K%2BbH1e6LZqjhsTdydKfAQn1T%2FDcMXhVaIsLemcjxd3beVGmUyexvO7rt1l8nrbmB84OW5VnQMRbgTT7Z6rVBt6Vhge%2BG9t0IZNikdP2qAB5CWG49MMV9ogyyl5Kt6Ya2tzAT4CHrqd45POZKEdrLXnHQFU0H%2BQQGTPRjPaOT%2B%2BeT%2BcNWGGKGBZdfhhIU2TdzZVAKJgx2HkavBuZ8yfPJv1%2B4IqwcYV8g7sKdUKiSaH%2FBI18%3D" rel="nofollow">国家电网工资待遇曝光!</a> ,让多数人羡慕不已啊。国家电网的业务范围非常广泛,而且在各个县级、乡镇都有相应的岗位,真的能实现钱多,事少,离家近的目标。</p><p><img src="/img/remote/1460000044369479" alt="图片" title="图片"></p><p>需要网上申请笔试,通过了还会有面试等环节。</p><h2>五大银行</h2><p>这个不用讲,大家都知道指的是:中、农、工、建、交。</p><p><img src="/img/remote/1460000044369480" alt="图片" title="图片"></p><p>应届生的月薪转正后一般在7000左右(一、二线城市行情),还有房补和其他福利。比如:五险一金都是不错的,而且每年都有涨薪。</p><h2>中石油/石化</h2><p>大家口中的两桶油企业。</p><p><img src="/img/remote/1460000044369481" alt="图片" title="图片"></p><p>中国石化也是世界 500 强企业之一,据称员工最低月薪 6000 起步,加上各方面的待遇(六险二金、车补、餐补、采暖降温费等等),年薪 15万一般属于中下水平,每年都有岗位招聘。</p><h2>中国邮政</h2><p><img src="/img/remote/1460000044369482" alt="图片" title="图片"></p><p>中国邮政涉及的业务范围也相当的广泛,工作稳定,福利待遇也不错,不过全国各个地方经济不同,薪资待遇差别很大,有地方条件也比较艰苦,特别是一些高海拔地区的配送人员特别辛苦。普通员工加奖金,年薪过20万不是问题(年终奖都会比较高)。</p><h2>三大运营商</h2><p><img src="/img/remote/1460000044369483" alt="图片" title="图片"></p><p>三大运营商每年招聘人数非常多,一般要求本科以上学历,重点是招聘通信,网络,计算机,互联网,信息技术和其他专业的毕业生。正式工的福利待遇是相当不错的(五险二金、车补、话补、餐补、住房补贴等等),哪怕是老家县城、甚至农村乡下。</p><h2>中国铁路</h2><p><img src="/img/remote/1460000044369484" alt="图片" title="图片"></p><p>目前已经改革成中国铁路公司,和邮政差不多,不同的地区、岗位之间的薪资福利差别还是很大的。据称工资水平不是很高,但福利还是不错的(各类津贴及五险一金)。</p><h2>国家电力投资集团</h2><p>五大发电集团(中国华能集团公司、中国大唐集团公司、中国华电集团公司、中国国电集团公司、国家电力投资集团有限公司)之一,是国家三大核电开发建设运营商之一。</p><p><img width="526" height="300" src="/img/bVdakGO" alt="image.png" title="image.png"></p><p>工作比较辛苦,进入门槛较高,薪资待遇区间较大,年薪据称区间在7-50万之间,福利不错(五险二金、住宿、餐补、交通补贴、体检等等)。</p><h2>中国建筑集团</h2><p><img src="/img/remote/1460000044369485" alt="图片" title="图片"></p><p>业务广泛,涉及全球,工作辛苦(工地上跑~~),建筑类院校毕业生的首选之地。国字号单位,待遇肯定也是不错的。一线城市月薪可过万,二线城市多在6-8k,六险二金、优秀人才解决户口、通讯补贴、餐补、交补、节日礼品等。</p><h2>中国航天科技集团</h2><p><img src="/img/remote/1460000044369486" alt="图片" title="图片"></p><p>世界500强企业,我国航天科技工业的主导力量。员工福利待遇不错,区间较大,年薪5万-30万之间。</p><h2>关于央国企招聘</h2><p>一般社招较少,这个大家都懂的。所以,央国企招聘主要渠道分为以下四种:</p><ul><li>1、校招(秋招,春招较少)</li><li>2、定向招聘</li><li>3、定向安置招聘</li><li>4、少量的社招</li></ul><p>一般的岗位招聘程序有以下几步:</p><ul><li>网上报名,初筛</li><li>线上或现场笔试</li><li>面试</li><li>录取</li><li>签定协议</li><li>培训上岗</li></ul><p>最后提醒大家一点,无论是国字号,还是私企,<strong>好的岗位肯定都不怎么招聘,大量招人的要么待遇不好,要么岗位流失率严重</strong>,稳定、待遇好的工作岗位从来都是稀缺的。</p><p><strong>大家求职一定要擦亮眼睛,不要被某些景象蒙蔽了。</strong></p>
硬卷完了!RabbitMQ 打怪升级进阶成神之路(2023最新版)
https://segmentfault.com/a/1190000044325296
2023-10-22T20:37:14+08:00
2023-10-22T20:37:14+08:00
民工哥
https://segmentfault.com/u/jishuroad
7
<p>大家好,我是民工哥!</p><p>前面给大家介绍了:关系型数据库 <a href="https://link.segmentfault.com/?enc=rTTzjna%2BSPNIC02cblAxwQ%3D%3D.PBO0xugSTTXr4bmszUaFSoyRY1OKpMfb3In94wwpviqFpfSNrHhrOzCZEr7gRg3OjzYpONWSlqn5EMP8TGhabscs98ePohKVfFKWRMh96SeqMdv%2FYxGQyIykBWnGHruqDfjhmqUXXB4ywHDxrCWYdSeRSRBlxOz2G5mga%2FUKq2iruvgG12pFQ3iBBpLJEYcurefCWnejkwN5GdEj%2B1LtCUZwF2GdCsBIy6xIT%2B1Kap%2FCiofY7UFOq0r7svJyYresny%2BJxvzU65QHqCyyE5A8lZmFQvkjCpqObtnLInQPNEY%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=rGPeQzYNTniC7pLW5mCvBA%3D%3D.jIuDGCVlH0%2B%2FnXJcD4YLPV%2BgVJLmGD5uxtsuAiVCSUOi%2BHK01dJQ8FAeJ6ZxlOEc96PpZZgz1ZhpClWVI54pMt85AGWAtHU3coIsVGOSx8%2BOHMo9bzPDz1XfbvauXVhWa8nBSV0KAZOK%2F4Vcirxh7MDpTcSLu1Pc3AyltcgbusHMdCxIoypnWdYOxXMpPQvtzLiv70TLkyGcRXaeM9%2BvVpUu8tmIIneWuL8ebB6obhrn29rPukMr4q7dn0s02OMBSxJ5hNwEiwKi7%2BXRp30gKj%2Bz1nCIkT5rducUa9n32S8%3D" rel="nofollow">Redis</a> 、 <a href="https://link.segmentfault.com/?enc=eFb%2BZjrmldYBqFcQ9I1WzQ%3D%3D.mn0K05bi%2BXaRBwzl7fhwHQcfBPDfn2dkUF%2FshbWqjyvUrPrFg6kvFKMGYZfNhxtou%2FuV6%2Fb3QUQ6CYWZVS3b81BrSvJ6k3v4UJSLkW%2FaIzrM40ZcaIXXhGMN1PPXM3D2Mpcz6ztxC3eI1inBLy3NdDu1%2Fc37G%2BDEOe%2FNC1Mj2MNxPooXg0vV8FgSYawQFhqTMCQ4z0KjlY7cwk0uNtMULyHMNu%2B%2FiAUrcp16sp1Gmwi%2FLyqsKTH1Gmh85ZRRou%2Fl1aX5nTxKJdDbqpp5FiBY3rNY3rPN3Wf1kTuwF2jA%2FcjQLEAnluUoG%2B1tSqJLJ4FzaS9s9%2FpUqhLg49apynRSeg%3D%3D" rel="nofollow">MongoDB</a> 、搜索引擎 <a href="https://link.segmentfault.com/?enc=%2FaRGSTOrwKUuFos3ZP8T8w%3D%3D.5RLGbwOYJ8sCCPmNWOPEBLI2Hlx9g3G1nZfTBtI%2F1a9NWPoa9MTIzYWQ5%2FPwgQfamAfPdnKlKsZOyWEc3BsEHX0e8isAXqmEZC13sNgcWiuxLhLv7Sf9iJdEB6CU6xOvzjLQ28Rr6JKA2ZsUquLWAqXnr3Q%2BU%2BIi5aWV9ynDGhzuC%2Fs0xNkavqwiibvomwXhrmHuMu7yC0lDPVR7ngjSotscuusOj1xtDjxZDpS0TH20ZVV7x6agOVGauml9MPAlqzX4MTf7YSepcMWDlhBh%2FOV334T1tGDCFIt2tMQbo3w%3D" rel="nofollow">ElasticSearch</a> 、<a href="https://link.segmentfault.com/?enc=5QNIu6VhL%2FRf%2FiC1NZ%2BEdQ%3D%3D.X%2BlACPCB2E6z%2Bq6PYfchYQxZ%2B%2FlaQO3KgpwKKaK0jDsL557fCzXgGfS2CMTJjTpYoHamuWixzFDWVq7T%2Bm5pqJ3eUyZZoAGPmZBtuuURQTdLudt%2F8k1Mp9pPN1fcK3Ul8n5m9yC88HTb2ARREl00zCXE9PA1gl46Qk%2BeC65KV1MeNUuDjW3IxDoBSMNGnaXCHQXoYGSJom8tQaZh7NpzH3eeXi0%2B8VZhZAgSBh6ylPch6yVgdUDfK3HO2o3Qyxewv8PMu8JEbBeRlkT41BXpxjvvBXQLYPBxMhjjkArmFRU%3D" rel="nofollow">大数据 Hadoop</a> 框架、<a href="https://link.segmentfault.com/?enc=06fhnC65K%2Fb2g86PrSCNaQ%3D%3D.ZrkA9fMAqWmfcltEGKXT%2FGkfu0HYfTF8B6G8oYupZZCK6u%2B2Rs5fMJ4kMglPV%2BVpEd9t7MWkYMjTmrkUSo6yW086cEHLzCOZ7TZicEVNaFtrHcYZ6Hre%2Bksj40UAVQIM5Uqlj27JYZCVDqjeFVWYAPLtjhyA%2BjwpimVNo4STwlGpgYuM11AU37F7gJXgTnb2mez9t1s2bQhTnCWWYuVY1UYR78287pROvwP9zZadDrOrFjx3%2F2Y%2FpgqWHzkBNc2AB1P2zsapLsUQtl4FPFsa9SLrpELiT0OIcpsOMlyOokQ%3D" rel="nofollow">PostgreSQL 数据库</a>、<a href="https://link.segmentfault.com/?enc=VG2F%2F7cptO8uAOgV2NTc8g%3D%3D.rRf1lAMZBWL7vvdGcWQ0HzKVWZjMkxXZL3hP37ZIYD6JXG%2Fy%2FR4NDXaxXzPrJ7aNzuhie95c%2BdAP0eETptHynt4NRKd1NeS%2BALfyqkQ%2FBPrDtwtukrN1BFslry2boHO1mKC3dll64sBTj7TZfsWPraWbyJhJSR6L5Kp9lj9GQpFcK1y3SjbMflMUrHQVLYCHtW2kVfy16k4ix%2Fy0gJb0rGiOPyeR8XFud%2B2uhggt12Eu90OzeOcuNoBa6W8%2Bah7AHOeZ6B5jSngQDZoHTfTObuoVJ6ae%2FYe7DPN2LiGMfwU%3D" rel="nofollow">消息中间件 Kafka</a> <strong>、</strong><a href="https://link.segmentfault.com/?enc=zucAv2AMBN6C8UdmF6jqgQ%3D%3D.y5FtW9eAOwJ0sZDERrqYrFN6wPloIHZQtC3sheZwmqxz6%2FP5WkQ2UDec531OaEkYgYa5Jbc7NJQz49uXvbvCRJf%2B%2B0U8ThgSwEEtrGau%2Bt3%2FRepsBf73ErwfOXczLYwq1gw%2B21Bf0voetBrwhRoRVLo7v8MNaC9PjyxSyzxBqm32R2e49P7yNXHwoph8OjxW8%2B6fR20BnfePQB9cytsy6%2FlfGD1oPdxHnz3fcdX6AxSeul6db2nmqWXEWeqnZGO43SeZW3hkDwR0K7HbCgEZIeYaXA8kSEOO3dpzI5NXhLc%3D" rel="nofollow">分布式协调中间件 Zookeeper</a>等知识体系学习的文章。</p><p>在当今这样的就业大背景下,<strong>卷是肯定的,强大自己也是必须的</strong>。所以,学习不能停,必须一直卷下去。截止今天,又一个知识体系的学习之旅: <strong>消息中间件 RabbitMQ</strong> 卷完了<strong>。</strong></p><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>如有帮助,请点在看、转发支持一波!!!</strong></p><h2>RabbitMQ 简介</h2><p>RabbitMQ是由erlang语言开发,基于AMQP协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。</p><p><img src="/img/remote/1460000044325298" alt="图片" title="图片"></p><ul><li>官网地址:<a href="https://link.segmentfault.com/?enc=oUc072j2hyq88wLgj1ok8w%3D%3D.eKCWFLyMeAEuP6yrlS6tbaSQCdYx0VmC5DW%2Bkk4eQEM%3D" rel="nofollow">https://www.rabbitmq.com</a></li><li>Git地址:<a href="https://link.segmentfault.com/?enc=y1yEMO40SQZ6DvC7rYATLw%3D%3D.St2V21pct1pAf5zgn8nsghVl%2FbogbW7HNQbtKVCWqbA%3D" rel="nofollow">https://github.com/rabbitmq</a></li></ul><p>RabbitMQ 是一个消息中间件:它接受并转发消息。</p><p>你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑 RabbitMQ 是 一个快递站,一个快递员帮你传递快件。</p><p>RabbitMQ 与快递站的主要区别在于,它不处理快件而是接收, 存储和转发消息数据。<img src="/img/remote/1460000044325299" alt="图片" title="图片"></p><p><a href="https://link.segmentfault.com/?enc=SDbJ3KgW%2FmYljCll1uBP5g%3D%3D.17FPaiWRn1v7N468vx9rafDv6EQ4NsBSZ75oNMsYSgdOmQCpBUOaRb4VyEWmipK3uU8penJO4lELZx5Qo7u%2BXUFTb3FAc2zPU36t7EFFnuH0QqocfTD3lFyigd7Gi73QMkJ6dhM257Lr%2BQHcAxJV2YNlWh5JYncwocwG1XGvEqGfwbNuLva%2FKXJO4EUQt5rs7Q9Uec0G%2BK990BaL9ITmKuN5J7QsCzrgG0UXRqw71RBc9z%2BPyrWKrVS7cLt391E%2BxILDwIZ%2FgPf%2FiSQhIUHoQMJDIyWwQj1fAEp6mqegXEM%3D" rel="nofollow">硬卷消息中间件系列(一):RabbitMQ 入门(核心概念与架构)</a> </p><p><a href="https://link.segmentfault.com/?enc=%2BnQeR8fhztdcaua7d6nDtw%3D%3D.lXX%2BVf30etMsWXrQFr5qIrnxUJA%2Bpx8JzR%2FNoDNPzRoBjA4t6XM7ZscV7l5lKVvP6K0v3b7wcwa6YxB7lGbMRGSSPObSyzlrWYsFTo5ixrJwxwY%2FkxCETgC8Xi%2BeKUIYg1Je0ntt%2FlBqvQy3XhL%2F5mV0gJC6lnaY%2FFzbRbr0ahD%2FQ299tJQ8CoVQWna1CLa6S8Mkp1v0vk%2Fnhi8LGYeGBo8Cpm%2BSU2SgHrBzMAsaWu%2FYPmCDNdZm2550UhlCS0OE3SgQjXlURmXa4UGVhZwmML34SS0rfKlwcu%2BrlGl1ft0%3D" rel="nofollow">硬卷消息中间件系列(二):RabbitMQ 安装与简单使用</a> </p><p><a href="https://link.segmentfault.com/?enc=dIMgpz185xDenLlIvFsqdg%3D%3D.HfEsZKWFRBjb2xenJfMnUzj02P2l1vLz0jQo9ZR3b8ghMLWaF2lumauK3%2FvCrxTggekPjirTCa63jXhgQv6p8ZU%2F9R5t24hi2fHPSrQlxaKH5SsQ657zsS4dlq6rDg4ZBu2iArduDCxVFQ599vZBDq%2BWg6gdD%2BNgG4dG15KA1P4NRo756qPNiSoDJPjYKMkvERDsbI9g3MO0QPbFUZt1qcCISOuNDNYgKSCqanbSWTYhLQIHP0jMW%2Bie7F1SC8w78fdmlOw6VrlpKNDiYBQrju%2FNC%2Fpb5mHr1ZHWKpSrwJ4%3D" rel="nofollow">硬卷消息中间件系列(三):RabbitMQ 基础配置</a> </p><p><a href="https://link.segmentfault.com/?enc=Y09bO6yhjAMue9y3oqQd4w%3D%3D.ebUtupG%2FVBlwh0cjqo%2F80CIm1TMdtvBhamqBLcN180b%2B1BpB4%2FzRarCfCI%2BXWFqViivNF%2BBW3HOptQSMOj%2Ba0eb0nNpJSvFxkOsDR5JaUy%2FPCIPYeR%2FhnlWM5TXEHmhPwz85FoSREvjdGj55%2B77mxMZ%2FBM4q8QarGXE0aWi7adrUcVOQdTf6e1M7SPznRBBoHRzsRedcx4VdjyWrYBcYi%2FlkhmyPHMEGVbqtCFo1lYGRjvFKO7jTa4yyyGQO%2Fs30g7QdrWyUa7Vhwbry3fw%2FZ9rBRyRE5zY8MCqIQCZhF58%3D" rel="nofollow">硬卷消息中间件系列(四):RabbitMQ 管理界面详解</a> </p><p><a href="https://link.segmentfault.com/?enc=MnZGQ5auQTH3Oa04UHCdag%3D%3D.sUXxe%2Ba5swCxs0UzJqBVjCXTKmFvKOtEwpLws%2BuiCccQ8VqlKuSjhbgTHjw4RRS3hdY5M45UhvZ35IvdNFTIwF7YKegKOgk93ETFBp1PlSS%2BNuS4hA9gVxJdRt7jBA%2BYRAn%2F22bzE4TeQzCVbzn7OyIf5DVPA78i%2FyjemChatexNjRbFfksHDa%2B%2FzLJCIGFexXmyXBIqMv2lZQySluey6Pk%2BGaPoUzHpe%2F%2BsANBqkReaR0JssHC7an0SZOAQrdLDeOu8OLmx6Ixih13U%2F71X0oZCAwuC2YW0vp%2FVGBxvmXg%3D" rel="nofollow">硬卷消息中间件系列(五):RabbitMQ 常用 API</a> </p><p><a href="https://link.segmentfault.com/?enc=fzNvieVY0fRgKsiurxTGMg%3D%3D.S3gin4qrJEzO2JNtZHxyTQMe2q2T%2BkQJZ1BUB6cJbPvF0AUDpDuxMwj%2F2Bn%2BkKX%2BMS59jqex0U78BPOdvRjtm2t7ZewFQbX6prGTxG5KLuG8fzhTEq6tgBQXhUNTrnO1THKyhKMDRlvel5ydURv8DUA3Au67KSC3v7hDogH16jh9UGbEDsyJ8YcWkOJMmLXNrTrNIGhr8JzJcyoEOLkDf18bCivcqobp4OqnT%2BVv7MaRc8lBa6LPifFM%2BE48Vmm%2BPEc0FkACr0TPl1NwNyRPhN%2FRxjDd%2FiCba8pyTjh8NmU%3D" rel="nofollow">硬卷消息中间件系列(六):RabbitMQ 消息收发与交换机详解</a> </p><p><a href="https://link.segmentfault.com/?enc=Nx3l9gcjoQpZ%2F%2FjrfqDUZA%3D%3D.txLuRJSsdxUEA%2BAMSMYFh2V0x2nuBJBxGEiw%2Fqqc5QpszWWQZs933BPAfPxJ%2B9CV1km2yAux7Z7tj2XfZdpT%2FW%2FdqXWfCMTQgnFM13AtTwlRsXqlTglH2AcG9XxNFMMTXYSmeqhKMhF5qeuZ8NkHSFKInCkShASAhWTinyHLbRb59BQY39WhfXkQtOpGTkOhdG0m6JZMGQSZRIYT0wSFEo5ep8uMe9T%2BrOigER%2B87yLiaSwB09ynGk7nTMXm8pfUhpy7bbnK2%2BmUmmNsgSkY9Qf3TnkW0ngDfeaVuPw9jBs%3D" rel="nofollow">硬卷消息中间件系列(七):RabbitMQ 消息确认机制详解</a> </p><p><a href="https://link.segmentfault.com/?enc=o0T6sI0Lx2YK9tdzcEAhDA%3D%3D.payI1aVXbsdWqs0uB40lz5cZEg%2Bf%2BV5EkJHTncA2TAl7kxYrQAS62Hws10YD7XHpuKW%2FihlcO4HrNc6rR0u6n0%2FSYjpwcrVcu022Mp2uXAaq6v%2FmJVKbpNY9GRhJTbfdoVNdqvco3UCuVlS%2FhHT9vfRZ40TbMUiJ%2B0Q6B%2BUdtYAEt%2BDFoq0MtLD0mdLbOJ624PYQMHBxf2iXuEekz7OS3dXMqPetEhmy6OmIQv4H%2BCOJ3ZxdrKnQtz50xQUzQLKy2ULf6SUOatxEqkYcPTMQvtFKBw3ORRZ2Bxc9tBqX4nM%3D" rel="nofollow">硬卷消息中间件系列(八):RabbitMQ 重试机制详解</a> </p><p><a href="https://link.segmentfault.com/?enc=8mZRztFh2h5yPvFkT7RBGQ%3D%3D.CqKtk5DC08p8g2lLiTzxSrPGb248PQQ7uVcQiqzSagFGVJr6Bp%2FtvLA8M5%2FbfTrl4KWtYa4%2BLvaSg1o%2FKQFMnglK6a3wvv2RjF5XaQbDRciQpvq8P9NQucSF0cAAp47ZQoDj%2BgOpltYFrE6E%2F0GeuKOT2nigenAh748coWMa6rNVCWwZXTruETKoB0y0zClrY0AJUa81EFbQEZOJDDNII9dKBhp%2BOsCE8VsC4lfbvaqRF5nAQi3Dc24dfKP71j7JP%2BZ9o4RBz%2FnkTJwkYCBBwzE3ILdMeo4cJC9%2BoFNqSeA%3D" rel="nofollow">硬卷消息中间件系列(九):RabbitMQ 队列与消息过期</a> </p><p><a href="https://link.segmentfault.com/?enc=23H%2BRhRV9TQk0RXOytjJFg%3D%3D.%2BjZHbGrpWAKu7t%2Fjnsdzdgecdx9xgHXZYdbyvo5w9Fn4xY3L%2FB6odtwHUgoOCqhf8nxnFOeQTeWUk6fSoiBiXhQhjCRwxPy6Fg0cnbwrF7r1eRmyiDoNVGd0bTumB%2FjPeVuZoVd6wUPVIUm4tyVjmEPQiYD%2BYcCXxFH%2BZrKD1xfo5CE8fW44CdXk6i3KkHTYvnkVBb2dhve0wn%2B1pzaYe5aysfHT8oiULzmKt3mo%2BmZzfz35bITIPRPGrEOHHgbUTUQct9NqUGpAZeCU9ipuhZMQyjCQQEUKipULAA02kCA%3D" rel="nofollow">硬卷消息中间件系列(十):RabbitMQ 持久化、存储与内存管理</a> </p><p><a href="https://link.segmentfault.com/?enc=MDESY1B95b5QdfU1pJNv7Q%3D%3D.yMAnMko8Rs5ojXN3i7j%2BCIJH3pRoLwyZahQGremKi2s8XPVn4PBmOk5ak%2BDZC%2FZX%2B47X9VhtQSthphi9uoKIS7X4fXeyoSHsJkUA4V5D6QJq4QnlAtuby9tRXPPVuxKzbfSeXvpvQc%2BvgxqUHe6%2FxBoEFzCnbyd%2BS5mnmKu0NuflOg%2F2ZmLW%2BMD%2BAUTEMunHP6XRryKrq4sQn3Glk3F%2F1BxGUXvY8kq9gX4FUyTSMSTxwYp4VhZ%2B9nMHDytgjfCCqlfnPIDd4iYhNBYSv3BuDg1Sx%2BzxOdtX9VgJcr0v5tg%3D" rel="nofollow">硬卷消息中间件系列(十一):RabbitMQ 流控、镜像队列、网络分区</a> </p><p><a href="https://link.segmentfault.com/?enc=E%2Fr%2Bi%2FjKy%2FZYeMUEnxi0eA%3D%3D.BIaM%2BnNSwFiRgFT%2FpwAh%2FSFN9pIVE5LV3jkHTUlAeq4%2FlbnqS64M3jABcHWnGsIze6VzyURrCGt1UonWhsM8YQWROHvRwwa5v%2FyaCAV0WwXh3JbaMGmWJ4JMbpQINKp5aQIzDBeuNMxLTrFjBDRUN3%2BOjNbPtKwdSWshX8W2Wx4%2F6Q%2F8fGRcsYpgPuTREa3aXV03jRWSFMh1wWH%2Bylo2Of0QlKfEeML7%2FXg0YEI2xVD7qNcUgDbNbCzxWHKd2QkumvDrd8btkF%2FqvE4AnwtRQdDAGXYhcBQrik0zvF6eKxI%3D" rel="nofollow">硬卷消息中间件系列(十二):RabbitMQ 单机多节点、多机集群部署</a></p><p><a href="https://link.segmentfault.com/?enc=faPNOGyfIiFSl1Lp1zuGcw%3D%3D.0ukLvwxv09YYFVGM%2B6usEfBDi428RxHYPx3ZpOuCU7KY4OoC9G0K%2Fstp%2BCjVTBvul%2BDUjOx7qMVNeS%2FCEwqIuK5YGcMowFFTrdt7YAoYASjKE9Onz%2BB%2BBUBGczYVsf%2B%2Bh9NxOcwkmOj5D%2FXsYtqCk2osWdwIwmd652V11H9jUd1tcjqX4Y1KVgrAva8S1Wmfj0BdHaryk0L4w1XbWs0iAadKg229R1ap6IbWvFdYRu616PQo8rIahSBcFrxcVXCIUgcLaVXapC7d3PBsa1NwEoMtg%2BVPCupSxPgHQEv1%2BkY%3D" rel="nofollow">硬卷消息中间件系列(十三):RabbitMQ 高可用集群部署</a> </p><p><a href="https://link.segmentfault.com/?enc=iQPVJcgCxeeIG6z6LqDH2A%3D%3D.eBVUBLPuPYHqaDrRjooNYeGEwP%2B3r7Uir%2FkjclYp%2B%2BF9rG9Z6ZwCPFwEDltDY%2Fcp3pOMBYHproZbh8N752CG4h3sFRTgHiuFLTdVtMtHVMi%2Fyi77%2FZeEINicVhArjuACs%2FDepeUN8yBqbpOtddgmPBOVad7ZCemSrOvHAIGzAyQ4R23EiMaQu94AP8UKPePGrpGfCCT%2FFZPyT07AU%2B%2FDJiP7H%2ByJqsuEG1VyeIcpVRQn1OZ15rhoIsWVijAcNHe%2BD06UpUpzwmqSVz361iEKr1FxBms1mhPkTzcyZcAlPaM%3D" rel="nofollow">硬卷消息中间件系列(十四):RabbitMQ 集群运维管理</a> </p><p><a href="https://link.segmentfault.com/?enc=iSvucsxNLjYRM9LKPOj1Dw%3D%3D.GdImskxjT80hrsCVp0AXqwnioSDZbyl6s6sdVyzgrp1pKcVtHIS37pWDFnMuGoIQls3mi3%2F4JG%2Fsv1jOl0aiHeeKGWKHILoU9M4YVW1vzD%2Fwo6u6FAtCaQWraA3U%2BO9EXuZkXThOebI%2BTq83xiy1Va%2FXOZGGab%2FIuGcU2grMyckPDgjGbToRz7ZOHDN%2FK3R95zsjjZFy4Cvn8YVGS6KcrBXMLFLcRwidLOFmJuHGuB8ekld0afLtzURGW68gT3kCZ4nB6DFmZOpn1uMDlGXtCmiicgUkcx%2Fd3iQXORkUcd8%3D" rel="nofollow">硬卷消息中间件系列(十五):RabbitMQ 之 Java 调用的三种方式</a> </p><p><a href="https://link.segmentfault.com/?enc=CBUEuFqWIGr%2F6%2B2Yk%2F37VQ%3D%3D.IpL%2Ft8PBO2B5%2BWztstvOV0sVPOfS9JcAVOIRGAWrL6truZpGv9Pfk%2F%2BmtKNioWBVAM2up82FaK3AMAeL4in9oebLbFvlXBnO68w9swdSBJMy7Kb4yTFwUrjdc2djME%2F2hbIwKkqmcKszLmBf5Qw8Uw7dvOyA16Ier0mO1pi%2FGKIRCmBhTEazSNu29DWYnH9y%2BaHId7W6DTR7sJnHINcBJGw1VMgW2xY7X1Q1ZK3bZiXjar3wByUpAXBZH8EVX5v7fWymVOmJ3xKCXkhYA3EgC53pkV8X%2FsrcoSwykTrStYs%3D" rel="nofollow">硬卷消息中间件系列(十六):RabbitMQ 运维监控</a></p>
再见 MySQL 5.7 !!!
https://segmentfault.com/a/1190000044194426
2023-09-08T10:03:17+08:00
2023-09-08T10:03:17+08:00
民工哥
https://segmentfault.com/u/jishuroad
1
<p>对从事互联网 IT 技术岗位的来说,数据库也是我们日常必备的技能之一,而 MySQL 数据库更是常见、常用的数据库之一。</p><p><img src="/img/remote/1460000044194428" alt="图片" title="图片"></p><p>根据 DB-Engines 的数据显示,MySQL 是全球最流行的开源数据库,并且在过去十多年中一直排名第二。<img src="/img/remote/1460000044194429" alt="图片" title="图片">数据来源:DB-Engines 官方网站截图,详细数据:<a href="https://link.segmentfault.com/?enc=Jc6rZqwETWIy0yeVJY64ng%3D%3D.ES33FYcGQ1g4%2BqQpwFrHIgbVjLLaiYJqb1BxZpvda7JbkuEd82BzgYsvY4GPiG%2Bm" rel="nofollow">https://db-engines.com/en/ranking</a></p><h2>MySQL 的发展史</h2><p>MySQL 的历史可以追溯到1979年,它的创始人叫作Michael Widenius,他在开发一个报表工具的时候,设计了一套API,后来他的客户要求他的API支持sql语句,他直接借助于 mSQL 的代码,将它集成到自己的存储引擎中。但是他总是感觉不满意,故萌生了要自己做一套数据库的想法。<img src="/img/remote/1460000044194430" alt="图片" title="图片">1996 年 MySQL 1.0发布,同年 10 月 MySQL 3.11.1 发布了 Solaris 的版本,一个月后,Linux 版本发布,从那时候开始,MySQL 慢慢的被大众所接受。</p><p>1999 年,Michael Widenius 成立了 MySQL AB 公司,MySQL 由个人开发转变为团队开发,2000 年使用 GPL 协议开源。</p><p>2010 年 12 月,MySQL 5.5 发布,Oracle 也把 InnoDB 做成了 MySQL 默认的存储引擎,MySQL 从此进入了辉煌发展的时期。</p><p>2015年10月,MySQL 5.7 版本发布,它带来很多新的特性,比如:默认引擎改成了InnoDB,更新了安全策略,性能方面的提升,新增JSON数据类型,增强了sql模式及用户权限等等强大的功能。因此,这个版本自从发布之后一直受到业界的欢迎,也成为了众多开发者的首选数据库版本。</p><p>2018年4月,MySQL 8.0 正式发布。 </p><p>下面我们一同回顾一下各大版本的生命周期,重温一下这些经典的版本。</p><h2>MySQL 大版本生命周期</h2><p>下面是各个版本的生命周期时间范围:</p><pre><code>Release Release Date End of life MySQL 8.0 April 19, 2018 MySQL 5.7 October 21, 2015 October 21, 2023 MySQL 5.6 February 5, 2013 February 5, 2021 MySQL 5.5 December 3, 2010 December 3, 2018 MySQL 5.1 November 14, 2008 December 31, 2013 MySQL 5.0 January 9, 2012</code></pre><p>下面是来自官方给出的一份生命周期数据:<img src="/img/remote/1460000044194431" alt="图片" title="图片">在 2023 年 10 月 21 日,MySQL 5.7 将达到其生命周期的终点(EOL,End of Life)。这意味着 Oracle 将不再为 MySQL 5.7 提供官方更新、错误修复或安全补丁。</p><p>因此,随着 MySQL 5.7 EOL 到来,我们升级到一个更高的新版本,这样便于得到官方更好的更新支持,应该来说是一个最简单、最直接的方案。</p><p>但是,我们是否有其他选择呢?可以寻找一个更加完美的替代方案呢?我想,还是需要去实际的生产需求出发,对于数据库来说,安全是第一要务。不能因为迁移导致数据安全事故,这就得不偿失了。</p><h4>MySQL 各个版本使用占比</h4><p><img src="/img/remote/1460000044194432" alt="图片" title="图片"></p><p>想学习更多的MySQL数据库的知识体系可以来专栏:<a href="https://link.segmentfault.com/?enc=XWMshiAbFXuBnPzrVIwo7A%3D%3D.FbnSnMV2GkgFVtKEhDBM21x4D8Dvf7ivrevCO6W5JsJvK9InJSu53y6WTjfUb4We3LduwapH%2FiLUQ9jyK5KvQfvRy5YjcVkrUZyLP4BCLVBFSu%2FHliUjEwFwwicyV%2F9ptzOM3jzu%2BA%2FAxPJGoHVOwVyzDVK%2B%2FILL40vVoTrN3xy9HwvHunG%2BotgLYrgx8hM4OBQEwAGt%2BBtqZTFWvUZXCrzTl5KzsmmokNhwRLgN1uUHBtWTxHydFHfR0XKn2Tw3dKDmbCEAhe7gqnUEMAZznAolrSd1SU5wc%2BnvWQLNMbSHZn3GahmK7EFTulW6hFfMyUTDLXRbT9kodQI2%2BOGbag%3D%3D" rel="nofollow">MySQL 打怪升级进阶成神之路(2023 最新版)</a>!从第一篇文章开始,我们逐步详细介绍了 MySQL 数据库的基础知识,如:数据类型、存储引擎、性能优化(软、硬及sql语句),MySQL 数据库的高可用架构的部分,如:主从同步、读写分离的原理与实践、跨城容灾、数据的备份与恢复等,然后介绍了 MySQL 的管理命令、数据库语言的命令、库与表的管理工具、性能分析与工具的使用、MySQL 数据库服务器的硬件选型、性能监控、开发设计规范等知识。</p><h2>升级 Or 迁移?</h2><h4>升级到8.0版本</h4><p>上面也提到了,这是最直接、最安全、最方便的一种方案。升级之前想要了解8.0版本特性的可以参阅:<a href="https://link.segmentfault.com/?enc=YRNJAMzr60Uci32l0jlc4A%3D%3D.D1qEQQDcZJjrpybPJ%2BLCJGSDTBPreQGc1ADfXEroT1UkHjr5nqMUPK%2FsnvoeVjyCJcV6ev0OAbxT7SuHwOonZeYbfO%2F1MiJxkCtZmUlDSd4mEhnYjjvq0nO5xhMnrqbyFKRxN%2BJ9xn7%2BgZXL1qdohhKygRXZIhdl5URzPYYF%2FRA0cALcHOaI8PzIdCz22Mt0xIkie5vjo%2FB6PaWczQZmkIUcgSyRLPqcuCEtq2FLzh48NlLTlNSz9bMTSjeNhmJTrjGPA9mYMc7Iai0ijr4PdOkBkxuQH8uEt9gmJ82RyLuSz2cK4xxM%2FggkUOZyMxR41BY7zz7pvdHnHargpgdPfA%3D%3D" rel="nofollow">MySQL 8.0 的 5 个新特性,太实用了</a>!MySQL 从版本 5.7 开始提供了 NoSQL 存储的功能,在 8.0 中这部分功能也得到了一些改进(<a href="https://link.segmentfault.com/?enc=hiPZbN76jY0cF34diwbZmA%3D%3D.a2h2Q5B7FZU%2Fy%2FukY8BY%2BAH2QlmgAEffKnQ4xmrVDvDj9iAZ3Kv3QDoiRjtbP%2FU3bUcicuQ2%2FSAXQbn%2B3QO5bllT8JM%2BRUJlzM%2FryR37pVRcB2qiucGRLKcBfOibTVH9ziBimJJ%2B863DO5pSwPjLXisrtGm46X3NC%2BMSRgJF9HY2zU58dyKBwJy1EpH1EcgzLgFr65v9SDSM5yW2hCNyUjQRYBoy02U5GDied4T50kssUfawYQqMpuinLaa8iaLBlpCLFeJuiEFAHmmaoaExp8hbxwMVdMtnQsrDuWaTm5Y%3D" rel="nofollow">MySQL 5.7 vs 8.0,哪个性能更牛?</a>)。</p><p>升级过程大概如下:</p><h6>下载安装包</h6><p>下载地址:<a href="https://link.segmentfault.com/?enc=zue9Ye861np1QEZxXZ1lxg%3D%3D.7CSUO0u%2FcwpIWjIh9YFk5YX6cFBD4d80dqlt6%2BS%2BHfvW%2BKDiI4eN8CxrRtznnuaP" rel="nofollow">https://downloads.mysql.com/archives/community/</a>,注:如果是集群高可用架构,先升级从库。</p><h6>备份数据</h6><p>这是必须要做的,一定要备份数据,备份完成后一定要检查数据的完整性。</p><h6>升级</h6><p>建议先在测试环境进行升级版本测试,测试完成之后再进行生产环境的版本升级操作。</p><pre><code>#下载安装包
[root@localhost] wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-1.el7.x86_64.rpm-bundle.tar
#解压文件
[root@localhost] tar zxvf mysql-8.0.30-el7-x86_64.tar.gz -C /usr/local/mysql8.0/
#更改目录属性
[root@localhost] chown -R mysql.mysql /usr/local/mysql8.0/</code></pre><p>修改配置文件</p><pre><code># 编辑配置文件
[root@localhost] vim /etc/my.cnf
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
log-bin=mysql-bin
server-id=100
character_set_server=utf8
init_connect='SET NAMES utf8'
socket=/tmp/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/run/mysqld/mysqld.pid
#不区分大小写
lower_case_table_names =1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=5000
default-time_zone = '+8:00'
max_allowed_packet = 32M
#mysql8.0
collation-server=utf8_general_ci
basedir=/usr/local/mysql8.0
datadir=/usr/local/mysql/data
skip_ssl
default_authentication_plugin=mysql_native_password</code></pre><p>升级</p><pre><code>#登录旧版本的数据库
[root@localhost] mysql -uroot -p'123456'
#查看mysql版本
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.23-log |
+------------+
1 row in set (0.00 sec)
mysql> show variables like 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_fast_shutdown | 1 |
+----------------------+-------+
1 row in set (0.00 sec)
#确保数据都刷到硬盘上,更改成0
mysql> set global innodb_fast_shutdown=0;
Query OK, 0 rows affected (0.00 sec)
mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)
mysql> exit;
Bye</code></pre><p>使用安全模式启动MySQL 8.0</p><pre><code>#启动新版本数据库
[root@localhost] /usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
#登录新版本数据库
[root@localhost] mysql -uroot -p'123456'
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.33 |
+-----------+
1 row in set (0.00 sec)
mysql> exit;
Bye</code></pre><p>配置环境变量</p><pre><code>[root@localhost] vim /etc/profile
#增加下面的内写export PATH=$PATH:/usr/local/mysql8/bin
[root@localhost] source /etc/profile</code></pre><p>查看客户端版本</p><pre><code>[root@localhost] which mysql
/usr/local/mysql8/bin/mysql
[root@localhost] mysql -V
mysql Ver 8.0.33 for Linux on x86_64 (MySQL Community Server - GPL)</code></pre><p>升级过程中肯定会出现一些错误,遇到错误就根据提示来解决就可以。每一次的安装、升级都是一个学习进步的过程。升级完成之后,导入数据,记得修改数据库的密码。</p><pre><code>mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'xxxxx';</code></pre><h4>迁移</h4><p>近此年来,越来越多的开发人员倾向于为他们正在开发的应用程序选择 PostgreSQL。从相关的数据来看,PostgreSQL 从 2014 年开始进入高速增长状态,而 MySQL 自 2016 年以来开始缓慢下降。</p><p>目前 PostgreSQL 可以运行在所有主流操作系统上,包括 Linux、Unix 和 Windows。所以,有不少企业会选择将 MySQL 迁移到 PostgreSQL 。</p><p>相较于 MySQL,PostgreSQL 还有一些明显的特点,比如,支持更广泛的高级数据类型,更精细的索引系统,支持用各种语言编写的存储过程,也确实能够满足绝大多数企业级应用的需求。</p><p>MySQL 与 PostgreSQL 比较,<a href="https://link.segmentfault.com/?enc=9yK6tudMN4FrTp37HkLS8w%3D%3D.uoVzj4nY1PJZ8tfFJCC1cyxm7ieTknsRKHkqeDzmvCZj0qE5ZOc9lO9NQInHnCz6R1GirsNAE52Rg72J9lj5jEfP21UoLW2eSkRn9jdVOZ4QArejZKZygopjmeMCvqyMcVC9jSvJQyJnbFhssQ7SCUj%2BCuWBMNDqIdka3Mkf3gCP4239hY8zC31GGThTx1umujMnwufyRvA15kcMQaoUj5j5hLT2cfyrXu%2BWED%2FX%2FSDN0zPrWWEGRyznyuQPZcYxmgY3%2B7UumuBFofR7wn92P1gTa0JLso0HKGoGYL64OBpSXNZ%2FCbyHZqdVgSFPfjg0NYTpRWJOHMpXtm76idR4ig%3D%3D" rel="nofollow">哪个更好、我们该选用哪个</a>?可以参阅这篇之前推送过的文章。同样 PostgreSQ 也有它不适用的场景,所以,是否能够满足你的迁移需求,不能一概而论,而是要从实际的业务场景出发。</p><p>更多关于 PostgreSQL 系列的学习文章,请参阅:<a href="https://link.segmentfault.com/?enc=o%2BiRUNOPcjYQTMUZMaj6dw%3D%3D.cZVKJY8J3okcZgjl8SHtCu%2FGyn7upolYROfENTmx%2FXnE%2B2d4m1JmusrpIqmd5ybhUk4xRdu4J7Y6V9avJkHZQJbj%2FA1AClEjVJj8%2F0MU31M%2FUwtqWVxqeXi3qb7GqFApAnM7QODOQOPZPbLsCncLxdJLr5R%2F7X61tQTjCZ%2FJpY8%3D" rel="nofollow">PostgreSQL 数据库</a> 这个专栏。官网地址: <a href="https://link.segmentfault.com/?enc=8MIICkrfOcFnAXw9cVoAXg%3D%3D.5EJX4Yj5hzN2PSgreXWCpNzDUcR4UIsW4sAYiirLeII%3D" rel="nofollow">https://www.postgresql.org</a>。</p><p>无论你最终是选择升级版本,还是寻求替代方案,我不得不再次提醒你,MySQL5.7 在 2023 年 10 月将结束支持,之后官方将不会提供任何补丁更新,为了数据安全与数据库的稳定,请提前做好预备方案。</p><p>我们也<strong>是时候和 MySQL 5.7 说再见了!!!!</strong></p>
终于产完了!Zookeeper 打怪升级进阶成神之路(2023最新版)
https://segmentfault.com/a/1190000044190161
2023-09-07T09:18:19+08:00
2023-09-07T09:18:19+08:00
民工哥
https://segmentfault.com/u/jishuroad
1
<p>大家好,我是民工哥!</p><p>前面给大家介绍了:关系型数据库 <a href="https://link.segmentfault.com/?enc=skHvlVfyL8KzcQPEuivncQ%3D%3D.HpYjhhTWfUTUXomBsTUB0y%2FqWxVA9p9wVTVf9vosnbqOzpFFxbzEaYLO8Z3AeOnlTHLyf5pbal86RjunCLq3ejOqAKK1S2nEB%2Fqre8CQyUyxkNS%2FiKW7I7bHTw82QEk2pyRHuMfitISuzOBAlk8%2Fxst9OgQ1XhVCHqPzNGtPo3YLNmXlm3XW8hwFnVg7W%2FKM1MwsZwR1eUBNYkhhUV7mbVVabOpA1%2FDaRroBFPqyj9XFvL%2BKtPel423TX30bb0o2ndRtLlcfKsyvfE32WeajJVeX1PjCIy%2FgYQ0iAbiNsuk%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=QoZxa3Y6DByIIg4dcU2UKQ%3D%3D.gPck73X0iLEeUouRMemVg0zNFtWXMQ0FVTcuyZXvdimDHZOJ32J149GoGpcX7HKYMcVd5RTyQveLkmcqjF%2FVraTEFSd%2Bv%2F0t85iuR%2F4xvNPGTgVJY1izbHmltOQlRdxGiQ4KHxmlA9rVZIFAdy5iSziQN5%2BklVcGUQPsIyU56Dk%2FZk1sCXGNyUvIQrSB62xEk9HO1%2BdxcSjC7wCv9E%2BdA%2FZyv%2BME4XUCK7zyrR8N9bC9frBrvJBgx1in3Drl3ORhweQ0PxlUUL%2BajNUoSrhpgyAWxDxMWevYhy87%2FT6%2Bkyk%3D" rel="nofollow">Redis</a> 、 <a href="https://link.segmentfault.com/?enc=mNe4Zu8jUeBLyPXYq8mRBg%3D%3D.TuODJFEG9xAtvJaTdrnb1%2Fsy8eoBgQkOhnMnzMG7%2Baf02KGknoLdHVZCN9n8ZZxJ2ChZHHZxkKi4ZmFzjj8Yuyp0Ey6kVMnuz9dlnKyRtOk16u4Di6jPvvfzcVI7%2BdDiiijL%2FQUorUSrsu3rIMhfSnI81qVpPinkmQODzLFxCe8Vy7Kqq4N22TDgGGg95U04f6jpxutA7Akbxsp9wH7fg4amW8jo0VQMOjZyywqDheC5%2Bpw0MSCkI7%2FXEIzK20xq8rpkIhcXNssFAElXoaCsfwHWs%2BuS%2BQISGEXoxoiRCya2CPSeqlDmdRRoFfKg1hosZsgM3rlM9bqE1ih%2BT7c8MA%3D%3D" rel="nofollow">MongoDB</a> 、搜索引擎 <a href="https://link.segmentfault.com/?enc=VyKQWlXDvuxPpp%2FVsKZWgA%3D%3D.7yX3o2yB1OsMROgfnCjR%2FkwXl2MLoahJYcSlcXd34gPTBNswJAWHTdL9NoVcvrVTss7oOvNylPYk0aynGnqm3xCeGVtVX5yEVUWVJpjd1MX9WvKsB%2F9YdIVtUf0RqCakjZa4%2B4P952j3yEutW0ctkBEwSqOinqZbqUHx%2F1tDnyVnz0SSP2ApEfcK3CcSYftajrRhllrwdphOl2ZzL4K9xq0IPntPoa1TQKISPb%2Fd0OkV2piiLE4fkByUVyj5DR28POIVcqxEukr55JQ9eqipBT%2F6ia4p41A3X%2F6HtF6798k%3D" rel="nofollow">ElasticSearch</a> 、<a href="https://link.segmentfault.com/?enc=Im2NhzRPuWXMVvs5y98k2A%3D%3D.Y5Xf%2F0rxnY3qWADk0gRwFvdyYBDdFegkK7FRm48pbNf9gJU02rg%2FSjCCIE%2Fm7T5O9U213UhSW6gtZEhQhddG91VWPI035ltkYKORW3mL5ElzqmZkc50o%2FVYtIkrEh7vf2Xf%2FOA%2BG2HznbJ%2FrWMMqb%2FXI4Knh4B7M03yfE1xy%2BYfxgVu0lCth3D8iM6lPe6W%2FZXLGSKKsND39SUCgfm5XS8Rj1i%2B8NoR9Ju5EVBbkdhIF86gBCSz8Ga%2BFyGcdwT1l4rBzeLupKFsf6ric0sKizLnLlBvEor9nkpVPnGDiLjY%3D" rel="nofollow">大数据 Hadoop</a> 框架、<a href="https://link.segmentfault.com/?enc=eRmD6iBJRT7ZR8JtY0SQ2w%3D%3D.UsFOYxsvurIHH%2BYGAGdZqUAJSVlz%2BBJJOQDkP3bqDpq48vGWTGK1C2JGYOpt9pKgaWSZnfSR2NEjiUrRXZol%2Fy9fObD%2FEqYl0G%2FmU3eiKOJw4isEWmOk90D3m7HAdueeMZqpAx9A2gWTVzNw7dBIsfcQ0J5Yq3xNpF2lN8lbw4%2F60HgCLzEBlUG4hGRx%2BWzcjuPiKa%2B3GFCKb0qVIlUOTyt54Zk5hsqFtYVy85vdqNVUR072RRgadMX16vbgjQlZi4BZeoLgGpYUSpbjIrEWVssq%2FFQHQVpU4%2FbVv%2FyH0d0%3D" rel="nofollow">PostgreSQL 数据库</a>、<a href="https://link.segmentfault.com/?enc=9aXC8gdDdBvsvhYLGyYUxw%3D%3D.ZXoRwoIyj8SHBhYlmFA%2FEOfbE4PQRQ0475%2B45oEcYQ3wB53Z6iiR8pixg8fuiS5uE7v98scbZJTZI51MzKJt7IjLviyaj%2BKoNFAvIvkgN%2B9%2B7hFOXmhZiJr6zHi4%2Fmf%2Bg084QFrlMpNF8AVAZtxGmGmtmArxXr3NTd0WDUxqC7VUUdqCldfSRkX3f3yIHI67RTVpHkxtMq2zDXiUxRS4aSoa%2FkKcd6yN0b8k6ZD5WYi%2FLc8NL2DGjF7eEi8%2F%2FpBRq4kj%2BYNi1kEWgGumiYA2secNd7Gf%2FjMIt9ibUv%2Fv3gA%3D" rel="nofollow">消息中间件 Kafka</a> 等知识体系学习的文章。</p><p>在当今这样的就业大背景下,<strong>卷是肯定的,强大自己也是必须的</strong>。所以,学习不能停,必须一直卷下去。截止今天,又一个知识体系的学习之旅: <strong>分布式协调中间件 Zookeeper 系列</strong> 卷完了<strong>。</strong></p><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>如有帮助,请点在赞、转发支持一波!!!</strong></p><h2>什么是 Zookeeper</h2><p>zooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。<img src="/img/remote/1460000044190163" alt="图片" title="图片">官方文档上这么解释zookeeper,它是一个分布式协调框架,是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。是一个为分布式应用提供一致性服务的软件。<img src="/img/remote/1460000044190164" alt="图片" title="图片">zooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。</p><p>官网:<a href="https://link.segmentfault.com/?enc=aYwHVtW5%2BbgRuJWLU34%2Brg%3D%3D.0NE6Au5UhrE1qmzlj0SXQWJ3iEiWndTIErbgIbYTkzU%3D" rel="nofollow">https://zookeeper.apache.org/</a></p><h2>为什么要使用Zookeeper</h2><p>在大型企业的开发中,服务的数量是十分庞大的。如果我们想要添加一个服务的话,那么就需要对文件进行重新覆盖,把整个容器重启。这样导致的结果是就是:波及影响太大,维护十分困难。</p><p>此时,便需要一个能够动态注册服务和获取服务信息的地方,来统一管理服务,这个地方便称为称为服务配置中心。而zookeeper不仅实现了对cusumer和provider的灵活管理,平滑过渡功能,而且还内置了负载均衡、主动通知等功能,使我们能够几乎实时的感应到服务的状态。能够很好的帮我们解决分布式相关的问题,至今仍是市面上主流的分布式服务注册中心技术之一。<img src="/img/remote/1460000044190165" alt="图片" title="图片"></p><p><a href="https://link.segmentfault.com/?enc=FT9Dp6sbcRwXLvCOBJo%2BXg%3D%3D.MRaiA%2FUJMd4Kt02xuFGoWMkc91LppAxMHvn8Kzen4wYQfjK%2BCtXnJLEXEqCxOD3kw%2FFsjGKru15CoJFw%2FQVu%2BQFwGZmT2NIYudBiL8olpphbnxDy8059A5nQLR%2FKE4D3kQQ%2FV25AdAl%2BogiSl3x9rKJqyRq0LPFCE56dOsrN7wnF2jZXCyXSNUdqcIb%2F7V%2FwsQmvCUqtig6h92NYPOv8Wt6kNzywdIfybUxn78IVEPmCNCrlOnr4gGZ2%2FMkEO%2BQA34M5Rn3WFhVEweT6khUxdTerGkIn7GFBPprCA6reByA%3D" rel="nofollow">进阶分布式系统架构系列(一):Zookeeper 基础概念、功能与应用场景</a> </p><p><a href="https://link.segmentfault.com/?enc=r4DPRrQXoe0X06TZN0aA1A%3D%3D.tzhiwqsOQEZHsWrWkvfSyS49e2haQLKLaPSbs7hnk6PztZcDPtodGiUxXBZxeJOStUM3jSSdGYA0xw7018nnxUsvpZJwQgWuLAkWuE2Tp4bF6Z7eRCSoEt9%2Fv7DMLLyjYt1QeXbsEfpbyJqBC3WLhfYgbDV0nNjzeyNmJhluWif1ZD%2FRpdAdEvcbVFPxutdKy6cnXt2QMdq93QQUZrW226Y%2Fq4QutXl%2FTm5czjEV0TGO6PTWCR1aNO7PcrVLBtTG0Y3W6QfWaatR%2Bi1o0rbPFtBu66YEpN4qw%2FZmMz8XCi0%3D" rel="nofollow">进阶分布式系统架构系列(二):Zookeeper 典型应用场景详解</a> </p><p><a href="https://link.segmentfault.com/?enc=4oRM%2Bx6yni22wCheyvm%2BcQ%3D%3D.f%2FrimZqqkZvUCHy7LtRM8qmm7s6QNr2rNFw2V9pz%2FLZaAIsCngxtYQUhqv7Hgu8%2BRSlz0rUqSPbo5wa92pHsheZZxk%2FvyNPAwYViO8HNJ8SzimD8fJZo8a%2FjeF9NxVGEnOZO0lqHlJmOsjef74t7epmMaFmgGa9cHbOnvFsOY8YKByYhXn7eKc8wYtunqugPDmpLPsrFzCNA7UxPme8cRZ0b%2FcWZqN2rZKWKB2n%2F8NP33w6BfLbxKCWpsOniUyWNpdB5lG5aA%2FjlQd7gtGFpVgOtsmXroutA%2B0ZKpWhbDtM%3D" rel="nofollow">进阶分布式系统架构系列(三):Zookeeper 部署(单机与集群)实践</a> </p><p><a href="https://link.segmentfault.com/?enc=LxbfXW48eHtu8jDuwQY%2FiQ%3D%3D.NMRfio08OGa44hdpNN%2Fp%2F5XBTWjaA8dATQizh3nGpn6vOOT%2Bvwk3ib%2Fg4rqNeYkJcS70mjCITFYUm2iwqEM8BRbhesnVJTd0hewdwtvEinQ2ARW5efCQZFOqOY2gSLd1lPPVV8RJ7oMfbLTIf3JwnPR00UpdWEYz%2FG9Jd%2F7iOtRcUPrKgff7z5vvDf39u%2FDNBtyEYNCV5NDzOoepJvmT67Ei3lTAFi0gG76VRYsB07OWNK4Va3NbGlCc4GG3EnWvvpb%2BPL%2BrDpgY6UdH%2FXNt2IhF9IhM4TmdMK05GcKclr4%3D" rel="nofollow">进阶分布式系统架构系列(四):Zookeeper 常用管理命令</a> </p><p><a href="https://link.segmentfault.com/?enc=sS2WPVCHdCwT%2BsP0VIHIjg%3D%3D.o6qkcNP0osUXC88X0ByIEm6zMDg9GDYMnSE%2FAQBtpmbb87IARVTnlfzWNdvmtZYQRHFg8l8ARBDReHIzUa75%2FNUjRunLeYdyPPeXMO5xbros%2FTa8ujaN5mWZuRo58%2FACLa9ksUNyAy9Ba8QjGT37JfBGGRIPjDxCMlVDRSx7KdYVwRzftGDK2HjxHvztranlN24PGDTBajwkulboQjeHu%2FTjMzAy0lHodjwz8xH1x7YikocBIxTAbkmmFV7%2BwUbcrljcprAf%2FrIzUsa0SZ9qPe7N6TumjrLoDfXyL%2B%2Fc2wc%3D" rel="nofollow">进阶分布式系统架构系列(五):Zookeeper 节点(znode)详解</a> </p><p><a href="https://link.segmentfault.com/?enc=g6ywSqOxessmAAYjRgq2ng%3D%3D.3szkDoBQirQjsLAdjpZnGx3gUhuf6I%2BK9sHd5Encn%2Fi6FRJeDzovTp5DtKGUSPeGMzxwKFWLarx2HkvyKz3rs1egeHC6EeDSNQ2H6zGBmnYMX6ME3C5kFbpf%2FnpzZJ1wWgjQXATh%2F0Yd33mgIje7Lv%2BpMEf7uuOQWxN9yMAv3xD7qBEMmHEuRuDTSw9G948uGMk0aYIMhwK%2FMkHC%2F48kz%2FA5u6BbOUt%2FOztu9xArG2YTgqnCIaYIcsyXrxXm8qoDPj9KDAgXdLVuUP2zSC9P0sHG%2FXz78CHdKnqBQr0i5dY%3D" rel="nofollow">进阶分布式系统架构系列(六):Zookeeper 选举机制</a> </p><p><a href="https://link.segmentfault.com/?enc=srf7IqVAY1F0E6ZMrFvSAA%3D%3D.QwmJSKuGB%2B80L6kYyuqalDTzlvosdaO%2FkIaxKZbsM1GEGuS4tTLMU7I4LzXxUyLlbHKieEl5lFMq4aEOA6NPXjTzkw2AAlyZnSfXksiS5GRhx2JkqLUwo59DOX28uGzmCLcmNzIXRyQC7cLztrUTr7%2Bqs6dXEGmuVuwxD%2F2W3Zt35k2ZTklCPT6J1uydJGSJNQQ3QxGKIq2t%2B1XQCmfCYdYO%2BF45h%2Fnq%2F6X9IF7c6fwh46oT%2BzBvVEzyGneGCUM4lfEkcxuHk3RNzBwBxkDM1k4liSGKCqwxEFRMsMtENBY%3D" rel="nofollow">进阶分布式系统架构系列(七):Zookeeper 监听机制</a> </p><p><a href="https://link.segmentfault.com/?enc=C7kGqy3YgjB5lCXqrdZw7A%3D%3D.dyUSFBrUsa2be7z4f1PCBuhzk1X%2FFZrjHzkHRwU9Z0LpT5wVuUOw2OQWMQxGfRGsT90MClyYAKzV80g3x9ITjn5c86feeYVYXnnmLfKiooc61PMjO3Z45G7iNJATV%2BdBwfN%2BK%2F7m6A604lzjwJWJnUE7EhPuM%2BxXGYXb9ZVbumN8PJtIa57cD6DACqMo%2FdcaPoI3uhF9tsCdwsyoZxrOiHdfM0VEMTdSbb9Tia5ra%2Fv3nTk3obtKk%2FlTDMqQFXJXvNgj7nN64YKeXJfoekyJ7EKHpzHQVMCjs5V1rFkrM4A%3D" rel="nofollow">进阶分布式系统架构系列(八):Zookeeper 集群 ZAB 协议</a> </p><p><a href="https://link.segmentfault.com/?enc=LLkz%2FwxqOfJzlgAclcXU%2BA%3D%3D.MNhFtRS2HGeyPVHIOa1Fs2Fknm4y7z1gg%2BF7kAOQ1EgXCEGcWfRqU02yu6pFsjHwrpxN3e0w1e%2Bck%2Bvc1hSPD6jr29TKXXkF7rQrHMjw6rdQmCq%2FDk8kqjcRacu3pQ09yma%2BECXO6fPE5OjYFqL%2BJLakAreb9Tnkf9hUTmN7XPYq0UmTPNI105mgXMeDWbCvAQTXZkQQVpGIQeYemNYJuhBwiNKSzk6Z0Hx%2Fq4a8hB1o%2FT7E5kfTIAON7W43JhTRpI6o9zxz7g6EhjuanR3y3TQThObJTbaQuj0DJCmREiM%3D" rel="nofollow">进阶分布式系统架构系列(九):Zookeeper 配置中心</a> </p><p><a href="https://link.segmentfault.com/?enc=RzUO3ssdivi4k9UOhg%2BZqw%3D%3D.HTJ6sQTx50owx0quVN1Tv93Silp9qdCejngI5jNFYmafFoXp%2BU2Mq3%2Fo3%2FygHqf2B%2FZ%2Bl9PsdbyoHxG4c2QFtrBHzWlNF3i4ZNJEMyTsFNM4yLlkgTGzRLILxl3m2oIVDDKpAEJfkRlCSz%2BE3q48kiCvXEU59NxP%2BycJkAt8Hl0zH4eZXzikGRp1DhrxXlwPLq40lzLlRzZ%2Bj8v68RDoDsOGZ5KKg%2BFGLhwyHUBPiSldjcbSHMuVdxZJM%2BplJdZXIgetqq84aN%2Bn5XRaMuP3yQxyRSbV9gzmuug5E8ONmt8%3D" rel="nofollow">进阶分布式系统架构系列(十):Zookeeper 注册中心</a> </p><p><a href="https://link.segmentfault.com/?enc=SNghv18aaJ1yZBvFgH5X6w%3D%3D.jy%2F9W%2BAUtEUrezhgcVrOJRhImzYYkZgfLvSiH%2BvUA8SOJL9W9h3mgTcvl1bv9A79sb1sn%2BbRQseJB3P%2FTWypz6fi%2FRaGLMKLKQF2dnUQ3nGrpTrYuPxR2%2FaEJU80R2MnUQ6VkqNfUXV6O20bmqpwp6cBy7D7iRR5l8J6JOBdhjl9uL%2Fj9fWzHCTkxhT3K9sN4RKvm9MysSGW4nNtp7hldPe%2B0HQcBS2PF5aRsl8ADe%2BnXkck5ozw5zvbCa1q8jByLzNDk6VWzJ7JNdQPJRHWeioKQSzFh3J3Uo%2FHMe%2BAXis%3D" rel="nofollow">进阶分布式系统架构系列(十一):Zookeeper 数据与存储管理</a> </p><p><a href="https://link.segmentfault.com/?enc=rWUaT0LcHDYaWvUjd1odtg%3D%3D.8VxsEY9b9PkXgF0Fzi3cOILaORASBSgt7Sv%2FrAIOtn0sPrK11ABF58qb6ftpHJ95Cijt1Rh%2FDtbTfR3uA1FYqxeQ3qjpUCv1cIx3eFGppWAjhXuD1Q36qTAYJFQNGXnRUz6%2B7rrdx7LLFoXSUKj9lYafagzGwoYgsbmGtXsohfmqW3TLA9YZ%2F64EfP%2BOr9ZbxTPrtTpf77A8RW1Cl%2FOGRW9irBGhWJTvkypSs9wCKYu3GuGD8GCdU68%2FV%2Fjuw3HVZfv5tQ0WT3bTfk3Bi36bD0qx4JY%2FcMHVOwakhnoo%2FNE%3D" rel="nofollow">进阶分布式系统架构系列(十二):Zookeeper 会话与事务管理</a> </p><p><a href="https://link.segmentfault.com/?enc=Hp%2BWEjthAAOY8EkVL5HEGQ%3D%3D.wijm6SOZp4u3YR2AtWx48PXHROdNvnSgykDc2mpfqd8%2BIBMUYXYDKaX%2F%2FF6tI6cURwMQGWrMubk0TPJ21Vzn%2FKEy9Sr7YGZQMKoxF8Oq1b32zJ2pZUrhPdcn4YHOHXcHNB%2BzpC1jAnLVK6idw29tlKfUOftajj9zWMOTlKGC1G6z%2FPiPZdS2UZXg46%2FE%2Fkowei%2FaFYLze%2BNeEzRVA32Mvxi%2FEaqT4f69PFcBtEKLKQWlmnjs%2Ft5d14uX77NeNDm0f%2FPpQ9c8%2Bzb9284ssY%2BFPyVtkGtxJbH5iUhhWYH6vmI%3D" rel="nofollow">进阶分布式系统架构系列(十三):Zookeeper 分布式锁原理与实现</a> </p><p><a href="https://link.segmentfault.com/?enc=Fp0mgSFUV1SG5D09K2Sj3A%3D%3D.SHYuBSqu4zLniF4T9NGcT7%2Fpi7GrFcYQpJz26svtbfIZSK3CKgSB0OmIanvyGrp9PbqoqGlFDXSyM0QA3DLUPRTPB2TvKg4kn8mDzldnrthXcrAxYqDTgKVyfpMpUhcEl2q1iezEP1g%2FIiswHfHpWilNQJud20TkdfFowUYbU8YYH5ILnxxmJwkZdBL1%2BaglLf2sKhNBdVUEM1EXnORI3yjjRxGwA2cne0reQFK0VQtrcD5YzVIhBZqZ5Zl7BoId5%2F7AU%2BXEwIWSk3ajJf9g72VlB8Cm7bwkfQ9wVHGzumI%3D" rel="nofollow">进阶分布式系统架构系列(十四):Zookeeper 开源客户端工具</a> </p><p><a href="https://link.segmentfault.com/?enc=Zp3e5n8d7EOquOZEBtBaUg%3D%3D.00nPQmHfV4pajSg7ZRwWPwy49BhyBztcUD1t20S4tOCE6xBqTmcVFQJod8oMFzvEbEvjUJRBrIvfW%2B%2FCq0fFVx7Sh80VA7CyU69hff4ehhSkeWqMofCUTuxwJWmjVXi4YHIDM1VSgwd4CqZvDUJefIagcwb8ek%2BcrjyzBgSC1m1fSH%2B1F%2Fq9jRHUvSO6zaw2u12tYg9pggWEQ%2F2ts2lWa4u%2F5k2rkQa5EkR1etquKBI99YsfxoKv4dJx95d4FoYswaVZlZ7oxs8Vj%2Bb%2FNGwoa4ezAzcDFs0Yle%2F0gQP986c%3D" rel="nofollow">进阶分布式系统架构系列(十五):Zookeeper 可视化工具</a> </p><p><a href="https://link.segmentfault.com/?enc=eYS%2BNCkPPIIeQXlVWA4I3Q%3D%3D.APdGOwC3ev2zm9rmNVbaYm%2BCSQGSzgnVuWpa133OEWQsAnBp5fA5MWDNerJijeSfy2YczhrtuONdM%2Fv6TtFNG7pRUqlPiDzzsKW%2Bb6bX4a3zjbkQdYn%2BPbqYtMzsFzPiA75CFfPEHlKoFZ9tcQxh90ycQAjkII01wnA2FTzzkCrytJhyn2onwsR9sUUiBbLPm4LelABgS%2F7blEs7ocTxOOZFLysN5su5h0%2FXnEw5DN3Kn9PWlRTdvnUwK54ogng%2FEQmR9pw0gXYy1hagFxwMwqZbaBZR49RkxuWSowHOCiM%3D" rel="nofollow">进阶分布式系统架构系列(十六):Zookeeper 实战(基于 kafka 实现的日志收集平台)</a> </p><p><a href="https://link.segmentfault.com/?enc=4xD0pF7Orn5C%2BU8tp2nGFw%3D%3D.8OBinw02Hruec4flmooixv6HxN01qjE5C%2FjymTV1h%2B5kXFUCPXteTbNwjCLm%2BMLx1bPSYksJvRfIwtDb6IUjMmbSgG4t7Pp13GVNi8NXCG%2BtJrsyBnu%2FkvUReG4Fb7NoYJcGTaM2DD8B5YnRRbY3iMQpxM5syhRKxNOZc8aNh72BcWFWAeVlotlJhJo7PrFQ32KsHIh100GeVOzfdRINtWsyv7lmqiFDYfEPSlxrxbdjsy0ZKwJIONEBDB5FL0w2WrqEFiZTQFRFYXTAXoaoCPFK%2Bf%2FKPdD9n2BrhQD%2Bh6c%3D" rel="nofollow">进阶分布式系统架构系列(十七):Zookeeper 运维实践经验总结</a> </p><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>希望大家能够从中收获多多!如有帮助,请点在赞、转发支持一波!!!</strong></p>
别再东奔西找了!来试试这款超牛 X 的手机端 SSH 工具,吹爆!
https://segmentfault.com/a/1190000044146410
2023-08-24T15:57:55+08:00
2023-08-24T15:57:55+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>工欲善其事必先利其器,我们在日常工作中需要登录服务器。PC 端工具比较丰富,如 Xshell、WindTerm、electerm 等。你是不是也在寻找这么一款好用、实用的手机端 SSH 工具呢?</p><p>今天,就给大家介绍一款手机端 SSH 工具:flutter_server_box。</p><p><img src="/img/remote/1460000044146412" alt="图片" title="图片"></p><h2>flutter_server_box 简介</h2><p>flutter_server_box一个 Flutter 项目,使用 Flutter 开发的 Linux 服务器工具箱,提供服务器状态图表和管理工具。支持SSH 终端、SFTP、Docker 管理、包管理、进程管理、代码编辑器、代码片段、远程Ping、编码转换等功能。</p><p><img src="/img/remote/1460000044146413" alt="图片" title="图片">支持安卓与IOS<img src="/img/remote/1460000044146414" alt="图片" title="图片"><img src="/img/remote/1460000044146415" alt="图片" title="图片"></p><ul><li>开源地址:<a href="https://link.segmentfault.com/?enc=W%2BL8Adf%2BJkQ2Z1%2Bm3QpXcg%3D%3D.SzbX7KBcoC3rIkfdTHaiE%2FXLP%2FXuy%2FadSyXkyQvkDfCmW7KBAFjn2UwYkfMjVu%2BHviZ99Sjlcr0Hdf5We4rdOQ%3D%3D" rel="nofollow">https://github.com/lollipopkit/flutter_server_box</a></li></ul><h4>功能特点</h4><ul><li>支持SSH终端和SFTP。</li><li>Docker及进程管理器</li><li>支持状态图表</li><li>支持代码编辑器</li><li>Ping工具</li></ul><h2>使用相关</h2><p>直接下载相应该的安装包安装即可,首页登录界面如下:<img src="/img/remote/1460000044146416" alt="图片" title="图片"></p><h6>系统信息界面</h6><p><img src="/img/remote/1460000044146417" alt="图片" title="图片"><img src="/img/remote/1460000044146418" alt="图片" title="图片"></p><h6>SFTP界面</h6><p><img src="/img/remote/1460000044146419" alt="图片" title="图片"><img src="/img/remote/1460000044146420" alt="图片" title="图片"></p><h6>Ping的界面</h6><p><img src="/img/remote/1460000044146421" alt="图片" title="图片"></p><h6>在线终端界面</h6><p><img src="/img/remote/1460000044146422" alt="图片" title="图片"></p><h6>Docker容器管理</h6><p><img src="/img/remote/1460000044146423" alt="图片" title="图片"></p><h6>转码功能</h6><p><img src="/img/remote/1460000044146425" alt="图片" title="图片"></p><p>更多相关的功能可以下载自行体验一下。今天的分享就到这了,如有帮助,请点在看与转发分享朋友圈支持一下哦。</p><blockquote>注:如需转载,必须保留文章出自:<a href="https://link.segmentfault.com/?enc=1JTn%2B0%2F5jmVU8yUF77BFAg%3D%3D.NZkYZ6xVEvbMrPnqYmmxlbI5LKD9MuKQlFDZyX8RBvz1938cc%2FzOutukktcHmDo%2Fl86yg%2Fqm5NylmXnfyk71qSw1711b7P5YfbVgu9yUhdGEe%2B0vpdS5zmn2fcHHN1Na%2BbXktwXHkGtJn2JFPswXdYrFq%2F2QoTEY3XXFTc34rFlpmohEzLRFyxGJJesMH7zd%2FinAVkokAyvJpB%2FN%2FQmkd5dBkUywMgdJayjbRBACtlRHGDz%2Fk5G1r7ZaAfmcl1FcWhtrV9%2B6IOFsYzuv92EoXeYg7SAu7EaaRdCGasarqVM%3D" rel="nofollow">一款牛X的手机端SSH 工具</a>,其它都视为非授权转载行为。</blockquote>
国内用户访问 Github 速度慢怎么办?别慌!一招帮你解决,看这
https://segmentfault.com/a/1190000044135253
2023-08-21T19:59:33+08:00
2023-08-21T19:59:33+08:00
民工哥
https://segmentfault.com/u/jishuroad
4
<p>对于我们从事 IT 行业的技术人员来说,对于 Github 肯定是非常熟悉的。日常工作中必备的工具之一,由于时常遇到无法访问、或者访问速度很慢的问题,导致使用起来非常的不便。<img src="/img/remote/1460000044135255" alt="图片" title="图片">所以,今天给大家介绍一款软件:fetch-github-hosts。<img src="/img/remote/1460000044135256" alt="图片" title="图片"></p><h2>简介</h2><p>fetch-github-hosts 它是一款同步 github hosts 的工具,可以解决国内无法访问 GitHub 的问题。功能非常强大,跨平台,支持 Windows、Mac和 Linux 端,UI 非常漂亮!<img src="/img/remote/1460000044135257" alt="图片" title="图片">此项目是通过部署此项目本身的服务器来获取 github.com 的 hosts,而不是通过第三方ip地址接口来进行获取,例如 ipaddress.com 等。</p><p>时隔一年大更新 v2.6 发布,将 fetch-github-hosts 的依赖及 UI 界面进行了大更新,增加了一些非常实用的功能。</p><ul><li>开源地址:<a href="https://link.segmentfault.com/?enc=v0ktLDd%2BX%2FMJDXFCDQP7Zw%3D%3D.Wykkh7xdL6AoRYtzYLUqOpJQvUTYsyqdViMXCHnUBMT5gft9Z1sAiHTUxn%2FoVsDM" rel="nofollow">https://github.com/Licoy/fetch-github-hosts</a></li></ul><h2>安装与使用</h2><p>安装与使用都非常的简单、易用。</p><ul><li>下载地址:<a href="https://link.segmentfault.com/?enc=%2BD3ovO1xOB52nVRhSnkhMg%3D%3D.%2Fau1U1EOg4aWNFGSL1Mp6s5yoYIclcjj7Jdh7HcMU%2BbYcFyRmPvf1mwtb2NMBov4B%2FC4ZHSucRw0%2FrcVDaYOQg%3D%3D" rel="nofollow">https://github.com/Licoy/fetch-github-hosts/releases</a><img src="/img/remote/1460000044135258" alt="图片" title="图片"></li></ul><h4>Windows 端</h4><p>下载相应的安装包</p><p><img src="/img/remote/1460000044135260" alt="图片" title="图片"></p><p>双击运行之后的界面如下:<img src="/img/remote/1460000044135261" alt="图片" title="图片">点击启动之后显示如下:<img src="/img/remote/1460000044135262" alt="图片" title="图片">这时你再访问Github就不会出现之前的超时现象了。</p><p><img src="/img/remote/1460000044135264" alt="图片" title="图片"></p><p>选择客户端的主机源:<img src="/img/remote/1460000044135265" alt="图片" title="图片">你也可以自定义主机源:<img src="/img/remote/1460000044135266" alt="图片" title="图片"></p><p>服务端模式:<img src="/img/remote/1460000044135267" alt="图片" title="图片"><img src="/img/remote/1460000044135268" alt="图片" title="图片"></p><h4>命令行终端</h4><p>目前支持 Windows/Linux/MacOS 。<img src="/img/remote/1460000044135269" alt="图片" title="图片">具体的使用可以参考:<a href="https://link.segmentfault.com/?enc=%2BbBtUJJ%2F1ie7DmuTFCUjqQ%3D%3D.guMDOXvN8MvkLywSW%2BTQZMy7bh9edicAY3j%2F1dAKVtBC8M6%2FEY7fRILZK2bm4%2BE6XpefetzIrzckk1KcMQe%2B1A%3D%3D" rel="nofollow">https://github.com/Licoy/fetch-github-hosts/blob/main/README.md</a> 官方文档介绍,这里就不再赘述了,非常简单。</p><h6>手动添加 Hosts 文件</h6><p>需要我们手动访问 <a href="https://link.segmentfault.com/?enc=HfQPsNfvy7JKNUvvm9leog%3D%3D.ir%2FvZBZJcKsq5AXHVgxEs8zJmZy%2B9VB4p4BkQYd6Pp%2BVhzbHTyp2YmTvOQRC2oY%2B" rel="nofollow">https://hosts.gitcdn.top/hosts.txt</a>,然后将下面的全部内容粘贴到你的 hosts 文件中即可。</p><pre><code># fetch-github-hosts begin
140.82.113.26 alive.github.com
140.82.113.26 live.github.com
185.199.108.154 github.githubassets.com
140.82.114.21 central.github.com
185.199.110.133 desktop.githubusercontent.com
2606:50c0:8001::153 assets-cdn.github.com
185.199.110.133 camo.githubusercontent.com
185.199.109.133 github.map.fastly.net
146.75.105.194 github.global.ssl.fastly.net
140.82.113.3 gist.github.com
185.199.111.153 github.io
140.82.113.3 github.com
192.0.66.2 github.blog
140.82.112.5 api.github.com
2606:50c0:8002::154 raw.githubusercontent.com
2606:50c0:8002::154 user-images.githubusercontent.com
185.199.109.133 favicons.githubusercontent.com
185.199.109.133 avatars5.githubusercontent.com
185.199.108.133 avatars4.githubusercontent.com
185.199.109.133 avatars3.githubusercontent.com
185.199.108.133 avatars2.githubusercontent.com
185.199.111.133 avatars1.githubusercontent.com
185.199.109.133 avatars0.githubusercontent.com
2606:50c0:8001::154 avatars.githubusercontent.com
140.82.114.9 codeload.github.com
54.231.163.161 github-cloud.s3.amazonaws.com
52.216.54.233 github-com.s3.amazonaws.com
54.231.133.153 github-production-release-asset-2e65be.s3.amazonaws.com
52.216.104.235 github-production-user-asset-6210df.s3.amazonaws.com
3.5.16.126 github-production-repository-file-5c1aeb.s3.amazonaws.com
185.199.109.153 githubstatus.com
140.82.114.18 github.community
52.224.38.193 github.dev
140.82.114.22 collector.github.com
2620:1ec:21::16 pipelines.actions.githubusercontent.com
2606:50c0:8001::154 media.githubusercontent.com
185.199.111.133 cloud.githubusercontent.com
185.199.111.133 objects.githubusercontent.com
# last fetch time: 2023-08-20 11:42:51
# update url: https://hosts.gitcdn.top/hosts.txt
# fetch-github-hosts end</code></pre><ul><li>Linux / MacOS 系统 hosts 文件目录:/etc/hosts</li><li>Windows hosts文件目录:C:\Windows\System32\drivers\etc\hosts</li></ul><p>注:上面的文件内容是动态更新的(last fetch time: 2023-08-20 11:42:51),你可以使用定时任务去更新即可。</p><p>添加完文件之后,我们需要进行手动刷新动作,才能是使之生效,具体操作如下:</p><pre><code># Linux
/etc/init.d/network restart
# Windows
ipconfig /flushdns
# Macos
sudo killall -HUP mDNSResponder</code></pre><p>Unix/Linux 系统,我们还可以使用下面的命令完成自动添加、自动刷新,一键启动与使用。</p><pre><code>sed -i "/# fetch-github-hosts begin/Q" /etc/hosts && curl https://hosts.gitcdn.top/hosts.txt >> /etc/hosts</code></pre><p>图形界面的使用还是非常简单、方便的,总体使用下来,个人感觉还是一款非常不错的软件,加速效果非常明显。</p><p>有兴趣的朋友可以下载体验,如果你有更好的加速工具,也欢迎你在评论区分享一下,大家一起学习,共同进步。</p>
终于产完了!Kafka 打怪升级进阶成神之路(2023最新版)
https://segmentfault.com/a/1190000044122087
2023-08-17T11:13:06+08:00
2023-08-17T11:13:06+08:00
民工哥
https://segmentfault.com/u/jishuroad
2
<p>大家好,我是民工哥!</p><p>前面给大家介绍了:关系型数据库 <a href="https://link.segmentfault.com/?enc=EUYo2ZadBamk5r58U528CQ%3D%3D.QPvgHdr1svSulOtcyZ6S01J5EUmz69bDrxnkZ%2BrzFdIQB%2BVhIKTobSWK9HyT6UpSqK99wM9oWfPaAPXSCmd6gn0o2D4L0sLFufTAFN9kXhC%2BfyY7imR12mThzu9cFlXVU8aJ0OWiYeefmwXziYklofdFONVcHQ6ongghIYdVxW7oXFVvZ%2BwwuItTfjuKEADk%2Ft4DeJX8fQbAOk8%2B%2FC7J7q5gFtbIJoYHkERd26SmOcDXm%2FuVwh5z02%2BrP6gkZ%2BPsrxHEbwdtd2%2B83ynND7e%2Brq6EBj%2FGRtDIMjN4MjyStUw%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=xFPO6w4mXeJo9PSFiL1%2B9A%3D%3D.mp76dVHky8L831FUS9Aat8tu1vYCqDv%2B3luWqrW3vMfogqq3S5V%2F4t%2F89wV5tFMQUcqKYw0xftGvOmPtPSyEnddSMRaf9uvpZnnUVHyHXuclT1qHjVusmjk1xoU6HvvwJmjukn9U%2BhpOHPFNQO541J7qqIVIoGz0Uhk4SbVcv04gx2wIP9BO72eHZHxGfpwrxKAbs8at0Xml%2BCQoegSzq%2FO49WRpurEFllDm5fergbhFZ54XZXY5MjDhz3I7vc7Ovcj3%2BdZEAJG5sgLZMsWRzFKrCJkt12Z02GhprK63pMQ%3D" rel="nofollow">Redis</a> 、 <a href="https://link.segmentfault.com/?enc=5Xe4E23DpK6J7ZX%2FNiV5ag%3D%3D.iD79IEXLp6f0P4iN0PuuTx%2BRG0syFSmTKItcWsHZAyDhgiW%2BJhxaZ63Ffff2BJ7zFv7KHnJWjTipavAgSGRGIKFD1eRQfHidfVmZiZyo7sCb2PWYJ8cuiCaSeOvGTEftUujSmDK5sfjAx0Q5%2FpShtHcFhada4%2FIrXGOsrCAY8HHV6irggAu6kGJJOUFpKDEmzD6Xf5HYcPBNkw0DzHyL0ld1aTYJgPOoz20m6MIcKho2wfhzLOlvpKA1WH1FE1juLeFQOVG%2BqI3eIIe%2BhEZc7QYpJNNzhOgXYXBxrs8rG3e53ZxaoDATYLrfAUlYatepIXlL3rJ%2BBCdwXX4UXF6foQ%3D%3D" rel="nofollow">MongoDB</a> 、搜索引擎 <a href="https://link.segmentfault.com/?enc=ulLgoMaNrW2sfTc%2Bu9CnkQ%3D%3D.NcqCzZaSOjYwf0T5KI9%2B1ZMzs5VKU5KcqYIKW3JKnjiv0zZM3RO6OJkjv6EgjzdlFTILU0KKkbh7i3Yl9zfKlnKbT0C%2FONARGx72iYFl1ns94p%2B3QR9pTnITL5BXgRaFi5M3Y2VKGYMgSCfH5R4rB7pyHl7ceVCO5jR4QzLl85cNGOnO8Xh6bk2f1MeCn5yuir8qRFXEe4KvwLst3kBE40TKbDm%2BLnluuDB7wAaJPkyP47FnDIgBawknrEraSlGZ2AgO2eXDnVh2QIS6jH8xoMD2VKhdC5sPQ2WegeMu4EI%3D" rel="nofollow">ElasticSearch</a> 、<a href="https://link.segmentfault.com/?enc=Dl%2Fy6hqo4CNPXhRyxkm9Gw%3D%3D.tPMjSyRIGVeODAWVergYzVdJWAd7d4noZNwIFCOuSeGMu6Sn3m2a09FofW7DkZ2k9GTasiqLTFL9hk7hRcI%2BOx%2B2sn%2BNgcLBcxzrIdrnrQ3jdo%2BskGsMdDPP%2F3gbewG6jQdt0DvnpW2wqrl8Wl%2BCNnJ40LnOsHuov4gHWUm%2BuBUfttePr5f8gYiX7izqmGNe4i80Y%2B%2B5aR9nIEOJY%2F5vpifnduGLWYkoa5qiXS7EuZTAtMX0YPQGaT%2FYj5XhhYDujwH1VxHvMW4MnWjC7%2Fp%2FwiQTU1Y88OWykD2bp3pjb%2BY%3D" rel="nofollow">大数据 Hadoop</a>框架、<a href="https://link.segmentfault.com/?enc=VXzQyUf6Tf7eGI9gmAm5CQ%3D%3D.qcrlJ64HLf42jYyu86uxTnpnrVVtU9exaoIa%2F3AWxFLYqlyHRMuUdIDdKt79YW8W4paaFCww3I%2BD%2BmmQ%2F1MTFkquLt05iV%2BPuB0nWUEHyTh6xAneHc%2BgbxQEokCfYVXtUmCtxkk4AOQr47XovjHpghiMINpmhdIm4zqmWpxzZk4vyZjPjLzVbIZeAEAQGrmorx92Qc2kKIlls1yxnaFg64EQggqjDQtBF3J7mwI26lRECkWWJfAqSA1D3ZGIIQBZDtJV%2BguXIthlBglw7%2BNzppPYW8%2BJIMtfC%2ByUXoUjlUE%3D" rel="nofollow">PostgreSQL 数据库</a>等知识体系学习的文章。</p><p>在当今这样的就业大背景下,<strong>卷是肯定的,强大自己也是必须的</strong>。所以,学习不能停,必须一直卷下去。截止今天,又一个知识体系的学习之旅: <strong>消息中间件 Kafka 系列</strong>卷完了<strong>。</strong>希望大家能够从中收获多多!如有帮助,请点<strong>在看</strong>、<strong>转发支持</strong>一波!!!</p><h2>什么是 Kafka</h2><p>Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目,该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。</p><p><img src="/img/remote/1460000044122089" alt="图片" title="图片"></p><p>Kafka是一个分布式消息队列:生产者、消费者的功能。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。</p><p>Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。</p><h2>Kafka六大特点</h2><ul><li>1、高吞吐量、低延迟:可以满足每秒百万级别消息的生产和消费。它的延迟最低只有几毫秒,topic可以分多个partition, consumer group 对partition进行consumer操作。</li><li>2、持久性、可靠性:有一套完善的消息存储机制,确保数据高效安全且持久化。消息被持久化到本地磁盘,并且支持数据备份防止数据丢失 。</li><li>3、分布式:基于分布式的扩展;Kafka的数据都会复制到几台服务器上,当某台故障失效时,生产者和消费者转而使用其它的Kafka。</li><li>4、可扩展性:kafka集群支持热扩展 。</li><li>5、容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)。</li><li>6、高并发:支持数千个客户端同时读写。</li></ul><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!</strong></p><p><a href="https://link.segmentfault.com/?enc=vDWYmAIojKsZI7R33H1VNQ%3D%3D.naz6u9TTVqiLlfKRmHhuUu0GPc5OE0YuhL0X%2F88hC0WKUi62IxxKouErTUKXJyaLYuSHuGHPAqYqA4yJPixha5sFDkuz0lRrQMH4tFHTS1RbOQU52ipSpCIV5ybcqYp1Nb3va4ykIY%2BsuTN0qwrypAkirA7yTNPFENkxzBjd0hHNfcW6xwYsE0LCK2bm0Ck8PC6gzxN4GB7oINOFraGp%2FsrYpoiGJ6V1FYfO3d90ZF84Wc1Opqfp%2FrXnJWiWZBxweHYzxeneYkNF5nIbrEUsrKfeEDBqLVDp4Xrcei3zi8o%3D" rel="nofollow">进击消息中间件系列(一):Kafka 入门(基本概念与架构)</a> </p><p><a href="https://link.segmentfault.com/?enc=cbiA6jZxl8iAHwidQKxdrw%3D%3D.YQzdqOjqTbRpWebrl5ALt2PkOHxoFpiAWI9UEW%2FLs4RTpNh1JalMSGpO6veFIckqsa0%2F%2Bit3HxKBHrECFm%2BGkaAzQafPHjsgFVuQEOFHnnP2r4LhwoFmkH6ceVI2pOC5A%2FghPfVO4gfcZJJCyem1iZZ97WZ30PaFhnGmBQgRnpJbxLAc66rn5g%2BpKeSRIE0CDcVLzONj10wu09atQSyVnSLpk44XNiq4%2FvC1To0ZRuesnUCiCxKk0dbltnjVwInZgyZMtauYtQORHb3KpP86swwSJhYRwIDcZTiYZGWIz3w%3D" rel="nofollow">进击消息中间件系列(二):Kafka 单机与集群部署实践</a> </p><p><a href="https://link.segmentfault.com/?enc=UgGPJce%2F3WmDBp4r8c26rw%3D%3D.%2BawNa3zVfk%2B5OwSYGXv3H1H3f9dCOZm69ieyihy7g9b5lSNp1yo6wgb90%2B5AETe6%2FiO2FFGGI%2FEcfkzh0YN4llCpyBbmezy0UdttpiPM%2FKW8jtuEiQUvs9TRijg6Mn7zIDDv%2BYSFSAsPytq%2BSZuNxw%2B8jekVFRwzu%2B7tFksIIdCP2ax5q2tOIS82fY4SUuTxdlQTmo%2BsXoz5tFiZ%2FTzUNRBHKkvYsmC97jOxOitkYMRHU8MY8Zstt%2FvTvZcxxO%2Brpj9q5BXuk2P2r%2F4bkufTRyLX0EfgcBckCKtLMUV0Z%2FA%3D" rel="nofollow">进击消息中间件系列(三):Kafka 中 shell 命令使用</a> </p><p><a href="https://link.segmentfault.com/?enc=ms4pM1rlciZonmFAI2XVBw%3D%3D.GAd0VBjefgo4dybZsoHoZn8OrDzrcCTBfzc95rlStbVdezCYM%2FuwWOHSQcjmYZsDnPCqsvpN8zSe66FLFX5lEPFLbhf3nZqhGWIRGDnzxOqgnRElkaLgCW%2FsKodCiZM1%2B6JDUZTYJM7jMeGMjzQlpwwmfuaxz0ZVXSBhbb7pwESK3WZRkIQ9hlvDTRbK%2B7Qw%2F8jhScA0ivu84nzI9EebQWFx%2FoKkpQPLG%2BHazIBjDElmkDR6cN1nxrp%2Bu5AHa0TlQ%2FUQBeuhz%2Bm57znyaAgpnj4bNMkaL3Mnz6A5G8vn27o%3D" rel="nofollow">进击消息中间件系列(四):Kafka 服务器 Broker</a> </p><p><a href="https://link.segmentfault.com/?enc=3XXcDGnME28nFoTQxDs1%2FQ%3D%3D.fc%2BSkE98de%2FshKAPBXVAiW6atHzVVLIBqCtAr3d0vUy3FDT3gDCj66vYedEkDua4uVKfmWAd47YVQoDb7WZkE5CmFSDKpEHnqTwHUglk%2BD8L371yj6da2ovqX239wQMWt7YqSXcpkzQluz9xCAQqTDjelPLoigoGMgH5p5IFpMw3ZiZjVqYrOUXcVpHOY4AaUZlFXKPbyCkyAe5hZl4CtTuqH1SqWM7aVtvAXGrgNQpb2aBnKm87TvpmvL0yktvy0YG%2F6okp9ZTWB%2B%2F3BVTqTGzEIFj9FTimR6m5%2F1Sp9ms%3D" rel="nofollow">进击消息中间件系列(五):Kafka 生产者 Producer</a> </p><p><a href="https://link.segmentfault.com/?enc=FAc49KKLq2VvdE3wbj%2FljQ%3D%3D.70KdogBN2Zr%2BPnRn5PZAZe854mLkDiwcAerkvjHHxyogZj5GaY7dLJ9%2FZQMgo4Pa1WZS%2BZPkdu%2BNIV4N%2BAkLDLkCTr7dtCndwjvF3NTl3TqKPOC69O1IwUwfEUFhM8U2jCqOdqPYvcw2q045u08HazNoUOOAKunigB%2FQSnlNcPdH5bNwAQRQu2a0iNQCh32uUMdiN0Q0jylxQN4loVsYp%2BM9gDcr8imUW7GLi4yQGg6e0c1T5jdlPNw%2BzL7Rcas7aLEDVfxYfJlrf0MkLj9kZPKtL6eIWuYU8zbx3csqKGM%3D" rel="nofollow">进击消息中间件系列(六):Kafka 消费者Consumer</a> </p><p><a href="https://link.segmentfault.com/?enc=9lpHS27hDyUVksCQ0nCFFQ%3D%3D.1NEpW%2F8nv5bSiaROE5IZ005I%2FIDqIDsBZt8PPhgwFnzXQ0X7RieaCZ6mHjKpnv3pWBWVvi%2FaC8fCWEvon2Jx%2B8da%2BABZbE5hSBaYInisElgOyDmu3DCj9EtqodE5FCy3IembMk4TyNxBUJ4arMo0LWS5t3sJSR3OXvH40M0cjnwZ%2Bntw7UPKdHsALZfxGlr%2FGELqGH9WePkzrlyPQ%2F%2BGgqNCKBBb%2F6IIv4chszOkRiofEtcomWWJvgpDx7UaWzis1S7P0prXUuvGgAc4MjbR%2Fdj7h7EB76GPM0ApCTcN76Y%3D" rel="nofollow">进击消息中间件系列(七):Kafka 控制器 Controller</a> </p><p><a href="https://link.segmentfault.com/?enc=tyx3LGQx4ZDKNyRIAgPtDQ%3D%3D.LDE41eNWAPizvqxzXvdwLHP%2BJSaauCmM0LyuGVDCkeEmgKee8bJp5mQcN4YgAbajgrV6BbZL%2B460%2Fhvu8ZbGpGo7hDxH0KzK931HsvRIDLAcFMzPc%2Fa62VbgaW7k3v5VyPOk0MVhrzFic9SiNYlinFL5Dy%2FKsgpZ%2BB9atKRI1r%2BI6%2B7prY0HlmSpTD1mF26I%2Bk1CakvNUzu1%2B0Yo6FGOkXJSSZ9NFpnOyjpedvBt%2BnJzuqpfFqovTeZrHnRjhCdfsggWKTKDmmYyK2TVBntuNVksZwaAV8spWTQPaJ0B2kA%3D" rel="nofollow">进击消息中间件系列(八):Kafka 主题与分区</a> </p><p><a href="https://link.segmentfault.com/?enc=7%2FcBB2dbNUC7AWIoliLcTA%3D%3D.Q6M7XJGdgSzcqKRuCKCfJCG5yTWG%2FGLQX%2BcTSnw8DNSe8GlKkzapALyguGkqLYqMu4C3JmRv7OGogPFVnxdGUUrmGek%2FEa3bV5QIYCwCtIr1HeaozG%2FyrL7LNNtY7bOCzTgViblXT0cBOJc1JY%2BbF%2Fv0HWs2FoLl%2B9rNK0W6Kw0YYiLrMUu6MsrTv6rkYhHrGCSw5hWAsp2k3znmynIfsdLlqLM%2FQqjpfe98qbDcBZ7o0ZCDpZPULLIr%2FTkrMZsObrEUxvXPelkjF08eqyuEcYtSkO3GRLs7%2BieKT640Z08%3D" rel="nofollow">进击消息中间件系列(九):Kafka 各类 API 使用</a> </p><p><a href="https://link.segmentfault.com/?enc=AXyBoWh4MgkNWKTFyy6%2BPg%3D%3D.bSGz8oKtrtNI9aZKKjCIgwy1C70z7cr864oGErkjCGbxbgwNlAOqMpfWz%2BJd1nPs7UxNUMpNfwULd2nAzPTJRsSLwudQsL0b2OjRD83fkwJ4bR%2BLxLcM4lOj%2FrdzQhOU5JMIvCBokHSqaJf2zNmAQEOjhzotLmjIvgrc2zT%2FDvX3yen%2BMJtGJcAEYa5PnwxcbdmHvunZ%2FwNqLlXF%2BOtm0bR7rVk6aCkrl9KV3hBOkBPQuyPflcNn5kgC21bpSKygbyFtrX2JnJiCBJYVi0UqK1vldaTjuqb1FVEBYMHtadI%3D" rel="nofollow">进击消息中间件系列(十):Kafka 副本(Replication)机制</a> </p><p><a href="https://link.segmentfault.com/?enc=TIgCL35WwzNJlyR%2B53by2Q%3D%3D.Ts0weYibiQW0gs5QzjEwlp9JB2EznariFmoOLcTuAW%2F3R6F%2F8KF4%2BssrCe7MZfEcdPKs7TBsqLv2sp%2BejrheXto2ueLj0CNZGbpRb8qMvodJRzXVKXqr6l9TY%2F2GFbY1AZ9Ih6YmVy2EOpOxcWkxN%2FruYfIhQYcFwdmD2xh%2BmnPtwbZGSpV%2F82JDFN7U0Kf%2B4qgRyl89jgWo%2FOo8NlrVLFlH8y57Sm3Pq1RxUfuFQUGgcfcLIlvoiUFSgVNQv5MsmbXUVGPsIqyu8WjZZrbq5KZ5d1klWin3NAw8T76wIoQ%3D" rel="nofollow">进击消息中间件系列(十一):Kafka 存储机制</a> </p><p><a href="https://link.segmentfault.com/?enc=PhSuFouHxJEZq1KxTYPOpw%3D%3D.KvixEJBAkcoZfEEHXyAzNdLdgbepTHzuMu5FWMMlm1oNQ6Tu86vBQmfbGDgex6cY%2Fe4eJ4X2zK7hDlRFy2hp%2FbpeRpkEwdzQTPCTZA014k1AB%2BRYjjgbeYtWO8XbM2g08doGCtYL204m9qMn2RBZ9nw5%2BPbxIe9Kh0jSVSOf3AhTS0Md%2Ff4MCmSmfrmU7amaRTg3Ci5vGlDK1cGjDo5yKH0TynGVWhb%2FCrTAgroVoZ3ZLWD64pbU8r9x8rFC8rZAgrKBQAItu93zsDnJt1TbD0Sut8lF66zdBLuq%2BUXyiHs%3D" rel="nofollow">进击消息中间件系列(十二):Kafka 事务机制</a> </p><p><a href="https://link.segmentfault.com/?enc=ngoPADnrpLiOpU05aukUYA%3D%3D.D1uxev4fWAlZaCtGdEpwUg2Ma8rp55LMWVWNHyZzkm%2BCjwJp%2BDMnFFFYpp9Uju0TUQsSV0xoVNxIgMVhhrgGPTFhDJKJALsYeBf0BYPsdM00r4eJGaQzndzftPRd%2BDnrygoemu%2BCquie%2FeYldDlJy%2Fkg5abXR5wJ5dCeQU8NGFPWFz2oLOzJaau98GoxJyq%2BpAiUFN7Dq%2FdtW%2BzAVTJIFRpLIh6GMv%2FqJYF6ddethyJRYJvszmdcoiALT6XZfRnhg9q%2Bb%2F6PBHznerzewNCXKpX3U%2BYdswb5ZPmGOrYCDLk%3D" rel="nofollow">进击消息中间件系列(十三):Kafka 高可用与生产消费过程</a> </p><p><a href="https://link.segmentfault.com/?enc=nzlpxsOth6BvPE%2BllvFxhA%3D%3D.riVhIXU%2BMsKNw2eAwsophlEXNxxO%2BE4bGwEX2QItDmGvkYOK3I%2BXvlGZEkPQJKTjtlVgaHdg%2FChWwrfQfd8lIIyKayeCV9scol9zcUcTMgJrcWos7eZnX2KKfQjOhlYfy3BXjwMw%2Baoh%2FHV9x7Zn1oJ6V42w6OMHx%2B%2B4%2FHvYDNpZ7Z0t8M9%2B2MUaCK2A9P%2FZG0o4xM%2FVcg3%2BVCopvUiwwxdWLRQCysYKcB9NyujWGl%2FkLR%2BQ5p%2F1T0hp3TmvwP9NCGfpwhn7KYOXrtZUMJNzSGqm3lTBJl9S26Ya1haLHCY%3D" rel="nofollow">进击消息中间件系列(十四):Kafka 流式 SQL 引擎 KSQL</a></p><p><a href="https://link.segmentfault.com/?enc=KCncJM3GGHv20uc%2BRywFnw%3D%3D.LL7yHB02ZYBoSbrf9YR7TJ43BO0fuFBOi2ry0bMpzjyxZY%2BmU2vnIWTK8HwhLQQogsPz5KnS4U227Kksoio2arTxmOEpneh9gZk10%2FF9zIxC%2BymextkLAbtmDsy7bYdJwwUJgOtW3TRvqD%2F4TSPeYXo2P2jfe04leOMXdagHy7JG%2FjsOfLT7jLrK%2FrWp9a6eKI7AegzKpCa0vEIhWTMMULGbG0ITkQIZGa6EKOrjmPTtHVQwoT9nFcqC%2BqQ5LOvv1HVj99o5JuWpfJDVzQZhrYFFftN%2BK%2BxFd8tGXrKnJUo%3D" rel="nofollow">进击消息中间件系列(十五):Kafka 日志存储与清除策略</a> </p><p><a href="https://link.segmentfault.com/?enc=cxUolyQBXbhe%2FBRPYD402A%3D%3D.UKo7iT%2FnIuYQjA4GWvBPcMWS68PUdZKi21WrDUb%2FFiOPrfPO%2F9urGBE4mQro78xM6g2TbWbjPdtaw4piH%2BuUneF2zi4wLcMqB88QP7Y16dL0R7pDvM8EFGP6YZWHz%2BHygh0Jd3tiQW1cSPnvjpR5xFXT7RAJwbqg8mLBjcAQhyJhky8uz2e2bekFrF1UY2W1zN1CuhpQkcwt%2BjagP4yHD%2BaJ1dp8MPmJYZ8Qs2xsBwy8nLtYxpHqUVDiO6GbwwAsUt6B7YaXRJuZVboFeX%2BkhoTNRP1I0lVHbAgjoDDJXI0%3D" rel="nofollow">进击消息中间件系列(十六):Kafka 数据备份与恢复</a> </p><p><a href="https://link.segmentfault.com/?enc=aPe1QustKSf39ZL9WUJaQQ%3D%3D.UZ1lSeDVUkfcuyoyaHTgKxLt542leYI5inJKDv%2FzfJoLvdx%2BzM19NX1kVRlLxprSFfS0lVmBKzrpnDDzOOlnQxxYB8%2Ft6D%2BdAXL%2FeR2BT0CsUgeoMXQOGcuBC2BxMSdV5cbraR2oywjeVU8nchoAkJVTvNCEzR7a20p%2FVNMWDvQ96on7kCfGkAd%2BlpPmUtImAcX1zw97%2Bmiooxvd81xYun2MRX9auHTFuotVR0ddtRtGEY%2FM0kNCuDXngCYM21dTffbZ3p4iXjY4BfdIAyMYqhBLMEM5FL7M3FxPNVc30vg%3D" rel="nofollow">进击消息中间件系列(十七):Kafka 集群管理工具 CMAK</a> </p><p><a href="https://link.segmentfault.com/?enc=0a9B7MORJC9oKEKpWUGVZg%3D%3D.J9oMmVCDreu7HaAd3yRo1qycSSudSC7fLFyc6C4lvAsrojszZyaVqIIbSjPREA8ZnDgsoPCbgFd66t84M%2FBxwIezx3O%2F7%2Bb6qdPRsmmyAQ4BWUVLDIO30MChDWdVPQWNftC3B9q3ed3qXRfWGhBn5KUD07SZSRFO57fi5dxtt5CDm2Wnj91kitTWJF63GSIxnZAoXEJ9QlPuqfh0h%2BreWYL%2BlluA1x5kKZdgflJnJR%2BKwrRKRGDDgRJI0nfN7PDtWjxTrYcLqjmpl6HRXrfmBRvrJAfGQF%2BChEpYdUFbYhc%3D" rel="nofollow">进击消息中间件系列(十八):Kafka 可视化管理平台EFAK</a> </p><p><a href="https://link.segmentfault.com/?enc=6bvaRfXi%2BDEIjMS%2FWbVsCg%3D%3D.lycMIHnA1xsHgzsGjDgXJcnxRfgCHjwPS6ojiNEPIEqMqigQrxbv2n%2FeHO5onrGyV9X97fFjARf0vrimY9c7kGbNEndg0j5VJlaAbc%2BNtbof%2BF589Lvm%2BhKSLvM6Es6xQma%2FlOwku9zQ2UE0eoUopfkiGYiDNNJQoUb4lh4MYYWHygvucFk2NCY2QMKhOCb5B5%2By3SdKz%2FfKcmTbzkstvS2acZupuWcS17EvoJ5y9II2%2Bace1C8qONkQi%2FRuje5kcVM8TxaPsra8jzWnQiSd%2F47k%2F3jFFLexsKjBHrdrF08%3D" rel="nofollow">进击消息中间件系列(十九):Kafka 安全配置最佳实践</a> </p><p><a href="https://link.segmentfault.com/?enc=4a80DyezM3lDQ5%2FFKLmW7A%3D%3D.OS2lJkh1FuEm2du1jFVA4GOeBCwv7Us%2B0mIEOtUBojpZDfnN56Ah485mgHbS4zpw51MFqoOiKv71pxWygg8%2BrqL08rLs3X3dtVGt6k9CcbBDCFjKdEkRPuoXvo%2FdHmTaAWnkNUdrwFMtYiJSOcVZHvAH7z8sE3FZp2%2FjLbXlWnM287fR4DND8BJPhBLDyOSgSe1UCUtnh4tiqce1XrH0VU66GzLaRR9bv7HjQRXThual518jBXP2TlJNAIex0UIPkY3u5d7Fv5fv1dDXwcrViVpBPXYOBAZOLkcaynNR934%3D" rel="nofollow">进击消息中间件系列(二十):Kafka 生产调优最佳实践</a> </p><p><a href="https://link.segmentfault.com/?enc=TatsMGh0gm1tLbJ1FDufKQ%3D%3D.V5NJgMP8WfO0ZyMm%2Bvw2oZ5PqaqBuat9%2FZFTxEvTVdBI58WW6EZYXtIT6W5JSsxVF54FoEHUSvWcKnIlTkG8mnBrmztjIaO4gQIy4a08aJQfzulnobq3nCgF59k3GeD4pXTDoU0NQDyNtWNxC9o8eSK9sFNY5dFsyNpofRKmNdszS24Le0GZDO7aWgblHaPCc7mGusdVyQ1p3%2FmvXgMRBoLL4v%2BhbyFL%2Frqizb%2F9iOW4o%2BA%2FMXJc82MLgQmuo7TKnxCk0lGCaylcwfFYTMKGQy8MHV%2FF3tR6vb%2BncSsD53U%3D" rel="nofollow">进击消息中间件系列(二十一):Kafka 监控最佳实践</a></p><p>终终终于卷完了!!!!</p><p>希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!</p>
卷到位了!PostgreSQL 打怪升级进阶成神之路(2023最新版)
https://segmentfault.com/a/1190000044048598
2023-07-25T21:24:51+08:00
2023-07-25T21:24:51+08:00
民工哥
https://segmentfault.com/u/jishuroad
20
<p>大家好,我是民工哥!</p><p>前面给大家介绍了:关系型数据库 <a href="https://link.segmentfault.com/?enc=diBALeIhKrQqTH2%2FPlSVCQ%3D%3D.c3be6jHzEp0DPmT2vFaYuFyIFJkbZZSxfkylxRs7WiGHGGlpqajutSK49mZFjlh3EQm%2FuChpdlaBIAl%2B4kXYNXqv4zw4ttRvzWYe4sOg2RzX3M4apLTPcbiGjHV0sYiZbiEseldYQiM%2FXFlD6W7g8Ew5pT8dM4490PJMYmSnQIz%2FkqeKVoqaVxXz4pfQPnZt8zG%2B%2BPOkzAiijvv6nRuk5Tn6x8U8bViMNTO3zm7lFgA8qc%2BsACLZmP%2FEXOLHw01wvEP2XKKaH2CQcUc3oVGO9647r4XnFU1yFy%2BFw8yzOYc%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=9fyEzy1m1P5SeWOPbku3gQ%3D%3D.MSy8I3YKpHi1UtLaztkROw7ygBLfm73X66i5HJpByOcqNo7mwE0eHoIkzF4mguWmbihu0L8gdbdgzOc8gy4vc5TXRN8XaoqcJz%2BU2gMa2Nuel2aTYLQ4yRCBa%2FrhzZQ%2FE44KH%2BfgQyeLIvSDcbMqOe9nbU0MVbvSyI2LZQ8j7sVBQvkTivdq0xGVUnaVbF0%2FspOtExd3mXpEYFutdpkgFWfC18kFxOo8Hzby6EZ4RI4IHRixvRUkxUCzYV1flNY11Z%2FSUHoeSvEB1L4irL4fxvRl7Dm8nQVKcA6qVySJAdk%3D" rel="nofollow">Redis</a> 、 <a href="https://link.segmentfault.com/?enc=5qE2jnJ5W21sN%2FJWCj1a0Q%3D%3D.1GJgEOxlK2BJNBWGBqSI8SXu%2BNYOcwjPx5I4syZbOMxb6koG0P65bn6ILitfDd8vRVAGi11YP4oP4lVvlr83rx17ZGStpVxyfhNOqLiCxq4xWyNbJUsEn4b1CYddMZjU9xvqa90SwicqapxBsTE2flFu4mc1B8wsNq7OKbVI9xCgpjYQh6CE3v6G5FlaSZePOUTnSKxGb7QnAFzzUVoFoVdvOUvpeplHy6r%2FQM%2BbDm8uNR%2BV6FYz3N%2Fy7XpaKKf8b7VIhs2utee7LcRfoX3ZWbY2WRpf3owVMMg8cNHaSkNv%2B0n2kKI%2Bk4yFZOIR6RqFUQTmcB17G%2FiL1Giyw9pFlA%3D%3D" rel="nofollow">MongoDB</a> 、搜索引擎 <a href="https://link.segmentfault.com/?enc=DIjEV%2BcY0CV3IxbV9L%2FkCQ%3D%3D.0%2BQ%2FRPNQm4iZTNc5fxymHO8%2BbhJw8G5prq4JH%2F4D%2FToG10GdaA%2BcOHCHiQK5CbHqYOM9bpH8rAi26FI990BSDZMwL4Jaud8I1yk5FBuF0fthi0P6RHzCsu7IrIodFytSswbQaukvkVPqIpcxu6p0hebx%2Bk7HlZfbPIzROf0HqVNxVMS5w1HQI8aCgq5zeh9HriciFjpTsFLldIdNSozzREWKl9O8Eeg4jmtgOpACZqV%2BZSqoZrmeTSjjtYn8hs8VLtDrhWRq5x0%2BNYDALemaeGIuvEi3pXRwzCyfOCDApdI%3D" rel="nofollow">ElasticSearch</a> 、<a href="https://link.segmentfault.com/?enc=bJvJkz4NO4YftHWIfUWBkQ%3D%3D.zYMrHD9yoXlpVR5rSzkN2QhwugRKuJ5Yn9PRpuay0WPz6rQQ4eB3tXcqLie%2FhrXNEm%2BtwUNqrY%2BN52LK9d%2FQvoCyXF5S%2BCWL5D1mZh5oFFep3mneYEAllzKLOQHuTSZfoRKv9%2FwNwNkG5Wt6Bz8qTTYO1wdfRHbBQ%2Bhj3JGJIpaOQ1l36UB7fFWPXE%2B2WivI%2BW3u9QAiNaJqZuaWyRf8qlVbvS5iw16SkQUZd1NXpKMPB9XSYyr8aRtkgJHk6oMoxtkHWRtO9vCmZGtx4%2FYNN255Nc3jKwQZ1QENvLUzmpk%3D" rel="nofollow">大数据 Hadoop</a> 框架等知识体系学习的文章。</p><p>在当今这样的就业大背景下,<strong>卷是肯定的,强大自己也是必须的</strong>。所以,学习不能停,必须一直卷下去。截止今天,又一个知识体系的学习之旅:PostgreSQL 卷完了<strong>。</strong>希望大家能够从中收获多多!如有帮助,请点<strong>在看</strong>、<strong>转发支持</strong>一波!!!</p><p>过去几年,MySQL 一直霸占着数据库流行榜的榜首。但是,随着时间的推移,PostgreSQL 以 46.5% 的使用率第一次超过 MySQL 位居第一,而 MySQL 以 45.7% 的使用率降至第二名。同为泛用性最好的开源关系型数据库,排名第一第二的 PGSQL 与 MySQL ,与其他的数据库远远拉开了距离。<img src="/img/remote/1460000044048600" alt="图片" title="图片">所以,从今天开始,我们进入下一个知识体系的学习:<strong>PostgreSQL 数据库</strong>。</p><h2>PostgreSQL 简介</h2><p>PostgreSQL 是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进,PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSQL可以运行在所有主流操作系统上,包括Linux、Unix和Windows。</p><p><img src="/img/remote/1460000044048601" alt="图片" title="图片"></p><p>PostgreSQL 是完全的事务安全性数据库,支持丰富的数据类型(如JSON和JSONB类型、数组类型)和自定义类型。PostgreSQL数据库提供了丰富的接口,可以很方便地扩展它的功能,如可以在GiST框架下实现自己的索引类型,支持使用C语言写自定义函数、触发器,也支持使用流行的编程语言写自定义函数。PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python、PL/Java、PL/Tcl等。</p><p>作为一种企业级数据库,PostgreSQL以它所具有的各种高级功能而自豪,像多版本并发控制( MVCC )、按时间点恢复(PITR)、表空间、异步复制、嵌套事务、在线热备、复杂查询的规划和优化以及为容错而进行的预写日志等。它支持国际字符集、多字节编码并支持使用当地语言进行排序、大小写处理和格式化等操作。它也在所能管理的大数据量和所允许的大用户量并发访问时间具有完全的高伸缩性。</p><p>更多关于 PostgreSQL 系列的学习文章,请参阅:<a href="https://link.segmentfault.com/?enc=McFrJigXAW%2FVsaUDOAsI%2FA%3D%3D.B6dpkcawtDMQQYi396zVVd61wP%2BzQw05740Z9B6ZNEVDpzntKM%2Bn8PHM9FG%2FKR5uJSvofEE4ZIP211Ep1RDMydLaxLFIycO4hNzrskBDQ1j3Vl9K%2BQEmzuaL0kZnRcHOkhII98lpi0ingtrEA8T6j8WRl7X6YArUnnVdCLGXbeY%3D" rel="nofollow">PostgreSQL 数据库</a>,本系列持续更新中。</p><h4>官网</h4><ul><li>官网地址: <a href="https://link.segmentfault.com/?enc=pdvMTnUb1HQouaakzYF6xA%3D%3D.%2F6Qt%2BisOs2wUvyOcq0UVtxdZCVl32x1ZRRNK154fack%3D" rel="nofollow">https://www.postgresql.org</a></li><li>下载地址: <a href="https://link.segmentfault.com/?enc=0WMXIXYjO2QGKX%2BLVAX6pw%3D%3D.CAJq28WsDMBy4%2F4wjpQ5%2BosraT5JyqRKMsjVEOLyReIodCehoymralGyM21ufPxY" rel="nofollow">https://www.postgresql.org/download/</a></li><li>安装工具: <a href="https://link.segmentfault.com/?enc=E75%2BVc%2FYYXjZIPGxEAEYAA%3D%3D.zm9zIV5NM6uzbVRf3%2BXPLzFC7G4EVgRN%2B3qRz%2Fo1iMdxCqoGuvjsp029CTGJBDA6" rel="nofollow">https://www.pgadmin.org/download/</a></li></ul><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!</strong></p><p><a href="https://link.segmentfault.com/?enc=mYuZwxgo3a7gtQ4uTIsfWQ%3D%3D.uj8eI6lC4TlQafKQF%2F%2BkHmlNVk%2BSnaZAWlRPQ22WzxhFn3B6B%2FZ8H%2FdXX4NL6zAuwON4BUJ9klf8b%2FWNHm7Yhl1xRqUZR1CvV%2BKln561GA1gJZC%2FAXH6fCVD13apdhqv1wTwgfHJAepxk6kWIlhqe7mKJb%2BGTqZT68qWNfUlEyEi3PVbCfjr6o1uKQEi0kDtd8h8%2F3OoTlxeR2LB07C7%2BDM57RJRTaEvT3Cx%2BA9%2FhrEN7n640nNLXK0Ew7dagmPXOcR%2FMllqYcI%2FCeRS97N5YFIDdMeC6P1VHus5ieODhKw%3D" rel="nofollow">进阶数据库系列(一):PostgreSQL 基础入门与安装</a> </p><p><a href="https://link.segmentfault.com/?enc=bshICKY3qQF4%2BYSZZ5tOWg%3D%3D.jbt%2F9vW2oJmN7n3DxdZ1OwN47CWP2p7hjmtHJolR%2FVxjZ%2FZjTLPDYSaDQlcQ3VvA9gAKyLNZftfvlrntl045giP8MIPtCUec1PveSU6asqPWSjBKPS46xmSHtUtD9DU8bVQDCxYVZokhCKEFHPBSXkhh3aXHUWEZhGOn3EqErY%2Bp46ledyDB347g6rau2n0VsOStTEDx0cU%2FeDQ1NhluwjlDKYg3EqgUcpyeWGrx5XLMjJz%2Fnw4lD2p1w%2B505MzBabS67yU6VKa%2Fi0w40ais0SLV%2BmDHYW2QHIjBl4FiqgE%3D" rel="nofollow">进阶数据库系列(二):PostgreSQL 目录结构与配置文件 postgresql.conf 详解</a> </p><p><a href="https://link.segmentfault.com/?enc=egxnbNFhUAZtWIFRnFEA0w%3D%3D.%2BDBz0TzZYwpyB8lZpu4rJf7lmSGLoWfeCavMGNyBwoohBOpV5CuUogG3dCoeM2mTNByRRDf%2FY9vLe7ht8mimydVMwaIHI4ollqo1AzUICH8O%2B1iNeK9Py4Mu%2FDWZGJPqzOjySbjQluszsipG%2FATDiXPh2fcY81PjxY9L%2BXfqnL0zyR31538RNGtUJLxuFzJAE70nr563QHjZ3S0C2WTNCIVlse%2BAB1h7FiUyg6faNlbnq5p3pG9JQUJ241%2FKEKhMZ2hqE5bw7T%2F3EncVsSUTip2gpg7DMjDu8EmYMas5lsY%3D" rel="nofollow">进阶数据库系列(三):PostgreSQL 常用管理命令</a> </p><p><a href="https://link.segmentfault.com/?enc=WHuNUUokMxiAc7Ilzb%2FwqQ%3D%3D.zdumVmALIzNf177YKi0oZr%2BDyU2oeyw0LJLiMpJODjvXkgOJ3gju9vhAggyWBkJE0IYH8UTOOJuxyxku8HgTVDm3Ku4IrecXVXk9G3sELt9DqQlgF7xPiHFIuteLsjqlUco7Y1hkTam9k0EHiJEyHs0%2BLAjRdyWKZM6e3PHM6urjRuY%2FgU0GWilce9umz8h7ZU1BxcRsArNnZDNPy8jGt6BSUuVOptJLcWseH22ujbuORsUsYhnLgbq%2BI8YrRNlg5V3d2dQ%2BDvRXcxN5ggbPpKidgom3BIDLicgEhIdnSMA%3D" rel="nofollow">进阶数据库系列(四):PostgreSQL 访问控制与认证管理</a> </p><p><a href="https://link.segmentfault.com/?enc=af9UedenM37lL4QXagXE0Q%3D%3D.KvlDcgybC1P155cqj3YH12Pxet%2Fsh4iFbMUTUR6ZLmfkm5tyT4rZP3sN2ILX%2FwnvMmqqYuu5vjmdyE7T89qhasU8lPgIP0dUVMc1mB9H5e%2B0jskZMGN6IeNyUGfzTX3jHljs2MqWy%2BnJ6AaCvYmLLESyGrZvU5mQE3wTIBAg7f5PhZlwMg7ASg7CXSAOFlg3dpgm90YZX65NKpmUGyoplDtSp%2B9HcfB6vzbBjJxxccD3dYikGOixpjSUxkvwLYKEvJCxb2p5yXjhXPB0FzEpSMzhH%2FfakjAl95ZWfGxRmCA%3D" rel="nofollow">进阶数据库系列(五):PostgreSQL 语法详解</a> </p><p><a href="https://link.segmentfault.com/?enc=OjbS7lopS4f38AaPnUrfMg%3D%3D.ViAj17XE2BffBod8gyAM%2Fl%2FBDCkOrKqiPhUR2UOU5lLbyOO%2BUY7I1C25%2BTNBvt0gPNXD9dgaP0Gmanwr6eAOSHijWen%2BWApe8%2Bje2cplQASEDud81iZ8bjAZq5ealijl%2F4BtYV4WxR0GkxQiTvLSjaGAUWcgUcxHZPbY9dPwgWTj8xCI5VNyBdANwqP%2F6SmrnXmUZGZZ8tNoagcJDXjGpjvWvgMlfbx7EBR8%2Floi2tc9lOZzSjeh42EM%2BNda7gmmPgniD24c%2BSq4RNg8Ox748aFQYBmil8ULhVZFbQiCrrE%3D" rel="nofollow">进阶数据库系列(六):PostgreSQL 数据类型与运算符</a> </p><p><a href="https://link.segmentfault.com/?enc=8R9nJ3FaVW8fapXxZYP%2FNg%3D%3D.hoJ5Nk0ZQY6xFKEAAIe0ZY9T1NnOgMtEfXYGwk5ZHASoTANpdCHDwrV6JCrTOyLL1NcarjrxIKu5tme%2FLitTxjMngVwbFUPtuJUCPY7caxDl0d2ifP0MSlGuFTQHI9zT%2BqnnCSZm9ec%2FIvt8oJvhSOdf2%2Fdvk85jeGL5i0b2VxNmH7XDNb9RPP6IZ%2FuRCQ3VqzmGH6b0LPdskaqHB0mm88hMnNjG%2FFvcs8wcgFKuMunndUh6vccLMTcdn4bU%2BTMYOCC6yxmeJgxR%2BzVs0b7greY%2FNLst99qWsRbn3xxFzQ0%3D" rel="nofollow">进阶数据库系列(七):PostgreSQL 常用函数介绍</a> </p><p><a href="https://link.segmentfault.com/?enc=6yUTBJxtTFswVJhE%2F7o3DA%3D%3D.U3OI6EyKaipgOVyYVvPbeb5De5PQCaNqEgCVFM3cbeEXCxYDM9bXLT043T0ODQ%2BtSoqbhDFqbgPnPKwTbwrc1Lz7aMR2qCSngglOokkEKgHnGchCWKX3stutBgPg1GEYEPg0gUojViQdmDAv6F%2B8ldGDLgXlzEAsfWQkuuL4FAIEgkYI88agZvtBuE41u9wCsNjtFisxZMKqhtLREqfXbTbTDEn1MGXvSXO1p8dWGngaY8jLT8JXv91ziO1ygM4RzLCWmPv8Im0EfBTnwRuyXFvfXo8CRlO6eo9LkpB54p8%3D" rel="nofollow">进阶数据库系列(八):PostgreSQL 锁机制</a> </p><p><a href="https://link.segmentfault.com/?enc=QUcTOSVEXbUvQCEVbnrzGA%3D%3D.kymSTs3ASAsjtM4UrLKuBhPqScN%2FIXFGEBHmZsnCTGuXNgzpTSKnWR1M4%2F6Q7xgkUtzCi%2BCNQvXzGDQyeSIWpxL7IYy4YpCKkNbdZtkbOXy2Uu8a9NykwJEbMfexeI8d02mbYkr%2B7MTgKfgxuhhhQFgvEOohuP%2FLqSCr4yQ5uHoau%2BVSN%2BtfYcPFh9OzUALk7A5E4gxSWuB%2FnmHEOrSAcbd%2BYuWpgcXkevYA3AZeimgn740On198KXN5NiUhIhNzbmWx2ououL9CiUZCuwu0f%2Ftw80fITXZQP1SM17LvKas%3D" rel="nofollow">进阶数据库系列(九):PostgreSQL 执行计划</a> </p><p><a href="https://link.segmentfault.com/?enc=8ShK0FwigyNIXP0hYpEHrA%3D%3D.956jOUvsaRYBE4sT%2Bq3M5A%2B1GzvSTJT1klg5wF481mzEUuCjFu%2BPHgO3RJBbUWebHfw7Xfm4FrnnkbDKQX3k2XUMZhcTwIU02jGf0uMj8ipaGb7vW6DlCKWLP%2FfVyKFD9R71VmbmnDgp9y6rAZ8G%2FfDyssNSuq2VvvW%2BjoRZGhx%2BeQr%2BjInsWnIiTx5WYOdmGnVRcAly8iq9y1ZYaMDboK6AwMXuiB%2BAR4dMX8MOhRUIynbspYLaDiBPXukf5Tg2JUDonaKWnBuNB0ZXgaIvHayt9hVtheg%2FwXT25926g5M%3D" rel="nofollow">进阶数据库系列(十):PostgreSQL 视图与触发器</a> </p><p><a href="https://link.segmentfault.com/?enc=nDCp6XgwT4XeoWkNUYVzzQ%3D%3D.jOFT7VPHQZBDGsRdnJmmTpi6rMXNM9y3BZUFm55M5HANxxk8R%2FxIh9gJirtgR8NDxm6WpkiDROcnBj9R2pxiWMSUVJcrp6qHN4Mdkiji9O%2B6JCQAAPKAsDCQm5jo7Ay9tKsfg0%2BVAr2Gx6HsQaEnUpbLzKN%2F842Am%2FXhgGDbkz5oqIrSizWeIX%2FK4FINNssqo8hMQnRjs6fnWch2p5vAV6LNuMa0e1IOTm8PYSOKdrfVHgbhSGOmOhvjwr8qySWD4R3lOM8hbaQLUWAcgB1%2FkV10ClWmt6hg5YrsnL1GLwk%3D" rel="nofollow">进阶数据库系列(十一):PostgreSQL 存储过程</a> </p><p><a href="https://link.segmentfault.com/?enc=dNMFl%2F1SFQtB6b5hicWsXg%3D%3D.Tn2HzTb1sCxXOVnkxkPFtF6yq8G7klyXu050ts0ylFOUovn3sqn2S9p%2BoN%2B6WBltCKJ6bxw0zNAEPjUA1tPr%2BKInJNc9EF%2FFpm58ej3EQEO24%2FD%2FMFNwHo5vjgaNnRsrXirW5hcfSZV3lOdMFoDAIb6SiafsH8gStEBTkt5AkF2thLoEXupiUxSQqLyjV%2Bn615ZI7hooUUmOIaXFTQGJdyIA9rQAK3EG%2BJcZzSBdXp34eZezMmOc%2FX4lxpxbxD9mJIyIMx4XVJHI441A9dPtpVzPDwWny3ot8rtIlSQNsXs%3D" rel="nofollow">进阶数据库系列(十二):PostgreSQL 索引技术详解</a> </p><p><a href="https://link.segmentfault.com/?enc=odftPQ9AHU%2FogkJK4bHULg%3D%3D.n7uAUpkgzeb96xujaaGooPK04e96QTnX%2FX4zkwKXyAl%2BVRyHZwuQKJSYZghOC7bnFrnQD1lxU2iW8BEBTpScpl7RcMCf7GpF234gGswsDJsbFY9%2Fi3qMOjpT%2B99i5rEo54%2BBaScgeDA9gtZCIjdGQ6NUuvSFzy3f7tC7wm3kMzRk2nDoWcb4jtHkMC4ycg5Qd%2B2OXh3ITVs1i6FXaQZHkKZVmFmH4SKv562BLlPW2GlX%2FGQf9su5S4G634B8vLLafTkHt22n%2BXQ%2FgNmCbEGUANM1G1Pqpc2N%2FlfxqHWvFyk%3D" rel="nofollow">进阶数据库系列(十三):PostgreSQL 分区分表</a> </p><p><a href="https://link.segmentfault.com/?enc=YT1BN0yv4ATIGWlvuDW%2BlQ%3D%3D.cCSwPahhwq7WxPoP6euOI9YXKYcCI2cQdCNTSDcnaTCb4w3CHKaLbMo7tNxW24bi1tPp8R5KrZnNv%2FKqb3PA2zxrVgRqu5Fu5iKydWqLXYyGNI3BAUokpsC%2By1C%2BlbkLefHo12BKbCgo4V%2FBeBg%2Fs6DIfSBvakSDw9YqHblN9zhboaW8KM77TQZN42xMSYWT4Bu74ULs%2BeqsqsLmacCb%2BNxYgUwXhPEMSb%2FMMU67pt5VgRJoaTd4yQLggcEVFu6hFEG5Mq8Ge1Ld9001w6rzVRivOSjd64f5gCVfTuCFlFw%3D" rel="nofollow">进阶数据库系列(十四):PostgreSQL 事务与并发控制</a> </p><p><a href="https://link.segmentfault.com/?enc=nO5znbJE2Ta910XkeQhZNA%3D%3D.RaYaWUC8e%2FAoWglz5OBdN8Dq8isaRdf%2FatAFaptBMbpvW5%2Biy7ZLvOmLCYEmRL8fmKLb9F6B4xdKSxPy62%2FEg3sZpzjF99hPnQneCv%2FbaiANO57QdH%2B5qsnU4cBA%2BwT8ezjmOOrgRmpGX0qpvXX78iQQIVTLwhRQ2pZMKTEKqwwBd7Np6qTuXh9Klh7rQQsNOkv4JnFKXl46sc5JLJpBwxO1ibPs%2BIwlA9EmB5QzVW0B1vDysGudyQ%2FY5Z64fiNaTD42Tjq4YzKu8xRw8xBd2JCnY2aLZvgp6qGbt27M1v0%3D" rel="nofollow">进阶数据库系列(十五):PostgreSQL 主从同步原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=gasVM2Wl%2BrMhsyHiDW45Lw%3D%3D.%2BdaEGcYp5byTe0jxoRTrV1zpJzAUAMULCkzCDyvEJ9haXJkcq9OGrhoHUU0pwpQ3epPpq9Vrq3YKm3IalQjoM5HOaqNTKGrFtFEBZ5e1Vj51chMI44kwMT9aFF4QCrNsqF70QhiWKW5jYbmqXtpNf2Xj90rj%2ByEz%2Frw2N4dBoR4zhWRn55g06%2FaiVc5QcK3b2DG8uI1nCO2Jat7DZorlhGxWkJ2X%2BHZl8Rzv1X8dVHyvOpv6Mvgy8MzHXKRN275fT1fIQnHnVvBLWyRyPRCIqhSeRrJ%2BP9Ytc0wddxRjET4%3D" rel="nofollow">进阶数据库系列(十六):PostgreSQL 数据库高可用方案</a> </p><p><a href="https://link.segmentfault.com/?enc=mRcUhvP9gZVqm9M7wkcEAg%3D%3D.bb5IAJ0gUbFfeCSCroSGYhQSr39qwkv7oZcstSzDjJ7B9qNLUC9iDZo7vUtt9xcoD3Q02IykhilDtoJT%2FO3JGmalj%2F9D6c09dzuo0QTPsBzuJL1F9fmtzuiQsjtSiomuwJoFGjxF%2FuU5t4WQBVBV6W5RCNAnQ2ZFQdjIzB4eExMM6uUSHidpv%2BiOMBYe0eh8P1jGBTu6BfFn5xXqwJQYNCpBQpPEv2ZDAmV%2FNBQxJd4D7l6u9URu%2BzsYH3z1%2FndKFlNcV02hCWtQhT0DQG4UAeWDaeNmP8qG8pHocfqk%2FIE%3D" rel="nofollow">进阶数据库系列(十七):PostgreSQL 基于 Patroni 高可用架构部署及故障切换</a> </p><p><a href="https://link.segmentfault.com/?enc=yjmICohphVlYwD%2FtYJiBSA%3D%3D.QeN0tq2AFVrhUPvNKPbdKzgLPR3Eu1UH%2F0wkAh%2B4bG6y8MaE0c9XyGv%2BKRFaPW0pYxnp%2BEaDlV8ZyKdunoTSIOR3gTinqEEp9ZGhTUNYDQEFWBXYaXl5AMKyreKZM7OqHW9c%2BS9JGh1LCLo3Ky0KVUhbgyTfTwKi0Bk5OXN0VSNrsAisjyxgDq4OYTrZgTc5MW%2BoDVq%2BzpB4bIqBpxuu1OVHzv10uCxWsEByOz8QujnKl3b4Ywu0s9XvMyi53kpktUmcFlvUG4N3C0WtTwSiFgCubX3fPbwIVj0zatmdX1g%3D" rel="nofollow">进阶数据库系列(十八):PostgreSQL 基于 repmgr 高可用架构实践</a> </p><p><a href="https://link.segmentfault.com/?enc=%2FaaBUoQV0jbBnbYcI47TbA%3D%3D.6Och4%2BPmeAn7TV%2BGxQJ%2FwzSyipsJWaQGtYjB6MM9qnNssZjFi8tOV4SdMWPW7ouiUTtcQ7%2F72OCJZ8bdq0sko5KcI8GMA9w1nme6z0HdzGNiMd9JfBmLh%2BE0wrmWMNcST923M0s77sOLaGFQtWk3RxRTJjg41rbnT259rLbPAReuI385gXK%2FNCHh8FE1F%2Fheao%2FTpRf0cKihU%2F0RndK3%2FG4CTaMOjwd7qcK16ZnV6IpPN5kgpb%2FkYOKhg3XuArUqo9r0kBj%2FIJCIFk9l1XI2RY9y5Xzti61ydWZlVzzThjQ%3D" rel="nofollow">进阶数据库系列(十九):PostgreSQL 基于 Pgpool 实现读写分离</a> </p><p><a href="https://link.segmentfault.com/?enc=jZljGoj28v3eHdidf6gT1g%3D%3D.dqC7la7LyXnCPPuVEVbxg%2FQ%2BbADW96jlVkHcyal1Pno%2FqXDks19sDBO7kVOna7qSY2dL7Itp4Xx%2BGhi9%2BI4qdKIDBpuX2DSVf%2FdNez%2BWQ70ndDWttLjAvWpGcP5VONkEG7M4qlOK2eCVcOGvCoirGg1DzBWNCjmMBCwe%2BGcSRM00WwYCbkFDyeAlcbZeld%2FRDzkLN75QBjIPnWQrqev3CzUyGlfh4GV0Inb%2BOuDF%2FyPvLzUrGzan4qvOe1NUtVoz1xSXUV8yXgXsVCTc4BVoU3xoLktqC2Aq%2F6mK2AhRPEQ%3D" rel="nofollow">进阶数据库系列(二十):PostgreSQL 数据库备份与恢复</a> </p><p><a href="https://link.segmentfault.com/?enc=JBXj9c2HaH4HGhuMHubUOA%3D%3D.QNIyBEAdrGJlO7J3hBBmfZJ3C3z44hLSw16WCBB407cqaJh9BtNzzG3zUERm0fjTqrSPWXGKoAjRBMCOZvPoVsYx58sPYrhUvGoyb%2BZfHBsQzG1UqLIEpAl4dUY7vgaOu%2Bc1SBAsL83T6Wkyva94PRsriDocJ8bq5G3ygdA2SZLyTVnfy%2Fzi9dfGml7Hr7gIjPc0VQJmaLswt9fout9SGcBdHUDEADNzaYPVOmHhLLERWI8NThwTYO5gJ36nh20Tex%2FjVJUepKtCvfHCyIYhnHgCh1mhvlOE3GkMX7C2%2BD8%3D" rel="nofollow">进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg\_rewind</a> </p><p><a href="https://link.segmentfault.com/?enc=X1S7h%2Fmt0v8eWPmSbZIXOA%3D%3D.N3Z5LH3dLYmoFE8DUTrGGXS9STyWkWEQ790MpEZSeYZELaEdACESSu9plQ0ZMuGra5orqdwgeK%2FDANe7ekPq%2BZjjm0BZ7MzTeRt4AaWJIoj3KFrbo3VtD4FBxKz2PZsn%2FZuKsi6R3QYe8vBMyjpXMKyrqJ5sgZvNFHGl5aNaGvP5aNA8mk3KAIIJEtjEEBxNLQ6n6CO%2BsJitrKdpb9sDMHVKMbjwK51QvMnUCDM%2Bc7pY9K2rtLG1Pqs%2B8NVnUhc%2FJDOXuUWYmNCvImWgmPUzSogjFQx%2FB0m6Qm5klEVfVXE%3D" rel="nofollow">进阶数据库系列(二十二):PostgreSQL 数据库作业调度工具 pgAgent</a> </p><p><a href="https://link.segmentfault.com/?enc=GekNgrsRglisQP8TfB60TQ%3D%3D.qGkd10CfPClqRapzDsmIF4PGON%2BdiABldKZ6Pv1kGnDnt4r%2BeBWv80F5oroJ8QjXU3uoB9JZz2MoajtLCfJ5r1PN4MfyovJEiZrr%2FlS9%2FvLVf3JS%2FC2DnhpnDdiuV7moMI493SUUYE7wVy%2BrICQzx824lXe9eJ5068CfzHVR8p22YACAA3BQGQbQR37ouNEM9aG8rADznSuNMyuST0RcDdnWZ1zWIvix3Y%2FppSvO3wU2HSRMxPBSTQfxbKv%2BFEILlM%2B0WJu1%2FR6BYZeuoZExR1trHFnummZqcYQi2%2Byl%2FsI%3D" rel="nofollow">进阶数据库系列(二十三):PostgreSQL 性能优化</a> </p><p><a href="https://link.segmentfault.com/?enc=NTLi0RUzw95FOWh4Ocd7Wg%3D%3D.FXEKSTTfvYQp%2FHG4kka28wv%2Bi6xv2%2BMZswllNpRc9rIkBTrIx%2B%2FPOM4ZPNv5s9fSbs20ozreoB4BMyQG21G8bxCzzt2bra7kjDmEsaFSp2V84N9IhKOg4uy7RRXmbpUHd0GyGcjFy1IdeVtnDFwA9474yArRoiHihLCFsYahw5jwhea7dh1PausFrGR5Hzpct9mtfmKeV0IPY%2FCSmcb9hOBCstKheGs66EC6zHYrQwMXcg%2Fr5SCn0q7RSNkgIM1zLVJTGBnmBP%2FX%2FZl%2FQGSlMT1GC9nISuBtFqPUJHWX%2FBE%3D" rel="nofollow">进阶数据库系列(二十四):PostgreSQL 数据库日志与日常巡检</a> </p><p><a href="https://link.segmentfault.com/?enc=kjrkxh95UTW7os%2BE2gqwTg%3D%3D.hWWv16OAVeMlrCkJCPiCC4cUdYR%2BfEyyARFaOMDJNf1nlDvT9t1tWvh2y07YHo%2BdldvmwDWowPsgYnxhu4dldYOSzHwArFx6cIfWT5HsdtXyMq5oj3PRlbnAh6TU4g2BXFXQd%2F43WlogNOcjBOHsxxzD%2B6WsIc%2BKgoTzbsJ8KJHsgnLd0ajdNnHdRtyb2bLXhcLoPoDz270F%2FjANjulZ1W2XMvKbwjmRenhzl%2FQmqhZpbTC93R0S90KL%2Fy%2Fvd1MbQtcOwRtwmPAPNnI1rrqXw119RJUKn0NRzc0M19vIWcs%3D" rel="nofollow">进阶数据库系列(二十五):PostgreSQL 数据库日常运维管理</a> </p><p><a href="https://link.segmentfault.com/?enc=o4x80DPwH0l7hOXnvkMjzA%3D%3D.8tXBl6FGfTkeIubFH%2B0%2BSJG4MHKB8WJv26R0n1hRy1hmh%2BZXQsPzNJi77G81lhJk2BWuFsBXznmjidoibnraZfeK%2FAqB4GJR%2F4nTkhVcjvUZD6F%2BcFj966G4MHdN97G9rCnBO0Gd4gbkPZIgTEtmmd78eLDPpiZkeAAjVMpNXW8Ulxq2gEwDMVpm%2B25KeFbLuxB8GJ99LEWPZhVSWvUN5Uely1XogLc6XeIB6%2BEuM2%2Bnez%2F9ieQLy4sc70kmCRzYXM%2BXqO6LbAIH6mG%2B4J2ZqZwia0ydQrjgDw%2BPG9r7JR0%3D" rel="nofollow">进阶数据库系列(二十六):PostgreSQL 数据库监控管理</a> </p><p><strong>终终终于卷完了!!!!</strong></p><p><strong>希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!</strong></p>
终于肝完了!全网最全、最详细、最全面的 Hadoop大数据学习教程( 2023最新版 )
https://segmentfault.com/a/1190000043945295
2023-06-28T15:59:04+08:00
2023-06-28T15:59:04+08:00
民工哥
https://segmentfault.com/u/jishuroad
6
<p>大家好,我是民工哥!</p><p>前面给大家介绍了:关系型数据库 <a href="https://link.segmentfault.com/?enc=XYelaK8GjYElAGskRC6yUA%3D%3D.SOfQ2K3TS%2BpjrB94oKQ3kOXKWK%2FeYcv4A%2FVQ0H7sbDF6x5dtbWAl4%2Bl8c%2FDDuZ08F5mJ67ACqjgoZ807v3cXi9PlGa5gYi3ZzsDnMSMTfXv5bE8ZWg5Rc8JeZdCmcUEsl1adFtNAbC6psUfZyXRrwhuyhqW6%2BQXTWuJR6phr4URoOnoVGxDzNrxgZXppJnmM32LWTPWlay2%2BGbSNI4bn9oI9q%2BrE%2Fj9WTboO8CTHRFs0G0%2FRtFxOCkdLtZA7JIQb%2BZ65yXV0bcwzHKm6FZXegIr%2FUQSUTiO6%2F%2BtFaGYYPY8%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=umk6zAX4WTGGIhDEOH7JWA%3D%3D.9xvSDB3yad278B7e%2BXH8VYzvAv8U6qeM5Kw2aIw27qKY2MNnXsIYCagAjS6QXEm2chn7T19wEiUMdsdxtw%2FifOvsotsPQC61P%2BJAlh6Pqk3sPNPlXjkTiGwK81fXJ%2FWl0iC7mkBGoHeBQ5shmzDetC5MX6xvFVJ%2FM8QlQbwTLJNBFlCrJaQqQovI4Px01oofJI5WgYG5vX0eVamB0Au5aIvk44A8HgWVgc7F%2Fmo868NbcsWKxXcbLcMrHyOnIo8%2BcOdc1VWZpM7wxfRgzQnRJO2b62Ikb6GgFyzthvIX9NE%3D" rel="nofollow">Redis</a> 、 <a href="https://link.segmentfault.com/?enc=VpBPbiQ9Vrn8O0owdlyIsQ%3D%3D.mAxgzyFI%2B%2BE5FRcjm4YmQ16MRHTzGDtjfp%2FgdWbOTphyi5LbyQmpDmyIkNatSU6zkI7I8euU1lGxhN5n7c92mt9m0XfOWFD5kgvX%2FWe1qeTq65couWKG%2BcZHqJU4QXb16dP3iv9ufHlz6w%2BczHynRukTjO%2FdUPlT3b4UfSyAKWAHjDA%2FHhTS%2BBcAfPmidGUAWpI1niUu8BrzDleOXYG3Sp0YKbb70ncEiiAaK6sVdQbFLkL5kMct9eI7yTGK34YeZ1TN7PthGhyETw8QQK28vqtuV6zu2N3i9FY4cyuHqDpQJNv0AaCfyE5A0Lhd5RGYMVzTNUcQ7Yu6cUTtmaov9g%3D%3D" rel="nofollow">MongoDB</a> 、搜索引擎 <a href="https://link.segmentfault.com/?enc=VSEaBbT1pE%2FuQt8%2FeKrN1g%3D%3D.JdCKzwol58OpQdyA%2FLDCZ61vV5IzmHSJVQLVeFZJfiqyKpZxHF3uTrRyI4UAwWVm6u%2BkuyAWgk8Jmg19tC8aQ%2Fk%2FzPQsj1oQioIsOKEMKjVC0RxYTVPRY4G%2B5S00pkDDtZ86ZKp%2BhjjBv6q9alDZwHPd0Kyja8%2BQYFh8iCTpXnUukr4I0lqg5dWATrpcZGtS4%2FkbUV%2BADJlu1b2Hb6f%2F2QKoy1MtROY78%2FUWIwCRDfXdvvvLaUtqGsJXNXQv2YcuitvbhkAkxHiSEUgGRL%2BoCkCIQrZK6yMaeRya%2Fyhw3yM%3D" rel="nofollow">ElasticSearch</a> 等知识体系学习的文章。</p><p>在当今这样的就业大背景下,<strong>卷是肯定的,强大自己也是必须的</strong>。所以,学习不能停,必须一直卷下去。截止今天,又一个知识体系的学习之旅:<strong>大数据 Hadoop 框架</strong> 卷完了<strong>。</strong>希望大家能够从中收获多多!如有帮助,请点<strong>在看</strong>、<strong>转发支持</strong>一波!!!</p><h2>大数据概述</h2><p>大数据(big data),指的是在一定时间范围内不能以常规软件工具处理(存储和计算)的大而复杂的数据集。说白了大数据就是使用单台计算机没法在规定时间内处理完,或者压根就没法处理的数据集。<img src="/img/remote/1460000043945297" alt="图片" title="图片"></p><p>Hadoop 是用于处理大数据的工具之一。Hadoop 和其他软件产品通过特定的专有算法和方法来解释或解析大数据搜索的结果。<img src="/img/remote/1460000043945298" alt="图片" title="图片">在大数据处理上,Hadoop并非是唯一的分布式处理架构,但是对于大部分的企业来说,基于Hadoop已经能够满足绝大部分的数据需求,因此才会成为现在的主流选择。</p><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!</strong></p><p><a href="https://link.segmentfault.com/?enc=%2BJn2I3rVZhEuNGFvBw31fQ%3D%3D.8oddlBgfiLZdA8s%2BFCR%2BGEknBGIap45PpO0phaJKo0a%2BtWx6yKEj15iAuyugrXH1lNU%2FIbSq3LdMqzpQWGqSUNFdemRf3XuIDFeDNLR6j7rV1jTC9ZFyN9mkKsE7Ow5iNCsE4KrVMuOGWV75ob5yUYfBv%2FLyGu%2FaLf9yQkQ8bQQUPJ66rCyMtHW0LPFIU4NcUf1kezzdxKiPbj2LgpZfYATze17%2FLFEegsTrFU5yIkxGB0Iyo%2FmOw%2BI72n7MQHiS4EwCU1O%2BLIsHv1o%2BdNDF4Tn%2F7Tb43tg%2Ff0QaPO1iRDA%3D" rel="nofollow">进击大数据系列(一):Hadoop 基本概念与生态介绍</a> </p><p><a href="https://link.segmentfault.com/?enc=GYU3GKulmzCXUJRJzNAyDg%3D%3D.0cSP652xfxWxtmI28xEzuONDbxgrrbkDyzw0cJo3LAsAz35SbO6QZ8i2wpOEGBSWazvJq1W%2BYBVsjMVJEjVA53oUUCGTRN33DLzOprXzdfY%2B18BAWtHv9pS2BWZITiZj5BlbHucv3G8nH%2FWMg6dmoyz%2Fr6dAAi%2BszMpSeMQfNpPSC%2Fh7Edi0Kltv1SzmgcOGxJzWVHDaq24sK6flhjnDDJU4aE7eEX5FNoPN03oNMG4ZOSH5ZtGQ4dG2Cti2nw%2FOb30ay%2BOBL4d8D5rYYCbTpdG0%2BkKik%2Ff2yadvWnpAL1k%3D" rel="nofollow">进击大数据系列(二):Hadoop 安装(HDFS+YARN+MapReduce)实战操作</a> </p><p><a href="https://link.segmentfault.com/?enc=f%2B7qLLzekpSiiFihDDoM9Q%3D%3D.ok%2BWigX%2BoXFckxEcJoijfk7QSxTczLPgnddhbvwOQCYdPB5MbbhAyIN0pg6jYw4CzJJWUTclzLdzoARn2dMbZKIwsmsy5HkbazdFBHHiP0w00OvaAbzGg9IERNBcu4W6kR52QQisD4ZjBP6vXU8pIudOXTKwxsKvNPMIq6Du8v8xtQvEtMXt27CYSR4a9UtF2jxJlRLSRaxYmfXm66RB4OqbHwiTO6w%2B3Qq707r%2BFAzUv4gkSsTBAJMJyMVkJHKAzP25Tr3ukjpZed%2Fx3eTNx0LL%2BWPmiKGo8pvmkVw%2BbAY%3D" rel="nofollow">进击大数据系列(三):Hadoop 常用命令介绍</a> </p><p><a href="https://link.segmentfault.com/?enc=6V44Z71ldyvFJhEhTIrthw%3D%3D.tl%2BU33KFlc8ddgOkrSaQSBQjRpElIklXR4JFB7ZxRDYFLFRHbcCuOGTAZ%2ByIhRVxNFp4vk5rMgQUT4o8vC4ZT6073mZiZo90uWMJSCElQh4bKRweCMwJ8l0b%2FpDSEN%2B8sKu97p8wNnxT9QI5ISpFBzPKoX8H9ppP8Ix0XdZMoehLgMH6rdMWKB9PV8O48hQUEkW4WMqXFTSY8r%2BYbumTZZXrtfmk%2BgGCq%2FZHKrjzNFAEeRfR9YhtnwCiC7sTFzmFuVRiBJqcBS8%2FoaQD8n41V1f520prmw0DBcjb7Al%2BZNw%3D" rel="nofollow">进击大数据系列(四):Hadoop 架构基石分布式文件系统 HDFS</a> </p><p><a href="https://link.segmentfault.com/?enc=RQoz21f2v6Ic4by3GAvPaw%3D%3D.Xy09uyiNHyT6vsm1Le829Zdd5f58jAOF9aEkIwD5oqeE%2BIyYwN9Zx6vLyhQPMNFnaQEJZKdPOPCcE0%2FtcIwC1qwfOESDF87C6tgFJF7R%2BwgfN%2BPnOBgjdSt8UADOEkD9AeYUZqO1UUk0cE61OyNnpkX58KLFgWLIAR7rxF4IAHhB1M8%2BfOBVFZbCP4hihJzYlceEiwcrJkSvqmRrVwO6Tdb1jpDzWGibnSWapRMuzZRUe4eIpwgLlkOMRNjgbdTwj%2BJPbsY6BoSX6OvADIqV5NxQ9nZ32JC4Gr3wlrvXKcM%3D" rel="nofollow">进击大数据系列(五):Hadoop 统一资源管理和调度平台 YARN</a> </p><p><a href="https://link.segmentfault.com/?enc=6sza%2FQdsn30YRssl8IFPjw%3D%3D.DZoJWEiubGAaZmclTLRRjexWPp3V3b%2BF6zkBy0X1Z77dM4jzTRemZFnUbwYz4udX6ApwfO3LmCqxuXVyDoOUr0WftQOrJdeA0W%2BaJXun6RAa7hl8SHaKlJuiMTOaYmV3OuygxRJALNGfuSs2VJIKrYAc9Fo6e5tjttYp2jeFN8%2FoHoYDCKxhdyUq5w7ml8aQFOB5eicm8oxJVBinRxTPjzNJsQFWsKjMxW7MxUsb4%2FVxFauMSU36DnbskGmMdvYmDr8dfG%2FMRW9r%2F9upalBe04djBTdNwy1h4Yl3oBrX7SQ%3D" rel="nofollow">进击大数据系列(六):Hadoop 分布式计算框架 MapReduce</a> </p><p><a href="https://link.segmentfault.com/?enc=zHT5PleyGuBmQ2Hl8kmReQ%3D%3D.lfpr1qz2kD97ZtOhUO%2FDS85rP%2BkFXZkTGiChrPVHJmCqpVygtUeCbLsSqw1aRFsoZcM6mCoRsnBBaLdeaNId4WfWJXeMK8qkmuflsDa3S1uQT1dNuSTjptoyLzx5au8rgnKpvEYzyb%2BeaEriWzKcrHqkJTASV%2BraJic8X4s%2BaGuzIbW08FxYdNQNBcRFHEI7ff0okOmL2vE8QTT544Q%2FNT7ZdQY4qGqJcji0uyrmTKm1GeksLn%2F10IYth1ueVo7y%2Bq30f7oXQWQ8E5Smx1J5rVO4n%2BRxKxrFtyayDoUUb7M%3D" rel="nofollow">进击大数据系列(七):Hadoop 数据仓库 Hive</a> </p><p><a href="https://link.segmentfault.com/?enc=1airkCmdDuUvD6kWpfxopg%3D%3D.rfffw4IssIp%2BiKu0QTr1Db%2F58Vciwy%2BW78mxGYrZ22ZjbvyjAx3oDi75j26JUOCCaw%2FSNF406EsYiWXhefyHMXldflZ8%2B5YwQaoee4wVJp2BwjRHSpVYv8tKMrvBpK8ONUyQ0%2BOJ%2Bu93oab%2FXCLTpGKy3ApFUVXGNblGHJlB2Vrvg8W1OF60PYcgvHI%2Fx4aDfeDXQ%2Fl7683HnKq4QRuJ%2F27x2XtQthxDMAHZMayywknOuQZ3mTKI%2Fldka85tHGxhNl%2BP%2FCNW0P%2BZ%2FSiHJgqPGM%2BO4Ch9c6cN2HMdyyxaGJg%3D" rel="nofollow">进击大数据系列(八)Hadoop 通用计算引擎 Spark</a> </p><p><a href="https://link.segmentfault.com/?enc=AA6YONnHB2QuTEJ3ZkbZ1Q%3D%3D.s%2BFw%2FsOfFg5mAv0iZ8G8LmAgk%2FkjKCkkqt0bPqSW%2BCWjO2tetPpNhcmZvkdvBe%2BpCugEqxVcIknCMqdFBmJ8Y03COhHpEydb4iQvai6Xl1PiE6idZ8Rg%2FO0FDbps4JhRAf1FgSPedl1AaqbmoKm6NmPt3a4XVMH%2FjDy7m6HpWHY5etotLlc0rTkOf9n%2BKgeGMCsPbiLjaMGN39A%2FSwCWYgTlKXlXfTNRdC4RPUaUYaMSUytQ1492QLGCMVAERVGe%2BYscKaMGnMQkU8v4aysEk%2FJslqHOefY%2Bp66EM0QNf6Y%3D" rel="nofollow">进击大数据系列(九)Hadoop 实时计算流计算引擎 Flink</a> </p><p><a href="https://link.segmentfault.com/?enc=BhE2uUtTnI3eCpxBVVWHIQ%3D%3D.06G9%2Fh4Vve70fCPSCSi71JFCBoJ2HQVBcXU3JzD4hstYxTt1rx7CuJkRJVIt0Cg5p7IpSUx19Be17agBxQlfEQydWwUFMWn5gfm0OtHnhbmxD1MMYKBHf8hExUqSenyCL0oyjz8HGwhgf0smhztCVj3Cj0ZcKJHTWbeXP5o7ArKPGwO%2FgasNj9QdXa%2FAyp2o5jeEYAWqHSi%2F9dOGaVYtLRqcMygdK%2FwbKYkfvJr0i4D6LqqPAbJMqYMZVZqfhX94tZxuOZ%2BYghc02e%2BZnNFy8bbn38x4fJkrCalUs5oQMHg%3D" rel="nofollow">进击大数据系列(十)Hadoop 架构数据库 Hbase</a> </p><p><a href="https://link.segmentfault.com/?enc=Y8PH8JDNyMMUWSiIV8Ohag%3D%3D.AfGpP3RTCnkpaIU%2Fru6dJiCPe5k2D7zNtwspDuuNiI1eSkndsvJNocA%2BX3X0rlzHnQKqSm0gx0fv3Bys1lv6l%2FrV6d5BAfrObl%2F4chLGOSsBBDg9Cy1%2BVBnIP315Ua%2Bf8axWeHxvulN3EGev3xZt8kNNRwrOp4aKSoPKz0N95KrpY1R0fI4G4aY5bS3G7pVRTdFB85FRJ%2B93EfaOcS5jif0j2rn9nedXX6iemmwLNor58Vf8TC1AV2NOmjTaviRe6oUcReRxTgr96BHG%2FUhov4KqMubZIfI%2F0jToyDoNKiE%3D" rel="nofollow">进击大数据系列(十一)Hadoop 任务调度框架 Oozie</a> </p><p><a href="https://link.segmentfault.com/?enc=dJyydTAoJ1kUk4tnC1S9iw%3D%3D.%2FHzyyCAu4xoSuX6FkNK%2FOKE8GTxEraGNWg86v6Z2q5oz8llTvYGV%2Ff%2B740Vrqaeg%2F2cdLG%2Fk7xhg2mMR8PObjouw135lvFrc7H2hkV8iMdjfcWZW2C7bGTBkiUqHJxRjVqREAg3GKV2QwLAxNSteVO4JQnPvZQsobVUOAMzFhfJbqSaZGMxSscJ61WRimoZ%2FTlP0HQE0uSD%2F2SHcaM97IDkI0vlk%2FGcUmsRVOOKaX0Zsm1Pzf8fTK3wwMFd6bq0szmBn17F4lD1khX593nlgziBfQBNYEXrPbodWw0%2BhzB8%3D" rel="nofollow">进击大数据系列(十二)Hadoop 数据同步工具 Sqoop</a> </p><p><a href="https://link.segmentfault.com/?enc=H8hXkiaZEc7hBktll1B6GQ%3D%3D.6%2B1toZ%2F27WrnherAulAqtC8dy8zeodHibpF5lrvi%2Ff3hwf1GOB1t7RAWgNS8iRo6ZVgtBNZigZnBCPwkcsceHzxzLGsOXoPJY6V6jZx4u2%2FG05fhqPsAGJ15QuHWvW7qWiN151WYo7exDjG3OXTtG2owORHV45V8TWTMOvOaeRnhh0l8qGlir1gGcHOB2r4Q86MJJ0LyKfZeqtV2csoaYjxGniplj%2FWkGmEB3Oij%2FiV7cFQF82Bmi8xLMpIogZ71JrxeSgSYnW9WeE4r9MW9%2FPQvN0Lxo5V1hUr2pI17zas%3D" rel="nofollow">进击大数据系列(十三)Hadoop 分布式日志采集系统 Flume</a> </p><p><a href="https://link.segmentfault.com/?enc=skwLYSf358nF0yzSP19IbQ%3D%3D.X9vAcQJ0aXC1kkcYcz47G%2BcFt%2B85Ok8rFh775j5rZZFJtt7OY2Nk71%2F50NMb%2Fw9IHUWK0IkaVW9O8d4EOQy7b8Bkd6cm8BCAb0AmG8J%2FY4oGDSty8VcA5aU3%2B3swr0hd5tfUglkI%2FPzgenapOcayOipVgP5ucAJuGj26OU7jhg8cnw9b6piiVCJLdtNI1%2Bx%2F%2F07CeTZCATeKESBZu7bvjaZl2PfCp4n55%2BoqzlmNDorY3qf2NCHZ6h3rFSXxg0E%2FlleuY2a%2FJO24zI2LP%2B1O11EutK4Vwdgifm91DUHb2G4%3D" rel="nofollow">进击大数据系列(十四)Hadoop 数据分析引擎 Apache Pig</a> </p><p><a href="https://link.segmentfault.com/?enc=P6LPslEkQLx4tKMGpEUg0Q%3D%3D.nQbKVIS6g4YJ6sszka24y%2FXO3AgtAEuz0PU1k3xqUnH%2BPjGkEJIa%2FitiDD7Yn31ZGDR56e3TkMqBcy3BmH%2Fs92H6Jm0Q0A2yb0O2dCxvYZewqI%2Bura0a6VqCuzmFx6bBXJm6eoNpJbvkwJIowcvmTIrgABtKAPgnNEa74Qv4o19QHhUWLifbM4SRm1hK7OyxsHtDQNhMKtdGC68nQh9IMY7KgFnM4mbKOOgzyWiyl601TPHxwcrxB9rUbKgtzDFdI3yHELRVz3kZQj3QE9zvCh4dWin9s5Az3DFVpEvgVKQ%3D" rel="nofollow">进击大数据系列(十五)Hadoop 图形化管理系统 Hue</a> </p><p><a href="https://link.segmentfault.com/?enc=ytPm2g9ITHA5wCrVB9vpZQ%3D%3D.OeyYFJL%2BAUNBXLK8RnR%2FAWF7OwvJQ4Fn4JiIwbSLQEV%2BMc6H2pJnFJ4TRBY3YYnQ9pP3pi8s4jBfhxbJKJ%2F1nNiaw06ARKMJsvPlkmQTvsOk46w%2F76YTC9Now3ccLsdLdk5RqbWpUHxBuqs12j1qhYJMHoy4Z5YNiWS4BvFp0rc0GtxuQNOcUI9Wl0%2BubM7qiUiY%2B1MeyWfC8KH9Vup%2BTCc7cLiKhKWSZZJcDgk2tupL23L6tLb3wibVgvbehY33gxEALflm%2BERYNI3LcKTe9LWwNoJXRrcmWcwfK6JB19c%3D" rel="nofollow">进击大数据系列(十六)Hadoop 性能优化与运维</a> </p><p><strong>如果本文对你有帮助的话,欢迎点赞&转发,这对我继续分享&创作优质文章非常重要。感谢</strong></p><p><strong>如有错误或其它问题,欢迎小伙伴留言评论、指正。如有帮助,欢迎点赞+转发分享。</strong> <br>更多相关开源技术文章,请持续关注:<strong><a href="https://link.segmentfault.com/?enc=qGzsLic%2FlbmMsLPqMPrQCg%3D%3D.3sThLfkvtoy8DyTQgWBZKl7sMd%2BvnTPVUAhssqFh6lG0OtLG1SN6qs7qE6G0g5iZ236we4w%2BLF%2FjS2pEqh50sjyzIJY6O1WTS%2Bucr4kV3vXe7CZUePLmcOEM2SaAaHQUsRU2bGxM5%2Bqxm%2BmH130lejYiVC53txu1LNWKCMhj8FlVi0w7usPcpfqJuvpxWSDCTY%2BvK5lLkv0PJyMTOxwG9LYpDNT6nIaD6fm7pPLEuLkKLozwl2WUBlcrga9ZloVmJJUca7c4PQd3BpUuKqIo5g%3D%3D" rel="nofollow">民工哥技术专栏</a></strong></p>
终于卷完了! ElasticSearch 打怪升级进阶成神之路( 2023最新版 )
https://segmentfault.com/a/1190000043886875
2023-06-11T13:50:31+08:00
2023-06-11T13:50:31+08:00
民工哥
https://segmentfault.com/u/jishuroad
11
<p>大家好,我是民工哥!</p><p>前面给大家介绍了:关系型数据库 <a href="https://link.segmentfault.com/?enc=dFRAnlg0fAixVCk6%2FYhjew%3D%3D.9jNlr2nBYpJJ%2BOxb%2BrzsQ1kKel%2FMe6ICnDsAJYgjU6ny3WWe4rVQnac3TMy%2FTzqrmht0sCqjDmvu%2BQyvLrzbt3SIdu%2BHvHt4ytOjL1alIqTd9MQa7%2FQZPDQkMb%2FN0FTSc1gfAU0MlI%2BXK1gfwI0LTGMqv0xxZ9KI6okXysNfbKeBXqVQHLxyC5EqHY5HZ9dAnF74HoTU95O%2BUW2sRNI0uApv7AmYVv%2B1S58FE2%2BG%2BDfJy7BB%2FkGbJ4M1737aDcAbnMMMDihoY1q0KhjFjYmjdFMNh9qY12oq9r8nJl9Gl2Q%3D" rel="nofollow">MySQL</a> 、 NoSQL 数据库 <a href="https://link.segmentfault.com/?enc=zpXcz%2BTVqh2AnKazmPVw3g%3D%3D.UoC0iVuIxOIHtb91zecwZDZQqiL%2BLpmay1PqbvKPnYcxU77f4Vrii7g5nd5VyfFfaHqs9Zqf8L5tEhiSQs1Yeb6Lg5bd6i0ZCA2uqkWP4qXbldG%2Bv1Cup%2BRWSf%2FrnTXohgc89us3rGFqWU1xgsdo3NUV%2BdUkgpUcuEwybj5cZHqNkUpP%2Bso6HW2qPAJQjvPJWrT7GxaGaxLupFd70CE%2Bo%2BgqnZ5ntnVS7X7uEkicx9eSZczsMhX8foGMbce12GLwW0JghyYCDhhSM5nLKwqERDxPBC%2FkQQDV8QkCxcx%2Bx5E%3D" rel="nofollow">Redis</a> 与 <a href="https://link.segmentfault.com/?enc=fO%2F7v3HmKNZH1R6bod264A%3D%3D.5FU2ptnC6A%2BVQLlp%2FCPU8tpxpG3BmtafVIPdI7U31SUUrwEt0d3Els3kXIC8sZEWWKz7Fx1eCGUKahIFyFSzKHS8%2BS%2F50k94sP4DLFRSADvzdJlta%2ByNhfTqQI9sOB8SfcMXd%2BDDwPmtMLIzlcwyg27QHorAdEiRYwBlBVEpZyM%2FxuyUESzjp3ZKvEermqanxVrND0uc87Zmo1AtQMF5u9ckRonoU6EvY29jmqgygsf1xkssRJHBejX1Q30Pkpp4L%2BjZfymN2gYDSTy01IVoGRGe1UiE23PZVwZnIRJmKc0msTeMN6Sy9ZrkTUTrQMQcbwIICGJrQaowDnZuAa%2BoUw%3D%3D" rel="nofollow">MongoDB</a> 知识体系学习的文章。</p><p>在当今这样的就业大背景下,<strong>卷是肯定的,强大自己也是必须的</strong>。所以,学习不能停,必须一直卷下去。所以,从今天开始,让我们一起卷下一个知识体系的学习之旅:<strong>搜索引擎 ElasticSearch</strong> 。希望大家能够从中收获多多!如有帮助,请点<strong>在看</strong>、<strong>转发支持</strong>一波!!!</p><p><strong>边学边实战系列之搜索引擎 ElasticSearch !</strong></p><h2>为什么需要学习 ElasticSearch</h2><p>根据 DB Engine 的排名显示,ElasticSearch 是最受欢迎的企业级搜索引擎。下图红色勾选的是我们前面的系列详解的,除此之外你可以看到搜索库ElasticSearch在前十名内:<img src="/img/remote/1460000043886877" alt="图片" title="图片"></p><h4>所以为什么要学习 ElasticSearch 呢?</h4><p>1、在当前软件行业中,搜索是一个软件系统或平台的基本功能, 学习ElasticSearch就可以为相应的软件打造出良好的搜索体验。</p><p>2、其次,ElasticSearch具备非常强的大数据分析能力。虽然Hadoop也可以做大数据分析,但是ElasticSearch的分析能力非常高,具备Hadoop不具备的能力。比如有时候用Hadoop分析一个结果,可能等待的时间比较长。</p><p>3、ElasticSearch可以很方便的进行使用,可以将其安装在个人的笔记本电脑,也可以在生产环境中,将其进行水平扩展。</p><p>4、国内比较大的互联网公司都在使用,比如小米、滴滴、携程等公司。另外,在腾讯云、阿里云的云平台上,也都有相应的ElasticSearch云产品可以使用。</p><p>5、在当今大数据时代,掌握近实时的搜索和分析能力,才能掌握核心竞争力,洞见未来。</p><p><strong>今天 ,终终终于卷完了!!!!</strong></p><p><strong>希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!</strong></p><p><a href="https://link.segmentfault.com/?enc=HaYHNeI3xuBNnDmQ0pbXNA%3D%3D.qIorNb9e3xPYW3mNEpuB2aGWXDn6p%2BpX0iIzh5m%2BDIMEx9FbAyJfAS79PUdzeShrL9TVLub0cV8tocs1jr4jdPm%2BNhiEeWMyKm%2BRDjwkTWBzaSuPbxzs5GCpZGmWBkfBrlx6UGNiAhr13PTYmzIOKiGKsWMcYtW8mkvoUvXz1LKhHAkUy2uekL7U50T0Vl47h1ZKYGtW%2BDDMa4f3%2BxliZAwmRFKc1SbHiOvi0DRHGFy%2F9MHQZTVtk9Lm3wcbgiGA7GrLYz3qHtWD0MBafadFbz9Cxj9kLbfjTloF%2FK1vo1s%3D" rel="nofollow">边学边实战系列(一):ElasticSearch 基础概念、生态和应用场景</a> </p><p><a href="https://link.segmentfault.com/?enc=wOSXDwCXoUKwc%2F1XicMAgw%3D%3D.8lBn4Lmv1jAxBhCO0jr2amtT2qNZuR2ssS7lks7jtfiihz7m6vEo5vrhmrAwKFOAIE%2BdTIC9LgdEmWYjmlqMQlkNH0YTYmpwFV05LiA6w9Pjlnv%2BmH%2BnA716ukLtX7s9bHAwgdoQanz98jXxfugccSq3dnYKh%2FlvgnzriKdtSKkg85a%2BS5QRbTRzGhwsTxX0zTLxi%2Fa0kY73kGTMrFiQw%2F3XTMj74aykvT372qilpH7ycco6qAMC%2FpDeeQxCG5AGwSfu1OgsE50ECWEqUNGxQ89gvIhErjVTLsy%2FQPb7LN4%3D" rel="nofollow">边学边实战系列(二):ElasticSearch 技术原理图解</a> </p><p><a href="https://link.segmentfault.com/?enc=NCgD9%2FiiIa75Td9di%2BXQ9A%3D%3D.sz1vJEwvAsxHRhLYtijyK1LUHJcTNSupXHd3vf3R%2FQHC6cr64X4I9vT16oRqfKrZCLDF6t8o3IpE9YpKX7RSIWlI3TkxZw79sEoqEx9zqk9Xn6UQ3L8AJkDjD%2BKTEAM6OFtesl9Bp8qQ1BBiQuqU38i3dlQavYhwPhzmr4QaZZEsDW%2FnNZZF1oe7q8ezXy%2F3%2FNzP91vJgKjFRDSe1sK0sMrLHRazFpTj%2FqJLPx69xHaGHQc1Ze5xsxj29Hr3cqn6Ftft%2F%2FxlxFOwosbwGzqZcizRdK40TzaErT0%2F%2BXRpltk%3D" rel="nofollow">边学边实战系列(三):ElasticSearch 安装与基础使用</a> </p><p><a href="https://link.segmentfault.com/?enc=meAcg842yiJIm2ogEKAULw%3D%3D.qobs0NJamn0NIOV0n2xrEGSGFqn2S9dvI2hUqQMcLi0tx2WU2d7X2NtM6vRPmmZ4HYJpdScjyWbXlAJxBSN%2FhCLFbm2Y%2B4abfzMAKcXc0jLko%2BmHTBkXo8ZezbkzAJCyLVeRWoNe7UqOHUZh3gWTmZWNgVYtR%2BP8%2FlOCYdxLOxBFPC9OE1RXtRaZQhz%2F7kUI5Bg5UWUE27qhkM%2FPcSEv%2FOAG1jpEf9m%2F4Ro%2FRqfEdc6c4ppqTBmq32oYpFza8syl8CGhG7p5MtwAJ0098g3BNHF%2FhxQuxYcaP4jPvstjJKw%3D" rel="nofollow">边学边实战系列(四):ElasticSearch 索引管理</a> </p><p><a href="https://link.segmentfault.com/?enc=3fHQStB7pEMQFY4pN0nMAQ%3D%3D.LHV%2BhuzOtlmsh%2BxB9Gi9WFRoJD2MiVD8%2BuvLlQo0Btyk%2BKxklisQuSrIO460F0EptQafdiYNakxvxQ5%2BOTRkrrwvWymtKUKf0aBrZLJyyXgm%2F4Lz8JhCPUV%2BdQ7h%2FNcJ3xKn16avUbItgMzIH0HF8%2FpITtI3jlsTi1sDPFrQGdhjgGKpplsay3Yx9OshRxeoiG%2B0Y1zNMpj021A8DoZZ6ECm7awFzEIlMW21hilABSJ6Q4XIekA2CMuA7b0%2FB38tMqmZ7L%2Fl%2F5xU%2FEs4mBzJHa5ZednVkP8TrBa%2By9xXUZY%3D" rel="nofollow">边学边实战系列(五):ElasticSearch DSL 查询原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=fKsswftbdRZVOSK0hIkkKQ%3D%3D.utfvfx2hU8FNoqOe5shS8J85hIx8e4jqb4n9r5olKKWq6cXAzpbblAxkBTFDtBzDusKPBJMwSouM4yxtUNH%2BjNb8XCi2nYBMiwTHUBHrmo6eBmujrEM2B9urlj4y33Oql77SL68qZd6uLotXL2HX674Oo25naoUpslB1GBtWNmgFbGuXVrG8swtT4cpqGt3%2FirBDxWtc2IhYhqKmwOOQNXKBoSdxjvVR%2BcAK6RPK9OANnmeaKwKsvW2870g1wWS0CwqEPqdpmLRB1FVkTPUezgcHe7Zmxvj4s4rUPT2G3yI%3D" rel="nofollow">边学边实战系列(六):ElasticSearch 聚合查询原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=gd9GGNqXJG3YpiX5H2SXWg%3D%3D.7K4JE5uRJhftKKjfIAuzOU802Y%2FVfCTpv83p8jxLoK4tWeXyT5El%2FbhUOCv4DQT9cxDLIO029cafOy4WH6Hj%2BvH0kRpoO0Xh%2FnyleInNyce5KVh23D8YJI7J1ljs33CbnY%2BzLE4JufbwNbVE0LubSq7rQH%2Buy64b1bxDJt3qnSgD65YoGPYznLS9zytA8lKbailP3Vktf4LDvL7p633T87hM4BKSL%2B393Opdzi1brrBwQ%2F3A3dLIH%2Bk26kb9gheiMbggiyNPL8Sm1R5uzDlZlOzA%2B20fkKVlYuMRoY6ziw4%3D" rel="nofollow">边学边实战系列(七):ElasticSearch 文档索引与读取流程详解</a> </p><p><a href="https://link.segmentfault.com/?enc=pSa8R%2FYlYRuSCvIN3GZv1g%3D%3D.HBpl7bARjNCb6ia%2BUsDgZ1chgqhwGpMOHHiJAFZN13mtScprk%2B8UbXr5T4ZYKRhGzsEHok4NmbpahucUpkAqhi8QWmrLkh6GLjrNZvQVszI9QoX5k0lQzNwq7hV9Vk2PYnRvT5kiHXaM%2Fq91KCfCZmMzFY7mku0oXgEIBIvhPxpUu4uoRsi4nrBkf7%2F74a5b9XttMZRLmA4k%2BVny9s%2FpqcF46VPWfFIelgMGe5tSqaatGQetXO6rnlwxzp1y3nACl6pkgoMcyWuicWNxF65j8Pvf3XbzBVA%2FW3xz3dw9zbM%3D" rel="nofollow">边学边实战系列(八):ElasticSearch 集群部署、分片与故障转移</a> </p><p><a href="https://link.segmentfault.com/?enc=pLsJBqAwDu7mRumZhT6Vcw%3D%3D.aDE7VrqEi81xKrwZ%2BfG5aGvu433WxKbOdwwDB5qSeePsRwzJRrRPmw%2BlT8hFHB62nWKIyhCLomlwib3V79AvoJWEpdiyBIZpxLNrLKfzNrjiOX8H5EHmT2LnX7c9RbS5TbRDgbXKO219aUqt8ugeeiEvAeMBSumar7q1QsnKqwddZOhAKME%2FbzTe4WUgme5uw6JZOISJuMLY8KqGMXjNi%2FePlxvuKbHVsyQrfoUIyxVbKZf01M1W0bc9zMbjfJupB3iu%2F20LIjeI7ekmJw3iXBkYzd9gbb6R1JFgPVxPnOs%3D" rel="nofollow">边学边实战系列(九):ElasticSearch 集群规划与运维经验总结</a> </p><p><a href="https://link.segmentfault.com/?enc=cGEVMaSYJZXd%2FVhuqSLkVg%3D%3D.1ozJBIoIcM0VoAJkLbx%2BnYxU6HaQZ8152SRSfe%2FBlAbe49Zy1LEAmDFzHntgEp%2B0OC%2Fn%2BhIe36XBXo%2BJAzuhrp2hvR9edpUejxKlt8Xvkj09ZpjOom%2FzgBRFr3A2HMRb4bslUUGY%2FkYlwilIjYey9%2Fij8p2FwbULyM%2BmZYZKNJwnLJux%2BV%2BV0YphOq9Zb80rvB6aTqGqkLcRk438MBbkbLaBBmmxRi6u1nReVqcYlf9dJr1aybe5wXtZ03AQpX7q6PJd351HDfUgzmwk19myJTCc2Xz%2BoVd670rfApx2p%2Fg%3D" rel="nofollow">边学边实战系列(十):ElasticSearch 分片/副本与数据操作流程</a> </p><p><a href="https://link.segmentfault.com/?enc=slU%2FxuHIOcPSkT7gXgng9Q%3D%3D.NbJtfF6Coryb0KzpwT%2FmZLK%2FDcSpuHa2yrRJfCHgMuaj57hC79pHv0zMSlLor1A%2Fe3kQDkGs%2Ft7br3ke5RGZSF8JA26GZAs0vGKOisSjXNzxRxWZ4hFEii7IviVMhC2bsz5g84x0e72POkK3gSwJEjCxGyEBSbtiakRy7hZpUZqGItpvK%2BUmS323MSQZPAV594oAXUhIAJFpRehd%2FOrFuZyLnU3dVVCvrRfkZoFyU3XtfjIWPAH%2F%2F4Sz9ygsJYFpS5dqbHOffnC4QxGTobpJ5kl28mnFK5EXkixeTyy30Bg%3D" rel="nofollow">边学边实战系列(十一):ElasticSearch 数据备份与迁移</a> </p><p><a href="https://link.segmentfault.com/?enc=XBwjMKN8IfieHVg%2FiMtd6A%3D%3D.kU7nrL2Ilvd0weFDtuswISqlF0VDh7rWsfMqqe%2BWkJaEyyl1Rm70didyWpzymkcMumInEmT8dQl7FOG9PfybzgjR199ggnAhdEz8mwVNufPl2xeeJjlR%2Fd3Ys%2FWjyfi%2FcelvDAVqxPIUGCbo1GauW%2F90w0T0GWvkGtFHXPjL%2FArPhEWkPClmPmFZc9On%2F34MbQII6PZ5S91y1VxMQZUVwDWdKJ9n2NolHyc200E7Cx%2B8ZPEj04eutVHmojbgvFdi6bdZWh%2FcO4n9ai9S0ORQ9sCJ8SJXxy5hGXKThgc%2BKM4%3D" rel="nofollow">边学边实战系列(十二):ElasticSearch 常用 Curl 命令实践</a> </p><p><a href="https://link.segmentfault.com/?enc=JGFSe%2B0eSSJwpSZKBFxoEQ%3D%3D.9Wi41aEEYSX7v%2F7B552LbpigagKP6LM%2FU3KfCZvNX169RY0a2CJbnsoPMNWOLRMOZsFHW%2BtQuqvnrnoz6ZUxaZoof3i08AOQfTarwH%2BgpWWjP3BZOW3IaIBvEoJIQxYLiwD80csfjue91vL73Peq3AvPEo9Qav6uz%2BJ%2B1e5yVT8Vc8RxgnHRORTIY0q9OIjqG9CLJaSH2fuKmO4CmoFCeBpjWeR%2BuE2MGcfvpnqfujBpzgQgzW1iQWvP7zTbCH280AOOiFefMtChiV2aj1FSuZuv73KxXpWo9pBm4AU%2B8O0%3D" rel="nofollow">边学边实战系列(十三):ElasticSearch 可视化管理工具</a> </p><p><a href="https://link.segmentfault.com/?enc=VHRsDq9HrpEJijRboCAA3w%3D%3D.%2B9dOiv0d%2BkXY1aFOc8fOeJmtC5%2BdMy21hgXh8pn5F8WNN%2BXD5sCNK53PpmvitT9wl4QI9gmMSQZc4u5xJIjET9ThGeMkgq%2Fve%2FL8bXg8ZOnxVxFrx%2B7HyLzD%2BkZ1gal493xz3fHPSS9OhLNK1V%2ByOS6qI6hsM4WOA1EanFolJCNlDr2Re75Tnb0z46CUKOb5gDdUG5ZpOPmVIfvN6l5zxc%2BhPUp5fdzyuP8bAbbFUQUpcMYtC4ephWQ7DbABJtk761xZ%2BsUaKHC7snBBBLPNLk4sxtcSG7%2FRxNJd9zFw7Zo%3D" rel="nofollow">边学边实战系列(十四):ElasticSearch 性能优化详解</a> </p><p><a href="https://link.segmentfault.com/?enc=ZFkEy6BpRKSHkr0Q9xwh5w%3D%3D.bWZA5kXvCl1WFcZFFlK6EK2dk9dHLPdieFTXNlWFfYKjZ01myVPGygdUJJZ47zaeeuooPHHTmIjEStCQbVlBFvgwGLNnuSAGrEmi3Z2uwwrrkT8GpM7Qvxk%2F7cGXPxWy%2BOaBs93AgPOV85R8sR3CLtdxwtMV%2BDov3w7warED9Z%2Fi%2FT3HcRQM3jTZEvna6%2FFDn%2FE6gj7esQJvhvSKeilVlJ7qpMMwo34rfFkCG5JPOZog%2BUT8cL4C44Li084CtUJ4eMZcMY3%2BUBlOfxrnqwD6WwlY3ZUI2PBs2vzIcRZkJ5E%3D" rel="nofollow">边学边实战系列(十五):ElasticSearch 性能监控</a></p><p>希望大家能够从中收获多多!如有帮助,请点赞、转发支持一波!!!</p>
硬卷完了!MongoDB 打怪升级进阶成神之路( 2023 最新版 )!
https://segmentfault.com/a/1190000043831522
2023-05-26T10:44:58+08:00
2023-05-26T10:44:58+08:00
民工哥
https://segmentfault.com/u/jishuroad
13
<p>前面我们学习:<a href="https://link.segmentfault.com/?enc=GFL8ciirTVOZQ1eYu1Ybjg%3D%3D.UbJVC9PIN9idNyREOjVnGe4RFDDNYmXUuYuSDSPgJ0hPnDMBtPokTXhn9LB%2F7M6byjyGBEsYU%2Fs5C3PnQJHL639EEWITMdrJ86A9rVIDB3a1Jk90uEGrHPshRcdT97zndr8r1GaBBKla76IsO%2FDgoPLZ5vFuE2FB4RwL32Imw936h2bPJCW72pnekc1ET141XvPTxmw%2BlhkPg%2F3OVmke5UIKa%2FJoxrBhxlm52j8Eh7l0ooyLeGRk16%2FuWLvB%2B3fznW1oyETwTgY8ODoajvKyKWxO0K2RJKyRVjheeLlVvMg%3D" rel="nofollow">MySQL 打怪升级进阶成神之路</a>、<a href="https://link.segmentfault.com/?enc=AdXtvM9GSLmiDSW%2BqXsaPg%3D%3D.FldJkDGEzCbyBH8ttCUIaES4lQD3%2BMKkfXIlGRLpIFpDsK%2B0WW8%2BrS8NnftTg35fJ3SkF9doKWLQDPC7q1hJ3ej3SLJrfnDfd%2FtowEtWlQ%2B4i3h8m0lwXqVOXlfoDYhUG27Rc9VTc4UmEk6a8lr8ZytJ6g98bzdGed7HvsAx8A2JJ%2Fxmmc32zUFUSoikGZSgLX3y26es6webkaxzHLaCXG8Vo9a1MR3gbrVyrHhabpoSaCYpMzj2C80GgW2M%2FE3Q3nxcPXk29fqDeAs7RVlS7LzjvBv3oCn%2BqW%2BoEUc5VEg%3D" rel="nofollow">Redis 打怪升级进阶成神之路</a>,然后我们还在继续 NoSQL 的卷王之路。从第一篇文章开始,我们逐步详细介绍了 MogoDB 基础概念、安装和最基本的CURD操作、索引和聚合、工具/Java API/Springbot集成、常用管理命令与认证、WT存储引擎技术、复制集、集群部署与维护、分片技术、数据备份与恢复、状态检测与性能追踪、客户端和日志分析工具、查询聚合优化、设计开发规范等知识。</p><h2>Nosql 数据库介绍</h2><p>是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能。专注于key-value查询的redis、memcached、ttserver。</p><p><img src="/img/remote/1460000043831442" alt="图片" title="图片"></p><p>解决以下问题:</p><ul><li>对数据库的高并发读写需求</li><li>大数据的高效存储和访问需求</li><li>高可扩展性和高可用性的需求</li></ul><h2>MongoDB 基础概念</h2><h4>什么是MongoDB</h4><p>MongoDB 是面向文档的 NoSQL 数据库,用于大量数据存储。MongoDB 是一个在 2000 年代中期问世的数据库。属于 NoSQL 数据库的类别。</p><h4>MongoDB功能</h4><p>每个数据库都包含集合,而集合又包含文档。每个文档可以具有不同数量的字段。每个文档的大小和内容可以互不相同。文档结构更符合开发人员如何使用各自的编程语言构造其类和对象。开发人员经常会说他们的类不是行和列,而是具有键值对的清晰结构。从 NoSQL 数据库的简介中可以看出,行(或在MongoDB 中调用的文档)不需要预先定义架构。相反,可以动态创建字段。MongoDB 中可用的数据模型使我们可以更轻松地表示层次结构关系,存储数组和其他更复杂的结构。可伸缩性– MongoDB 环境具有很高的可伸缩性。全球各地的公司已经定义了自己的集群,其中一些集群运行着100多个节点,数据库中包含大约数百万个文档。</p><h4>为什么使用MongoDB</h4><p>以下是一些为什么应该开始使用MongoDB的原因</p><ul><li>面向文档的–由于MongoDB是NoSQL类型的数据库,它不是以关系类型的格式存储数据,而是将数据存储在文档中。这使得MongoDB非常灵活,可以适应实际的业务环境和需求。</li><li>临时查询-MongoDB支持按字段,范围查询和正则表达式搜索。可以查询返回文档中的特定字段。</li><li>索引-可以创建索引以提高MongoDB中的搜索性能。MongoDB文档中的任何字段都可以建立索引。</li><li>复制-MongoDB可以提供副本集的高可用性。副本集由两个或多个mongo数据库实例组成。每个副本集成员可以随时充当主副本或辅助副本的角色。主副本是与客户端交互并执行所有读/写操作的主服务器。辅助副本使用内置复制维护主数据的副本。当主副本发生故障时,副本集将自动切换到辅助副本,然后它将成为主服务器。</li><li>负载平衡-MongoDB使用分片的概念,通过在多个MongoDB实例之间拆分数据来水平扩展。MongoDB可以在多台服务器上运行,以平衡负载或复制数据,以便在硬件出现故障时保持系统正常运行。</li></ul><p>所以,无论是运维还是开发、测试,对于 NoSQL 数据库之一的 MongoDB 也是必学知识体系之一。</p><p><strong>再卷也得学起来,搞起来!!!</strong></p><p><a href="https://link.segmentfault.com/?enc=NHXMZ6RkYuPELmGjk2uNHA%3D%3D.Y43qHKxC4E5JyDyctnQ%2FnVswc%2B2z%2Bl1ouJPGzLBgvtq54fjEZw0bTCkVmw9qymwxPBr9AFovImUfaMc33%2F%2F%2Fte1ogdlN7yO6sTbwYzk9w3jnYhKsoskN70qR3bzxynlHZ3cMyIVbKYVAmRFZPN0vGcgbVID%2Fz%2B2dZWuvrugXTXJk7vavg7%2BiGdWBLsg4AIcESaTHgTnOM7KzQOeaMYw0XPIJ0sSOKr5pJ4LDTqcEoDTkND5WKBEyxNY0IkUER2cLD7Z3WTOGp1uIbTwQH3rLMxYTlBiPF1pmMk2hdK9dMEo%3D" rel="nofollow">硬卷 NoSQL 数据库系列(一):MongoDB 知识体系与基础概念</a> </p><p><a href="https://link.segmentfault.com/?enc=n57P6Kj4yxNEIXzAQ07C1Q%3D%3D.K%2FmYTNKicaMo5EHm6QIOkzhCCiwCS6%2BI8Qqej%2FfurQLqSyNNt1GADPEcF4F%2Bvrtpi%2BdYptJ9AHxwHJyMpbiytWvQL0RqfG56yqD1OBtWUTsTuPu7yRr2Az2hX3Th9gp91t1sWu0XPKVyBARIXFM0vHK6nEHpxGr%2FaamthCsK6nC0EOUz6dOixxhs7quZmrzEXMbgLV1m1D79BVz2Vl4mGuECTMDBcm7QzEM9SGjKWxzZkbOm6hsLIBSVZSx0noNsOpZyVFSyiAcbh0jcEDWssT3eTqB22W%2BVVM%2Fvwg5S7Mk%3D" rel="nofollow">硬卷 NoSQL 数据库系列(二):MongoDB 安装与 CURD 基本操作</a> </p><p><a href="https://link.segmentfault.com/?enc=s8AVpsxWDaZXO2Bfh9PvSw%3D%3D.Ah09dY5ryOT%2Fxr1TEX08K4UMVLpUCf%2FDZ20rt32ekfSS%2F2QHms1bQoyRicAKRZRcPgrugaPwf754kLPU0NYnzOr14ENQc6ErZPqHoAefWYOdzaThQnkXbv5UEsARk0XT8cZi8pjgeVw9qSE9NYF0jhfIroXcUKWFcVFqGVMIH%2BPTlyKxid72QdWolEWjF4GBnyG2Agv2HXOyfRLx%2FDWpzcdhzp%2B0ajBBwsEyFLBy2YY8ypxhBOoqUvZvMdgGfJ7x4UpdpcnKnQWmI%2FZL7u4n4S3GowpMvyBfhQGLb%2FNsIfM%3D" rel="nofollow">硬卷 NoSQL 数据库系列(三):MongoDB 索引与聚合</a> </p><p><a href="https://link.segmentfault.com/?enc=niLim%2FYFsLomZgibdLZk2A%3D%3D.UKR4XsjsMkeRvKmkf%2FWWxvXze10rcR%2FV2sWBXTklT%2FBTBtIFGWahMF6trrOA5SizaQMfhTG7NGINKPLWd%2F2dFVznfL8iHxfOYbjXOVXBTc5RYJt2lfVXA8Wu7y5tBAp71PuOmUfrTaCOHifskQOBRnSuT5b5F0s4zscfQ0zTDQvkx9wrlfxIVgpzUYbZsf2OY6JEVuU%2FK6blU%2F302ZWkBfoEcrlBJQWFHSUMoqDEHPw440B46K8%2Bv96VN0Vi3w4oq64jIi3NflS6MWsHP5QrFn1iAWyYhzVVFUmm%2BnbwcQQ%3D" rel="nofollow">硬卷 NoSQL 数据库系列(四):MongoDB 基本使用(工具、API、Spring 集成)</a> </p><p><a href="https://link.segmentfault.com/?enc=3ar8VUWCwN23OlNmVey1Cw%3D%3D.%2FZiEGUbyGZ74ZiwOvGYqPTVPHv01A88ywd%2F7h7UV%2FRHbYErEix2IqB2oeo3Oy6v8pKXZ5Nh5uHiX5yo7S4t06ZhNW8z9I6dA6izW9v7GSoPiz0L7kuQhmhoM48ylw9H2zCWxUheG2gGvbiZ4QiaWObuQzPuO%2F1EPgWltbeos2zJY%2BUHT%2BC3gHXgfVcCv1motsfSBNQENZVclRssxq6g7Y48vnSmARcxpnsOLqoubtLVqRkFubgTYP6DLc1IrSKxswb2xj8AMFVu76b3pcpY2FMzW3IF6sZufWPa1lbPp%2FVQ%3D" rel="nofollow">硬卷 NoSQL 数据库系列(五):MongoDB 常用管理命令与授权认证</a> </p><p><a href="https://link.segmentfault.com/?enc=4a3oTCzc7ps3q%2Btf2XAK1Q%3D%3D.5FpPdVoLuSwtn06%2FrMkiqtAi5%2Bd9D6Ebr3gtsHltrLdJCfuDTw%2FX8eE2xuYKMrouTJ1EhPjN4rxPScuR%2BJyNilT%2BPM3Vkhj5c3bDjrG8yI2GwPzut2yYWX1Rg0xCi%2FGDimyolfUwAzZW1Yepr6JX88Cld5mYZXZd35f1%2BPhEaZW4k2eogoDBwNau8fJm6BCX1crBv98pMtpffldHiN2y%2BCu3%2B9Oqehnyq7YPFxKly7sIoG%2FHifLnWAZPMZgF8oM53mqIJL6%2F5pOxJOHuXQ9m97%2FeTvRf4w4caKDjTnggJNQ%3D" rel="nofollow">硬卷 NoSQL 数据库系列(六):MongoDB 存储引擎 WiredTiger 技术详解</a> </p><p><a href="https://link.segmentfault.com/?enc=PF6pmaVB%2Fy6BJDpIcPzRNw%3D%3D.h48T0kIZBQM01ZKxpDhKBjD7DFMcdNmH%2FLwqLYxgrOYKbkdjPbGVMUXM8dMmK%2BFh55vD2Ycar8srUEA6Vs8TkScWwABWl1lq6ob6oTxrCBVT3tmGflsj3cQGgSX8Vtks2gtfxe48DMf8AL8vIHK69LQXpHFjLGtBIfI93IBeKuydCn8Uep55M6OigDAxJydwNne2r0s5iwMXCLfrtEZQyLEKG2qM67Lk7SMYYdlBIS052r7RmAWhWug2r4hTlnjBuEKukImiKPKfAdasziKkIY4PgytVIvrx4XgvZnvVCvY%3D" rel="nofollow">硬卷 NoSQL 数据库系列(七):MongoDB 复制集技术原理详解</a> </p><p><a href="https://link.segmentfault.com/?enc=WHe6ezq7kqAJJ7%2BDpUWhKw%3D%3D.iroJUV%2FuXi9tQXJWzlTLLKaggyUoAT1DPrw%2F0cZE64Hqb3biWahYIrbUXwfCwUjn80RmhVOygOJKzvhdvmELvZzyCJUhs%2BCQxdor2VkCsfUubzng4AJ1PkHAz0Br8hUCNNtD7PPurTGPykHnxr8jKEMwQTHu5VrDOH44VcMRvlchOHfwUMyB%2FnpFlfN%2FRg7gyvkcptRfTeNesJBWQ0z%2Fp%2FAjr4aSpu8tTYG7JQgyMc%2BeUWZL9jHviLJuP69l2iIfy6hKj3dAb6qbf2WsTehKyPV6QbPYlTFkA3Ans605qUs%3D" rel="nofollow">硬卷 NoSQL 数据库系列(八):MongoDB 集群部署与配置实践</a> </p><p><a href="https://link.segmentfault.com/?enc=hBQZVJw%2FId9nu5GnJdOBnA%3D%3D.9mJuVjy04ydvSTM%2F0mFojLIJnTdkrxqPtQcg0hm8DocxEN7agPfYUY9HpQYk68zHYkwlpvvIOzagGC7OmBJ6eB8GD8NSt0%2FF5U5WIVk29sdv7M474DoVC73IwoHTjxi4JyBToH1UyOW%2FDjFYHxwOq9NDkhhxU5NJ7yvcvmtFBnSCxIkC15ISAnlbWyDFqoLwppH9yXsHi6apZrCCXX8aWXlw9P88OrA%2F%2FbQ%2B%2FupE6yqvP5QQtAzSRGdieaTDCFoBQmfxJIf8O5PbaeLAVToWxVOW2%2FfKg02HbBmQTOLdUM4%3D" rel="nofollow">硬卷 NoSQL 数据库系列(九):MongoDB 分片(sharding)技术</a> </p><p><a href="https://link.segmentfault.com/?enc=yAL%2FPXft58gnD7iJ9SvZnw%3D%3D.ICnw3i%2BRrac7xCd0rkpN%2FZIE359QRw7CBRi1VTCP3aVoVW47dMok7%2BFHj55mquXe31uRskpDPis0NwmAd%2F60skmG2cEBW4W2GF%2BD1OrW6uNHl0%2B2fHWPK9ATPgOeAkdxgbC%2FA80%2BbwqR1ALfq9qXn1v0UPo6ch91WavLewrCzu9gr2XlWERsyqvV7idFfAArPh%2BQkRYcvZ3ARNU6PQ9g4Wn4AND%2Fva208b98dVyFKvDMHvz4XFFXQGaF%2BlGF0ZC45JzrGRtdkK87VYW06Mn53YRLFP%2Bm57QGx5cO4ar%2BaFs%3D" rel="nofollow">硬卷 NoSQL 数据库系列(十):MongoDB 数据库备份与恢复</a></p><p><a href="https://link.segmentfault.com/?enc=SD4TMyQvSMI5rh%2BwnVz9VA%3D%3D.eqp2KZar7ZKnFZFo000QYsfsD8B5hm%2Bp%2BTJJS08Ybp92Rw6%2F26PJfXwXYbiSaFRpym4KSjfLNwkby%2FVhP3CG5DzXwlEdUPL2z%2F0SkO2fH%2BDalcpQwbyEOUkLo1QCVGmq68sbXkl6SPjy5vlTOSNMEbEEUwSsaoBRMAr%2Fk7X9bhlGBwxMbOPkDO0rS9rE9jAZd%2BDlJTw5un8oTPNzkRw%2Ft2cAiKIGthzSto1TjwNwvBAa8ymOM7J4GUZnvqlCpTOl3K%2FSKvSg4uNnpQ37jXx5Unq%2Fz6LKlLl18N%2Bx0lptfZs%3D" rel="nofollow">硬卷 NoSQL 数据库系列(十一):MongoDB 状态检测与性能追踪</a> </p><p><a href="https://link.segmentfault.com/?enc=0%2FZYiaA8T4n20RncVrPanA%3D%3D.dQDDX8heZDb72ncyH8Vm7hx5LD%2FJTtxWXxiB47uKaDVLSgwGKbbkMidYtyIjb8nuFkEEC7Kg2qoG%2FjkJ4vkqnKdZQ0%2FMT2k9MFmjVMMUmPGjkTozqHBozxiGLl%2BbLveqT6AEOPbz%2FdwtwskdQuRikFcBpME%2FJVfNxvfFiN3jXbYq48OgV%2FvIHNXdWciMZI92v5RgoTM2EkK5tfg1L5nxbNnyldHFlrD924tLvdBiXeAofwYQv1ky7RiRzKGnYyHRcRZNh1Nc2lxqLfP63tamx6jIasboGd0T%2FB3pOsYhy5U%3D" rel="nofollow">硬卷 NoSQL 数据库系列(十二):MongoDB 客户端管理工具</a> </p><p><a href="https://link.segmentfault.com/?enc=n3hn2SsOJPgHetDHYyzJlA%3D%3D.9mvogQkb6Mx78vEoHwLUmxxUX5MlmTCOzk83G0vYozRVW88m%2Fxi0PL%2Bd%2BrfQDEtE7GwNoi8e%2FqhReGzkitZSq0kd23HP1M33bVWycxrgMdDeoOmrijAV9Fr00ASKciDpRN2jBSslWsK2KuT0X6L2CInXJXjg7o%2FcKB8b%2FJLBA4gVsLBpaYUKFe6GWaGNTuPJsqBX5YBCzEShUm2anEaQRR3LaQc0PdVz40RGOyedAMKJ6TFWwEXn%2FXUPAjw3IfOGHg5Us1S%2BrjpEFMo2e%2BEq%2BGk6e4i4wWRDHqxVqQumAXg%3D" rel="nofollow">硬卷 NoSQL 数据库系列(十三):MongoDB 日志分析工具</a> </p><p><a href="https://link.segmentfault.com/?enc=GB1GKjnsonPq6l1OwhhFmQ%3D%3D.MpRK1ZAVPuVz9jy9TZGwWZH769kUQsyAUncwetBn11GMg%2B%2FeNtbirslryHoqhe05YYTdJlO3Q4arabuc3KbUEswAdQcdUlsl7uGBxLSxED28QQwxLr6TB9WZ33X5OCWAacLwlwoNnGBV2tkRIcJHjBBpr%2B4gTRzHL0x1WzBQuuqO8pFJJQxZwnvVXW4J0EnaOQ2eCC%2B5NTQ%2BDkCTyg0MHHC7f%2Bmb7lsmSNUtaMEG53cSwipneZqXhdWxP0Z%2Bq5Orq%2Bkl8bKgsksGJ8Y5S6cVgHmeqW3DXLnyQKCebMWsAH8%3D" rel="nofollow">硬卷 NoSQL 数据库系列(十四):MongoDB 查询聚合性能优化</a> </p><p><a href="https://link.segmentfault.com/?enc=y%2F2wDOzZSPpAOrpvrmA3QQ%3D%3D.ldzYWq0Nlz3rKtG3loe52W8mobr5DZTNXMXypwVj2OEm7IjA9UW1kKVd6%2BZKWEdIpi0YQ%2Be18SIgLwGHhK%2BA7lhlxd8QumJL4kEMNt83U6CQF8YbYHxfOi0djvabAtsOY%2BB1aOW7Pnc6%2BdkD8mazidAvBkyhFqER8srtucKek348fHLObIUacAlJpNEXm0odgRczytX2AM7ooWiG303QGd77wLCIj7k8Mda2g7g9nXBmifqPri32hJo%2B2PnvbDyARNIMW4T%2FYpiAr5gUxcO9Ocf7txWd3VS6uPCr3fIdEGE%3D" rel="nofollow">硬卷 NoSQL 数据库系列(十五):MongoDB 数据库设计开发规范</a></p><h2><strong>今天 ,终终终于卷完了!!!!</strong></h2><h2><strong>希望大家能够从中收获多多!如有帮助,请点赞、转发支持一波!!!</strong></h2>
终于卷完了!Redis 打怪升级进阶成神之路(2023 最新版)!
https://segmentfault.com/a/1190000043831440
2023-05-26T10:41:05+08:00
2023-05-26T10:41:05+08:00
民工哥
https://segmentfault.com/u/jishuroad
20
<h2>Nosql 数据库介绍</h2><p>是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能。专注于key-value查询的redis、memcached、ttserver。</p><p><img src="/img/remote/1460000043831442" alt="图片" title="图片">解决以下问题:</p><ul><li>对数据库的高并发读写需求</li><li>大数据的高效存储和访问需求</li><li>高可扩展性和高可用性的需求</li></ul><h2>Redis 数据库</h2><p>Redis 是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash。</p><p><img src="/img/remote/1460000043831443" alt="图片" title="图片"></p><p><a href="https://link.segmentfault.com/?enc=Q0ApGbwnZ9XP9KsjVKHstQ%3D%3D.Ms2MYQfd5xHE8zgQXdoUSF1RrdHycIhyB%2FoP4%2BHU3pFjp2SdgeSmysvgRkWGC3BCuYlCiSs%2B9dkMo5g%2F9%2FG1yn0fx63hT6i%2BK5IckYsBdxVNMbfNJkisW53PPj9ect4KGBPkB%2B6WqTvJE55%2FGu5YGuZXrJ%2BGJCN74A3GYSlqPbfZJ8jXUuC1F4Fszc8%2BscaWXHxDojRBi1SwDeFkO0Cj03u%2FlylO7P4kFvez8chFhxnYFngyxi6JR0Aeb1x3M5oCUqUZp7Cnq2LW5Qb7gQK1MUCfXvuIAuLq66zyjgzgL7KxJokzPconYs9vlLlsFj6%2F01F4LfAtqC561%2FguEDFcTQ%3D%3D" rel="nofollow">Redis</a>是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。</p><h4>官方资料</h4><ul><li>Redis官网:<a href="https://link.segmentfault.com/?enc=L2ZhTzZ9t67purUsSMxKJg%3D%3D.1Gsf4828%2BXkX2bOjfFALP5CgYOvtR4UjthzPLBnB%2BSc%3D" rel="nofollow">http://redis.io/</a></li><li>Redis官方文档:<a href="https://link.segmentfault.com/?enc=CY5uN0A%2FeVNj5r4%2FcB%2FHNw%3D%3D.3PyzUgjE0pEDzBtFsafcf3QHrDlD5gv7y5noW4EN%2B28%3D" rel="nofollow">http://redis.io/documentation</a></li><li>Redis教程:<a href="https://link.segmentfault.com/?enc=7xn68MZtvq84BPOrp%2BTnag%3D%3D.oPwWzcKO5khvZ7YZMiZL6Qw3lUObXs0nzwiotZLQephX6tGxMfqJ2aCgVcZNBSJL" rel="nofollow">http://www.w3cschool.cn/redis/redis-intro.html</a></li><li>Redis下载:<a href="https://link.segmentfault.com/?enc=Mr3AEt2aKJVioF4fX4EJwg%3D%3D.oYULm3msT1BKn7sjomwwRysY%2BovdyEfWsQ7RDrlDKfs%3D" rel="nofollow">http://redis.io/download</a></li></ul><h2>为什么要使用 Redis</h2><p>一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点:</p><ul><li>读写性能优异</li><li>Redis能读的速度是110000次/s,写的速度是81000次/s (测试条件见下一节)。</li><li>数据类型丰富</li><li>Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。</li><li>原子性</li><li>Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。</li><li>丰富的特性</li><li>Redis支持 publish/subscribe, 通知, key 过期等特性。</li><li>持久化</li><li>Redis支持RDB, AOF等持久化方式</li><li>发布订阅</li><li>Redis支持发布/订阅模式</li><li>分布式</li><li>Redis Cluster</li></ul><p>所以,无论是运维还是开发、测试,对于 NoSQL 数据库之一的 Redis 也是必学知识体系之一。</p><p><strong>再卷也得学起来,搞起来!!!</strong></p><p>从第一篇文章开始,我们逐步详细介绍了 Redis 基础理论与安装配置、9 种数据类型和应用场景、常用管理命令、发布与订阅、事件、事务机制、持久化、主从复制与数据恢复实践、哨兵模式原理与数据恢复、Redis Cluster 集群分片技术、交叉复制与故障切换、自动化部署集群实战、集群的扩容与收缩、与 Java\Php\Springboot 等应用的连接与使用、常用运维脚本、Redis 缓存问题(一致性、击穿、穿透、雪崩、污染)、内存消耗及回收、Key 过期时间相关的命令、注意事项、回收策略、 性能优化与问题排查、性能测试及相关工具使用、运维监控(指标、体系建设、工具使用)、开发规范等知识。</p><p><a href="https://link.segmentfault.com/?enc=Bj3LsQSqhpOdt2zIFjaMFA%3D%3D.ozlI6oDzJFfmNlkULQVm2gLZXBkZksx7qDUO0ym0vlG6zEU9iZ4yc3lb4JDpiYk0bWY9jRbGh0lM%2FMV9mPz0XLn5gHJ1BUiaKq7L4wgGywBdh3Hlm3oQvmy2EWDcRosYGUQhLL9llzhemiIqK4V4QYKe4eWj4DimfwMCs%2FrxweW6DEEY9lkkBb3c9LIceVJzoG1v4Zk4lGwQgW0ImI06jclIWj2QpfYzIhr6iKgGNLHsbOLUKv1P0kB4VcNGeJaiqZ2KSS6M2A2v3scI%2BPi2%2FOke%2Bjh6zWgHY7ld%2FNxc%2BlA%3D" rel="nofollow">死磕 NoSQL 数据库系列(一):Redis 基础理论与安装配置</a> </p><p><a href="https://link.segmentfault.com/?enc=Z01PasZKCghsOQYkFgm2Lw%3D%3D.yuK4LmPWy0wBcJ6mytAtGWb9twuLiCUfVC8i8g4zOIqlu6Z6nknmcgmG4dkVZA0UsBZRos%2FkOJAvX2P3RGmqrt%2FkuFy1LIoFq2Z9CY2vhyeQucuTUMcoVvztLa132UkJEWy3OvynmZe%2FLLLg3AYmaw2EtTW2eWcIdBYsVBJ5JIZdOt5ypWbsixYlyDWemd%2FyUB5iEljxx4gv0E9AHtFEECRV%2FTOSOln8d4CtWNlHm1mKu7CgFY7%2F2td7T7tV6K7yVvBovyCcA7xvM%2FPhuyq4qP6kLJB8v1NkfghQssa3mOg%3D" rel="nofollow">死磕 NoSQL 数据库系列(二):Redis 9 种数据类型和应用场景</a> </p><p><a href="https://link.segmentfault.com/?enc=SgaPtnfud76Bw9gwsf59Ig%3D%3D.dk9DwntjYbolPVHKVuNDsu2w5DgUmKZv%2B4mADnkKer2RlDZTfX7glxvXpWr%2BzHhUmGYzs90X%2BS5%2FcXiY8%2B2c8ts7nnbz0Gio1wjcS9W58rTAynn7nm2K48RCNWoy6gk2SotUm26hUN5X3PpVU1CXdSparPOPNH3tCqDBr2vjPDwjmUL93kWmgTdY52Yf34bbnEisoCH9z6C06Kwe8U423wKwqKWZGi7p2UbydhnxvxGTNqTH2MSh4GKwWKPikCvCbXItdY%2BTr8YwIxW7AQXzbWk3IuG4M6%2B8Ld5mPS9%2FawA%3D" rel="nofollow">死磕 NoSQL 数据库系列(三):Redis 常用管理命令</a> </p><p><a href="https://link.segmentfault.com/?enc=Oi2h2ClOgWz4%2FxaEjmmkUg%3D%3D.c9DnjhVtbHgCndyDZpT9aez7kK2D2KwzAesyGwenuMMAsmyR9caIf3vt9xxLbs0p7MBW3PbvZv%2Frg%2Fl1tqNzXeip7Bh6iNnvpQ43c5ls%2FILE7mwEIxFZs0xtImy4mHUjF9SY5eO7PH4H136JHHZhjcuIBZAIS3E5X1WzL7qZ0U3ohe6ysx%2FYnJ2IvzMWQ9DDejJega54f2ZceYlNPGVxRdwon%2F7WyuD8%2BWGmMTSVo9oV6MSfddyg6DJy1V6DF4PvW10Q3AJxioPIs2AcsTzeqAQdkK2ADjok5EN0usp5Gd8%3D" rel="nofollow">死磕 NoSQL 数据库系列(四):Redis 发布与订阅(pub/sub)</a> </p><p><a href="https://link.segmentfault.com/?enc=4eSR4yhwzvYfCzpC1yEilg%3D%3D.zfaLy1BCT4xusdWfnJUO9z8FotE1cfHbRsmnVh2qi%2FIA52JEWPwu%2FAOaNIvXNYwZl%2FuCJIe5oR%2BmCtnJHjQBpj57R0l%2BcRy8sXpBe%2Fy7ZgS2v0hRyDkK2NBKDOgrotv6TxbRora9hJEQRNUA0Ef6PxtZo44cv%2BSV1QxXU8Mq1otYboEuGCgixK%2BUN62V6eg4Kuhn3QFRivE5D6bJ3SfM%2BQewMhjxxuhEkU6wGwivi0U3VBCj%2F32gdmXdXUCwcRghbDCuUWIRDs4fnJZKzyyvfxA1NyC%2BFR%2BPG6ZeYNNRRzg%3D" rel="nofollow">死磕 NoSQL 数据库系列(五):Redis 事件机制详解</a> </p><p><a href="https://link.segmentfault.com/?enc=LpeyCDC2Yir5H4f6dzOCxw%3D%3D.7FjcVa7dOmNbY3VRn5wz%2F6h03WZcBqCG7%2FikbsZulv6EZFgGQUC1RHotEU0ZG7EK%2BeLhRwazoGjX6k0UEaiXcnxfym356SDNi71xp7BWrMyL7V63BkOI2G5BISeM1HYGf6P5ksDilfPHd2N2k3xOr29dB5Rih0m7LJ6LOOvjyIPZiyxXawp%2BfMS8JNYa5aPvyBtbiQxh%2FadwdQDw5GysU3RAxssrhe5TFz%2BbFR6u%2BgKPs1sUd0jQRy7m5mb3MBG6b1eOXVtbavnYqWmFsq2eYK0YYXCZXoH%2BcgYgS3rUG4c%3D" rel="nofollow">死磕 NoSQL 数据库系列(六):Redis 事务详解</a> </p><p><a href="https://link.segmentfault.com/?enc=kmybBoDBy4UoamVmwj7V8w%3D%3D.imih3gxF1ElfK0lpphFEgHiVG29CHO2stW9KSjp7F3mLb1%2F6CiWAd2BglLm4IdE28RMfSecsiy%2FsGlXfI0owXKY52lKQeUbL%2FpxVmzeVwmLw7D5DNjVlNsLbrzoWBknOJyP5qSG3f1J2xH7vuhteAEY%2F3y1jmFRJhZhmeI4szg7GtVNU01BLYZ5XLh6DTVFac9dgZXMGgZKxQGUiVEjfDBIuypSIbjdmkCkTvlcdkFfDDPHkL5Iujf4QvklBj79Bylk1f92HVWLCxjfiIMABvrV0NcCsB67nfkD0%2BUOYAG0%3D" rel="nofollow">死磕 NoSQL 数据库系列(七):Redis 持久化(RDB和AOF)</a> </p><p><a href="https://link.segmentfault.com/?enc=zB%2FBwdrJPbIM%2BVy5TZua4A%3D%3D.X8IrIpaElKuxfQIyO%2BRwkJfoshaRtZlnFwxtalo%2FF91RF7qNr%2BVIZrsDHFh%2FKUH4nL5exZ6MwMeb3e%2BJnBVP0UZLhpFvsEkd2ifPAFHufTfT8FCgM1fOmXRlzK14ShHmqcFNxOZW7NQRIep1%2FVUdsdUfIpP%2FF5KqV7ciG%2BAHB52T%2BDww61gWqWCxMGGn8by2nzjln8L6fIgJEfc4GQcZzy%2B%2FqRfeTQBLIUWtHQn5I1kqlyaE0MirT%2BjTl0l7Vf1FnLGjCktcEiBnoMR9QjQJD6RIPawkF2AmwK7HTq0BjHI%3D" rel="nofollow">死磕 NoSQL 数据库系列(八):Redis 主从复制及数据恢复实践</a> </p><p><a href="https://link.segmentfault.com/?enc=vLumgIcGl5R%2FLajhitS9fA%3D%3D.wh3ycCvOXf%2FnrRytT6xjlZYEc9Il4x2030YXALNsTUjZtKKn66pr4horyZoPzS2qz2XqCQWtCvwYsTll8CbPW2gncutEsm7VooRGq45A9K%2BAenYMNzj2rwpIIG0hVIxrisUcJDHsupv3xvRtei47q0pqpGLwfntkxDjq2NGj26CYwBlj9y%2FPZI4JE1lyB9zK6G%2F31bSlgS1nKm2kywvddvUTMK7E1F6teaqfab0PgoUxOmR6%2BLzkQQXfG46kTh%2F0QhfE%2FjLHl8gjQ5fwHeXMEp6ZIglwy59bRsXjsXztRR4%3D" rel="nofollow">死磕 NoSQL 数据库系列(九):Redis sentinel 集群原理部署及数据恢复</a> </p><p><a href="https://link.segmentfault.com/?enc=R82raL7rFMuSRSVIuG2FsA%3D%3D.HZFnZ2IlY3NOVB2%2Fei5Wsym5h8CuNWVwBBllRDOMaRN8WKKJWvOloNmEClZsNNDd%2B8r20wW0NUS71oqK%2B%2FuhISszpLFgBpoqEnKsD5q4jeRiQU763PAiZX4WJARHoZxvWhHC1c4BMVYu%2FbH82%2BOAz5f1s3p%2BfQRU8yc6ekaMG1j0i5vUDEYPY4Nr906AK0dagucHuho%2Fdgvjd%2FaX6rUTxBY9nH1yjvTYzG8qK00ZRcI0gYcA5S8onHB2PIeUMDXHCmtBhnhEDHL9SAzuVb76k8QErfBAgPnr3xlNSuSJ4Bk%3D" rel="nofollow">死磕 NoSQL 数据库系列(十):Redis Cluster 集群分片技术</a> </p><p><a href="https://link.segmentfault.com/?enc=Ou6Lx8SgtF%2BuKBSmTuPsIg%3D%3D.ArB6AemH8WiecONwXV5%2FNdv%2FKtgdgDzXDhz0xkzNF8VTYFETBJS8Di2Ei4wAfNn3AhRBCtT84RvHvQpdrJng4FrOjDD67YXkWus%2F5MFz1t%2Bw6WJUlOG4YdCMIUoOp9lWE972wA%2FWUwENHEG63Kfqf8ZZd%2FOEezJBY%2BrR90qGv4qS6ik3mOBt5%2FleENcpsydNkwLdTqkXqsuQchjueD%2FxRNvMppzJFluVKfpbmb2Uhx9wpR5zEdyOsslnXvG%2FtzbxKYXmlFN24%2BB77VjyWQ3XuC6D627gUlM2L0aCbIqLVFY%3D" rel="nofollow">死磕 NoSQL 数据库系列(十一):Redis Cluster 交叉复制与故障切换实战</a> </p><p><a href="https://link.segmentfault.com/?enc=VFnijAMyz1NyNZ%2FMhFwegw%3D%3D.LaqnQDWwKi6mmx6HnZUS7hSmv491xcsyWzBPBz03b7DfP0GROAtZbkbXNEAadIj12QD7rauzcFffbe9mDJxDwUIGxF8Ue2SLkAiL5ngK4dsi5eCA%2FV65tBXaOrrnkrvSsKh8vBqvy%2B1%2Bb03p2zaFAYXKm%2F0nZaYNAayCsbOivNFnbs%2F5ISWzDk%2BHLfBX62L7Hif8saxzwpEoxPKCvPc3PlqEPjG%2BKa63QEYqsgzg9u9%2BN4tmKlDDzFrnPRQfcnTE7pKIKIucXK0lf1EWbvE1qT0nti7Y18HWMxuuUNT5rRQ%3D" rel="nofollow">死磕 NoSQL 数据库系列(十二):使用 Redis 官方工具自动部署 Cluster 集群实践</a> </p><p><a href="https://link.segmentfault.com/?enc=wcAOf%2BOfMYifq9jgdTNgyA%3D%3D.dA1ZLY0gJYjNAnR6S2bUM6jVYQF%2Bet%2BVY%2BfC8YhDGui%2Fg5F9Ilr2HzKo1qlp1c0TiRmuTymrL5BOEoweLQa2SY3VuTrUEBJrD4RCzz1F%2BwWMg1167jhgD0vnkuB1GQg6ODEwHOdKsJdIEJ6Vn706eqzKEnvOAaZmyJW%2FsOMiwDJbkotarE5i8wXSWlFHsDBgbczV%2FgGNcP21pGu0LMm6V0bsfGBxvchgosmdw8DNGZ68PoGsjzU%2FNffrHSXfg67%2BBdEAeXKtYo7stibRHtl87OHP8ss%2F99W7BnYmtoX4%2Ft0%3D" rel="nofollow">死磕 NoSQL 数据库系列(十三):Redis Cluster 集群扩容原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=BzZIXVQ3%2B3yYGElPPCyQYg%3D%3D.oXeGSNQoeq94EKHYk2yfwqJMMf9ZaBUKKzXvkGjG%2BnxOzP%2BjqBns0QIuB8qXv5x%2FnWKVI%2FOt1EUTFyWXoPWeN%2Fl%2Fa7sNLJ6puNgqcPokDrF%2F9xAYaMX2myyUJ%2BKfKQqbNGoBI5gIK6LvCzk1xznOMFuIHpS2RGLSzVRSysDVNh78YOPizVLCcHx1N150YQWbWnKJM55sm2akEWhW7rW7qne%2BzChoDUkzPPshAhNp%2FerApI2aUtxdfNU%2BW4J1V4r%2B8fxbTg2yud%2BkVqsg%2FaxKKE0xKjWuXT%2FaMAD40FtZog0%3D" rel="nofollow">死磕 NoSQL 数据库系列(十四):Redis Cluster 集群收缩原理与实践</a> </p><p><a href="https://link.segmentfault.com/?enc=LSVVu%2By2WvvnIXmmBpQUBQ%3D%3D.ui88muPlcYc4GdnSpvQANyCf3CSt4BybGQKL3PhKkndwgYwkAIdgSNiintOwJ7td1KCjYCx0h4W4neCjkbdp7B50P57u5AG9CGUTOAFnuLAc7XwIvYPAdbQ7uxTEE95NVPOb02WlSa5d6bkMK9M6%2BrA%2F2qk21%2BfaMmfdk%2B1L3ht8yEth8EurilQnN9vTYyAUDfNmE0Yhd%2F2YGNRh8pBHgxytApn91HeHCeMrheCKDCBoA4OIPVSJaPCJJe2tBSq5JDpKmF8cLno6BMPxz%2Biloc4Bur1vk2wru28BV7HyDgg%3D" rel="nofollow">死磕 NoSQL 数据库系列(十五):Redis 与Java\Php\Springboot 等应用的连接与使用</a> </p><p><a href="https://link.segmentfault.com/?enc=Xp%2BHgT%2FaCctxA5dhjRxEYw%3D%3D.CnECuzENoMATVYgJ6poHqqHeKLOAiULYvA9iO4Kx0zQ1maYDVDnCH8%2Fokn72Ylts59tdt30PIB0Dwi%2FYGVW5s6cIs0ydoUC9XoinxDhUCoM30S2cnRdWxAPQep2MWpdPeTrcPQOGBAje%2BN8VVcdLTUEP3Ga843XwmoYRuj%2BvlBKksPkvOp4AZeh95flxpAZcz4%2BN5LbTrFDbQxG6OnHPg%2FgLeb7Sp%2B0CGxyxjgdovhtxKSrtl9YZm5PdaHdV9XQ%2FCkSqI%2FRWlFJOQpDV8jY1pGc2fZb8O7T0v9m%2Bw4QK3tY%3D" rel="nofollow">死磕 NoSQL 数据库系列(十六):Redis 常用运维脚本</a> </p><p><a href="https://link.segmentfault.com/?enc=n2QDN5ynAh9c3SwW4X10Dg%3D%3D.VhBU9xt4C4ngQYGeUCxp2CLE13tuckX236eAb9XhDxq5z5FBpdzPW2VEf6FIioVt45YVWS94oGkcI5QPKKmJ6iVN2KzajU9g4x3oPntuH2J%2FdeM1KL7yye1zMb0ZSjqIqgxhMZzBT9PVxJbDbTL4RuK7cwWQT0mcL4dUC5UmaEE1jxpfaAfMcDsNhPwocvAziO40h6Jd3Hw1M1OLmTzO5wnjadYoIhNWvA47RWmDU7joeiaSeAZkvK3FQlBiFm1ezKEzTWuDHTqEtkZYaCmI3Tz2pTcpoVEL5C4JUnk8bjE%3D" rel="nofollow">死磕 NoSQL 数据库系列(十七):Redis 缓存问题(一致性、击穿、穿透、雪崩、污染)</a> </p><p><a href="https://link.segmentfault.com/?enc=xFgb3D26P%2BuZuJh2LpCfyA%3D%3D.vSjG3dkuo0efMGNX%2FPsCDAJ3OHM%2Fa9JnK2MoeFoe4OIxhTAGkZkj5yuRCDjz3mteWads3SHRiY7p2fSa0aZqyIkw%2B2DRyJfxzIjo1Uarw5H4WBEsvG64BpBHLKNBiV%2BL1UBtEX9RGyKjccsi33s4%2BMBnS6BlJaGpAdN33Noxiz1l81WzV2RNm66I%2FO1tiFHPzCWHVW67vSV63aFQuDDu2jV1FXefcw96W2rEBWzNBXg5TDe55Ej38DC5txQNolEbT4n6e90cZRoiqDEaqcNZxMGWRS7wh2VQS%2Bm2csn6vmU%3D" rel="nofollow">死磕 NoSQL 数据库系列(十八):Redis 内存消耗及回收</a> </p><p><a href="https://link.segmentfault.com/?enc=vol9sb%2Fly2tTQAF2VnlGTg%3D%3D.rdtzkiNqkISGORQha0CQ6h5rEwJeprFuHk5QBBTPCgvYF47g3JD12H37PRp34yVZUEGxXK1NHtXmUDy0B16772HyV7%2BMk2jHWgscMnM4ECwbmIx8caVFBGqMIa%2BTY46Hvz4OxpgAmO5IcEPcLADeTuWqaqCYfDR8K%2FMUD9vkdOvFM%2B14Q5BpphWF9VigeLkgVuYxtTIFkKKQHgCa8BwI5CKewuYI4%2Fk8iwJTd7xNQ7s8D3vs97c7ddddIUFAknfONKF5hhvS2nzz2Vqx8c%2FL46pGfBs6tzLgZT%2FI9QhedQU%3D" rel="nofollow">死磕 NoSQL 数据库系列(十九):Redis Key 过期时间相关的命令、注意事项、回收策略</a> </p><p><a href="https://link.segmentfault.com/?enc=0wccS4fzAYSyEE3Vggwb6g%3D%3D.LtCZWds0zuFalUeBw2cUclqf8Hazr3qiS%2Bk%2BOkiNnBwKg%2Brsj0UCLgT58A7fDt3XK6VFGY8Wllf2M955R5oqt0O%2Fmb7nfN94pEuGshAqUXrCzJ%2FVZwYH01ZpYvuwz%2FZ%2BeHmIRbjBuhQIMYmpIg16QGZKOHRRmzuIMVx3%2F6DCSloBoxgAi1%2FFCg3mEEKIRz6QR7IgTS30cfI178q26aAJXHjXeWnYzHxclrtyA1KGUIce5oxylLpFwqV3fAuAD%2Fw1%2B5GVKZSbBaiaL58nTlFb97PIGjTs5Ypvd5GfD2rQwMU%3D" rel="nofollow">死磕 NoSQL 数据库系列(二十):Redis 性能优化与问题排查</a> </p><p><a href="https://link.segmentfault.com/?enc=AQTPmxCHh2t6wM7SHbZotw%3D%3D.7%2FXWR0dVb5haKlThPb5KLxEBEnGhhNyvK7TJrXZYmrpBhOLrg6vJXYxe1E4lSAymwUJDJm0j7526tV%2FAscg42OAd53w9tTRCNLwGLofsmfCCXYJFyLwGqpytaYTBAEgUWydSqzwH7vgJ45nXWad6MsKrDL1R2TEad%2F5ain7S5zP3l2HuZHXN5es76mErB9byVQ6sK0LkTP5ZaezYTpNURI8E5uWXtgvXdzQvH%2FJ7gC5nnHfwCYtOhOEfcglMacM4ZrF8nUKzpYVIXclsud0JnVDfWzKZn7N4UUaXgL6U7mw%3D" rel="nofollow">死磕 NoSQL 数据库系列(二十一):Redis 性能测试及相关工具使用</a> </p><p><a href="https://link.segmentfault.com/?enc=pItoiqphO6eINid%2BuF7pxw%3D%3D.URLWCKk7cFjQRi%2BHkXZK%2F1knBdS8%2F5O%2B9Flt813NgvjQ4DYm9NP2KuwfL0YRCRdFf9DjgUgnXgNGSR6cbvUzgbJsIQ0lIG%2B9xn2oi8yr1rpTSExO4OYjzEzKqIOYgVIZiLnQA2PS%2Ba6yVqDiLYCydGQiC4EVvLbiCdl2edJdXckF7%2BvtH8k9fEolisqFGmTlrXj%2BKXWD25o2I3xyGd7GGqnt9TjCbhIaeIfgFxQo6Kj3TToYETxkrpv6IXlqYKT8QwBPCuLe0Ti8DbBv5cy1Q8pZQJE%2BrIgdceefo6ahoCA%3D" rel="nofollow">死磕 NoSQL 数据库系列(二十二):Redis 运维监控(指标、体系建设、工具使用)</a> </p><p><a href="https://link.segmentfault.com/?enc=t95QtrPmHErlpLHXqnDDuA%3D%3D.TE2RykwH2T%2BphKHXqjYafKwAX8mouTVrvcfHRXveNDS3QPEnEY5QngLJ12X8QoiT5rsb%2BrNjmRx643EzWZzvz36sLuJU55UXyw%2BIi55zpdKf6SiyLCtOG7%2FybxzVbpqPDspc5y0f1hjvbIZ76tmFTQMjn03sBlPJZh%2BY%2FALEh2q%2FxmOa6H6UHvP%2BdBBFJL56pHQuLZaEJTnVkmm%2FOBtAiwkWUfJISazfrnmR0%2BNv5ESPAyqCuT%2FWxqzjpoLZ09Fk%2F7hk2FE%2Fb8wXEnsJPfp1A4IMpAtfTmkardznl3xaPYc%3D" rel="nofollow">死磕 NoSQL 数据库系列(二十三):Redis 开发规范</a></p><h2><strong>今天 ,终终终于卷完了!!!!</strong></h2><h2><strong>希望大家能够从中收获多多!如有帮助,请点赞、转发支持一波!!!</strong></h2>
又一款内存数据库横空出世,比 Redis 更强,性能直接飙升一倍!杀疯了
https://segmentfault.com/a/1190000043522803
2023-03-10T14:18:31+08:00
2023-03-10T14:18:31+08:00
民工哥
https://segmentfault.com/u/jishuroad
4
<h2>什么是 KeyDB?</h2><p>KeyDB是Redis的高性能分支,专注于多线程,内存效率和高吞吐量。除了多线程之外,KeyDB还具有仅在Redis Enterprise中可用的功能,例如Active Replication,FLASH存储支持以及一些根本不可用的功能,例如直接备份到AWS S3。</p><p>KeyDB与Redis协议,模块和脚本保持完全兼容性。这包括脚本和事务的原子性保证。由于KeyDB与Redis开发保持同步,因此KeyDB是Redis功能的超集,从而使KeyDB取代了现有Redis部署。</p><p>在相同的硬件上,KeyDB每秒可以执行的查询数量是Redis的两倍,而延迟却降低了60%。Active-Replication简化了热备用故障转移,使您可以轻松地在副本上分配写操作并使用基于TCP的简单负载平衡/故障转移。KeyDB的高性能可让您在更少的硬件上做更多的事情,从而降低了运营成本和复杂性。<img src="/img/remote/1460000043522805" alt="图片" title="图片"><img src="/img/remote/1460000043522806" alt="图片" title="图片">在此处查看完整的基准测试结果和设置信息:</p><ul><li><a href="https://link.segmentfault.com/?enc=B18hrNnJSXai7UrsNjlMVg%3D%3D.1%2BsRF%2Bt7vsorotadk1%2FsyhYzkKYFiMuiPeBYgO39AXgd67wk1u4F5uTV6oshMw4NqSo9mXjyuDU8UxOfHLA6Hg%3D%3D" rel="nofollow">https://docs.keydb.dev/blog/2019/10/07/blog-post/</a></li></ul><h2>走进 KeyDB</h2><p>KeyDB项目是从redis fork出来的分支。众所周知redis是一个单线程的kv内存存储系统,而KeyDB在100%兼容redis API的情况下将redis改造成多线程。</p><p>项目git地址:</p><ul><li><a href="https://link.segmentfault.com/?enc=EtWLLGPlZg1mWgbN3VmHtA%3D%3D.tUENY%2Fg71J9vtoir1C2FF1BSrOhzs%2Fc4bUqKVxlb15l6N3eGgBCQu3u9Pg6sHTDk" rel="nofollow">https://github.com/JohnSully/KeyDB</a></li></ul><p>网上公开的技术细节比较少,本文基本是通过阅读源码总结出来的,如有错漏之处欢迎指正。</p><h2>多线程架构</h2><h4>线程模型</h4><p>KeyDB将redis原来的主线程拆分成了主线程和worker线程。每个worker线程都是io线程,负责监听端口,accept请求,读取数据和解析协议。如图所示:<img src="/img/remote/1460000043522807" alt="图片" title="图片">KeyDB使用了<code>SO_REUSEPORT</code>特性,多个线程可以绑定监听同个端口。</p><p>每个worker线程做了cpu绑核,读取数据也使用了<code>SO_INCOMING_CPU</code>特性,指定cpu接收数据。</p><p>解析协议之后每个线程都会去操作内存中的数据,由一把全局锁来控制多线程访问内存数据。</p><p>主线程其实也是一个worker线程,包括了worker线程的工作内容,同时也包括只有主线程才可以完成的工作内容。在worker线程数组中下标为0的就是主线程。</p><p>主线程的主要工作在实现<code>serverCron</code>,包括:</p><ul><li>处理统计</li><li>客户端链接管理</li><li>db数据的resize和reshard</li><li>处理aof</li><li>replication主备同步</li><li>cluster模式下的任务</li></ul><h4>链接管理</h4><p>在redis中所有链接管理都是在一个线程中完成的。在KeyDB的设计中,每个worker线程负责一组链接,所有的链接插入到本线程的链接列表中维护。链接的产生、工作、销毁必须在同个线程中。每个链接新增一个字段</p><pre><code>int iel; /* the event loop index we're registered with */ </code></pre><p>用来表示链接属于哪个线程接管。</p><p>KeyDB维护了三个关键的数据结构做链接管理:</p><ul><li><code>clients_pending_write</code>:线程专属的链表,维护同步给客户链接发送数据的队列</li><li><code>clients_pending_asyncwrite</code>:线程专属的链表,维护异步给客户链接发送数据的队列</li><li><code>clients_to_close</code>:全局链表,维护需要异步关闭的客户链接</li></ul><p>分成同步和异步两个队列,是因为redis有些联动api,比如<code>pub/sub</code>,pub之后需要给sub的客户端发送消息,pub执行的线程和sub的客户端所在线程不是同一个线程,为了处理这种情况,KeyDB将需要给非本线程的客户端发送数据维护在异步队列中。</p><p>同步发送的逻辑比较简单,都是在本线程中完成,以下图来说明如何同步给客户端发送数据:<img src="/img/remote/1460000043522808" alt="图片" title="图片">如上文所提到的,一个链接的创建、接收数据、发送数据、释放链接都必须在同个线程执行。异步发送涉及到两个线程之间的交互。KeyDB通过管道在两个线程中传递消息:</p><pre><code>int fdCmdWrite; //写管道
int fdCmdRead; //读管道 </code></pre><p>本地线程需要异步发送数据时,先检查client是否属于本地线程,非本地线程获取到client专属的线程ID,之后给专属的线程管到发送<code>AE_ASYNC_OP::CreateFileEvent</code>的操作,要求添加写socket事件。专属线程在处理管道消息时将对应的请求添加到写事件中,如图所示:<img src="/img/remote/1460000043522809" alt="图片" title="图片">redis有些关闭客户端的请求并非完全是在链接所在的线程执行关闭,所以在这里维护了一个全局的异步关闭链表。<img src="/img/remote/1460000043522810" alt="图片" title="图片"></p><h4>锁机制</h4><p>KeyDB实现了一套类似spinlock的锁机制,称之为fastlock。</p><p>fastlock的主要数据结构有:</p><pre><code>struct ticket
{
uint16_t m_active; //解锁+1
uint16_t m_avail; //加锁+1
};
struct fastlock
{
volatile struct ticket m_ticket;
volatile int m_pidOwner; //当前解锁的线程id
volatile int m_depth; //当前线程重复加锁的次数
}; </code></pre><p>使用原子操作<code>__atomic_load_2</code>,<code>__atomic_fetch_add</code>,<code>__atomic_compare_exchange</code>来通过比较<code>m_active=m_avail</code>判断是否可以获取锁。fastlock提供了两种获取锁的方式:</p><ul><li>try_lock:一次获取失败,直接返回</li><li>lock:忙等,每<code>1024 * 1024</code>次忙等后使用<code>sched_yield</code> 主动交出cpu,挪到cpu的任务末尾等待执行。</li></ul><p>在KeyDB中将<code>try_lock</code>和事件结合起来,来避免忙等的情况发生。每个客户端有一个专属的lock,在读取客户端数据之前会先尝试加锁,如果失败,则退出,因为数据还未读取,所以在下个<code>epoll_wait</code>处理事件循环中可以再次处理。<img src="/img/remote/1460000043522811" alt="图片" title="图片"></p><h2>Active-Replica</h2><p>KeyDB实现了多活的机制,每个replica可设置成可写非只读,replica之间互相同步数据。主要特性有:</p><ul><li>每个replica有个uuid标志,用来去除环形复制</li><li>新增加rreplay API,将增量命令打包成rreplay命令,带上本地的uuid</li><li>key,value加上时间戳版本号,作为冲突校验,如果本地有相同的key且时间戳版本号大于同步过来的数据,新写入失败。采用当前时间戳向左移20位,再加上后44位自增的方式来获取key的时间戳版本号。</li></ul><h2>文档</h2><ul><li><a href="https://link.segmentfault.com/?enc=1gsc0jNkZ2KQRtqvbKJ%2BGw%3D%3D.cx%2BIleqQpgDiItk4Bmu%2F%2Bf2XJkfuCuKpjB960tMm76CeqjsCkVrEyRQUKM4U%2BB9P" rel="nofollow">https://docs.keydb.dev/docs/commands</a></li></ul><p>感谢阅读,希望对你有所帮助 :)</p><p>来源:<a href="https://link.segmentfault.com/?enc=2FOPz8rVa9SdUc8%2BMrXtVA%3D%3D.pDtDL4ntfYXgaTHiF4Fv0%2B4Wwmh7PcLqmLDIFlgzKe2Ik8LvHVwvPRbBhfkvdFmi2FuGZ17bl32B4J%2B7riW5X6dVf3Jtf8nib%2FZmWyrhw5H1JwDahVp1ex3sNX9VRHTrH25R0OJWid6WW7Uww7RxAAC4ToyU8vKtySm3HrkhuS13HSf5l4miDdQOX0Ab6NyiEz0Gi38ajTAnC82QpqcpAWRhLT4gffdurMh3lrgXp8NkMmTu27Hv2lFx12pZP5Ptc11CCz5Z%2Bir34tmAQknBeMY0YJOllj6bu7P0hVlYaWQ%3D" rel="nofollow">又一款内存数据库横空出世,比 Redis 更强,性能直接飙升一倍!</a></p>
再有谁说还不会数据库基础知识点!就把这个直接甩过去
https://segmentfault.com/a/1190000043434720
2023-02-16T20:50:08+08:00
2023-02-16T20:50:08+08:00
民工哥
https://segmentfault.com/u/jishuroad
2
<p><a href="https://link.segmentfault.com/?enc=WyAe579VT6YxdJtJNVddOg%3D%3D.F5R738KPM8wu2t3o7QaCAflQ16JLLSc8tT%2BLZZda9n4VvGvaKBzTzMJ3ETy%2Ff75Zrsg34mk4Ixy3fKJkaL6GMDZ37tPKDOBkJ5jUnM5KhA1u%2BP5gCIsK0Up0UGQ6k6BvnPuRp3p4gE4zjU4%2Fwyc1g7230BZmHVRjFD1D2cQQ9nUQGmmmWLq3SAWPJ7AqwBVIpEHUEOBlMC%2FLR17iVatBdPpZfXYGnthNdJTg0xg7efmVAMrid9R99mXGVSw32qB76M%2FkY21npYsxxXpLpClXd2otuaO7zqBlpJDLQ5%2BigHM%3D" rel="nofollow">死磕数据库系列(一):关系型数据库是如何工作的?</a> </p><p><a href="https://link.segmentfault.com/?enc=5CE2S%2BdlPAAcZQO2A397LQ%3D%3D.U%2F0X%2Bq%2FiINYK7MxDUm3WEuijpkULBdV3SM1RcJVfFARiPr6QxxaGaua8R8tKlDXZsOAhHY7gEMRhzypBxkvU8gkBL0qNrRuvlNj4L5Wc8pLoGEBH0t4mPxG0BHdXisR9QNSsgFP7hHa6NHTsG%2FbfjGaSdoIt2lDVKq5dTw8qJq%2BuJIEfzHAoCLbgUKep7%2F%2FiXPmOkYetcuT2wBBQdrpcSUtmPI8fcpJM0azlM7gvRIR7qsd0Q8QU5QhrQP1SEBWNWE7eHFsRN8H0gXZy%2F08l6cbfO8nrQN76TWafYh6%2BQgM%3D" rel="nofollow">死磕数据库系列(二):数据库系统核心知识点详解</a> </p><p><a href="https://link.segmentfault.com/?enc=rpw5UR%2FzJ3HugVkKooMD%2Bg%3D%3D.qUcaN0sLB%2FIRuqPug9t%2FjX98CDGve4PKahGhBeTZ%2Feu3ttPN5lxPmdjpqlqtX84zW1W%2FfBzR2Ingg72OfdwAtWLWvVUltgwCekwmJceF6A4EkVGPza2baz7%2F3pPf%2Bp%2B7mOr0ferG4ovl04Xudm4HB5Qp%2FvZyLcgZAOE9VC2qnUaYid%2BmOvqX79aTqai3gJPXUC0U8JvK%2BtnnwxQPSijKE0RR3IbiesQU96M5R6eFtqOKQFJM9EAnV%2BdiYSZJoD84ZywqHGmRxqKfhLsXAtE%2FNfQTbCsQblNSz2HNgBYNJEE%3D" rel="nofollow">死磕数据库系列(三):关系型数据库设计理论与流程详解</a></p><h2><strong>SQL语法基础</strong></h2><h4><strong>基础</strong></h4><p>模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。</p><p>主键的值不允许修改,也不允许复用(不能使用已经删除的主键值赋给新数据行的主键)。</p><p>SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。</p><p>SQL 语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的 DBMS 以及配置。</p><p>SQL 支持以下三种注释:</p><pre><code class="text"># 注释
SELECT *
FROM mytable; -- 注释
/* 注释1
注释2 */</code></pre><p>数据库创建与使用:</p><pre><code class="text">CREATE DATABASE test;
USE test;</code></pre><h4><strong>创建表</strong></h4><pre><code class="text">CREATE TABLE mytable (
id INT NOT NULL AUTO_INCREMENT,
col1 INT NOT NULL DEFAULT 1,
col2 VARCHAR(45) NULL,
col3 DATE NULL,
PRIMARY KEY (`id`));</code></pre><h4><strong>修改表</strong></h4><p>添加列</p><pre><code class="text">ALTER TABLE mytable
ADD col CHAR(20);</code></pre><p>修改列和属性(读者@CodeHourra补充)</p><pre><code class="text">---ALTER TABLE 表名 CHANGE 原字段名 新字段名 字段类型 约束条件
ALTER TABLE mytable
CHANGE col col1 CHAR(32) NOT NULL DEFAULT '123';</code></pre><p>删除列</p><pre><code class="text">ALTER TABLE mytable
DROP COLUMN col;</code></pre><p>删除表</p><pre><code class="text">DROP TABLE mytable;</code></pre><h4><strong>插入</strong></h4><p>普通插入</p><pre><code class="text">INSERT INTO mytable(col1, col2)
VALUES(val1, val2);</code></pre><p>插入检索出来的数据</p><pre><code class="text">INSERT INTO mytable1(col1, col2)
SELECT col1, col2
FROM mytable2;</code></pre><p>将一个表的内容插入到一个新表</p><pre><code class="text">CREATE TABLE newtable AS
SELECT * FROM mytable;</code></pre><h4><strong>更新</strong></h4><pre><code class="text">UPDATE mytable
SET col = val
WHERE id = 1;</code></pre><h4><strong>删除</strong></h4><pre><code class="text">DELETE FROM mytable
WHERE id = 1;</code></pre><p>TRUNCATE TABLE 可以清空表,也就是删除所有行。</p><pre><code class="text">TRUNCATE TABLE mytable;</code></pre><p>使用更新和删除操作时一定要用 WHERE 子句,不然会把整张表的数据都破坏。可以先用 SELECT 语句进行测试,防止错误删除。</p><h4><strong>查询</strong></h4><p>DISTINCT</p><p>相同值只会出现一次。它作用于所有列,也就是说所有列的值都相同才算相同。</p><pre><code class="text">SELECT DISTINCT col1, col2
FROM mytable;</code></pre><p>LIMIT</p><p>限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。</p><p>返回前 5 行:</p><pre><code class="text">SELECT *
FROM mytable
LIMIT 5;
SELECT *
FROM mytable
LIMIT 0, 5;</code></pre><p>返回第 3 ~ 5 行:</p><pre><code class="text">SELECT *
FROM mytable
LIMIT 2, 3;</code></pre><h4><strong>排序</strong></h4><ul><li>ASC : 升序(默认)</li><li>DESC : 降序</li></ul><p>可以按多个列进行排序,并且为每个列指定不同的排序方式:</p><pre><code class="text">SELECT *
FROM mytable
ORDER BY col1 DESC, col2 ASC;</code></pre><h4><strong>过滤</strong></h4><p>不进行过滤的数据非常大,导致通过网络传输了多余的数据,从而浪费了网络带宽。因此尽量使用 SQL 语句来过滤不必要的数据,而不是传输所有的数据到客户端中然后由客户端进行过滤。</p><pre><code class="text">SELECT *
FROM mytable
WHERE col IS NULL;</code></pre><p>下表显示了 WHERE 子句可用的操作符</p><p><img src="/img/remote/1460000043434722" alt="" title=""></p><p>应该注意到,NULL 与 0、空字符串都不同。</p><p>AND 和 OR 用于连接多个过滤条件。优先处理 AND,当一个过滤表达式涉及到多个 AND 和 OR 时,可以使用 () 来决定优先级,使得优先级关系更清晰。</p><p>IN 操作符用于匹配一组值,其后也可以接一个 SELECT 子句,从而匹配子查询得到的一组值。</p><p>NOT 操作符用于否定一个条件。</p><h4><strong>通配符</strong></h4><p>通配符也是用在过滤语句中,但它只能用于文本字段。</p><ul><li>% 匹配 >=0 个任意字符;</li><li>\_ 匹配 ==1 个任意字符;</li><li>[ ] 可以匹配集合内的字符,例如 [ab] 将匹配字符 a 或者 b。用脱字符 ^ 可以对其进行否定,也就是不匹配集合内的字符。</li></ul><p>使用 Like 来进行通配符匹配。</p><pre><code class="text">SELECT *
FROM mytable
WHERE col LIKE '[^AB]%'; -- 不以 A 和 B 开头的任意文本</code></pre><p>不要滥用通配符,通配符位于开头处匹配会非常慢。</p><h4><strong>计算字段</strong></h4><p>在数据库服务器上完成数据的转换和格式化的工作往往比客户端上快得多,并且转换和格式化后的数据量更少的话可以减少网络通信量。</p><p>计算字段通常需要使用 AS 来取别名,否则输出的时候字段名为计算表达式。</p><pre><code class="text">SELECT col1 * col2 AS alias
FROM mytable;</code></pre><p>CONCAT() 用于连接两个字段。许多数据库会使用空格把一个值填充为列宽,因此连接的结果会出现一些不必要的空格,使用 TRIM() 可以去除首尾空格。</p><pre><code class="text">SELECT CONCAT(TRIM(col1), '(', TRIM(col2), ')') AS concat_col
FROM mytable;</code></pre><h4><strong>函数</strong></h4><p>各个 DBMS 的函数都是不相同的,因此不可移植,以下主要是 MySQL 的函数。</p><h2><strong>汇总</strong></h2><p><img src="/img/remote/1460000043434723" alt="" title=""></p><pre><code class="text">SELECT AVG(DISTINCT col1) AS avg_col
FROM mytable;</code></pre><h4><strong>文本处理</strong></h4><p><img src="/img/remote/1460000043434724" alt="" title=""></p><p>转换为语音值</p><p>其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。</p><pre><code class="text">SELECT *
FROM mytable
WHERE SOUNDEX(col1) = SOUNDEX('apple')</code></pre><h3><strong>日期和时间处理</strong></h3><ul><li>日期格式: YYYY-MM-DD</li><li>时间格式: HH:MM:SS</li></ul><p><img src="/img/remote/1460000043434725" alt="" title=""></p><pre><code class="text">mysql> SELECT NOW();
2018-4-14 20:25:11</code></pre><h3><strong>数值处理</strong></h3><p><img src="/img/remote/1460000043434726" alt="" title=""></p><p><img src="/img/remote/1460000043434727" alt="" title=""></p><h4><strong>分组</strong></h4><p>分组就是把具有相同的数据值的行放在同一组中。</p><p>可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。</p><p>指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序。</p><pre><code class="text">SELECT col, COUNT(*) AS num
FROM mytable
GROUP BY col;</code></pre><p>GROUP BY 自动按分组字段进行排序,ORDER BY 也可以按汇总字段来进行排序。</p><pre><code class="text">SELECT col, COUNT(*) AS num
FROM mytable
GROUP BY col
ORDER BY num;</code></pre><p>WHERE 过滤行,HAVING 过滤分组,行过滤应当先于分组过滤。</p><pre><code class="text">SELECT col, COUNT(*) AS num
FROM mytable
WHERE col > 2
GROUP BY col
HAVING num >= 2;</code></pre><p>分组规定:</p><ul><li>GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前;</li><li>除了汇总字段外,SELECT 语句中的每一字段都必须在 GROUP BY 子句中给出;</li><li>NULL 的行会单独分为一组;</li><li>大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型。</li></ul><h4><strong>子查询</strong></h4><p>子查询中只能返回一个字段的数据。</p><p>可以将子查询的结果作为 WHRER 语句的过滤条件:</p><pre><code class="text">SELECT *
FROM mytable1
WHERE col1 IN (SELECT col2
FROM mytable2);</code></pre><p>下面的语句可以检索出客户的订单数量,子查询语句会对第一个查询检索出的每个客户执行一次:</p><pre><code class="text">SELECT cust_name, (SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id)
AS orders_num
FROM Customers
ORDER BY cust_name;</code></pre><h2><strong>连接</strong></h2><p>连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE。</p><p>连接可以替换子查询,并且比子查询的效率一般会更快。</p><p>可以用 AS 给列名、计算字段和表名取别名,给表名取别名是为了简化 SQL 语句以及连接相同表。</p><h4><strong>内连接</strong></h4><p>内连接又称等值连接,使用 INNER JOIN 关键字。</p><pre><code class="text">SELECT A.value, B.value
FROM tablea AS A INNER JOIN tableb AS B
ON A.key = B.key;</code></pre><p>可以不明确使用 INNER JOIN,而使用普通查询并在 WHERE 中将两个表中要连接的列用等值方法连接起来。</p><pre><code class="text">SELECT A.value, B.value
FROM tablea AS A, tableb AS B
WHERE A.key = B.key;</code></pre><p>在没有条件语句的情况下返回笛卡尔积。</p><h4><strong>自连接</strong></h4><p>自连接可以看成内连接的一种,只是连接的表是自身而已。</p><p>一张员工表,包含员工姓名和员工所属部门,要找出与 Jim 处在同一部门的所有员工姓名。</p><p>子查询版本</p><pre><code class="text">SELECT name
FROM employee
WHERE department = (
SELECT department
FROM employee
WHERE name = "Jim");</code></pre><p>自连接版本</p><pre><code class="text">SELECT e1.name
FROM employee AS e1 INNER JOIN employee AS e2
ON e1.department = e2.department
AND e2.name = "Jim";</code></pre><h4><strong>自然连接</strong></h4><p>自然连接是把同名列通过等值测试连接起来的,同名列可以有多个。</p><p>内连接和自然连接的区别: 内连接提供连接的列,而自然连接自动连接所有同名列。</p><pre><code class="text">SELECT A.value, B.value
FROM tablea AS A NATURAL JOIN tableb AS B;</code></pre><h4><strong>外连接</strong></h4><p>外连接保留了没有关联的那些行。分为左外连接,右外连接以及全外连接,左外连接就是保留左表没有关联的行。</p><p>检索所有顾客的订单信息,包括还没有订单信息的顾客。</p><pre><code class="text">SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;</code></pre><p><img src="/img/remote/1460000043434728" alt="" title=""></p><p><img src="/img/remote/1460000043434729" alt="" title=""></p><h2><strong>组合查询</strong></h2><p>使用 UNION 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行。</p><p>每个查询必须包含相同的列、表达式和聚集函数。</p><p>默认会去除相同行,如果需要保留相同行,使用 UNION ALL。</p><p>只能包含一个 ORDER BY 子句,并且必须位于语句的最后。</p><pre><code class="text">SELECT col
FROM mytable
WHERE col = 1
UNION
SELECT col
FROM mytable
WHERE col =2;</code></pre><h2><strong>视图</strong></h2><p>视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。</p><p>对视图的操作和对普通表的操作一样。</p><p>视图具有如下好处:</p><ul><li>简化复杂的 SQL 操作,比如复杂的连接;</li><li>只使用实际表的一部分数据;</li><li>通过只给用户访问视图的权限,保证数据的安全性;</li><li>更改数据格式和表示。</li></ul><pre><code class="text">CREATE VIEW myview AS
SELECT Concat(col1, col2) AS concat_col, col3*col4 AS compute_col
FROM mytable
WHERE col5 = val;</code></pre><h2><strong>存储过程</strong></h2><p>存储过程可以看成是对一系列 SQL 操作的批处理。</p><p>使用存储过程的好处:</p><ul><li>代码封装,保证了一定的安全性;</li><li>代码复用;</li><li>由于是预先编译,因此具有很高的性能。</li></ul><p>命令行中创建存储过程需要自定义分隔符,因为命令行是以 ; 为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符,造成语法错误。</p><p>包含 in、out 和 inout 三种参数。</p><p>给变量赋值都需要用 select into 语句。</p><p>每次只能给一个变量赋值,不支持集合的操作。</p><pre><code class="text">delimiter //
create procedure myprocedure( out ret int )
begin
declare y int;
select sum(col1)
from mytable
into y;
select y*y into ret;
end //
delimiter ;
call myprocedure(@ret);
select @ret;</code></pre><h2><strong>游标</strong></h2><p>在存储过程中使用游标可以对一个结果集进行移动遍历。</p><p>游标主要用于交互式应用,其中用户需要对数据集中的任意行进行浏览和修改。</p><p>使用游标的四个步骤:</p><ol><li>声明游标,这个过程没有实际检索出数据;</li><li>打开游标;</li><li>取出数据;</li><li>关闭游标;</li></ol><pre><code class="text">delimiter //
create procedure myprocedure(out ret int)
begin
declare done boolean default 0;
declare mycursor cursor for
select col1 from mytable;
# 定义了一个 continue handler,当 sqlstate '02000' 这个条件出现时,会执行 set done = 1
declare continue handler for sqlstate '02000' set done = 1;
open mycursor;
repeat
fetch mycursor into ret;
select ret;
until done end repeat;
close mycursor;
end //
delimiter ;</code></pre><h2><strong>触发器</strong></h2><p>触发器会在某个表执行以下语句时而自动执行: DELETE、INSERT、UPDATE。</p><p>触发器必须指定在语句执行之前还是之后自动执行,之前执行使用 BEFORE 关键字,之后执行使用 AFTER 关键字。BEFORE 用于数据验证和净化,AFTER 用于审计跟踪,将修改记录到另外一张表中。</p><p>INSERT 触发器包含一个名为 NEW 的虚拟表。</p><pre><code class="text">CREATE TRIGGER mytrigger AFTER INSERT ON mytable
FOR EACH ROW SELECT NEW.col into @result;
SELECT @result; -- 获取结果</code></pre><p>DELETE 触发器包含一个名为 OLD 的虚拟表,并且是只读的。</p><p>UPDATE 触发器包含一个名为 NEW 和一个名为 OLD 的虚拟表,其中 NEW 是可以被修改的,而 OLD 是只读的。</p><p>MySQL 不允许在触发器中使用 CALL 语句,也就是不能调用存储过程。</p><h2><strong>事务管理</strong></h2><p>基本术语:</p><ul><li>事务(transaction)指一组 SQL 语句;</li><li>回退(rollback)指撤销指定 SQL 语句的过程;</li><li>提交(commit)指将未存储的 SQL 语句结果写入数据库表;</li><li>保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。</li></ul><p>不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句。</p><p>MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。</p><p>通过设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。</p><p>如果没有设置保留点,ROLLBACK 会回退到 START TRANSACTION 语句处;如果设置了保留点,并且在 ROLLBACK 中指定该保留点,则会回退到该保留点。</p><pre><code class="text">START TRANSACTION
// ...
SAVEPOINT delete1
// ...
ROLLBACK TO delete1
// ...
COMMIT</code></pre><h2><strong>字符集</strong></h2><p>基本术语:</p><ul><li>字符集为字母和符号的集合;</li><li>编码为某个字符集成员的内部表示;</li><li>校对字符指定如何比较,主要用于排序和分组。</li></ul><p>除了给表指定字符集和校对外,也可以给列指定:</p><pre><code class="text">CREATE TABLE mytable
(col VARCHAR(10) CHARACTER SET latin COLLATE latin1_general_ci )
DEFAULT CHARACTER SET hebrew COLLATE hebrew_general_ci;</code></pre><p>可以在排序、分组时指定校对:</p><pre><code class="text">SELECT *
FROM mytable
ORDER BY col COLLATE latin1_general_ci;</code></pre><h2><strong>权限管理</strong></h2><p>MySQL 的账户信息保存在 mysql 这个数据库中。</p><pre><code class="text">USE mysql;
SELECT user FROM user;</code></pre><p>创建账户</p><p>新创建的账户没有任何权限。</p><pre><code class="text">CREATE USER myuser IDENTIFIED BY 'mypassword';</code></pre><p>修改账户名</p><pre><code class="text">RENAME myuser TO newuser;</code></pre><p>删除账户</p><pre><code class="text">DROP USER myuser;</code></pre><p>查看权限</p><pre><code class="text">SHOW GRANTS FOR myuser;</code></pre><p>授予权限</p><p>账户用 username@host 的形式定义,username@% 使用的是默认主机名。</p><pre><code class="text">GRANT SELECT, INSERT ON mydatabase.* TO myuser;</code></pre><p>删除权限</p><p>GRANT 和 REVOKE 可在几个层次上控制访问权限:</p><ul><li>整个服务器,使用 GRANT ALL 和 REVOKE ALL;</li><li>整个数据库,使用 ON database.*;</li><li>特定的表,使用 ON database.table;</li><li>特定的列;</li><li>特定的存储过程。</li></ul><pre><code class="text">REVOKE SELECT, INSERT ON mydatabase.* FROM myuser;</code></pre><p>更改密码</p><p>必须使用 Password() 函数</p><pre><code class="text">SET PASSWROD FOR myuser = Password('new_password');</code></pre><h2><strong>SQL语句练习</strong></h2><p>在上文学习了SQL的基本语法以后,本文将通过最经典的“教师-学生-成绩”表来帮助你练习SQL。</p><h2><strong>构建如下表结构</strong></h2><p>还有一个Grade表,在如下的练习中体现</p><p><img src="/img/remote/1460000043434730" alt="" title=""></p><h5><strong>插入数据</strong></h5><p>下面表SQL和相关测试数据是我Dump出来的</p><pre><code class="text">-- MySQL dump 10.13 Distrib 5.7.17, for macos10.12 (x86_64)
--
-- Host: localhost Database: learn_sql_pdai_tech
-- ------------------------------------------------------
-- Server version 5.7.28
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `COURSE`
--
DROP TABLE IF EXISTS `COURSE`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `COURSE` (
`CNO` varchar(5) NOT NULL,
`CNAME` varchar(10) NOT NULL,
`TNO` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `COURSE`
--
LOCK TABLES `COURSE` WRITE;
/*!40000 ALTER TABLE `COURSE` DISABLE KEYS */;
INSERT INTO `COURSE` VALUES ('3-105','计算机导论','825'),('3-245','操作系统','804'),('6-166','数据电路','856'),('9-888','高等数学','100');
/*!40000 ALTER TABLE `COURSE` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `SCORE`
--
DROP TABLE IF EXISTS `SCORE`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `SCORE` (
`SNO` varchar(3) NOT NULL,
`CNO` varchar(5) NOT NULL,
`DEGREE` decimal(10,1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `SCORE`
--
LOCK TABLES `SCORE` WRITE;
/*!40000 ALTER TABLE `SCORE` DISABLE KEYS */;
INSERT INTO `SCORE` VALUES ('103','3-245',86.0),('105','3-245',75.0),('109','3-245',68.0),('103','3-105',92.0),('105','3-105',88.0),('109','3-105',76.0),('101','3-105',64.0),('107','3-105',91.0),('101','6-166',85.0),('107','6-106',79.0),('108','3-105',78.0),('108','6-166',81.0);
/*!40000 ALTER TABLE `SCORE` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `STUDENT`
--
DROP TABLE IF EXISTS `STUDENT`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `STUDENT` (
`SNO` varchar(3) NOT NULL,
`SNAME` varchar(4) NOT NULL,
`SSEX` varchar(2) NOT NULL,
`SBIRTHDAY` datetime DEFAULT NULL,
`CLASS` varchar(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `STUDENT`
--
LOCK TABLES `STUDENT` WRITE;
/*!40000 ALTER TABLE `STUDENT` DISABLE KEYS */;
INSERT INTO `STUDENT` VALUES ('108','曾华','男','1977-09-01 00:00:00','95033'),('105','匡明','男','1975-10-02 00:00:00','95031'),('107','王丽','女','1976-01-23 00:00:00','95033'),('101','李军','男','1976-02-20 00:00:00','95033'),('109','王芳','女','1975-02-10 00:00:00','95031'),('103','陆君','男','1974-06-03 00:00:00','95031');
/*!40000 ALTER TABLE `STUDENT` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `TEACHER`
--
DROP TABLE IF EXISTS `TEACHER`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `TEACHER` (
`TNO` varchar(3) NOT NULL,
`TNAME` varchar(4) NOT NULL,
`TSEX` varchar(2) NOT NULL,
`TBIRTHDAY` datetime NOT NULL,
`PROF` varchar(6) DEFAULT NULL,
`DEPART` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `TEACHER`
--
LOCK TABLES `TEACHER` WRITE;
/*!40000 ALTER TABLE `TEACHER` DISABLE KEYS */;
INSERT INTO `TEACHER` VALUES ('804','李诚','男','1958-12-02 00:00:00','副教授','计算机系'),('856','张旭','男','1969-03-12 00:00:00','讲师','电子工程系'),('825','王萍','女','1972-05-05 00:00:00','助教','计算机系'),('831','刘冰','女','1977-08-14 00:00:00','助教','电子工程系');
/*!40000 ALTER TABLE `TEACHER` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-02-06 18:18:25
</code></pre><h2><strong>相关练习</strong></h2><ul><li>1、查询Student表中的所有记录的Sname、Ssex和Class列。</li></ul><pre><code>select SNAME, SSEX, CLASS from STUDENT;</code></pre><ul><li>2、查询教师所有的单位即不重复的Depart列。</li></ul><pre><code class="text">select distinct DEPART from TEACHER;</code></pre><ul><li>3、查询Student表的所有记录。</li></ul><pre><code class="text">select * from STUDENT;</code></pre><ul><li>4、查询Score表中成绩在60到80之间的所有记录。</li></ul><pre><code class="text">select *
from SCORE
where DEGREE > 60 and DEGREE < 80;</code></pre><ul><li>5、查询Score表中成绩为85,86或88的记录。</li></ul><pre><code class="text">select *
from SCORE
where DEGREE = 85 or DEGREE = 86 or DEGREE = 88;</code></pre><ul><li>6、查询Student表中“95031”班或性别为“女”的同学记录。</li></ul><pre><code class="text">select *
from STUDENT
where CLASS = '95031' or SSEX = '女';</code></pre><ul><li>7、以Class降序查询Student表的所有记录。</li></ul><pre><code class="text">select *
from STUDENT
order by CLASS desc;</code></pre><ul><li>8、以Cno升序、Degree降序查询Score表的所有记录。</li></ul><pre><code class="text">select *
from SCORE
order by CNO asc, DEGREE desc;</code></pre><ul><li>9、查询“95031”班的学生人数。</li></ul><pre><code class="text">select count(*)
from STUDENT
where CLASS = '95031';</code></pre><ul><li>10、查询Score表中的最高分的学生学号和课程号。</li></ul><pre><code class="text">select
sno,
CNO
from SCORE
where DEGREE = (
select max(DEGREE)
from SCORE
);</code></pre><ul><li>11、查询‘3-105’号课程的平均分。</li></ul><pre><code class="text">select avg(DEGREE)
from SCORE
where CNO = '3-105';</code></pre><ul><li>12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。</li></ul><pre><code class="text">select
avg(DEGREE),
CNO
from SCORE
where cno like '3%'
group by CNO
having count(*) > 5;</code></pre><ul><li>13、查询最低分大于70,最高分小于90的Sno列。</li></ul><pre><code class="text">select SNO
from SCORE
group by SNO
having min(DEGREE) > 70 and max(DEGREE) < 90;</code></pre><ul><li>14、查询所有学生的Sname、Cno和Degree列。</li></ul><pre><code class="text">select
SNAME,
CNO,
DEGREE
from STUDENT, SCORE
where STUDENT.SNO = SCORE.SNO;</code></pre><ul><li>15、查询所有学生的Sno、Cno和Degree列。</li></ul><pre><code class="text">select
SCORE.SNO,
CNO,
DEGREE
from STUDENT, SCORE
where STUDENT.SNO = SCORE.SNO;</code></pre><ul><li>16、查询所有学生的Sname、Cname和Degree列。</li></ul><pre><code class="text">SELECT
A.SNAME,
B.CNAME,
C.DEGREE
FROM STUDENT A
JOIN (COURSE B, SCORE C)
ON A.SNO = C.SNO AND B.CNO = C.CNO;</code></pre><ul><li>17、查询“95033”班所选课程的平均分。</li></ul><pre><code class="text">select avg(DEGREE)
from SCORE
where sno in (select SNO
from STUDENT
where CLASS = '95033');</code></pre><ul><li>18、假设使用如下命令建立了一个grade表:</li></ul><pre><code class="text">create table grade (
low numeric(3, 0),
upp numeric(3),
rank char(1)
);
insert into grade values (90, 100, 'A');
insert into grade values (80, 89, 'B');
insert into grade values (70, 79, 'C');
insert into grade values (60, 69, 'D');
insert into grade values (0, 59, 'E');</code></pre><ul><li>现查询所有同学的Sno、Cno和rank列。</li></ul><pre><code class="text">SELECT
A.SNO,
A.CNO,
B.RANK
FROM SCORE A, grade B
WHERE A.DEGREE BETWEEN B.LOW AND B.UPP
ORDER BY RANK;</code></pre><ul><li>19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。</li></ul><pre><code class="text">select *
from SCORE
where CNO = '3-105' and DEGREE > ALL (
select DEGREE
from SCORE
where SNO = '109'
);</code></pre><ul><li>20、查询score中选学一门以上课程的同学中分数为非最高分成绩的学生记录</li></ul><pre><code class="text">select * from STUDENT where SNO
in (select SNO
from SCORE
where DEGREE < (select MAX(DEGREE) from SCORE)
group by SNO
having count(*) > 1);</code></pre><ul><li>21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。</li></ul><pre><code class="text">select *
from SCORE
where CNO = '3-105' and DEGREE > ALL (
select DEGREE
from SCORE
where SNO = '109'
);</code></pre><ul><li>22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。</li></ul><pre><code class="text">select
SNO,
SNAME,
SBIRTHDAY
from STUDENT
where year(SBIRTHDAY) = (
select year(SBIRTHDAY)
from STUDENT
where SNO = '108'
);</code></pre><ul><li>23、查询“张旭“教师任课的学生成绩。</li></ul><pre><code class="text">select *
from SCORE
where cno = (
select CNO
from COURSE
inner join TEACHER on COURSE.TNO = TEACHER.TNO and TNAME = '张旭'
);</code></pre><ul><li>24、查询选修某课程的同学人数多于5人的教师姓名。</li></ul><pre><code class="text">select TNAME
from TEACHER
where TNO = (
select TNO
from COURSE
where CNO = (select CNO
from SCORE
group by CNO
having count(SNO) > 5)
);</code></pre><ul><li>25、查询95033班和95031班全体学生的记录。</li></ul><pre><code class="text">select *
from STUDENT
where CLASS in ('95033', '95031');</code></pre><ul><li>26、查询存在有85分以上成绩的课程Cno.</li></ul><pre><code class="text">select cno
from SCORE
group by CNO
having MAX(DEGREE) > 85;</code></pre><ul><li>27、查询出“计算机系“教师所教课程的成绩表。</li></ul><pre><code class="text">select *
from SCORE
where CNO in (select CNO
from TEACHER, COURSE
where DEPART = '计算机系' and COURSE.TNO = TEACHER.TNO);</code></pre><ul><li>28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof</li></ul><pre><code class="text">select
tname,
prof
from TEACHER
where depart = '计算机系' and prof not in (
select prof
from TEACHER
where depart = '电子工程系'
);</code></pre><ul><li>29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。</li></ul><pre><code class="text">select
CNO,
SNO,
DEGREE
from SCORE
where CNO = '3-105' and DEGREE > any (
select DEGREE
from SCORE
where CNO = '3-245'
)
order by DEGREE desc;</code></pre><ul><li>30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.</li></ul><pre><code class="text">SELECT *
FROM SCORE
WHERE CNO = '3-105' AND DEGREE > ALL (
SELECT DEGREE
FROM SCORE
WHERE CNO = '3-245'
)
ORDER by DEGREE desc;</code></pre><ul><li>31、查询所有教师和同学的name、sex和birthday.</li></ul><pre><code class="text">select
TNAME name,
TSEX sex,
TBIRTHDAY birthday
from TEACHER
union
select
sname name,
SSEX sex,
SBIRTHDAY birthday
from STUDENT;</code></pre><ul><li>32、查询所有“女”教师和“女”同学的name、sex和birthday.</li></ul><pre><code class="text">select
TNAME name,
TSEX sex,
TBIRTHDAY birthday
from TEACHER
where TSEX = '女'
union
select
sname name,
SSEX sex,
SBIRTHDAY birthday
from STUDENT
where SSEX = '女';</code></pre><ul><li>33、查询成绩比该课程平均成绩低的同学的成绩表。</li></ul><pre><code class="text">SELECT A.*
FROM SCORE A
WHERE DEGREE < (SELECT AVG(DEGREE)
FROM SCORE B
WHERE A.CNO = B.CNO);</code></pre><ul><li>34、查询所有任课教师的Tname和Depart.</li></ul><pre><code class="text">select
TNAME,
DEPART
from TEACHER a
where exists(select *
from COURSE b
where a.TNO = b.TNO);</code></pre><ul><li>35、查询所有未讲课的教师的Tname和Depart.</li></ul><pre><code class="text">select
TNAME,
DEPART
from TEACHER a
where tno not in (select tno
from COURSE);</code></pre><ul><li>36、查询至少有2名男生的班号。</li></ul><pre><code class="text">select CLASS
from STUDENT
where SSEX = '男'
group by CLASS
having count(SSEX) > 1;</code></pre><ul><li>37、查询Student表中不姓“王”的同学记录。</li></ul><pre><code class="text">select *
from STUDENT
where SNAME not like "王%";</code></pre><ul><li>38、查询Student表中每个学生的姓名和年龄。</li></ul><pre><code class="text">select
SNAME,
year(now()) - year(SBIRTHDAY)
from STUDENT;</code></pre><ul><li>39、查询Student表中最大和最小的Sbirthday日期值。</li></ul><pre><code class="text">select min(SBIRTHDAY) birthday
from STUDENT
union
select max(SBIRTHDAY) birthday
from STUDENT;</code></pre><ul><li>40、以班号和年龄从大到小的顺序查询Student表中的全部记录。</li></ul><pre><code class="text">select *
from STUDENT
order by CLASS desc, year(now()) - year(SBIRTHDAY) desc;</code></pre><ul><li>41、查询“男”教师及其所上的课程。</li></ul><pre><code class="text">select *
from TEACHER, COURSE
where TSEX = '男' and COURSE.TNO = TEACHER.TNO;</code></pre><ul><li>42、查询最高分同学的Sno、Cno和Degree列。</li></ul><pre><code class="text">select
sno,
CNO,
DEGREE
from SCORE
where DEGREE = (select max(DEGREE)
from SCORE);</code></pre><ul><li>43、查询和“李军”同性别的所有同学的Sname.</li></ul><pre><code class="text">select sname
from STUDENT
where SSEX = (select SSEX
from STUDENT
where SNAME = '李军');</code></pre><ul><li>44、查询和“李军”同性别并同班的同学Sname.</li></ul><pre><code class="text">select sname
from STUDENT
where (SSEX, CLASS) = (select
SSEX,
CLASS
from STUDENT
where SNAME = '李军');</code></pre><ul><li>45、查询所有选修“计算机导论”课程的“男”同学的成绩表</li></ul><pre><code class="text">select *
from SCORE, STUDENT
where SCORE.SNO = STUDENT.SNO and SSEX = '男' and CNO = (
select CNO
from COURSE
where CNAME = '计算机导论');</code></pre><ul><li>46、使用游标方式来同时查询每位同学的名字,他所选课程及成绩。</li></ul><pre><code class="text">declare
cursor student_cursor is
select S.SNO,S.SNAME,C.CNAME,SC.DEGREE as DEGREE
from STUDENT S, COURSE C, SCORE SC
where S.SNO=SC.SNO
and SC.CNO=C.CNO;
student_row student_cursor%ROWTYPE;
begin
open student_cursor;
loop
fetch student_cursor INTO student_row;
exit when student_cursor%NOTFOUND;
dbms_output.put_line( student_row.SNO || '' ||
student_row.SNAME|| '' || student_row.CNAME || '' ||
student_row.DEGREE);
end loop;
close student_cursor;
END;
/ </code></pre><ul><li>47、 声明触发器指令,每当有同学转换班级时执行触发器显示当前和之前所在班级。</li></ul><pre><code class="text">CREATE OR REPLACE TRIGGER display_class_changes
AFTER DELETE OR INSERT OR UPDATE ON student
FOR EACH ROW
WHEN (NEW.sno > 0)
BEGIN
dbms_output.put_line('Old class: ' || :OLD.class);
dbms_output.put_line('New class: ' || :NEW.class);
END;
/
Update student
set class=95031
where sno=109;</code></pre><ul><li>48、 删除已设置的触发器指令</li></ul><pre><code class="text">DROP TRIGGER display_class_changes;</code></pre><h2><strong>SQL 语句优化</strong></h2><h4><strong>负向查询不能使用索引</strong></h4><pre><code class="text">select name from user where id not in (1,3,4);</code></pre><p>应该修改为:</p><pre><code class="text">select name from user where id in (2,5,6);</code></pre><h4><strong>前导模糊查询不能使用索引</strong></h4><p>如:</p><pre><code class="text">select name from user where name like '%zhangsan'</code></pre><p>非前导则可以:</p><pre><code class="text">select name from user where name like 'zhangsan%'</code></pre><p>建议可以考虑使用 <code>Lucene</code> 等全文索引工具来代替频繁的模糊查询。</p><h4><strong>数据区分不明显的不建议创建索引</strong></h4><p>如 user 表中的性别字段,可以明显区分的才建议创建索引,如身份证等字段。</p><p>字段的默认值不要为 null</p><p>这样会带来和预期不一致的查询结果。</p><p>在字段上进行计算不能命中索引</p><pre><code class="text">select name from user where FROM_UNIXTIME(create_time) < CURDATE();</code></pre><p>应该修改为:</p><pre><code class="text">select name from user where create_time < FROM_UNIXTIME(CURDATE());</code></pre><h4><strong>最左前缀问题</strong></h4><p>如果给 user 表中的 username pwd 字段创建了复合索引那么使用以下SQL 都是可以命中索引:</p><pre><code class="text">select username from user where username='zhangsan' and pwd ='axsedf1sd'
select username from user where pwd ='axsedf1sd' and username='zhangsan'
select username from user where username='zhangsan'</code></pre><p>但是使用</p><pre><code class="text">select username from user where pwd ='axsedf1sd'</code></pre><p>是不能命中索引的。</p><h4><strong>如果明确知道只有一条记录返回</strong></h4><pre><code class="text">select name from user where username='zhangsan' limit 1</code></pre><p>可以提高效率,可以让数据库停止游标移动。</p><h4><strong>不要让数据库帮我们做强制类型转换</strong></h4><pre><code class="text">select name from user where telno=18722222222</code></pre><p>这样虽然可以查出数据,但是会导致全表扫描。</p><p>需要修改为</p><pre><code class="text">select name from user where telno='18722222222'</code></pre><h4><strong>如果需要进行 join 的字段两表的字段类型要相同</strong></h4><p>不然也不会命中索引。</p>
Nginx 一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...
https://segmentfault.com/a/1190000043430175
2023-02-15T20:14:57+08:00
2023-02-15T20:14:57+08:00
民工哥
https://segmentfault.com/u/jishuroad
35
<p><strong>引言</strong></p><p>早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。</p><p>从上面的描述中,主要存在两个问题:</p><ul><li>①单体结构的部署方式无法承载日益增长的业务流量。</li><li>②当后端节点宕机后,整个系统会陷入瘫痪,导致整个项目不可用。</li></ul><p>因此在这种背景下,引入负载均衡技术可带来的收益:</p><ul><li>「系统的高可用:」 当某个节点宕机后可以迅速将流量转移至其他节点。</li><li>「系统的高性能:」 多台服务器共同对外提供服务,为整个系统提供了更高规模的吞吐。</li><li>「系统的拓展性:」 当业务再次出现增长或萎靡时,可再加入/减少节点,灵活伸缩。</li></ul><p>OK~,既然引入负载均衡技术可给我们带来如此巨大的好处,那么又有那些方案可供选择呢?主要有两种负载方案,「「<strong>硬件层面与软件层面</strong>」」 ,比较常用的<strong>硬件负载器有A10、F5</strong>等,但这些机器动辄大几万乃至几十万的成本,因此一般大型企业会采用该方案,如银行、国企、央企等。而成本有限,但依旧想做负载均衡的项目,那么可在软件层面实现,如典型的Nginx等,软件层的负载也是本文的重点,毕竟Boss们的准则之一就是:「「<strong>能靠技术实现的就尽量不花钱。</strong>」」</p><h2><strong>性能怪兽-Nginx概念深入浅出</strong></h2><p>Nginx 是目前负载均衡技术中的主流方案,几乎绝大部分项目都会使用它,<a href="https://link.segmentfault.com/?enc=6Spyom3arfbhYyuIGr3tQQ%3D%3D.9VWpVSruEg7A0GLkqwNIAPCqxadxs95X51bKUhigYBcTUO3NKmzI%2Fiu9yDqKli7Mo9N80MQhIALUWlScIKoFCV2TAA9LeXhND%2Bs8V%2F9VvEPnVDQTwM8JBtXJpV%2BL9asR%2B29tBVWx6lranjw95P%2F5hCUBCgAGHvUbDcktJBfLXY%2BgJwBNm6QhRkcWzvA2r6x68QS07ttPuQ0%2BMYwsP2oyyQHYldqy9%2BskEN6BFO5W8WN5IA%2BpnXJK8OX8gIU30m2na41pI1Yyc4SZVqSOFWyoMDkuofjHWPHc79juAKdGoLs%3D" rel="nofollow">Nginx</a> 是一个轻量级的高性能HTTP反向代理服务器,同时它也是一个通用类型的代理服务器,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS等。</p><p><img src="/img/remote/1460000043430177" alt="" title=""></p><p>Nginx与Redis相同,都是基于多路复用模型构建出的产物,因此它与Redis同样具备 「「资源占用少、并发支持高」」 的特点,在理论上单节点的<a href="https://link.segmentfault.com/?enc=EuxrP9%2BCQLXcj%2F0oAoksYQ%3D%3D.O0DFnheCYXUV3cghrhNAAI4pc32z5jN1mO28Lr2ge7rXHUigLYhHveiSNpRCEe%2FUJy0PNAg%2BKiBe7UdXey0mgfndE9CD0l4nK3W33lfdFbknBRv5CT1qsEU%2FqJOcWjAK0bd6IRISp%2BGea0mLFwa6%2FRmtusxp44zt3IWE4QZlOo6W0p0L6lPuVaygV9vIncMngob38qkbDiz8%2FBsmHyZOE2IUmL4spV74jSnYNlNrGzdABbjwFuFi7lqPAHFtNJGlArtbwqflQdT0LdTLUR%2F5nwyu8xYdRbD1NLjL%2BrhrP0o%3D" rel="nofollow">Nginx</a>同时支持5W并发连接,而实际生产环境中,硬件基础到位再结合简单调优后确实能达到该数值。</p><p>先来看看<a href="https://link.segmentfault.com/?enc=KfKd1%2BQ%2FWzIdRVWNP%2FcBdg%3D%3D.Gv8DN%2BAQtDQJ6DN%2FL2A8S0vUe0Pyr7N2pEqDviOrMV1ge3j08%2BBuiEckuO7ZQrMkr7YlRs1gk6CSMKcmOrb8APXG50wVpBlA%2FCqh5edH1l06DQ1Vp4xCu6ZCXUKevLCfUYIR9JkNk2Zo5EaOju8lZD41421s42Y0kdx9nXuzG%2BTutjQhGOnxwUj2rQ3GVSZQzZqk20O74LxNnZOzwnTplbuxrNCv%2BlpoGdjx5B2UjWZw6aviQrhFhtqOSWauYynYTogwoYCdZ2Mn7rIF8NU71DddY%2Fv6h2voYzsWFqcXW2Y%3D" rel="nofollow">Nginx</a>引入前后,客户端请求处理流程的对比:</p><p><img src="/img/remote/1460000043430178" alt="" title=""></p><p>原本客户端是直接请求目标服务器,由目标服务器直接完成请求处理工作,但加入Nginx后,所有的请求会先经过<a href="https://link.segmentfault.com/?enc=aBRl4UxBhWxiVA5Sh7UI7A%3D%3D.Wup16GtmkoMSkasPIiwiV3GZc1cbZhKo5uxp9KOcF8OSULzSD5%2BsQPG7mVWeqkKRkY3hdZFXC5sglZBiZVk9mtxzhwT%2F3w51XIObY2YWoJYJzFhROGEMmAeiAj4c1x2PXwDYyfykalBQnYxoAmAlA5xC%2FIHY5uJURQHJ6bkcjpveuvPAvGPcNBWuLp062GVOf%2FU9Z19yKrtgEDR4C5HLsh8TYQfsO94%2BvArpPcSmY35pnJ7wWbRog%2ByjdFUSY2ZpXAtZ25Vx0dGZxMmTxkYAWT3PWfj4KxAYtUPU%2BNhUqiY%3D" rel="nofollow">Nginx</a>,再由其进行分发到具体的服务器处理,处理完成后再返回Nginx,最后由Nginx将最终的响应结果返回给客户端。</p><p>了解了Nginx的基本概念后,再来快速搭建一下环境,以及了解一些Nginx的高级特性,如动静分离、资源压缩、缓存配置、IP黑名单、高可用保障等。</p><h2><strong>Nginx环境搭建</strong></h2><p>❶首先创建Nginx的目录并进入:</p><pre><code class="text">[root@localhost]# mkdir /soft && mkdir /soft/nginx/
[root@localhost]# cd /soft/nginx/ </code></pre><p>❷下载Nginx的安装包,可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包:</p><pre><code class="text">[root@localhost]# wget https://nginx.org/download/nginx-1.21.6.tar.gz </code></pre><p>没有wget命令的可通过yum命令安装:</p><pre><code class="text">[root@localhost]# yum -y install wget </code></pre><p>❸解压Nginx的压缩包:</p><pre><code class="text">[root@localhost]# tar -xvzf nginx-1.21.6.tar.gz </code></pre><p>❹下载并安装Nginx所需的依赖库和包:</p><pre><code class="text">[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ gcc-c++
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ pcre pcre-devel4
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ zlib zlib-devel
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ openssl openssl-devel </code></pre><p>也可以通过yum命令一键下载(推荐上面哪种方式):</p><pre><code class="text">[root@localhost]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel </code></pre><p>执行完成后,然后ls查看目录文件,会看一大堆依赖:</p><p><img src="/img/remote/1460000043430179" alt="" title=""></p><p>紧接着通过rpm命令依次将依赖包一个个构建,或者通过如下指令一键安装所有依赖包:</p><pre><code class="text">[root@localhost]# rpm -ivh --nodeps *.rpm </code></pre><p>❺进入解压后的nginx目录,然后执行Nginx的配置脚本,为后续的安装提前配置好环境,默认位于/usr/local/nginx/目录下(可自定义目录):</p><pre><code class="text">[root@localhost]# cd nginx-1.21.6
[root@localhost]# ./configure --prefix=/soft/nginx/ </code></pre><p>❻编译并安装Nginx:</p><pre><code class="text">[root@localhost]# make && make install </code></pre><p>❼最后回到前面的/soft/nginx/目录,输入ls即可看见安装nginx完成后生成的文件。</p><p>❽修改安装后生成的conf目录下的nginx.conf配置文件:</p><pre><code class="text">[root@localhost]# vi conf/nginx.conf
修改端口号:listen 80;
修改IP地址:server_name 你当前机器的本地IP(线上配置域名); </code></pre><p>❾制定配置文件并启动Nginx:</p><pre><code class="text">[root@localhost]# sbin/nginx -c conf/nginx.conf
[root@localhost]# ps aux | grep nginx </code></pre><p>Nginx其他操作命令:</p><pre><code class="text">sbin/nginx -t -c conf/nginx.conf # 检测配置文件是否正常
sbin/nginx -s reload -c conf/nginx.conf # 修改配置后平滑重启
sbin/nginx -s quit # 优雅关闭Nginx,会在执行完当前的任务后再退出
sbin/nginx -s stop # 强制终止Nginx,不管当前是否有任务在执行 </code></pre><p>❿开放80端口,并更新防火墙:</p><pre><code class="text">[root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@localhost]# firewall-cmd --reload
[root@localhost]# firewall-cmd --zone=public --list-ports </code></pre><p>⓫在Windows/Mac的浏览器中,直接输入刚刚配置的IP地址访问Nginx:</p><p><img src="/img/remote/1460000043430180" alt="" title=""></p><p>最终看到如上的Nginx欢迎界面,代表Nginx安装完成。</p><h2><strong>Nginx反向代理-负载均衡</strong></h2><p>首先通过SpringBoot+Freemarker快速搭建一个WEB项目:springboot-web-nginx,然后在该项目中,创建一个IndexNginxController.java文件,逻辑如下:</p><pre><code class="text">@Controller
public class IndexNginxController {
@Value("${server.port}")
private String port;
@RequestMapping("/")
public ModelAndView index(){
ModelAndView model = new ModelAndView();
model.addObject("port", port);
model.setViewName("index");
return model;
}
} </code></pre><p>在该Controller类中,存在一个成员变量:port,它的值即是从application.properties配置文件中获取server.port值。当出现访问/资源的请求时,跳转前端index页面,并将该值携带返回。</p><p>前端的index.ftl文件代码如下:</p><pre><code class="text"><html>
<head>
<title>Nginx演示页面</title>
<link href="nginx_style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div style="border: 2px solid red;margin: auto;width: 800px;text-align: center">
<div id="nginx_title">
<h1>欢迎来到熊猫高级会所,我是竹子${port}号!</h1>
</div>
</div>
</body>
</html> </code></pre><p>从上可以看出其逻辑并不复杂,仅是从响应中获取了port输出。</p><p>OK~,前提工作准备就绪后,再简单修改一下nginx.conf的配置即可:</p><pre><code class="text">upstream nginx_boot{
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2
server 192.168.0.000:8080 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.0.000:8090 weight=200 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {
location / {
root html;
# 配置一下index的地址,最后加上index.ftl。
index index.html index.htm index.jsp index.ftl;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 请求交给名为nginx_boot的upstream上
proxy_pass http://nginx_boot;
}
} </code></pre><p>至此,所有的前提工作准备就绪,紧接着再启动Nginx,然后再启动两个web服务,第一个WEB服务启动时,在application.properties配置文件中,将端口号改为8080,第二个WEB服务启动时,将其端口号改为8090。</p><p>最终来看看效果:<br><img src="/img/remote/1460000043430181" alt="" title=""></p><p>因为配置了请求分发的权重,8080、8090的权重比为2:1,因此请求会根据权重比均摊到每台机器,也就是8080一次、8090两次、8080一次......</p><h2><strong>Nginx请求分发原理</strong></h2><p>客户端发出的请求192.168.12.129最终会转变为:<a href="https://link.segmentfault.com/?enc=bwCf54LQ6%2BcZnUSQrl5Qfw%3D%3D.Dw1BPaLdl0QetI2TXI2BmtOBd2HywLipJYprb6jn8ok%3D" rel="nofollow">http://192.168.12.129:80/</a>,然后再向目标IP发起请求,流程如下:</p><p><img src="/img/remote/1460000043430182" alt="" title=""></p><ul><li>由于Nginx监听了192.168.12.129的80端口,所以最终该请求会找到Nginx进程;</li><li>Nginx首先会根据配置的location规则进行匹配,根据客户端的请求路径/,会定位到location /{}规则;</li><li>然后根据该location中配置的proxy_pass会再找到名为nginx_boot的upstream;</li><li>最后根据upstream中的配置信息,将请求转发到运行WEB服务的机器处理,由于配置了多个WEB服务,且配置了权重值,因此Nginx会依次根据权重比分发请求。</li></ul><h2><strong>Nginx动静分离</strong></h2><p>动静分离应该是听的次数较多的性能优化方案,那先思考一个问题:「「为什么需要做动静分离呢?它带来的好处是什么?」」 其实这个问题也并不难回答,当你搞懂了网站的本质后,自然就理解了动静分离的重要性。先来以淘宝为例分析看看:</p><p><img src="/img/remote/1460000043430183" alt="" title=""></p><p>当浏览器输入<a href="https://link.segmentfault.com/?enc=f840f2h0H6NxwwJ3swbTBA%3D%3D.nOfD6ZwKxAese3y7AonKh6X4sneo4TUzef2jbPH10J8%3D" rel="nofollow">http://www.taobao.com</a>访问淘宝首页时,打开开发者调试工具可以很明显的看到,首页加载会出现100+的请求数,而正常项目开发时,静态资源一般会放入到resources/static/目录下:</p><p><img src="/img/remote/1460000043430184" alt="" title=""></p><p>在项目上线部署时,这些静态资源会一起打成包,那此时思考一个问题:「「假设淘宝也是这样干的,那么首页加载时的请求最终会去到哪儿被处理?」」 答案毋庸置疑,首页100+的所有请求都会来到部署WEB服务的机器处理,那则代表着一个客户端请求淘宝首页,就会对后端服务器造成100+的并发请求。毫无疑问,这对于后端服务器的压力是尤为巨大的。</p><p>但此时不妨分析看看,首页100+的请求中,是不是至少有60+是属于*.js、*.css、*.html、*.jpg.....这类静态资源的请求呢?答案是Yes。</p><p>既然有这么多请求属于静态的,这些资源大概率情况下,长时间也不会出现变动,那为何还要让这些请求到后端再处理呢?能不能在此之前就提前处理掉?当然OK,因此经过分析之后能够明确一点:「「做了动静分离之后,至少能够让后端服务减少一半以上的并发量。」」 到此时大家应该明白了动静分离能够带来的性能收益究竟有多大。</p><p>OK~,搞清楚动静分离的必要性之后,如何实现动静分离呢?其实非常简单,实战看看。</p><p>①先在部署Nginx的机器,Nginx目录下创建一个目录static_resources:</p><pre><code class="text">mkdir static_resources </code></pre><p>②将项目中所有的静态资源全部拷贝到该目录下,而后将项目中的静态资源移除重新打包。</p><p>③稍微修改一下nginx.conf的配置,增加一条location匹配规则:</p><pre><code class="text">location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){
root /soft/nginx/static_resources;
expires 7d;
} </code></pre><p>然后照常启动nginx和移除了静态资源的WEB服务,你会发现原本的样式、js效果、图片等依旧有效,如下:</p><p><img src="/img/remote/1460000043430185" alt="" title=""></p><p>其中static目录下的nginx_style.css文件已被移除,但效果依旧存在(绿色字体+蓝色大边框):</p><p><img src="/img/remote/1460000043430181" alt="" title=""></p><p>最后解读一下那条location规则:</p><pre><code class="text">location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)
~代表匹配时区分大小写
.*代表任意字符都可以出现零次或多次,即资源名不限制
\.代表匹配后缀分隔符.
(html|...|css)代表匹配括号里所有静态资源类型</code></pre><p>综上所述,简单一句话概述:该配置表示匹配以.html~.css为后缀的所有资源请求。</p><p>「最后提一嘴,也可以将静态资源上传到文件服务器中,然后location中配置一个新的upstream指向。」</p><h2><strong>Nginx资源压缩</strong></h2><p>建立在动静分离的基础之上,如果一个静态资源的Size越小,那么自然传输速度会更快,同时也会更节省带宽,因此我们在部署项目时,也可以通过Nginx对于静态资源实现压缩传输,一方面可以节省带宽资源,第二方面也可以加快响应速度并提升系统整体吞吐。</p><p>在Nginx也提供了三个支持资源压缩的模块<code>ngx_http_gzip_module</code>、<code>ngx_http_gzip_static_module</code>、<code>ngx_http_gunzip_module</code>,其中ngx\_http\_gzip\_module属于内置模块,代表着可以直接使用该模块下的一些压缩指令,后续的资源压缩操作都基于该模块,先来看看压缩配置的一些参数/指令:</p><p><img src="/img/remote/1460000043430186" alt="" title=""></p><p>了解了Nginx中的基本压缩配置后,接下来可以在Nginx中简单配置一下:</p><pre><code class="text">http{
# 开启压缩机制
gzip on;
# 指定会被压缩的文件类型(也可自己配置其他类型)
gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
# 设置压缩级别,越高资源消耗越大,但压缩效果越好
gzip_comp_level 5;
# 在头部中添加Vary: Accept-Encoding(建议开启)
gzip_vary on;
# 处理压缩请求的缓冲区数量和大小
gzip_buffers 16 8k;
# 对于不支持压缩功能的客户端请求不开启压缩机制
gzip_disable "MSIE [1-6]\."; # 低版本的IE浏览器不支持压缩
# 设置压缩响应所支持的HTTP最低版本
gzip_http_version 1.1;
# 设置触发压缩的最小阈值
gzip_min_length 2k;
# 关闭对后端服务器的响应结果进行压缩
gzip_proxied off;
}</code></pre><p>在上述的压缩配置中,最后一个gzip_proxied选项,可以根据系统的实际情况决定,总共存在多种选项:</p><pre><code class="text">off:关闭Nginx对后台服务器的响应结果进行压缩。
expired:如果响应头中包含Expires信息,则开启压缩。
no-cache:如果响应头中包含Cache-Control:no-cache信息,则开启压缩。
no-store:如果响应头中包含Cache-Control:no-store信息,则开启压缩。
private:如果响应头中包含Cache-Control:private信息,则开启压缩。
no_last_modified:如果响应头中不包含Last-Modified信息,则开启压缩。
no_etag:如果响应头中不包含ETag信息,则开启压缩。
auth:如果响应头中包含Authorization信息,则开启压缩。
any:无条件对后端的响应结果开启压缩机制。</code></pre><p>OK~,简单修改好了Nginx的压缩配置后,可以在原本的index页面中引入一个jquery-3.6.0.js文件:</p><pre><code class="text"><script type="text/javascript" src="jquery-3.6.0.js"></script> </code></pre><p>分别来对比下压缩前后的区别:</p><p><img src="/img/remote/1460000043430187" alt="" title=""></p><p>从图中可以很明显看出,未开启压缩机制前访问时,js文件的原始大小为230K,当配置好压缩后再重启Nginx,会发现文件大小从230KB→69KB,效果立竿见影!</p><p>注意点:①对于图片、视频类型的数据,会默认开启压缩机制,因此一般无需再次开启压缩。②对于.js文件而言,需要指定压缩类型为application/javascript,而并非text/javascript、application/x-javascript。</p><h2><strong>Nginx缓冲区</strong></h2><p>先来思考一个问题,接入Nginx的项目一般请求流程为:“客户端→Nginx→服务端”,在这个过程中存在两个连接:“客户端→Nginx、Nginx→服务端”,那么两个不同的连接速度不一致,就会影响用户的体验(比如浏览器的加载速度跟不上服务端的响应速度)。</p><p>其实也就类似电脑的内存跟不上CPU速度,所以对于用户造成的体验感极差,因此在CPU设计时都会加入三级高速缓冲区,用于缓解CPU和内存速率不一致的矛盾。在Nginx也同样存在缓冲区的机制,主要目的就在于:「「用来解决两个连接之间速度不匹配造成的问题」」 ,有了缓冲后,Nginx代理可暂存后端的响应,然后按需供给数据给客户端。先来看看一些关于缓冲区的配置项:</p><pre><code class="text">proxy_buffering:是否启用缓冲机制,默认为on关闭状态。
client_body_buffer_size:设置缓冲客户端请求数据的内存大小。
proxy_buffers:为每个请求/连接设置缓冲区的数量和大小,默认4 4k/8k。
proxy_buffer_size:设置用于存储响应头的缓冲区大小。
proxy_busy_buffers_size:在后端数据没有完全接收完成时,Nginx可以将busy状态的缓冲返回给客户端,该参数用来设置busy状态的buffer具体有多大,默认为proxy_buffer_size*2。
proxy_temp_path:当内存缓冲区存满时,可以将数据临时存放到磁盘,该参数是设置存储缓冲数据的目录。
path是临时目录的路径。
语法:proxy_temp_path path; path是临时目录的路径
proxy_temp_file_write_size:设置每次写数据到临时文件的大小限制。
proxy_max_temp_file_size:设置临时的缓冲目录中允许存储的最大容量。
非缓冲参数项:
proxy_connect_timeout:设置与后端服务器建立连接时的超时时间。
proxy_read_timeout:设置从后端服务器读取响应数据的超时时间。
proxy_send_timeout:设置向后端服务器传输请求数据的超时时间。</code></pre><p>具体的nginx.conf配置如下:</p><pre><code class="text">http{
proxy_connect_timeout 10;
proxy_read_timeout 120;
proxy_send_timeout 10;
proxy_buffering on;
client_body_buffer_size 512k;
proxy_buffers 4 64k;
proxy_buffer_size 16k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /soft/nginx/temp_buffer;
} </code></pre><p>上述的缓冲区参数,是基于每个请求分配的空间,而并不是所有请求的共享空间。当然,具体的参数值还需要根据业务去决定,要综合考虑机器的内存以及每个请求的平均数据大小。</p><p>最后提一嘴:使用缓冲也可以减少即时传输带来的带宽消耗。</p><h2><strong>Nginx缓存机制</strong></h2><p>对于性能优化而言,缓存是一种能够大幅度提升性能的方案,因此几乎可以在各处都能看见缓存,如客户端缓存、代理缓存、服务器缓存等等,Nginx的缓存则属于代理缓存的一种。对于整个系统而言,加入缓存带来的优势额外明显:</p><ul><li>减少了再次向后端或文件服务器请求资源的带宽消耗。</li><li>降低了下游服务器的访问压力,提升系统整体吞吐。</li><li>缩短了响应时间,提升了加载速度,打开页面的速度更快。</li></ul><p>那么在Nginx中,又该如何配置代理缓存呢?先来看看缓存相关的配置项:</p><p>「proxy_cache_path」:代理缓存的路径。</p><p>语法:</p><pre><code class="text">proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];</code></pre><p>是的,你没有看错,就是这么长....,解释一下每个参数项的含义:</p><pre><code class="text">path:缓存的路径地址。
levels:缓存存储的层次结构,最多允许三层目录。
use_temp_path:是否使用临时目录。
keys_zone:指定一个共享内存空间来存储热点Key(1M可存储8000个Key)。
inactive:设置缓存多长时间未被访问后删除(默认是十分钟)。
max_size:允许缓存的最大存储空间,超出后会基于LRU算法移除缓存,Nginx会创建一个Cache manager的进程移除数据,也可以通过purge方式。
manager_files:manager进程每次移除缓存文件数量的上限。
manager_sleep:manager进程每次移除缓存文件的时间上限。
manager_threshold:manager进程每次移除缓存后的间隔时间。
loader_files:重启Nginx载入缓存时,每次加载的个数,默认100。
loader_sleep:每次载入时,允许的最大时间上限,默认200ms。
loader_threshold:一次载入后,停顿的时间间隔,默认50ms。
purger:是否开启purge方式移除数据。
purger_files:每次移除缓存文件时的数量。
purger_sleep:每次移除时,允许消耗的最大时间。
purger_threshold:每次移除完成后,停顿的间隔时间。</code></pre><p>「proxy_cache」:开启或关闭代理缓存,开启时需要指定一个共享内存区域。</p><p>语法:</p><pre><code class="text">proxy_cache zone | off;</code></pre><p>zone为内存区域的名称,即上面中keys_zone设置的名称。</p><p>「proxy\_cache_key」:定义如何生成缓存的键。</p><p>语法:</p><pre><code class="text">proxy_cache_key string;</code></pre><p>string为生成Key的规则,如proxy_host$request_uri。</p><p>「proxy_cache_valid」:缓存生效的状态码与过期时间。</p><p>语法:</p><pre><code class="text">proxy_cache_valid [code ...] time;</code></pre><p>code为状态码,time为有效时间,可以根据状态码设置不同的缓存时间。</p><p>例如:proxy_cache_valid 200 302 30m;</p><p>「proxy_cache_min_uses」:设置资源被请求多少次后被缓存。</p><p>语法:</p><pre><code class="text">proxy_cache_min_uses number;</code></pre><p>number为次数,默认为1。</p><p>「proxy_cache_use_stale」:当后端出现异常时,是否允许Nginx返回缓存作为响应。</p><p>语法:</p><pre><code class="text">proxy_cache_use_stale error;</code></pre><p>error为错误类型,可配置timeout|invalid_header|updating|http_500...。</p><p>「proxy_cache_lock」:对于相同的请求,是否开启锁机制,只允许一个请求发往后端。</p><p>语法:</p><pre><code class="text">proxy_cache_lock on | off;</code></pre><p>「proxy_cache_lock_timeout」:配置锁超时机制,超出规定时间后会释放请求。</p><pre><code class="text">proxy_cache_lock_timeout time;</code></pre><p>「proxy_cache_methods」:设置对于那些HTTP方法开启缓存。</p><p>语法:</p><pre><code class="text">proxy_cache_methods method;</code></pre><p>method为请求方法类型,如GET、HEAD等。</p><p>「proxy_no_cache」:定义不存储缓存的条件,符合时不会保存。</p><p>语法:</p><pre><code class="text">proxy_no_cache string...;</code></pre><p>string为条件,例如arg_nocache $arg_comment;</p><p>「proxy_cache_bypass」:定义不读取缓存的条件,符合时不会从缓存中读取。</p><p>语法:</p><pre><code class="text">proxy_cache_bypass string...;</code></pre><p>和上面proxy_no_cache的配置方法类似。</p><p>「add_header」:往响应头中添加字段信息。</p><p>语法:</p><pre><code class="text">add_header fieldName fieldValue;</code></pre><p>「$upstream_cache_status」:记录了缓存是否命中的信息,存在多种情况:</p><pre><code class="text">MISS:请求未命中缓存。
HIT:请求命中缓存。
EXPIRED:请求命中缓存但缓存已过期。
STALE:请求命中了陈旧缓存。
REVALIDDATED:Nginx验证陈旧缓存依然有效。
UPDATING:命中的缓存内容陈旧,但正在更新缓存。
BYPASS:响应结果是从原始服务器获取的。</code></pre><p>PS:这个和之前的不同,之前的都是参数项,这个是一个Nginx内置变量。</p><p>OK~,对于Nginx中的缓存配置项大概了解后,接着来配置一下Nginx代理缓存:</p><pre><code class="text">http{
# 设置缓存的目录,并且内存中缓存区名为hot_cache,大小为128m,
# 三天未被访问过的缓存自动清楚,磁盘中缓存的最大容量为2GB。
proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g;
server{
location / {
# 使用名为nginx_cache的缓存空间
proxy_cache hot_cache;
# 对于200、206、304、301、302状态码的数据缓存1天
proxy_cache_valid 200 206 304 301 302 1d;
# 对于其他状态的数据缓存30分钟
proxy_cache_valid any 30m;
# 定义生成缓存键的规则(请求的url+参数作为key)
proxy_cache_key $host$uri$is_args$args;
# 资源至少被重复访问三次后再加入缓存
proxy_cache_min_uses 3;
# 出现重复请求时,只让一个去后端读数据,其他的从缓存中读取
proxy_cache_lock on;
# 上面的锁超时时间为3s,超过3s未获取数据,其他请求直接去后端
proxy_cache_lock_timeout 3s;
# 对于请求参数或cookie中声明了不缓存的数据,不再加入缓存
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
# 在响应头中添加一个缓存是否命中的状态(便于调试)
add_header Cache-status $upstream_cache_status;
}
}
} </code></pre><p>接着来看一下效果,如下:</p><p><img src="/img/remote/1460000043430188" alt="" title=""></p><p>第一次访问时,因为还没有请求过资源,所以缓存中没有数据,因此没有命中缓存。第二、三次,依旧没有命中缓存,直至第四次时才显示命中,这是为什么呢?因为在前面的缓存配置中,我们配置了加入缓存的最低条件为:「「资源至少要被请求三次以上才会加入缓存。」」 这样可以避免很多无效缓存占用空间。</p><h2><strong>缓存清理</strong></h2><p>当缓存过多时,如果不及时清理会导致磁盘空间被“吃光”,因此我们需要一套完善的缓存清理机制去删除缓存,在之前的proxy_cache_path参数中有purger相关的选项,开启后可以帮我们自动清理缓存,但遗憾的是:purger系列参数只有商业版的NginxPlus才能使用,因此需要付费才可使用。</p><p>不过天无绝人之路,我们可以通过强大的第三方模块ngx_cache_purge来替代,先来安装一下该插件:</p><p>①首先去到Nginx的安装目录下,创建一个cache_purge目录:</p><pre><code class="text">[root@localhost]# mkdir cache_purge && cd cache_purge </code></pre><p>②通过wget指令从github上拉取安装包的压缩文件并解压:</p><pre><code class="text">[root@localhost]# wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
[root@localhost]# tar -xvzf 2.3.tar.gz </code></pre><p>③再次去到之前Nginx的解压目录下:</p><pre><code class="text">[root@localhost]# cd /soft/nginx/nginx1.21.6 </code></pre><p>④重新构建一次Nginx,通过--add-module的指令添加刚刚的第三方模块:</p><pre><code class="text">[root@localhost]# ./configure --prefix=/soft/nginx/ --add-module=/soft/nginx/cache_purge/ngx_cache_purge-2.3/ </code></pre><p>⑤重新根据刚刚构建的Nginx,再次编译一下,「但切记不要make install」 :</p><pre><code class="text">[root@localhost]# make </code></pre><p>⑥删除之前Nginx的启动文件,不放心的也可以移动到其他位置:</p><pre><code class="text">[root@localhost]# rm -rf /soft/nginx/sbin/nginx </code></pre><p>⑦从生成的objs目录中,重新复制一个Nginx的启动文件到原来的位置:</p><pre><code class="text">[root@localhost]# cp objs/nginx /soft/nginx/sbin/nginx </code></pre><p>至此,第三方缓存清除模块ngx_cache_purge就安装完成了,接下来稍微修改一下nginx.conf配置,再添加一条location规则:</p><pre><code class="text">location ~ /purge(/.*) {
# 配置可以执行清除操作的IP(线上可以配置成内网机器)
# allow 127.0.0.1; # 代表本机
allow all; # 代表允许任意IP清除缓存
proxy_cache_purge $host$1$is_args$args;
} </code></pre><p>然后再重启Nginx,接下来即可通过<a href="https://link.segmentfault.com/?enc=ebr7EaiD6AeWmJrA8yQhAA%3D%3D.PdBOWHVv6QPDln6FqGjmpjmvGx72qbLL6wVgsQYu4b8%3D" rel="nofollow">http://xxx/purge/xx</a>的方式清除缓存。</p><h2><strong>Nginx实现IP黑白名单</strong></h2><p>有时候往往有些需求,可能某些接口只能开放给对应的合作商,或者购买/接入API的合作伙伴,那么此时就需要实现类似于IP白名单的功能。而有时候有些恶意攻击者或爬虫程序,被识别后需要禁止其再次访问网站,因此也需要实现IP黑名单。那么这些功能无需交由后端实现,可直接在Nginx中处理。</p><p>Nginx做黑白名单机制,主要是通过allow、deny配置项来实现:</p><pre><code class="text">allow xxx.xxx.xxx.xxx; # 允许指定的IP访问,可以用于实现白名单。
deny xxx.xxx.xxx.xxx; # 禁止指定的IP访问,可以用于实现黑名单。 </code></pre><p>要同时屏蔽/开放多个IP访问时,如果所有IP全部写在nginx.conf文件中定然是不显示的,这种方式比较冗余,那么可以新建两个文件BlocksIP.conf、WhiteIP.conf:</p><pre><code class="text"># --------黑名单:BlocksIP.conf---------
deny 192.177.12.222; # 屏蔽192.177.12.222访问
deny 192.177.44.201; # 屏蔽192.177.44.201访问
deny 127.0.0.0/8; # 屏蔽127.0.0.1到127.255.255.254网段中的所有IP访问
# --------白名单:WhiteIP.conf---------
allow 192.177.12.222; # 允许192.177.12.222访问
allow 192.177.44.201; # 允许192.177.44.201访问
allow 127.45.0.0/16; # 允许127.45.0.1到127.45.255.254网段中的所有IP访问
deny all; # 除开上述IP外,其他IP全部禁止访问 </code></pre><p>分别将要禁止/开放的IP添加到对应的文件后,可以再将这两个文件在nginx.conf中导入:</p><pre><code class="text">http{
# 屏蔽该文件中的所有IP
include /soft/nginx/IP/BlocksIP.conf;
server{
location xxx {
# 某一系列接口只开放给白名单中的IP
include /soft/nginx/IP/blockip.conf;
}
}
}</code></pre><p>对于文件具体在哪儿导入,这个也并非随意的,如果要整站屏蔽/开放就在http中导入,如果只需要一个域名下屏蔽/开放就在sever中导入,如果只需要针对于某一系列接口屏蔽/开放IP,那么就在location中导入。</p><p>当然,上述只是最简单的IP黑/白名单实现方式,同时也可以通过ngx_http_geo_module、ngx_http_geo_module第三方库去实现(这种方式可以按地区、国家进行屏蔽,并且提供了IP库)。</p><h2><strong>Nginx跨域配置</strong></h2><p>跨域问题在之前的单体架构开发中,其实是比较少见的问题,除非是需要接入第三方SDK时,才需要处理此问题。但随着现在前后端分离、分布式架构的流行,跨域问题也成为了每个Java开发必须要懂得解决的一个问题。</p><h3><strong>跨域问题产生的原因</strong></h3><p>产生跨域问题的主要原因就在于 「同源策略」 ,为了保证用户信息安全,防止恶意网站窃取数据,同源策略是必须的,否则cookie可以共享。由于http无状态协议通常会借助cookie来实现有状态的信息记录,例如用户的身份/密码等,因此一旦cookie被共享,那么会导致用户的身份信息被盗取。</p><p>同源策略主要是指三点相同,「「协议+域名+端口」」 相同的两个请求,则可以被看做是同源的,但如果其中任意一点存在不同,则代表是两个不同源的请求,同源策略会限制了不同源之间的资源交互。</p><h3><strong>Nginx解决跨域问题</strong></h3><p>弄明白了跨域问题的产生原因,接下来看看Nginx中又该如何解决跨域呢?其实比较简单,在nginx.conf中稍微添加一点配置即可:</p><pre><code class="text">location / {
# 允许跨域的请求,可以自定义变量$http_origin,*表示所有
add_header 'Access-Control-Allow-Origin' *;
# 允许携带cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许跨域请求的方法:GET,POST,OPTIONS,PUT
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';
# 允许请求时携带的头部信息,*表示所有
add_header 'Access-Control-Allow-Headers' *;
# 允许发送按段获取资源的请求
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
# 一定要有!!!否则Post请求无法进行跨域!
# 在发送Post跨域请求前,会以Options方式发送预检请求,服务器接受时才会正式请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
# 对于Options方式的请求返回204,表示接受跨域请求
return 204;
}
} </code></pre><p>在nginx.conf文件加上如上配置后,跨域请求即可生效了。</p><p>但如果后端是采用分布式架构开发的,有时候RPC调用也需要解决跨域问题,不然也同样会出现无法跨域请求的异常,因此可以在你的后端项目中,通过继承HandlerInterceptorAdapter类、实现WebMvcConfigurer接口、添加@CrossOrgin注解的方式实现接口之间的跨域配置。</p><h2><strong>Nginx防盗链设计</strong></h2><p>首先了解一下何谓盗链:「「盗链即是指外部网站引入当前网站的资源对外展示」」 ,来举个简单的例子理解:</p><p>好比壁纸网站X站、Y站,X站是一点点去购买版权、签约作者的方式,从而积累了海量的壁纸素材,但Y站由于资金等各方面的原因,就直接通过<code><img src="X站/xxx.jpg" /></code>这种方式照搬了X站的所有壁纸资源,继而提供给用户下载。</p><p>那么如果我们自己是这个X站的Boss,心中必然不爽,那么此时又该如何屏蔽这类问题呢?那么接下来要叙说的「「防盗链」」 登场了!</p><p>Nginx的防盗链机制实现,跟一个头部字段:Referer有关,该字段主要描述了当前请求是从哪儿发出的,那么在Nginx中就可获取该值,然后判断是否为本站的资源引用请求,如果不是则不允许访问。Nginx中存在一个配置项为valid_referers,正好可以满足前面的需求,语法如下:</p><pre><code class="text">valid_referers none | blocked | server_names | string ...;
none:表示接受没有Referer字段的HTTP请求访问。
blocked:表示允许http://或https//以外的请求访问。
server_names:资源的白名单,这里可以指定允许访问的域名。
string:可自定义字符串,支配通配符、正则表达式写法。</code></pre><p>简单了解语法后,接下来的实现如下:</p><pre><code class="text"># 在动静分离的location中开启防盗链机制
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){
# 最后面的值在上线前可配置为允许的域名地址
valid_referers blocked 192.168.12.129;
if ($invalid_referer) {
# 可以配置成返回一张禁止盗取的图片
# rewrite ^/ http://xx.xx.com/NO.jpg;
# 也可直接返回403
return 403;
}
root /soft/nginx/static_resources;
expires 7d;
} </code></pre><p>根据上述中的内容配置后,就已经通过Nginx实现了最基本的防盗链机制,最后只需要额外重启一下就好啦!当然,对于防盗链机制实现这块,也有专门的第三方模块ngx_http_accesskey_module实现了更为完善的设计,感兴趣的小伙伴可以自行去看看。</p><p>PS:防盗链机制也无法解决爬虫伪造referers信息的这种方式抓取数据。</p><h2><strong>Nginx大文件传输配置</strong></h2><p>在某些业务场景中需要传输一些大文件,但大文件传输时往往都会会出现一些Bug,比如文件超出限制、文件传输过程中请求超时等,那么此时就可以在Nginx稍微做一些配置,先来了解一些关于大文件传输时可能会用的配置项:</p><p><img src="/img/remote/1460000043430189" alt="" title=""></p><p>在传输大文件时,<code>client_max_body_size、client_header_timeout、proxy_read_timeout、proxy_send_timeout</code>这四个参数值都可以根据自己项目的实际情况来配置。</p><p>上述配置仅是作为代理层需要配置的,因为最终客户端传输文件还是直接与后端进行交互,这里只是把作为网关层的Nginx配置调高一点,调到能够“容纳大文件”传输的程度。当然,Nginx中也可以作为文件服务器使用,但需要用到一个专门的第三方模块nginx-upload-module,如果项目中文件上传的作用处不多,那么建议可以通过Nginx搭建,毕竟可以节省一台文件服务器资源。但如若文件上传/下载较为频繁,那么还是建议额外搭建文件服务器,并将上传/下载功能交由后端处理。</p><h2><strong>Nginx配置SLL证书</strong></h2><p>随着越来越多的网站接入HTTPS,因此Nginx中仅配置HTTP还不够,往往还需要监听443端口的请求,HTTPS为了确保通信安全,所以服务端需配置对应的数字证书,当项目使用Nginx作为网关时,那么证书在Nginx中也需要配置,接下来简单聊一下关于SSL证书配置过程:</p><p>①先去CA机构或从云控制台中申请对应的SSL证书,审核通过后下载Nginx版本的证书。</p><p>②下载数字证书后,完整的文件总共有三个:.crt、.key、.pem:</p><pre><code class="text">.crt:数字证书文件,.crt是.pem的拓展文件,因此有些人下载后可能没有。
.key:服务器的私钥文件,及非对称加密的私钥,用于解密公钥传输的数据。
.pem:Base64-encoded编码格式的源证书文本文件,可自行根需求修改拓展名。</code></pre><p>③在Nginx目录下新建certificate目录,并将下载好的证书/私钥等文件上传至该目录。</p><p>④最后修改一下nginx.conf文件即可,如下:</p><pre><code class="text"># ----------HTTPS配置-----------
server {
# 监听HTTPS默认的443端口
listen 443;
# 配置自己项目的域名
server_name www.xxx.com;
# 打开SSL加密传输
ssl on;
# 输入域名后,首页文件所在的目录
root html;
# 配置首页的文件名
index index.html index.htm index.jsp index.ftl;
# 配置自己下载的数字证书
ssl_certificate certificate/xxx.pem;
# 配置自己下载的服务器私钥
ssl_certificate_key certificate/xxx.key;
# 停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥
ssl_session_timeout 5m;
# TLS握手时,服务器采用的密码套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 服务器支持的TLS版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 开启由服务器决定采用的密码套件
ssl_prefer_server_ciphers on;
location / {
....
}
}
# ---------HTTP请求转HTTPS-------------
server {
# 监听HTTP默认的80端口
listen 80;
# 如果80端口出现访问该域名的请求
server_name www.xxx.com;
# 将请求改写为HTTPS(这里写你配置了HTTPS的域名)
rewrite ^(.*)$ https://www.xxx.com;
} </code></pre><p>OK~,根据如上配置了Nginx后,你的网站即可通过https://的方式访问,并且当客户端使用http://的方式访问时,会自动将其改写为HTTPS请求。</p><h2><strong>Nginx的高可用</strong></h2><p>线上如果采用单个节点的方式部署Nginx,难免会出现天灾人祸,比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭....哈哈哈,夸张了。但实际生产环境中确实存在隐患问题,由于Nginx作为整个系统的网关层接入外部流量,所以一旦Nginx宕机,最终就会导致整个系统不可用,这无疑对于用户的体验感是极差的,因此也得保障Nginx高可用的特性。</p><p>接下来则会通过keepalived的VIP机制,实现Nginx的高可用。VIP并不是只会员的意思,而是指Virtual IP,即虚拟IP。</p><p>keepalived在之前单体架构开发时,是一个用的较为频繁的高可用技术,比如MySQL、Redis、MQ、Proxy、Tomcat等各处都会通过keepalived提供的VIP机制,实现单节点应用的高可用。</p><h3><strong>Keepalived+重启脚本+双机热备搭建</strong></h3><p>①首先创建一个对应的目录并下载keepalived到Linux中并解压:</p><pre><code class="text">[root@localhost]# mkdir /soft/keepalived && cd /soft/keepalived
[root@localhost]# wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
[root@localhost]# tar -zxvf keepalived-2.2.4.tar.gz </code></pre><p>②进入解压后的keepalived目录并构建安装环境,然后编译并安装:</p><pre><code class="text">[root@localhost]# cd keepalived-2.2.4
[root@localhost]# ./configure --prefix=/soft/keepalived/
[root@localhost]# make && make install </code></pre><p>③进入安装目录的/soft/keepalived/etc/keepalived/并编辑配置文件:</p><pre><code class="text">[root@localhost]# cd /soft/keepalived/etc/keepalived/
[root@localhost]# vi keepalived.conf </code></pre><p>④编辑主机的keepalived.conf核心配置文件,如下:</p><pre><code class="text">global_defs {
# 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
# 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)
router_id 192.168.12.129
}
# 定时运行的脚本文件配置
vrrp_script check_nginx_pid_restart {
# 之前编写的nginx重启脚本的所在位置
script "/soft/scripts/keepalived/check_nginx_pid_restart.sh"
# 每间隔3秒执行一次
interval 3
# 如果脚本中的条件成立,重启一次则权重-20
weight -20
}
# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)
vrrp_instance VI_1 {
# 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)
state MASTER
# 绑定虚拟IP的网络接口,根据自己的机器的网卡配置
interface ens33
# 虚拟路由的ID号,主从两个节点设置必须一样
virtual_router_id 121
# 填写本机IP
mcast_src_ip 192.168.12.129
# 节点权重优先级,主节点要比从节点优先级高
priority 100
# 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题
nopreempt
# 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 将track_script块加入instance配置块
track_script {
# 执行Nginx监控的脚本
check_nginx_pid_restart
}
virtual_ipaddress {
# 虚拟IP(VIP),也可扩展,可配置多个。
192.168.12.111
}
} </code></pre><p>⑤克隆一台之前的虚拟机作为从(备)机,编辑从机的keepalived.conf文件,如下:</p><pre><code class="text">global_defs {
# 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
# 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)
router_id 192.168.12.130
}
# 定时运行的脚本文件配置
vrrp_script check_nginx_pid_restart {
# 之前编写的nginx重启脚本的所在位置
script "/soft/scripts/keepalived/check_nginx_pid_restart.sh"
# 每间隔3秒执行一次
interval 3
# 如果脚本中的条件成立,重启一次则权重-20
weight -20
}
# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)
vrrp_instance VI_1 {
# 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)
state BACKUP
# 绑定虚拟IP的网络接口,根据自己的机器的网卡配置
interface ens33
# 虚拟路由的ID号,主从两个节点设置必须一样
virtual_router_id 121
# 填写本机IP
mcast_src_ip 192.168.12.130
# 节点权重优先级,主节点要比从节点优先级高
priority 90
# 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题
nopreempt
# 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 将track_script块加入instance配置块
track_script {
# 执行Nginx监控的脚本
check_nginx_pid_restart
}
virtual_ipaddress {
# 虚拟IP(VIP),也可扩展,可配置多个。
192.168.12.111
}
} </code></pre><p>⑥新建scripts目录并编写Nginx的重启脚本,check_nginx_pid_restart.sh:</p><pre><code class="text">[root@localhost]# mkdir /soft/scripts /soft/scripts/keepalived
[root@localhost]# touch /soft/scripts/keepalived/check_nginx_pid_restart.sh
[root@localhost]# vi /soft/scripts/keepalived/check_nginx_pid_restart.sh
#!/bin/sh
# 通过ps指令查询后台的nginx进程数,并将其保存在变量nginx_number中
nginx_number=`ps -C nginx --no-header | wc -l`
# 判断后台是否还有Nginx进程在运行
if [ $nginx_number -eq 0 ];then
# 如果后台查询不到`Nginx`进程存在,则执行重启指令
/soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf
# 重启后等待1s后,再次查询后台进程数
sleep 1
# 如果重启后依旧无法查询到nginx进程
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
# 将keepalived主机下线,将虚拟IP漂移给从机,从机上线接管Nginx服务
systemctl stop keepalived.service
fi
fi </code></pre><p>⑦编写的脚本文件需要更改编码格式,并赋予执行权限,否则可能执行失败:</p><pre><code class="text">[root@localhost]# vi /soft/scripts/keepalived/check_nginx_pid_restart.sh
:set fileformat=unix # 在vi命令里面执行,修改编码格式
:set ff # 查看修改后的编码格式
[root@localhost]# chmod +x /soft/scripts/keepalived/check_nginx_pid_restart.sh </code></pre><p>⑧由于安装keepalived时,是自定义的安装位置,因此需要拷贝一些文件到系统目录中:</p><pre><code class="text">[root@localhost]# mkdir /etc/keepalived/
[root@localhost]# cp /soft/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@localhost]# cp /soft/keepalived/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/
[root@localhost]# cp /soft/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ </code></pre><p>⑨将keepalived加入系统服务并设置开启自启动,然后测试启动是否正常:</p><pre><code class="text">[root@localhost]# chkconfig keepalived on
[root@localhost]# systemctl daemon-reload
[root@localhost]# systemctl enable keepalived.service
[root@localhost]# systemctl start keepalived.service </code></pre><p>其他命令:</p><pre><code class="text">systemctl disable keepalived.service # 禁止开机自动启动
systemctl restart keepalived.service # 重启keepalived
systemctl stop keepalived.service # 停止keepalived
tail -f /var/log/messages # 查看keepalived运行时日志 </code></pre><p>⑩最后测试一下VIP是否生效,通过查看本机是否成功挂载虚拟IP:</p><pre><code class="text">[root@localhost]# ip addr </code></pre><p><img src="/img/remote/1460000043430190" alt="" title=""></p><p>从上图中可以明显看见虚拟IP已经成功挂载,但另外一台机器192.168.12.130并不会挂载这个虚拟IP,只有当主机下线后,作为从机的192.168.12.130才会上线,接替VIP。最后测试一下外网是否可以正常与VIP通信,即在Windows中直接ping VIP:</p><p><img src="/img/remote/1460000043430191" alt="" title=""></p><p>外部通过VIP通信时,也可以正常Ping通,代表虚拟IP配置成功。</p><h2><strong>Nginx高可用性测试</strong></h2><p>经过上述步骤后,keepalived的VIP机制已经搭建成功,在上个阶段中主要做了几件事:</p><ul><li>一、为部署Nginx的机器挂载了VIP。</li><li>二、通过keepalived搭建了主从双机热备。</li><li>三、通过keepalived实现了Nginx宕机重启。</li></ul><p>由于前面没有域名的原因,因此最初server_name配置的是当前机器的IP,所以需稍微更改一下nginx.conf的配置:</p><pre><code class="text">sever{
listen 80;
# 这里从机器的本地IP改为虚拟IP
server_name 192.168.12.111;
# 如果这里配置的是域名,那么则将域名的映射配置改为虚拟IP
} </code></pre><p>最后来实验一下效果:</p><p><img src="/img/remote/1460000043430192" alt="" title=""></p><p>在上述过程中,首先分别启动了keepalived、nginx服务,然后通过手动停止nginx的方式模拟了Nginx宕机情况,过了片刻后再次查询后台进程,我们会发现nginx依旧存活。</p><p>从这个过程中不难发现,keepalived已经为我们实现了Nginx宕机后自动重启的功能,那么接着再模拟一下服务器出现故障时的情况:</p><p><img src="/img/remote/1460000043430193" alt="" title=""></p><p>在上述过程中,我们通过手动关闭keepalived服务模拟了机器断电、硬件损坏等情况(因为机器断电等情况=主机中的keepalived进程消失),然后再次查询了一下本机的IP信息,很明显会看到VIP消失了!</p><p>现在再切换到另外一台机器:192.168.12.130来看看情况:</p><p><img src="/img/remote/1460000043430194" alt="" title=""></p><p>此刻我们会发现,在主机192.168.12.129宕机后,VIP自动从主机飘移到了从机192.168.12.130上,而此时客户端的请求就最终会来到130这台机器的Nginx上。</p><p>「「最终,利用Keepalived对Nginx做了主从热备之后,无论是遇到线上宕机还是机房断电等各类故障时,都能够确保应用系统能够为用户提供7x24小时服务。」」</p><h2><strong>Nginx性能优化</strong></h2><p>到这里文章的篇幅较长了,最后再来聊一下关于Nginx的性能优化,主要就简单说说收益最高的几个优化项,在这块就不再展开叙述了,毕竟影响性能都有多方面原因导致的,比如网络、服务器硬件、操作系统、后端服务、程序自身、数据库服务等。</p><h6><strong>优化一:打开长连接配置</strong></h6><p>通常Nginx作为代理服务,负责分发客户端的请求,那么建议开启HTTP长连接,用户减少握手的次数,降低服务器损耗,具体如下:</p><pre><code class="text">upstream xxx {
# 长连接数
keepalive 32;
# 每个长连接提供的最大请求数
keepalived_requests 100;
# 每个长连接没有新的请求时,保持的最长时间
keepalive_timeout 60s;
} </code></pre><h6><strong>优化二、开启零拷贝技术</strong></h6><p>零拷贝这个概念,在大多数性能较为不错的中间件中都有出现,例如Kafka、Netty等,而Nginx中也可以配置数据零拷贝技术,如下:</p><pre><code class="text">sendfile on; # 开启零拷贝机制 </code></pre><p>零拷贝读取机制与传统资源读取机制的区别:</p><ul><li>「传统方式:」 硬件-->内核-->用户空间-->程序空间-->程序内核空间-->网络套接字</li><li>「零拷贝方式:」 硬件-->内核-->程序内核空间-->网络套接字</li></ul><p>从上述这个过程对比,很轻易就能看出两者之间的性能区别。</p><h6><strong>优化三、开启无延迟或多包共发机制</strong></h6><p>在Nginx中有两个较为关键的性能参数,即<code>tcp_nodelay、tcp_nopush</code>,开启方式如下:</p><pre><code class="text">tcp_nodelay on;
tcp_nopush on; </code></pre><p>TCP/IP协议中默认是采用了Nagle算法的,即在网络数据传输过程中,每个数据报文并不会立马发送出去,而是会等待一段时间,将后面的几个数据包一起组合成一个数据报文发送,但这个算法虽然提高了网络吞吐量,但是实时性却降低了。</p><p>因此你的项目属于交互性很强的应用,那么可以手动开启tcp_nodelay配置,让应用程序向内核递交的每个数据包都会立即发送出去。但这样会产生大量的TCP报文头,增加很大的网络开销。</p><p>相反,有些项目的业务对数据的实时性要求并不高,追求的则是更高的吞吐,那么则可以开启tcp_nopush配置项,这个配置就类似于“塞子”的意思,首先将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去。设置该选项后,内核会尽量把小数据包拼接成一个大的数据包(一个MTU)再发送出去.</p><p>当然若一定时间后(一般为200ms),内核仍然没有积累到一个MTU的量时,也必须发送现有的数据,否则会一直阻塞。</p><p>tcp_nodelay、tcp_nopush两个参数是“互斥”的,如果追求响应速度的应用推荐开启tcp_nodelay参数,如IM、金融等类型的项目。如果追求吞吐量的应用则建议开启tcp_nopush参数,如调度系统、报表系统等。</p><p>注意:①tcp_nodelay一般要建立在开启了长连接模式的情况下使用。②tcp_nopush参数是必须要开启sendfile参数才可使用的。</p><h6><strong>优化四、调整Worker工作进程</strong></h6><p>Nginx启动后默认只会开启一个Worker工作进程处理客户端请求,而我们可以根据机器的CPU核数开启对应数量的工作进程,以此来提升整体的并发量支持,如下:</p><pre><code class="text"># 自动根据CPU核心数调整Worker进程数量
worker_processes auto; </code></pre><p>工作进程的数量最高开到8个就OK了,8个之后就不会有再大的性能提升。</p><p>同时也可以稍微调整一下每个工作进程能够打开的文件句柄数:</p><pre><code class="text"># 每个Worker能打开的文件描述符,最少调整至1W以上,负荷较高建议2-3W
worker_rlimit_nofile 20000; </code></pre><p>操作系统内核(kernel)都是利用文件描述符来访问文件,无论是打开、新建、读取、写入文件时,都需要使用文件描述符来指定待操作的文件,因此该值越大,代表一个进程能够操作的文件越多(但不能超出内核限制,最多建议3.8W左右为上限)。</p><h6><strong>优化五、开启CPU亲和机制</strong></h6><p>对于并发编程较为熟悉的伙伴都知道,因为进程/线程数往往都会远超出系统CPU的核心数,因为操作系统执行的原理本质上是采用时间片切换机制,也就是一个CPU核心会在多个进程之间不断频繁切换,造成很大的性能损耗。</p><p>而CPU亲和机制则是指将每个Nginx的工作进程,绑定在固定的CPU核心上,从而减小CPU切换带来的时间开销和资源损耗,开启方式如下:</p><pre><code class="text">worker_cpu_affinity auto; </code></pre><h6><strong>优化六、开启epoll模型及调整并发连接数</strong></h6><p>在最开始就提到过:Nginx、Redis都是基于多路复用模型去实现的程序,但最初版的多路复用模型select/poll最大只能监听1024个连接,而epoll则属于select/poll接口的增强版,因此采用该模型能够大程度上提升单个Worker的性能,如下:</p><pre><code class="text">events {
# 使用epoll网络模型
use epoll;
# 调整每个Worker能够处理的连接数上限
worker_connections 10240;
} </code></pre><p>这里对于select/poll/epoll模型就不展开细说了,后面的IO模型文章中会详细剖析。</p><h2><strong>放在最后的结尾</strong></h2><p>至此,Nginx的大部分内容都已阐述完毕,关于最后一小节的性能优化内容,其实在前面就谈到的动静分离、分配缓冲区、资源缓存、防盗链、资源压缩等内容,也都可归纳为性能优化的方案。</p><p>最后,希望诸君收藏的同时不要忘了点个赞支持一下^_^,在此万分感谢!</p><p><strong>如果本文对你有帮助的话,欢迎点赞&转发,这对我继续分享&创作优质文章非常重要。感谢</strong></p>
花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
https://segmentfault.com/a/1190000043430057
2023-02-15T19:42:32+08:00
2023-02-15T19:42:32+08:00
民工哥
https://segmentfault.com/u/jishuroad
21
<p>在这之前,我们学习过了:<a href="https://link.segmentfault.com/?enc=oqlEYDMFCAWG%2B6SUNnBlZg%3D%3D.llV9u%2FFmsiQXhkxg6HJ6p6CGsDwnbHKjb5DRwe%2FVbDc8BbI%2BU3sEWV5gNdU2IIjE0A5xb784qtgfrzSBaoRLjpN65VjBEinbMBORbfHV%2B6yxBtQmO8iWxYxiK4%2FRA%2FhyIQKiQPBAXigm4nmvzeNedJjSDHf%2FWkgbZxzYfoOKQRhk7HhlNPnWUz1o%2Bt2l3tahNp2p4HkXAYLfmaLr5S2DGumQ92h%2B8tNQQGJQRdhelcncByPl0hqLNQLFDSLDTFv5E070LPW%2B7jDF2wu1hKNXakTiH28uzcGvLJmu5nWhONs%3D" rel="nofollow">数据库的核心知识点是哪些</a>?<a href="https://link.segmentfault.com/?enc=%2BDCXDjx5P7oQpLVXE8JwFg%3D%3D.G8WWdlbT%2F3gGbP4fIv4dmI6nC4L3LKXogBA1%2BmGfUvvUC2T46IxsF9HpqdEF%2FMD6EfqwvCRdO0vwPcscFq4BZS1xkn8hVDy1fRXNo3T4TEAa9VAQwnytPp2yGpaB0R4zXkGvjAi0FBenYCchAoHWQ%2FllF0d07eccwnYa4LJ3wjBIxsbUsKN%2BlNCgxwAEfs0FcYpTwM9OPpk8MzhnE3JaLnU%2FA2tX%2BOu9ZJHDTnQ4EFv%2F9P%2FzH0aYjz1QNhutTZ4MaHNI9vQl5pQwowPthMhh%2Ftv4AcpVC5SYxsHuzAWA27Y%3D" rel="nofollow">关系型数据工作流程</a>、<a href="https://link.segmentfault.com/?enc=thdpLbu4Dxtpye1I%2F4rgfg%3D%3D.Q8UsAFoaaSO3cJoAoCocnpaHEo3AsfTPMvtCgvXcPDwWUdD9kr4i966qB7TwWiYZBS42q07yB%2BEOLTkWsDzWTxPLlhCZrA9%2F866Rlaz7WKC9bSAzGWvml6ShotbfWhIAy6%2BJVzqi2DL6o5T%2FVMN7bIf%2FIqb8xC%2BI7%2F68PmQcXTxOnTZhkjsq2nD7%2BeDWxMU7hPa9HA0P%2B8fzQuotCgIIpEPl1QIBfO6QoAyTZl%2FIXPeOudRXXlIGD3ous1xjD4MmrUhL4mmRswTfgWB4W3RF46nIrsZr%2FTXratp%2FWkE1%2Bl0%3D" rel="nofollow">设计理论与流程</a>,以及<a href="https://link.segmentfault.com/?enc=jRfclcgD2CSTYNjx5QH3Kg%3D%3D.BgphwRQhQY9ZpbsFqwkEXjXG258OjvgtEYcv3jgHJc4iIjIQB6qm2ajD5rjrdymVHtyCoTSXd3Db3TcG5B3iJgf0jJi1rzsF4%2B5wknJ26baiAm%2BhL6qHiQ18sgoTW%2Bak9JQPb7Rvx%2F%2FpjBKpyP1sK3ZIPWVSUBxg5mH%2FRd%2BanLQNTsnoAttX1P4%2FZ1xE0rJIvEuJiVWpw6HNvcjRv%2BUDsEd0hAdfXaJd3an0Rw6tj41x%2BCBEigfsK9JJ7%2FDD9NeYbCODWFjPoOodVeihptdC7rgRuhRBWDVhJd8QO%2F6VpII%3D" rel="nofollow">SQL 语法基础、语句练习与优化</a>。以上这些,都是学习数据库的必备入门基础知识点,需要重点掌握。</p><p>今天开始,我们进入死磕数据库系列之:MySQL 数据库的学习之旅。</p><h5><strong>注:本文是不定期更新内容的,如有帮助,大家点赞支持一波!!!!</strong></h5><h2>MySQL 数据库简介</h2><p>MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。</p><p>MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。</p><ul><li>MySQL 是开源的,目前隶属于 Oracle 旗下产品。</li><li>MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。</li><li>MySQL 使用标准的 SQL 数据语言形式。</li><li>MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。</li><li>MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。</li><li>MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。</li><li>MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。</li></ul><p>在日常工作与学习中,无论是开发、运维、还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一。在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的还是MySQL。更多关于MySQL数据库的介绍,有兴趣的读者可以参考官方网站的文档和这篇文章:<a href="https://link.segmentfault.com/?enc=TEiOIaBOtD3LNQ3Rep3KvA%3D%3D.phxadX226KLFxnppd8CbqdABH4nCeuIhWxi1yR7LrNVJv%2Femi1HUL2IyqIRICW%2BYy1ndICOv1Mt6JIJsThKXXGtttz%2FOEtZPB2ayVSYnp5I56ykQ%2F%2F5nMWp%2BC9%2BySWslJCzmjITQA1HZfV4u0CwTycwLw3NoPtMv%2BoLJhMc8OMT9%2FiZpLnuOKRqUDdRvJ9UuSnFHYIBBiDcN5K%2Bzz4UovkzZ2EFoX31BZMh16mkiwPOPS8t99ak5pjT3%2F%2BItGwqCF3Nf1INN28p6XHKeUt08aV7XsDh6jdSyBbbwy24qb7w%3D" rel="nofollow">可能是全网最好的MySQL重要知识点</a></p><h2>MySQL 安装</h2><p>MySQL 8正式版8.0.11已发布,官方表示MySQL8要比MySQL 5.7快2倍,还带来了大量的改进和更快的性能!到底谁最牛呢?请看:<a href="https://link.segmentfault.com/?enc=IclqCsaizQDGAab00nFPSw%3D%3D.Fuu0h99n7Xlt%2BKfS68gNj%2BLdVdvvXBtbMIuv2SfIpWHw6pEAijmiMZYtAqbNakvHpqU3AEjMo5yMBlqYAJMUuLHEJz1bd7QDE1Tvnbq74o0P84GCYuXVcl0uRMgixGZOLQEOgFZrewjyJ%2FyOhFmQRNxvi0g3PH6fLM8X3VbHlHc0VBD54WUdAbMppdwVLXT90T62jfPYvEKYa%2B3eBDq6Rv77tnPsHLzZlOQdYH9rmVqF4KLBhyUl0aDBMU3vMliJ9Nq%2BiXibHGPVJMsSq33ksAc3hSqDmP%2B63LwZzVr4v3M%3D" rel="nofollow">MySQL 5.7 vs 8.0,哪个性能更牛?</a></p><p>详细的安装步骤请参阅:<a href="https://link.segmentfault.com/?enc=VUilbIgU9N%2BodqHyfNShsA%3D%3D.kt%2FwRPZjekFdfeHsbfOzcZujk%2BzgPUMDEMCVVsoFheu73q%2Bq6vseJtpNxK2SuPTZ4gPrchcsNNamgITGD11eY5%2F1eQX9iBLvIxj1QdgxkmZnMjcM6jgaccfM7aHYWAMOKS4dB1%2B%2BXGN%2B8tERUqkeRcynwdBssACbGvW6lCLq8btLazqjAe%2BjdzlziLsn9EYfyVhrJ6aJA2ZnWwuit2QGsBZS%2Bl8%2BeyEX1qhpGBR4BvSMogVps%2Bf0OZqe6HFhupt8rng2VVLN29K6kHuZHWUNrmReW6aAxW4Pd3UgVoD1Jgw%3D" rel="nofollow">CentOS 下 MySQL 8.0 安装部署,超详细!</a></p><h2>MySQL 多实例配置</h2><p><a href="https://link.segmentfault.com/?enc=3gNf7EH%2FCcrcBI2s4jXsHA%3D%3D.KernqEEZhBQrXOJf62TZrS1AXzkd3KEzMgWsyQ2wMefL1hVg%2FiJUGWiWKVPHXT7FsjkYjLEvcQQuf97LN0Lf35qPZEeTGXyXju%2Fp1%2Biph3v%2FLgWBvjGopq6IhLO8%2Batp5JFSozdAihzMCmEpRc3c08D71GCrp1lh77IDqB%2BwJRKHukJAyGDedtnvsqrY1XssDbmMQRjyjXsWHaIfS6HAK9K%2FLfY02UN3jmJS2mpzaLww8rdbSQWMgmC2IuDpMGPFieZ4Ikq4jh0md%2F%2FhmYowN%2B%2FrjIjS%2FNNukRr%2Bd2VtVuY%3D" rel="nofollow">MySQL数据库入门——多实例配置</a></p><h2>MySQL 命令基础操作</h2><p>Windows服务</p><pre><code class="text">-- 启动MySQL
net start mysql
-- 创建Windows服务
sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格)</code></pre><p>连接与断开服务器</p><pre><code class="text">mysql -h 地址 -P 端口 -u 用户名 -p 密码
SHOW PROCESSLIST -- 显示哪些线程正在运行
SHOW VARIABLES -- 显示系统变量信息</code></pre><p>数据库操作</p><pre><code class="text">-- 查看当前数据库
SELECT DATABASE();
-- 显示当前时间、用户名、数据库版本
SELECT now(), user(), version();
-- 创建库
CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项
数据库选项:
CHARACTER SET charset_name
COLLATE collation_name
-- 查看已有库
SHOW DATABASES[ LIKE 'PATTERN']
-- 查看当前库信息
SHOW CREATE DATABASE 数据库名
-- 修改库的选项信息
ALTER DATABASE 库名 选项信息
-- 删除库
DROP DATABASE[ IF EXISTS] 数据库名
同时删除该数据库相关的目录及其目录内容</code></pre><p>更多相关的操作基础知识点请参阅以下文章:</p><p><a href="https://link.segmentfault.com/?enc=zD%2FZPBb6dJltu%2FVbrsDLQA%3D%3D.QhhCTJTqeslis4qOZdNsKmu8VCmSsgBdp2mFVnV%2B6Awegz0SpJ5CZ1GS1tTUyZrpHb3VrCHfHuTbGnIpuGR25TxEDR4uqQsyAqJEmrIMV4ElgB9T%2B7tycIzjYEYhx1rcjE2X79teJFbhjEMsyrs%2FdiI2ofM0TWY7J4z%2F0R8u1KNYtwkU%2FiYUDnqmLixZ2gOwLU0z35akVmsS3jRjX06ylH2Mfk%2BRHBYyt32vsmCwFnnreunF2og5wVi1GgcvBpI7NmZ8Rkn1Bg0CtFNjOqlr75tTuO%2BnmVgNRURGun9Ftsg%3D" rel="nofollow">1047 行 MySQL 详细学习笔记(值得学习与收藏)</a></p><h2>MySQL 数据类型</h2><p><a href="https://link.segmentfault.com/?enc=z%2BNuBioFyXZ5wLdZ3bi3OQ%3D%3D.VUs4k2ucx0ISiOMQ8gLsKafBmKV0ZESV79AMc%2Fl9QFW2ZgXMH3TGi%2B1HwOYNN%2FX6LsJYrcKEF%2BwmMAHBrGb3CFTpSMnwcYnpjD43p9c0Rq2qQRD9yeRM5l1M9ofUacC5eAa7LNddP6VV1k80yIHO5vckaJY%2FGDXd2BK4IPXIQITvngtmHyvHOdrYEtSDsekBrbdWPGCyIUx8SOpqhuq80P9Eb8DgvCbSLgCu%2FOPIMhvg%2BkPvAg3AnkKSveKbsJxpmptYMI8jiVtQyLX0QdrJUCmGEETaGFcQrakO%2B075Cug%3D" rel="nofollow">死磕数据库系列(五):MySQL 数据类型与存储引擎介绍</a></p><h2>MySQL 索引详解</h2><p><a href="https://link.segmentfault.com/?enc=tSMqe3KfH4H42KEjwMT%2BZA%3D%3D.f%2FBkOzKXCA8%2FGEDOWKrPS%2Fc%2BvmS7plZb7SvAS5onkjUSC3hPW7GRwY6Tb9eR0eYscUn%2F1o1rssHGVFqJ9NPJV6%2BxswFBxovbVBjsg3ELjYk7Ww0cXAdGWIpIrh87p3tAzhli1GgU795Kg5bj7IT8CMfU%2FBF3tW%2BA1SvqC3nNrWXNXqfDtaQVVUa3smUdRDAZd0hGUwtsnVxXElTMBvL1Z%2Bsw5ukwAaZqWzRIAudy0bNKvfK0wL%2BbIv%2Fd5%2F%2FTnMbFO5ZAVgAHL%2FkPeMushJNTUIHeiwo7YKzMao%2BhhgCe7i4%3D" rel="nofollow">死磕数据库系列(六):MySQL 索引详解</a></p><h2>MySQL 性能优化</h2><h4>MySQL优化方案</h4><p>想必大家都知道,面试期间一提到数据库,就会聊到数据库优化相关问题。网上关于数据库优化的文章也是眼花缭乱,层出不穷。今天将会通过这篇文章细分几点给大家汇总整理出一套关于MySQL数据库的优化方案,让大家通过学习这篇文章不再被面试官吊打!<br><img src="/img/remote/1460000043430063" alt="" title=""><br>成本:硬件优化 > 系统配置优化 > 表结构优化 > SQL语句优化 > 索引优化。</p><p>效果:索引优化 > SQL语句优化 > 表结构优化 > 系统配置优化 > 硬件优化。</p><p><a href="https://link.segmentfault.com/?enc=7qXJpc6uHJVM2BGqSi6gpA%3D%3D.krFIY5jQhSWsH%2BRVEx4540GJZf1lp%2F%2FTv54n9bOcPnVIPr8IwpJ54dsp4z2QLO3Wt0xsCXTVuMgdnLoQM0vhsdYmWgQR1Zgs4Q6qm9BddTEcVNu2JVgFFnpqL8nk6CiEdCx3ws2WJYV%2BBkUB26IvM17GXbcBZ2gTawPmaiwZ3jUGt1cNl2qKndqOC6sbonRqaMqFN2a6kPdtGsjngQpdvt562nob7PsU92ne9S%2FJ02tsvrMIzOlpii6ZzOgkr0ySBmspOQfRvEe368XGfUGiGJ7Di43OGBt5kAEPddDU3IU%3D" rel="nofollow">死磕数据库系列(七):MySQL 性能优化(硬件,系统配置,表结构,SQL语句)</a></p><h2>MySQL 主从复制</h2><h4><strong>MySQL复制有两种方法:</strong></h4><ul><li>传统方式:基于主库的bin-log将日志事件和事件位置复制到从库,从库再加以 应用来达到主从同步的目的。</li><li>Gtid方式:global transaction identifiers是基于事务来复制数据,因此也就不 依赖日志文件位置,同时又能更好的保证主从库数据一致性。</li></ul><p><a href="https://link.segmentfault.com/?enc=QPNNfOVybTPzbJGI%2FiRXaQ%3D%3D.C%2FFBw%2FODsxGJrhZyI6jOWYuK1l6%2Bw4uiRFLYYJSbpO4tUcIgsra5YdRmlzlS2%2FWGm3UGOPf48wRk2Mg8jHI1gt39JBVE%2FX%2B%2FC%2Fjyh7g%2FmoJcCiLHc4zwSzqmyg2XWsUVuWFbu3INE8Cs%2FxgU%2BMG0cbGMV7Fjio2TSC0yz7MWTM9c5zDu46UZksHMtCm6il1x268sbBvz2Buh6V9gzc51CW389Iog4%2BqUR0EqkNNg%2BuVRyYQQrRmD7%2Bi30GwHAW8oLrE6fMLIfKkoZwY1gmixRAyi6Vc6ZFMjQK8GhFiqJr0%3D" rel="nofollow">MySQL数据库主从同步实战过程</a></p><p><a href="https://link.segmentfault.com/?enc=BTOsDR14bcf%2Fpv%2BXhG8Oyw%3D%3D.T0OU5xLvlKVFsAiqLBrSaFfRE99e7IYcmisHuLzERJoqx57tdx0yoEAy%2BlXtYpDuX7OTtL7S5YPgfZc7x2%2Bu9iaPSwpikb8B3Weh8m6rfyTBMpt4bJPKrXnksVj4UN%2Biyozv8x%2FEEpwfZ9cZYhoMgGA8WtOjLU%2ByUE8x3k4KAVJffIsV0mHHEENQYK4l9%2BaXPdy3Wuv4dUb9BXjYE3BBwCRLCIySlLtacVVwn3keTIZ8nQvBoGK3LIb2aU3kLUDhQVfILyaL4P%2BKja4YvCoSnqq4O25CSHlHp3300WPWRXQ%3D" rel="nofollow">MySQL 主从同步架构中你不知道的“坑”(上)</a></p><p><a href="https://link.segmentfault.com/?enc=PtNFAUb8XUVkOhzHkOmkQg%3D%3D.7gev2xz7lvX%2BBltVfa4d4fk%2B3U1dvM%2FrsHb6zyjzYNPI8FEZJ%2F8Nw4Banj0ZLnpYRgpXsCZ9cn3Mbg5pTtsb6yh%2FCxFyfZjEyT36XznqH1zUJL2RSjFIZ1I%2FoGhSo6jRgo9BH0UoY9EQxHM7uS%2BF8hVMXmiY1o5KGGl60cVf7Uk91jUyy8IuKN%2BFWp6eEXzTz%2F1GNgQTh2JU4GYqyFUvhAxhUXq%2Frve2rrPPAYbJJ16CyyxYZrxShUVkrmSU9TmTywK6w80DIx8nuVVASUUnyXoWH6aWjzZ3BwhtcU9C4Ho%3D" rel="nofollow">MySQL 主从同步架构中你不知道的“坑”(下)</a></p><p>这里顺便提一下:<a href="https://link.segmentfault.com/?enc=JI4UZkOOGioDGfuBR82xtg%3D%3D.biFwAyDQoUfp%2FfaBrGreryWAArV4Nwe1FhfnPsrcmAjlGW9fVHwDQe%2BEeVs1WbIVLf1M0N0O4leIay3ThoemAEjmdQQSzv6Kd6IEM1wDVrDrW%2F80QapyNA14FO5BEyZzmX09WG%2F9DPPIoof%2BclyKzfhXvkeLBsfHac9vpakXoipN7XJuYE7lFFvrA0pv%2BH495IkXnk8Sat1zNQZ5mvsvL2umpUtLkxSnFzPGMoFYD9l9vUTh9A6eKMRGoGQdhamQY4md19pBgP6LQ%2FMYtP6K6%2F1nEXPsT1gmYssE%2Bet5L9M%3D" rel="nofollow">ROW 还是 STATEMENT?线上 MySQL Binlog 怎么选?</a> 这篇文章,就这三种模式有何区别,在生产如何选择,做一个具体的案例详解。</p><h4>MySQL复制有多种类型:</h4><ul><li>异步复制:一个主库,一个或多个从库,数据异步同步到从库。</li><li>同步复制:在MySQL Cluster中特有的复制方式。</li><li>半同步复制:在异步复制的基础上,确保任何一个主库上的事务在提交之前至 少有一个从库已经收到该事务并日志记录下来。</li><li>延迟复制:在异步复制的基础上,人为设定主库和从库的数据同步延迟时间, 即保证数据延迟至少是这个参数。</li></ul><p>MySQL主从复制延迟解决方案:<a href="https://link.segmentfault.com/?enc=3qMaR%2B3dMTdrUxGuTGzJew%3D%3D.14jzWPLz5%2FGl0MHgP75HduRlRUYiBdZhXpk7V3H10avbDBdch3AsZ7Rcxb90MCtFCdAXXQA0%2BbGFRrNuWVTwXxKw5%2F6a5tKZZtScVsh3Hfg%2FSAsUiKPwMu0MoMgOJS0qldsR6ku1%2F2EbWuZjuT3fiHseXizyt7FYjY8%2FotsobOLYq96WVD8isQbq6AorLe5l9bcbfVPGzZo7uk44FOnfbu3eTvEsWuMizhucJcsA21o2kjRsNcRWgYMlnHrAeGteRWzEigFN%2FLRd59%2BYO%2F49jaEDoeOnNjoK31wSMLAOdiM%3D" rel="nofollow">高可用数据库主从复制延时的解决方案</a></p><p>MySQL另一种主从同步的方案:<a href="https://link.segmentfault.com/?enc=F2Ioq5BZbDVCfCREOo9aAA%3D%3D.8bbDP%2BmJlTr7oK8ZYDtBM6JR%2BxZn%2BtLvV77QyuwtDupoeEbExs8AUtG%2F%2FkLH%2FMgxdRXgLf75DYlAIk69OLhSBcym9isnBxy17UTbr4%2BQj9ucFt5bhZjN3yJlL9VjmtHQjOmHAMETXDe2se2tFoud0x0Si5%2FcUYGM0mVtGt%2FQhdBzDQaeHbEgPE%2BoUFmXeHGynGFbS3GtPC2225Wp4K4vprj9d4Y2FJjHm1E9CcBdutW8bvLGuAo7ux5qWJ4okWbNi%2BhymDiZ7qRwNCc%2Bv1UwQ%2FiiqpBLv9fiH06dRpkNt9k%3D" rel="nofollow">基于 Gtid 的 MySQL 主从同步实践</a></p><h2>MySQL 日志文件解析(类型、作用)</h2><h4>Mysql 日志是什么?</h4><p>所谓日志,就是一种将行为动作记录到一个地方,这个地方可以是文件,文本等可存储的载体。</p><p>Mysql日志就是记录整个mysql从启动,运行,到结束的整个生命周期下的行为。</p><h4>日志类型</h4><p>MySQL 中有七种日志文件,分别是:</p><ul><li>二进制日志(binlog)</li><li>重做日志(redo log)</li><li>回滚日志(undo log)</li><li>错误日志(errorlog)</li><li>慢查询日志(slow query log)</li><li>一般查询日志(general log)</li><li>中继日志(relay log)</li></ul><p>这几种日志的作用与具体的操作详解可以参阅:<a href="https://link.segmentfault.com/?enc=yXNSsIMWaVqqC6vhnT5OZw%3D%3D.rg1YpxajHHdSE%2Fq5qI0eSErbk7lOY0HQirGAUFtm2T%2FAOcDQ7qFXeU2H3IMiqZ1h49NHCPPHduYyL7iG3ncIH1IIGYMXf%2FdGDY8Fbh2UBEj%2BnUVja%2FA3fHL1XWH3ABK%2BBcvvsKPPzdKT6MaGfuVViD7a3Bwb2xNYKsTf7srt9gom0yIZgoqAHhYp5me3tfRffvicg03exRUXqHFeZOfomxDtE%2BOIcz8SlHnxse65Tewm3kMi3cAWcH38lmkpz3ITy%2BO5wBxNasTl3LKsXb91LgENoq%2FJ%2F3rYiJBPRPSEpJQ%3D" rel="nofollow">死磕数据库系列(十一):MySQL 日志文件解析(类型、作用)</a></p><h2>MySQL 数据备份与恢复</h2><h4><strong>数据备份多种方式:</strong></h4><ul><li>物理备份是指通过拷贝数据库文件的方式完成备份,这种备份方式适用于数据库很大,数据重要且需要快速恢复的数据库</li><li>逻辑备份是指通过备份数据库的逻辑结构(create database/table语句)和数据内容(insert语句或者文本文件)的方式完成备份。这种备份方式适用于数据库不是很大,或者你需要对导出的文件做一定的修改,又或者是希望在另外的不同类型服务器上重新建立此数据库的情况</li><li>通常情况下物理备份的速度要快于逻辑备份,另外物理备份的备份和恢复粒度范围为整个数据库或者是单个文件。对单表是否有恢复能力取决于存储引擎,比如在MyISAM存储引擎下每个表对应了独立的文件,可以单独恢复;但对于InnoDB存储引擎表来说,可能每个表示对应了独立的文件,也可能表使用了共享数据文件</li><li>物理备份通常要求在数据库关闭的情况下执行,但如果是在数据库运行情况下执行,则要求备份期间数据库不能修改</li><li>逻辑备份的速度要慢于物理备份,是因为逻辑备份需要访问数据库并将内容转化成逻辑备份需要的格式;通常输出的备份文件大小也要比物理备份大;另外逻辑备份也不包含数据库的配置文件和日志文件内容;备份和恢复的粒度可以是所有数据库,也可以是单个数据库,也可以是单个表;逻辑备份需要再数据库运行的状态下执行;它的执行工具可以是mysqldump或者是select … into outfile两种方式</li></ul><p><a href="https://link.segmentfault.com/?enc=r%2FDw0JvhItsSBJgmFIZ%2FAA%3D%3D.cEGWbIDKH8aGkTMdMB7%2FNBt0NtlRw%2BTGa9LFDCBV2EA6lqxXpicp1D5d3Q77AfCpMkLCP%2Fe2q2EC8A%2FvEN%2FQDpH0wBctqzmS0hB4WKYe7kJou%2F3GdsOF3lfRMkHLrhEH4qImGgXC5djfulDO6EV5BNRQGT3%2F76JPs%2FpXYRkRhKK6Tas4htyp0u2UmucIiJ4czC5412xBXzaAAnl%2BCsPruEiVYwEziS4yI5KpEad4zi9CeD59AHDea3J5wCQbU%2B8dMiygfONI%2FEDtKjGCoQhwgCSCmxqSgr%2FeUEsfRVoaeRM%3D" rel="nofollow">死磕数据库系列(十):MySQL 数据库的备份与恢复</a></p><h2>MySQL 日志文件解析(类型、作用)</h2><p><a href="https://link.segmentfault.com/?enc=nShSU83wC2gbeXw2Nwri4A%3D%3D.ur6Jv5r40mCrwaA%2BVI8arUmssV6MW9rlnuE5FwIfGU0m8b5Mtjc%2FLwyaayA21Vfububn6Izp5ISEn%2FrIDnJryXA9NPGgsMSCrSGHg%2FxOkNnKpAuQNw%2FoyBoOQ3dcE74bF0yDJcWNtjoPD%2FbS%2BUh1zaK4rw769bd9gCrC1QgOKHxW5RqLgmiaah6faAyhga2fR8Ou6cSSeAEp3BVVbgp4rjxs9DLG7AwJ8wBidUpR%2BWvzfcdgT7Ib1kiZ9TyEswSkzX3xgv06alk6VrDJv4R4Kd1zVXMgOV1Psefgr9gvFfE%3D" rel="nofollow">死磕数据库系列(十一):MySQL 日志文件解析(类型、作用)</a></p><h2>MySQL 数据库读写分离</h2><p><a href="https://link.segmentfault.com/?enc=YFOkTQWwwdR2eH0u2UUn0w%3D%3D.1DYGeAJhVCneKL1qFM6dtMNn1yT8amn5H8ozU5Ms9nOn%2FXHKfaHLwoJE9CiGfDb9LC358ICwoIW3hlTG9zXaLeQzEmBSoNxmvEZHv%2BF31eKRfjxpaf4%2FKJwE%2BS2LPnRZC7B3Mo1dgKICeFgIQvbrhYOVVb38FCLB67pM4e8W9rWrFKyXLFongNNozxs%2ByXliSOdGF2UpH3qo%2B%2BYpPLvBqSeCtsXTc8ZJME%2BVAy3wnVvWOPkW%2BgyQZ3gvL%2BF19kXEgWA%2Bir%2B%2Bk0kNABS58nrXH4FiKib%2FKEczvAw648jQAAc%3D" rel="nofollow">死磕数据库系列(九):MySQL 读写分离详解</a></p><h2>MySQL 分库分库</h2><p><a href="https://link.segmentfault.com/?enc=F5KMxkDmhVIs9QkHLZU1Ew%3D%3D.H1viR2MpGJUMk%2FcGkEcrZOd4XCLxBa5kC2xQV7UH%2B5KsK6nGT85WF6KVSCSCXvtbYGjdeboPym0BRs4F2hUM5glSpFhXh702eGZYQ9dRydrn6h%2F3TUXV3S2aWY6to48la33Hu%2BXaVk983XKRSEreSz15RFfx4UIwCll9bQZ9wMr58daKGuHH4JjCEarv44HLK2Ku2qD98rsDLIQT1GLpZvn6O4VI5qzMxomkbUA2GtLE3MsbGbbpztjeHvNvd3dxLT7yMsvrvUPWaEu6hyc6uPtzBTb4ZmgrK%2B65mLg0FVc%3D" rel="nofollow">死磕数据库系列(十二):MySQL 分库分表(何时分?怎么分?)</a></p><h2>MySQL 事务与隔离级别</h2><p><a href="https://link.segmentfault.com/?enc=3%2FeBmmH%2BQjIyVnSLlrxjgQ%3D%3D.4zmh1jfCyYAHFUCBxJ2n2PThYPw6oefYqTYtHhop19hpb13QoVIS17WvtGI%2BTIB8BBomZ19fGI2ibKtS%2BRw0HMch1x0dbf6B1WQK61x2VqP5v5%2FzEAJ3ps6s6cmD7cAqiaFbRaNc7eqzgxvnMhAAWLIarPJV2UpHSnIvVeWxx%2Fu25ohOtaC0AW5SDjjT%2B5iItOci1gmmcKgwc%2F%2BRngajzOz7QJgU5FSxqnvV8UOksiAT4bOsHFMYvIvpo0z4EIzPmyZUN6WnfeBz7EnaPUOXHoUMBmaFE76E2uqqmSnoApc%3D" rel="nofollow">死磕数据库系列(十三):MySQL 事务与隔离级别</a></p><h2>MySQL 锁机制详解</h2><p><a href="https://link.segmentfault.com/?enc=vIEiegoIK5I1%2F%2BjmUsao%2Bg%3D%3D.bPdOCKsplIU%2FfXdLk2XVzxFnn6uN8F0A2ODGWLJPbntSlzwKipaKRxRy9buT6XCf3mhiVnDLNA%2Fwv3QrbI6EKGAtNeXviMEpBV7mspbdm%2BeUuYgb0lieMF3L22yyJGwBfgShaCPSOC3VfMwFZJZcS3zPgx3P5To41bWwkYgKieeAyYpTox2MHoayVnUXXXaOwc9jpCn%2Fe0DbUeEuPIr%2FGiWxGgeGXeNGFYLG4t8oHztisMxcgd21VqUvg8ziebW%2Fmpwkbcm8UoToz1zYDZm1DyKjfcBGfDGwq8hyrPZ3aZg%3D" rel="nofollow">死磕数据库系列(十四):MySQL 锁机制详解(表级锁、页级锁、行级锁)</a></p><h2>MySQL 存储过程、自定义函数、事务、流程控制的语法、创建和使用</h2><p><a href="https://link.segmentfault.com/?enc=vIZdCeQt0ZZa5iroONkTuA%3D%3D.KaYmBkBl8%2BQKhD2ss1Lf7dtsXi8H4KLn9XzH63D1UFYzthJ7dB7KcGpSZ%2FEjKrZX7LNpJzrQyB%2Fr3uFN%2FNuT9M2WqTU9TAgTE5YEZwy4OZ1NQFT0Fwn0JrnzSG0RAz3Uv8akPBALDY7TyH4KTaH2sfr3Mzqn1flET613IlitM7w460Q5iOgvU%2BZEwr6iUE2iJsQ2XiJwjYZAM4o%2FjhYozpPtCQFi8itcdDUAlgA%2BN2H1JLMvMPTcsY0U1rxvG2kOasEl2L9f4BKuvR0w5dDLEfXvRPLghC5ykSTH0c7veVM%3D" rel="nofollow">死磕数据库系列(十五):MySQL 存储过程、自定义函数、事务、流程控制的语法、创建和使用</a></p><h2>MySQL 单表、多表操作详解</h2><p><a href="https://link.segmentfault.com/?enc=WzFKpGvukCIwZdYBAtltQQ%3D%3D.DgPYfb9u8BLHRU4FSRj3r1Kw%2BmeJG2At5IJ%2FAbsgzoC3xtRhIV0RvotAf%2F5FQcLaO27l4APN5DeOJgj0bPHoAfH8v1ab1lMcRs%2F3ZaR4e7wqbP1uhG4pD%2BjzS8c9q7g7cFvUWFeBnGem4mEczy72VQfTbhmymTjlzwWbaiGp0yYBsq2vNi0P8Vlyi2Fl%2Fk8eYAhxUIC3U%2FpCMpOpdz%2B2P%2B1WoRxpcvl9gG3eN0%2BGlDWHwBFeLKlD1qh5v3Nxcikk%2FHNUvmc%2Bn9wWfBfTvZSVSAFo3UryEdiE%2Fnk4D1CosDc%3D" rel="nofollow">死磕数据库系列(十六):MySQL 单表操作介绍</a></p><p><a href="https://link.segmentfault.com/?enc=18Eff5c9CenLi8gPipc2TA%3D%3D.0xXhM5RixFKe%2ByYPu28VEOHqPxFGNpBkdUN5YjhbFg%2Bv0ugS4bM8yYxO%2FvqhYzlzFiIDSnxZ6%2BGZef2SvV94%2FgxRbCFnjgB0DtsFheOtIKgQnwe5sHukRwKPHfj%2F0EKKSnTR9K2s5lUJ3EaE9ttjfW%2BEsEHeX83kWFNjCX7r8XghPmfEPGjSjONFVvkszclAu4cd7DR1HQ1uwll%2F%2B9TKzhIwhX8NzHkepHd7aX%2Bv7fzcfdmXy4zTIF0OXAE7beJYUPL7kGLq3PEYUWMyVua4K3bF5xtrRdn%2BgqtW3wnZfnU%3D" rel="nofollow">死磕数据库系列(十七):MySQL 多表操作介绍</a></p><h2>MySQL 表的七大约束</h2><p><a href="https://link.segmentfault.com/?enc=eibTJNee6mYIepzGfpRzcQ%3D%3D.lPJHxpsK7d18MtIEam9pCNVW%2FMJNNC3KkEIGSzBJb6aNa3lgttEs%2F4fC1cUzzDKpS7V3%2BstZNGIsW1OQ%2FSGG69tYqFt7t69X7FoWc9NdQ%2B91MuiGc%2FTtpZILGtFfMs%2FW7ACgk9X5z49oNVO4lV1zBaV8n1oxwsSGirrHjRGLKd7jPRCCzaUXCPcjx3RKhEDcTseC267oErjzEbW87pn0ny8cEHR8M04MNCjdWDhg%2F6hza1iqB8kCDfzfE9wH%2BUVc34XCTn%2B0w9wtjurOQIqMygdfnzJ1zIDYri13j71RJ5M%3D" rel="nofollow">死磕数据库系列(十八):MySQL 表的七大约束</a></p><h2>MySQL 视图、触发器的原理与实战</h2><p>本文主要讲解视图(view)的基本概念,什么是视图以及视图的使用场景,视图增删改查的实战(CREATE、DESCRIBE、SHOW CREATE、DORP和ALTER),视图的更新操作包括增加(INSERT)、删除(DELETE)和更新(UPDATE)的视图操作基表数据实战。</p><p><a href="https://link.segmentfault.com/?enc=vNLxq6puqAx3PQ9HLHi2%2BA%3D%3D.xq%2BaKIvh4vkZODOB%2BzJJ8CoE0V%2FiZ11keJVEW%2Fd2uO6zpm21K%2B2w%2Fi3ZMWCg87fUVDLTrsj0ZiMQNHEvVv3LfMzmwIC%2F%2By7Gc%2FFDeTn5pPGtJXEk2uoEwQNUG9H5bHLme9Aqw%2B59yZ5hqewLCwgrcvt8fifExDgRAqCdGZZdr4bW1ZcImTgYEfQrLV6K1jSPcEEmTpz7CRxzA2abnL%2FvIksfSX%2Bq0w59RF%2BCcAmEZM2rMrhgXfc6%2BhTt9%2BdiUxgovp65pK6rgIwQyPlUu4sFgElQTddZasKKufbJ5fNVsjQ%3D" rel="nofollow">死磕数据库系列(十九):MySQL 视图、触发器的原理与实战</a></p><h2>MySQL 数据库 DDL、DML、DQL、DCL 语言理论与实践(sql 8.0 版)</h2><p><img src="/img/bVc74E8" alt="image.png" title="image.png"></p><p><a href="https://link.segmentfault.com/?enc=24wq3NJuwZ6JvT0mMBtC1Q%3D%3D.bsrM9pJVXWBqzrzshLIoH56kI4xnQGkzjAKlaO4hlrn2u4JjnjIMOi5iLUI1QMWTJRFVlCv2yH9ig1EYDV%2BDE2ky%2FQOaS1P3dpNbPOTlTrn2bgMbtFM4vsTx9k2ti2o%2Bqsm9zeZJxeMdbO8WnhgldBTmZP3JsnGLmpTz8WInomnrPesUCciZ%2Bn7bt3X4MWWSAHIvpjhCPPSJ%2BMuLLEh61XXvGlFr28UkETAog5cnfzcNneYQpqkeLwAlDWnWk2HV0zFGNC7FOLwCq3yfY6bSbfxNyU%2FTwi7UnAMlBYZDPKU%3D" rel="nofollow">死磕数据库系列(二十):MySQL 数据库 DDL、DML、DQL、DCL 语言理论与实践(sql 8.0 版)</a></p><h2>MySQL 多版本并发控制 MVCC 原理及实现</h2><p>MVCC ( Multi-VersionConcurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别提交读和可重复读有效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能。</p><p>不仅是MySQL,包括Oracle,PostgreSQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实现标准。</p><p><a href="https://link.segmentfault.com/?enc=pVQ1iTzqp4wzttagsJyRsw%3D%3D.8a2Zk6JJG961j7OJgkdDJj67hfD5%2BPq4aOKsLbXz%2FnUO5zI62bdf2MIpyrVXccj8M8fDyNoiyX5RrrShZoVUI3onZLvMGK9oJkv%2F%2FXGnkjn6m%2FYHM%2FfiXSkG2Fw6N%2Fk6y72xEg1LkdN38jlmqQsWaY6tBC7gsM%2FKzLDbzdMfk5tQEzmNqh8v%2FBk6sk5pUEoXyOfuIo7gc6DIBu5Jm%2FSWt34yUZ4s4QOmLGvQomFWHipfozEdSINYODZjWFJZ1DoHEDtYkgQ8dV6g89GgdgNsLH%2BxHUaBKzup1fBfZK%2BExNM%3D" rel="nofollow">死磕数据库系列(二十一):MySQL 多版本并发控制 MVCC 原理及实现</a></p><h2>MySQL 数据库机房架构与跨城容灾</h2><p>我们在实际生产环境中,要求不允许丢失任何数据。也就是说,当 MySQL 数据库由于各种原因而无法使用时(发生宕机、网络异常等),不仅需要快速恢复业务,还需要确保数据一致性。</p><p>本文主要讲解数据库机房架构与跨城容灾,包括主从复制的强一致性、同城多活、两地三中心、三地五中心、数据兜底逻辑等进行逐步讲解。</p><p><a href="https://link.segmentfault.com/?enc=uFwjH8MARzPElw1BkOYVFA%3D%3D.tZ24QOhc0rq5Zjoss3l32ah%2BzCG7MkulGWn5JvccrlZADSU6G7wrBO7QrUqDm40UNUL21VOSegHLxbw8%2B9xfde3DEq61KBaRR%2FiOEcNxH62Vsn9jbygetu%2BcsAVUbxMvPtUNfPiLJmZOdgJUy3MtOXlY3iwGlDOFdvZLfvKTB%2BQM%2Fp1bt1CzYL2iixc4npCdL%2F%2BA2CxcFVdPQCvei3efH22EKbSCVETZU%2BzT3dkxoypvWimjUfhl1upv155EXRwjM5We%2FBP7%2FoWVikHuHgEyBCSKdc0D34u5yWiOhqQ12sM%3D" rel="nofollow">死磕数据库系列(二十二):MySQL 数据库机房架构与跨城容灾</a></p><h2>MySQL 高可用方案选型解析</h2><p>高可用是数据库永恒的话题,高可用方案也是最受数据库爱好者关注的重点技术之一。在MySQL二十多年的发展历程中,针对<a href="https://link.segmentfault.com/?enc=JLqIyK2J96cbGnHsFwc2Hg%3D%3D.nRMWumzGMHCg6H0ENu2E8dIob8bkxFjGfzOSHdpkGFZjPA7FHYgOnwpU651lZBHsUXQj%2FfZJiOOhlp80udYzxs6Y8yy8Ws3XfxrEyJZ3%2BtQOjBHMihyXUnf%2FUFl4I6Dg8Qn0lXM3C6imifdbuv3g%2FTEL2twLjJZJuUgmGIov0W6xFUPvMAWPfTthEjCfHFA2568VVIBjASQYYbfZQCwQzQ04uEOVM7jrp5lNsNagQ%2F9%2BNF90LFLrI7R3YWgUo3eZcnCpubCG%2FhFQZ3lCCiLkIeNwFo1S3ZUqIwu%2Bb0g%2F6Ow%3D" rel="nofollow">MySQL的高可用方案</a>百花齐放,各具特色,这也是这款开源数据库最能让人着迷的地方。例如,早些年著名的MMM、MHA等等。</p><p>随着MySQL官方的不断发力,在基于MySQL复制的基础上,推出了一系列的高可用方案,例如,主从半同步复制、InnoDB ReplicaSet、组复制(MGR)、InnoDB Cluster,及目前最新的InnoDB ClusterSet。</p><p>MySQL 的各种高可用方案,大多是基于以下几种基础来部署的:</p><ul><li>基于主从复制;</li><li>基于Galera协议;</li><li>基于NDB引擎;</li><li>基于中间件/proxy;</li><li>基于共享存储;</li><li>基于主机高可用;</li></ul><p>在这一篇文章里,将向各位读者介绍各种方案的优缺点,及适用场景。在介绍各种方案之前,读者首先必须了解 <a href="https://link.segmentfault.com/?enc=xFyNQm0bocLsjMCGdIBhdw%3D%3D.Q1rPJChBJQvohmCW7CM0O59BsUxFo%2FsSYNFg2RnjUPH3CuObQWU%2FqAHHsAgElcGseV0zpYRQXnqxwoVRqVcB8zQ9%2FK4z2GKsdx0iZ8enK%2BLto4HdY39q86sJagfyijNp3d1chUMGmwd%2BCJOxgjxk%2BNN4fQecg%2Bm7chZW6%2Bm7pBWb0g9DGjNGdyenOA0sVA1UOC6n16ZLi4ElNMu5ItOV9nHYC%2FAnnhkN3B2fAGk3Yt192jQFMm8ZvRELo%2FPYnmL2fh0d0n5bBlIVRAwxUpBlzFPlbqo9KYeGIJkcjWOnoSY%3D" rel="nofollow">MySQL 复制</a>功能,MySQL 的高可用方案几乎全部是基于 MySQL 复制实现的。</p><p><a href="https://link.segmentfault.com/?enc=XZQ%2BnRq14Z%2Fo%2BIvdJaNJOg%3D%3D.vpycWn%2FHY2mF5pxq08QAhEwXYxUDocruWrTm25gR9I2iQxVjRelEXReWn5L6mwR3ztgaI3R%2BzYIuFPfbs3suOynIb9wCIjsSKDhVYRw72ZKpyq9nCP%2FPA4NJMpsVHHMAdofjgPiy5P5jiaFrye6xOX2aGwitNzpsggz3mXDDihNraREB1WQ9PorcBCHU6k5VkIS8%2FaXgVkbf24NvIeB4GTvYsKnGDOXwtCZIywNx%2FUXPwCR7YMqRVZSy1j1eCZEz37XIkvDU31W%2FjyEJz6f5%2BV0xNsvjKJHSGGKtX%2FlVZRU%3D" rel="nofollow">死磕数据库系列(二十三):MySQL 高可用方案选型解析</a></p><h2>MySQL 级联复制与双主双从配置实战</h2><p><a href="https://link.segmentfault.com/?enc=rVC7j8T29bam3Q33GEQvAQ%3D%3D.fqZzrwkGPVek2uB0qXkhSN5mfPtrkymnZ%2F3yV0ChZ6jcsDm1mbZDkGXn4EkQ7VT%2F%2B5QSs5iCuJG66WY%2FqbJJ7n84awn8QGMJPlHRZMDM0HO02l4pDANPcIERJjsty%2F2eqd8ozJVJxuW2OY9cMiNHrGYfIeAvXO4Se2ub%2FV6w6msWIXMKUPEiNwWMlTz7ATqB4JUkOccxuwSHhuDKHJjIqffxOiHPqHo6h8KWHmsueWlmHHU46MOqtISOfu%2FroIyrNTP4QLyGQMTQK5RmWG6wFBCrVWNCYYCDajcucxPjP%2BQ%3D" rel="nofollow">死磕数据库系列(二十四):MySQL 级联复制与双主双从配置实战</a></p><h2>MySQL 高可用之组复制(MGR)详解</h2><p><a href="https://link.segmentfault.com/?enc=bvx8PP7R%2F0p7Zl1CNv4rBw%3D%3D.fkpFwKjYF1yn9kdr985vZnlRcqwV2YmBErjL3x58%2F3RuE3AAnU9Xtb7sn7ixtSTU5CsUEk3VBhCl8drizjqDbpaT4LmoMQxVmZa%2BDYVwqTWu1Vkrx5lBZpfABgDRS%2F%2Fzx5tvEPCB1D%2B40PXVLTGs83ahOMMidqy3KLvN3iSiqganeDj2t5mDmBUSU8oL3XbkQ7XbjnSvn0EQgmO%2FI%2BnES8r8pMH6Kv%2BfHr%2BJ5rc2coeWy6r1H9ZZRe7Cpe43RxN827C0hbgA5t%2B1M%2FFvMaoYX1GRdLlWMHWUTAp9K9yGsns%3D" rel="nofollow">死磕数据库系列(二十五):MySQL 高可用之组复制(MGR)详解</a></p><h2>MySQL 高可用之单主、双主模型组复制配置实践</h2><p><a href="https://link.segmentfault.com/?enc=aqRcTqovyA9EceA6nPGfEg%3D%3D.FiqdKiWmDCT6jKiCa%2FVrQiGn%2BBu0oTFzNgQAsEkYLEDmfdD4Tmx%2Bn73S1Hyz%2B9%2F0AOCTPlNCnDJGLnTAagOvLctVz49OxkEZ5WlkP%2FN%2BhdYO1bG94XaOalf9mGpukZGwGjvLSqHM6aQKd289%2FGeDKM8aTEQ1fs7LagWZsqI0PG5S6rEHi8eHECo0yEg2vNX5RxCUTAJKQF4MFi8JV3ubLJFSD%2BRahACgaZ1cZrGambR9WAzr0l9LkP9Ab3O6n9AlH16kFK%2Bvcm8dW8RBYDjNUX7I6ftBCHB8us03%2BospUmQ%3D" rel="nofollow">死磕数据库系列(二十六):MySQL 高可用之单主、双主模型组复制配置实践</a></p><h2>MySQL 常用管理命令介绍</h2><p><a href="https://link.segmentfault.com/?enc=RKyezpERtypmg6UA20ZqWA%3D%3D.OilulhENloiHbf%2F25QXVQJXkBeJWcIxyyOFleVcDcfBpWBCVdBJkCp%2BkRAiljKBmVTWUR2GdDu9q0u6BnJYieJrU9uPSoMeDwo%2BsbQIYUUIWxdP3Q5qqm55gclTcafbgS2IRHFvL%2BNHfwrSfrRFerhjUPT3S5euhtfYkZS%2BH4nMPuGWh4Xl2X3khTmHtANZFs%2BKW92rcBKCJ4UqjIVRA%2Bi%2BH1Tn3JBXcgDi9BTYO6PY6Td60D8Qr9Y10WX8KoOW%2BBoTQzBnmYF0mf59CmSe%2FRvXpzo1zdEtpKS%2FnXN7KNUg%3D" rel="nofollow">死磕数据库系列(二十七):MySQL 常用管理命令介绍</a></p><h2>MySQL InnoDB Cluster 多节点高可用部署实战</h2><p>MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如 MMM, MHA, NDB Cluster, Galera Cluster, InnoDB Cluster, 腾讯的PhxSQL, MySQL Fabric., aliSQL。MySQL官方在2017年4月推出了一套完整的、高可用的Mysql解决方案 - MySQL InnoDB Cluster, 即一组MySQL服务器可以配置为一个MySQL集群。在默认的单主节点模式下,集群服务器具有一个读写主节点和多个只读辅节点。辅助服务器是主服务器的副本。客户端应用程序通过MySQL Router连接到主服务程序。如果主服务连接失败,则次要的节点自动提升为主节点,MySQL Router请求到新的主节点。InnoDB Cluster不提供NDB Cluster支持。</p><p><a href="https://link.segmentfault.com/?enc=P6qY7VthGHqMA5c0LwR6Dg%3D%3D.EvwxNw1%2Bbp0NgULlTi9OJvUSEC8Qzte%2BdvwiPyuiRYKl6t69utTCTzJQmmvefEC2EpXclh0UsnPM2zNtmvVli434Ui1Mkjk3wHBgBMykohlPlr%2BGHTljMIqvk622bsf%2FA1b8yth7joJ3alIE8png%2Fl3k2cpo5DehVldsg%2BZ2691nnEn1coEasu%2Bz0OkWqpQopSmqj6R6B0zUg%2BEQ2Or7NfyiUMSAv%2Byiru9XR5308NWeZJstBT5l2fzhg%2FyLRIm5dO1FPTfi%2FTLnmUY8OMv%2FiO3FRt%2FTIs93uEAo3D8jyDc%3D" rel="nofollow">死磕数据库系列(二十八):MySQL InnoDB Cluster 多节点高可用部署实战</a></p><h2>MySQL Router 实现数据库读写分离配置实践</h2><p>MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的 SQL proxy。</p><p>既然MySQL Router是一个数据库的中间件,那么MySQL Router必须能够分析来自前面客户端的SQL请求是写请求还是读请求,以便决定这个SQL请求是发送给master还是slave,以及发送给哪个master、哪个slave。这样,MySQL Router就实现了MySQL的读写分离,对MySQL请求进行了负载均衡。</p><p>因此,MySQL Router 的<code>前提</code>是后端实现了MySQL的主从复制。</p><p>MySQL Router 很轻量级,只能通过不同的端口来实现简单的读/写分离,且读请求的调度算法只能使用默认的rr(round-robin),更多一点、更复杂一点的能力都不具备。所以,在实现MySQL Router时,需要自行配置好后端MySQL的高可用。高可用建议通过Percona XtraDB Cluster或MariaDB Galera或MySQL官方的group replication实现,如果实在没有选择,还可以通过<a href="https://link.segmentfault.com/?enc=JzpAigYQV2N5vtIdpoh35Q%3D%3D.ObI3bWXkZ7xONIMZl4C3%2FE%2FY9SSjj%2FPUh63hJOHVDJ6998aLR9g7xPJKoXEtD1JxpxaWmZ%2FZerbpK3CEKrXvKhHYOwLQ6spPy3Sa4cWzwzM3OPmn%2FOWf5Iw%2BOYmH5ydGd3QEm0c1N5xZyX8bv19CLSnsz9Gp2lH9%2FRTTMvjxVxDplMLJm2YhCHr%2FVC1vqYWbGTKY%2BQSKk1eWNROfS9xtZIyBW6j8zDjWq5XYL1MwCGDRlNTLDNm5WojqBEiEKo6mHsbfQh1PPU4n3P%2B8M3v73Lrp6PGw33DRlT%2B1xgzhDWE%3D" rel="nofollow">MHA</a>实现。</p><p>所以,一个简单的MySQL Router部署图如下。<img src="/img/remote/1460000043831394" alt="图片" title="图片"></p><p><a href="https://link.segmentfault.com/?enc=8a4LnIkGcNjDaOKZ9hei1Q%3D%3D.84pRGIjFBEX0W96C1fj7xC3IGTis%2BamXatA2Jxh0op0kA4eq6aCkQR9eOqDv6Tzj2UAmug3whLjT03Ca7jya5zjBxpZRdQQwqGRPgIc7kkvOhBht13AWM0HLZymPfV2OD2kfyUmNUGUMJFc3zU8VGQ0lp9OIrUIrhfxnA%2BWWAK093hQdv4T%2FLXRInBfuFXUOdd30cHAXu2ST8Oylf%2BnG1HUF8wRImWkxCIMzO6IlToZYXU3Y3%2FyRGWARk4zleajLjkOme1VfQ%2F1bBVXV0fgKWCcjzUaQH1k4znFV4BxsDd8%3D" rel="nofollow">死磕数据库系列(二十九):MySQL Router 实现数据库读写分离配置实践</a></p><h2>MySQL 针对 Swap 分区的运维管理</h2><p>Linux 有很多很好的内存、IO调度机制,但是并不会适用于所有场景。对于运维人员来说,Linux比较让人头疼的一个地方是:它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上。对于频繁进行读写操作的系统而言,数据看似在内存而实际上在磁盘是非常糟糕的,响应时间的增长很可能直接拖垮整个系统。所以,作为运维人员,怎样做到尽量避免 MySQL 惨遭 Swap 的毒手将显得尤为重要!</p><p>SWAP是操作系统虚拟出来的一部分内存地址,它的物理存储元件是磁盘。在备份数据或恢复数据时,文件系统会向Linux系统请求大量的内存作为cache。在物理内存使用殆尽时候,为了确保程序运行,往往会将另外的一些占用物理内存地址空间的程序映射到swap分区上。</p><p><a href="https://link.segmentfault.com/?enc=uroKcqOqbjTv79X5u5RENw%3D%3D.AgSqjJgBv2geaDreRYjBJCsULOXkAsX71Kxlo2dQybdc%2F%2F8UYUqqIoXbV%2F5wSyIoIb3UU%2FMgqohovknWpplsXwjIyseAnUHAjR3QmufD%2BV2vxEQhiP1UixhWeNGwtTr1OFqNfjpvMDYHSBW4w0hAN8%2FK3z2fvFrpBACTPDtmCZ4%2BrJHxgJBVwVso6Vo%2B8s1itpbhcL%2FNELK1hIMcdhWsP8myJ32dPW5ZnaR3qEYItzP6%2BU%2FygwBuYZ7MitFqgbA%2BqKxe2n7TLTm%2BCQGoUXt%2BoRnprPgfKl3MgzLnGgV4qLE%3D" rel="nofollow">死磕数据库系列(三十):MySQL 针对 Swap 分区的运维管理</a></p><h2>MySQL 服务器 CPU、磁盘、内存等硬件选型</h2><p><a href="https://link.segmentfault.com/?enc=YV0pLFXQbemmfOJCSu3aXQ%3D%3D.HG5ozvfUJQzYXJ69BrqLsm%2BDIsdkAeIjqjRXZ%2BWFx9iVQtWq850wUjGsuPBRNXBjzSeWU91u4rjQZ7liR%2B3ZTg0XKxv0eb7XNTBsW8bQf7%2FDS2maT%2FvJL%2FfDDj92BmySZRe6Pe609Lz%2FLOuoRxwWD6FBh%2BV2TQh6JvqQZrRmWKKZ74ib5IIBWZDJuZdwUvymBSk50YEWqLSFe3fUHS2Z0BmFgnXqW3vV%2BRbsnmy5zQm%2F9hPFQOO3E0DzanEg6dnEwbA88Tai9HfeHG%2F5e5cxLyJURL4EZuiFalJGLK%2FU1Tc%3D" rel="nofollow">死磕数据库系列(三十一):MySQL 服务器 CPU、磁盘、内存等硬件选型</a></p><h2>MySQL 数据库、数据表管理工具介绍</h2><p><a href="https://link.segmentfault.com/?enc=sVw2zUMsVGJ6j8y%2FyWvwiA%3D%3D.IWjCofYYH16ujF4IHHRuhHq%2FtZ1Vwe8CYdPAZLcFajzodMVSh%2FD1a31WUFUyVKuf%2FWCCvUhlG4vzlclfUplTz4GlgutHneW0mHsHKdkGZ3bD%2B6GvaGQqUuaZOHZW4O8NwbOZAVNnCqFL%2FlM9EvFUhyl1eBSEMGz0FHyAEY%2BuHPeZoh0uxJ0E8BTkI%2F3I0pTegNTbAIUtCyuiorbVX803aMjUMnCorEGpVdgPamcMVap6bNkHy51rbZrtYGW8QyF7ARNp4IbCF%2FoavmQoAEBO00ypfmGy4ryBfOUTSABSxgw%3D" rel="nofollow">死磕数据库系列(三十二):MySQL 数据库、数据表管理工具介绍</a></p><h2>MySQL 性能分析与相关工具的使用</h2><p>在数据库调优中,我们的目标就是 响应时间更快,吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式。</p><p><a href="https://link.segmentfault.com/?enc=VqEmIppYkDrw9II1AUSm1g%3D%3D.TZ%2F5Wy4qM0q4h%2B%2BzGowxn4vg5OAObFmlLkPU0vS8nO9q06nkfpT7bc3n7dnUz16KyfMPycU1IhHmk1vD8mtvysR1GWf5u%2FakRALA9iQPEtFsY8goLHxJQKjZ7lb1HZLxYi1xXAvD0ueldO3XPcxwgfoH%2FN2%2Br3TnVY3b9g5kFsndBMK9R1FjjehmJRwkxF9k8YSle0nyOx7bgOF4r1ALsPpjGU%2BeHvDVHzloibEdIDavUY%2BffsszB6ma1IZ09GEdYP7849f0TXApUxV9FYAfhHqND%2BLacBgKWqw3PJh7KqM%3D" rel="nofollow">死磕数据库系列(三十三):MySQL 性能分析与相关工具的使用</a></p><h2>MySQL 性能测试工具 sysbench 详解</h2><p>sysbench 是一个很不错的数据库性能测试工具。</p><p>官方站点:<a href="https://link.segmentfault.com/?enc=c27gxlhQrY5lK%2Bs6QbAG8Q%3D%3D.DqfhCGODSKfd2oHLbNfQ%2Fd6kpZqlKRhfTtf%2B1DUYOVvTdy0FfI7JfK%2F%2BXR2Honjo" rel="nofollow">https://github.com/akopytov/sysbench/</a></p><p><a href="https://link.segmentfault.com/?enc=w3%2BVP5NjWf93o%2FCbAMxnxw%3D%3D.Nte55sC5Mh42ypXNv9zPgJgXISHLT996nzgusW1fLyKxUF1M%2Bn%2Fb5I0D6%2BurF94Voolt78tIYZPTCfsRTJ4KvBv%2BX3Nx2gYGG%2Bh1EBU6Dj2QFa4y1L4lNEDZvvsFjPMSR9JRj0I%2F2rqkzZmja9tyZVbFjoqJSrpt%2FuKDI3iZlLFv5I%2FW%2FF2X6Sfbwx6hHXW9e6kYmmcbbjYcjXGWUUlmu7lXmcuo6SJashqtNcH6nholc%2B%2FuiRNyem%2FffhznALVk3heldpBMjBzqbknp%2FSNE6kS2C05Jlo7Vj675%2F%2FyGyJY%3D" rel="nofollow">死磕数据库系列(三十四):MySQL 性能测试工具 sysbench 详解</a></p><h2>MySQL 数据库性能监控</h2><p>我们监控 MYSQL 数据库,从以下几个维度进行<a href="https://link.segmentfault.com/?enc=Mxq5YCHM72OCWmDVVFfHdQ%3D%3D.fDoi5pGQba0juoY8RXfEj3lqKlT37jFA%2FMp3QUtWYyXUnD9ViXhPAwUGPC1WorMLjxSFTu3ntmrzMeVp6t%2FH2YaAFiCApbM3VV5K55k%2FFWvy3S69fAjagVgS%2Bo7NGEk49t6wlqHidIk5dqk2zTJEjh0St3JVOVSTIF8%2FRjSsuA0Glu5pWodOYrSQq7%2BxXXtFQgg%2B%2FZ6eMRGM9%2BQZD5b50oQd5YQLcwaFwo93H2rAndGzMCFHt9kGClHSo7eYbw%2F9EtLY60BszK5GMhHpwHVUY7y6b4nmax30XQ3OuUHls0I%3D" rel="nofollow">监控</a>。</p><p><code>吞吐量</code>,包括数据库的接收和发送吞吐量。</p><p><code>innodb的指标信息</code>,包括了 innodb buffer pool 的各项指标信息,数据读和写的数量以及Innodb锁等待指标信息等。</p><p><code>线程信息</code>,包括缓存的线程、连接的线程、创建的线程以及激活的线程,用来衡量数据库的连接情况,我们在激活的线程中应用了异常检测算法,对于突增或突检的情况,平台会告警,提示异常。</p><p>数据库的<code>增删改查</code>操作的统计信息。</p><p><code>慢SQL</code>监控,当慢 SQL 次数到达指定阈值,平台会告警,提醒用户确认具体的慢SQL,并调优。</p><p>当开启 performance_schema 库中访问后,我们可以对表、索引的<code>IO</code>等待信息、等待<code>事件</code>信息进行收集和监控。</p><p>数据库<code>等待事件</code>的监控。</p><p><code>schema 的统计</code>信息,包括表的行数、大小、空间剩余等信息。</p><p><a href="https://link.segmentfault.com/?enc=jO7C9OtvVpu%2Few4w7BpgDw%3D%3D.%2BOAjc7hvlaSN4EBu9jXzmqxnnJ7dADNjbqzTaYltnTxp3Zts9EgXFl1BzVuOHhocaGhC50R7JN8RL4aiu2BOjQdEcjsALKSGV7EO75h%2BRgowRU5hI4HN5VUde0R2oLydrc%2FaNIjhqOm3LJo2%2BUXeKXDLGKqlpK%2B3cncBpKi7SwEzB5bFoveT3O0eSYMc3AlboTRRUnVIJNmYvvkuMad9YxpdTblTxN8UTallKDnPyeORXZKGqKqnS3Gk2uuXLeZKSfEpyADWo4rirLHyquBHPx8Do3bRqbD17HYpBZX9erc%3D" rel="nofollow">死磕数据库系列(三十五):MySQL 数据库性能监控</a></p><h2>MySQL 开发设计规范、SQL 编写规范及安全规范</h2><p>为了在软件生命周期内规范数据库相关的需求分析、设计、开发、测试、运维工作,便于不同团队之间的沟通协调,以及在相关规范上达成共识,提升相关环节的工作效率和系统的可维护性。同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的保证。</p><p><a href="https://link.segmentfault.com/?enc=swXKQqhKkSys6HGmDKDdDQ%3D%3D.ttheMkTTWd1w3OJRourEY4Bi4k5SrEmSRpdq4LIl1%2B33noS5lcspnKmLu2P0bkty30odIf%2Fwk3H8PSnSP9n2ncAsjq0jCyEwZo0dKRj0S1BAsDdEoltKlbMMAiD5XHNzgFmeQAKW94gKwU35bYpIwDHV%2Fpe1Ug2O9rg07Dp9QMCofUT5Z7ihdHxmikMCTqbZFgKQ4gPtU72zDH8Ex7SdoSoTjyRuxqnOUP1UVH1ZFWLNlQQc2E9PptKqqimdBHNSQm75JT8JDqz1nX3wdyJqAD2kGPpdbCIo40c9JxLPlvY%3D" rel="nofollow">死磕数据库系列(三十六):MySQL 开发设计规范、SQL 编写规范及安全规范</a></p><h2><strong>今天 ,终终终于卷完了!!!!</strong></h2><h2><strong>希望大家能够从中收获多多!如有帮助,请点赞、转发支持一波!!!</strong></h2>
神器!你不可错过的几款超牛逼终端工具
https://segmentfault.com/a/1190000042529010
2022-09-21T20:40:34+08:00
2022-09-21T20:40:34+08:00
民工哥
https://segmentfault.com/u/jishuroad
1
<p>终端是程序员的必备工具之一,今天,给大家介绍几款程序员必备(牛逼)的终端工具!</p><p>好工具是提高工作效率的必备神器!民工哥在此之前也介绍过不少的常用工具,以及它的使用与配置,大家可以点击 <strong><a href="https://link.segmentfault.com/?enc=mjgVqNGMq4de3t4BN5Vkjg%3D%3D.fGaOOl0uJcgfLpb%2BuVWS3c8HQwJIcXvijDFCx%2FzfEXKfBFtdoYADkYjWW0uO9ldh05ZKrVLwLECK%2FVT6VecS9Ed0VGEGj0URVtPjxi7TxwE0KVgha1nm4FtK3Y0HDp%2F6NCqPboP65gbeeLWeMa36VXRFoh6uAdHn18dUUBoeZnLdjciY2gm4JrEmVd40qFjxKka%2BGVBPSUo5tbZ6OIajJSCDN0wNn0r10ZFfJBNwVEgVTVybHkIQkBcEnEwAPB%2B%2B" rel="nofollow">Tools</a></strong> 专栏查阅。</p><h2>PuTTY</h2><p>这绝对是一款超级经典的终端工具!99.99%程序员都用过它。</p><p>PuTTY 是一款集成虚拟终端、系统控制台和网络文件传输为一体的自由及开放源代码的程序。它支持多种网络协议,包括 SCP,SSH,Telnet,rlogin 和原始的套接字连接。它也可以连接到串行端口。其软件名字“PuTTY”没有特殊含义。</p><p><img src="/img/remote/1460000042529012" alt="" title=""></p><ul><li>授权协议:MIT</li><li>操作系统:Windows</li><li>官网:<a href="https://link.segmentfault.com/?enc=CREFtFVw8XNd%2F%2BtGt%2FfdZw%3D%3D.JA2%2BN%2BTAQ5apZOfzWplntTJjofKctWRwVLDfs5cD%2FAE%3D" rel="nofollow">https://www.puttylink.com/</a></li></ul><p>较早的版本仅支持 Windows 平台,后陆续增加对各类 Unix 平台和 Mac OS X 的支持。除了官方版本外,有许多第三方的团体或个人将 PuTTY 移植到其他平台上,像是以 Symbian 为基础的移动电话。</p><p>PuTTY 主要由西蒙·泰瑟姆编写并维护,使用 MIT 许可证许可。</p><h2>Windows Terminal</h2><p><img src="/img/remote/1460000042529013" alt="" title=""></p><p>Windows Teminal是一款新式、快速、高效、强大的终端应用程序,适用于命令行工具、命令提示符、PowerShell、WSL(Linux子系统)等等的Shell用户,主要功能包括多选项卡、窗格、Unicode/UTF-8字符支持、GPU 加速文本渲染引擎,以及自定义主题、样式和配置等等。</p><p><img src="/img/remote/1460000042529014" alt="" title=""></p><ul><li>授权协议:MIT</li><li>操作系统:Windows</li><li>官网:<a href="https://link.segmentfault.com/?enc=2zruipkR%2Fk88mJ%2FZQMvGgg%3D%3D.kHGJGSDX%2FG2YvSI7oKqkZv3cGnW%2BIXnk8mLRa7Z4ddakgQuvStGk9P6leThX8WIGW8uv%2FXjmCtPQ5PQeWggBhA%3D%3D" rel="nofollow">https://learn.microsoft.com/e...</a></li></ul><h2>Tabby</h2><p>Tabby(以前称为Terminus)是一个高度可配置的终端模拟器、SSH 和串行客户端,适用于 Windows、macOS 和 Linux。</p><p><img src="/img/remote/1460000042529015" alt="" title=""></p><ul><li>授权协议:MIT</li><li>操作系统:跨平台</li><li>官网:<a href="https://link.segmentfault.com/?enc=qoN03uhNHCtsGvOxGQCWzQ%3D%3D.yrCXX3VpdIJ3wV%2FGzVrH2h%2BBCdK3OPbsP%2BfoaqvEHZY%3D" rel="nofollow">https://tabby.sh/</a></li></ul><h6>特点</h6><ul><li>集成的 SSH 和 Telnet 客户端和连接管理器</li><li>集成串口终端</li><li>可配置主题和配色方案</li><li>支持PowerShell(和 PS Core)、WSL、Git-Bash、Cygwin、MSYS2、Cmder 和 CMD</li><li>通过 Zmodem 与 SSH 会话的直接进行文件传输(上传/下载)</li><li>非常的流畅的界面输出</li><li>用于 SSH 机密和配置的集成加密容器</li><li>SSH、SFTP 和 Telnet 客户端可用作Web 应用程序</li></ul><p>更多相关介绍请参考:<a href="https://link.segmentfault.com/?enc=hQa9NErcClvDwIYqA0c7ZQ%3D%3D.QjgWzBrJpUdNaU0%2B0UEda41v4Uq%2BgekRKCXl9xQsdJCRBKD4kJDkPwCbKtCBpujBQnKVu3XY%2Ft%2FBsF5rjuvhE12EMZ%2FGQQlWn2UXgNWBIsN487NPETkmmB4C3lzp7Cczv4zsnZqwP%2FuDSF8xlfkRMqZnRnGNJCVMEjZd7lXiE%2BMVlp%2Fwg2Qag44D4NTpAtC33i%2FaPJrCl3f27UbymOAPs5PgSxEP3O1joP%2BGTJj3zeJat1Knm9y2ip%2FXmITBcVwB7U8x8kYj7AE49uVYqDgDL%2B6llLpzEfQpKduYiXWURW0%3D" rel="nofollow">推荐一个更现代的终端连接工具</a></p><h2>iTerm2</h2><p>iTerm2 是 Terminal 的替代品,也是 iTerm 的继任者。它适用于装有 macOS 10.14 或更高版本的 Mac。iTerm2 将终端带入现代时代,具有您从未知道您一直想要的功能。</p><p><img src="/img/remote/1460000042529016" alt="" title=""></p><ul><li>授权协议:GPLv2</li><li>操作系统:OS X</li><li>官网:<a href="https://link.segmentfault.com/?enc=tuVNAnTzax6lV9ZSg7b0UA%3D%3D.rb1NtNOmlPsuBBS3PKM58o9qypuaGyjvKEjGk5HaIs4%3D" rel="nofollow">https://iterm2.com/</a></li></ul><h2>Oh My Zsh</h2><p>Oh My Zsh 是一个令人愉快的、开源的、社区驱动的框架,用于管理您的 Zsh 配置。它捆绑了数千个有用的功能、助手、插件、主题和一些让你直呼好用的东西。</p><p><img src="/img/remote/1460000042529017" alt="" title=""></p><ul><li>授权协议:MIT</li><li>操作系统:Linux</li><li>官网:<a href="https://link.segmentfault.com/?enc=zTeAq5qqCkTEZ%2FqJqGyVqA%3D%3D.UU8AgTfaurm%2F8QKZCBQhcqD1urIS8it3DqJCWb5pwq8%3D" rel="nofollow">https://ohmyz.sh/</a></li></ul><h2>Zsh</h2><p>Zsh 是一个 Linux 下强大的 shell, 由于大多数 Linux 产品安装,以及默认使用bash shell, 但是丝毫不影响极客们对 zsh 的热衷, 几乎每一款 Linux 产品都包含有 zsh,通常可以用 apt-get、urpmi 或 yum 等包管理器进行安装。</p><p><img src="/img/remote/1460000042529018" alt="" title=""></p><ul><li>操作系统:Linux</li><li>官网:<a href="https://link.segmentfault.com/?enc=2pubrQm25%2BewtXDTS1Z3aw%3D%3D.xgH6ZM8YyJASwhG%2B42Pex9yTmtfqBPOGgjA1wDtXKegrWvIbgU40kTs7U1A206yB" rel="nofollow">https://github.com/robbyrusse...</a></li></ul><h2>PowerShell</h2><p>PowerShell 是一个跨平台的 (Windows, Linux 和 OS X) 自动化和配置工具(框架),可以和已有的工具友好集成,特别优化用于处理结构化数据 (如 JSON, CSV, XML 等), REST APIs 以及对象模型。它包含一个命令行 Shell、一个关联的脚本语言以及一个用于处理 cmdlets 的框架。PowerShell 就相当于 Linux 下的 Bash 以及 Shell 脚本编程语言。</p><p><img src="/img/remote/1460000042529019" alt="" title=""></p><ul><li>授权协议:MIT</li><li>操作系统:跨平台</li><li>项目地址:<a href="https://link.segmentfault.com/?enc=kVI5UAk9bBgM8gITBAprAw%3D%3D.ceEn0HOREWYCk48dkOyqPzBXPJ61nHnxCczByKT39r2wvbjGAH0czwBSb1f9PU%2Fc" rel="nofollow">https://docs.microsoft.com/zh...</a></li></ul><h6>PowerShell 与 Bash 的对比</h6><p><img src="/img/remote/1460000042529020" alt="" title=""></p><h2>Starship Shell</h2><p>Starship 是一个用 Rust 编写的开源项目,适用于最常见操作系统上最常见的 shell。带来 Rust 一流的速度和安全性,让您的提示尽可能快速和可靠。可以根据您的喜好进行定制,以使此提示尽可能少或功能丰富。</p><p><img src="/img/remote/1460000042529021" alt="" title=""></p><ul><li>授权协议:ISC</li><li>操作系统:跨平台</li><li>项目地址:<a href="https://link.segmentfault.com/?enc=4OpFKuf6cM1QJKXzJne9TA%3D%3D.PPORXrtSG%2FgDBxCJTt59ul8TadaNgsRF68zIELuytEc%3D" rel="nofollow">https://starship.rs/</a></li></ul><h2>fish</h2><p><img src="/img/remote/1460000042529022" alt="" title=""></p><p>Fish 是“the friendly interactive shell”的简称,fish最大的特点就是功能强大,智能并且用户友好。Fish支持语法高亮,自动建议,标签完成等,而且配置十分简单。</p><ul><li>授权协议:GPLv2</li><li>操作系统:Linux</li><li>官网:<a href="https://link.segmentfault.com/?enc=qEwQTuW%2B%2B%2BBlBq9GHuELAg%3D%3D.cMJRLmtDRWm5l1AJ5b1cl06oo82NUSeEcysk7wFckgk%3D" rel="nofollow">https://fishshell.com/</a></li></ul><p>如果你想拥有一个方便好用的 Shell,又不想学习一大堆语法,或者花费很多时间配置,那么你一定要尝试一下 Fish。</p><h2>Konsole</h2><p>功能强大且可自定义的终端工具。Konsole 还集成到多个其他 KDE 应用程序中,使其更容易访问和更方便。例如,KDevelop、Kate 和 Dolphin 都使用 Konsole 作为集成终端工具。</p><p><img src="/img/remote/1460000042529023" alt="" title=""></p><ul><li>授权协议:GPL</li><li>操作系统:Linux</li><li>官网:<a href="https://link.segmentfault.com/?enc=CH5MkGjHBEbZioEdA9YUkw%3D%3D.3RrXxbpwoHhEpaplevieydqZPHM%2FVF5xdTa%2Blj4ugtA%3D" rel="nofollow">https://konsole.kde.org/</a></li></ul><h6>使用截图</h6><p><img src="/img/remote/1460000042529024" alt="" title=""><br><img src="/img/remote/1460000042529025" alt="" title=""></p><h2>Hyper</h2><p>hyper 是一款基于 Web 技术实现的一款命令行终端工具。</p><p><img src="/img/remote/1460000042529026" alt="" title=""></p><ul><li>授权协议:MIT</li><li>操作系统:跨平台</li><li>官网:<a href="https://link.segmentfault.com/?enc=BRFiRK4M8QTe0yRvbxuRrQ%3D%3D.XzQKweyqCpH7oQ1zltZ32U3jEGBiUwTaZJXb8KLhiN8%3D" rel="nofollow">https://hyper.is/</a></li></ul><p>工具对于个人来说,只有最合适的,没有最好的,大家按自己的使用习惯及需求来选择。</p>
最详细的 K8S 高可用部署流程!步骤齐全,少走坑路
https://segmentfault.com/a/1190000042458864
2022-09-11T21:30:31+08:00
2022-09-11T21:30:31+08:00
民工哥
https://segmentfault.com/u/jishuroad
5
<p>官网:<a href="https://link.segmentfault.com/?enc=6kwOQF5G8g4r3wymblGqQQ%3D%3D.rGWa618MOT7FUIH4ky8OPbygjnv0nAxhdWldlD2QqJQ%3D" rel="nofollow">https://kubernetes.io/</a></p><p>文档:<a href="https://link.segmentfault.com/?enc=9fWfwt%2FKpeVJW2krS514tA%3D%3D.AslVML8cJDGy5CqDWcvszV0KfGh44no1DxB7jdTH3o8cmq5YyXKNF%2BG6QaBYz8vc" rel="nofollow">https://kubernetes.io/zh-cn/d...</a></p><p><img src="/img/remote/1460000042458866" alt="图片" title="图片"></p><h2>基础环境部署</h2><h6>前期准备(所有节点)</h6><p>1、修改主机名和配置 hosts</p><p>先部署 1master 和 2node 节点,后面再加一个 master 节点</p><pre><code># 在192.168.0.113执行
hostnamectl set-hostname k8s-master-168-0-113
# 在192.168.0.114执行
hostnamectl set-hostname k8s-node1-168-0-114
# 在192.168.0.115执行
hostnamectl set-hostname k8s-node2-168-0-115</code></pre><p>配置 hosts</p><pre><code>cat >> /etc/hosts<<EOF
192.168.0.113 k8s-master-168-0-113
192.168.0.114 k8s-node1-168-0-114
192.168.0.115 k8s-node2-168-0-115
EOF</code></pre><p>2、配置 ssh 互信</p><pre><code># 直接一直回车就行
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master-168-0-113
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1-168-0-114
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2-168-0-115</code></pre><p>3、时间同步</p><pre><code>yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources</code></pre><p>4、关闭防火墙</p><pre><code>systemctl stop firewalld
systemctl disable firewalld</code></pre><p>5、关闭 swap</p><pre><code># 临时关闭;关闭swap主要是为了性能考虑
swapoff -a
# 可以通过这个命令查看swap是否关闭了
free
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab</code></pre><p>6、禁用 SELinux</p><pre><code># 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config</code></pre><p>7、允许 iptables 检查桥接流量(可选,所有节点)</p><pre><code>若要显式加载此模块,请运行 sudo modprobe br_netfilter,通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载,
sudo modprobe br_netfilter
lsmod | grep br_netfilter</code></pre><p>为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:</p><pre><code>cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system</code></pre><h6>安装容器 docker(所有节点)</h6><p>提示:v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。你可以阅读检查 Dockershim 弃用是否会影响你 以了解此删除可能会如何影响你。要了解如何使用 dockershim 进行迁移,请参阅从 dockershim 迁移。</p><pre><code># 配置yum源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# centos8
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# 安装yum-config-manager配置工具
yum -y install yum-utils
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本
yum install -y docker-ce
# 启动
systemctl start docker
# 开机自启
systemctl enable docker
# 查看版本号
docker --version
# 查看版本具体信息
docker version
# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 加载
systemctl reload docker
# 查看
systemctl status docker containerd</code></pre><p>【<strong>温馨提示</strong>】dockerd 实际真实调用的还是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之间的一个中间交流组件。所以启动 docker 服务的时候,也会启动 containerd 服务的。</p><h6>配置 k8s yum 源(所有节点)</h6><pre><code>cat > /etc/yum.repos.d/kubernetes.repo << EOF
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF</code></pre><h6>将 sandbox\_image 镜像源设置为阿里云 google\_containers 镜像源(所有节点)</h6><pre><code># 导出默认配置,config.toml这个文件默认是不存在的
containerd config default > /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml</code></pre><h6>配置 containerd cgroup 驱动程序 systemd(所有节点)</h6><p>kubernets 自v 1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。因此需要安装 containerd(在 docker 的基础下安装),上面安装 docker 的时候就自动安装了 containerd 了。这里的 docker 只是作为客户端而已。容器引擎还是 containerd。</p><pre><code>sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 应用所有更改后,重新启动containerd
systemctl restart containerd</code></pre><h6>开始安装 kubeadm,kubelet 和 kubectl(master 节点)</h6><pre><code># 不指定版本就是最新版本,当前最新版就是1.24.1
yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet
# 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
systemctl status kubelet</code></pre><p><img src="/img/remote/1460000042458867" alt="图片" title="图片"></p><p>查看日志,发现有报错,报错如下:</p><pre><code>kubelet.service: Main process exited, code=exited, status=1/FAILURE kubelet.service: Failed with result 'exit-code'.</code></pre><p><img src="/img/remote/1460000042458868" alt="图片" title="图片"></p><p>【<strong>解释</strong>】重新安装(或第一次安装)k8s,未经过 kubeadm init 或者 kubeadm join 后,kubelet 会不断重启,这个是正常现象……,执行 init 或 join 后问题会自动解决,对此官网有如下描述,也就是此时不用理会 kubelet.service。</p><p>查看版本</p><pre><code>kubectl version
yum info kubeadm</code></pre><p><img src="/img/remote/1460000042458869" alt="图片" title="图片"></p><h6>使用 kubeadm 初始化集群(master 节点)</h6><p>最好提前把镜像下载好,这样安装快</p><pre><code>docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.24.1
docker pull registry.aliyuncs.com/google_containers/pause:3.7
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.3-0
docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6</code></pre><p>集群初始化</p><pre><code>kubeadm init \
--apiserver-advertise-address=192.168.0.113 \
--image-repository registry.aliyuncs.com/google_containers \
--control-plane-endpoint=cluster-endpoint \
--kubernetes-version v1.24.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--v=5
# –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
# –kubernetes-version string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。
# –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
# –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
# --control-plane-endpoint cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里配置hosts映射:192.168.0.113 cluster-endpoint。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。</code></pre><p>【<strong>温馨提示</strong>】kubeadm 不支持将没有 --control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群。</p><p>重置再初始化</p><pre><code>kubeadm reset
rm -fr ~/.kube/ /etc/kubernetes/* var/lib/etcd/*
kubeadm init \
--apiserver-advertise-address=192.168.0.113 \
--image-repository registry.aliyuncs.com/google_containers \
--control-plane-endpoint=cluster-endpoint \
--kubernetes-version v1.24.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--v=5
# –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
# –kubernetes-version string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。
# –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
# –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
# --control-plane-endpoint cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里配置hosts映射:192.168.0.113 cluster-endpoint。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。</code></pre><p>配置环境变量</p><pre><code>mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 临时生效(退出当前窗口重连环境变量失效)
export KUBECONFIG=/etc/kubernetes/admin.conf
# 永久生效(推荐)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile</code></pre><p><img src="/img/remote/1460000042458870" alt="图片" title="图片"></p><p>发现节点还是有问题,查看日志 /var/log/messages</p><pre><code>"Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"</code></pre><p><img src="/img/remote/1460000042458871" alt="图片" title="图片"></p><p>接下来就是安装 Pod 网络插件</p><h6>安装 Pod 网络插件(CNI:Container Network Interface)(master)</h6><p>你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。</p><pre><code># 最好提前下载镜像(所有节点)
docker pull quay.io/coreos/flannel:v0.14.0
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</code></pre><p>如果上面安装失败,则下载后离线安装</p><p>再查看 node 节点,就已经正常了<img src="/img/remote/1460000042458872" alt="图片" title="图片"></p><h6>node 节点加入 k8s 集群</h6><p>先安装 kubelet</p><pre><code>yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet
systemctl status kubelet</code></pre><p>如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:</p><pre><code>kubeadm token list</code></pre><p>默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:</p><pre><code>kubeadm token create
# 再查看
kubeadm token list</code></pre><p>如果你没有 <code>–discovery-token-ca-cert-hash</code> 的值,则可以通过在控制平面节点上执行以下命令链来获取它:</p><pre><code>openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'</code></pre><p>如果执行 <code>kubeadm init</code> 时没有记录下加入集群的命令,可以通过以下命令重新创建(推荐)一般不用上面的分别获取 token 和 ca-cert-hash 方式,执行以下命令一气呵成:</p><pre><code>kubeadm token create --print-join-command</code></pre><p>这里需要等待一段时间,再查看节点节点状态,因为需要安装 kube-proxy 和 flannel。</p><pre><code>kubectl get pods -A
kubectl get nodes</code></pre><p><img src="/img/remote/1460000042458873" alt="图片" title="图片"></p><h6>配置 IPVS</h6><p>【问题】集群内无法 ping 通 ClusterIP(或 ServiceName)</p><p>1、加载 ip_vs 相关内核模块</p><pre><code>modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr</code></pre><p>所有节点验证开启了 ipvs:</p><pre><code>lsmod |grep ip_vs</code></pre><p>2、安装 ipvsadm 工具</p><pre><code>yum install ipset ipvsadm -y</code></pre><p>3、编辑 kube-proxy 配置文件,mode 修改成 ipvs</p><pre><code>kubectl edit configmap -n kube-system kube-proxy</code></pre><p><img src="/img/remote/1460000042458874" alt="图片" title="图片"></p><p>4、重启 kube-proxy</p><pre><code># 先查看
kubectl get pod -n kube-system | grep kube-proxy
# 再delete让它自拉起
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
# 再查看
kubectl get pod -n kube-system | grep kube-proxy</code></pre><p><img src="/img/remote/1460000042458875" alt="图片" title="图片"></p><p>5、查看 ipvs 转发规则</p><pre><code>ipvsadm -Ln</code></pre><p><img src="/img/remote/1460000042458876" alt="图片" title="图片"></p><h6>集群高可用配置</h6><p>配置高可用(HA)Kubernetes 集群实现的<code>两种方案</code>:</p><ul><li>使用堆叠(stacked)控制平面节点,其中 etcd 节点与控制平面节点共存(本章使用),架构图如下:</li></ul><p><img src="/img/remote/1460000042458877" alt="图片" title="图片"></p><ul><li>使用外部 etcd 节点,其中 etcd 在与控制平面不同的节点上运行,架构图如下:</li></ul><p><img src="/img/remote/1460000042458878" alt="图片" title="图片"></p><p>这里新增一台机器作为另外一个 master 节点:192.168.0.116 配置跟上面 master 节点一样。只是不需要最后一步初始化了。</p><p>1、修改主机名和配置 hosts</p><p>所有节点都统一如下配置:</p><pre><code># 在192.168.0.113执行
hostnamectl set-hostname k8s-master-168-0-113
# 在192.168.0.114执行
hostnamectl set-hostname k8s-node1-168-0-114
# 在192.168.0.115执行
hostnamectl set-hostname k8s-node2-168-0-115
# 在192.168.0.116执行
hostnamectl set-hostname k8s-master2-168-0-116</code></pre><p>配置 hosts</p><pre><code>cat >> /etc/hosts<<EOF
192.168.0.113 k8s-master-168-0-113 cluster-endpoint
192.168.0.114 k8s-node1-168-0-114
192.168.0.115 k8s-node2-168-0-115
192.168.0.116 k8s-master2-168-0-116
EOF</code></pre><p>2、配置 ssh 互信</p><pre><code># 直接一直回车就行
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master-168-0-113
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1-168-0-114
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2-168-0-115
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master2-168-0-116</code></pre><p>3、时间同步</p><pre><code>yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources</code></pre><p>4、关闭防火墙</p><pre><code>systemctl stop firewalld
systemctl disable firewalld</code></pre><p>5、关闭 swap</p><pre><code># 临时关闭;关闭swap主要是为了性能考虑
swapoff -a
# 可以通过这个命令查看swap是否关闭了
free
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab</code></pre><p>6、禁用 SELinux</p><pre><code># 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config</code></pre><p>7、允许 iptables 检查桥接流量(可选,所有节点)</p><p>若要显式加载此模块,请运行 <code>sudo modprobe br_netfilter</code>,通过运行 <code>lsmod | grep br_netfilter</code> 来验证 br_netfilter 模块是否已加载,</p><pre><code>sudo modprobe br_netfilter
lsmod | grep br_netfilter</code></pre><p>为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 <code>net.bridge.bridge-nf-call-iptables</code> 设置为<code>1</code>。例如:</p><pre><code>cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system</code></pre><p>8、安装容器 docker(所有节点)</p><p>提示:v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。你可以阅读检查 Dockershim 弃用是否会影响你 以了解此删除可能会如何影响你。要了解如何使用 dockershim 进行迁移,请参阅从 dockershim 迁移。</p><pre><code># 配置yum源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# centos8
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# 安装yum-config-manager配置工具
yum -y install yum-utils
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本
yum install -y docker-ce
# 启动
systemctl start docker
# 开机自启
systemctl enable docker
# 查看版本号
docker --version
# 查看版本具体信息
docker version
# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 加载
systemctl reload docker
# 查看
systemctl status docker containerd</code></pre><p>【<strong>温馨提示</strong>】dockerd 实际真实调用的还是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之间的一个中间交流组件。所以启动 docker 服务的时候,也会启动 containerd 服务的。</p><p>9、配置 k8s yum 源(所有节点)</p><pre><code>cat > /etc/yum.repos.d/kubernetes.repo << EOF
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF</code></pre><p>10、将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)</p><pre><code># 导出默认配置,config.toml这个文件默认是不存在的
containerd config default > /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml</code></pre><p><img src="/img/remote/1460000042458879" alt="图片" title="图片"></p><p>11、配置 containerd cgroup 驱动程序 systemd</p><p>kubernets 自v 1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。因此需要安装 containerd(在 docker 的基础下安装),上面安装 docker 的时候就自动安装了 containerd 了。这里的 docker 只是作为客户端而已。容器引擎还是 containerd。</p><pre><code>sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 应用所有更改后,重新启动containerd
systemctl restart containerd
11、开始安装 kubeadm,kubelet 和 kubectl(master 节点)
# 不指定版本就是最新版本,当前最新版就是1.24.1
yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet
# 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
systemctl status kubelet
# 查看版本
kubectl version
yum info kubeadm</code></pre><p>12、加入 k8s 集群</p><pre><code># 证如果过期了,可以使用下面命令生成新证书上传,这里会打印出certificate key,后面会用到
kubeadm init phase upload-certs --upload-certs
# 你还可以在 【init】期间指定自定义的 --certificate-key,以后可以由 join 使用。 要生成这样的密钥,可以使用以下命令(这里不执行,就用上面那个自命令就可以了):
kubeadm certs certificate-key
kubeadm token create --print-join-command
kubeadm join cluster-endpoint:6443 --token wswrfw.fc81au4yvy6ovmhh --discovery-token-ca-cert-hash sha256:43a3924c25104d4393462105639f6a02b8ce284728775ef9f9c30eed8e0abc0f --control-plane --certificate-key 8d2709697403b74e35d05a420bd2c19fd8c11914eb45f2ff22937b245bed5b68
# --control-plane 标志通知 kubeadm join 创建一个新的控制平面。加入master必须加这个标记
# --certificate-key ... 将导致从集群中的 kubeadm-certs Secret 下载控制平面证书并使用给定的密钥进行解密。这里的值就是上面这个命令(kubeadm init phase upload-certs --upload-certs)打印出的key。</code></pre><p><img src="/img/remote/1460000042458880" alt="图片" title="图片"></p><p>根据提示执行如下命令:</p><pre><code>mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config</code></pre><p>查看</p><pre><code>kubectl get nodes
kubectl get pods -A -owide</code></pre><p><img src="/img/remote/1460000042458881" alt="图片" title="图片"></p><p>虽然现在已经有两个 master 了,但是对外还是只能有一个入口的,所以还得要一个负载均衡器,如果一个 master 挂了,会自动切到另外一个 master 节点。</p><h6>部署 Nginx+Keepalived 高可用负载均衡器</h6><p><img src="/img/remote/1460000042458882" alt="图片" title="图片"></p><p>1、安装 Nginx 和 Keepalived</p><pre><code># 在两个master节点上执行
yum install nginx keepalived -y</code></pre><p>2、Nginx 配置</p><p>在两个 master 节点配置</p><pre><code>cat > /etc/nginx/nginx.conf << "EOF"
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
# 四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
# Master APISERVER IP:PORT
server 192.168.0.113:6443;
# Master2 APISERVER IP:PORT
server 192.168.0.116:6443;
}
server {
listen 16443;
proxy_pass k8s-apiserver;
}
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80 default_server;
server_name _;
location / {
}
}
}
EOF</code></pre><p>【<strong>温馨提示</strong>】如果只保证高可用,不配置 k8s-apiserver 负载均衡的话,可以不装 nginx,但是最好还是配置一下 k8s-apiserver 负载均衡。</p><p>3、Keepalived 配置(master)</p><pre><code>cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from fage@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 100 # 优先级,备服务器设置 90
advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP
virtual_ipaddress {
192.168.0.120/24
}
track_script {
check_nginx
}
}
EOF</code></pre><p>vrrp_script:指定检查 nginx 工作状态脚本(根据 nginx 状态判断是否故障转移) virtual_ipaddress:虚拟 IP(VIP)</p><p>检查 nginx 状态脚本:</p><pre><code>cat > /etc/keepalived/check_nginx.sh << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
exit 1
else
exit 0
fi
EOF</code></pre><pre><code>chmod +x /etc/keepalived/check_nginx.sh</code></pre><p>4、Keepalived 配置(backup)</p><pre><code>cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from fage@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.120/24
}
track_script {
check_nginx
}
}
EOF</code></pre><p>检查 nginx 状态脚本:</p><pre><code>cat > /etc/keepalived/check_nginx.sh << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
exit 1
else
exit 0
fi
EOF</code></pre><pre><code>chmod +x /etc/keepalived/check_nginx.sh</code></pre><p>5、启动并设置开机启动</p><pre><code>systemctl daemon-reload
systemctl restart nginx && systemctl enable nginx && systemctl status nginx
systemctl restart keepalived && systemctl enable keepalived && systemctl status keepalived</code></pre><p>查看 VIP</p><pre><code>ip a</code></pre><p><img src="/img/remote/1460000042458883" alt="图片" title="图片"></p><p>6、修改 hosts(所有节点)</p><p>将 cluster-endpoint 之前执行的 ip 修改执行现在的 VIP</p><pre><code>192.168.0.113 k8s-master-168-0-113
192.168.0.114 k8s-node1-168-0-114
192.168.0.115 k8s-node2-168-0-115
192.168.0.116 k8s-master2-168-0-116
192.168.0.120 cluster-endpoint</code></pre><p>7、测试验证</p><p>查看版本(负载均衡测试验证)</p><pre><code>curl -k https://cluster-endpoint:16443/version</code></pre><p><img src="/img/remote/1460000042458884" alt="图片" title="图片"></p><p>高可用测试验证,将 k8s-master-168-0-113 节点关机</p><pre><code>shutdown -h now
curl -k https://cluster-endpoint:16443/version
kubectl get nodes -A
kubectl get pods -A</code></pre><p>【<strong>温馨提示</strong>】堆叠集群存在耦合失败的风险。如果一个节点发生故障,则 etcd 成员和控制平面实例都将丢失, 并且冗余会受到影响。你可以通过添加更多控制平面节点来降低此风险。</p><h2>k8s 管理平台 dashboard 环境部署</h2><h6>dashboard 部署</h6><p>GitHub 地址:<a href="https://link.segmentfault.com/?enc=GIat3kE%2Fga3LYqPvhkCzAQ%3D%3D.bj3LPcjTw4Tkv219ayDKCDBMRuO%2BU3%2BSNxyh8D21SysroMbqgx%2By7OXfWMAKrLnU" rel="nofollow">https://github.com/kubernetes...</a></p><pre><code>kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml
kubectl get pods -n kubernetes-dashboard</code></pre><p>但是这个只能内部访问,所以要外部访问,要么部署 ingress,要么就是设置 service NodePort 类型。这里选择 service 暴露端口。</p><pre><code>wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml</code></pre><p>修改后的内容如下:</p><pre><code># Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: v1
kind: Namespace
metadata:
name: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 31443
selector:
k8s-app: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kubernetes-dashboard
type: Opaque
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-csrf
namespace: kubernetes-dashboard
type: Opaque
data:
csrf: ""
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-key-holder
namespace: kubernetes-dashboard
type: Opaque
---
kind: ConfigMap
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-settings
namespace: kubernetes-dashboard
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
rules:
# Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
verbs: ["get", "update", "delete"]
# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["kubernetes-dashboard-settings"]
verbs: ["get", "update"]
# Allow Dashboard to get metrics.
- apiGroups: [""]
resources: ["services"]
resourceNames: ["heapster", "dashboard-metrics-scraper"]
verbs: ["proxy"]
- apiGroups: [""]
resources: ["services/proxy"]
resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
verbs: ["get"]
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
rules:
# Allow Metrics Scraper to get metrics from the Metrics server
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.6.0
imagePullPolicy: Always
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
# - --apiserver-host=http://my-address:port
volumeMounts:
- name: kubernetes-dashboard-certs
mountPath: /certs
# Create on-disk volume to store exec logs
- mountPath: /tmp
name: tmp-volume
livenessProbe:
httpGet:
scheme: HTTPS
path: /
port: 8443
initialDelaySeconds: 30
timeoutSeconds: 30
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: kubernetes-dashboard-certs
- name: tmp-volume
emptyDir: {}
serviceAccountName: kubernetes-dashboard
nodeSelector:
"kubernetes.io/os": linux
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
ports:
- port: 8000
targetPort: 8000
selector:
k8s-app: dashboard-metrics-scraper
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: dashboard-metrics-scraper
template:
metadata:
labels:
k8s-app: dashboard-metrics-scraper
spec:
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
- name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.8
ports:
- containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: 30
timeoutSeconds: 30
volumeMounts:
- mountPath: /tmp
name: tmp-volume
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
serviceAccountName: kubernetes-dashboard
nodeSelector:
"kubernetes.io/os": linux
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
volumes:
- name: tmp-volume
emptyDir: {}</code></pre><p><img src="/img/remote/1460000042458885" alt="图片" title="图片"></p><p>重新部署</p><pre><code>kubectl delete -f recommended.yaml
kubectl apply -f recommended.yaml
kubectl get svc,pods -n kubernetes-dashboard</code></pre><p><img src="/img/remote/1460000042458886" alt="图片" title="图片"></p><h6>创建登录用户</h6><pre><code>cat >ServiceAccount.yaml<<EOFapiVersion: v1kind: ServiceAccountmetadata:cat >ServiceAccount.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
kubectl apply -f ServiceAccount.yaml</code></pre><p>创建并获取登录 token</p><pre><code>kubectl -n kubernetes-dashboard create token admin-user</code></pre><h6>配置 hosts 登录 dashboard web</h6><p>192.168.0.120 cluster-endpoint</p><p>登录:<a href="https://link.segmentfault.com/?enc=6KLuWJ3JSN04hIKCzvNTlQ%3D%3D.R71ym2bGdR25Cor6b9UQ88rduC84lN8MuZAGb3kUZ38%3D" rel="nofollow">https://cluster-endpoint:31443</a><img src="/img/remote/1460000042458887" alt="图片" title="图片">输入上面创建的 token 登录<img src="/img/remote/1460000042458888" alt="图片" title="图片"></p><h2>k8s 镜像仓库 harbor 环境部署</h2><p>GitHub 地址:<a href="https://link.segmentfault.com/?enc=HM3XJcxFq3U%2Bsp6IiPNWWA%3D%3D.paKyc8trJccsaHzfnq12z62ptZ8VEqp4Gf7LhGEJGyFGgR7daAT6ei5v0gDVs9CI" rel="nofollow">https://github.com/helm/helm/...</a></p><p>这使用 helm 安装,所以得先安装 helm</p><h6>安装 helm</h6><pre><code>mkdir -p /opt/k8s/helm && cd /opt/k8s/helm
wget https://get.helm.sh/helm-v3.9.0-rc.1-linux-amd64.tar.gz
tar -xf helm-v3.9.0-rc.1-linux-amd64.tar.gz
ln -s /opt/k8s/helm/linux-amd64/helm /usr/bin/helm
helm version
helm help</code></pre><h6>配置 hosts</h6><pre><code>192.168.0.120 myharbor.com</code></pre><h6>创建 stl 证书</h6><pre><code>mkdir /opt/k8s/helm/stl && cd /opt/k8s/helm/stl
# 生成 CA 证书私钥
openssl genrsa -out ca.key 4096
# 生成 CA 证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \
-key ca.key \
-out ca.crt
# 创建域名证书,生成私钥
openssl genrsa -out myharbor.com.key 4096
# 生成证书签名请求 CSR
openssl req -sha512 -new \
-subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \
-key myharbor.com.key \
-out myharbor.com.csr
# 生成 x509 v3 扩展
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=myharbor.com
DNS.2=*.myharbor.com
DNS.3=hostname
EOF
#创建 Harbor 访问证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in myharbor.com.csr \
-out myharbor.com.crt</code></pre><h6>安装 ingress</h6><ul><li>ingress 官方网站:<a href="https://link.segmentfault.com/?enc=%2FVvenDWIKJaCIngEQcKtew%3D%3D.RX9GYqDT7F1S%2BIhXuuX%2FzrWqtHj%2BSiteJAhdNxfkCySUCTUsbKecqZ4rvzSQYNK5" rel="nofollow">https://kubernetes.github.io/...</a></li><li>ingress 仓库地址:<a href="https://link.segmentfault.com/?enc=%2BKxds5eRJ6ddmjVkCRaKDw%3D%3D.JsB8LphZ2XhOvgcYL4qJfkn5vWZu853YSrBbAMi4DYH2AGTGJU1UtlmDwlMJeBy3" rel="nofollow">https://github.com/kubernetes...</a></li><li>部署文档:<a href="https://link.segmentfault.com/?enc=cAqWLVsmgQMT2qnaVsPpfg%3D%3D.KR4HnJ3VvaXOGkTcAQzjBd%2Bkd%2BcMMV78Ln8Fr022d5K5RMvV9Wbbcv4o66ltzFmOMN9dqCrLGhD6jFLSoGsvCQ%3D%3D" rel="nofollow">https://kubernetes.github.io/...</a></li></ul><p>1、通过 helm 部署</p><pre><code>helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace</code></pre><p>2、通过 YAML 文件安装(本章使用这个方式安装 ingress)</p><pre><code>kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml</code></pre><p>如果下载镜像失败,可以用以下方式修改镜像地址再安装</p><pre><code># 可以先把镜像下载,再安装
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
# 修改镜像地址
sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.2.0\(.*\)@registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0@' deploy.yaml
sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1\(.*\)$@registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@' deploy.yaml
###还需要修改两地方
#1、kind: 类型修改成DaemonSet,replicas: 注销掉,因为DaemonSet模式会每个节点运行一个pod
#2、在添加一条:hostnetwork:true
#3、把LoadBalancer修改成NodePort
#4、在--validating-webhook-key下面添加- --watch-ingress-without-class=true
#5、设置master节点可调度
kubectl taint nodes k8s-master-168-0-113 node-role.kubernetes.io/control-plane:NoSchedule-
kubectl taint nodes k8s-master2-168-0-116 node-role.kubernetes.io/control-plane:NoSchedule-
kubectl apply -f deploy.yaml</code></pre><p><img src="/img/remote/1460000042458889" alt="图片" title="图片"></p><h6>安装 nfs</h6><p>1、所有节点安装 nfs</p><pre><code>yum -y install nfs-utils rpcbind</code></pre><p>2、在 master 节点创建共享目录并授权</p><pre><code>mkdir /opt/nfsdata
# 授权共享目录
chmod 666 /opt/nfsdata</code></pre><p>3、配置 exports 文件</p><pre><code>cat > /etc/exports<<EOF
/opt/nfsdata *(rw,no_root_squash,no_all_squash,sync)
EOF
# 配置生效
exportfs -r
exportfs 命令</code></pre><p>常用选项</p><pre><code>-a 全部挂载或者全部卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享目录 以下操作在服务端上</code></pre><p>4、启动 rpc 和 nfs(客户端只需要启动 rpc 服务)(注意顺序)</p><pre><code>systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server</code></pre><p>查看</p><pre><code>showmount -e
# VIP
showmount -e 192.168.0.120
-e #显示 NFS 服务器的共享列表
-a #显示本机挂载的文件资源的情况 NFS 资源的情况
-v #显示版本号</code></pre><p>5、客户端</p><pre><code># 安装
yum -y install nfs-utils rpcbind
# 启动rpc服务
systemctl start rpcbind
systemctl enable rpcbind
# 创建挂载目录
mkdir /mnt/nfsdata
# 挂载
echo "192.168.0.120:/opt/nfsdata /mnt/nfsdata nfs defaults 0 1">> /etc/fstab
mount -a</code></pre><p>6、rsync 数据同步</p><p>【1】rsync 安装</p><pre><code># 两端都得安装
yum -y install rsync</code></pre><p>【2】配置,在/etc/rsyncd.conf 中添加</p><pre><code>cat >/etc/rsyncd.conf<<EOF
uid = root
gid = root
#禁锢在源目录
use chroot = yes
#监听地址
address = 192.168.0.113
#监听地址tcp/udp 873,可通过cat /etc/services | grep rsync查看
port 873
#日志文件位置
log file = /var/log/rsyncd.log
#存放进程 ID 的文件位置
pid file = /var/run/rsyncd.pid
#允许访问的客户机地址
hosts allow = 192.168.0.0/16
#共享模块名称
[nfsdata]
#源目录的实际路径
path = /opt/nfsdata
comment = Document Root of www.kgc.com
#指定客户端是否可以上传文件,默认对所有模块为 true
read only = yes
#同步时不再压缩的文件类型
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
#授权账户,多个账号以空格分隔,不加则为匿名,不依赖系统账号
auth users = backuper
#存放账户信息的数据文件
secrets file = /etc/rsyncd_users.db
EOF</code></pre><p>配置 rsyncd\_users.db</p><pre><code>cat >/etc/rsyncd_users.db<<EOF
backuper:123456
EOF
#官方要求,最好只是赋权600!
chmod 600 /etc/rsyncd_users.db</code></pre><p>【3】rsyncd.conf 常用参数详解<img src="/img/remote/1460000042458890" alt="图片" title="图片"></p><p>【4】rsync 常用命令参数详解</p><pre><code>rsync --help
rsync [选项] 原始位置 目标位置
常用选项 说明
-r 递归模式,包含目录及子目录中的所有文件
-l 对于符号链接文件仍然复制为符号链接文件
-v 显示同步过程的详细信息
-z 在传输文件时进行压缩goD
-p 保留文件的权限标记
-a 归档模式,递归并保留对象属性,等同于-rlpt
-t 保留文件的时间标记
-g 保留文件的属组标记(仅超级用户使用)
-o 保留文件的属主标记(仅超级用户使用)
-H 保留硬链接文件
-A 保留ACL属性信息
-D 保留设备文件及其他特殊文件
--delete 删除目标位置有而原始位置没有的文件
--checksum 根据对象的校验和来决定是否跳过文件</code></pre><p>【5】启动服务(数据源机器)</p><pre><code>#rsync监听端口:873
#rsync运行模式:C/S
rsync --daemon --config=/etc/rsyncd.conf
netstat -tnlp|grep :873</code></pre><p>【6】执行命令同步数据</p><pre><code># 在目的机器上执行
# rsync -avz 用户名@源主机地址/源目录 目的目录
rsync -avz root@192.168.0.113:/opt/nfsdata/* /opt/nfsdata/
【7】crontab 定时同步
# 配置crontab, 每五分钟同步一次,这种方式不好
*/5 * * * * rsync -avz root@192.168.0.113:/opt/nfsdata/* /opt/nfsdata/</code></pre><p>【温馨提示】crontab 定时同步数据不太好,可以使用rsync+inotify做数据实时同步,这里篇幅有点长了,先不讲,如果后面有时间会出一篇单独文章来讲。</p><h6>创建 nfs provisioner 和持久化存储 SC</h6><p>【温馨提示】这里跟我之前的文章有点不同,之前的方式也不适用新版本。</p><p>GitHub 地址:<a href="https://link.segmentfault.com/?enc=ExDlvN79WnF%2BYBu1OiqqcA%3D%3D.F7VB6cmFPz%2FniuROEpRBz4x6BKerdd8LW8xVoHKVienqtU%2FHwZbT0NyTi%2Br8PGORNuN12TxGs3V1ruHz39yTeJs52%2FPkSM%2FoVoS39WZ1y60%3D" rel="nofollow">https://github.com/kubernetes...</a></p><p>helm 部署 nfs-subdir-external-provisioner</p><p>1、添加 helm 仓库</p><pre><code>helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/</code></pre><p>2、helm 安装 nfs provisioner</p><p>【温馨提示】默认镜像是无法访问的,这里使用 dockerhub 搜索到的镜像willdockerhub/nfs-subdir-external-provisioner:v4.0.2,还有就是 StorageClass 不分命名空间,所有在所有命名空间下都可以使用。</p><pre><code>helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--namespace=nfs-provisioner \
--create-namespace \
--set image.repository=willdockerhub/nfs-subdir-external-provisioner \
--set image.tag=v4.0.2 \
--set replicaCount=2 \
--set storageClass.name=nfs-client \
--set storageClass.defaultClass=true \
--set nfs.server=192.168.0.120 \
--set nfs.path=/opt/nfsdata</code></pre><p>【温馨提示】上面 nfs.server 设置为 VIP,可实现高可用。</p><p>3、查看</p><pre><code>kubectl get pods,deploy,sc -n nfs-provisioner</code></pre><h6>部署 Harbor(Https 方式)</h6><p>1、创建 Namespace</p><pre><code>kubectl create ns harbor</code></pre><p>2、创建证书秘钥</p><pre><code>kubectl create secret tls myharbor.com --key myharbor.com.key --cert myharbor.com.crt -n harbor
kubectl get secret myharbor.com -n harbor</code></pre><p>3、添加 Chart 库</p><pre><code>helm repo add harbor https://helm.goharbor.io</code></pre><p>4、通过 helm 安装 harbor</p><pre><code>helm install myharbor --namespace harbor harbor/harbor \
--set expose.ingress.hosts.core=myharbor.com \
--set expose.ingress.hosts.notary=notary.myharbor.com \
--set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \
--set expose.tls.secretName=myharbor.com \
--set persistence.persistentVolumeClaim.registry.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.jobservice.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.database.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.redis.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.trivy.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client \
--set persistence.enabled=true \
--set externalURL=https://myharbor.com \
--set harborAdminPassword=Harbor12345</code></pre><p>这里稍等一段时间在查看资源状态</p><pre><code>kubectl get ingress,svc,pods,pvc -n harbor</code></pre><p><img src="/img/remote/1460000042458891" alt="图片" title="图片"></p><p>5、ingress 没有 ADDRESS 问题解决</p><p>【分析】,发现"error: endpoints “default-http-backend” not found"</p><pre><code>cat << EOF > default-http-backend.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: default-http-backend
labels:
app: default-http-backend
namespace: harbor
spec:
replicas: 1
selector:
matchLabels:
app: default-http-backend
template:
metadata:
labels:
app: default-http-backend
spec:
terminationGracePeriodSeconds: 60
containers:
- name: default-http-backend
# Any image is permissible as long as:
# 1. It serves a 404 page at /
# 2. It serves 200 on a /healthz endpoint
image: registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.4
# image: gcr.io/google_containers/defaultbackend:1.4
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
ports:
- containerPort: 8080
resources:
limits:
cpu: 10m
memory: 20Mi
requests:
cpu: 10m
memory: 20Mi
---
apiVersion: v1
kind: Service
metadata:
name: default-http-backend
namespace: harbor
labels:
app: default-http-backend
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: default-http-backend
EOF
kubectl apply -f default-http-backend.yaml</code></pre><p>6、卸载重新部署</p><pre><code># 卸载
helm uninstall myharbor -n harbor
kubectl get pvc -n harbor| awk 'NR!=1{print $1}' | xargs kubectl delete pvc -n harbor
# 部署
helm install myharbor --namespace harbor harbor/harbor \
--set expose.ingress.hosts.core=myharbor.com \
--set expose.ingress.hosts.notary=notary.myharbor.com \
--set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \
--set expose.tls.secretName=myharbor.com \
--set persistence.persistentVolumeClaim.registry.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.jobservice.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.database.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.redis.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.trivy.storageClass=nfs-client \
--set persistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client \
--set persistence.enabled=true \
--set externalURL=https://myharbor.com \
--set harborAdminPassword=Harbor12345</code></pre><p><img src="/img/remote/1460000042458892" alt="图片" title="图片"></p><p>5、访问 harbor</p><p><a href="https://link.segmentfault.com/?enc=onFXiFKRyuzW1dKnlbOxag%3D%3D.jjZHJPftPorj4gz04Pfq8zY0kcL5VBo%2FgzIJk4EnN7g%3D" rel="nofollow">https://myharbor.com</a></p><p>账号/密码:admin/Harbor12345<img src="/img/remote/1460000042458893" alt="图片" title="图片"></p><p>6、harbor 常见操作</p><p>【1】创建项目 bigdata<img src="/img/remote/1460000042458894" alt="图片" title="图片"></p><p>【2】配置私有仓库,在文件/etc/docker/daemon.json添加如下内容:</p><pre><code>"insecure-registries":["https://myharbor.com"]</code></pre><p>重启 docker</p><pre><code>systemctl restart docker</code></pre><p>【3】服务器上登录 harbor</p><p>docker login <a href="https://link.segmentfault.com/?enc=Xb56OOymcRs4b0tMs5nRoA%3D%3D.3V5jAgY26GsuFtGWkrr%2BAALOyR5MHc90cdE%2FZrUvgGQ%3D" rel="nofollow">https://myharbor.com</a> #账号/密码:admin/Harbor12345</p><p><img src="/img/remote/1460000042458895" alt="图片" title="图片"></p><p>【4】打标签并把镜像上传到 harbor</p><pre><code>docker tag rancher/pause:3.6 myharbor.com/bigdata/pause:3.6
docker push myharbor.com/bigdata/pause:3.6</code></pre><p>7、修改 containerd 配置</p><p>以前使用 docker-engine 的时候,只需要修改/etc/docker/daemon.json 就行,但是新版的 k8s 已经使用 containerd 了,所以这里需要做相关配置,要不然 containerd 会失败。证书(ca.crt)可以在页面上下载:</p><p><img src="/img/remote/1460000042458896" alt="图片" title="图片"></p><p>创建域名目录</p><pre><code>mkdir /etc/containerd/myharbor.com
cp ca.crt /etc/containerd/myharbor.com/</code></pre><p>配置文件:/etc/containerd/config.toml</p><pre><code>[plugins."io.containerd.grpc.v1.cri".registry]
config_path = ""
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".tls]
ca_file = "/etc/containerd/myharbor.com/ca.crt"
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".auth]
username = "admin"
password = "Harbor12345"
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor.com"]
endpoint = ["https://myharbor.com"]</code></pre><p><img src="/img/remote/1460000042458897" alt="图片" title="图片"></p><p>重启 containerd</p><pre><code>#重新加载配置
systemctl daemon-reload
#重启
containerdsystemctl restart containerd</code></pre><p>简单使用</p><pre><code># 把docker换成crictl 就行,命令都差不多
crictl pull myharbor.com/bigdata/mysql:5.7.38</code></pre><p>执行 crictl 报如下错误的解决办法</p><pre><code>WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.ERRO[0000] unable to determine image API version: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"</code></pre><p>这个报错是 docker 的报错,这里没使用,所以这个错误不影响使用,但是还是解决好点,解决方法如下:</p><pre><code>cat <<EOF> /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF</code></pre><p>再次拉取镜像</p><pre><code>crictl pull myharbor.com/bigdata/mysql:5.7.38</code></pre><p><img src="/img/remote/1460000042458898" alt="图片" title="图片"></p><p>Kubernetes(k8s)最新版最完整版基础环境部署+master 高可用实现详细步骤就到这里了,有疑问的小伙伴欢迎给我留言哦~</p><p><em>链接:cnblogs.com/liugp/p/16345473.html</em></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
无需安装、注册,一行命令搞定内网穿透!关键是完全免费
https://segmentfault.com/a/1190000041921943
2022-05-31T15:14:54+08:00
2022-05-31T15:14:54+08:00
民工哥
https://segmentfault.com/u/jishuroad
13
<p>内网穿透,即NAT穿透,网络连接时术语。外网与内网的计算机节点需要连接通信,映射端口能让外网的电脑找到处于内网的电脑,提高下载速度。</p><h2>内网穿透的应用场景</h2><h6>web 应用开发</h6><p>向外网发布开发的一些web demo,或者远程调试 API 接口 (如:微信公众号,企业号的开发)</p><h6>内网应用的访问</h6><p>公司内网部署的应用、数据库等,人员出差、或者临时外出,需要远程访问、连接调试等情况。</p><h6>远程操控硬件设备</h6><p>物联网设备开发、调试</p><p>今天就给大家介绍一款更牛逼的神器:serveo</p><p>牛逼之处就在于它无需下载安装任何的软件,一条命令搞定!,更重要的是它完全免费!</p><h2>Serveo概述</h2><p>Serveo 是一个免费的内网穿透服务,Serveo 可以将本地计算机暴露在互联网上,官方称其为 Ngrok 的绝佳替代品。</p><p>serveo 最大优点是:<strong>无需安装、无需注册</strong>、利用SSH隧道即可直接使用。</p><p><img src="/img/remote/1460000041921945" alt="" title=""></p><h2>Serveo工作原理</h2><p>Serveo SSH 服务器只是远程端口转发,当用户连接到 Serveo 时,他们得到一个公共URL,任何人都可以使用连接到 localhost 服务器。</p><p>项目地址: <a href="https://link.segmentfault.com/?enc=DAttmr4BZahm2oJc%2FBnUjQ%3D%3D.QBhdlwPlYLVuUSBNuxQKWiAqcO6ZrHWiYttKhkwhQ3Q%3D" rel="nofollow">https://serveo.net</a></p><h2>安装说明</h2><p>无需安装,开箱即用。</p><h6>服务器前提</h6><p>需要具备SSH功能,并且能正常链接互联网。</p><h2>Serveo 使用实践</h2><h6>将本地应用(HTTP服务)的 3000 端口映射到公网中</h6><p>将本地应用的3000端口映射到公网中</p><pre><code># 如果要转发其它端口,只需替换端口为其它就可以了
$ ssh -R 80:localhost:3000 serveo.net
Hi there
Forwarding HTTP traffic from https://heryum.serveo.net
Press g to start a GUI session and ctrl-c to quit.</code></pre><p>第一次使用会提示建立SSH会话,请输入yes确定。</p><p>建立会话成功后,它会随机生成一个 xx.serveo.net 二级域名。你就可以使用浏览器访问这个随机生成的二级域名 heryum.serveo.net 去访问到本地计算机 3000 端口上的服务了。</p><p>也可以不使用这个随机生成的域名,你可以自定义一个自己习惯的二级域名,也是可以的,具体操作步骤如下:</p><pre><code>$ ssh -R mingongge:80:localhost:3000 serveo.net
Hi there
Forwarding HTTP traffic from https://mingongge.serveo.net
Press g to start a GUI session and ctrl-c to quit.
...
# 这个自定义二级域名可以简写,也可以写完整的,如:
$ ssh -R mingongge.serveo.net:80:localhost:8080 serveo.net</code></pre><h6>2、将本地 22 端口穿透到公网中</h6><p>远程访问本地的ssh服务其实很简单,只需要使用下面的命令即可。</p><pre><code># 名称为自定义的,这里设置为 mingongge
$ ssh -R mingongge:22:localhost:22 serveo.net
Hi there
Forwarding SSH traffic from alias "mingongge"
Press g to start a GUI session and ctrl-c to quit.
...</code></pre><p>连接成功后,接下来你就可以从公网上对这个内网计算机的 SSH 进行访问了。</p><pre><code>$ ssh -J serveo.net user_name@mingongge
Hi there
user_name@mingongge's password:
Last login: Sun 29 May 23:08:12 2022 from 127.0.0.1
...</code></pre><p>-J 选项是用在 OpenSSH 7.3 及以上版本中,如果你的 SSH 客户端版本较低,可以使用 ProxyCommand 来替代。</p><pre><code>$ ssh -o ProxyCommand="ssh -W mingongge:22 serveo.net" user_name@mingongge</code></pre><p><strong>注</strong>:如果你无法通过 22 端口访问 Serveo 服务,官方还预留了 443 端口,具体更改如下:</p><pre><code>$ ssh -p 443 -R 80:localhost:3000 serveo.net</code></pre><h6>Windows 系统使用</h6><p>Win10 默认自带 OpenSSH ,其它Window系统的话,需要大家去 OpenSSH 的 Github 上下载安装,具体的安装方式上面都有,这里不介绍了。</p><p>如果你的 Win10 系统 cmd 无法识别 ssh 命令,可能是你的系统此功能未启用,需要手工配置启用一下。</p><h6>启用步骤如下</h6><p>设置---应用、可选功能---添加可选功能</p><p><img src="/img/remote/1460000041921946" alt="" title=""></p><p>点击“添加功能”按钮,在可选功能列表中看到“ OpenSSH 服务器”,选中它,点击“安装”</p><p><img src="/img/remote/1460000041921947" alt="" title=""></p><p><img src="/img/remote/1460000041921948" alt="" title=""></p><p>安装成功之后,在cmd命令提示符窗口中即可运行ssh命令。</p><p><img src="/img/remote/1460000041921949" alt="" title=""></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
跨域问题很难吗?来!教你使用 Nginx 反向代理轻松解决
https://segmentfault.com/a/1190000041794241
2022-05-05T15:04:45+08:00
2022-05-05T15:04:45+08:00
民工哥
https://segmentfault.com/u/jishuroad
12
<p>当你遇到跨域问题,不要立刻就选择复制去尝试。请详细看完这篇文章再处理,我相信它能帮到你。</p><h2>准备</h2><ul><li>前端网站地址:<a href="https://link.segmentfault.com/?enc=Dj%2FZ%2B9bLzwxjknCJfjlRbw%3D%3D.hNvmS9ssy5fwyUwTEz0bUua9jinobOfhYR%2F7jFRZaXw%3D" rel="nofollow">http://localhost:8080</a></li><li>服务端网址:<a href="https://link.segmentfault.com/?enc=M2%2FFhI20%2BFawgbfRCZM5AA%3D%3D.erdSBpc8pNKk7q74JfFaJtBOhFb6RyMS5F21BgiZr%2FA%3D" rel="nofollow">http://localhost:59200</a></li></ul><p>首先保证服务端是没有处理跨域的,其次,先用postman测试服务端接口是正常的</p><p><img src="/img/remote/1460000041794243" alt="图片" title="图片"></p><p>当网站8080去访问服务端接口时,就产生了跨域问题,那么如何解决?接下来我把跨域遇到的各种情况都列举出来并通过nginx代理的方式解决(后台也是一样的,只要你理解的原理)。</p><h2>跨域主要涉及4个响应头</h2><ul><li>Access-Control-Allow-Origin 用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证)</li><li>Access-Control-Allow-Headers 跨域允许携带的特殊头信息字段 (只在预检请求验证)</li><li>Access-Control-Allow-Methods 跨域允许的请求方法或者说HTTP动词 (只在预检请求验证)</li><li>Access-Control-Allow-Credentials 是否允许跨域使用cookies,如果要跨域使用cookies,可以添加上此请求响应头,值设为true(设置或者不设置,都不会影响请求发送,只会影响在跨域时候是否要携带cookies,但是如果设置,预检请求和正式请求都需要设置)。不过不建议跨域使用(项目中用到过,不过不稳定,有些浏览器带不过去),除非必要,因为有很多方案可以代替。</li></ul><p>网上很多文章都是告诉你直接Nginx添加这几个响应头信息就能解决跨域,当然大部分情况是能解决,但是我相信还是有很多情况,明明配置上了,也同样会报跨域问题。</p><h2>什么是预检请求?</h2><p>当发生跨域条件时候,览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。如下图</p><p><img src="/img/remote/1460000041794244" alt="图片" title="图片"></p><h2>模拟</h2><p>Nginx代理端口:22222 ,配置如下</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
proxy_pass http://localhost:59200;
}
}</code></pre><p>测试代理是否成功,通过Nginx代理端口2222再次访问接口,可以看到如下图通过代理后接口也是能正常访问</p><p><img src="/img/remote/1460000041794245" alt="图片" title="图片"></p><p>接下来开始用网站8080访问Nginx代理后的接口地址,报错情况如下↓↓↓</p><h6>情况1</h6><pre><code>Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.</code></pre><p><img src="/img/remote/1460000041794246" alt="图片" title="图片"></p><p>通过错误信息可以很清晰的定位到错误(注意看标红部分)priflight说明是个预请求,CORS 机制跨域会首先进行 preflight(一个 OPTIONS 请求), 该请求成功后才会发送真正的请求。这一设计旨在确保服务器对 CORS 标准知情,以保护不支持 CORS 的旧服务器</p><p>通过错误信息,我们可以得到是预检请求的请求响应头缺少了 Access-Control-Allow-Origin,错哪里,我们改哪里就好了。修改Nginx配置信息如下(红色部分为添加部分),缺什么就补什么,很简单明了</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
add_header Access-Control-Allow-Origin 'http://localhost:8080';
proxy_pass http://localhost:59200;
}
}</code></pre><p>哈哈,当满怀欢喜的以为能解决后,发现还是报了同样的问题</p><p><img src="/img/remote/1460000041794246" alt="图片" title="图片"></p><p>不过我们的配置没什么问题,问题在Nginx,下图链接<a href="https://link.segmentfault.com/?enc=vucdbFDy%2FU8Hq4Fl%2FodQpQ%3D%3D.c9lGAP0qnp8eGQ3Cga%2BIRT5FJbx56zqfAXB6sUt3cjOrCcsJ4ExhRdkK3Gcb3lqrw7qtryyS5rxl4b8e%2FDVcqA%3D%3D" rel="nofollow">http://nginx.org/en/docs/http...</a></p><p><img src="/img/remote/1460000041794247" alt="图片" title="图片"></p><p><code>add_header</code> 指令用于添加返回头字段,当且仅当状态码为图中列出的那些时有效。如果想要每次响应信息都携带头字段信息,需要在最后添加always(经我测试,只有Access-Control-Allow-Origin这个头信息需要加always,其他的不加always也会携带回来),那我们加上试试</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
proxy_pass http://localhost:59200;
}
}</code></pre><p>修改了配置后,发现生效了,当然不是跨域就解决了,是上面这个问题已经解决了,因为报错内容已经变了</p><h6>情况2</h6><pre><code>Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.</code></pre><p><img src="/img/remote/1460000041794248" alt="图片" title="图片"></p><p>通过报错信息提示可以得知,是跨域浏览器默认行为的预请求(option请求)没有收到ok状态码,此时再修改配置文件,当请求为option请求时候,给浏览器返回一个状态码(一般是204)</p><pre><code> server {
listen 22222;
server_name localhost;
location / {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://localhost:59200;
}
}</code></pre><p>当配置完后,发现报错信息变了</p><h6>情况3</h6><pre><code>Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response.</code></pre><p><img src="/img/remote/1460000041794249" alt="图片" title="图片"></p><p>意思就是预请求响应头Access-Control-Allow-Headers中缺少头信息authorization(各种情况会不一样,在发生跨域后,在自定义添加的头信息是不允许的,需要添加到请求响应头Access-Control-Allow-Headers中,以便浏览器知道此头信息的携带是服务器承认合法的,我这里携带的是authorization,其他的可能是token之类的,缺什么加什么),知道了问题所在,然后修改配置文件,添加对应缺少的部分,再试试</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Headers 'authorization'; #为什么写在if里面而不是接着Access-Control-Allow-Origin往下写?因为这里只有预检请求才会检查
return 204;
}
proxy_pass http://localhost:59200;
}
}</code></pre><p>此时发现报错问题又回到了情况1</p><p><img src="/img/remote/1460000041794250" alt="图片" title="图片"></p><p>经测试验证,只要<code>if ($request_method = 'OPTIONS')</code> 里面写了 <code>add_header</code> ,当为预检请求时外部配置的都会失效,为什么?↓↓。</p><p>官方文档是这样说的:</p><p>There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.</p><p>意思就是当前层级无 add_header 指令时,则继承上一层级的add_header。相反的若当前层级有了add_header,就应该无法继承上一层的add_header。</p><p><img src="/img/remote/1460000041794251" alt="图片" title="图片"></p><p>配置修改如下:</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080';
add_header Access-Control-Allow-Headers 'authorization';
return 204;
}
proxy_pass http://localhost:59200;
}
}</code></pre><p>此时改完发现跨域问题已经解决了,</p><p><img src="/img/remote/1460000041794252" alt="图片" title="图片"></p><p>不过以上虽然解决了跨域问题,但是考虑后期可能Nginx版本更新,不知道这个规则会不会被修改,考虑到这样的写法可能会携带上两个 Access-Control-Allow-Origin ,这种情况也是不允许的,下面会说到。所以配置适当修改如下:</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080';
add_header Access-Control-Allow-Headers 'authorization';
return 204;
}
if ($request_method != 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
}
proxy_pass http://localhost:59200;
}
}</code></pre><p>还没完,继续聊 ↓↓</p><h6>情况4:</h6><p>比较早期的API可能只用到了POST和GET请求,而Access-Control-Allow-Methods这个请求响应头跨域默认只支持POST和GET,当出现其他请求类型时候,同样会出现跨域异常。</p><p>比如,我这里将请求的API接口请求方式从原来的GET改成PUT,在发起一次试试。在控制台上会抛出错误:</p><pre><code>Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.</code></pre><p><img src="/img/remote/1460000041794253" alt="图片" title="图片"></p><p>报错内容也讲的很清楚,在这个预请求中,PUT方法是不允许在跨域中使用的,我们需要改下Access-Control-Allow-Methods的配置(缺什么加上么,这里我只加了PUT,可以自己加全一点),让浏览器知道服务端是允许的</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080';
add_header Access-Control-Allow-Headers 'content-type,authorization';
add_header Access-Control-Allow-Methods 'PUT';#为这么只加在这个if中,不再下面的if也加上?因为这里只有预检请求会校验,当然你加上也没事。
return 204;
}
if ($request_method != 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
}
proxy_pass http://localhost:59200;
}
}</code></pre><p>这里注意一下,改成PUT类型后,Access-Control-Allow-Headers请求响应头又会自动校验content-type这个请求头,和情况3是一样的,缺啥补啥就行了。如果不加上content-type,则会报如下错误。(想简单的话,Access-Control-Allow-Headers和Access-Control-Allow-Methods可以设置为 * ,表示全都匹配。但是Access-Control-Allow-Origin就不建议设置成 * 了,为了安全考虑,限制域名是很有必要的。)</p><p><img src="/img/remote/1460000041794254" alt="图片" title="图片"></p><p>都加上后,问题就解决了,这里报405是我服务端这个接口只开放了GET,没有开放PUT,而此刻我将此接口用PUT方法去请求,所以接口会返回这个状态码。</p><p><img src="/img/remote/1460000041794255" alt="图片" title="图片"></p><h6>情况5:</h6><p>最后再说一种情况,就是后端处理了跨域,就不需要自己在处理了(这里吐槽下,某些后端工程师自己改服务端代码解决跨域,但是又不理解其中原理,网上随便找段代码黏贴,导致响应信息可能处理不完全,如method没添加全,headers没加到点上,自己用的那个可能复制过来的并不包含实际项目所用到的,没有添加options请求返回状态码等,导致Nginx再用通用的配置就会可能报以下异常)</p><pre><code>Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost:8080', but only one is allowed.</code></pre><p><img src="/img/remote/1460000041794256" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041794257" alt="图片" title="图片"></p><p>意思就是此刻Access-Control-Allow-Origin请求响应头返回了多个,而只允许有一个,这种情况当然修改配置去掉Access-Control-Allow-Origin这个配置就可以了,不过遇到这种情况,建议Nginx配置和服务端自己解决跨域只选其一。(这里注意如果按我上面的写法,if $request_method = 'OPTIONS' 这个里面的Access-Control-Allow-Origin可不能删除,删除!='OPTIONS'里面的就好了,因为这里如果是预检请求直接就ruturn了,请求不会再转发到59200服务,如果也删除了,就会报和情况1一样的错误。所以为什么说要不服务端代码层面解决跨域,要不就Nginx代理解决,不要混着搞,不然不明白原理的人,网上找一段代码贴就很可能解决不了问题)</p><p>再贴一份完整配置(*号根据自己‘喜好’填写):</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080';
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Methods '*';
add_header Access-Control-Allow-Credentials 'true';
return 204;
}
if ($request_method != 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
add_header Access-Control-Allow-Credentials 'true';
}
proxy_pass http://localhost:59200;
}
}</code></pre><p>或者:</p><pre><code>server {
listen 22222;
server_name localhost;
location / {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Methods '*';
add_header Access-Control-Allow-Credentials 'true';
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://localhost:59200;
}
}</code></pre><p>最后,这是一篇解决跨域遇到问题解决问题的过程,如果认真看完了,我相信应该都能很容易的理解,并且在实际使用中自己解决该问题,希望能帮助到大家,以上内容都是自己理解自己测试码出来的,如有理解不对的地方,望大家指正。</p><blockquote>来源:cnblogs.com/fnz0/p/15803011.html</blockquote><p><strong>如果本文对你有帮助的话,欢迎</strong>点赞&转发<strong>,这对我继续分享&创作优质文章非常重要。感谢🙏🏻</strong></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
互联网后端技术大全!建议收藏
https://segmentfault.com/a/1190000041794118
2022-05-05T14:56:19+08:00
2022-05-05T14:56:19+08:00
民工哥
https://segmentfault.com/u/jishuroad
22
<p>工欲善其事,必先利其器;士欲宣其义,必先读其书。后台开发作为互联网技术领域的掌上明珠,一直都是开发者们的追逐的高峰。本文将从后台开发所涉及到的技术术语出发,基于系统开发、架构设计、网络通信等几个方面让大家对后台开发有一个清晰的了解,讲解全面易懂。</p><h2>系统开发</h2><h6>1. 高内聚/低耦合</h6><p>高内聚指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。模块的内聚反映模块内部联系的紧密程度。</p><p>模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。一个完整的系统,模块与模块之间,尽可能的使其独立存在。通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。</p><h6>2. 过度设计</h6><p>过度设计就是进行了过多的面向未来的设计或者说把相对简单的事情想复杂了,过度追求模块化、可扩展性、设计模式等,为系统增加了不必要的复杂度。</p><h6>3. 过早优化</h6><p>过早指的不是在开发过程的早期,而是在还没弄清楚需求未来的变化的走向的时候。你的优化不仅可能导致你无法很好地实现新的需求,而且你对优化的预期的猜测有可能还是错的,导致实际上你除了把代码变复杂以外什么都没得到。</p><p>正确的方法是,先有质量地实现你的需求,写够testcase,然后做profile去找到性能的瓶颈,这个时候才做优化。</p><h6>4. 重构 (Refactoring)</h6><p>重构(Refactoring)就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。</p><h6>5. 破窗效应</h6><p>又称破窗理论,破窗效应(Broken windows theory)是犯罪学的一个理论。此理论认为环境中的不良现象如果被放任存在,会诱使人们仿效,甚至变本加厉。一幢有少许破窗的建筑为例,如果那些窗不被修理好,可能将会有破坏者破坏更多的窗户。最终他们甚至会闯入建筑内,如果发现无人居住,也许就在那里定居或者纵火。</p><p>应用在软件工程上就是,一定不能让系统代码或者架构设计的隐患有冒头的机会,否则随着时间的推移,隐患会越来越重。反之,一个本身优质的系统,会让人不由自主的写出优质的代码。</p><h6>6. 互不信任原则</h6><p>指在程序运行上下游的整个链路中,每个点都是不能保证绝对可靠的,任何一个点都可能随时发生故障或者不可预知的行为,包括机器网络、服务本身、依赖环境、输入和请求等,因此要处处设防。</p><h6>7. 持久化 (Persistence)</h6><p>持久化是将程序数据在临时状态和持久状态间转换的机制。通俗的讲,就是临时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库或者本地磁盘中,能够长久保存)。</p><h6>8. 临界区</h6><p>临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。</p><h6>9. 阻塞/非阻塞</h6><p>阻塞和非阻塞通常形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。而非阻塞允许多个线程同时进入临界区。</p><h6>10. 同步/异步</h6><p>通常同步和异步是指函数/方法调用方面。</p><p>同步就是在发出一个函数调用时,在没有得到结果之前,该调用就不返回。异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务,等任务执行完毕后通过回调callback或其他方式通知调用方。</p><h6>11. 并发/并行</h6><p>并行(parallel)指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。</p><p>并发(concurrency)指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。</p><h2>架构设计</h2><h6>1. 高并发 (High Concurrency)</h6><p>由于分布式系统的问世,高并发(High Concurrency)通常是指通过设计保证系统能够同时并行处理很多请求。通俗来讲,高并发是指在同一个时间点,有很多用户同时的访问同一 API 接口或者 Url 地址。它经常会发生在有大活跃用户量,用户高聚集的业务场景中。</p><h6>2. 高可用 (High Availability)</h6><p>高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,一个系统经过专门的设计,以减少停工时间,而保持其服务的高度可用性。</p><h6>3. 读写分离</h6><p>为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行读的操作。</p><h6>4. 冷备/热备</h6><p>冷备:两个服务器,一台运行,一台不运行做为备份。这样一旦运行的服务器宕机,就把备份的服务器运行起来。冷备的方案比较容易实现,但冷备的缺点是主机出现故障时备机不会自动接管,需要主动切换服务。</p><p>热备:即是通常所说的active/standby方式,服务器数据包括数据库数据同时往两台或多台服务器写。当active服务器出现故障的时候,通过软件诊测(一般是通过心跳诊断)将standby机器激活,保证应用在短时间内完全恢复正常使用。当一台服务器宕机后,自动切换到另一台备用机使用。</p><h6>5. 异地多活</h6><p>异地多活一般是指在不同城市建立独立的数据中心,“活”是相对于冷备份而言的,冷备份是备份全量数据,平时不支撑业务需求,只有在主机房出现故障的时候才会切换到备用机房,而多活,是指这些机房在日常的业务中也需要走流量,做业务支撑。</p><h6>6. 负载均衡 (Load Balance)</h6><p>负载均衡,是对多台服务器进行流量分发的负载均衡服务。可在多个实例间自动分配应用程序的对外服务能力,通过消除单点故障提升应用系统的可用性,让您实现更高水平的应用程序容错能力,从而无缝提供分配应用程序流量所需的负载均衡容量,为您提供高效、稳定、安全的服务。</p><h6>7. 动静分离</h6><p>动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。</p><h6>8. 集群</h6><p>单台服务器的并发承载能力总是有限的,当单台服务器处理能力达到性能瓶颈的时,将多台服务器组合起来提供服务,这种组合方式称之为集群,集群中每台服务器就叫做这个集群的一个“节点”,每个节点都能提供相同的服务,从而成倍的提升整个系统的并发处理能力。</p><h6>9. 分布式</h6><p>分布式系统就是将一个完整的系统按照业务功能拆分成很多独立的子系统,每个子系统就被称为“服务”,分布式系统将请求分拣和分发到不同的子系统,让不同的服务来处理不同的请求。在分布式系统中,子系统独立运行,它们之间通过网络通信连接起来实现数据互通和组合服务。</p><h6>10. CAP理论</h6><p>CAP理论,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),不能同时成立。</p><ul><li>一致性:它要求在同一时刻点,分布式系统中的所有数据备份都相同或者都处于同一状态。</li><li>可用性:在系统集群的一部分节点宕机后,系统依然能够正确的响应用户的请求。</li><li>分区容错性:系统能够容忍节点之间的网络通信的故障。</li></ul><p>简单的来说,在一个分布式系统中,最多能支持上面的两种属性。但显然既然是分布式注定我们是必然要进行分区,既然分区,我们就无法百分百避免分区的错误。因此,我们只能在一致性和可用性去作出选择。</p><p>在分布式系统中,我们往往追求的是可用性,它的重要性比一致性要高,那么如何实现高可用,这里又有一个理论,就是 BASE 理论,它给 CAP 理论做了进一步的扩充。</p><h6>11. BASE理论</h6><p>BASE 理论指出:</p><ul><li>Basically Available(基本可用)</li><li>Soft state(软状态)</li><li>Eventually consistent(最终一致性)</li></ul><p>BASE 理论是对 CAP 中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。</p><h6>12. 水平扩展/垂直扩展</h6><p>水平扩展 Scale Out通过增加更多的服务器或者程序实例来分散负载,从而提升存储能力和计算能力。</p><p>垂直扩展 Scale Up 提升单机处理能力。</p><p>垂直扩展的方式又有两种:</p><ul><li>(1)增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;</li><li>(2)提升单机软件或者架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;</li></ul><h6>13. 平行扩容</h6><p>与水平扩展类似。集群服务器中的节点均为平行对等节点,当需要扩容时,可以通过添加更多节点以提高集群的服务能力。一般来说服务器中关键路径(如服务器中的登录、支付、核心业务逻辑等)都需要支持运行时动态平行扩容。</p><h6>14. 弹性扩容</h6><p>指对部署的集群进行动态在线扩容。弹性扩容系统可以根据实际业务环境按照一定策略自动地添加更多的节点(包括存储节点、计算节点、网络节点)来增加系统容量、提高系统性能或者增强系统可靠性,或者同时完成这三个目标。</p><h6>15. 状态同步/帧同步</h6><p>状态同步:状态同步是指服务器负责计算全部的游戏逻辑,并且广播这些计算的结果,客户端仅仅负责发送玩家的操作,以及表现收到的游戏结果。</p><p>特征:状态同步安全性高,逻辑更新方便,断线重连快,但是开发效率较低,网络流量随游戏复杂度增加,服务器需要承载更大压力。</p><p>帧同步:服务端只转发消息,不做任何逻辑处理,各客户端每秒帧数一致,在每一帧都处理同样的输入数据。</p><p>特征:帧同步需要保证系统在相同的输入下,要有相同的输出。帧同步开发效率高,流量消耗低而且稳定,对服务器的压力非常小。但是网络要求高,断线重连时间长,客户端计算压力大。</p><h2>网络通信</h2><h6>1. 连接池</h6><p>预先建立一个连接缓冲池,并提供一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了连接频繁建立、关闭的开销。</p><h6>2. 断线重连</h6><p>由于网络波动造成用户间歇性的断开与服务器的连接,待网络恢复之后服务器尝试将用户连接到上次断开时的状态和数据。</p><h6>3. 会话保持</h6><p>会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关连的访问请求都会分配到一台机器上。用人话来表述就是:在一次会话过程中发起的多个请求都会落到同一台机器上。</p><h6>4. 长连接/短连接</h6><p>通常是指TCP的长连接和短连接。长连接就是建立TCP连接后,一直保持这个连接,一般会中间彼此发送心跳来确认对应的存在,中间会做多次业务数据传输,一般不会主动断开连接。短连接一般指建立连接后,执行一次事务后(如:http请求),然后就关掉这个连接。</p><h6>5. 流量控制/拥塞控制</h6><p>流量控制防止发送方发的太快,耗尽接收方的资源,从而使接收方来不及处理。</p><p>拥塞控制防止发送方发的太快,使得网络来不及处理产生拥塞,进而引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿。</p><h6>6. 惊群效应</h6><p>惊群效应也有人叫做雷鸣群体效应,不过叫什么,简言之,惊群现象就是多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只可能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群。</p><h6>7. NAT</h6><p>NAT(Network Address Translation,网络地址转换),就是替换IP报文头部的地址信息。NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。</p><h2>故障异常</h2><h6>1. 宕机</h6><p>宕机,一般情况下指的就是计算机主机出现意外故障而死机。其次,一些服务器例如数据库死锁也可以称为宕机,一些服务器的某些服务挂掉了,就可以这么说。</p><h6>2. coredump</h6><p>当程序出错而异常中断时,OS会把程序工作的当前状态存储成一个coredunmp文件。通常情况下coredump文件包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。</p><h6>3. 缓存穿透/击穿/雪崩</h6><p>缓存穿透:缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。</p><p>缓存击穿:缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。</p><p>缓存雪崩:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。</p><p>与缓存击穿不同的是:存击穿是热点key失效,缓存雪崩是大量的key同时失效。</p><h6>4. 500/501/502/503/504/505</h6><p>500 Internal Server Error:内部服务错误,一般是服务器遇到意外情况,而无法完成请求。可能原因: </p><ul><li>1、程序错误,例如:ASP或者PHP语法错误;</li><li>2、高并发导致,系统资源限制不能打开过多的文件所致。</li></ul><p>501 Not implemented:服务器不理解或不支持请求的HTTP请求。</p><p>502 Bad Gateway:WEB服务器故障,可能是由于程序进程不够,请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。可能原因:</p><ul><li>1、Nginx服务器,php-cgi进程数不够用;</li><li>2、PHP执行时间过长;</li><li>3、php-cgi进程死掉;</li></ul><p>503 Service Unavailable:服务器目前无法使用。系统维护服务器暂时的无法处理客户端的请求,这只是暂时状态。可以联系下服务器提供商。</p><p>504 Gateway Timeout:服务器504错误表示超时,是指客户端所发出的请求没有到达网关,请求没有到可以执行的php-fpm,一般是与nginx.conf的配置有关。</p><p>505 HTTP Version Not Supported:服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受支持)</p><p>除了500错误可能是程序语言错误,其余的报错,都大概可以理解为服务器或者服务器配置出现问题。</p><h6>5. 内存溢出/内存泄漏</h6><p>内存溢出:内存溢出(Out Of Memory)指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。</p><p>内存泄漏:内存泄漏(Memory Leak)指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。</p><h6>6. 句柄泄漏</h6><p>句柄泄漏是进程在调用系统文件之后,没有释放已经打开的文件句柄。一般句柄泄漏后的现象是,机器变慢,CPU飙升,出现句柄泄漏的cgi或server的CPU使用率增加。</p><h6>7. 死锁</h6><p>死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都抑制处于阻塞状态并无法进行下去,此时称系统处于死锁状态或系统产生了死锁。</p><h6>8. 软中断/硬中断</h6><p>硬中断:我们通常所说的中断指的是硬中断(hardirq)。</p><p>主要是用来通知操作系统系统外设状态的变化。</p><p>软中断:1、通常是硬中断服务程序对内核的中断;2、为了满足实时系统的要求,中断处理应该是越快越好。</p><p>linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。</p><h6>9. 毛刺</h6><p>在短暂的某一刻,服务器性能指标(如流量、磁盘IO、CPU使用率等)远大于该时刻前后时间段。毛刺的出现代表这服务器资源利用不均匀,不充分,容易诱发其他更严重的问题。</p><h6>10. 重放攻击</h6><p>攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。它是一种攻击类型,这种攻击会不断恶意或欺诈性地重复一个有效的数据传输,重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。</p><h6>11. 网络孤岛</h6><p>网络孤岛指集群环境中,部分机器与整个集群失去网络连接,分裂为一个小集群并且发生数据不一致的状况。</p><h6>12. 数据倾斜</h6><p>对于集群系统,一般缓存是分布式的,即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够,导致大量的缓存数据集中到了一台或者几台服务节点上,称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起的。</p><h6>13. 脑裂</h6><p>脑裂是指在集群系统中,部分节点之间网络不可达而引起的系统分裂,不同分裂的小集群会按照各自的状态提供服务,原本的集群会同时存在不一致的反应,造成节点之间互相争抢资源,系统混乱,数据损坏。</p><h2>监控告警</h2><h6>1. 服务监控</h6><p>服务监控主要目的在服务出现问题或者快要出现问题时能够准确快速地发现以减小影响范围。服务监控一般有多种手段,按层次可划分为:</p><ul><li>系统层(CPU、网络状态、IO、机器负载等)</li><li>应用层(进程状态、错误日志、吞吐量等)</li><li>业务层(服务/接口的错误码、响应时间)</li><li>用户层(用户行为、舆情监控、前端埋点)</li></ul><h6>2. 全链路监控</h6><p>服务拨测:服务拨测是探测服务(应用)可用性的监控方式,通过拨测节点对目标服务进行周期性探测,主要通过可用性和响应时间来度量,拨测节点通常有异地多个。</p><p>节点探测:节点探测是用来发现和追踪不同的机房(数据中心)节点之间网络可用性和通畅性的监控方式,主要通过响应时间、丢包率、跳数来度量,探测方法一般是ping、mtr或其他私有协议。</p><p>告警过滤:对某些可预知的告警进行过滤,不进入告警统计的数据,如少量爬虫访问导致的http响应500错误,业务系统自定义异常信息等。</p><p>告警去重:当一个告警通知负责人后,在这个告警恢复之前,不会继续收到相同的告警。</p><p>告警抑制:为了减少由于系统抖动带来的干扰,还需要实现抑制,例如服务器瞬间高负载,可能是正常的,只有持续一段时间的高负载才需要得到重视。</p><p>告警恢复:开发/运维人员不仅需要收到告警通知,还需要收到故障消除告警恢复正常的通知。</p><p>告警合并:对同一时刻产生的多条相同告警进行合并,如某个微服务集群同一时刻出现多个子服务负载过高的告警,需要合并成为一条告警。</p><p>告警收敛:有时某个告警产生时,往往会伴随着其它告警。这时可以只对根本原因产生告警,其它告警收敛为子告警一并发送通知。如云服务器出现CPU负载告警时往往伴随其搭载的所有系统的可用性告警。</p><p>故障自愈:实时发现告警,预诊断分析,自动恢复故障,并打通周边系统实现整个流程的闭环。</p><h2>服务治理</h2><h6>1. 微服务</h6><p>微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通(通常是基于HTTP的Restful API).每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。</p><h6>2. 服务发现</h6><p>服务发现是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。服务发现是支撑大规模 SOA 和微服务架构的核心模块,它应该尽量做到高可用。</p><h6>3. 流量削峰</h6><p>如果观看抽奖或秒杀系统的请求监控曲线,你就会发现这类系统在活动开放的时间段内会出现一个波峰,而在活动未开放时,系统的请求量、机器负载一般都是比较平稳的。为了节省机器资源,我们不可能时时都提供最大化的资源能力来支持短时间的高峰请求。所以需要使用一些技术手段,来削弱瞬时的请求高峰,让系统吞吐量在高峰请求下保持可控。削峰也可用于消除毛刺,使服务器资源利用更加均衡和充分。常见的削峰策略有队列,限频,分层过滤,多级缓存等。</p><h6>4. 版本兼容</h6><p>在升级版本的过程中,需要考虑升级版本后,新的数据结构是否能够理解和解析旧数据,新修改的协议是否能够理解旧的协议以及做出预期内合适的处理。这就需要在服务设计过程中做好版本兼容。</p><h6>5. 过载保护</h6><p>过载是指当前负载已经超过了系统的最大处理能力,过载的出现,会导致部分服务不可用,如果处置不当,极有可能引起服务完全不可用,乃至雪崩。过载保护正是针对这种异常情况做的措施,防止出现服务完全不可用的现象。</p><h6>6. 服务熔断</h6><p>服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。</p><h6>7. 服务降级</h6><p>服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。</p><p>根据服务方式:可以拒接服务,可以延迟服务,也有时候可以随机服务。</p><p>根据服务范围:可以砍掉某个功能,也可以砍掉某些模块。</p><p>总之服务降级需要根据不同的业务需求采用不同的降级策略。主要的目的就是服务虽然有损但是总比没有好。</p><h6>8. 熔断VS降级</h6><p>相同点:目标一致,都是从可用性和可靠性出发,为了防止系统崩溃;用户体验类似,最终都让用户体验到的是某些功能暂时不可用;</p><p>不同点:触发原因不同,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;</p><h6>9. 服务限流</h6><p>限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。</p><h6>10. 故障屏蔽</h6><p>将故障机器从集群剔除,以保证新的请求不会分发到故障机器。</p><h6>测试方法</h6><h6>1. 黑盒/白盒测试</h6><p>黑盒测试不考虑程序内部结构和逻辑结构,主要是用来测试系统的功能是否满足需求规格说明书。一般会有一个输入值,一个输入值,和期望值做比较。</p><p>白盒测试主要应用在单元测试阶段,主要是对代码级的测试,针对程序内部逻辑结构,测试手段有:语句覆盖、判定覆盖、条件覆盖、路径覆盖、条件组合覆盖</p><h6>2. 单元/集成/系统/验收测试</h6><p>软件测试一般分为4个阶段:单元测试、集成测试、系统测试、验收测试。</p><p>单元测试:单元测试是对软件中的最小可验证单元进行检查和验证,如一个模块、一个过程、一个方法等。单元测试粒度最小,一般由开发小组采用白盒方式来测试,主要测试单元是否符合“设计”。</p><p>集成测试:集成测试也叫做组装测试,通常在单元测试的基础上,将所有的程序模块进行有序的、递增的测试。集成测试界于单元测试和系统测试之间,起到“桥梁作用”,一般由开发小组采用白盒加黑盒的方式来测试,既验证“设计”,又验证“需求”。</p><p>系统测试:系统测试时将经过集成测试的软件,作为计算机系统的一部分,与系统中其他部分结合起来,在实际运行环境下进行一系列严格有效的测试,以发现软件潜在的问题,保证系统的正常运行。系统测试的粒度最大,一般由独立测试小组采用黑盒方式来测试,主要测试系统是否符合“需求规格说明书”。</p><p>验收测试:验收测试也称交付测试,是针对用户需求、业务流程进行的正式的测试,以确定系统是否满足验收标准,由用户、客户或其他授权机构决定是否接受系统。验收测试与系统测试相似,主要区别是测试人员不同,验收测试由用户执行。</p><h6>3. 回归测试</h6><p>当发现并修改缺陷后,或在软件中添加新的功能后,重新测试。用来检查被发现的缺陷是否被改正,并且所做的修改没有引发新的问题。</p><h6>4. 冒烟测试</h6><p>这一术语源自硬件行业。对一个硬件或硬件组件进行更改或修复后,直接给设备加电。如果没有冒烟,则该组件就通过了测试。在软件中,“冒烟测试”这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程。</p><p>冒烟测试是在软件开发过程中的一种针对软件版本包的快速基本功能验证策略,是对软件基本功能进行确认验证的手段,并非对软件版本包的深入测试。</p><p>比如:对于一个登录系统的冒烟测试,我们只需测试输入正确的用户名、密码,验证登录这一个核心功能点,至于输入框、特殊字符等,可以在冒烟测试之后进行。</p><h6>5. 性能测试</h6><p>性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。</p><p>通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。</p><p>压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。</p><h6>6. 基准测试</h6><p>基准测试(Benchmark)也是一种性能测试方式,用来测量机器的硬件最高实际运行性能,以及软件优化的性能提升效果, 同时也可以用来识别某段代码的CPU或者内存效率问题. 许多开发人员会用基准测试来测试不同的并发模式, 或者用基准测试来辅助配置工作池的数量, 以保证能最大化系统的吞吐量.</p><h6>7. A/B测试</h6><p>A/B测试,是用两组及以上随机分配的、数量相似的样本进行对比,如果实验组和对比组的实验结果相比,在目标指标上具有统计显著性,那就可以说明实验组的功能可以导致你想要的结果,从而帮你验证假设或者做出产品决定。</p><h6>8. 代码覆盖测试</h6><p>代码覆盖(Code coverage)是软件测试中的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率。在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。</p><h2>发布部署</h2><h6>1. DEV/PRO/FAT/UAT</h6><p>DEV(Development environment):开发环境,用于开发人员调试使用,版本变化较大。</p><p>FAT(Feature Acceptance Test environment):功能验收测试环境,用于软件测试人员测试使用。</p><p>UAT(User Acceptance Test environment):用户验收测试环境,用于生产环境下的功能验证,可作为预发布环境。</p><p>PRO(Production environment):生产环境,正式线上环境。</p><h6>2. 灰度发布</h6><p>灰度发布是指在升级版本过程中,通过分区控制,白名单控制等方式对一部分用户先升级产品特性,而其余用户则保持不变,当一段时间后升级产品特性的用户没有反馈问题,就逐步扩大范围,最终向所有用户开放新版本特性,灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、修改问题,以保证其影响度。</p><h6>3. 回滚 (Rollback)</h6><p>指的是程序或数据处理错误时,将程序或数据恢复到上一次正确状态(或者是上一个稳定版本)的行为。</p><blockquote>来源:cloud.tencent.com/developer/article/1477450</blockquote><p><strong>如果本文对你有帮助的话,欢迎</strong>点赞&转发<strong>,这对我继续分享&创作优质文章非常重要。感谢🙏🏻</strong></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
备份恢复学的这么差,试用期你都过不了
https://segmentfault.com/a/1190000041794087
2022-05-05T14:54:11+08:00
2022-05-05T14:54:11+08:00
民工哥
https://segmentfault.com/u/jishuroad
2
<p>大家好,我是民工哥。</p><p>前几天,有个读者找我吐槽,他刚入职一家公司,有一次老大和他说了一句话:就一个数据库的备份、恢复你都学的这么差,怕是连试用期也过不了!</p><p>确实,数据是企业的重要之中,这项技能是必须掌握的,搞的好,升职加薪,搞的不好,删库跑路的事不在少数。</p><p>本文结合自己工作10年的积累,将Oracle的备份恢复做了详细阐述。关于MySQL数据库的备份与恢复请看这:<a href="https://link.segmentfault.com/?enc=tfK1vhZq0wlUOL52OLlnqg%3D%3D.voOMCWgIL9Iy%2Fd1wXvc7A6A%2FZ5gv%2B6F%2F%2FbsaAuEfJU8bGI3qEDLIYr%2Br%2FSDp7JDyP1oq3253jsmUH4qNkdynGRb7QilPvxN8sWKroQGitBloJpjU61A1zH2EOqygxIR9AgaRO2CiuNjA8nuEsw5KJOHEcG1mm76G1qQVjNkn3fgdLNIpwcBi%2Fr%2BDvV6ixVQC0NZeVh%2FuQvge%2F7YBWxB4hVNM6a3Y77r%2BVr4cxsCK%2Beu0XsVD6XFOiq7r816kkFKTXyDCf8TvcA%2FNInBYxs4EjBJ4%2BNqbSOC61cqriRpFB3A%3D" rel="nofollow">高逼格企业级MySQL数据库备份方案,原来是这样</a>,<a href="https://link.segmentfault.com/?enc=FtGZeiP2XHWpKaDe0RJcRg%3D%3D.756sQhTCaVacTVfG2g%2FSs1cX3gCuZWuDbOCJvosjeOF7nPXDfWvcNNZP%2FRWZb12pcoexkXX21fMBobpw86qtMiFCT4AYEb1dU%2Fn4FXlWMFRl2pP4X3BtmOpoD63IuunHF2OazsX1Ypx7Z2qEtwx9kLRdq1ad3K1cuidJGsI4CI9UPxkD6oGufIYKwL5QjJH3XbIzg47kwIbjsR8xvSU5RIswGSmfD3pTTSal4lyKYQviRM80E%2FD1Wg56j5cKtNTIb1zLYCvIXND8HmxtJNUa9vqkEcWRo%2FStiYiH8C3QyHc%3D" rel="nofollow">删库不再跑路!我在里面含泪写下 MySQL 数据恢复大法</a></p><h2>数据库故障类型</h2><ul><li>1)user process failure 用户进程故障:pmon 自动处理</li><li>2)instance failure 实例故障: smon 自动处理</li><li>3)user errors 用户 错误:需要 dba 通过备份恢复解决</li><li>4)media failure 介质故障:必须通过备份和日志恢复</li></ul><p>总结:备份恢复主要是用于保护数据(介质、用户、应用程序导致)、保留数据、传输数据</p><h2>备份恢复分类</h2><p><img src="/img/remote/1460000041794089" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041794090" alt="图片" title="图片"></p><p>还原即Restore(重储),恢复即是Recover(恢复)</p><h6>逻辑备份与恢复</h6><ul><li>①传统的导入导出:exp/imp:</li><li>②数据泵导入导出:expdp/impdp</li><li>面向 object,逻辑备份就是热备数据库对象某一时刻状态,</li><li>不能运用在 media failure 上,逻辑备份的恢复就是还原备份,没有 recover 的概念。</li></ul><h6>物理备份与恢复</h6><ul><li>面向 media failure</li><li>①手工备份与恢复,也叫用户管理的备份与恢复(UMAN),</li><li>通过 OS 的命令,完成备份与还原,然后再运用日志进行恢复。</li><li>②自动备份与恢复,利用 oracle 的备份恢复工具 RMAN,使还原与恢复过程自动完成。</li><li>物理备份从方式上可以有 一致性备份(冷备) 和 非一致性备份(热备) 完整的备份策略应该以物理备份为主,逻辑备份为辅(用于备份一些重要的表)</li></ul><h6>闪回技术</h6><ul><li>一种利用 undo 数据或闪回日志的快速恢复技术。</li><li>可以针对不同层面问题进行逻辑恢复,</li><li>11g 支持七种 flashback 方式,</li><li>其中快速恢复区只和闪回数据库有关。</li></ul><h2>完全恢复与不完全恢复</h2><h6>1)完全恢复:</h6><ul><li>利用完整备份或部分备份,可以将 datafile</li><li>恢复到 failure 前得最后一次 commit,不会出</li><li>现数据丢失。</li></ul><h6>2)不完全恢复</h6><ul><li>需要运用完整备份和日志将 database</li><li>恢复到过去的某个时间点(或 SCN),有数据丢失。</li></ul><h2>备份策略</h2><p><img src="/img/remote/1460000041794091" alt="图片" title="图片"></p><ul><li>备份策略:每周日执行0级全备份,周一至周六每天执行1级增量备份</li><li>配置保留策略 reduncancy 2,</li><li>开启控制文件自动备份</li></ul><pre><code>RMAN> show all;
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE CONTROLFILE AUTOBACKUP ON;</code></pre><h6>备份脚本</h6><pre><code>--创建存放脚本的目录
mkdir /home/oracle/scripts
--创建全备份脚本
vi /home/oracle/scripts/rman_level0.sh
#!/bin/bash
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=PROD
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
rman target / << EOF
run{
crosscheck backup;
allocate channel c1 device type disk;
allocate channel c2 device type disk;
backup incremental level 0 database format '/u01/backup/rman/db_%U.bak'
plus archivelog format '/u01/backup/rman/ar_%U.bak';
backup current controlfile format '/u01/backup/rman/ctl_%U.bak';
report obsolete device type disk;
delete noprompt obsolete device type disk;
delete noprompt expired backup device type disk;
release channel c1;
release channel c2;
}
EOF
exit</code></pre><p>CROSSCHECK命令:用于核对磁盘和磁带上的备份文件</p><p>状态为:AVALIABLE、UNAVALIABLE、EXPIRED</p><p>赋予权限</p><pre><code>chmod a+x /home/oracle/scripts/rman_level0.sh
chmod a+x /home/oracle/scripts/rman_level1.sh</code></pre><h6>编写 crontab 计划任务</h6><p>测试环境 整点进行全备份,每 15 分钟增量备份一次</p><pre><code>0 * * * * /home/oracle/scripts/rman_level0.sh >> /u01/backup/rman/PROD_rman_L0_`date
+\%Y\%m\%d_\%H\%M\%S`.log 2>&1
15,30,45 * * * * /home/oracle/scripts/rman_level1.sh >>
/u01/backup/rman/PROD_rman_L1_`date +\%Y\%m\%d_\%H\%M\%S`.log 2>&1</code></pre><p>查看备份情况是否正常,查看相关备份日志。</p><p>查看 obsolete 备份、归档是否删除正常。</p><pre><code>select a.TIME_TAKEN_DISPLAY as "用时",
a.INPUT_BYTES_DISPLAY "大小",
a.INPUT_BYTES_PER_SEC_DISPLAY as "速度",
a.INPUT_TYPE "备份类型",
to_char(start_time, 'day') day1,
to_char(start_time, 'yyyy-mm-dd hh24:mi:ss') as "开始时间",
to_char(end_time, 'yyyy-mm-dd hh24:mi:ss') "结束时间",
output_device_type,
status,
input_type
from V$RMAN_BACKUP_JOB_DETAILS a</code></pre><blockquote>作者:IT邦德 来源:<br>jeames.blog.csdn.net/article/details/122355707_</blockquote><p><strong>如果本文对你有帮助的话,欢迎</strong>点赞&转发<strong>,这对我继续分享&创作优质文章非常重要。感谢🙏🏻</strong></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
必备的 6 大计算机网络基础知识点!会 3 个以上就很牛逼了
https://segmentfault.com/a/1190000041793973
2022-05-05T14:50:40+08:00
2022-05-05T14:50:40+08:00
民工哥
https://segmentfault.com/u/jishuroad
5
<h2>计算机网络概述</h2><p><img src="/img/remote/1460000041793975" alt="图片" title="图片"></p><h6>计算机网络的分类</h6><ul><li>按照网络的作用范围:广域网(WAN)、城域网(MAN)、局域网(LAN);</li><li>按照网络使用者:公用网络、专用网络。</li></ul><h6>计算机网络的层次结构</h6><p><img src="/img/remote/1460000041793976" alt="图片" title="图片"></p><p>TCP/IP四层模型与OSI体系结构对比:</p><p><img src="/img/remote/1460000041793977" alt="图片" title="图片"></p><h6>层次结构设计的基本原则</h6><ul><li>各层之间是相互独立的;</li><li>每一层需要有足够的灵活性;</li><li>各层之间完全解耦。</li></ul><p><img src="/img/remote/1460000041793978" alt="图片" title="图片"></p><h6>计算机网络的性能指标</h6><p>速率:bps=bit/s 时延:发送时延、传播时延、排队时延、处理时延 往返时间RTT:数据报文在端到端通信中的来回一次的时间。</p><h2>物理层</h2><p>物理层的作用:连接不同的物理设备,传输比特流。该层为上层协议提供了一个传输数据的可靠的物理媒体。简单的说,物理层确保原始的数据可在各种物理媒体上传输。</p><h6>物理层设备:</h6><ul><li>中继器【Repeater,也叫放大器】:同一局域网的再生信号;两端口的网段必须同一协议;5-4-3规程:10BASE-5以太网中,最多串联4个中继器,5段中只能有3个连接主机;</li><li>集线器:同一局域网的再生、放大信号(多端口的中继器);半双工,不能隔离冲突域也不能隔离广播域。</li></ul><p>信道的基本概念:信道是往一个方向传输信息的媒体,一条通信电路包含一个发送信道和一个接受信道。</p><ul><li>单工通信信道:只能一个方向通信,没有反方向反馈的信道;</li><li>半双工通信信道:双方都可以发送和接受信息,但不能同时发送也不能同时接收;</li><li>全双工通信信道:双方都可以同时发送和接收。</li></ul><h2>数据链路层</h2><h6>数据链路层概述</h6><p>数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。数据链路层在不可靠的物理介质上提供可靠的传输。</p><ul><li>该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。</li><li>有关数据链路层的重要知识点:</li><li>数据链路层为网络层提供可靠的数据传输;</li><li>基本数据单位为帧;</li><li>主要的协议:以太网协议;</li><li>两个重要设备名称:网桥和交换机。</li></ul><p>封装成帧:“帧”是数据链路层数据的基本单位:</p><p><img src="/img/remote/1460000041793979" alt="图片" title="图片"></p><p>透明传输:“透明”是指即使控制字符在帧数据中,但是要当做不存在去处理。即在控制字符前加上转义字符ESC。</p><p><img src="/img/remote/1460000041793980" alt="图片" title="图片"></p><h6>数据链路层的差错监测</h6><ul><li>差错检测:奇偶校验码、循环冗余校验码CRC</li><li>奇偶校验码–局限性:当出错两位时,检测不到错误。</li><li>循环冗余检验码:根据传输或保存的数据而产生固定位数校验码。</li></ul><h6>最大传输单元MTU</h6><p>最大传输单元MTU(Maximum Transmission Unit),数据链路层的数据帧不是无限大的,数据帧长度受MTU限制.</p><p>路径MTU:由链路中MTU的最小值决定。</p><p><img src="/img/remote/1460000041793981" alt="图片" title="图片"></p><h6>以太网协议详解</h6><ul><li>MAC地址:每一个设备都拥有唯一的MAC地址,共48位,使用十六进制表示。</li><li>以太网协议:是一种使用广泛的局域网技术,是一种应用于数据链路层的协议,使用以太网可以完成相邻设备的数据帧传输:</li></ul><p><img src="/img/remote/1460000041793982" alt="图片" title="图片"></p><h6>局域网分类</h6><ul><li>Ethernet以太网IEEE802.3:</li><li>以太网第一个广泛部署的高速局域网</li><li>以太网数据速率快</li><li>以太网硬件价格便宜,网络造价成本低</li></ul><h6>以太网帧结构</h6><ul><li>类型:标识上层协议(2字节)</li><li>目的地址和源地址:MAC地址(每个6字节)</li><li>数据:封装的上层协议的分组(46~1500字节)</li><li>CRC:循环冗余码(4字节)</li><li>以太网最短帧:以太网帧最短64字节;以太网帧除了数据部分18字节;数据最短46字节;</li></ul><h6>MAC地址(物理地址、局域网地址)</h6><ul><li>MAC地址长度为6字节,48位;</li><li>MAC地址具有唯一性,每个网络适配器对应一个MAC地址;</li><li>通常采用十六进制表示法,每个字节表示一个十六进制数,用 - 或 : 连接起来;</li><li>MAC广播地址:FF-FF-FF-FF-FF-FF。</li></ul><h2>网络层</h2><p>网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。数据交换技术是报文交换(基本上被分组所替代):采用储存转发方式,数据交换单位是报文。</p><p>网络层中涉及众多的协议,其中包括最重要的协议,也是TCP/IP的核心协议——IP协议。IP协议非常简单,仅仅提供不可靠、无连接的传送服务。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。</p><p>与IP协议配套使用实现其功能的还有地址解析协议ARP、逆地址解析协议RARP、因特网报文协议ICMP、因特网组管理协议IGMP。具体的协议我们会在接下来的部分进行总结,有关网络层的重点为:</p><ul><li>1、网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能;</li><li>2、基本数据单位为IP数据报;</li><li>3、包含的主要协议:</li><li>IP协议(Internet Protocol,因特网互联协议);</li><li>ICMP协议(Internet Control Message Protocol,因特网控制报文协议);</li><li>ARP协议(Address Resolution Protocol,地址解析协议);</li><li>RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)。</li><li>4、重要的设备:路由器。</li></ul><p><img src="/img/remote/1460000041793983" alt="图片" title="图片"></p><p>路由器相关协议</p><p><img src="/img/remote/1460000041793984" alt="图片" title="图片"></p><h6>IP协议详解</h6><p>IP网际协议是 Internet 网络层最核心的协议。虚拟互联网络的产生:实际的计算机网络错综复杂;物理设备通过使用IP协议,屏蔽了物理网络之间的差异;当网络中主机使用IP协议连接时,无需关注网络细节,于是形成了虚拟网络。</p><p><img src="/img/remote/1460000041793985" alt="图片" title="图片"></p><p>IP协议使得复杂的实际网络变为一个虚拟互联的网络;并且解决了在虚拟网络中数据报传输路径的问题。</p><p><img src="/img/remote/1460000041793986" alt="图片" title="图片"></p><p>其中,版本指IP协议的版本,占4位,如IPv4和IPv6;首部位长度表示IP首部长度,占4位,最大数值位15;总长度表示IP数据报总长度,占16位,最大数值位65535;TTL表示IP数据报文在网络中的寿命,占8位;协议表明IP数据所携带的具体数据是什么协议的,如TCP、UDP。</p><h6>IP协议的转发流程</h6><p><img src="/img/remote/1460000041793987" alt="图片" title="图片"></p><h6>IP地址的子网划分</h6><p><img src="/img/remote/1460000041793988" alt="图片" title="图片"></p><p>A类(8网络号+24主机号)、B类(16网络号+16主机号)、C类(24网络号+8主机号)可以用于标识网络中的主机或路由器,D类地址作为组广播地址,E类是地址保留。</p><p><img src="/img/remote/1460000041793989" alt="图片" title="图片"></p><h6>网络地址转换NAT技术</h6><p>用于多个主机通过一个公有IP访问访问互联网的私有网络中,减缓了IP地址的消耗,但是增加了网络通信的复杂度。</p><h6>NAT 工作原理:</h6><p>从内网出去的IP数据报,将其IP地址替换为NAT服务器拥有的合法的公共IP地址,并将替换关系记录到NAT转换表中;</p><p>从公共互联网返回的IP数据报,依据其目的的IP地址检索NAT转换表,并利用检索到的内部私有IP地址替换目的IP地址,然后将IP数据报转发到内部网络。</p><h6>ARP协议与RARP协议</h6><p>地址解析协议 ARP(Address Resolution Protocol):为网卡(网络适配器)的IP地址到对应的硬件地址提供动态映射。可以把网络层32位地址转化为数据链路层MAC48位地址。</p><p>ARP 是即插即用的,一个ARP表是自动建立的,不需要系统管理员来配置。</p><p><img src="/img/remote/1460000041793990" alt="图片" title="图片"></p><p>RARP(Reverse Address Resolution Protocol)协议指逆地址解析协议,可以把数据链路层MAC48位地址转化为网络层32位地址。</p><h6>ICMP协议详解</h6><p>网际控制报文协议(Internet Control Message Protocol),可以报告错误信息或者异常情况,ICMP报文封装在IP数据报当中。</p><p><img src="/img/remote/1460000041793991" alt="图片" title="图片"></p><p>ICMP协议的应用:</p><ul><li>Ping应用:网络故障的排查;</li><li>Traceroute应用:可以探测IP数据报在网络中走过的路径。</li></ul><h6>网络层的路由概述</h6><p>关于路由算法的要求:正确的完整的、在计算上应该尽可能是简单的、可以适应网络中的变化、稳定的公平的。</p><p>自治系统AS:指处于一个管理机构下的网络设备群,AS内部网络自治管理,对外提供一个或多个出入口,其中自治系统内部的路由协议为内部网关协议,如RIP、OSPF等;自治系统外部的路由协议为外部网关协议,如BGP。</p><ul><li>静态路由:人工配置,难度和复杂度高;</li><li>动态路由:</li><li>链路状态路由选择算法LS:向所有隔壁路由发送信息收敛快;全局式路由选择算法,每个路由器计算路由时,需构建整个网络拓扑图;利用Dijkstra算法求源端到目的端网络的最短路径;Dijkstra(迪杰斯特拉)算法</li><li>距离-向量路由选择算法DV:向所有隔壁路由发送信息收敛慢、会存在回路;基础是Bellman-Ford方程(简称B-F方程);</li></ul><h6>内部网关路由协议之RIP协议</h6><p>路由信息协议 RIP(Routing Information Protocol)【应用层】,基于距离-向量的路由选择算法,较小的AS(自治系统),适合小型网络;RIP报文,封装进UDP数据报。</p><p>RIP协议特性:</p><ul><li>RIP在度量路径时采用的是跳数(每个路由器维护自身到其他每个路由器的距离记录);</li><li>RIP的费用定义在源路由器和目的子网之间;</li><li>RIP被限制的网络直径不超过15跳;</li><li>和隔壁交换所有的信息,30主动一次(广播)。</li></ul><h6>内部网关路由协议之OSPF协议</h6><p>开放最短路径优先协议 OSPF(Open Shortest Path First)【网络层】,基于链路状态的路由选择算法(即Dijkstra算法),较大规模的AS ,适合大型网络,直接封装在IP数据报传输。</p><p>OSPF协议优点:</p><ul><li>安全;</li><li>支持多条相同费用路径;</li><li>支持区别化费用度量;</li><li>支持单播路由和多播路由;</li><li>分层路由。</li></ul><p>RIP与OSPF的对比(路由算法决定其性质):</p><p><img src="/img/remote/1460000041793992" alt="图片" title="图片"></p><h6>外部网关路由协议之BGP协议</h6><p>BGP(Border Gateway Protocol)边际网关协议【应用层】:是运行在AS之间的一种协议,寻找一条好路由:首次交换全部信息,以后只交换变化的部分,BGP封装进TCP报文段.</p><h2>传输层</h2><p>第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。</p><p>传输层的任务是根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的协议数据单元称为段或报文。</p><p>网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口。</p><h6>有关网络层的重点:</h6><ul><li>传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;</li><li>包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);</li><li>重要设备:网关。</li></ul><p><img src="/img/remote/1460000041793993" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041793994" alt="图片" title="图片"></p><h6>UDP协议详解</h6><p>UDP(User Datagram Protocol: 用户数据报协议),是一个非常简单的协议。</p><p><img src="/img/remote/1460000041793995" alt="图片" title="图片"></p><p>UDP协议的特点:</p><ul><li>UDP是无连接协议;</li><li>UDP不能保证可靠的交付数据;</li><li>UDP是面向报文传输的;</li><li>UDP没有拥塞控制;</li><li>UDP首部开销很小。</li><li>UDP数据报结构:</li><li>首部:8B,四字段/2B【源端口 | 目的端口 | UDP长度 | 校验和】 数据字段:应用数据</li></ul><p><img src="/img/remote/1460000041793996" alt="图片" title="图片"></p><h6>TCP协议详解</h6><p>TCP(Transmission Control Protocol: 传输控制协议),是计算机网络中非常复杂的一个协议。</p><p><img src="/img/remote/1460000041793997" alt="图片" title="图片"></p><p>TCP协议的功能:</p><ul><li>对应用层报文进行分段和重组;</li><li>面向应用层实现复用与分解;</li><li>实现端到端的流量控制;</li><li>拥塞控制;</li><li>传输层寻址;</li><li>对收到的报文进行差错检测(首部和数据部分都检错);</li><li>实现进程间的端到端可靠数据传输控制。</li><li>TCP协议的特点:</li><li>TCP是面向连接的协议;</li><li>TCP是面向字节流的协议;</li><li>TCP的一个连接有两端,即点对点通信;</li><li>TCP提供可靠的传输服务;</li><li>TCP协议提供全双工通信(每条TCP连接只能一对一);</li></ul><h6>TCP报文段结构:</h6><p>最大报文段长度:报文段中封装的应用层数据的最大长度。</p><p><img src="/img/remote/1460000041793998" alt="图片" title="图片"></p><p>TCP首部:</p><ul><li>序号字段:TCP的序号是对每个应用层数据的每个字节进行编号</li><li>确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。用ack\_seq标识;</li><li>TCP段的首部长度最短是20B ,最长为60字节。但是长度必须为4B的整数倍</li></ul><p>TCP标记的作用:</p><p><img src="/img/remote/1460000041793999" alt="图片" title="图片"></p><h6>可靠传输的基本原理</h6><p>基本原理:</p><ul><li>不可靠传输信道在数据传输中可能发生的情况:比特差错、乱序、重传、丢失</li><li>基于不可靠信道实现可靠数据传输采取的措施:</li></ul><p>差错检测:利用编码实现数据包传输过程中的比特差错检测 确认:接收方向发送方反馈接收状态 重传:发送方重新发送接收方没有正确接收的数据 序号:确保数据按序提交 计时器:解决数据丢失问题;</p><p>停止等待协议:是最简单的可靠传输协议,但是该协议对信道的利用率不高。</p><p>连续ARQ(Automatic Repeat reQuest:自动重传请求)协议:滑动窗口+累计确认,大幅提高了信道的利用率。</p><h6>TCP协议的可靠传输</h6><p>基于连续ARQ协议,在某些情况下,重传的效率并不高,会重复传输部分已经成功接收的字节。</p><h6>TCP协议的流量控制</h6><p>流量控制:让发送方发送速率不要太快,TCP协议使用滑动窗口实现流量控制。</p><p><img src="/img/remote/1460000041794000" alt="图片" title="图片"></p><h6>TCP协议的拥塞控制</h6><p>拥塞控制与流量控制的区别:流量控制考虑点对点的通信量的控制,而拥塞控制考虑整个网络,是全局性的考虑。拥塞控制的方法:慢启动算法+拥塞避免算法。</p><p>慢开始和拥塞避免:</p><ul><li>【慢开始】拥塞窗口从1指数增长;</li><li>到达阈值时进入【拥塞避免】,变成+1增长;</li><li>【超时】,阈值变为当前cwnd的一半(不能<2);</li><li>再从【慢开始】,拥塞窗口从1指数增长。</li></ul><p><img src="/img/remote/1460000041794001" alt="图片" title="图片"></p><p>快重传和快恢复:</p><ul><li>发送方连续收到3个冗余ACK,执行【快重传】,不必等计时器超时;</li><li>执行【快恢复】,阈值变为当前cwnd的一半(不能<2),并从此新的ssthresh点进入【拥塞避免】。</li></ul><p><img src="/img/remote/1460000041794002" alt="图片" title="图片"></p><h6>TCP连接的三次握手(重要)</h6><p>TCP三次握手使用指令:</p><p><img src="/img/remote/1460000041794003" alt="图片" title="图片"></p><p>面试常客:为什么需要三次握手?</p><ul><li>第一次握手:客户发送请求,此时服务器知道客户能发;</li><li>第二次握手:服务器发送确认,此时客户知道服务器能发能收;</li><li>第三次握手:客户发送确认,此时服务器知道客户能收。</li></ul><p>建立连接(三次握手):</p><ul><li>第一次:客户向服务器发送连接请求段,建立连接请求控制段(SYN=1),表示传输的报文段的第一个数据字节的序列号是x,此序列号代表整个报文段的序号(seq=x);客户端进入 SYN_SEND (同步发送状态);</li><li>第二次:服务器发回确认报文段,同意建立新连接的确认段(SYN=1),确认序号字段有效(ACK=1),服务器告诉客户端报文段序号是y(seq=y),表示服务器已经收到客户端序号为x的报文段,准备接受客户端序列号为x+1的报文段(ack_seq=x+1);服务器由LISTEN进入SYN_RCVD (同步收到状态);</li><li>第三次:客户对服务器的同一连接进行确认.确认序号字段有效(ACK=1),客户此次的报文段的序列号是x+1(seq=x+1),客户期望接受服务器序列号为y+1的报文段(ack_seq=y+1);当客户发送ack时,客户端进入ESTABLISHED 状态;当服务收到客户发送的ack后,也进入ESTABLISHED状态;第三次握手可携带数据;</li></ul><p><img src="/img/remote/1460000041794004" alt="图片" title="图片"></p><h6>TCP连接的四次挥手(重要)</h6><p>释放连接(四次挥手)</p><ul><li>第一次:客户向服务器发送释放连接报文段,发送端数据发送完毕,请求释放连接(FIN=1),传输的第一个数据字节的序号是x(seq=x);客户端状态由ESTABLISHED进入FIN_WAIT_1(终止等待1状态);</li><li>第二次:服务器向客户发送确认段,确认字号段有效(ACK=1),服务器传输的数据序号是y(seq=y),服务器期望接收客户数据序号为x+1(ack_seq=x+1);服务器状态由ESTABLISHED进入CLOSE_WAIT(关闭等待);客户端收到ACK段后,由FIN_WAIT_1进入FIN_WAIT_2;</li><li>第三次:服务器向客户发送释放连接报文段,请求释放连接(FIN=1),确认字号段有效(ACK=1),表示服务器期望接收客户数据序号为x+1(ack_seq=x+1);表示自己传输的第一个字节序号是y+1(seq=y+1);服务器状态由CLOSE_WAIT 进入 LAST_ACK (最后确认状态);</li><li>第四次:客户向服务器发送确认段,确认字号段有效(ACK=1),表示客户传输的数据序号是x+1(seq=x+1),表示客户期望接收服务器数据序号为y+1+1(ack_seq=y+1+1);客户端状态由FIN_WAIT_2进入TIME_WAIT,等待2MSL时间,进入CLOSED状态;服务器在收到最后一次ACK后,由LAST_ACK进入CLOSED;</li></ul><p><img src="/img/remote/1460000041794005" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041794006" alt="图片" title="图片"></p><h6>为什么需要等待2MSL?</h6><ul><li>最后一个报文没有确认;</li><li>确保发送方的ACK可以到达接收方;</li><li>2MSL时间内没有收到,则接收方会重发;</li><li>确保当前连接的所有报文都已经过期。</li></ul><h2>应用层</h2><p>为操作系统或网络应用程序提供访问网络服务的接口。应用层重点:</p><ul><li>数据传输基本单位为报文;</li><li>包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。</li></ul><h6>DNS详解</h6><p>DNS(Domain Name System:域名系统)【C/S,UDP,端口53】:解决IP地址复杂难以记忆的问题,存储并完成自己所管辖范围内主机的 域名 到 IP 地址的映射。</p><p>域名解析的顺序:</p><ul><li>【1】浏览器缓存,</li><li>【2】找本机的hosts文件,</li><li>【3】路由缓存,</li><li>【4】找DNS服务器(本地域名、顶级域名、根域名)->迭代解析、递归查询。</li></ul><p>IP—>DNS服务—>便于记忆的域名</p><p>域名由点、字母和数字组成,分为顶级域(com,cn,net,gov,org)、二级域(baidu,taobao,qq,alibaba)、三级域(www)(12-2-0852)</p><p><img src="/img/remote/1460000041794007" alt="图片" title="图片"></p><h6>DHCP协议详解</h6><p>DHCP(Dynamic Configuration Protocol:动态主机设置协议):是一个局域网协议,是应用UDP协议的应用层协议。作用:为临时接入局域网的用户自动分配IP地址。</p><h6>HTTP协议详解</h6><p>文件传输协议(FTP):控制连接(端口21):传输控制信息(连接、传输请求),以7位ASCII码的格式。整个会话期间一直打开。</p><p>HTTP(HyperText Transfer Protocol:超文本传输协议)【TCP,端口80】:是可靠的数据传输协议,浏览器向服务器发收报文前,先建立TCP连接,HTTP使用TCP连接方式(HTTP自身无连接)。</p><h6>HTTP请求报文方式:</h6><ul><li>GET:请求指定的页面信息,并返回实体主体;</li><li>POST:向指定资源提交数据进行处理请求;</li><li>DELETE:请求服务器删除指定的页面;</li><li>HEAD:请求读取URL标识的信息的首部,只返回报文头;</li><li>OPETION:请求一些选项的信息;</li><li>PUT:在指明的URL下存储一个文档。</li></ul><p><img src="/img/remote/1460000041794008" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041794009" alt="图片" title="图片"></p><h6>HTTP工作的结构</h6><p><img src="/img/remote/1460000041794010" alt="图片" title="图片"></p><h6>HTTPS协议详解</h6><p>HTTPS(Secure)是安全的HTTP协议,端口号443。基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。</p><blockquote>文章:blog.csdn.net/Royalic/article/details/119985591</blockquote><p><strong>如果本文对你有帮助的话,欢迎</strong>点赞&转发<strong>,这对我继续分享&创作优质文章非常重要。感谢🙏🏻</strong></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
常用数据库选型!你做对了吗?
https://segmentfault.com/a/1190000041419728
2022-02-17T14:20:07+08:00
2022-02-17T14:20:07+08:00
民工哥
https://segmentfault.com/u/jishuroad
13
<h2>影响数据库选择的因素</h2><ul><li>数据量:是否海量数据,单表数据量太大会考验数据库的性能</li><li>数据结构:结构化 (每条记录的结构都一样) 还是非结构化的 (不同记录的结构可以不一样)</li><li>是否宽表:一条记录是 10 个域,还是成百上千个域</li><li>数据属性:是基本数据 (比如用户信息)、业务数据 (比如用户行为)、辅助数据 (比如日志)、缓存数据</li><li>是否要求事务性:一个事务由多个操作组成,必须全部成功或全部回滚,不允许部分成功</li><li>实时性:对写延迟,或读延迟有没有要求,比如有的业务允许写延迟高但要求读延迟低</li><li>查询量:比如有的业务要求查询大量记录的少数列,有的要求查询少数记录的所有列</li><li>排序要求:比如有的业务是针对时间序列操作的</li><li>可靠性要求:对数据丢失的容忍度</li><li>一致性要求:是否要求读到的一定是最新写入的数据</li><li>对增删查改的要求:有的业务要能快速的对单条数据做增删查改 (比如用户信息),有的要求批量导入,有的不需要修改删除单条记录 (比如日志、用户行为),有的要求检索少量数据 (比如日志),有的要求快速读取大量数据 (比如展示报表),有的要求大量读取并计算数据 (比如分析用户行为)</li><li>是否需要支持多表操作</li></ul><p>不同的业务对数据库有不同的要求</p><h2>SQL 数据库 & NoSQL 数据库</h2><h6>SQL 数据库就是传统的关系型数据库</h6><ul><li>行列式表存储</li><li>结构化数据</li><li>需要预定义数据类型</li><li>数据量和查询量都不大,如果数据量大要做分表</li><li>对数据一致性、完整性约束、事务性、可靠性要求比较高</li><li>支持多表 Join 操作</li><li>支持多表间的完整性,要删除 A 表的某条数据,可能需要先删除 B 表的某些数据</li><li>SQL 的增删改查功能强</li><li>较为通用,技术比较成熟</li><li>大数据量性能不足</li><li>高并发性能不足</li><li>无法应用于非结构化数据</li><li>扩展困难</li></ul><p>常用的 SQL 数据库比如 Oracle、MySQL、PostgreSQL、SQLite</p><h6>NoSQL 泛指非关系型数据库</h6><ul><li>表结构较灵活,比如列存储,键值对存储,文档存储,图形存储</li><li>支持非结构化数据</li><li>有的不需要预定义数据类型,有的甚至不需要预定义表</li><li>支持大数据量</li><li>多数都支持分布式</li><li>扩展性好</li><li>基本查询能力,高并发能力比较强 (因为采用非结构化、分布式,并牺牲一致性、完整性、事务性等功能)</li><li>对数据一致性要求比较低</li><li>通常不支持事务性,或是有限支持</li><li>通常不支持完整性,复杂业务场景支持较差</li><li>通常不支持多表 Join,或是有限支持</li><li>非 SQL 查询语言,或类 SQL 查询语言,但功能都比较弱,有的甚至不支持修改删除数据</li><li>不是很通用,技术多样,市场变化比较大</li></ul><h6>常用的 NoSQL 数据库比如</h6><ul><li>列式:HBase、Cassandra、ClickHouse</li><li>键值:Redis、Memcached</li><li>文档:MongoDB</li><li>时序:InfluxDB、Prometheus</li><li>搜索:Elasticsearch</li></ul><p>SQL 和 NoSQL 是一个互补的关系,应用在不同的场景中。</p><h2>OLTP & OLAP</h2><h6>OLTP (On-Line Transaction Processing)</h6><ul><li>主要做实时事务处理</li><li>比如处理用户基本信息、处理订单合同、处理银行转账业务、企业的 ERP 系统和 OA 系统,等等</li><li>频繁地,对少量数据,甚至是单条数据,做实时的增删改查</li><li>数据库经常更新</li><li>通常对规范化、实时性、稳定性、事务性、一致性、完整性等有要求</li><li>操作较为固定,比如订单业务,可能永远就那几个固定的操作</li><li>数据库主要模型是 3NF 或 BCNF 模型</li></ul><p>OLAP (On-Line Analytical Processing)</p><ul><li>数据仓库,主要做历史数据分析,为商业决策提供支持</li><li>比如对大量的用户行为做分析,对设备的状态、使用率、性能做分析</li><li>频率较低地,对大量数据,做读取、聚合、计算、分析,实时性要求不高,对吞吐能力要求较高</li><li>通常列的数量比较多,但每次分析的时候只取少部分列的数据</li><li>通常是批量导入数据</li><li>通常数据导入后不会修改,主要是读取操作,写少读多</li><li>通常对规范化、事务性、一致性、完整性等要求较低,甚至一个查询操作失败了也不会有什么影响</li><li>操作较为灵活,比如一个海量用户行为数据表,可以想出许多不同的方法,从不同的角度对用户做分析</li><li>数据库主要是星型、雪花模型</li><li>不使用高性能的 OLAP 之前,更传统的做法是通过离线业务构建 T+1 的离线数据,比较滞后</li></ul><p>OLTP 通常用传统的关系数据库,如果数据量大要分表,对事务性、一致性、完整性等要求不高的话也可以用 NoSQL</p><p>OLAP 通常用 NoSQL,数据量不大的话也可以用传统的关系数据库</p><h2>关系型数据库 Oracle、SQL Server、MySQL、PostgreSQL、SQLite</h2><p>Oracle:甲骨文开发的商业数据库,不开源,支持所有主流平台,性能好,功能强,稳定性好,安全性好,支持大数据量,比较复杂,收费昂贵。</p><p>SQL Server:微软开发的商业数据库,只能在 Windows 运行。</p><p>MySQL:甲骨文拥有的开源数据库,支持多种操作系统,体积小,功能弱些,简单的操作性能好,复杂的操作性能差些。** PostgreSQL**:使用 BSD 协议的完全开源免费的项目,支持多种操作系统,功能更强大,可以和多种开源工具配合。</p><p>SQLite:开源、轻型、无服务器、零配置,一个数据库就只是一个文件,在应用程序内执行操作,占用资源小,可用于嵌入式或小型应用。</p><h6>应用场景</h6><p>Oracle 多用于银行等高要求的领域,要求不高的比如互联网行业多用 MySQL 和 PostgreSQL,而 SQLite 用于嵌入式或作为应用程序内的数据库使用,SQL Server 用于 Window 服务器。</p><h2>HBase (宽表、列式存储、键值对存储、NoSQL、OLTP)</h2><ul><li>基于 Hadoop 的 HDFS 分布式文件系统</li><li>分布式数据库,需要 ZooKeeper 作为节点间的协调器</li><li>支持宽表,支持非结构化数据,不需要预定义列和数据类型</li><li>列式存储,每个 HFile 文件只存储一个列族的数据,一个列族可以有多个 HFile,而 HFile 内部按 Key-Value 格式存储,其中 Key 是 rowkey, column family, column, timestamp 的组合并且按 rowkey 在 HFile 中按序存储,而 value 就是 Column Cell 的值</li><li>支持海量数据 (千亿级数据表)</li><li>数据先写入内存,达到阀值再写入磁盘,性能好,占用内存大</li><li>不支持 SQL,不支持 Join,有自己专用的语句,支持增删改查</li><li>自动分区、负载均衡、可线性扩展</li><li>自动故障迁移</li><li>强一致性 (每个分区 Region 只由一个 Region Server 负责,容易实现强一致性)</li><li>CP 模型 (不保证可用性,每个 Region 只由一个 Region Server 负责,Server 挂了得做迁移导致暂时不可用)</li><li>不支持事务、二级索引</li></ul><h6>应用场景</h6><p>组件比较多,比较重,适用于已有的 Hadoop 平台,适用于海量宽表数据、需要增删改查、OLTP 的场景</p><h2>Phoenix (基于 HBase 的数据库引擎、关系型、OLTP)</h2><ul><li>嵌入到 HBase 的 Region Server 的数据库引擎</li><li>支持 SQL</li><li>支持 Join</li><li>支持事务 (需要在定义表的时候配置)</li><li>支持二级索引</li><li>支持撒盐</li><li>支持 JDBC</li></ul><h6>应用场景</h6><p>用于强化 HBase,主要作为 OLTP,查询性能要求不高的话也可作为 OLAP,多用于 HDP (HDP 有集成 Phoenix)</p><h2>Cassandra (宽表、键值对存储、NoSQL、OLTP)</h2><ul><li>无单点故障:Cassandra 节点按环形排列,没有中心节点,每个节点独立互联地扮演相同角色,每个节点都可以接受读写请求,数据可以有多个副本存储在多个节点,节点之间通过 Gossip (P2P) 协议交换状态信息,集群中有若干节点配为种子节点,用于新加入的节点获取集群拓扑结构并启动 Gossip 协议</li><li>提供类 SQL 语言 CQL</li><li>适合结构化、非结构化数据</li><li>Table 需要定义 Partition Key、Clustering Key、以及普通列,其中 Partition Key 用于分区和排序,即按照 Partition Key 的 Hash Token 决定了数据被分配到哪个节点,并且在节点内也是按该 Hash Token 按序存储的,有相同 Partition Key 的数据会存在一起,并且按照 Clustering Key 排序存储,有点类似于 HBase 的 RowKey、ColumnFamily、Column,不过 HBase 是相同 CF 存一起,内部再按 RowKey 排序存储,再取 Column 值 (Column 值不排序),而 Cassandra 是先按 Partition Key 的 Token 排序存储,内部再按 Clustering 排序存储,再取普通 Column 的值 (Column 值不排序)</li><li>高度可扩展,允许添加硬件、节点以提高数据容量,同时保持快速的响应时间</li><li>通过 Consistency 命令可以配置一致性级别,主要是通知客户端操作前,必须确保的 replica 的成功数量</li><li>Cassandra 采用的是最终一致性,是 CAP 理论里的 AP</li><li>Cassandra 不支持 Join 和子查询</li></ul><h6>应用场景</h6><p>主要用于 OLTP,要求不高的话也可以作为 OLAP 使用,和 HBase 比需要的组件比较少,维护比较容易</p><h2>Redis (基于内存的 Key-Value 的 NoSQL 数据库,OLTP)</h2><ul><li>由 C 语言编写</li><li>支持多种数据类型如 strings,hashes,lists,sets,sorted sets,bitmaps,hyperloglogs,geospatial 等</li><li>操作原子性,保证了两个客户端同时访问服务器将获得更新后的值</li><li>数据存储在内存中</li><li>可以配置持久化,周期性的把更新数据写入磁盘,或周期性地把修改操作写入追加记录文件,也可以关闭持久化功能,将 Redis 作为一个高效的网络缓存数据功能使用</li><li>支持主从同步,数据可以从主服务器向任意数量的从服务器同步,从服务器可以是关联其他从服务器的主服务器,这使得 Redis 可执行单层树复制,存盘可以有意无意的对数据进行写操作,由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录,同步对读取操作的可扩展性和数据冗余很有帮助</li><li>支持消息的发布/订阅(Pub/Sub)模式</li><li>单线程模式,即网络 IO、数据读写,都由一个线程完成,正因为如此保证了原子性、稳定性、代码容易维护,之所以单线程不影响性能,是因为数据都在内存,操作本来就高效,当然这里的单线程指网络 IO、数据读写这个主功能,实际上还有其他线程,比如周期性写入硬盘的线程</li><li>高版本在网络 IO 这块使用了多线程 (因为在高并发操作时,网络 IO 成为了瓶颈),但读写操作还是单线程 (操作内存数据性能还是非常高的,能应付高并发场景)</li></ul><h6>应用场景</h6><p>通常作为高性能内存数据库、缓存、消息中间件等使用</p><h2>memcached (基于内存的 Key-Value 的 NoSQL 数据库,OLTP)</h2><ul><li>开源、高性能、分布式的基于内存的 Key-Value 数据存储,作用类似于 Redis</li><li>存储 String/RawData,不定义数据结构 (Redis 有 hash、list、set 等多种结构)</li><li>数据通常由 key,flags,expire time,bytes,value 组成</li><li>服务端基本上只能简单的读写数据,服务端能支持的操作比较少</li><li>包含 Server 组件和 Client 组件,可以有多个 server 但 server 之间是独立的,没有同步广播等机制,需要选择哪个 server 由 client 的 API 决定的</li><li>数据只在内存,不会落到硬盘</li><li>没有安全机制</li><li>协议简单性能高效</li></ul><h6>应用场景</h6><p>memcached 比较简单,作为纯粹的 Key-Value 缓存性能会比 Redis 好些,但功能没有 Redis 强大</p><h2>MongoDB (文档数据库,NoSQL,OLTP)</h2><p>之所以说是文档数据库,是因为它的数据是以 JSON 文档的形式存储</p><p>MongoDB 的概念和很多数据库不一样,它的 collection 相当于表,document 相当于行,field 相当于列,比如:</p><pre><code>db.user.insert(
{
"name": "Lin",
"age": 30
"address": {
"street": "Zhongshan Road",
"city": "Guangzhou",
"zip": 510000
},
"hobbies": ["surfing", "coding"]
}
)</code></pre><p>这是一条插入语句,这里的 db 是指当前数据库,user 就是 collection 相当于表,insert 语句里面的 JSON 就是 document 相当于其他数据库的行,name,age,street 这些就是 field 相当于列</p><p>相同的文档可以插入多次而不会被覆盖,实际上 mongodb 会自动创建 \_id 字段作为 primary key,并分配不同的数值,所以不会重复,也可以 insert 的时候指定 \_id,但如果 \_id 已经存在则会报错</p><ul><li>可以看到,mongodb 是非结构化数据,不需要预定义 collection,也不需要预定义数据结构</li><li>提供丰富的查询表达式</li><li>支持二级索引,自动负载平衡,读效率比写高</li><li>支持分布式、支持故障恢复、数据冗余、分片、水平扩展</li><li>可以配置存储引擎,WiredTiger Storage Engine (默认) 会做内存到文件的映射以提高性能,但内存消耗大,In-Memory Storage Engine (企业版支持) 只存在内存,不会落盘</li><li>高版本支持 Join,支持事务</li><li>支持安全认证功能</li><li>提供扩展,比如实现可视化的工具,实现 BI 集成的工具</li></ul><h6>应用场景</h6><p>mongodb 更适用于高度非结构化,或者源数据就是 JSON,每条数据比较大,以 OLTP 为主的场景,不适合于事务要求比较高,或比较复杂的大数据量的查询的场景,另外由于 mongodb 的语法和其他数据库差异比较大,需要一定的学习成本</p><h2>Hive (基于 HDFS 的数据库引擎、关系型、OLAP)</h2><ul><li>Hive 是基于 Hadoop 的一个数据仓库工具</li><li>数据存储在 HDFS,创建表的时候要通过 STORED AS 命令指定存储格式比如 TEXTFILE、ORCFILE、PARQUET,也可以通过 STORED BY 命令指定为 HBase,可以创建新表也可以创建已有 HBase 表的映射</li><li>查询通过 MapReduce、Spark 等作业完成</li><li>提供了类 SQL 查询语言 HQL (HiveQL),支持用户定义函数 (UDF)</li><li>高版本支持事务 (需要创建表时指定)</li><li>支持海量数据</li><li>结构化数据</li><li>支持增删改查</li></ul><h6>应用场景</h6><ul><li>不适合于 OLTP,主要作为 OLAP 用于大数据批量查询使用,需要有 Hadoop 平台</li></ul><h2>Impala (基于 HDFS、HBase、Kudu 存储,并行计算,关系型,OLAP)</h2><ul><li>Cloudera 开发的基于内存的分布式并行计算的数据库查询引擎</li><li>主要由 C++ 实现,和 Hadoop 的交互使用 JNI</li><li>Impala 使用和 Hive 一样的 metadata、SQL、ODBC driver、UI,这样在提高了 HDFS 的 SQL 查询性能的同时,又提供了相似的用户使用体验</li><li>和 Hive 一样可以通过 STORED AS 指定 HDFS 的存储格式比如 TEXTFILE、ORCFILE、PARQUET</li><li>通过 Hive 操作的表,需要手动同步到 Impala</li><li>Impala 不仅 SQL 和 Hive 一样,实际上元数据也存在 Hive 中</li><li>表数据除了 HDFS,也可以存储到 HBase,但需要在 HBase 建表,然后在 Hive 通过 STORED BY 建立映射表,由于 Impala 和 Hive 使用一样的 metadata,在 Hive 建好表后,只要在 Impala 执行刷新命令 INVALIDATE METADATA,就可以看到对应的 HBase 表</li><li>支持 Join、Aggregate 等功能</li><li>支持 JDBC、ODBC</li><li>和 Hive 不同,Impala 不依赖于 MapReduce,而是在每个 HDFS DataNode 上运行自己的引擎实现并行处理</li><li>Impala 的并行处理引擎主要由 state store、catalog service、多个 impala daemon 组成</li><li>每个 impala daemon 都可以接收 client 的请求,impala daemon 由 query planner、query coordinator、query executor 组成,planner 接收 client 的 SQL 查询,然后分解为多个子查询,由 coordinator 将子查询分发到各个 daemon 的 executor 执行,daemon 获取 HDFS、HBase 数据、计算、然后返回给 coordinator,然后由 coordinator 聚合后将最终结果返回给 client</li><li>Impala 是无中心结构,每个 daemon 都可以接受连接查询,可以通过 HA Proxy 实现多个 daemon 的负载均衡</li><li>state store 用于收集监控各个 daemon 的状态</li><li>catalog service 将 SQL 做出的元数据变化通知给集群中所有的 impala daemon</li><li>Impala 的计算都在内存进行,对内存要求比较高</li><li>Impala 在 2.8 以后才支持 update 操作,但是只限于 Kudu 存储,需要安装 Kudu,并通过 STORED AS 指定 Kudu 作为数据库的存储,Kudu 是 Cloudera 开发的列式存储管理器,目的是做 OLAP,并且平衡 HDFS 和 HBase 的性能,Kude 的随机读写性能比 HDFS(比如 Parquet)好,但是比 HBase 差,而大数据量查询性能比 HDFS(比如 Parquet)差,但比 HBase 好,Kude 和 Impala 高度集成,也可以和 MapReduce/Spark 集成,用 Kudu 替换 HDFS/HBase 这样 Impala 就可以做 update,兼顾 OLAP 和改数据的需求,适合于以 OLAP 为主又有一定的 Update 需求的场景,Kudu 可以配置一致性,采用结构化表数据模型,需要定义主键,不使用 HDFS 而是有自己的组件存储和管理数据, 采用 c++ 没有 full gc 风险</li></ul><h6>应用场景</h6><ul><li>Impala 不适合于 OLTP,主要作为 OLAP 用于大数据批量查询使用</li><li>需要有 Hadoop 平台和 Hive</li><li>性能比 Hive 好很多</li><li>作为 OLAP 的性能比 Phoenix 之类的好</li><li>主要是 CDH 在推,CDH 有集成 Impala</li></ul><h2>Presto (基于多种数据源,并行计算,关系型,OLAP)</h2><ul><li>Facebook 推出的基于内存的分布式并行计算的数据库查询引擎</li><li>由 coordinator server、discovery server (通常集成在 coordinator 里,也可以独立)、多个 worker server 组成</li><li>coordinator 负责与 client 交互,负责管理 worker,负责解析 statement、规划 query、创建一系列的 stage、再转换成一系列的 task 分发到不同 worker 并发执行</li><li>worker 负责执行 task 和处理数据,会通过 connector 获取数据,和其他 worker 交互中间数据,最终结果会由 coordinator 返回给 client</li><li>connector 是适配器,使得 Presto 可以访问不同的数据库</li><li>内建的 connector 主要是 Hive,此外有很多三方开发的 connector 比如 cassandra、es、kafka、kudu、redis、mysql、postgresql 等等</li><li>需要在配置文件配置 catalog,这里 catalog 维护 schema 并通过 connector 指向一个数据源,定位 presto 表都是从 catalog 开始的,比如 hive.test\_data.test 指的是 hive catalog 下的 test\_data schema 下面的 test 表,而 schema 的概念则依赖于具体的 connector,比如对于 mysql 而言,presto 的 schema 就是 mysql 的 schema,而对于 cassandra 而言,presto 的 schema 就是 cassandra 的 keyspace,可以建立多个 catalog 关联同一个 connector 比如环境里有多个 kafka 集群那可以有 kafka1 和 kafka2 两个 catalog</li><li>statement 可以认为就是 presto 收到的 sql 语句,然后会解析成 query plan,然后 query 又被分为多个 stages,这些 stages 组成一个树的结构,每个 stage 会聚合计算它下面的其他 stages 的结果,每个 stage 又分为一个或多个 tasks,这些 task 会分发到不同的 worker 并行执行,每个 task 处理不同的数据分片,每个 task 又有一个或多个 driver 并发处理数据</li><li>Presto 支持 JDBC 接口,JDBC 的 URL 格式为 jdbc:presto://host:port/catalog/schema 或 jdbc:presto://host:port/catalog 或 jdbc:presto://host:port</li><li>支持 Join 查询,并且支持多数据源的 join 查询 (多张大表的 join 可能会影响性能),跨数据源查询的时候需要指定完整的表名即 [catalog].[schema].[table],并且使用 presto://host:port 连接 JDBC,不指定 catalog 和 schema</li><li>有限支持子查询</li><li>不支持 update 操作</li><li>支持安全机制</li><li>支持标准的 ANSI SQL</li><li>扩展性好</li><li>可以和 Tableau 集成</li><li>支持 Spark</li></ul><h6>应用场景</h6><ul><li>适合有多种数据源的大数据量的 OLAP 查询</li><li>性能和 Impala 可能差不多,但支持多种数据源,不依赖 Hadoop</li></ul><h2>Greenplum (基于多个 PostgreSQL,并行计算,关系型,OLAP)</h2><ul><li>基于多个 PostgreSQL 的分布式并行计算的数据库查询引擎</li><li>内部的 PostgreSQL 有做改动以适应并行分布式计算</li><li>主要由一个 master、多个 segments、一个 interconnect 组成</li><li>master 维护元数据,接收并认证 client 的链接,接收 SQL 请求,解析 SQL,生成 query plan,并将任务分发到 segments,协调聚合 segments 的返回结果,并将最终结果返回给 client,可以设置 master 为主从配置</li><li>每个 segment 有个独立的 PostgreSQL 数据库,每个 segment 负责存储部分数据,并执行相应的查询计算,segment 也可以配置备份机制</li><li>Interconnect 是 Greenplum 的网络层,负责 master 和 segment 的链接,以及各个 segment 之间的链接</li><li>链接和 SQL 语法都和 PostgreSQL 兼容,支持 JDBC、ODBC</li><li>创建表时可以指定是用列存储、行存储、外部表 (数据在其他系统比如 HDFS 而 GP 只存储元数据)</li><li>操作外部数据,需要安装 PXF (Platform Extension Framework),有了 PXF 可以支持 Hive、HBase、Parquet、S3、MySQL、ORACLE 等等</li><li>支持安全、权限配置</li><li>支持分布式事务,支持 ACID,保证数据的强一致性,不是使用锁,而是使用 MVCC (Multi-Version Concurrency Control) 来保证数据一致性</li><li>shared-nothing 架构</li></ul><h6>应用场景</h6><p>和 Impala、Presto 类似都是并行内存计算,但 Greenplum 性能可能稍差一点点,并且 Greenplum 还分开源版和商业版,有的功能只有商业版才支持</p><h2>Kylin (基于 Hive、HBase,并行计算,关系型,多维度、预计算 OLAP)</h2><p>传统 OLAP 根据数据存储方式的不同分为 ROLAP(Relational OLAP)以及 MOLAP(Multi-Dimension OLAP),ROLAP 以关系模型的方式存储数据,优点在于体积小,查询方式灵活,缺点是每次查询都需要对数据进行聚合计算,而 Kylin 属于 MOLAP</p><p>Kylin 将数据按维度的不同组合,提前计算好结果,形成 Cube (立方体) 结构,这样查询速度快,缺点是数据量不容易控制,N 个维度可以有 2**N 种组合,可能会出现维度爆炸的问题,而且数据有改动的话需要重新计算</p><p>比如有 Phone 和 Country 两张维度表,以及 Sale 事实表 (明细表),取手机品牌、国家、日期作为三个维度,有 (null)、(品牌)、(国家)、(日期)、(品牌、国家)、(品牌、日期)、(国家、日期)、(品牌、国家、日期) 共 8 种组合,可以提前计算好这 8 种 group by 组合的 sale 的各种汇总信息 (sum、count 等),一个维度组合的一个汇总信息称为一个 cuboid,所有的 cuboid 合起来就被称为一个 Cube</p><p>Kylin 的数据源可以是 Hive 或 Kafka (Json 格式消息,key 就是列名)</p><p>Kylin 的预计算结果存到 HBase,RowKey 就是各种维度的组合,相应的明细汇总存在 Column 中,这样 SQL 就变成对 RowKey 的扫描,并进一步的对 Column 计算 (如果需要的话),这样查询性能自然就提升了,可以支持亚秒级查询</p><p>Kylin 支持 ODBC,JDBC,RESTful API 等接口</p><p>Kylin 可以和 Tableau、PowerBI 等 BI 工具集成</p><h6>使用步骤如下</h6><ul><li>创建 Project</li><li>同步 Hive 表或 Kafka 表</li><li>创建 Data Model</li><li>创建并命名 Model</li><li>选择 Fact Table (事实表) 和 Lookup Table (查找表,主要是维度信息),以及 Join 字段</li><li>从 Fact Table 和 Lookup Table 中挑选维度列 (可以被 Cube 做 group by)</li><li>从 Fact Table 选择指标列 (可以被 Cube 做 aggregation)</li><li>从 Fact Table 选择用于日期分区的列,不需要就留空</li><li>添加 Filter (可以被 Cube 用来做 Where 操作)</li><li>创建 Cube</li><li>创建并命名 Cube,并选择要关联的 Data Model</li><li>添加维度列 (必须从 Data Model 配置的维度列中选择)</li><li>添加指标列 (必须从 Data Model 配置的指标列中选择)</li><li>共有 8 种 aggregation 操作可以配置给指标列:SUM, MAX, MIN, COUNT, COUNT\_DISTINCT, TOP\_N, EXTENDED\_COLUMN and PERCENTILE (如果要查 avg 实际上就是用 sum 除以 count 得出,所以这里不需要配置 avg 等可以通过预计算结果进一步计算出的操作)</li></ul><p>build Cube,实际是通过 MapReduce/Spark 计算,任务完成后结果会写入 HBase</p><p>build 成功后即可直接用 SQL 查询了,实际是根据维度查 RowKey,然后把 Column 存的聚合结果取出,如果必要的话再做进一步计算</p><p>如果数据源有改动,需要重新 build Cube</p><p>可以看到 Kylin 是一个纯粹的 OLAP 工具,通过预计算提升查询性能,但无法及时反应出数据源的改变,预计算可能很耗时并且可能会占用大量空间,且需要和 Hadoop 集成</p><p>基于预计算的 OLAP 数据查询引擎还有 Druid</p><h2>ClickHouse (列存储,向量化计算,并行计算,OLAP)</h2><p>俄罗斯企业 Yandex 开发的 OLAP 数据库</p><ul><li>列存储对于 OLAP 的好处</li><li>由于 OLAP 经常是在大量数据列中检索少量列,如果采用行存储,意味着要逐行扫描,并且每行都很大,而采用列存储只需要扫描要检索的列,能减少 IO</li><li>假设有的记录并没有存储要检索的列,行存储依然要扫描该记录才知道,而对于列存储则不存在这样的问题,因为没存储,自热而然就不会扫描到</li><li>因为同一列的数据类型、大小比较一致,列存储更容易压缩,效率更高,进一步减少 IO</li><li>IO 的减少还意味着有更多数据可以被缓存到内存</li><li>向量化计算</li><li>SIMD (Single Instruction,Multiple Data,单指令流多数据流),现在的 CPU 支持这样的功能,通过一条指令即可利用多核对一组数据 (也就是向量) 进行 CPU 层面的并发计算,适用于纯基础计算的场景,如果有判断、跳转、分支的场景则不合适</li><li>ClickHouse 有一个向量计算引擎,尽可能地使用 SMID 指令,批量并行地处理数据,大大提升了处理能力</li><li>主要由 C++ 实现</li><li>无中心化结构,由一个集群的 server 组成,并且每个 server 都可以接受客户端的链接查询,server 收到请求后会和其他 server 协调做并行计算,每个 server 都是多线程的,server 之间通过 ZooKeeper 协调同步</li><li>支持分片(shard),数据可以跨节点存储在不同分片中,一个分片就是一个节点,或者多个节点组成一个有副本备份的分片,由配置文件配置</li><li>支持分区,通过 Partition By 命令创建表</li><li>分片和分区有时候不好区分,分片更多指的是表的数据分布在不同节点,而且一个节点可以存储多个数据库、多个表的数据,而分区更多指的是按某列数据将一个大表分成多个小表,比如按日期列分区,每天一个分区表,既可以查分区表,也可以查大表</li><li>支持副本备份、支持数据完整性</li><li>表引擎(Table Engine)</li><li>在某个 server 创建的表只是该 server 的本地表,不是分布式的,如果要创建分布式表,需要在每个 server 创建相同名字的表,再在其中一台 server 上创建分布式表(会自动在所有 server 上都创建),这个分布式表是个逻辑表,不真正存储数据,而是映射到各个 server 的本地表,会自动做并行计算</li><li>ENGINE = Distributed(cluster\_name, database, table, [sharding\_key])</li><li>cluster\_name 是在配置文件里配置的</li><li>ENGINE = Memory 数据存在内存</li><li>ENGINE = ODBC(connection\_settings, external\_database, external\_table)</li><li>ENGINE = JDBC(dbms\_uri, external\_database, external\_table)</li><li>ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password')</li><li>ENGINE = PostgreSQL('host:port', 'database', 'table', 'user', 'password')</li><li>ENGINE = MongoDB(host:port, database, collection, user, password)</li><li>ENGINE = HDFS(URI, format)</li><li>ENGINE = Kafka() SETTINGS kafka\_broker\_list = 'host:port', kafka\_topic\_list = 'topic1'</li><li>ENGINE = Log;</li><li>ENGINE = TinyLog;</li><li>ENGINE = MergeTree()</li><li>ENGINE = AggregatingMergeTree()</li><li>创建表的时候要通过 Engine 命令指定要用的表引擎,决定如何存储数据</li><li>最常用的是 MergeTree 系列引擎,比如</li><li>比较轻量级的 Log 系列引擎</li><li>允许从其他数据源查询,比如</li><li>特殊类型,比如</li><li>分布式</li><li>通常使用 MergeTree 存储,数据可以快速地按序 append 到一颗 MergeTree 的后面,后台会做合并和压缩操作,这样提升了数据插入的性能</li><li>主索引,数据按 Primary Key 排序</li><li>也可以在创建表时通过 Order By 指定排序的字段</li><li>支持二级索引,也叫跳数索引 data skipping index,比如 minmax 索引,会统计每一段数据内某列数据(或是某个表达式)的最大值和最小值,检索的时候可以依据 minmax 决定是否跳过这段数据(感觉比较怪,性能应该比重建一张索引表的做法要差吧)</li><li>支持 TTL,包括列级别、行级别、分区级别的 TTL</li><li>支持 HTTP、TCP 接口</li><li>支持 JDBC、ODBC</li><li>有三方工具支持将其他数据库如 PG 的数据导入 ClickHouse</li><li>有三方工具支持和一些可视化工具如 Grafana、DBeaver、Tabix 集成</li><li>有三方工具支持 Kafka、Flink、Spark 等</li><li>支持 SQL,支持 group by、order by、join、部分子查询等功能</li><li>支持 array、json、tuple、set 等复杂数据类型</li><li>支持近似计算,比如计算平均值,可以取部分数据计算,这样提升了性能,但降低了准度</li><li>自适应 Join 算法,比如优先使用 Hash-Join,如果有多张大表则自动改用 Merge-Join</li><li>安全机制、基于 Role 的权限控制</li><li>支持错误恢复、扩展性好</li></ul><h6>不足的地方</h6><ul><li>对高并发的支持不足</li><li>没有成熟的事务功能</li><li>修改、删除数据的性能比较差,并且仅提供有限支持</li><li>Primary Key 是采用稀疏索引,即索引只能指向一段数据,具体的数据还得一条条查,所以如果是查少量数据,或者查询单条数据,性能会比较差</li></ul><p>不依赖 Hadoop、列存储、向量化、并行、多线程、多存储引擎</p><p>单表查询性能极好,比 Impala、Presto 之类的要好很多</p><p>多表查询性能差些,比 Impala、Presto 之类的要差</p><h2>Elasticsearch (倒索引、分词、搜索引擎)</h2><ul><li>Elastic Stack 是一组组件包括 Elasticsearch、Logstash、Filebeat、Kibana 等</li><li>Elasticsearch 是基于 Apache Lucene 开发的搜索引擎,主要由 Java 开发</li><li>Elasticsearch 集群主要由 master、data、ingest、coordinating 节点组成</li><li>每个节点可以同时配置多种角色,比如即是 master 又是 data,但在大型集群中,通常每个节点只负担一种功能</li><li>coordinating 是每个节点都会有的功能,不需要配置,即无论 master 还是 data 都会有 coordinating 功能,用于接收 client 的读写请求,然后将请求转发给相应节点处理,然后将处理结果合并后返回给 client,在大型集群中为了不对 master/data 等节点造成太大压力,可以配置多个专门的 coordinating,通过将 role 配置为空或是将 master、data、ingest 设置为 false (取决于不同版本) 即可,这样这些 coordinating 节点就只负责接收响应 client 请求不做其他工作,就像是一个反向代理的负载均衡一样,能提高并发性能</li><li>master 负责管理整个集群,负责对 index 的创建删除等管理操作,决定数据要分片到哪个节点,管理其他节点的状态等等,可以配置多个 master 做 HA,需要单数个,至少要 3 个,系统实际上自动选举其中一个做 master,如果该 master 挂了,会从其他配置为 master 的节点中重新选举一个,master 的配置可以低一些</li><li>data 负责存储、计算、处理数据,对资源要求比较高,data 还可以进一步配置,指定节点用于存储 hot data、warm data、cold data 等等</li><li>Ingest 是可选节点,专门用于针对某些数据和操作,做流水线预处理</li><li>Elasticsearch 的数据存储主要由 index,type,document 组成</li><li>index 就类似于 SQL 中的一个数据库,可以直接创建 index,也可以通过 index template 作为模板创建 index,模板通常用于具有相同配置的多个 index,比如每天都建立一个 index 用于存储当天的日志</li><li>type 就类似于 SQL 中的表 (这种说法不完全对,官方有澄清过,因为不同的 type 并不是完全独立无关的),早期版本中,一个 index 下可以有多个 type,从 6.0 开始只能有一个 type,从 7.0 开不建议使用 type 这个概念,据说从 8.0 开始将完全不支持 type</li><li>document 就是像是 SQL 中的一行记录,document 使用的是非结构化的数据,由 JSON 格式表示,JSON 的每个 field 就相当于一个列</li><li>每个 document 会一个唯一的 \_id,如果不指定则由系统自动生成</li><li>每个 document 有严格递增的序号 \_seq\_no 代表文档写入/更新的先后顺序</li><li>每个 document 有 \_version 字段,每次更改这个字段就加 1</li><li>可以先建立 index,也可以不提前建立 index,写入数据时自动创建</li><li>不需要提前设置 document 的 field,写入数据时自动创建,每个 document 的 field 可以不一样,也可以提前设置 field,使得每个 document 的 field 必须一样</li><li>Elasticsearch 会自动对所有 field 建立索引,并且会自动做分词处理,即把一个句子比如 "hello world" 自动分成 "hello" 和 "world" 两个词做索引,没有分词的 "hello world" 是 keyword,大小限制是 256,经过分词的比如 "hello" 是一个 text</li><li>Elasticsearch 采用倒索引 (inverted index),主要由三部分组成:Term Index (单词索引)、Term Dictionary (单词字典)、Posting List (索引项列表)</li><li>Term Index 存在内存中,不保存所有单词,而是保存单词的前缀,比如保存 he、wor、ad、sar 等等,指出以这些前缀作为开头的单词在 Term Dictionary 中的起始位置,这样 Term Index 的大小就比较小,可以存在内存中,并且可以帮助快速定位要读取的内容在 Term Dictionary 中的位置,可以大大减少磁盘 IO 的次数</li><li>Term Dictionary 存在磁盘中,通常单词量会非常大,记录着 index 的每个单词到 Posting List 的关联关系,通过 B+ 树或 Hash 表方式以满足高性能的插入与查询</li><li>Posting List 记录着:出现该单词的所有 document 的 id,该单词在该 document 中出现的次数,该单词在该 document 中的位置</li><li>搜索引擎通过这样的倒排序索引找到对应的 document,再做进一步处理</li><li>由于会对所有 field 做索引,数据量会非常大</li><li>数据先写入内存,然后定期将数据落盘形成一个个 segment,当 segment 多了之后会进行 merge 组成更大的 segment</li><li>为了防止内存中还没落盘的数据丢失,会写入 translog,类似于 HBase 的 WAL,其实这也需要磁盘 IO,会影响性能,但比落盘数据要简单</li><li>segment 由多个文件组成,记录着元数据、field 信息、正排序的索引信息 (即从 document id 找到相应的数据)、field 数据 (相当于按列存储)、倒排序索引数据、等等</li><li>支持 REST API 接口操作,通过在 Body 的 JSON 格式数据提高丰富的语法,可以执行很多操作</li><li>支持 Event Query Language (EQL):for event-based time series data, such as logs, metrics, and traces, 通过 REST API 的 Body 指定</li><li>支持 JDBC、ODBC,这里 table 指定的是 index,而 column 指定的是 field,这里的 SQL 不支持 JOIN</li><li>不支持事务</li><li>跨表查询不完全支持,而且要定义父子文档,要定义 join 类型的 field,比较复杂</li><li>读写有一定延时性,即写入的数据无法立刻索引到,至少要等 1 秒钟</li><li>和传统的数据库有一定差异,需要一定的学习成本</li></ul><h6>部分 REST API 操作的例子</h6><pre><code>curl localhost:9200 # 查看集群基本信息
curl localhost:9200/_cluster/health?pretty # 查看集群健康 (pretty 是 JSON 格式化输出)
curl localhost:9200/_cluster/state?pretty # 查看集群状态
curl localhost:9200/_cluster/stats?pretty # 查看统计信息
curl localhost:9200/_nodes?pretty # 查看节点信息
curl localhost:9200/_cat # 列出可以查看的各种信息 (cat 命令列出的信息比较简化)
curl localhost:9200/_cat/health
curl localhost:9200/_cat/nodes
curl localhost:9200/_cat/indices
curl -X PUT 'http://localhost:9200/my_index/my_doc/123' -H 'Content-Type: application/json' -d '{
"name": "Lin", "title": "senior designer", "age": 30
}' ## 指定 document id 为 123,会自动创建 my_index,my_doc 以及各个 fields
curl -X POST 'http://localhost:9200/my_index/my_doc' -H 'Content-Type: application/json' -d '{
"name": "Wang", "title": "senior designer", "age": 35
}' ## 由系统自动创建 document id
curl -X POST 'http://localhost:9200/my_index/my_doc_2' -H 'Content-Type: application/json' -d '{
"name": "n_1", "type": "t_1", "value": 1
}' ## 报错,不允许 index 下有两个 type
curl -X POST 'http://localhost:9200/my_index/_doc' -H 'Content-Type: application/json' -d '{
"name": "n_1", "type": "t_1", "value": 1
}' ## 允许,_doc 就是 my_doc(可以一开始就只用 _doc 而不需要 type 名)
curl -X POST 'http://localhost:9200/my_index/_doc' -H 'Content-Type: application/json' -d '{
"name": "Li",
"address": {"city": "guangzhou", "district": "tianhe"}
}' ## 允许新的 fields,允许复杂类型,貌似不支持列表 "address": ["xxx"]
curl localhost:9200/my_index/my_doc/123?pretty ## 查看 id 为 123 的记录
curl localhost:9200/my_index/my_doc/_search?pretty ## 查看所有记录
curl localhost:9200/my_index/_search?pretty
curl localhost:9200/_all?pretty ## 列出所有 index 的设置和 mapping (就是 field 的信息)
curl localhost:9200/my_index?pretty ## 查看 my_index 的设置和 mapping
curl localhost:9200/my_index/_mapping?pretty ## 查看 my_index 的 mapping
curl -X GET -H "Content-Type: application/json" localhost:9200/my_index/_search?pretty -d '{
"query": {
"term":{
"name":"lin"
}
}
}' ## 简单的查询,还有更多的语法和功能
curl -X GET -H "Content-Type: application/json" localhost:9200/my_index/_search?pretty -d '{
"query": {
"term":{
"title.keyword":"senior designer"
}
}
}' ## 默认查询的是分词,如果要查没分词的,应该加上 keyword
curl -X GET -H "Content-Type: application/json" localhost:9200/my_index/_search?pretty -d '{
"query": {
"term":{
"address.city":"guangzhou"
}
}
}' ## 查询嵌套的字段
curl localhost:9200/_search?pretty ## 在所有 index 中查找
curl -H "Content-Type: application/json" localhost:9200/my_index/_analyze?pretty -d '{
"analyzer" : "standard",
"text" : "This is the apple"
}' ## 如何分析一段文字
curl -X PUT 'http://localhost:9200/my_index_3' ## 创建 index
curl -X PUT -H "Content-Type: application/json" 'http://localhost:9200/my_index_6' -d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"title": {
"type": "text"
},
"value": {
"type": "long"
}
}
}
}' ## 创建 index 同时指定 field,在版本 7 以后不需要指定 type (不需要指定 my_doc 之类的)</code></pre><h6>应用场景</h6><p>适合于以搜索为主的业务场景,最开始 ELK (Elasticsearch + Logstash + Kibana) 就是用于日志收集和搜索</p><h2>Spark/Flink</h2><p>数据库虽然强大,但如果遇到复杂的逻辑计算也是无能为力,这种情况,就需要有专门的计算工具</p><p>Spark 和 Flink 都是高性能的并行计算引擎,Flink 更偏向实时流业务,Spark 更偏向批处理业务,都可以用来高效地处理数据</p><h2>BI</h2><p>数据通常要可视化,比较常用的 BI 工具有 Tableau (收费的) 和 PowerBI</p><h2>整体系统架构</h2><p>K8S (容器部署) + SpringCloud (微服务) + Keycloak (认证) + Kafka (数据流) + Spark/Flink (数据处理) + ELK (日志收集) + PG/MySQL (基本数据) + NoSQL-OLTP (大数据量业务数据) + OLAP (分析业务) + BI (数据可视化)</p><p><img src="/img/bVbHCzg" alt="" title=""></p>
17 个实用 shell 脚本,建议收藏!
https://segmentfault.com/a/1190000041370811
2022-02-07T21:16:51+08:00
2022-02-07T21:16:51+08:00
民工哥
https://segmentfault.com/u/jishuroad
41
<h2>1、服务器系统配置初始化</h2><pre><code>#/bin/bash
# 安装系统性能分析工具及其他
yum install gcc make autoconf vim sysstat net-tools iostat iftop iotp wget lrzsz lsof unzip openssh-clients net-tool vim ntpdate -y
# 设置时区并同步时间
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
if ! crontab -l |grep ntpdate &>/dev/null ; then
(echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab
fi
# 禁用selinux
sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config
# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
systemctl stop firewalld
systemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then
service iptables stop
chkconfig iptables off
fi
# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
echo 'export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S `whoami` "' >> /etc/bashrc
fi
# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
echo "export TMOUT=600" >> /etc/profile
fi
# 禁止root远程登录 切记给系统添加普通用户,给su到root的权限
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
# 禁止定时任务向发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab
# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
EOF
fi
# 系统内核优化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF
# 减少SWAP使用
echo "0" > /proc/sys/vm/swappiness</code></pre><h2>2、批量创建多个用户并设置密码</h2><pre><code>#!/bin/bash
USER_LIST=$@
USER_FILE=./user.info
for USER in $USER_LIST;do
if ! id $USER &>/dev/null; then
PASS=$(echo $RANDOM |md5sum |cut -c 1-8)
useradd $USER
echo $PASS | passwd --stdin $USER &>/dev/null
echo "$USER $PASS" >> $USER_FILE
echo "$USER User create successful."
else
echo "$USER User already exists!"
fi
done</code></pre><h2>3、一键查看服务器利用率</h2><pre><code>#!/bin/bash
function cpu(){
util=$(vmstat | awk '{if(NR==3)print $13+$14}')
iowait=$(vmstat | awk '{if(NR==3)print $16}')
echo "CPU -使用率:${util}% ,等待磁盘IO相应使用率:${iowait}:${iowait}%"
}
function memory (){
total=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}'`
used=`free -m |awk '{if(NR==2) printf "%.1f",($2-$NF)/1024}'`
available=`free -m |awk '{if(NR==2) printf "%.1f",$NF/1024}'`
echo "内存 - 总大小: ${total}G , 使用: ${used}G , 剩余: ${available}G"
}
disk(){
fs=$(df -h |awk '/^\/dev/{print $1}')
for p in $fs; do
mounted=$(df -h |awk '$1=="'$p'"{print $NF}')
size=$(df -h |awk '$1=="'$p'"{print $2}')
used=$(df -h |awk '$1=="'$p'"{print $3}')
used_percent=$(df -h |awk '$1=="'$p'"{print $5}')
echo "硬盘 - 挂载点: $mounted , 总大小: $size , 使用: $used , 使用率: $used_percent"
done
}
function tcp_status() {
summary=$(ss -antp |awk '{status[$1]++}END{for(i in status) printf i":"status[i]" "}')
echo "TCP连接状态 - $summary"
}
cpu
memory
disk
tcp_status</code></pre><h2>4、找出占用CPU 内存过高的进程</h2><pre><code>#!/bin/bash
echo "-------------------CUP占用前10排序--------------------------------"
ps -eo user,pid,pcpu,pmem,args --sort=-pcpu |head -n 10
echo "-------------------内存占用前10排序--------------------------------"
ps -eo user,pid,pcpu,pmem,args --sort=-pmem |head -n 10</code></pre><h2>5、查看网卡的实时流量</h2><pre><code>#!/bin/bash
eth0=$1
echo -e "流量进入--流量传出 "
while true; do
old_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
old_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
sleep 1
new_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
new_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
in=$(printf "%.1f%s" "$((($new_in-$old_in)/1024))" "KB/s")
out=$(printf "%.1f%s" "$((($new_out-$old_out)/1024))" "KB/s")
echo "$in $out"
done</code></pre><h2>6、监控多台服务器磁盘利用率脚本</h2><pre><code>#!/bin/bash
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
#取出用户名和端口
USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
#创建临时文件,保存信息
TMP_FILE=/tmp/disk.tmp
#通过公钥登录获取主机磁盘信息
ssh -p $PORT $USER@$IP 'df -h' > $TMP_FILE
#分析磁盘占用空间
USE_RATE_LIST=$(awk 'BEGIN{OFS="="}/^\/dev/{print $NF,int($5)}' $TMP_FILE)
#循环磁盘列表,进行判断
for USE_RATE in $USE_RATE_LIST; do
#取出等号(=)右边的值 挂载点名称
PART_NAME=${USE_RATE%=*}
#取出等号(=)左边的值 磁盘利用率
USE_RATE=${USE_RATE#*=}
#进行判断
if [ $USE_RATE -ge 80 ]; then
echo "Warning: $PART_NAME Partition usage $USE_RATE%!"
echo "服务器$IP的磁盘空间占用过高,请及时处理" | mail -s "空间不足警告" 你的qq@qq.com
else
echo "服务器$IP的$PART_NAME目录空间良好"
fi
done
done</code></pre><h2>7、批量检测网站是否异常并邮件通知</h2><pre><code>#!/bin/bash
URL_LIST="www.baidu.com www.ctnrs.com www.der-matech.net.cn www.der-matech.com.cn www.der-matech.cn www.der-matech.top www.der-matech.org"
for URL in $URL_LIST; do
FAIL_COUNT=0
for ((i=1;i<=3;i++)); do
HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
if [ $HTTP_CODE -eq 200 ]; then
echo "$URL OK"
break
else
echo "$URL retry $FAIL_COUNT"
let FAIL_COUNT++
fi
done
if [ $FAIL_COUNT -eq 3 ]; then
echo "Warning: $URL Access failure!"
echo "网站$URL坏掉,请及时处理" | mail -s "$URL网站高危" 1794748404@qq.com
fi
done</code></pre><h2>8、批量主机远程执行命令脚本</h2><pre><code>#!/bin/bash
COMMAND=$*
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
PASS=$(awk -v ip=$IP 'ip==$1{print $4}' $HOST_INFO)
expect -c "
spawn ssh -p $PORT $USER@$IP
expect {
\"(yes/no)\" {send \"yes\r\"; exp_continue}
\"password:\" {send \"$PASS\r\"; exp_continue}
\"$USER@*\" {send \"$COMMAND\r exit\r\"; exp_continue}
}
"
echo "-------------------"
done</code></pre><h2>9、一键部署LNMP网站平台脚本</h2><pre><code>#!/bin/bash
NGINX_V=1.15.6
PHP_V=5.6.36
TMP_DIR=/tmp
INSTALL_DIR=/usr/local
PWD_C=$PWD
echo
echo -e "\tMenu\n"
echo -e "1. Install Nginx"
echo -e "2. Install PHP"
echo -e "3. Install MySQL"
echo -e "4. Deploy LNMP"
echo -e "9. Quit"
function command_status_check() {
if [ $? -ne 0 ]; then
echo $1
exit
fi
}
function install_nginx() {
cd $TMP_DIR
yum install -y gcc gcc-c++ make openssl-devel pcre-devel wget
wget http://nginx.org/download/nginx-${NGINX_V}.tar.gz
tar zxf nginx-${NGINX_V}.tar.gz
cd nginx-${NGINX_V}
./configure --prefix=$INSTALL_DIR/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream
command_status_check "Nginx - 平台环境检查失败!"
make -j 4
command_status_check "Nginx - 编译失败!"
make install
command_status_check "Nginx - 安装失败!"
mkdir -p $INSTALL_DIR/nginx/conf/vhost
alias cp=cp ; cp -rf $PWD_C/nginx.conf $INSTALL_DIR/nginx/conf
rm -rf $INSTALL_DIR/nginx/html/*
echo "ok" > $INSTALL_DIR/nginx/html/status.html
echo '<?php echo "ok"?>' > $INSTALL_DIR/nginx/html/status.php
$INSTALL_DIR/nginx/sbin/nginx
command_status_check "Nginx - 启动失败!"
}
function install_php() {
cd $TMP_DIR
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel
wget http://docs.php.net/distributions/php-${PHP_V}.tar.gz
tar zxf php-${PHP_V}.tar.gz
cd php-${PHP_V}
./configure --prefix=$INSTALL_DIR/php \
--with-config-file-path=$INSTALL_DIR/php/etc \
--enable-fpm --enable-opcache \
--with-mysql --with-mysqli --with-pdo-mysql \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--enable-mbstring --enable-hash
command_status_check "PHP - 平台环境检查失败!"
make -j 4
command_status_check "PHP - 编译失败!"
make install
command_status_check "PHP - 安装失败!"
cp php.ini-production $INSTALL_DIR/php/etc/php.ini
cp sapi/fpm/php-fpm.conf $INSTALL_DIR/php/etc/php-fpm.conf
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
/etc/init.d/php-fpm start
command_status_check "PHP - 启动失败!"
}
read -p "请输入编号:" number
case $number in
1)
install_nginx;;
2)
install_php;;
3)
install_mysql;;
4)
install_nginx
install_php
;;
9)
exit;;
esac</code></pre><h2>10、监控MySQL主从同步状态是否异常脚本</h2><pre><code>#!/bin/bash
HOST=localhost
USER=root
PASSWD=123.com
IO_SQL_STATUS=$(mysql -h$HOST -u$USER -p$PASSWD -e 'show slave status\G' 2>/dev/null |awk '/Slave_.*_Running:/{print $1$2}')
for i in $IO_SQL_STATUS; do
THREAD_STATUS_NAME=${i%:*}
THREAD_STATUS=${i#*:}
if [ "$THREAD_STATUS" != "Yes" ]; then
echo "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!" |mail -s "Master-Slave Staus" xxx@163.com
fi
done</code></pre><h2>11、MySql数据库备份脚本</h2><h6>分库备份</h6><pre><code>mysqldump -uroot -pxxx -B A > A.sql
#!/bin/bash
DATE=$(date +%F_%H-%M-%S)
HOST=localhost
USER=backup
PASS=123.com
BACKUP_DIR=/data/db_backup
DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys")
for DB in $DB_LIST; do
BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql
if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB > $BACKUP_NAME 2>/dev/null; then
echo "$BACKUP_NAME 备份失败!"
fi
done</code></pre><h6>分表备份</h6><pre><code>mysqldump -uroot -pxxx -A t > t.sql
#!/bin/bash
DATE=$(date +%F_%H-%M-%S)
HOST=localhost
USER=backup
PASS=123.com
BACKUP_DIR=/data/db_backup
DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys")
for DB in $DB_LIST; do
BACKUP_DB_DIR=$BACKUP_DIR/${DB}_${DATE}
[ ! -d $BACKUP_DB_DIR ] && mkdir -p $BACKUP_DB_DIR &>/dev/null
TABLE_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "use $DB;show tables;" 2>/dev/null)
for TABLE in $TABLE_LIST; do
BACKUP_NAME=$BACKUP_DB_DIR/${TABLE}.sql
if ! mysqldump -h$HOST -u$USER -p$PASS $DB $TABLE > $BACKUP_NAME 2>/dev/null; then
echo "$BACKUP_NAME 备份失败!"
fi
done
done</code></pre><h2>12、Nginx访问日志分析</h2><pre><code>#!/bin/bash
# 日志格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"
LOG_FILE=$1
echo "统计访问最多的10个IP"
awk '{a[$1]++}END{print "UV:",length(a);for(v in a)print v,a[v]}' $LOG_FILE |sort -k2 -nr |head -10
echo "----------------------"
echo "统计时间段访问最多的IP"
awk '$4>="[01/Dec/2018:13:20:25" && $4<="[27/Nov/2018:16:20:49"{a[$1]++}END{for(v in a)print v,a[v]}' $LOG_FILE |sort -k2 -nr|head -10
echo "----------------------"
echo "统计访问最多的10个页面"
awk '{a[$7]++}END{print "PV:",length(a);for(v in a){if(a[v]>10)print v,a[v]}}' $LOG_FILE |sort -k2 -nr
echo "----------------------"
echo "统计访问页面状态码数量"
awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}' $LOG_FILE |sort -k3 -nr</code></pre><h2>13、Nginx访问日志自动按天(周、月)切割</h2><pre><code>#!/bin/bash
#nginx日志目录
LOG_DIR=/www/server/nginx/logs
#获取到上一天的时间
YESTERDAY_TIME=$(date -d "yesterday" +%F)
#归档日志取时间
LOG_MONTH_DIR=$LOG_DIR/$(date +"%Y-%m")
#归档日志的名称
LOG_FILE_LIST="access.log"
for LOG_FILE in $LOG_FILE_LIST; do
[ ! -d $LOG_MONTH_DIR ] && mkdir -p $LOG_MONTH_DIR
mv $LOG_DIR/$LOG_FILE $LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_TIME}
done
kill -USR1 $(cat $LOG_DIR/nginx.pid)</code></pre><h2>14、自动发布Java项目(Tomcat)</h2><pre><code>#!/bin/bash
DATE=$(date +%F_%T)
TOMCAT_NAME=$1
TOMCAT_DIR=/usr/local/$TOMCAT_NAME
ROOT=$TOMCAT_DIR/webapps/ROOT
BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=tomcat-java-demo
# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
git clone https://github.com/lizhenliang/tomcat-java-demo
cd $PROJECT_NAME
else
cd $PROJECT_NAME
git pull
fi
# 构建
mvn clean package -Dmaven.test.skip=true
if [ $? -ne 0 ]; then
echo "maven build failure!"
exit 1
fi
# 部署
TOMCAT_PID=$(ps -ef |grep "$TOMCAT_NAME" |egrep -v "grep|$$" |awk 'NR==1{print $2}')
[ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID
[ -d $ROOT ] && mv $ROOT $BACKUP_DIR/${TOMCAT_NAME}_ROOT$DATE
unzip $WORK_DIR/$PROJECT_NAME/target/*.war -d $ROOT
$TOMCAT_DIR/bin/startup.sh</code></pre><h2>15、自动发布PHP项目</h2><pre><code>#!/bin/bash
DATE=$(date +%F_%T)
WWWROOT=/usr/local/nginx/html/$1
BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=php-demo
# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
git clone https://github.com/lizhenliang/php-demo
cd $PROJECT_NAME
else
cd $PROJECT_NAME
git pull
fi
# 部署
if [ ! -d $WWWROOT ]; then
mkdir -p $WWWROOT
rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
else
rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
fi</code></pre><h2>16、DOS攻击防范(自动屏蔽攻击IP)</h2><pre><code>#!/bin/bash
DATE=$(date +%d/%b/%Y:%H:%M)
#nginx日志
LOG_FILE=/usr/local/nginx/logs/demo2.access.log
#分析ip的访问情况
ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}')
for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
iptables -I INPUT -s $IP -j DROP
echo "$(date +'%F_%T') $IP" >> /tmp/drop_ip.log
fi
done</code></pre><h2>17、目录入侵检测与告警</h2><pre><code>#!/bin/bash
MON_DIR=/opt
inotifywait -mqr --format %f -e create $MON_DIR |\
while read files; do
#同步文件
rsync -avz /opt /tmp/opt
#检测文件是否被修改
#echo "$(date +'%F %T') create $files" | mail -s "dir monitor" xxx@163.com
done</code></pre><p>作者:南宫乘风<br>链接:blog.csdn.net/heian_99/article/details/104027379</p><p><img src="/img/bVbHCzg" alt="" title=""></p>
比 Xshell 还好用的 SSH 客户端神器!爱了
https://segmentfault.com/a/1190000041370721
2022-02-07T21:15:09+08:00
2022-02-07T21:15:09+08:00
民工哥
https://segmentfault.com/u/jishuroad
5
<p>由于需要连接远程 Linux 服务器,早期使用过 Putty,SecureCRT,后面主要使用 Xshell。之前民工哥也给大家推荐过几款SSH客户端:</p><p>自从接触了 MobaXterm之后,个人感觉比 Xshell 更好用,堪称SSH客户端的神器啊!</p><p>MobaXterm 和 Xshell 的关系,就像 IntelliJ IDEA 和 Eclipse 的关系一样,功能更加强大,效果更加炫酷。</p><p>接下来,介绍 MobaXterm 的下载、安装、简单使用,以及其强大的功能亮点(优点)。</p><h2>MobaXterm 下载</h2><p>如果是个人使用,下载家庭版(免费的)就可以满足基本工作需求;如果想要使用更丰富的功能,可以使用专业版(收费的)。</p><p>个人使用的是家庭版 v12.3,已经足够满足工作需求了。</p><h6>1、以下是MobaXterm家庭版的下载地址(当前最新版本是 v12.4):</h6><p><a href="https://link.segmentfault.com/?enc=0ueTT2RrGn0vmul6CsOtrA%3D%3D.oLjcfwnBEtoOrM%2BmaIdSR%2F0PXJZCHlxBgzFe4GosRKQQjo8g8S1kiojdc3xy13vokwiGLZVe4dOqRWTL1N6fxw%3D%3D" rel="nofollow">https://mobaxterm.mobatek.net...</a></p><p><img src="/img/remote/1460000041370723" alt="" title=""></p><h2>MobaXterm 安装</h2><p>下载的是一个zip格式的压缩文件,如下:</p><p><img src="/img/remote/1460000041370724" alt="" title=""></p><p>解压后,双击 msi 文件进行安装</p><p><img src="/img/remote/1460000041370725" alt="" title=""></p><p>以下是安装界面(安装一路选择“next”即可):</p><p><img src="/img/remote/1460000041370726" alt="" title=""></p><p><img src="/img/remote/1460000041370727" alt="" title=""></p><p><img src="/img/remote/1460000041370728" alt="" title=""></p><p><img src="/img/remote/1460000041370729" alt="" title=""></p><p>安装完毕后,即可在桌面上看到 MobaXterm 的桌面快捷图标,如下图:</p><p><img src="/img/remote/1460000041370730" alt="" title=""></p><h2>MobaXterm 简单使用</h2><h6>1、双击桌面上的 MobaXterm 图标,进入使用界面,选择 Session --> SSH,如下图:</h6><p><img src="/img/remote/1460000041370731" alt="" title=""></p><h6>2、填写需要连接的远程主机 IP 和 用户名,如下图:</h6><p><img src="/img/remote/1460000041370732" alt="" title=""></p><h6>3、点击 “OK”,进入到远程机器的密码输入页面,输入主机的正确登录密码。</h6><p>选择“Yes”,即可保存密码,以后访问该主机,不用每次再输入主机密码。</p><p><img src="/img/remote/1460000041370733" alt="" title=""></p><p>至此,即可操作远程的主机,进行相应的工作。</p><h2>MobaXterm 功能亮点(优点)</h2><h6>1、内嵌Sftp模块,可以很方便地进行上传或者下载文件(支持拖拽)</h6><p>在命令窗口进入需要文件上传或者下载的目录,勾选“Follow terminal folder”,左侧的 Sftp 目录就会跳转到相应的目录。</p><ul><li><p>1)<strong>文件上传的两种方式</strong>:</p><ul><li>a)点击 MobaXterm 的文件上传按钮,在本地目录下,选中需要上传的文件,点击确定,即可完成上传。</li><li>b)在本地目录下,选中需要上传的文件,将文件拖到 Sftp 的远程目录下,即可完成上传。</li></ul></li><li><p>2)<strong>文件下载的两种方式</strong>:</p><ul><li>a)在远程服务器目录下,选中需要下载的文件,点击下载功能按钮,再选择相应的保存路径,即可下载。</li><li>b)在远程服务器目录下,选中需要下载的文件,将文件拖出到本地目录下,即可完成下载。</li></ul></li></ul><p><img src="/img/remote/1460000041370734" alt="" title=""></p><h6>2、自带监控功能,可以很方便地检测远程机器资源的使用情况</h6><p>左侧菜单栏下方,点击“<strong>Remote monitoring</strong>”,即可看到远程机器资源的实时使用情况;再次点击,使用情况将会被隐藏。</p><p><img src="/img/remote/1460000041370735" alt="" title=""></p><h6>3、可以很方便地查看 Session 列表</h6><p>由于工作中可能会接触不同的项目,需要连接不同的远程环境。我们经常会创建多个文件夹保存远程机器的 Session 信息 </p><p><img src="/img/remote/1460000041370736" alt="" title=""></p><h6>4、连接方式种类丰富</h6><p>不仅可以使用SSH,还有其他多种连接方式</p><p><img src="/img/remote/1460000041370737" alt="" title=""></p><h6>5、可以像看Linux系统一样,使用Linux命令查看 windows本地目录和文件</h6><p><img src="/img/remote/1460000041370738" alt="" title=""></p><h6>6、字体高亮显示效果炫酷</h6><p>以 Tomcat 的日志文件内容为例,一些关键字会高亮成不同的颜色,方便问题查找:</p><p><img src="/img/remote/1460000041370739" alt="" title=""></p><h6>7、 支持快速复制 Session 窗口</h6><p>在 Session页签上右键点击,选择“<strong>Duplicate tab</strong>”,即可完成复制</p><p><img src="/img/remote/1460000041370740" alt="" title=""></p><p><img src="/img/remote/1460000041370741" alt="" title=""></p><h6>8、可以给不同的 Session 页签设置不同的颜色</h6><p>在 Session页签上右键点击,选择“<strong>Set tab color</strong>”,可以选择自己喜欢的颜色</p><p><img src="/img/remote/1460000041370742" alt="" title=""></p><p>可以选择基本颜色或者自定义的颜色:</p><p><img src="/img/remote/1460000041370743" alt="" title=""></p><p>修改后,效果如下:</p><p><img src="/img/remote/1460000041370744" alt="" title=""></p><h6>9、支持多个Session 窗口列表展示</h6><p>免费的家庭版也支持同时打开多个Session窗口,当打开了多个窗口的时候,可能不方便查看具体想看的Session窗口。</p><p>点击 MobaXterm 右上方的“回形针”按钮,即可看到所有打开的 Session 窗口</p><p><img src="/img/remote/1460000041370745" alt="" title=""></p><h6>10、左侧菜单栏可以很方便地弹出和隐藏</h6><p>1)点击左侧的收缩按钮,即可完成左侧菜单栏的隐藏</p><p><img src="/img/remote/1460000041370746" alt="" title=""></p><p>收缩后效果如下:</p><p><img src="/img/remote/1460000041370747" alt="" title=""></p><p>2)点击左侧的“弹出”按钮,即可弹出菜单栏</p><p><img src="/img/remote/1460000041370748" alt="" title=""></p><h6>11、MobaXterm 小游戏</h6><p>在左侧的Tools工具栏里提供了几款小游戏</p><p><img src="/img/remote/1460000041370749" alt="" title=""></p><p><img src="/img/remote/1460000041370750" alt="" title=""></p><ul><li>1)俄罗斯方块</li></ul><p><img src="/img/remote/1460000041370751" alt="" title=""></p><p><img src="/img/remote/1460000041370752" alt="" title=""></p><ul><li>2)数独</li></ul><p><img src="/img/remote/1460000041370753" alt="" title=""></p><h6>12、支持四种 Session 窗口分屏效果</h6><p>支持四种分屏效果:<strong>单一直排、垂直分屏、水平分屏 和 四象限分屏</strong></p><ul><li>1)单一直排效果(传统效果,比较常用实用)</li></ul><p><img src="/img/remote/1460000041370754" alt="" title=""></p><ul><li>2)垂直分屏效果(可用于两个主机的文件对比)</li></ul><p><img src="/img/remote/1460000041370755" alt="" title=""></p><ul><li>3)水平分屏</li></ul><p><img src="/img/remote/1460000041370756" alt="" title=""></p><ul><li>4)四象限分屏</li></ul><p><img src="/img/remote/1460000041370757" alt="" title=""></p><h6>13、Session 断开连接后,可以很方便地再次连接</h6><p>经常会遇到打开一个Session窗口,如果长时间不操作或者网络中途断开,需要重新登录远程机器的场景。</p><p>此时不需要关闭窗口,重新打开一个。</p><p>MobaXterm提供了便捷方式:只需要 输入<strong>R</strong> 即可<strong>重启 Session</strong></p><p><img src="/img/remote/1460000041370758" alt="" title=""></p><p>输入R后,即可再次连接到之前的Session</p><p><img src="/img/remote/1460000041370759" alt="" title=""></p><h2>PS</h2><p>MobaXterm 真的是一款 SSH客户端神器,强烈推荐大家使用!</p><p>如果想炫酷地操作 Linux 远程机器,赶快尝试体验一下 MobaXterm 的各种“神技”吧!</p><p>MobaXterm 强大的功能,一定会让你赞叹不已! </p><p>希望能帮到大家,谢谢!</p><p>来源:cnblogs.com/miracle-luna/p/12008869.html</p><p><img src="/img/bVbHCzg" alt="" title=""></p>
如果你觉得学习 Git 很枯燥,那是因为你还没玩过这款游戏!
https://segmentfault.com/a/1190000041330870
2022-01-24T11:36:10+08:00
2022-01-24T11:36:10+08:00
民工哥
https://segmentfault.com/u/jishuroad
15
<p>大家好!我是民工哥。</p><p>对于Git,相信大多数程序员并不会感到陌生。</p><p>作为目前世界上最先进的分布式版本控制系统(没有之一),Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。随着时间的推移,Git 发展到今天,已经成为了众多开发者必备的开发工具。</p><p><img src="/img/remote/1460000041330872" alt="" title=""></p><p>如果你平时学习Git时感觉到枯燥乏味,不妨试一试这个好玩的小游戏,通过别一种方式,在娱乐中去学习。</p><p><img src="/img/remote/1460000041330873" alt="" title=""></p><p><img src="/img/remote/1460000041330874" alt="" title=""></p><p>下面是其中的演示例子:<br><img src="/img/bVcXAc4" alt="image.png" title="image.png"><br>需要这款游戏的读者可以点击下方公众号名片回复关键词 Git小游戏 获取<br><img src="/img/bVbHCzg" alt="" title=""></p><h2>Git 简介</h2><p>Git 是一个开源的分布式版本控制系统。</p><h6>什么是版本控制?</h6><p>版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。</p><h5>什么是分布式版本控制系统?</h5><p>介绍分布式版本控制系统前,有必要先了解一下传统的集中式版本控制系统。</p><p>集中化的版本控制系统,诸如 CVS,Subversion 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。</p><p>这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录。</p><p><img src="/img/remote/1460000039921597" alt="" title=""></p><p>分布式版本控制系统的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。</p><p><img src="/img/remote/1460000039921598" alt="" title=""></p><p>可参考:<a href="https://link.segmentfault.com/?enc=7oHHYPKi%2FtLKHhYfOVcKyg%3D%3D.01Bvo8K3D3eKzxY2B96l6oqtKrWH1u0HesczthzbRtE6BKnUGFCcRBhv8yQ6Wg7JDo7l0l%2Fg8AY3Pj5%2FxiPvTmcGtWzagBBkw8BhmiMKJ3ybxB3COnKNjOSAvubjDBPa7MDLIWhKq5z16J3OcdA0etyboXRj0AIQVxKBUiSSSqcFia%2FLvGB3LtLma80QJRvPPcpZB57UXphtIBECvcErQs45n8JuHHNECXnPwClURpmFX3PTbFmiGe0GX5RdoB0N%2FsveHDRrFBxNMCbrI4DE9grqHjvw5ff6JWl71%2FBZeW0TqVZMirj%2BULNGjkQ97M%2FGbDpSZ96%2BN1zc2O0NCExF5Q%3D%3D" rel="nofollow">Git 从入门到精通</a></p><h2>Git vs SVN</h2><p>Git 和 SVN 孰优孰好,每个人有不同的体验。</p><p>Git是分布式的,SVN是集中式的</p><p>这是 Git 和 SVN 最大的区别。若能掌握这个概念,两者区别基本搞懂大半。因为 Git 是分布式的,所以 Git 支持离线工作,在本地可以进行很多操作,包括接下来将要重磅推出的分支功能。而 SVN 必须联网才能正常工作。</p><ul><li>Git复杂概念多,SVN简单易上手</li></ul><p>所有同时掌握 Git 和 SVN 的开发者都必须承认,Git 的命令实在太多了,日常工作需要掌握add,commit,status,fetch,push,rebase等,若要熟练掌握,还必须掌握rebase和merge的区别,fetch和pull的区别等,除此之外,还有cherry-pick,submodule,stash等功能,仅是这些名词听着都很绕。</p><p>在易用性这方面,SVN对于新手来说会更有好一些。但是从另外一方面看,Git 命令多意味着功能多,若我们能掌握大部分 Git 的功能,体会到其中的奥妙,会发现再也回不去 SVN 的时代了。</p><ul><li>Git分支廉价,SVN分支昂贵</li></ul><p>在版本管理里,分支是很常使用的功能。在发布版本前,需要发布分支,进行大需求开发,需要 feature 分支,大团队还会有开发分支,稳定分支等。在大团队开发过程中,常常存在创建分支,切换分支的求。</p><p>Git 分支是指针指向某次提交,而 SVN 分支是拷贝的目录。这个特性使 Git 的分支切换非常迅速,并且创建成本非常低。</p><p>而且 Git 有本地分支,SVN 无本地分支。在实际开发过程中,经常会遇到有些代码没写完,但是需紧急处理其他问题,若我们使用 Git,便可以创建本地分支存储没写完的代码,待问题处理完后,再回到本地分支继续完成代码。</p><p>更多关注Git与Svn的比较请参阅:<a href="https://link.segmentfault.com/?enc=Y%2Bih5QtNiwYRq6hy1P%2FHOw%3D%3D.5n4GeZW8nqaCSb11wH8034U5CnI82j7p0XPIFHwU%2FfpakQuUZ8CIS7JRw7ZSTioDdka9Jvd1DzLGcIQXTz9v6MPcm6xVm0lKCwvrjISbXFKmBvdME9KA3iQYw%2Bj1SXsJOSBzufxju5H8XH%2FthQf2LYyQAZx0swNBWMQOJfVH3PoTZ18DklXOqSn%2B0jPp4Y3K%2F0n4I1iCieQJXIglsUVtGUCwKuI6zR0z844HHuHexLoc5P3NKwRDhOww6S7sjPWJI4Hnw6HFb5S8H7pytx05khsyTLCdysb18yYSzt6W%2BFnpI4cH2KytCX9syaeXwwF2ZMzgfx0Wx05w3afsiJYz1w%3D%3D" rel="nofollow">通俗易懂|用好Git 和 SVN ,轻松驾驭版本管理</a></p><h2>Git 工作原理</h2><p>文字不好理解,请看 <a href="https://link.segmentfault.com/?enc=rYc1NqFK2quRK7n6PwsJZQ%3D%3D.SMtuNjAhgwtx1M2eSYzZfCZPoPvU5zP69VVbc6HmiH%2FkaikQ84dPcgOcPV78ThOcwVKIbA%2F%2FlvPpnaTKqGdD3IxOv55X8ffGFt%2BLhrkj2jKf9ojq6UILHon1czaWOIJUvXDZpI9D2YAh81zN1wnDq8AcEWY8NkflASm6mcsmtrkKUd5csTjpSCaR9fH0I2FG6MfQOuBpEoT4BUY8ku32KkOFCzr5H6c6XQuSg%2FEEKMLX2duGHDAvueRZQzjuVhnVkjBQxxZ8YCzyThQd6dpeFQDCt09cULIzkwegtpRUtiUMhNan3OcfhIUVAnSjXnaqpTH01Ju3zq%2B592FATD0SXA%3D%3D" rel="nofollow">图文详解 Git 工作原理</a></p><h2>Git 安装</h2><ul><li>Debian/Ubuntu 环境安装</li></ul><p>如果你使用的系统是 Debian/Ubuntu , 安装命令为:</p><pre><code>$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
> libz-dev libssl-dev
$ apt-get install git-core
$ git --version
git version 1.8.1.2</code></pre><ul><li>Centos/RedHat 环境安装</li></ul><p>如果你使用的系统是 Centos/RedHat ,安装命令为:</p><pre><code>$ yum install curl-devel expat-devel gettext-devel \
> openssl-devel zlib-devel
$ yum -y install git-core
$ git --version
git version 1.7.1</code></pre><ul><li>Windows 环境安装</li></ul><p>在 Git 官方下载地址下载 exe 安装包。按照安装向导安装即可。</p><p>建议安装 Git Bash 这个 git 的命令行工具。</p><ul><li>Mac 环境安装</li></ul><p>在 Git 官方下载地址下载 mac 安装包。按照安装向导安装即可。</p><h2>Git配置</h2><p>Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。这些变量存储在三个不同的位置:</p><pre><code>/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
\~/.gitconfig 或 \~/.config/git/config 文件:只针对当前用户。可以传递 --global 选项让 Git 读写此文件。</code></pre><p>当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。</p><p>每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。</p><p>在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER)的 .gitconfig 文件。Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。</p><h2>Git 基本概念</h2><ul><li>版本库</li></ul><p>当你一个项目到本地或创建一个 git 项目,项目目录下会有一个隐藏的 .git 子目录。这个目录是 git 用来跟踪管理版本库的,千万不要手动修改。</p><ul><li>哈希值</li></ul><p>Git 中所有数据在存储前都计算校验和,然后以校验和来引用。这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。若你在传送过程中丢失信息或损坏文件,Git 就能发现。</p><p>Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。SHA-1 哈希看起来是这样:</p><p>24b9da6552252987aa493b52f8696cd6d3b00373<br>Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。</p><ul><li>文件状态</li></ul><p>在 GIt 中,你的文件可能会处于三种状态之一:</p><ul><li><strong>已修改(modified)</strong> - 已修改表示修改了文件,但还没保存到数据库中。</li><li><strong>已暂存(staged)</strong> - 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。</li><li><strong>已提交(committed)</strong> - 已提交表示数据已经安全的保存在本地数据库中。</li><li>工作区域</li></ul><p>与文件状态对应的,不同状态的文件在 Git 中处于不同的工作区域。</p><ul><li><strong>工作区(working</strong>) - 当你 git clone 一个项目到本地,相当于在本地克隆了项目的一个副本。工作区是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。</li><li><strong>暂存区(staging)</strong>- 暂存区是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作 `‘索引’',不过一般说法还是叫暂存区。</li><li><strong>本地仓库(local)</strong> - 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 本地仓库。</li><li><strong>远程仓库(remote)</strong> - 以上几个工作区都是在本地。为了让别人可以看到你的修改,你需要将你的更新推送到远程仓库。同理,如果你想同步别人的修改,你需要从远程仓库拉取更新。</li></ul><p><img src="/img/remote/1460000039921599" alt="" title=""></p><ul><li>分支(Branch)</li></ul><p>分支是为了将修改记录的整个流程分开存储,让分开的分支不受其它分支的影响,所以在同一个数据库里可以同时进行多个不同的修改</p><p><img src="/img/remote/1460000039921600" alt="" title=""></p><p>主分支(Master)前面提到过 master 是 Git 为我们自动创建的第一个分支,也叫主分支,其它分支开发完成后都要合并到 master</p><p><img src="/img/remote/1460000039921601" alt="" title=""></p><ul><li>标签(Tag)</li></ul><p>标签是用于标记特定的点或提交的历史,通常会用来标记发布版本的名称或版本号(如:publish/0.0.1),虽然标签看起来有点像分支,但打上标签的提交是固定的,不能随意的改动,参见上图中的1.0 / 2.0 / 3.0</p><ul><li>HEAD</li></ul><p>HEAD 指向的就是当前分支的最新提交图片</p><p><img src="/img/remote/1460000039921602" alt="" title=""></p><p>以上概念了解的差不多,那就可以继续往下看。</p><h2>Git 命令</h2><p><img src="/img/remote/1460000039921603" alt="" title=""></p><ul><li>创建仓库</li></ul><p>克隆一个已创建的仓库:</p><pre><code># 通过 SSH
$ git clone ssh://user@domain.com/repo.git
#通过 HTTP
$ git clone http://domain.com/user/repo.git</code></pre><p>创建一个新的本地仓库:</p><pre><code>$ git init</code></pre><ul><li><p>添加修改<br>添加修改到暂存区:</p><pre><code># 把指定文件添加到暂存区
$ git add xxx
# 把当前所有修改添加到暂存区
$ git add .
# 把所有修改添加到暂存区
$ git add -A</code></pre><p>提交修改到本地仓库:</p><pre><code># 提交本地的所有修改
$ git commit -a
# 提交之前已标记的变化
$ git commit
# 附加消息提交
$ git commit -m 'commit message'</code></pre></li><li>储藏</li></ul><p>有时,我们需要在同一个项目的不同分支上工作。当需要切换分支时,偏偏本地的工作还没有完成,此时,提交修改显得不严谨,但是不提交代码又无法切换分支。这时,你可以使用 git stash 将本地的修改内容作为草稿储藏起来。</p><p>官方称之为储藏,但我个人更喜欢称之为存草稿。</p><pre><code># 1. 将修改作为当前分支的草稿保存
$ git stash
# 2. 查看草稿列表
$ git stash list
stash@{0}: WIP on master: 6fae349 :memo: Writing docs.
# 3.1 删除草稿
$ git stash drop stash@{0}
# 3.2 读取草稿
$ git stash apply stash@{0}</code></pre><ul><li>撤销修改</li></ul><p>撤销本地修改:</p><pre><code># 移除缓存区的所有文件(i.e. 撤销上次git add)
$ git reset HEAD
# 将HEAD重置到上一次提交的版本,并将之后的修改标记为未添加到缓存区的修改
$ git reset <commit>
# 将HEAD重置到上一次提交的版本,并保留未提交的本地修改
$ git reset --keep <commit>
# 放弃工作目录下的所有修改
$ git reset --hard HEAD
# 将HEAD重置到指定的版本,并抛弃该版本之后的所有修改
$ git reset --hard <commit-hash>
# 用远端分支强制覆盖本地分支
$ git reset --hard <remote/branch> e.g., upstream/master, origin/my-feature
# 放弃某个文件的所有本地修改
$ git checkout HEAD <file></code></pre><p>删除添加.gitignore文件前错误提交的文件:</p><pre><code>$ git rm -r --cached .
$ git add .
$ git commit -m "remove xyz file"</code></pre><p>撤销远程修改(创建一个新的提交,并回滚到指定版本):</p><pre><code>$ git revert <commit-hash></code></pre><p>彻底删除指定版本:</p><pre><code># 执行下面命令后,commit-hash 提交后的记录都会被彻底删除,使用需谨慎
$ git reset --hard <commit-hash>
$ git push -f</code></pre><ul><li>更新与推送</li></ul><p>更新:</p><pre><code># 下载远程端版本,但不合并到HEAD中
$ git fetch <remote>
# 将远程端版本合并到本地版本中
$ git pull origin master
# 以rebase方式将远端分支与本地合并
$ git pull --rebase <remote> <branch></code></pre><p>推送:</p><pre><code># 将本地版本推送到远程端
$ git push remote <remote> <branch>
# 删除远程端分支
$ git push <remote> :<branch> (since Git v1.5.0)
$ git push <remote> --delete <branch> (since Git v1.7.0)
# 发布标签
$ git push --tags</code></pre><ul><li>查看信息</li></ul><p>显示工作路径下已修改的文件:</p><pre><code>$ git status</code></pre><p>显示与上次提交版本文件的不同:</p><pre><code>$ git diff</code></pre><p>显示提交历史:</p><pre><code># 从最新提交开始,显示所有的提交记录(显示hash, 作者信息,提交的标题和时间)
$ git log
# 显示某个用户的所有提交
$ git log --author="username"
# 显示某个文件的所有修改
$ git log -p <file></code></pre><ul><li><p>显示搜索内容:</p><pre><code># 从当前目录的所有文件中查找文本内容
$ git grep "Hello"
# 在某一版本中搜索文本
$ git grep "Hello" v2.5</code></pre></li><li>分支</li></ul><p>增删查分支:</p><pre><code># 列出所有的分支
$ git branch
# 列出所有的远端分支
$ git branch -r
# 基于当前分支创建新分支
$ git branch <new-branch>
# 基于远程分支创建新的可追溯的分支
$ git branch --track <new-branch> <remote-branch>
# 删除本地分支
$ git branch -d <branch>
# 强制删除本地分支,将会丢失未合并的修改
$ git branch -D <branch></code></pre><p>切换分支:</p><pre><code># 切换分支
$ git checkout <branch>
# 创建并切换到新分支
$ git checkout -b <branch></code></pre><p>标签</p><pre><code># 给当前版本打标签
$ git tag <tag-name>
# 给当前版本打标签并附加消息
$ git tag -a <tag-name></code></pre><p>合并与重置</p><p>merge 与 rebase 虽然是 git 常用功能,但是强烈建议不要使用 git 命令来完成这项工作。</p><p>因为如果出现代码冲突,在没有代码比对工具的情况下,实在太艰难了。</p><p>你可以考虑使用各种 Git GUI 工具。</p><p>合并:</p><pre><code># 将分支合并到当前HEAD中
$ git merge <branch></code></pre><p>重置:</p><pre><code># 将当前HEAD版本重置到分支中,请勿重置已发布的提交
$ git rebase <branch></code></pre><p>更多命令参考:<a href="https://link.segmentfault.com/?enc=%2BgrXLhpZ4nWRhoSpYqFCow%3D%3D.S%2FmrGyW6Beary%2FEElJGHn4xD6%2BRgJTI8b0nw1EXwIboodHPRmEsHODg2WCfOh9s3fnnyp9ACC%2Fcjq4Hwk%2BUQpdjYNJZB07VRpaEpRT4ol8qfJr2Gpo5g8D0gCbbXcy%2FRyIoiyyf7zUu3PcCvXEkhetQAG5wI6pzQsl%2FXn0mqG45Esp4CS6CUW%2Byxkn%2BcrxA8EijxBPutDtPVZcRWQwiT6Rol%2BNUi5U5rw3FT19AROLTJthbQcI%2BcUG%2FFc6R6S9g0DyzlrsLqgurF8Q2iyedFLEGxVQcvrf2WGqXQEIj7sw6ghRR6sqvDH8tDG8oNvhl0g5gxWERPrz552F%2FBkUG%2Bng%3D%3D" rel="nofollow">三年 Git 使用心得 & 常见问题整理</a></p><h2>Git 分支开发</h2><p>Git 是目前最流行的源代码管理工具。为规范开发,保持代码提交记录以及 git 分支结构清晰,方便后续维护,现规范 git 的相关操作。</p><h4>分支命名</h4><p>1、master 分支</p><p>master 为主分支,也是用于部署生产环境的分支,确保master分支稳定性, master 分支一般由develop以及hotfix分支合并,任何时间都不能直接修改代码</p><p>2、develop 分支</p><p>develop 为开发分支,始终保持最新完成以及bug修复后的代码,一般开发的新功能时,feature分支都是基于develop分支下创建的。</p><ul><li>feature 分支</li></ul><p>开发新功能时,以develop为基础创建feature分支。<br>分支命名: feature/ 开头的为特性分支, 命名规则: feature/user_module、 feature/cart_module</p><ul><li>release分支</li></ul><p>release 为预上线分支,发布提测阶段,会release分支代码为基准提测。当有一组feature开发完成,首先会合并到develop分支,进入提测时会创建release分支。如果测试过程中若存在bug需要修复,则直接由开发者在release分支修复并提交。当测试完成之后,合并release分支到master和develop分支,此时master为最新代码,用作上线。</p><ul><li>hotfix 分支</li></ul><p>分支命名: hotfix/ 开头的为修复分支,它的命名规则与feature分支类似。线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支,修复完成后,需要合并到master分支和develop分支</p><p>更多开发规范请参阅:<a href="https://link.segmentfault.com/?enc=1X3La53vZ4VTHKBVxLR21Q%3D%3D.ZYYHmTwrgxmHZ%2BnWINuQZ2EWkA1iakN0xr0kvdF5Is2YXn9W3%2Fw5SI04Dq%2FGTT9mbQBR4JSAKZSGscxg6XtzCZ2e5JZmEPPB%2BlscBlYKGoojKyVfieBFMwIJE3a7P%2BBEzklVqK9kucqi5lqYxJyoMrqTPE7gHj%2BH9RSRthXszjK3Uc4PhuyX%2B9ll6S411zum%2BA19Vm0LOe5o%2B3zaR05RYe7laly%2F7eT3KebeJc13qgjtlP1x5EX9UxiZmp%2B85KYg%2FtDIPoIha055aoDm2HqvLkrlqN6mRjUlfBkb%2FMHlR07gd4L4%2FJJtq3hvKnRaWngAh7LKmlJQioNiyHW0uQWX4Q%3D%3D" rel="nofollow">全网最全的 Git 分支开发规范手册</a> | <a href="https://link.segmentfault.com/?enc=qcWm%2BqLnKiao0lk5WXr2%2Fg%3D%3D.As65ghQ0DW6dCUA7r2AOSGlgG5jgUobWH5pdw3JVo%2Bc7K2sfpXh7zLiIfTLkd%2BQ8snZpHaLOIsXsIiUQRicUVH9tnQR8xgnNpSxOH8CDbWrzRSXSoUuSlsZP78FxrtUV8X6ogk6WwjOto2OteF22HQZqCakOVB7gmsuJmrDrnBQZnkEAvj5mXN2AO%2Bi6VqTkPjdedAHKML5hYODs%2FbDcDhCEMhyVaQOF7AxLB7WSFAcJGY%2Fvg5x0227DydiNGFW%2FAT%2FAIQTmimMYUN2sagsUknL6H%2Fpug%2Bx7or50mN5NcX44dBe6rzxOs3vjHSeMf2rFRtbe789Fsb6pntgxIxPzew%3D%3D" rel="nofollow">掌握这10条规范,轻松搞定Git!</a></p><h2><a href="https://link.segmentfault.com/?enc=5t%2Fs1aMw3PDvU91jRbsZjw%3D%3D.tNuBRS%2F8ZGFygDA55luZBPZfcE2QsJG2osO6eZMrB8LDkX8pT%2FJExWXAg2DZfqxyVtneTiv0PljtoZoLfi%2FSX8t3eF%2BhF337LZarrfgyRgZIfyCCs7m3nZ2MT7vp37rUXxy7DhI5MijDwaNUo08vQnYSek2a8rtiOk1uNA0unNWSbnqKGj5zeYrsdxw%2FMgEvnaFYMfEGHQKMlZU35wok9mn0uIgusyBlXsG9SN568F6wtEy0ob%2Fup4e39YT0A45d6MPXVV5vNWLVS04%2BPl9GobGd8Gmiq3%2BFjDV6XRNghrOc4zrvHV634ryZ6jUzLWfxLuvMjakm%2Bv4em0FVmNu0mA%3D%3D" rel="nofollow">Git这些高级用法,喜欢就拿去用!</a></h2><h2>Git 提交规范</h2><p>为什么需要规范?</p><p>无规矩不成方圆,编程也一样。</p><p>如果你有一个项目,从始至终都是自己写,那么你想怎么写都可以,没有人可以干预你。可是如果在团队协作中,大家都张扬个性,那么代码将会是一团糟,好好的项目就被糟践了。不管是开发还是日后维护,都将是灾难。</p><p>这时候,有人提出了何不统一标准,大家都按照这个标准来。于是 ESLint,JSHint 等代码工具如雨后春笋般涌现,成为了项目构建的必备良品。</p><p>Git Commit 规范可能并没有那么夸张,但如果你在版本回退的时候看到一大段糟心的 Commit,恐怕会懊恼不已吧。所以,严格遵守规范,利人利己。</p><p>具体请参阅:<a href="https://link.segmentfault.com/?enc=UMIvfFcXNs9Wc5ir%2BDbbsA%3D%3D.B71gvgAXyhrEqmqCoBmvC%2F4r59LTyCtw%2BrhYF27puVdggfNjcteaOuxFC8guGSQYthkbB7z2nmId4UF%2FfVgnZ1eqIOZCQ2V3ZVY%2BHduRJ%2FcrMcfoHSh4a%2FMUSrUzgVoJMxD%2BXcb6SOPZ5nn7Wm%2BT%2Fw787kVAzjLnsqUYtUGbskbYGToPiAlpQmMzObqDygJT9YL9iIVxUEy%2B3ab0MZDwef1TcM5Y%2FqdC4dl0i1nplbWIIyPpHnlfZl5HvfPDIuTZBkGRVS9jfwdjFTMsRiTeJEF5942T5DZ412pGqGnTUwtfKjDLhS%2BH0wN9iD1suED2pQNWAVA0zkIUjESVfQGfXw%3D%3D" rel="nofollow">你可能会忽略的 Git 提交规范</a></p><h2>Git使用技巧</h2><p>只有在遇到问题的时候,才体会到技巧带来的好处!</p><h6>常见企业工作流程</h6><p>主要介绍,企业中常用的 Git 工作流程!</p><ul><li>Git Flow</li><li>主干分支</li><li>稳定分支</li><li>开发分支</li><li>补丁分支</li><li>修改分支</li></ul><p><img src="/img/remote/1460000039921604" alt="" title=""></p><h6>Github Flow</h6><ul><li>创建分支</li><li>添加提交</li><li>提交 PR 请求</li><li>讨论和评估代码</li><li>部署检测</li><li>合并代码</li></ul><p><img src="/img/remote/1460000041330875" alt="" title=""></p><h6>Gitlab Flow</h6><ul><li>带生产分支</li><li>带环境分支</li><li>带发布分支</li></ul><p><img src="/img/remote/1460000041330876" alt="" title=""></p><h6>日常使用最佳实践</h6><p>总结日常工作中应该遵循的 <a href="https://link.segmentfault.com/?enc=%2BVHZlwp%2BQN4dE2q8w7dujQ%3D%3D.avaPBhMYhwJfxTyBRztVpiy6o3wEwsyHfqgD1SePzZ%2BQZ27gIkDgMdhC2mai8PYPego6wLK6%2FYq%2Fyzi5mbgTbM6rZMM3yx1jronHDhClL5AEFQ8cx1sTFPv9X4fuGmdcMmKAw4gSMRcpf8lz%2B%2FkL07rK9EisXK26XLpIo7LRs0SNO4ZE6RQAFnzP2nfjZRXaSrZcBlS%2Bil52ZDe%2FHSVcIb8Um30civvA8K%2FI%2BWeB2X6P%2BDJiHDTH29gq8oDKBMnUx4E6VDdA79xJ71nw09MFHmu4ninTGSrnxLBw%2FkYuOcyEg5RsagRTSmYafiSybPaE" rel="nofollow">Git 使用方式</a>和方法!</p><ul><li>使用命令行代替图形化界面</li><li>使用命令行来操作,简洁且效率高</li><li>提交应该尽可能的表述提交修改内容</li><li>区分 subject 和 body 内容,使用空行隔开</li><li>subject 一般不超过 50 个字符</li><li>body 每一行的长度控制在 72 个字符</li><li>subject 结尾不需要使用句号或者点号结尾</li><li>body 用来详细解释此次提交具体做了什么</li><li>使用 .gitignore 文件来排除无用文件</li><li>可使用模板文件,然后根据项目实际进行修改</li><li>基于分支或 fork 的开发模式</li><li>不要直接在主干分支上面进行开发</li><li>在新建的分支上进行功能的开发和问题的修复</li><li>使用 release 分支和 tag 标记进行版本管理</li><li>使用 release 分支发布代码和版本维护(release/1.32)</li><li>使用 tag 来标记版本(A-大feature功能.B-小feature功能.C-只修bug)</li></ul><h2>常用命令汇总整理</h2><p>日常使用只要记住 <a href="https://link.segmentfault.com/?enc=alA72niSqU5BapzgkQkOQg%3D%3D.Y%2BzCt%2FRf01V4H8W4qk6zaQK0zu5i6zh9mjZGeIDUH9E6MWBbh%2FiPywA4LHrtC%2Fac3QvlZXyhijJ%2Bq2dT1znoLKwHzVFdDZgzhztY0OSXc7vyKspRon66tfkPL%2FU8aFkjyJw9GmaDYn8EEQJn0zSjGW88MnmTTV8Xiv9zzIqgLTNW45hJ69UBIJTmGikCJOYbkAiTaQTJGPDM5bFKSmV5f5C%2Be2FSWbfBKOAYVgG1UfdOaODD2Brjnt2tmEmUhf7fYT4a38phs17VtocpWrV7X6Zb1mIRuWCXiWanTzJosaoIGl5%2BhcH60FSBKFTpy1%2FB" rel="nofollow">6 个命令</a>就可以了。</p><p><img src="/img/remote/1460000039921606" alt="" title=""></p><p>无论是开发、运维,还是测试,大家都知道Git在日常工作中的地位。所以,也是大家的必学、必备技能之一。</p><p>但是呢,民工哥,也经常在后台看到读者说,命令太多了不好记啊,时间长了不用又忘记了等等的吐槽。是啊,要学一门技术真难,何况现在技术更新、迭代这么快.....</p><p>所以,对于学习Git这门技术,要是有一个一看就懂,一学就会的入门资料就好了。前不久,国外的一位小姐姐写了一篇这样的文章《CS Visualized: Useful Git Commands》。作者是来自英属哥伦比亚的小姐姐 Lydia Hallie,在这篇文章里面,她通过生动形象的动画,以更加直观的方式,向开发者展示 Git 命令中的 merge、rebase、reset、revert、cherry-pick 等常用骚操作的具体原理。<a href="https://link.segmentfault.com/?enc=Cg3z9eF0Mx7nkrS6OzLSSQ%3D%3D.yt%2B5Tv4cQO5mt%2FlqdyOicCTdCRvNxdqaWSDo9%2B%2BsoaKriS9iOeiTJLeHUoj4t2arFYUB2uTES9PXbvt%2Bryd5WxLoBoPyYF5kRPJBTXe9uasI%2BgR1yutI8BlW3%2FGzFipUxmk7GIS1qjuRKOMBh5h6gB3vY9FmQqQPryZ4HaOUVTcALMBB41aJgaQgAyubIc4mkNlY%2BUt0kT32IYMZ3O2L9lHkRUYFlJFxAT9o7%2Be4WPyHeQswQo1W%2FuLNcKXFdYNF55AMO74Ysn1%2BQGFHahozRzzK2BwlMQVlmFEt0JEMuwKYMEfDPkDq3gZP5dtBbwaIOPvlOhKYtWuV1MoV%2Bb55Tg%3D%3D" rel="nofollow">小姐姐用动画图解Git命令,一看就懂!</a></p><pre><code># 工作区 -> 暂存区
$ git add <file/dir>
# 暂存区 -> 本地仓库
$ git commit -m "some info"
# 本地仓库 -> 远程仓库
$ git push origin master # 本地master分支推送到远程origin仓库 </code></pre><pre><code># 工作区 <- 暂存区
$ git checkout -- <file> # 暂存区文件内容覆盖工作区文件内容
# 暂存区 <- 本地仓库
$ git reset HEAD <file> # 本地仓库文件内容覆盖暂存区文件内容
# 本地仓库 <- 远程仓库
$ git clone <git_url> # 克隆远程仓库
$ git fetch upstream master # 拉取远程代码到本地但不应用在当前分支
$ git pull upstream master # 拉取远程代码到本地但应用在当前分支
$ git pull --rebase upstream master # 如果平时使用rebase合并代码则加上</code></pre><pre><code># 工作区 <- 本地仓库
$ git reset <commit> # 本地仓库覆盖到工作区(保存回退文件内容修改)
$ git reset --mixed <commit> # 本地仓库覆盖到工作区(保存回退文件内容修改)
$ git reset --soft <commit> # 本地仓库覆盖到工作区(保留修改并加到暂存区)
$ git reset --hard <commit> # 本地仓库覆盖到工作区(不保留修改直接删除掉)</code></pre><p>更多关于Git的使用技巧介绍请查阅:<a href="https://link.segmentfault.com/?enc=6t4Fq%2FwC%2Ft5V4gN6t8Ljtw%3D%3D.wdgkrTy7Ba%2BlflGR%2FC597Qr0jreKQMaofE%2B2BkwIqUvNY8o0Sxw3PC07D3DI0PexcbD5N3eIVP8hsz9txVDDjFYeBsvA18Hl0hTqyr1Y2UOv4ncuJM25lAqmHiuaGyMeFGmKbokrQ9eOQhsS22TSL2nlr%2FINRWyZJsMMnodIPr0hstcujd%2FkoQrv40bkvP7nSdEb6dnIzHwsWBtVTSzM6mce%2FdusWK08uxUO%2B3vaelZep4ImwZYY7lxGeR8%2B4FkALrcc%2FQa8koV%2B3fRNlCUzojmyy7Xs%2BS1vt8VkF%2ByTpFiPfIluW%2FFThJ2wK0tJOI8Q0vsC2bOlPHLn6XP7VgpQ0Q%3D%3D" rel="nofollow">学会这 11 条,你离 Git 大神就不远了!</a></p><h2>Git 知识体系动态更新看这里:<a href="https://link.segmentfault.com/?enc=0iH5eIV9nM%2BP8ihZqb19tA%3D%3D.OKiL%2F%2B0brFXssv%2B99TOFUG3Vq37FBlCzFm3RWFpo0wG5faA4j%2FHPT6Ktt1aGXp7TBbinWWuWUv6vDv7E1V3%2Fp6X1FJpiqpF5FtXztMbvY6YC60b16sh39rAAzKZItawFH53U7e4%2FiIcTo085wU1BhQEorTzp%2BX48MpIPGZwh%2BBCCm5kbrSpwbNnnR8uA2AWW" rel="nofollow">Git 技术学习</a></h2>
神器 Nginx 的学习手册 ( 建议收藏 )
https://segmentfault.com/a/1190000041298011
2022-01-17T19:05:05+08:00
2022-01-17T19:05:05+08:00
民工哥
https://segmentfault.com/u/jishuroad
43
<p>大家好,我是民工哥。</p><p>无论是运维、开发、测试,Nginx技术栈的学习总是必不可少的,只是不同的岗位掌握的深度与广度不同而已。所以,民工哥利用周末休息时间,将往期推送的Nginx文章给大家重新整理出来,整理出成体系的Nginx知识体系,供大家学习与参考。</p><p>码字不易,如有帮助,请点<strong>在看与转发朋友圈</strong>支持一波,感谢!!!!</p><h2>Nginx 简介</h2><p><img src="/img/remote/1460000041298013" alt="" title=""></p><p>Nginx 是<code>开源</code>、<code>高性能</code>、<code>高可靠</code>的 <code>Web</code> 和<code>反向代理服务器</code>,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。</p><p>官方网站:<a href="https://link.segmentfault.com/?enc=jZgS5kyPpdvJ69AW2YU3kw%3D%3D.u1Co4n%2F5V8N0CPFmc%2BXMwiOAuFj2ZWgm1jW%2BuR%2BUa68%3D" rel="nofollow">http://www.nginx.org</a></p><h2>Nginx 特点</h2><h6>Web服务器</h6><p>高性能的WEB服务器软件,与Apache相比,它支持更多的并发连接且占用服务器资源少,效率高</p><h6>反向代理或负载均衡服务器</h6><p>作为负载均衡服务器,它可以作为HTTP SERVER或DB等服务的代理服务器,类似Haproxy代理软件的功能,Nginx的代理功能相对简单,效率也不及Haproxy,同时它也是一个优秀的邮件代理服务软件</p><h6>缓存服务器</h6><p>Nginx还可以作缓存服务器,类似于专业的缓存软件功能</p><h2>Nginx 优缺点</h2><h6>Nginx 优点</h6><ul><li>高并发:能支持1-2万甚至更多的并发连接(静态小文件)</li><li>内存消耗少</li><li>可以做HTTP反向代理——负载均衡的功能</li><li>内置对集群节点服务器的健康性查功能,不过功能相对较弱</li><li>通过cache插件可以实现缓存软件能够实现的功能</li></ul><h6>Nginx 的缺点</h6><p>Nginx 仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点</p><p>对后端服务器的健康检查,只支持通过端口来检测,不支持通过 url来检测。不支持 Session 的直接保持,但能通过 ip_hash 来解决</p><h2>Nginx 应用场景</h2><p>Nginx 的最重要的几个使用场景:</p><ul><li>静态资源服务,通过本地文件系统提供服务;</li><li>反向代理服务,延伸出包括缓存、负载均衡等;</li><li>API 服务, OpenResty ;</li></ul><p>对于前端来说 Node.js 并不陌生, Nginx 和 Node.js 的很多理念类似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.js 并不冲突,都有自己擅长的领域。Nginx 擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等), Node.js 更擅长上层具体业务逻辑的处理,两者可以完美组合。</p><p>用一张图表示:</p><p><img src="/img/remote/1460000041298014" alt="" title=""></p><p>Nginx 到底可以做什么?<a href="https://link.segmentfault.com/?enc=GmTNc1nf3OtyB9UoW3jxZA%3D%3D.A3XN9tGDfcVTT%2BPqSiiI6XMEdXpeXEGTJBZiW2j0g88HTZoH64qc%2Fw9gvkRDnZCvdUox%2Fqyvo3GYVkYl9YFAWdmWqHsur%2FGtjCUEQFJx6igRA9TUwZZyzDDbUqJqGt1M%2BqLScxL%2B9RYb5MUktscILnUCrqwRRIVKdItyhEeM1fSbeDNCq%2BrHOf%2BwVHuBc8anwWfYzBSm6ZOiUYR%2FAK5WLzctJlXe7%2BX09x9gcdR%2BO8gWYYMpl64jP5SmKwOtgE3b6%2BLeY1NmEof1tyAMXTZonFm%2B9Jr6gaS%2B7JZhKx3FRTj%2Bf4uKntMauSffnzjiun%2BJEr9704qZZjAxp9E0cyrx%2BA%3D%3D" rel="nofollow">看完这篇你就懂了</a>!</p><p>更多关于Nginx常用场景应用配置可参考:</p><ul><li><a href="https://link.segmentfault.com/?enc=84s1Olr5E2AYAHnOa5jlcg%3D%3D.PcAqVdNPfddl3%2Bmzyh42hDbUMEV9kctTpFL7vkIFhvFk4eP3F6jhzlqFXNaLMU1TvFb0l%2BTrgwcCrRXUQYBmXdXAS7YLp5mYRnMywwtJS8E%2Fb6zg%2BanurGzkkpGSTH8rAuKHcT3ffFt7crD%2BijBgxSu86VWEoXAXhnlTT8UyUF%2BAlECOC6s6TVR7sTPuL2hvA4mbhEJTug3R2VU1dQzqpRCLL7VAoayr93CQgf7W2jntorbypcV%2BOPc0TaWOYxfZAUrm3NvLkHUz5sNELdrJOZJL4hZ%2Fcbi3cF2aAomKPX0XMnk0W1asUKRtb4CaBpT9z6xPpKuJq26O0YNtIV3zfg%3D%3D" rel="nofollow">请务必收藏!Nginx 五大常见应用场景</a></li><li><a href="https://link.segmentfault.com/?enc=oW%2Brmy5kvIdIqd%2BvPUcnIw%3D%3D.mOUTwdlF2L%2F5Kmd3H0nbZs5n3Dnb5VyXo0THn4aX2cusyI7%2FBR9FuoIdVNO6qE6hiiqloMCCSCiJMCoUFbOMpcl6W2Y0d0zhFXJo9FNRqRk2TdmnMm53yPmwo6RPyIgmuMb1vjla5WWq9EaDtlZehIovVHRF7h2eSRlzYvrLZD5GHKKxejci%2BWLnY7GmedEEbAAx7kImwA98ZVoczoKDB4ydciSup3aMZryh%2BK%2Bxn5XKa8ctBsUGSi0MdYILqp%2Bz6rQlAIvr%2FnxRpDR7kzTIHqXSZD1LGV%2Fnz8bkbQMPeArR%2FL6RXfS9G5PYvbdnSpxPgdNun6NX5uGSfmP94kxJXw%3D%3D" rel="nofollow">彻底搞懂 Nginx 五大应用场景!出去吹牛逼再也不担心了</a></li></ul><h2>Apache VS Nginx</h2><p><img src="/img/remote/1460000041298015" alt="" title=""></p><p>Apache和Nginx都属于Web服务器,两者都实现了HTTP 1.1协议。无论是选择哪个,都是根据应用场景来决定的,所以些文件仅从应用场景出发,来对比两者之间的各自特点。要让正确的工具,做出正确的事。</p><h6>功能对比</h6><p>Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP、Perl、Python等,同时还支持正向和反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等。</p><ul><li>在功能实现上,Apache的所有模块都支持动、静态编译,而Nginx模块都是静态编译的,</li><li>对FastCGI的支持,Apache对Fcgi的支持不好,而Nginx对Fcgi的支持非常好;</li><li>在处理连接方式上,Nginx支持epoll,而Apache却不支持;</li><li>在空间使用上,Nginx安装包仅仅只有几百K,和Nginx比起来Apache绝对是庞然大物。</li></ul><h6>Nginx相对apache的优点</h6><ul><li>轻量级,同样起web 服务,比apache 占用更少的内存及资源</li><li>静态处理,Nginx 静态处理性能比 Apache 高 3倍以上</li><li>抗并发,nginx 处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。在- - Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。</li><li>高度模块化的设计,编写模块相对简单</li><li>社区活跃,各种高性能模块出品迅速啊</li></ul><h6>apache相对nginx的优点</h6><ul><li>rewrite,比nginx 的rewrite 强大</li><li>模块超多,基本想到的都可以找到</li><li>少bug,nginx的bug相对较多</li><li>超稳定</li><li>Apache对PHP支持比较简单,Nginx需要配合其他后端用</li></ul><p>更多更详细的比较说明请参考:<a href="https://link.segmentfault.com/?enc=9U8YNPgiZ0UA7xfW%2BDKCTw%3D%3D.V4M%2BUxHFj30KPeDCUkkwWDvz%2FDPYc6m7cdZVqNsObRBia4sKM7W886%2FuIMkyDY9nu3vr3j7mfr%2BrXRQtHwkAEO9ngIpdadjvD0%2BodmDMG5gDinN%2FS7LIA%2Fg%2FqKPKp%2BnsqAa1X86Y%2BDQ9e%2Bz9695atbhOiQsdA%2BSzPMhg8WdphhFoYb4tJl%2BYAZAaSgXbSb3pzPmbmEZHuMSRn0WgE5btt5n592yFAe1Ls50%2FhzX1T4VgjH2jI2qWsDn3ofJ2dAgOoiiv55PTz3eUqq6KY%2B7GgNEVym37NB4F1MFWdwgow9JeAzImLOhQnoY%2BIX%2BNFJbqdAC05iE4ewlffFvTtaD8uA%3D%3D" rel="nofollow">Apache VS Nginx,你选对了吗?</a></p><h2>Nginx 安装</h2><p>本文以CentOS 7.x 系统为例,使用 yum 安装 Nginx。</p><pre><code>yum install nginx -y</code></pre><p>安装完成后,通过 rpm -ql nginx 命令查看 Nginx 的安装信息。</p><pre><code># Nginx配置文件
/etc/nginx/nginx.conf # nginx 主配置文件
/etc/nginx/nginx.conf.default
# 可执行程序文件
/usr/bin/nginx-upgrade
/usr/sbin/nginx
# nginx库文件
/usr/lib/systemd/system/nginx.service # 用于配置系统守护进程
/usr/lib64/nginx/modules # Nginx模块目录
# 帮助文档
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10
# 静态资源目录
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
# 存放Nginx日志文件
/var/log/nginx</code></pre><h6>主要关注的文件夹有两个:</h6><ul><li>/etc/nginx/conf.d/是子配置项存放处,/etc/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置项都引入;</li><li>/usr/share/nginx/html/静态文件都放在这个文件夹,也可以根据你自己的习惯放在其他地方;</li></ul><h2>Nginx 常用命令</h2><h6>systemctl 系统命令:</h6><pre><code># 开机配置
systemctl enable nginx # 开机自动启动
systemctl disable nginx # 关闭开机自动启动
# 启动Nginx
systemctl start nginx # 启动Nginx成功后,可以直接访问主机IP,此时会展示Nginx默认页面
# 停止Nginx
systemctl stop nginx
# 重启Nginx
systemctl restart nginx
# 重新加载Nginx
systemctl reload nginx
# 查看 Nginx 运行状态
systemctl status nginx
# 查看Nginx进程
ps -ef | grep nginx
# 杀死Nginx进程
kill -9 pid # 根据上面查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程</code></pre><h6>Nginx 应用程序命令:</h6><pre><code>nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen # 重启
Nginxnginx -s stop # 快速关闭
nginx -s quit # 等待工作进程处理完成后关闭
nginx -T # 查看当前 Nginx 最终的配置
nginx -t # 检查配置是否有问题</code></pre><p><img src="/img/remote/1460000041298016" alt="" title=""></p><h2>Nginx 配置文件</h2><p>Nginx 的配置文件结构如下:</p><pre><code># main段配置信息
user nginx; # 运行用户,默认即是nginx,可以不进行设置
worker_processes auto; # Nginx 进程数,一般设置为和 CPU 核数一样
error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
# events段配置信息
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
worker_connections 1024; # 每个进程允许最大并发数
}
# http段配置信息
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
# 设置日志模式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # Nginx访问日志存放位置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
include /etc/nginx/conf.d/*.conf; # 加载子配置项
# server段配置信息
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44;# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}</code></pre><ul><li>main 全局配置,对全局生效;</li><li>events 配置影响 Nginx 服务器与用户的网络连接;</li><li>http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;</li><li>server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;</li><li>location 用于配置匹配的 uri ;</li><li>upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;</li></ul><p>更多关于Nginx配置文件的介绍可以参考下列文章:</p><ul><li><a href="https://link.segmentfault.com/?enc=FFtK%2FtOSRYzxV7WnnZJPgw%3D%3D.wcUJHU0UtixfA6rprDWT7Lvk%2FPjyNELTTWy5Oncco%2FJDGBpCt22ec7Snysy%2FAvfuXBrK3mRMTUaeqKkz4DylpLQ%2FF3bknrXj9EZsyNKW3%2BREptzKJ2fMR7T%2BuAz4PDLEO4hw3CF7EyqInXQJfbp%2FJ4TUMz4fXLFe6dzutdyzK1wVC%2BmXDcpJ1VvB8ZgO1wkWJ3oMIBN9gOzGF6BwYxrgb3JUXCiuXj1TUlRHEpSSboXVLZVWs40d8HruMhbKOiLukLj0peVlrGmjaAPwtrf1MuSPZmprsjPBhHzZQW%2FWFXKa%2F2%2BugLN3uxHPUUtfzDfGCL%2Bnn3GeRL%2FGCdd8m96zjQ%3D%3D" rel="nofollow">史上最全的Nginx配置参数中文说明</a></li><li><a href="https://link.segmentfault.com/?enc=20YJP2H2TeB%2BY6N15qa2QQ%3D%3D.8Garqe6ONwpoRCy96S3eLZE14JjNdc8NWTZn9zl4fKRf8XpzTpII6P1LelEagV%2B7ceKJFQ63balLl4BYOrUOkdMtHsyEVtycsLfcLNqLOdSBjVr2K%2BY5KBUQByuuxw4srg50REJp6SnFM%2B5s6pDMDFgi34qHEkzwx2y%2BuzImDtxOTJdzJh7JmXcT0noPNNcA%2BlsFxGzqcDLQYUoZErpGmKyPw4UJoMv9iixO1EeBHDTdg1ZST4KPr%2Bo6rygSfvjC4Rxu%2FlJvV0bz%2FFz7la7c7dq0NiJ4k9%2FEBHS4JJGpk5vLQpkeyJu9Qo%2FicIyIfvLCvZTXR7I5z%2BvWiUtMDdGFAw%3D%3D" rel="nofollow">Nginx 常用配置汇总!从入门到干活足矣</a></li><li><a href="https://link.segmentfault.com/?enc=0GYRPxo8hTawloOeIJrUbA%3D%3D.h83n1R8bkfUREl3Dsq6nsumxM3vl4OrlF0aENR4m0uQQP%2BGOTn6kKNgUTdjaIsUrSgDp6qq9qIhcM1gOWW0zeAo7pmKvJNkR%2BdZl3kzHhp2H30yo7LtkJXNeGAs%2BtwECJu5ttW91xXNateSSC1jYnWyWHZecSM0j6wn8i34t1IKR5H2TuB0%2FZqkXooWvd8jhzVY%2Ft1KFBoLZRJO2po5miB%2FozQue6mOtfFbKuRM4UKsbL%2B4Pz2knGIO53nI%2BR%2F%2BII8BAHmRt4%2B7jb65DCwwbgweDAFCcz9tCSUcwccbsQqNDoNGlhNdR8PjA4mangQqlmGesAyY2ZZqv7Jlb7SQPvg%3D%3D" rel="nofollow">Nginx 实践:location 路径匹配</a></li></ul><p>如果你平时配置Nginx比较频繁,我推荐你使用这个神器:<a href="https://link.segmentfault.com/?enc=z%2BWwvBxXnmLscdokl2eiGQ%3D%3D.YrKFsacrUR8tPEI%2FuFBeOHKV2RgEVXBQzHn1ju2RTjNWtb7xjVyh%2BppFcvDAnvJFwAxGTDRnjEugHkmSJzZBZg1uk5aJWgD0tvy98k8CNld2Tyb5WHKSm4NtjdTDRkBBXhB10fbULMCwjewtlC3gUYPaGoa%2F0XIGlkiIMiww6puvYbT8AAzeFY37C7XJ%2FpcSR60nR3dl7re3%2FYzfxQS6S57fNCBUU9HmvQPMWCUBvLx66l2itXh1LGZm9Rls6MY1YtgC6lF4bff1SwzVwXWkvd2PynVJhmG7U02%2FfyVDbtvVcdVDsC%2F6XXxig1rf2GugeBdAcsChuP6i%2FYECo3hLtw%3D%3D" rel="nofollow">强大!Nginx 配置在线一键生成“神器”</a></p><h2>Nginx常用的内置变量</h2><p><img src="/img/remote/1460000041298017" alt="" title=""></p><h2>Nginx 的进程模型</h2><p><img src="/img/remote/1460000041298018" alt="" title=""></p><h6>Nginx 服务器,正常运行过程中:</h6><ul><li>多进程:一个 Master 进程、多个 Worker 进程</li><li>Master 进程:管理 Worker 进程</li><li>对外接口:接收外部的操作(信号)</li><li>对内转发:根据外部的操作的不同,通过信号管理 Worker</li><li>监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程</li><li>Worker 进程:所有 Worker 进程都是平等的</li><li>实际处理:网络请求,由 Worker 进程处理;</li><li>Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。</li></ul><p>为什么<a href="https://link.segmentfault.com/?enc=k6E3Y0IQC1hQmyDH5M9eOg%3D%3D.bnav44gEp%2Fc7nlOCw39PW2uRtAsqgFe7X96jROpj%2FP%2FyQP3b0sarlt79lHp8mKwGsf86bbosCWJfkSeL9lQ7567CingjYGcv60cDEIdGNOTPQTSSWgE7pPuNet9K7PqF8xtxp64QbPPjw6WtO%2FefoVpy%2BItQkB3%2BWXSQu0jS6uLtWCyWwLiHP3jECyhveQAYQR5oW%2FcC2%2FK1KbfkUKipU12Sj7MiSqO%2F97ABW6qRBLguZ198u3yGS8PNNUdQXGDA04T84VIdrmKRF6IyXNLgk8xXL4cZ9NPAAAyynygqmxLcsuij8ClQITr%2B8c1aHnIYqd7fGyedvxbGTeIK%2Fg7Zpw%3D%3D" rel="nofollow">Nginx功能如此强大</a>,可以参考:</p><ul><li><a href="https://link.segmentfault.com/?enc=XHJoLr6U6cLfotdvo1W6sw%3D%3D.2I91PAJ6osP9FHnPmvR%2BQCrcw%2BS77lkm6XBqmg9lqoXq9Gt0iKqo8uwBrjP%2F%2FuuU3seEc27b63neMGRsgWYauvKRVrV1XWWX4thv0LL69IFYkDhqA2G65ov8TxEmZlkWl1EBvHsLnohybKiove3DQaeSMsHZPKNd%2Frye%2FrDTY172xqjZv3zlvmE5cCAk8uIkdsMgz15Z4DgUAPuOu9ixPGvDLVjbNPVEmSSYYRXYwOLZvxle7PMbFxaHRglqOFkX3pEf5HmkYCAmWjQBKCyukqZf6saJRAF0hrBdHanUaomTYR3wlxN1y6w%2BQQIvYxMIZYcMb5zmvp45AGBDSZIUNA%3D%3D" rel="nofollow">Nginx为什么高效?一文搞明白Nginx核心原理</a></li><li><a href="https://link.segmentfault.com/?enc=vVBdoej3bhvYYIgrlGXEOg%3D%3D.yn0g4yZFXqCpjmSbCQhXDuUZtsfh2UUZ%2F7xAyJGICO153u%2B58XrH2L%2B%2BqCm4S2K1x9r%2FiCvj0XQ2i8Hdv%2F1duiuYJOkBwZsFCVkcWbD3QMxlLJoNml1cIaqH1atXCvP1h%2FIalzT2Nc741bqKNn98ygBzw0ZmkZki8ZQj2yNFeauGVSldnLvIQHRYhgBN8u29oaCdUOMor9Cn4JoBtiKCwO1ealzKTVwa3rduwhqsmuAPAjR%2FvyUMbvBIfrslDRXPwM9af4YhtA5QFCsrsTBFKyyxeL7dYntvAq%2FhvWJaxzRYWFC%2BoWUQw2Ui5NYs8mjdW%2F7O1uVv39MAsjadylEPSQ%3D%3D" rel="nofollow">从 Nginx 优秀的核心架构设计,揭秘其为何能支持高并发?</a></li></ul><h2>Nginx优化配置</h2><p>其实核心内容主要是通过修改 Nginx 配置文件来进行调优的!</p><ul><li><a href="https://link.segmentfault.com/?enc=16MJHC20Z7UVijUO8O9uiQ%3D%3D.0t%2B%2F8Ct%2BFhHbzBuVuPs7mEpTFuvwUSTtqNZZW5BT8gDsqPOEjM30CGd9XQHG31kbY8F6VtrkbPhboNbjFomgZOF3prjZfwmPKo3%2F6sfy9gKr0IXTSv7Phbg7kIhL56mnPlPy%2FLxGO5f4mbCImlK9Z5hCq73xyQNmnBsK%2FIdVJrxOpA%2Bs1pyZKsOqCVPdZR1C%2FVM5PF04NcyV%2BNcqF2N3kqLF0OCHm3lJKtxC%2BSa54mQiS9qdXC%2BsqHm0RHUOTjd2VS65ywljIwtfBi29bOoQdRYegxm4F1wFI4sQEbsdjHfBb%2FX0wxdy2BMDn4XzMc9tg4U51YcV0b6hqwOzlCRzHw%3D%3D" rel="nofollow">Nginx优化配置详解</a></li><li><a href="https://link.segmentfault.com/?enc=CTQ7c5CMnMBhQEZBQi5z7Q%3D%3D.FGB9y20Yop%2BxB%2B%2BJxGa6glvYbukAGtWIBlsXaY3yHnbGFXt7xGFFSiTiJYB0CvJVJFXQMdbVKo%2FtjFHaQK0VQqDiKWfu%2FtrP%2FyxpY7WbVtso8Qk3SYPYF39OPsXKCbSfuWwHbMCWWCP1JCjh%2F5ZQ84ohP7on0neWal50XVEl3qYghG9lK1%2FTPU%2BNf9N5nQCNDPod%2Fp9rqSKlqSQ6l86Gp0o3Qwn2D6NSHagwCqmt%2FszmIIXGaWtJwppNSgllKlIJrujPqr3uWrWaOxrgONsy2SbNlNK%2FEkc4oM19s4EQnBZBzjy4vl40iGeQueuTUfNDC0Bqayhi2pWXbAerZRYVxw%3D%3D" rel="nofollow">加速 Nginx 响应的 5 个措施!</a></li></ul><p>在我们的日常工作学习中,我们会该如何去优化自己的Nginx服务器?遇到以下问题我们该如何处理呢?</p><ul><li>如何自定义返回给客户端的404错误页面</li><li>如何查看服务器状态信息</li><li>如何优化Nginx并发量</li><li>.......</li></ul><p>这些问题都可以参考这篇文章的解决方案:<a href="https://link.segmentfault.com/?enc=9M%2FXVJuKQAvjIsEZFTNgYQ%3D%3D.CVl7%2FtUcJOefTJBgmdOJMhQ2fgiWCAT9s76xcclvgq5Ko2VucxpvAb0WnESytU9IuaBjM4Pxp3vBULf7y7CY%2Bu192OelA%2FfjY7sKXy6CnmQiJ1JM4gNXbB5r9m%2FgmpRcv8wybd9DI%2FJixBLzc3O%2F%2BH%2FlvsNLJaskvti4IMOw1p7hrVC%2FKE8Nqx99k4ZwWDPNatqJBj8UJJcNlsavSUO9edeRjpd78FqBrICRn2ugxQBp4cuDCpG%2FQT3jWEY0o1epKG8M74c8NsgfL0Sv7Vjza4h%2B0miDmOt%2BdQ5pbXGmtLKML1TNN4jxJhv8p8ZoRD4wK2aAI%2FdVlh%2BTGXxB5z006w%3D%3D" rel="nofollow">Nginx 高性能优化配置实战总结</a></p><p>Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些?<strong>这种面试问题你肯定是经常被问到</strong>。</p><p>所以,<a href="https://link.segmentfault.com/?enc=0GWIHWKsWqNrXB1oHjz0QA%3D%3D.kSxtgu53QRcYiCbvh5xoyw8fble1Kb%2Bcd7hGQxhyRz%2F6w%2B%2B002wFs3nj8E5FDXUZU7iKbiGj17JoeM5XjqzJd%2FjQsuVa4n3EINHtdZxfxMyO7PEoEf4x9boDBRdrNM6ZkCNIkcf4BIYvk8ImpNaLxGXptZLcjq9UZSo5cKEmKo8A6c8MmYA4oX%2FqrVSGeSV%2B2neRcESuIMF8DdS8kVUf03KnjzhkREmV%2FSm4ajOM0JTfeUexweIjPFuk02wfQ9PKTqZ1GkYoKkjY268kEMTP6pqBWv%2FdHaMuDyyA6P%2Bat2cIN49QZr612iufYq%2BqBNvWGYhFSynzpIdDelEZPnEo4g%3D%3D" rel="nofollow">Nginx 如何实现高并发?常见的优化手段有哪些?</a></p><p>对于Nginx服务器的安全,在日常使用中也是非常重要的,这里给大家分享一点实践经验:<a href="https://link.segmentfault.com/?enc=M6%2BDSunGWlGoGh5PoLHlXg%3D%3D.SqPCR8NBk42f%2FkTuUZqcsGo%2BEHWUGJRaICBFqIHDG%2F2e9tSEhCJRkg3e7NJkRWuZwFJnG%2FLmB%2F43fd%2FOht%2B1Y1aRo1PdtroLNhKcQSyopgwEZup5hFWoT5mikWX1s%2BcdPN0HpJ51Fe3ou%2BS4QNQoP4boOZhRwI3HUZXBGKL%2FUwJpThjCTyW25TyYm2PODTx2B979WyzeAZlGSiUbfSXawB4xW3mtDM3mdbxJMJlTf6Rvz2yVdNuJSaHKseB0sscGYNMDhmqYRrYOQqS4g8qlTPfbDV90fkLDCGy6akxe2q45K%2FXAPIKzT5jAEhUWWOhRngMcGWy4lMaC6Zgm4x2iGA%3D%3D" rel="nofollow">如何构建高效安全的Nginx Web服务器</a></p><p>最后给大家分享2个基于HTTPS优化案例:</p><ul><li><a href="https://link.segmentfault.com/?enc=ng0dkQNZQReIS6OobxEssQ%3D%3D.FWa8oAZ4a5WqUZnhG1qCYuOQe7LbrH9mqFXUnlePveyrDkfET7Eo0iR3692DtBTA%2B4dW%2BXT6qW8Auhsp7y%2FPkDluAmi2S9y8D88iaKpie4IlRb1RYnng%2Bu%2F9Dd%2FaIlRLrReNvn9je5I7m8oo%2F4JOUIzHWUdsjI4PpzO0sZ9fVe3g%2B0YqyWSP3GVqCMUtelw9kJXD160peQhlch%2FeyYE1VwQObmSTEamf%2Fb%2FdxEqje1g4BC8oYNTf%2BmXoNxUq7GyAt3uOeGyyDaAgmKXqn4vlIpUXdXL0VkZZIf%2Fee22%2F8iosIbGusK%2FJFVkRqa9DCYPaItuUPHeMtBcSZNC8FjKUGw%3D%3D" rel="nofollow">基于 Nginx 的 HTTPS 性能优化实践</a></li><li><a href="https://link.segmentfault.com/?enc=V%2FtZCttDBrVCMVuTvCFMQg%3D%3D.DMTiW8511oNkNuMt5LUE%2Fe6pYViiq8Pil9fosD%2BP2D7PcydChHUDt5Sv3zuQzdsKwUXy9erUJdl2ziHvkPhRKwRNGXcmUNOkEojwKORzog%2FnalPligkPdOC17DAqNHvKjTQHmZYNlQh5et9y%2BS9nlPNgoND7WBCj5UeP5WF9hYtfrBzkqCjBsZ0jvvN4kDTA6Ew3Ev%2B5Vzu4fQ0BtzUlcul%2FMN1z%2B5k4%2FJ9LvK9AgVREWnhmii08Nn%2FvfHlwOezYWo%2F%2FgYpkHy%2FDziyl2W2fvrUUrLipedfmJBXnlL%2BqQEVAuzEyNe6wJb2ypKnDdh4liroP1YMO7my7%2FzD%2BmDyQxA%3D%3D" rel="nofollow">高性能 Nginx HTTPS 调优!为 HTTPS 提速 30%</a></li></ul><h2>Nginx 日志相关</h2><p>介绍完了安装、配置、优化这些常用的场景之后,日志这块也是非常重要的,大家都知道日常排错,日志起着举足轻重的作用。</p><p>Nginx日志主要分为两种:<strong>access_log(访问日志)和error_log(错误日志)</strong>。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误日志记录了访问出错的信息,可以帮助我们定位错误的原因。</p><pre><code>error_log /var/log/nginx/error.log warn;
#配置错误日志的级别及存储目录
events {
worker_connections 1024;
}
http {
..................
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#配置日志的模式
access_log /var/log/nginx/access.log main;
#配置访问日志存储目录
}</code></pre><p>关于Nginx日志的配置实践看这篇:<a href="https://link.segmentfault.com/?enc=DZtG%2BB64sRWrrkIPdwGDWg%3D%3D.rrejD3uNE3ofBDVuyfW8tPmHM%2FLjxfnpiVqrr6Z1rnlk%2FFlJ5rsWVM056DtPLsDtowgqEFxVwEwB9JiELIRDuL32vrBdAxKi6KPwo8iHbsFVgc0Xf0qnz0r3wLc3jdz1KBmJUdNVOeqT3cuPIkhSbqNXdFB%2FXUy%2BIcl9dIfNMOwFi%2B%2B6sjxIQI57MMx1bl02xe4yF%2BqSnCzYbyllPKmx6VrEpw1CDSef%2F76eSKhWsu3i5S1NhN5GWYYJ6KYCnIBkwYBcayzNgtWrOl4cn8VILKj9ccBn%2Bn3FqXhHydTrm3VBAQKvQ4kmKtT6gDDFqy7EbezL%2By%2FvGnJu2LSQV2m6gw%3D%3D" rel="nofollow">Nginx 日志配置实践!超详细</a></p><p>由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。如何有效便捷的采集nginx的日志进行有效的分析成为大家关注的问题。</p><p>通过几个实例来介绍<a href="https://link.segmentfault.com/?enc=sRRtBr5C3FKqwj1cdRq%2B4Q%3D%3D.Ohz%2FCDxrjL0g8psnIlN6PtNlpN61xHsL4Zecg64ccWJxShrUXAuQBSj9ItxMtCxCdx8%2FWWUUh6Fp1Jfy%2F9SOUo5NX1R0FD6Q6GjWg1ebfWeRYL2XpK95rwybsdhyUklJZJfiJO35N2JOES1TzI5Ec3srChjtRZlj9IdwWVdO2V5hq52Ikrh8UJD2Et4n3QpzUBD%2FY8o8CG4KK%2FJLXZXiN%2BSj8W0L%2FYF0DMJ%2BEQ%2F5HLU6m77gXWWO9qg%2B7c9oQ%2Fad2tIyXBPl%2F9iw5wSo5KGDNiwIZbuSOSE9SD3Q%2FnP7SJ2xv%2B5uGOHA8Wy1rJq1CcgPsDTjAhNX59Fo4jxBbrfx2A%3D%3D" rel="nofollow">如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志</a>,我也可以:<a href="https://link.segmentfault.com/?enc=LQMXBTgNp8lLHP2zJxxajQ%3D%3D.vzqEdoT07utQR%2BciHrvnZRXvHTjqVqC8iwvfSbXC1lJbZjaoYsxYCOn51Uf1rfXaNSZvy%2FNywqLr3x8%2Fxn%2FuRtGw%2B7Y0ERLmkz7hEYan59rUyh0aOmBgoaFXM1NwhIhGqDXNzB99E0G0LawxdnWC7VBurp%2BFl6fuqjks9I1bpEf5JgziCfQBEaY%2BgieDcx6h4TJSlEGMnpaGTAsRF4TNufsoQk6fzn1UsKHmsBmCBWCYSw6WbQ9IYabmvgDYznixWq%2FyIKVq2q83RTaBhG08J%2B5oGbXU2Mh%2FJwhONJPEP0a3j0e09vIKne%2BxjFDlF2yNQBnoZ6FkCQOHrtd%2B8rtF5w%3D%3D" rel="nofollow">利用ELK分析Nginx日志</a>。</p><h2>Nginx版本升级</h2><p>这里我们来聊一聊,在企业实际生产环境中经常遇到的一个情况,如何升级Nginx到新的版本和如何回滚至旧版本。</p><p>版本升级其实就是针对二进制文件的升级,过程如下:</p><pre><code>[root@nginx ~]# /usr/local/nginx-1.12.2/sbin/nginx -v
nginx version: nginx/1.12.2
[root@nginx ~]# cd /usr/local/nginx-1.12.2/sbin/
[root@nginx sbin]# mv nginx nginx-1.12.2
#首先备份原来的旧版本nginx二进制文件
[root@nginx sbin]# cp /usr/local/nginx-1.14.2/sbin/nginx ./
#拷贝新版本的二进制文件到当前目录</code></pre><p><strong>注</strong>:其实升级新版本,最重要的就是平滑升级,让前端用户无感知(也就是不中断服务,这个其实不难,生产中多台依次灰度升级)。</p><p>对于升级来说,最难的不是升级,而是回滚,因为在实际生产环境回滚的机率是存在,比如:新版本由于某些未知bug导致与现有应用不兼容、或出现运行不稳定的情况等等。</p><p>所以,对于我们来说,故障回滚是重点。这里给大家推荐我总结的:<a href="https://link.segmentfault.com/?enc=6KPrFqbKee7fLHYTIx%2Ffyw%3D%3D.DheJJytEbmH%2BnL05z8J9ZeEfGolQEqQAZe3RYtyo6b0TC1aDyWS7oKN6jTStFU5nwxAAflZw5mvTwoySe31jRiVjMmaot%2BEe%2Frb8kjj%2FEbsoQzgXCVnpsvaR09JxPqafgpWUkdp7geNScUW2dtFTOjUEw%2FXXDd%2Blkq7w7WnTfQzrj3f2rqPbmT7GgXMFBf0ZxXank2uUTDcdUaVOo%2Bf1mXd4V8%2BlNk00G%2FEmexxljqsvDP6mQyhZ%2FLHVTApIokJ%2BMvvmm1ZqcqWq8kkNf0FRnhXexNbKj2hpnFCjLGHI5kBKOvdeNtymBZcmT1%2FIUS27SJM7JlDghX%2FIOj9AX7aVlA%3D%3D" rel="nofollow">1分钟搞定 Nginx 版本的平滑升级与回滚</a></p><h2>Nginx 反向代理与负载均衡</h2><h6>反向代理简介</h6><p>反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。</p><p><img src="/img/remote/1460000041298019" alt="" title=""></p><p>反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。</p><h6>配置实例</h6><pre><code>http {
.............
upstream product_server{
127.0.0.1:8081;
}
upstream admin_server{
127.0.0.1:8082;
}
upstream test_server{
127.0.0.1:8083;
}
server {
#默认指向product的server
location / {
proxy_pass http://product_server;
}
location /product/{
proxy_pass http://product_server;
}
location /admin/ {
proxy_pass http://admin_server;
}
location /test/ {
proxy_pass http://test_server;
}
}
}</code></pre><p>如果你对Nginx 配置中location 的规则不太熟悉,推荐你看看这篇文章:<a href="https://link.segmentfault.com/?enc=D7K3BWisXCS%2FrgvI0y5%2BjQ%3D%3D.Xb4QT1hrG2FHKXQ6cIJxSK237ps0QiZlfu3Z41DZbOHeo6mOuGUgAGzwF7iV8Q03%2Fl%2FRnaiR8VGzzJbecXhldEmr6qLBK7xtUor1jPoHOLhG4c3O3imbP5%2FA1BAR6tOz6Boxmy7T%2FfH6Gq3Jb1rEtuPQMT3sCrsx8T7DsP3s8nIrlF2UUfl1zYoJUcEyyQ1us0yoGFglHwIY0cnhYKd3IYoMZqoONDUOtRD%2FxtNFzdhylN6SKGrLZ1AqO3UDkGQ20SoFPsNwohOejprg6rfoAhbl6r1vub2g8NIfvipAEtL%2Bxea32Oeylq25n83gpNyF34z8v3xoqEAlyfQ43tAfBaZH%2F7XEyKVoKvlyG4YHnFs%3D" rel="nofollow">Nginx 实践:location 路径匹配</a>。nginx 每个location都是一个匹配目录,nginx的策略是:访问请求来时,会对访问地址进行解析,从上到下逐个匹配,匹配上就执行对应location大括号中的策略,并根据策略对请求作出相应。</p><p>所以,有时候就因为在配置时,少些了一个字符“/”,就造成访问不通报错,这种问题是非常觉的故障原因之一,正所谓:<a href="https://link.segmentfault.com/?enc=8jYLjDQHqO2RAOYSQMEkoQ%3D%3D.nv2MqP0Dbq3WXWurDGl%2BG8d38YSjTisFyn2rnxcVoOUKiaw1sO9GXouOMsTaEg7hoaN6PRWzD7MmfeGbzCi47GheSZotr%2FpiLdgiFfgZwcOOZ4xMLZqRbOQ0z6QLh3fnPQIBrObJo55rLcwrdgeJQ2c0MXfWda80dYx3iSsFY7vWSwZX0luX4nLWgULXZzHSVbWpJd0%2FnksFZZzlMugfB6AObzPKfx7FJJXfExgXRmRVOT4fLvK1EvwLlGSNjQCiShiVn6vuQrnbM6gtE5f0dp60mi%2FL9gyrnTMbRhAs9uSJ6vGDDH5hZuL%2B0d12c%2Bf2FmNs9ufid8nFRyc1aHB4ow%3D%3D" rel="nofollow">Nginx配置中一个不起眼字符"/"的巨大作用,失之毫厘谬以千里</a>,这篇文章详细进了相关的说明与举例验证。</p><h6>反向代理的优势:</h6><ul><li>隐藏真实服务器;</li><li>负载均衡便于横向扩充后端动态服务;</li><li>动静分离,提升系统健壮性;</li></ul><h6>Nginx 负载均衡</h6><p>nginx能实现负载均衡,什么是负载均衡呢?就是说应用部署在不同的服务器上,但是通过统一的域名进入,nginx则对请求进行分发,将请求分发到不同的服务器上去处理,这样就可以有效的减轻了单台服务器的压力。</p><p><img src="/img/remote/1460000041298020" alt="" title=""></p><h6>配置实例</h6><pre><code>upstream server_pools {
server 192.168.1.11:8880 weight=5;
server 192.168.1.12:9990 weight=1;
server 192.168.1.13:8989 weight=6;
#weigth参数表示权值,权值越高被分配到的几率越大
}
server {
listen 80;
server_name mingongge.com;
location / {
proxy_pass http://server_pools;
}
}</code></pre><h6>Nginx 实现负载均衡的策略</h6><ul><li>轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。</li><li>最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。</li><li>最快响应时间策略:优先分配给响应时间最短的服务器。</li><li>客户端 ip 绑定策略:来自同一个 ip 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题。</li></ul><p>想要高可用?<a href="https://link.segmentfault.com/?enc=03pDz1OmODGjZAJ0UEb8IA%3D%3D.eZjF%2FIyFX0vD9ocbPtjRFi%2BKR99qQBS2tvYylOuDsYCIV97wVE6T9zg3DEoP%2FKG3VdJx79O5UvQlyem3K3QtCy90KguV2AkZRFW4B3RIdR9B5Z1uuLhH0%2Fx9GFPdNXcLNvmii8%2Fu2yr8OocevBiQCsMnwayY5AsLrOBKZ%2BtcY9jdsx442kjE7yt26ZtmYgyJcT6Q18kpZJxjP7RcrEoPm59s8avDsOAL4ffIKgDpE7ZK%2B0gXo4RSNoJnYTyOc06yJjl8zcy%2B0U4UKxNlv7BNIgq%2B%2F3%2FGbq2Qpj2vHEp54646fo29PC50xWrn4M6hvS2yBB2H7dIugl5RY%2Fxn3JgIjQ%3D%3D" rel="nofollow">搞定负载均衡架构是关键</a>,</p><p>关于负载均衡和反向代理的区别可以参考:<a href="https://link.segmentfault.com/?enc=9wvMOmse99c8LfFKJfsGLw%3D%3D.HiuWuD71NA3zpgSsdzkrb%2BLPFcwkGE2WTWwYpd8DwsXwY%2ByUqt6Wen0MM5Y42sA4mnNmEfl1BJgxYyqkBmHxeDo4Wy99MGH%2F2ozUAVKarOo81bX3sFQ8uSyCEjn6n55x4B7Q9jDO1t3gR1o3zAFs4ZTcpPdJ1uBA6y8rZSqg10S59GOQbzlFFBA0k6szyf6tekQ%2FRaGbQeWr7SiXcI6KJ4yfWBEZkWFDCBBg5lAPQyflWv%2FTIlk3ZiwhIO4K0BRjVZ%2BXgaTHRHCBqyewYKa03rDS2JmD7I6yytgr0mBnEUQ195MNKvEb4x2ppSQnAP0DlD%2FhcYxuKaRt7HfRS5EDQA%3D%3D" rel="nofollow">一文详解负载均衡和反向代理的真实区别</a>,关于 nginx 反向代理和负载均衡策略 <a href="https://link.segmentfault.com/?enc=Ls%2F%2FC3jiUh44pamg7h81JA%3D%3D.qy6iE74gEzjrsPILRRbSt6CNXxjzcFKTt9gOy8nGo5XatFyLWchUQsgdBIoMhovuRkKjtkOkdnWCFGNAzCgoOgkFsjqeciZB1e0oc2sWqjfOhVdrRWyTmwXE9CABF42sXrbZsMxvoi%2Bbxbs3XbaNNNW9kultIj2uy01j8Z7tYnv1WE260sqYVTse9gsmhpicGvsbj0AMu2tDXfYcYD3uum8Ee67QrF96CAFBJhGHvLBSaYEXzbE2u8GfBx%2FwdAG7f1JoF0nZIxpfzTRrdQir3F8GUNAVraXS31VXwXyteJsVm1jb8mEaaZ3fhZ9v2GDFkUxPm%2BIU6BOIVUzZsakw%2Bw%3D%3D" rel="nofollow">实战案例</a>。</p><h2>Nginx 动静分离</h2><p><img src="/img/remote/1460000041298021" alt="" title=""></p><p>Nginx动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。推荐:<a href="https://link.segmentfault.com/?enc=o0W4I1qGEJtdq1ARhPicBw%3D%3D.OtwDHEKX8D%2F3lwHa1rwX9xZNN9SVN2D8yF9TvHLdgJno6v46n8ZrHg4qfQooBKfqQVxif%2FGJMiWtTFFrBL2E1YKHjaLS1F0VnNcOh%2BezlGkzZeoGaKmsg%2BWnc4JkMz9Ofp6%2BevCHn6h8m82lGJ%2B%2FeXj%2FeUOc%2BJPqbkF%2F5LZCe%2BymcvOEmO9iBQkM570saznK2Ai4deL84ycl9is3zzOT4vhFlVmjcgdmyGPKNi2De2SBFj0WnPrhtQVeHtznUCVIriexFL22RDZl54nXhnpTy11dDx9YE6kRoGCW4MpQN9cEkc4erBQH9xLpTukodAlj" rel="nofollow">CentOS 7.3:LAMP 动静分离部署</a>可以了解一下Apache的配置,然后再回过头理解Nginx的动静分离可更直观。</p><pre><code>server {
listen 80;
server_name mingongge.com;
location /static {
root /wwww/web/web_static_site;
}
}</code></pre><p>也可以使用下面的方法</p><pre><code>location /image {
alias /web/nginx/static/image/;
}
注意:使用alias末尾一定要添加/,并且它只能位于location中</code></pre><p>使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。</p><p>小试牛刀!<a href="https://link.segmentfault.com/?enc=xwZvidLHOjklU1eXCJbGVw%3D%3D.Mv0YIcark%2FCcn%2BeAHqOhWzVj7wtgpGNDlmpj%2FYH7aDPgsVd%2BcymCcpau2wDDjZ5e2IIoZrnrcPo9msWxLQ4sVpU2ls3S9vzrAIq9pyZPCFGA1zvYPvXciWcU8r5b0N9i%2F6AHcz3M8DQYeR3hKQtssAQ1kHyFxbgwMinm8jpCjvkEVPC8wXSf7v6BIesFPP7xjajoM7r00Anv2GKn68LH9LE9sbTIxhJeYXqjJ8VWfdt7zkTa10uPqyvtYpUclH6Fvs4wmkN2acLOVNv4wXHVW9z7qGJQbbUOb01kaF02qE%2FxzVoBGvZBKxHCZW13gcURG05Y7BtRc%2FTDlgALd0boPQ%3D%3D" rel="nofollow">Nginx 搭建静态资源服务器</a>,这篇文章是给大家介绍整个搭建过程,非常详细。</p><h2>Nginx 高级功能</h2><p>除了负载均衡,<a href="https://link.segmentfault.com/?enc=H5GojtfYuWN1icb0psnZoQ%3D%3D.l298rK%2B1h5Bi7YSIusumiX%2F0NFBsgrZvV4uS%2FuDvZIYLe44SRDpP3mrTerqkf7IVwRYXNvREfK0Pn%2F%2FIjq0ok5WBsRnqIAr3zEd8Ppe24wYWhJi09rDm5RIQHCdx5OCG8hcSuXELTErVkMrhFoOjG3v5Gn%2FrswD%2FMGuhugdfk0IHifsWT0EdYR1ne5Ro73rAhvaQ4YSCngdcpfRjLG5ynFrua5HCNJSfi3Hh9Xf7hG321Rl8I%2BrUge9IA4mfBACGZWKu%2B8LCOcmTinRumR0cPiN0sN8g1lCUIt74uPQPeMYTUy2GjFWs%2B%2FZM5RUZOpLTgUIX7Hr%2FKdcBy2Ey%2Bw1I6w%3D%3D" rel="nofollow">Nginx还可以做很多,限流、缓存、黑白名单等</a></p><h6>重定向配置</h6><pre><code>location / {
return 404; #直接返回状态码
}
location / {
return 404 "pages not found"; #返回状态码 + 一段文本
}
location / {
return 302 /blog ; #返回状态码 + 重定向地址
}
location / {
return https://www.mingongge.com ; #返回重定向地址
}</code></pre><p>示例如下</p><pre><code>server {
listen 80;
server_name www.mingongge.com;
return 301 http://mingongge.com$request_uri;
}
server {
listen 80;
server_name www.mingongge.com;
location /cn-url {
return 301 http://mingongge.com.cn;
}
}
server{
listen 80;
server_name mingongge.com; # 要在本地hosts文件进行配置
root html;
location /search {
rewrite ^/(.*) https://www.mingongge.com redirect;
}
location /images {
rewrite /images/(.*) /pics/$1;
}
location /pics {
rewrite /pics/(.*) /photos/$1;
}
location /photos {
}
}</code></pre><h6>流量拷贝</h6><p><strong>需求</strong>:将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如:</p><ul><li>可以验证功能是否正常,以及服务的性能;</li><li>用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问;</li><li>这跟灰度发布还不太一样,镜像流量不会影响真实流量;</li><li>可以用来排查线上问题;</li><li>重构,假如服务做了重构,这也是一种测试方式;</li></ul><p>为了实现流量拷贝,Nginx提供了ngx_http_mirror_module模块,这就是 <a href="https://link.segmentfault.com/?enc=OJ6NYFV4niWPiurVgSkF%2FQ%3D%3D.m9Rzg3wGEINNCH7Hbi5HKTQkpM4Db6ruscT3orw%2Fx85jtSYc8LEgX7PDbQl9yzhfD4IUJaJYDxXyyJRdbUkcEiru7HOLx81mXsGUT%2BZSHtS73HqSgocd6g%2FIN9cUewqsIt2hCDUGkplzgL9LEujsr6ZQSMExzzchHmdYffnO1%2BDKD7TeugquHYqCHFsbDn7UeyOVIaSsyqx%2FBZODS%2FlxjyynCfO2VWMDB9P%2B9KYSL3KxzRYEOuWOqGydVvcYevGFmGRpT3oMQuWhKZtyRMh2X6cDrXT%2FdDCBNqZjK51bszdsx6cNJI7RsaqZNtkzSW2GWm%2FfWNmCWQCklfhczItDFg%3D%3D" rel="nofollow">Nginx 又一牛X的功能!流量拷贝</a></p><h6>限流</h6><p>Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。</p><p>Nginx官方版本限制IP的连接和并发分别有两个模块:</p><ul><li>limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"。</li><li>limit_req_conn 用来限制同一时间连接数,即并发限制。</li></ul><p>葵花宝典!<a href="https://link.segmentfault.com/?enc=k6Yfpnqk4fZ%2FYMb37RibmQ%3D%3D.9OCml%2BTK7mATPNXqES%2BL85mgm63Ucv41eq3r04IsTJfl4e5eU3iZP%2Fv%2F3WNWAbUx1Ho5WrTevmqC8YJzWe71LKI85RUEbfNEuddgF05QFPndwnS4yCPr%2F85pB0RM5h0D%2FOiSdg97ZIGE64bWMmhX3kG0WFww%2BGdEHIil1rK8gz5GOwM4gWKZJuoWIy%2FExhc5AWyqTgdPN0qZw4G7O1Jj1EwlLsKPJ3%2BM3Cow%2B1gCKY6BO8q27J%2FwR%2B0tsMaV5pP4Ct0sCSSEfOQRH5vhBFjGVwlieGIXZji2z92ZHuzRecbx%2FgTNl0RkisM1tfB98Zpwmak2mypM7w8L8HUKqsaygA%3D%3D" rel="nofollow">一文搞定 Nginx 限流配置</a></p><h6>缓存</h6><p>Nginx 缓存作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。下面我们将介绍 Nginx 缓存配置的相关指令以及 http 缓存机制,以及 Nginx 缓存实践案例分析。</p><p><img src="/img/remote/1460000041298022" alt="" title=""></p><p>可参考:<a href="https://link.segmentfault.com/?enc=cp1nEjKu3l6agTtnxfukOQ%3D%3D.VIVtV25iSPpPPr8PDG46DZH%2B3AAXNXbGpr2kez9FOIhdX6%2FQAcjaIsoLJToaJo7jj7%2B8Ciy2q9ERjU57qTkA%2FPfR114ObrnfQIyQKzyPe5fwRCVn8f9IMRh5ibwRXVaI5ZXUDwqlLq58b%2B6Vbjabs2jY3lo4D0e2L0zls%2F0R4VLAJP44ChQRZcuMJUCOemhC7GPU4HBUCuINlabe3js18RzswEz5pW6lfjYCrmz3gi8%2Fib96Ob9JWGxoPp6gMOFlhxLvky%2FcHobYBkE5%2F0mfYqrmvvRXrudOQGQ1YhcPVUIE9f%2BFNeGL3vJLC5tjRDHW%2FBteuo62WUMN19TYVvBHLQ%3D%3D" rel="nofollow">Nginx 缓存机制详解!</a></p><h6>灰度发布</h6><p><img src="/img/remote/1460000041298023" alt="" title=""></p><p>执行过程:</p><ul><li>当用户请求到达前端代理服务Nginx,内嵌的lua模块解析Nginx配置文件中的lua脚本代码;</li><li>Lua变量获得客户端IP地址,去查询memcached缓存内是否有该键值,如果有返回值执行@client_test,否则执行@client。</li><li>Location @client_test把请求转发给部署了new版代码的服务器,location @client把请求转发给部署了normal版代码的服务器,服务器返回结果。整个过程完成。</li></ul><p>下面是安装配置过程详细过程:<a href="https://link.segmentfault.com/?enc=UQRUH%2BV3ObcgLgWUnQyIpQ%3D%3D.pgg5oi%2B7nhy6h9i21c2it7Bt2cyilyyfFN2PfsO3WYtaSxUKkwUXkICYjEikr2%2Bnj%2B%2BpHyQ7mPpg3AzKVZ0pulpKeUTKonj7VNJmO8CHehdn%2FFl%2B0SUq70q5EBVMTzf6B4W7zsYmoGG%2BpbD%2BM%2FVyIlAsm8lPUr0brR%2BLbePZsBjHA5XPGtf%2F8m6dlaH9%2FkJAUS5tAX6DNGIwhrYfIxN%2FSGG9tRFD%2FZLcQH3AYrUVwtzYwenXh%2FYKDdDFN1E4fZYGrJs2e5Hs%2FQVoSpDjNU1%2FlFbhk4lkjRQ458idn%2F0Pk%2B8JGvQWIYoWMSHomeIkDAdxtxr68nFlNp6YFRWF528ctw%3D%3D" rel="nofollow">基于 Nginx+lua+Memcache 实现灰度发布</a></p><p>这里还给大家推荐一篇文章:<a href="https://link.segmentfault.com/?enc=ybyA7sj6ZzVmp9XPyHL52Q%3D%3D.gBetSsc1YB2LoEqv%2Bt6JlL3T9psijyjW01y1wZ0f5AF9IwbLhh48oU2eWLizfkZ7dF%2BBb239DKvqwlB0hhG8Igkh%2F8xi9Ez4lU%2FgHa%2FpCZ31alSjwTPWM84WOc05OWptT1b7cQLM4Y%2By9nL7D4hXOPb91jc4BTRBQOmS1UOH4%2FBEYa8zIbYXuMgE7eI5YGh61%2ByMyVXmQz3pnYewgYr8ymSOr8Afsg3tGtaED6fFa3xTNLT1tzeqOjyXkwpXZ%2BIhvfhtsIm8ZLsckZGf8xzqmzm3FHhjOU%2BDyh08%2FhmwQXoZH1yO4bmJG5ystleT%2F2dAH93ITuLN69mnTLg7HVnqsQ%3D%3D" rel="nofollow">基于 Nginx 实现灰度发布与 AB 测试</a></p><h6>封杀恶意访问</h6><p>看了 nginx 的访问日志,发现每天有好多国外的 IP 地址来访问我的网站,并且访问的内容基本上都是恶意的。因此我决定禁止国外 IP 来访问我的网站</p><p>想要实现这个功能有很多方法,下面我就来介绍基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站。详细的解决方案配置如:<a href="https://link.segmentfault.com/?enc=PbkE0KesGez9%2F4FcXovdrQ%3D%3D.MB%2FNKUF6M7uRAHPDHFbPJ4%2Fcezbr%2FYyMnHYxwvHOoyFSZ2FQObm4EkujEcBfvhW9PaA2bUmBmOagvYwFObJEoP2JT%2FJ7HrkxLQC%2Fs%2FDvVgTI2lkQ4pD0JYXOXXdaVL0UbLgeWjEGFZf%2FzhNeKefhV9KljgxTFox4IumT3pCevFX4Yeio%2BRm078ikVXsxmfYOCeAb5NkBHQhNCgK3RTszdlqIX3ELBMtpw%2BPVmOLm1b7TBChhREiWsk0P1cuNh70FYbgDIX9RUjATKSvwdTX41l62rfuFBeNVpXMNdpF53BNX7iJhxrlirdvue98SbEFvk0vjK5YC84MbOufHSy0Slg%3D%3D" rel="nofollow">通过 Nginx 来实现封杀恶意访问</a></p><h6>Nginx+keepalived 实现高可用</h6><p>Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。keepalived高可用集群服务</p><p><img src="/img/remote/1460000041298024" alt="" title=""></p><p>安装及配置过程请参考:<a href="https://link.segmentfault.com/?enc=w4od4TYwixUL4%2BqEP8mAdQ%3D%3D.pJGBEF4elr9qOYq2y0TlbT%2B09C%2BPDyS1lcZZ6TZPW%2Fy3WxpbgKuApKbJ1rdYM9jN54OFVPFwiLtRGoSv1CF9aEGqu5IqOV8xZhaE8T5UGu67QEcEgUt3FyJo8DXPz8iV7uGU3AGeI8dhMPizWDOUjMmqTc3DdpyywBRrCTJDAKyxh0K3fFhuZvtP%2FjpxO8Q4vz6jpP5HFitTg6OBVhN8EorIVlDOspx%2FGfyKLsF9kMN5Otjyn7KinQe2o4v%2FmnkE0L5pu0%2Ff1qYuWwIBI%2BqwRsO%2Bp30Xd2ekJMdluiSKMn0DOwR1iQfHSOMgwYX10AUkq8J9WcXlIBJkKPw%2BNUyPEw%3D%3D" rel="nofollow">Nginx+keepalived 实现高可用,防盗链及动静分离</a>配置,写得太好了!</p><h2>Nginx 终极指南</h2><p>介绍用来提高Nginx服务器的安全性,稳定性和性能的12种操作。</p><ul><li>保持Nginx的及时升级</li><li>去掉不用的Nginx模块</li><li>禁用server_tokens项</li><li>禁止非法的HTTP User Agents</li><li>禁掉不需要的 HTTP 方法</li><li>设置缓冲区容量上限</li><li>限制最大连接数</li><li>设置日志监控</li><li>阻止图片外链</li><li>禁止 SSL 并且只打开 TLS</li><li>证书加密(HTTPS)</li><li>重定向HTTP请求到HTTPS</li></ul><p>以上12个具体的配置过程可参考:<a href="https://link.segmentfault.com/?enc=anpkfWJT%2Fkl098TyH7JbZg%3D%3D.YQfgm%2FnHpApV3%2ByVOKSXTD1rhhLKMfjj31ZumTQr%2BeYSjpywFTHzC8DmQzaMjZMho%2FnrA0tuPimTEMbzpn65ywrhv5dG2970KiArgckH5UFnIe%2FdEDIHVjKyJmgTQ7tHxnoCZUD1KJAfwZ6HIbSwWS01Gzj5oKvUPZW5CJgNiKJi8bPNH%2BonFzkPeU6Ex5FgnaAgg6Ee0vjl%2BMdeGyIy8oeCL95SSSMSgqsrF%2Bl5JovWgWNpnFUFY7A043vtx7hXdev%2Fqe2ozsxE7iXjras0hxCqm5S4kztcF3TizKVDKMyngJK%2FB1kNpd6Fpg5bFOvVESWQu2NYECM40torBGSLVQ%3D%3D" rel="nofollow">提高Nginx服务器硬度的12个技巧</a></p><h2>Nginx 监控</h2><p>监控Web服务器对于查看网站上发生的情况至关重要。关注最多的便是日志变动,查看实时日志文件变动大家第一反应应该是'tail -f /path/to/log'命令吧,但是如果每个网站的访问日志都是使用这种方式查看也是相当崩溃的,今天小编就跟大家分享一个强大的Nginx日志监控工具。</p><p>一个小工具帮你搞定<a href="https://link.segmentfault.com/?enc=cQ4xKPZcY7wSoN5GJZMieg%3D%3D.BejKGBlLJIVtOnNrtd1VsL%2BNPDxOHi%2FrGs0nzjocdXphFduQp3Wq74QvzMHT6s3RolQtxiTFCxUNdgvqflUqq51PeUlc1wPT5uCqcL6%2BuYYLEhd1TBdOtz%2FA7ERt6tmC0mV9ocfVPz5BS9QFY%2FMhOLOUvjP3RX27UFsUAb7tLC39OB9pyWQ4pR1y6z%2BRua2xSdUBnj4BzUnNvTBcnpnpQarKRK2NUNiqId%2BEkE9lWySLt8pZxrmYiOhclYiEATmsO76%2FauVW4OLHRvVMX%2FBqV0%2Fl46z7vyYbOl0TAjyCv4cMO%2BdATq2RFEZRpiQ1LD777anHFv%2FQdDggTz9rHNUepQ%3D%3D" rel="nofollow">实时监控Nginx服务器</a></p><p>日常生产环境搭建了Nginx集群后,就需要继续深入研究的就是日常Nginx监控。Nginx如何监控?相信百度就可以找到:nginx-status</p><p>通过Nginx-status,实时获取到Nginx监控数据后,如何和现有监控系统集成?一个很好的解决方案:<a href="https://link.segmentfault.com/?enc=6iZlucCTrBdK895HjRknAg%3D%3D.3r3V5A8RLFJA9rzf29XVmguDTAiVgmUESOw3bfvX%2FoTuEYnqSuMnhbyH3fL2MEdUaUcfhkrsbJtMsA3nToRW0gJ8AO%2FuDC9JvNwQh%2FJLKHhn5WPAPReByRtMiicjj%2FTkSGhL1dL2jALsddfa1RPZVWr%2BV%2F9VVzdTcbrrKsUQWL7Be7zGRIM5pAmbArG%2BFaLBZU6hyQIupnx8ivKqlGmQi2OdjUBKHGZxnm9vQSrsDHPCCV4RCdIoZQxuPvGPNq2%2Bsg7CNhlEsRIS7wpEWKtCliIh7VYAJnC%2Bv%2BJXX83tcCYpfsR4lUSs5H2fF40knsoyTfDT8L%2FkFWajtZZT473w7g%3D%3D" rel="nofollow">Nginx+Telegraf+Influxdb+Grafana</a></p><p>即通过Telegraf监控插件定时收集Nginx的监控状态,存储到时序数据库Influxdb中,然后通过Grafana展现即可。</p><p><img src="/img/remote/1460000041298025" alt="" title=""></p><p>这是我发现的又一款管理神器,可以实现配置管理,和性能监控。具体的安装与配置过程,在这篇文章:<a href="https://link.segmentfault.com/?enc=SrnwmLKLjd9o7xaf8ymUqg%3D%3D.w3jLGYwnpIgO9xNmyEseDdHKHUQ4u1teiBInHVP9Yqqf0Fe46ZwYMuDnBfFxA6%2BFF4BKwz%2B%2BjT29%2Fe%2Fd8zwh36r4009r5G%2F1LrNSIVwZk2W761LkAVnWGdpvKEzXq9PAgAeTD5iAerV60yIiEYq6Io0K3gdCwjjVkiXujpLFnGW9U0tjLhILGiB6QcZLMAX8OBJvOMpZfm5puUccStKrLZ%2FLArbELlpnzF0iOGUuDaIuvncAXu30XFSD4eBM3wE4CxckLfVdXV1rOn8yoUPcAnIrQMkgRjBFEngbfBusGJhgt19kBjcvbbhuOameNCZDGXn3o93aqo3foTLjJpOf1Q%3D%3D" rel="nofollow">又一款 Nginx 管理可视化神器!配置、监控一条龙</a> 中介绍过了。</p><h2>Nginx 知识体系动态更新地址</h2><p>关于Nginx 知识体系动态更新地址,大家可以持续关注民工哥技术之路公众号,然后查阅 Nginx 技术专栏 可以实时查看更新的文章,无论是学习、还是查漏补缺都是非常实用的技术手册。</p>
谁再说学不会 MySQL 数据库,就把这个给他扔过去!
https://segmentfault.com/a/1190000041267504
2022-01-11T23:52:20+08:00
2022-01-11T23:52:20+08:00
民工哥
https://segmentfault.com/u/jishuroad
8
<p>大家好,我是民工哥。</p><p>又是新的一年奋斗路的开启,相信有不少人农历新年之后,肯定会有所变动(跳槽加薪少不了)。所以,我把往期推送过的MySQL技术文章做了一个相关的整理,基础不好的可以从最基础的学习一遍,提高的也可以从中再提取深入一下。</p><p>码字不易,如有帮助,请随手<strong>点在看</strong>与<strong>转发朋友圈</strong>支持一下民工哥,关注我,一起学习更多的IT技术知识,共同进步。</p><h2>数据库是什么</h2><p><img src="/img/remote/1460000041267506" alt="" title=""><br>数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统。</p><h4>DBMS 的重要性</h4><ul><li>无法多人共享数据</li><li>无法提供操作大量数据所需的格式</li><li>实现读取自动化需要编程技术能力</li><li>无法应对突发事故</li></ul><h4>DBMS 的种类</h4><ul><li><p>层次性数据库</p><ul><li>最古老的数据库之一,因为突出的缺点,所以很少使用了</li></ul></li><li><p>关系型数据库</p><ul><li>采用行列二维表结构来管理数据库,类似Excel的结构,使用专用的SQL语言对数据进行控制。</li></ul></li><li><p>关系数据库管理系统的常见种类</p><ul><li>Oracle ==> 甲骨文</li><li>SQL Servce ==> 微软</li><li>DB2 ==> IBM</li><li>PostgreSQL ==> 开源</li><li>MySQL ==> 开源</li></ul></li><li><p>面向对象的数据库</p><ul><li>XML数据库</li><li>键值存储系统</li><li>DB2</li><li>Redis</li><li>MongoDB</li></ul></li></ul><h2>SQL 语句及其种类</h2><p><img src="/img/remote/1460000041267507" alt="" title=""></p><ul><li><p>DDL(数据定义语言)</p><ul><li>create ==> 创建数据库或者表等对象</li><li>drop ==> 删除数据库或者表等对象</li><li>alter ==> 修改数据库或者表等对象的结构</li></ul></li><li><p>DML(数据操作语言)</p><ul><li>select ==> 查询表中数据</li><li>insert ==> 向表中插入数据</li><li>update ==> 更新表中数据</li><li>delete ==> 删除表中数据</li></ul></li><li><p>DCL(数据控制语言)</p><ul><li>commit ==> 决定对数据库中的数据进行变更</li><li>rollback ==> 取消对数据库中的数据进行变更</li><li>grant ==> 赋予用户操作权限</li><li>revoke ==> 取消用户的操作权限</li></ul></li></ul><h2>SQL 的基本书写规则</h2><ul><li>SQL 语句要以;结尾</li><li>关键字不区分大小写,但是表中数据区分大小写</li><li>关键字大写</li><li>表名的首字母大写</li><li>列明等小写</li><li>常数的书写方式是固定的</li><li>遇到字符串、日期等类型需要用到''</li><li>单词间需要使用空格分割</li><li>命名规则</li><li>数据库和表的名称可以使用英文、数据以及下划线</li><li>名称必须以英文作为开头</li><li>名称不能重复</li><li><a href="https://link.segmentfault.com/?enc=%2B3UpIFcP1qUUIucO2CYtHg%3D%3D.myRoHNe9a%2FRZ3siRJabj6iFGOgxX3QQBgBfM2zmrnTvEefFO%2BAIYAJX6XnKaysdLqZ%2FDZ3qGgKl38Gk8ZWcqiLb5b0nJqpziNnr2oJ9yxxjWezkBRiq9gen5UAqKpVPqLqF6H8Nxtjj3vYiz%2B%2BCpAjfHrhQ0XzTGuyOIHFjT5jZj374FFoUKfigB7XyaaCuWHW8TgEyfRl%2FcbmpD2QZSYfaApyBbd5K9038k1pqUYT6ySId659%2BfCyOuUEiqWQZ3k7AMGuAKBmSsyeEKZTAX0RJQuzLmNgj8fn7vV1fZbt0LN4leaAznXdxYA0hgJDDAWZl7l7h71zQPfU%2BrFhDNbbH5MImzeQkdBxyqpBV9Lr0%3D" rel="nofollow">掌握 SQL 这些核心知识点,出去吹牛逼再也不担心了</a></li></ul><h2>数据类型</h2><ul><li><p>integer</p><ul><li>数字型,但是不能存放小数</li></ul></li><li><p>char</p><ul><li>定长字符串类型,指定最大长度,不足使用空格填充</li></ul></li><li><p>varchar</p><ul><li>可变长度字符串类型,指定最大长度,但是不足不填充</li></ul></li><li><p>data</p><ul><li>存储日期,年/月/日</li></ul></li></ul><p>以上内容是对通用数据库以及sql语句相关的知识点介绍,本文不做过多的赘述,本文主要针对关系型数据库:MySQL 来进行各方面的知识点总结。</p><h2>MySQL 数据库简介</h2><p>MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。</p><p>MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。</p><ul><li>MySQL 是开源的,目前隶属于 Oracle 旗下产品。</li><li>MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。</li><li>MySQL 使用标准的 SQL 数据语言形式。</li><li>MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。</li><li>MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。</li><li>MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。</li><li>MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。</li></ul><p>在日常工作与学习中,无论是开发、运维、还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一。在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的还是MySQL。</p><p>更多关于MySQL数据库的介绍,有兴趣的读者可以参考官方网站的文档和这篇文章:<a href="https://link.segmentfault.com/?enc=CV33lkuu8gK4bQ6p01JNaw%3D%3D.D7JgHVDN55c8iPyfU3H6h9KI9RKoXiWQ%2Fx38LirPWfEx2V3yErSZorBJymituQjWIjs%2FQtwiChn0Ih75QLzCZnylVhL6yA9Bnbr%2F733tfp6qWNX3Fze43t6gKV4j1i%2FELz74zB5LkiCL4mr68QZc%2BAN7yVWDro%2FVQeFISrFzOF7wBCLLnZta3Dj8e4rheA%2BsLcc9D8uaAlaODNMpZ78J3s9GriHQHkS4Jkva%2BDNUYly1stHPxYQI83uHVLcxbME45U8OApmMGQmr4CDkDY8EX2w%2FwjT6SF4yarO%2B5W4o4QMNoQBWARrD4chwUZdJFic%2BjfWKilhtMzXomXymV8%2BJuQ%3D%3D" rel="nofollow">可能是全网最好的MySQL重要知识点</a>,关于MySQL架构的介绍可以参考:<a href="https://link.segmentfault.com/?enc=lA%2BqiguF8Ffd2pXKRSxH%2BQ%3D%3D.s2L6beL2Hefb2FI%2BSIR8D4bantk7ntWoQyIp6NODvVUezINl2ykv9x5HAUPXIH12YulFBVmWk21YBTj%2BwGSyNXch9IBXJtuNLvxiAnXjkm3tzOPk9V0THXcFg1ycat3zEhteE%2BEaWKrjnhSn7cEhGCBLNOlKlNkN7lecVSIIfEmdNrA6tKYuBAdG6x%2B1pMnBwTJXB3FlU56cYWR9FwzPYigGJ6uQ1EwYKhA8F1tZHxIiSGhlTKwtu5k9T3ST1qkpSYprtS4cxUm1FPrCrqTwV2JAgW5MKDNo3WK%2F2ji%2BSQlG1ooy9AQaF1rStp0NyDYQeeXNTiVmSVzH6MH8hpy7sw%3D%3D" rel="nofollow">MySQL 架构总览->查询执行流程->SQL 解析顺序</a></p><h2>MySQL 安装</h2><p>MySQL 8正式版8.0.11已发布,官方表示MySQL8要比MySQL 5.7快2倍,还带来了大量的改进和更快的性能!到底谁最牛呢?请看:<a href="https://link.segmentfault.com/?enc=9IUNQ4%2BxdCcnGDpKzUeGYQ%3D%3D.9cBJr%2BQWeJkLTRWADoycEhpYPxp53XT%2FWRpcVxut%2Bkey%2B83sZjbKjHHiCEQrtpTzr%2Bm7Y%2BOIC1rpeVt7ZoZp%2F7vRyW%2FqMw3T3y6dZLWd2910neuKc7kzCnjBdsseT2e9%2B%2Bkm%2BgFCPCHQkyaTNF4hn%2F8F9DOFlZfJ%2Fs%2FBj9cQmPHGYCG2JHJczFnbaWZNiL6NXK%2Bd1XV52rg7YYLzCMiZDU7%2F0zI0UPFKilGZVVyr6aK0Ucu%2BUTbHq1tRvL6cJ4DJcPiI5UWCwJdVi3Q%2FQl6D6IlgKzutiVwWezX3fWy89NiIS%2B%2Fl3nE%2BakKFOSdRprKK" rel="nofollow">MySQL 5.7 vs 8.0,哪个性能更牛?</a></p><p>详细的安装步骤请参阅:<a href="https://link.segmentfault.com/?enc=K2y8fMP2kJJ44gXeIwAjsg%3D%3D.m9IiO94xD%2FqCDCgtRIZrFPaqkmRVm5CQqtJAXr%2BdskV0cKtnXaMId0cmlmbDS%2F4aNjoeXPXEoCRBiLiUww6SFOz1jlG2D3%2FyUP2q4%2B8OBRwEIUldSVOnuAcZpJjNupfYqPi3J5LOO77JIAVSvJQlF3qHYTjsvr8P77SvpRGF0y8scxy29pBSko4qOpI%2BK91h4N1i6T9GsL%2FTa52gVajUptaarfKMgBq7hmAe0I%2F9HIjHlP2MF%2B9GD2VbqGElWTVxui0H5Pqcx1wCPUBRBLvtxiNGUQhc2Ttw567EphBslnfJirQ05nTbEJH4mxg6vckOdTpm71MU7zObqmVAkTwg%2Fw%3D%3D" rel="nofollow">CentOS 下 MySQL 8.0 安装部署,超详细!</a>,介绍几个 8.0 在关系数据库方面的主要新特性:<a href="https://link.segmentfault.com/?enc=QPHRbfuU6uDppYxt54FpAw%3D%3D.y8YLN4lVtP4r%2BtBahbz9rsJnP3qw%2FR1SJxnjYkPmuc4McGpybAFfpTczIC7nG%2B6JnFHG%2ByNIC2nLT%2F%2Bz463wxwpIloAZUECAars6uKC5pDm2xxqECZQFSbEwub109%2F4mbDhBSfktYGoTmLvTExGG0OucUnpfMf7DknYGhrgf3h2JF1Iq77DrsuJiECYiNAIXUN8bdEDsR7LlBFbqoAdYDk%2BeK2Mr%2FrRFHyTxhC6ARMCtC%2Fjihwc2fQ%2B7%2BlzbubHAiEwKjG%2Blze1%2BiA4L0Mi0Xw8cet2Og1%2FXL2EUzwVfegspLgp9gvWUjfesDLFp06%2BtyJM%2BDSGu2aL9icl09UI1Ng%3D%3D" rel="nofollow">MySQL 8.0 的 5 个新特性,太实用了!</a></p><h2>MySQL基础入门操作</h2><h6>Windows服务</h6><pre><code class="sql">-- 启动MySQL
net start mysql
-- 创建Windows服务
sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格)</code></pre><h6>连接与断开服务器</h6><pre><code class="sql">mysql -h 地址 -P 端口 -u 用户名 -p 密码
SHOW PROCESSLIST -- 显示哪些线程正在运行
SHOW VARIABLES -- 显示系统变量信息</code></pre><h6>数据库操作</h6><pre><code class="sql">-- 查看当前数据库
SELECT DATABASE();
-- 显示当前时间、用户名、数据库版本
SELECT now(), user(), version();
-- 创建库
CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项
数据库选项:
CHARACTER SET charset_name
COLLATE collation_name
-- 查看已有库
SHOW DATABASES[ LIKE 'PATTERN']
-- 查看当前库信息
SHOW CREATE DATABASE 数据库名
-- 修改库的选项信息
ALTER DATABASE 库名 选项信息
-- 删除库
DROP DATABASE[ IF EXISTS] 数据库名
同时删除该数据库相关的目录及其目录内容</code></pre><h6>表的操作</h6><pre><code class="sql">-- 创建表
CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项]
每个字段必须有数据类型
最后一个字段后不能有逗号
TEMPORARY 临时表,会话结束时表自动消失
对于字段的定义:
字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']
-- 表选项
-- 字符集
CHARSET = charset_name
如果表没有设定,则使用数据库字符集
-- 存储引擎
ENGINE = engine_name
表在管理数据时采用的不同的数据结构,结构不同会导致处理方式、提供的特性操作等不同
常见的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive
不同的引擎在保存表的结构和数据时采用不同的方式
MyISAM表文件含义:.frm表定义,.MYD表数据,.MYI表索引
InnoDB表文件含义:.frm表定义,表空间数据和日志文件
SHOW ENGINES -- 显示存储引擎的状态信息
SHOW ENGINE 引擎名 {LOGS|STATUS} -- 显示存储引擎的日志或状态信息
-- 自增起始数
AUTO_INCREMENT = 行数
-- 数据文件目录
DATA DIRECTORY = '目录'
-- 索引文件目录
INDEX DIRECTORY = '目录'
-- 表注释
COMMENT = 'string'
-- 分区选项
PARTITION BY ... (详细见手册)
-- 查看所有表
SHOW TABLES[ LIKE 'pattern']
SHOW TABLES FROM 表名
-- 查看表机构
SHOW CREATE TABLE 表名 (信息更详细)
DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
-- 修改表
-- 修改表本身的选项
ALTER TABLE 表名 表的选项
eg: ALTER TABLE 表名 ENGINE=MYISAM;
-- 对表进行重命名
RENAME TABLE 原表名 TO 新表名
RENAME TABLE 原表名 TO 库名.表名 (可将表移动到另一个数据库)
-- RENAME可以交换两个表名
-- 修改表的字段机构(13.1.2. ALTER TABLE语法)
ALTER TABLE 表名 操作名
-- 操作名
ADD[ COLUMN] 字段定义 -- 增加字段
AFTER 字段名 -- 表示增加在该字段名后面
FIRST -- 表示增加在第一个
ADD PRIMARY KEY(字段名) -- 创建主键
ADD UNIQUE [索引名] (字段名)-- 创建唯一索引
ADD INDEX [索引名] (字段名) -- 创建普通索引
DROP[ COLUMN] 字段名 -- 删除字段
MODIFY[ COLUMN] 字段名 字段属性 -- 支持对字段属性进行修改,不能修改字段名(所有原有属性也需写上)
CHANGE[ COLUMN] 原字段名 新字段名 字段属性 -- 支持对字段名修改
DROP PRIMARY KEY -- 删除主键(删除主键前需删除其AUTO_INCREMENT属性)
DROP INDEX 索引名 -- 删除索引
DROP FOREIGN KEY 外键 -- 删除外键
-- 删除表
DROP TABLE[ IF EXISTS] 表名 ...
-- 清空表数据
TRUNCATE [TABLE] 表名
-- 复制表结构
CREATE TABLE 表名 LIKE 要复制的表名
-- 复制表结构和数据
CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名
-- 检查表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
-- 优化表
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
-- 修复表
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
-- 分析表
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...</code></pre><p>更多相关的操作基础知识点请参阅以下文章:</p><ul><li><a href="https://link.segmentfault.com/?enc=egS8QMXicgcVfVNldptrqg%3D%3D.sK0M4fT%2B9HYE3iFzUmOTjDSO2tyQDsVV%2B9V1Azn6W0VAYRimjkL88QuXUAuD0LF7PkhDxsMHPTWlJRJOq0GWWV8ifMBkQcFpxi5bJc6pehgeVN1VWQacKUQ9lTeAa8qhS0e7aEkNfxz9uXvOyw%2BWZha8906b9OCwy6iiUoTDapr1oFdnG8NrDyx8KHXsbjUv1mstsTpbc1Vm%2FzAfBRUJWprYGu5kMXapZ7wpeiziQAh7pAsI6NqQ5nj%2BSjxaCqcssrObnrjXJBUM5lkGvWAB18Uys1KhwCv2vKuP3Bc9gA29mMBpCpdYXwukAFfiGqYLbgp2MmkKKbBay3r3mP0CKg%3D%3D" rel="nofollow">MySQL数据库入门———常用基础命令</a></li><li><a href="https://link.segmentfault.com/?enc=HsU8UhcI0CQ54EvZEVWrXw%3D%3D.4BbO8V5By80zVStRxyLISm5WUyuOM%2BJ%2FPyewW7RkNQAGm9LtNS3%2FulKdOI%2FiEeXZ2CvlDFOScJRk30Y3fhNZk82P0US9scaKUR2WRn24VULqs3UzQI%2F01%2Fl8YCpHRAan1ZVNslUwNvOxo83poUAHL%2BtETnbwH%2F9Y%2F1kPcspCjLCkwLTPbgug%2FBQDO1DIcOkmNl17GTbIiOh%2BvKxTToJ9f6cM3tYwa69Z3y09XJJsN1VZuh4XKWSSOtgiRN0p72pAm0OYpyoewH8z6zHfQh9jgCW6fPzsiuM2RSLGnQKoHrvQ8%2BIfrb4HyZnP95ZqEVCZqWR%2FV3ZEBbf8dCkzBW%2BUHg%3D%3D" rel="nofollow">1047 行 MySQL 详细学习笔记(值得学习与收藏)</a></li><li><a href="https://link.segmentfault.com/?enc=KOmAacIHnCeVMQSbBS7cTg%3D%3D.VRwg%2F4z8G6GWc0ybWRp2og6LF12loF2rGujbjNnn1p0oMRrdr30ma5svL5i2f8%2Bl9tRcSTG%2Flrcw33KbXkP%2BFGagliRGFpXaqv8ZotPXe4H%2F5Q9hY%2FEIjdLCcf6drmBSdCPGWPJ%2BZg1I3%2FoQictEONEgyDOYM0g0MpTNs34kIItL3lntjg2xDRCnH1lL0sYt7XAvkRHmw%2BFigYSEtq0m%2B%2Fo6rAyHuWONGi%2FU5boXFo1VT80tZ%2B6LuRAszY2x%2BvWGLhJsclxfOWYW%2ByDGiGVVZyZPq17dRs5ecwnbdwuDZ8gI8Gx3y1okI8FLjU14iBRha0CT9afvW4gF3IvnoB8usQ%3D%3D" rel="nofollow">MySQL基础入门之常用命令介绍</a></li></ul><h2>MySQL 多实例配置</h2><p><a href="https://link.segmentfault.com/?enc=OmXiJVIMn7Lxjnp87YWckw%3D%3D.o%2BjV6Y80a9NwKqE6hWAbyAGgYs82PHWJ5egqxffsxc3GBtLlJ%2FCZIXErR3e0mRhWkfmHmTw%2Fn7zikNQPkWeMW0SaSrMWUFgiw4vwlzhfBdtyY3yi60kFanQa28%2BMD0h1KXNbHlqx2r7u38%2FtEIhCRmAM19eojtVz%2BYy4XEuq%2B9v29Mv5BPOnAuFhsRof7HswoI2Kw2fUij2AshV0zA2ppE5gWQC9sq%2BoVPt4SltpixIY%2FMlos7%2Bu0O9kaq6Z0687aD9AUvU7f7nRAitcnVDGUsQDfoq9pUPPf%2BAejMlfRxbZ%2F4hSkblNWIOu0hZS5ewhZilEWa0mrhTOjn2NX75auQ%3D%3D" rel="nofollow">MySQL数据库入门——多实例配置</a></p><p><img src="/img/remote/1460000041267508" alt="" title=""></p><h2>MySQL 主从同步复制</h2><h6>复制概述</h6><p>Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。</p><p>请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。<br>mysql支持的复制类型:</p><ul><li>L默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时, 会自动选着基于行的复制。</li><li>l5.0开始支持</li><li>采用基于行的复制。</li></ul><h6>复制解决的问题</h6><p>MySQL复制技术有以下一些特点:</p><ul><li>数据分布 (Data distribution )</li><li>负载平衡(load balancing)</li><li>备份(Backups)</li><li>高可用性和容错行 High availability and failover</li></ul><h6>复制如何工作</h6><p>整体上来说,复制有3个步骤:</p><p><img src="/img/remote/1460000041267509" alt="" title=""></p><ul><li>master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);</li><li>slave将master的binary log events拷贝到它的中继日志(relay log);</li><li>slave重做中继日志中的事件,将改变反映它自己的数据。</li></ul><p>更多相关的更深入的介绍参考:<a href="https://link.segmentfault.com/?enc=fX%2BT3PXblXHyzECvmDCBkA%3D%3D.4CQe63%2BkOtMKQ0z9lxNZZxNH2UF9nwAPwPJZ8gtZX01n%2FT3CbC4XR85TxP795cbigsbal4gK4D8ZlwnooqJp1eAhOkUCn0DF6CAUSCaR3xhDyQSxsPhss%2BIR0SxEt%2BUXS3X%2Fp9nZDMEbvPpbpkJE6c9cxT5qYE2MCst8uY%2Fk94pFFsa0nIXTuqAIj%2F1e1A2oPxy79E5arE0TfrZNZAfWxCikgejmjH6gxgnETOyfL7P8MLoitYk6cZqvSUtMKzCcG8RoFMoWzI%2BTERTzpHxTq%2BQNvPtihPnDO8sWdgYm1FbD0HvanOqXMkJDoeTr2Bn00p5kMP6yFah%2BOA4c%2BoOVXg%3D%3D" rel="nofollow">Mysql主从架构的复制原理及配置详解</a></p><h5>MySQL 复制有两种方法:</h5><ul><li>传统方式:基于主库的bin-log将日志事件和事件位置复制到从库,从库再加以 应用来达到主从同步的目的。</li><li>Gtid方式:global transaction identifiers是基于事务来复制数据,因此也就不 依赖日志文件位置,同时又能更好的保证主从库数据一致性。</li><li><a href="https://link.segmentfault.com/?enc=pCvZnxFRiXwJ0av3QeapRg%3D%3D.N9RfNcdjXGVY2MBv1N32PAei8KBDRu91TzZn%2FIxVot87ZARWI7O6WRHEtD%2FadC%2FXk8X5eqaAgJDrV0EBbh5b%2FHkMA%2B32xSJ%2B9QzX60%2F0J89kRJ2%2BUcu5x6HAKZOYUM5pGKzJS0pWu6vsqIjmLsxFMFrGlLHNX8X06sn%2FeqUN9yw3plLgi%2BQixjZaJNdD8Yg%2BUhmJVqOmPBeHN7Pmch%2FEVN9%2B%2BLCSuEtGR0WWKiAEa4iciFAuue4m1KuU5NUo17Vjf3LP3uuKXzj6YwFqU7A0mmd1k9%2FcntuwkZoRgmS%2BRGu4cPuJRd%2B9Tk2Nnp1c%2Bveo" rel="nofollow">MySQL数据库主从同步实战过程</a></li><li><a href="https://link.segmentfault.com/?enc=mf0v3Kac34%2BtAu8aHlOcbw%3D%3D.JttpHFWJF0sxg9FcwxZISQxCAzNznczZowRTYVdfMbznvfaWRivt9GiZIU%2BwpxdZLHzXCpRM4zVmIL%2BIS1iglgN1EqRKFyhTAX%2FF8tqqtZr4gGMr0F%2BTpTUNnzaoDyP%2FLfQgsK2NpcrX7yvUZnAEi5sLqubn9Gvm8uKtk9mWZTNsWypP%2FTWNWMvEA%2FBHoorNxIGpw%2BWCjyMXrIYR2IOgbvZHsxvC37B%2FaLncMQz56IB3C7qY4l%2FwAJp5lTRv%2Bc%2FwXBjspaubPYemw3S0d5dRDxZL%2B1vL9G0ispsXhr1T30Nxk%2FE2%2BwcQDlvfuc7UXfDp8HGwV0Ymw6vI7RjIgQwthA%3D%3D" rel="nofollow">基于 Gtid 的 MySQL 主从同步实践</a></li><li><a href="https://link.segmentfault.com/?enc=x5NQOn%2F3xSqHeY2BucF0SA%3D%3D.rQIuzfkmcm4oQPUJ2FItTBL9jNjKz1dYW46Xiv8zC2ldUhbKErMNLB7J4%2BcXzmamwirRrhUc0AKIJvkZboE6Go%2BNrhoa0b48hM7DYJZIiBvmX2ArMFnnj2JaBTAuG7o7W9NxfuffsfdQA1%2Fo4F6oMmRplB5grEz0ZERSLCis%2F4hyCnkSlS9tTwDHUM08NTUzjC3x8RpxqY0kzaH7putv%2BDk9NpHppEk0X5RqZ9PWile9srr2ghjPSXCCFFauqPHTfzNkgVzruSIXl7i8AosCziylurqm%2BhIM4GGJlyR5sY1GLkQOKiuD5JyLSZBg3xc4" rel="nofollow">MySQL 主从同步架构中你不知道的“坑”</a><a href="https://link.segmentfault.com/?enc=hUAWjc1DTuS7vDTM9yfvsA%3D%3D.4PVr%2Bx0Z1%2FulmrAjuwxMC0Yri%2FfHYyRKmI8GMJj%2BZ6dNDfcvwCUy6rBNG7UhWYT0zPIfy3hA4Kt1c6lEy4AdV6IH8vlah2YA952qR41%2BLkyGE3GO4ImAAmm7iVPYwoufsdacx1PpI%2BGeQXNrF2PIEka1K9Ku0wOEaHDdD5pfTkDkw9l98CjPrYZ2T5sGaoyoc6u3GoCUS197Z9R7oKWp1I9ZLsBnA47pulKMBt2lNLTYExrhpEI4MEi8D8N3OfepRoV%2BBCfNMHdQX2lyYYn5gU%2FK8uh%2BfUOwzedYym9GSDKv7lsi5iW3h9SP9PSiW6uY" rel="nofollow">(上)</a></li><li><a href="https://link.segmentfault.com/?enc=LN6jd8x70rSrs6%2F61gh6gw%3D%3D.oC2n8WWrDlTdNOXKQ%2BhL3%2FErBYtfQyb9lp2O39YNZo0R2Oiq1Yu0pEbrudjyJ8axQS%2FvPDnVoM0YtBN0EE9of4ibFqjVPREjAg%2FaTRNBPFmlxNp0fHj0RloG5SUEswdE6hkFKQTMxnCzbNZI1xmuhemMpc7roCTQm2QiDqGxmiJTVKKmG5xpirD7DtE3Fw7X4X2PeLJk94%2FhOoUWLeXlrgyvo%2BX%2FHzQUZUGWwGWGs3Zue6sLuA3jRgZWP0HIjGosWSodsw%2BStci%2FOM%2BY7%2BQdnhwQ%2BRj8zXhpIpKaYHsGF0AB1jggLImcMQo7ieDnDt6z" rel="nofollow">MySQL 主从同步架构中你不知道的“坑”(下)</a></li></ul><h5>MySQL复制有多种类型:</h5><ul><li>异步复制:一个主库,一个或多个从库,数据异步同步到从库。</li><li>同步复制:在MySQL Cluster中特有的复制方式。</li><li>半同步复制:在异步复制的基础上,确保任何一个主库上的事务在提交之前至 少有一个从库已经收到该事务并日志记录下来。</li><li>延迟复制:在异步复制的基础上,人为设定主库和从库的数据同步延迟时间, 即保证数据延迟至少是这个参数。</li></ul><p>MySQL主从复制延迟解决方案:<a href="https://link.segmentfault.com/?enc=m4F6FwLI0yGc0%2BE82vdxQg%3D%3D.xN4N6zOp8LCBsSsKUN9Y2GpwBFTqTEra%2BYbwCa1mPl65w95OH%2B4h5e8igptnpkGAev04sFbWHR3aK3rdABRUBlUK7AtXJXabxiFQqn0KYFq7iI4uk5fsvMG8aZBsrumip0gHYUcn9%2FBr5zOKCMD0gPWyiRS10wix%2Ffq9ne92Xx%2BD7bdUykxCc7pOuzZjLXX4lBTZvojIPVh6CE3%2Fh7aol7JgsLqnnOno7yXWR4lkyd68GH750O3gSf4k5TKDeHtSzV%2F%2F6O%2BrHsKrx2w8XFFFsudbSdYw0pBd%2FfwDRBDwRmSQBWN3nswxPmhEwyoWcbzC" rel="nofollow">高可用数据库主从复制延时的解决方案</a></p><h2>MySQL 数据备份与恢复</h2><h5>数据备份多种方式:</h5><ul><li>物理备份是指通过拷贝数据库文件的方式完成备份,这种备份方式适用于数据库很大,数据重要且需要快速恢复的数据库</li><li>逻辑备份是指通过备份数据库的逻辑结构(create database/table语句)和数据内容(insert语句或者文本文件)的方式完成备份。这种备份方式适用于数据库不是很大,或者你需要对导出的文件做一定的修改,又或者是希望在另外的不同类型服务器上重新建立此数据库的情况</li><li>通常情况下物理备份的速度要快于逻辑备份,另外物理备份的备份和恢复粒度范围为整个数据库或者是单个文件。对单表是否有恢复能力取决于存储引擎,比如在MyISAM存储引擎下每个表对应了独立的文件,可以单独恢复;但对于InnoDB存储引擎表来说,可能每个表示对应了独立的文件,也可能表使用了共享数据文件</li><li>物理备份通常要求在数据库关闭的情况下执行,但如果是在数据库运行情况下执行,则要求备份期间数据库不能修改</li><li>逻辑备份的速度要慢于物理备份,是因为逻辑备份需要访问数据库并将内容转化成逻辑备份需要的格式;通常输出的备份文件大小也要比物理备份大;另外逻辑备份也不包含数据库的配置文件和日志文件内容;备份和恢复的粒度可以是所有数据库,也可以是单个数据库,也可以是单个表;逻辑备份需要再数据库运行的状态下执行;它的执行工具可以是mysqldump或者是select … into outfile两种方式</li><li>生产数据库备份方案:<a href="https://link.segmentfault.com/?enc=L8yAQEVbvuFfl%2BitNqkxWQ%3D%3D.OPSL2%2FFyqYVtTE9ftjOC9wyYNTZN1UoBzXkl63C1a7MNvVNdQvDEgnHtBDxJtAVNPgYKA8XpJa7eOviZCMRjLKeMAO0BbmEoToo%2FJ7StrRq3QYWrXYfHYS%2B61huxL4ypgxzoNCFGihgRz6nPtBXIKQLCIkKkvdXstDPMs%2BjLXhgUe2x2DUSP5bQbY%2BWmj8%2BgI%2Fwg7rtVeuTqWiksrg9ZxhjqDLZyYbkElMD0sObzT7oFLmZelyEddVaSgxp0iE49CldRyLDWuzJ9w4ps%2Bwkm2rrJlzhtLPiFDL%2B68iU1tYCdSCxJMdTMH5NDHvYYfsDz" rel="nofollow">高逼格企业级MySQL数据库备份方案</a></li><li>MySQL数据库物理备份方式:<a href="https://link.segmentfault.com/?enc=m8XM%2FWxK4UD9%2BqYCZEdynw%3D%3D.40KwfmVLPzAHefBIawvPhnuQS3QhCptEtKgh2FZpLkC9rO5%2BAOLMHgcmq8gAohFkv6MHiZtfRFop1QgevJIBG7wPoC95ElbfXDmseAx9tiVG6A1U7TKWd0YcmfoaQbwE0ppGyROaKP%2BOlSfF0ud2Mip68edh57elIqo4yokiShPSQq6dNpm9gIX283SCjDkG44uCp4i6lYuMfdQuwJrwd714wxnCDdEVGNFMxZ4SOTVt%2FWvyg6MsZWloV%2Fi0OzqvvzztYsSkKEEiwiIB%2F6bI56n1EBY6iWaVVcZxT2amMiVgCpIfuo96GHdhetbb4Wjc" rel="nofollow">Xtrabackup实现数据的备份与恢复</a></li><li>MySQL 定时备份:<a href="https://link.segmentfault.com/?enc=kl7NxLDc420V9EJmf%2BWapQ%3D%3D.wp%2FenmHFnzVrKEKnfpRZXxhwO3pndMWoDKUIEW%2FTTTiro5Z7kvQRMlrGSgVbHjdM%2BObjLHkM12NhaIivClg%2BN9OcLd9y8UfDm0hEWzCSker2hArL%2BEaf6fWu6LMC16KiD1qilizxUdsIi%2BjlR%2Fi5cqrR3KgHVr2qTaKj4aRa3X88hYyTrY5XMriJ1pyA9U40igFwsjE%2Ffez53YdPz1iSxz0I%2BlPHQ2HU61k%2FUZwZXz4vu%2FJTBPfeSDlrDU4vQA%2FW8zQdcL05e9g%2FBT%2F7XSN9XM6pCBGDkHJ%2FccZ9Hf%2Bt5J7cIiGZMYgAX0c7JkYFSIUu2QwQlIRjRty4Wego5Rqd9OrFvsBZDy4ALx9xDnMwNr8%3D" rel="nofollow">MySQL 数据库定时备份的几种方式(非常全面)</a></li></ul><h2>MySQL 高可用架构设计与实战</h2><h5>先来了解一下MySQL高可用架构简介:<a href="https://link.segmentfault.com/?enc=NbmfXoE78hr0uIrjOXkqFg%3D%3D.IjG2WjGnXxz8SjxwotmEtjyp1ZGTeoxJ0UBc9D7w0dtCeQaGO%2FzPa%2BTzuKKGvn2%2BYvKPCnVB%2B%2BzAZ1cN7q83gLEkfOZZvGn%2FgypQKm07ce%2BYIoCpoT%2BSuKVo%2BuOezA8wBrxhVBzqgWE006PbLxv5RUQcYSR2S407qDh%2Fgonthj2aavyAUqIw%2BSojBfSclE0t30FNBib1hVMrcYXlMu1%2FsUhkYMgQjH81XKZRIUjoQQFYhZfPCYSrFwlafCTuzVMpVDXJy4PfmqHWbl7GbTwHW8TELHCyAUjCOT5SOwN7P0wMHfONztf27GP6BWpzcixQ" rel="nofollow">浅谈MySQL集群高可用架构</a></h5><h5>MySQL高可用方案:<a href="https://link.segmentfault.com/?enc=fPHjZm7MzRrBghx%2Bs%2BEmiA%3D%3D.hpKAIaEj0bH%2Btmcuc2vFnN0j5VaipwKPb2Xo2Ry0MviTE1T8S0DtPNjY1EGlmOsa6N%2FZazaV65GSUEkRjPZqjq8DtI9mZfPndTMRudFj0YmdRF6974cfu3EldQ6z3Ajf2GnAttXYS0xuP1ROlRe32xgIjBVViWnswne2J8ktsAF2ggmrU0O28NdxnxK3372%2Bj%2F3%2FIQCZeQYVmVzHDHXl1tKoC3OvETFoQQQoK%2F8BnPglsONFt9%2BE5M5d7zWof53BoKljd5a5t1M2dQQqt5M%2BhOnj2Pt81EOLZZVQdGvQaUDnjg8ikfGoypdPHY95Jaae" rel="nofollow">MySQL 同步复制及高可用方案总结</a></h5><h5><strong>官方也提供一种高可用方案:</strong><a href="https://link.segmentfault.com/?enc=o6Rzb0ImVMa7e3Rka8FIWw%3D%3D.6E5K%2BuSOu6Q3tKEqa8z4%2FT%2BISUvDjvsgQk0GK2rbf3NHf1GhaQC8VKcs%2FTzg1tMEy%2FakpcB8p%2Fx5MN7llHAYuKyUD8%2B36pGEW3nVA1i5kx5lCkMOuINaqLRZPby3NArws2z6RkIuaayefCuLHgOv7H2qp2Q%2BUIv01kcYXY%2BuUAA%2BNhMs81dl329JxA1yn%2BRoKOawfWBZYNZQG91hu12sDfdEsSTE0Dxh3A75oXqSWsr2yAyng8zyUuLr2q%2FhDrmdrXIOalmEBGs008wA29cwgHtOY4QlNqv2WZg3FQBAKU6zJaLN4uB%2FLHeuSTzk8NUW" rel="nofollow">官方工具|MySQL Router 高可用原理与实战</a></h5><h5>MHA</h5><ul><li>MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点。</li><li>MHA Manager: 可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。</li><li>MHA Node: 行在每台MySQL服务器上。</li><li>MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。</li></ul><p>MHA高可用方案实战:<a href="https://link.segmentfault.com/?enc=oCmFz%2B2hmsjbKaiQUXFDDA%3D%3D.t2NS%2Fy%2BSpxMEa5EZSlGhOiPluXNCNOISC9HvJlqzSVOYchIzryg%2FSqUceiY%2F%2FbQYzc8k9TqXkQpFv%2FTPSvmmOW208be8lSs6wt4zeKGFFe1Azx5q9JWU%2Bm7xXAAY3vVAK4d60hQkjGRgFPJhoIScpUZTD1FU12A7wQXT88Rh4ND7xq0zSuTraymDbDCQykgiD%2Bjoi%2F%2BdUokHJ9CBTGj3oDXckRMc84O3Nt%2FqJpkrj%2FWTBooGtgPHv%2Bz5THFx1UyLFyCePJWVO7hUhcV0iWdwNAYyGFwxd6%2FY8Hx9JqNQ9A2jN7a0y5ct226FAaLdXFE%2F" rel="nofollow">MySQL集群高可用架构之MHA</a></p><h5>MGR</h5><ul><li>Mysql Group Replication(MGR)是从5.7.17版本开始发布的一个全新的高可用和高扩张的MySQL集群服务。</li><li>高一致性,基于原生复制及paxos协议的组复制技术,以插件方式提供一致数据安全保证;</li><li>高容错性,大多数服务正常就可继续工作,自动不同节点检测资源征用冲突,按顺序优先处理,内置动防脑裂机制;</li><li>高扩展性,自动添加移除节点,并更新组信息;</li><li>高灵活性,单主模式和多主模式。单主模式自动选主,所有更新操作在主进行;多主模式,所有server同时更新。</li></ul><h2>MySQL 数据库读写分离高可用</h2><p>海量数据的存储和访问成为了系统设计的瓶颈问题,日益增长的业务数据,无疑对数据库造成了相当大的负载,同时对于系统的稳定性和扩展性提出很高的要求。随着时间和业务的发展,数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大;另外,无论怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、连接数)总是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。分表、分库和读写分离可以有效地减小单台数据库的压力。</p><p>MySQL读写分离高可用架构实战案例: </p><p><a href="https://link.segmentfault.com/?enc=ANbNXQ1ObhFy6h%2FbR0vmzg%3D%3D.nAXJDrWQIEiWJDfJ7z%2Ba4doVamDLSgNty75hedpKVLg7zY6W89DnAA3nWk3lmdrbFwEuLez9iF0l7iXbhfKlIXVDS7DU0i6%2B7m8t3TyCLC5hWXp85GV3rxhmshhoHk9tIjjU2MIcUMCnZ%2FTLQ0rWImJT98qpUr1bB77%2BTqFU6TKGm6C9gCPozK7U3zM2Zz1IemKdJ7iGT7CYh6%2Bun9fH6PsDBO4Lwjc9x7TbUSq5piPVnYy9IWTKsnJUHmjSJ%2BsGA38MwegR3u%2BkLUli8bhzhYpAx%2FjJEl%2BtUHamXQK2eiKn6vc9V0au2NskQld0mQe9" rel="nofollow">ProxySQL+Mysql实现数据库读写分离实战</a> </p><p><a href="https://link.segmentfault.com/?enc=DYfs6x3AsFyA%2F4UJ9x5VIA%3D%3D.dIgMSM6eZ4zZvN29zvpQkJBkFLXMkqinFqmfzycOGX6IKGeNSQylC9NMgThU9EdAdmP5iMQL7Gtl0DKzUnf8U%2F9h%2BP2KUx4pwg5aaGKGb1n2TwZDjlyhNYRt1rLJEXORaa%2FmHneH3jp2Hk00A0jkou1IlXOV8IY%2FcFCLGZAXe2aLVPWUwe%2FlnvnUKkL%2Bk%2BiPMhMM8MC3%2BflGzi1sB68aAk5g7tQMA7j8WlYJrLgQvXpi8iYjtqgu948X%2FTnVw8%2FbZGpYP7ab1HDmDHC1Er6N%2BsqlqrqyWjJtqu%2FYiG4iy7cgatPaxoREQWL3Hz29hxW9" rel="nofollow">Mysql+Mycat实现数据库主从同步与读写分离</a></p><h2>MySQL性能优化</h2><h5><a href="https://link.segmentfault.com/?enc=EkiFXNipRSae826H2yhMew%3D%3D.cJwuFVeWbsxPHtOhzDGU8SCnh3gxHC3ZInwOR8WOxjLKSx4yAgKqMFm%2FcN1lLxFNr3vHao14mWS%2FQx1D6faaoP4GF6iWkq3MePFztoZ%2BciEH1e%2FiNwFkawmgTQJ3UjgMmeOuExLpbZ99hBvJTI23b5Sy40LlB98dYD1bvwpPA0yguxa4yymXWPG4LGShJPIvrp3pxEIORnmdpCvLUb49EtoKYFBCD2koAaZk554vcU1psdFg1VAQh3DrSExdm%2BV%2FJ0%2BhvI9JX%2F8uvXRjZIt%2FD9rRIk2xz5Nu8uJVgkxa4nSsLTFp%2Fnn514IC0%2FpPef00" rel="nofollow">史上最全的MySQL高性能优化实战总结!</a></h5><h5><strong>MySQL索引原理:</strong><a href="https://link.segmentfault.com/?enc=PKur102HuDu9%2BFqnggsh4Q%3D%3D.FR1rtrVCwyyMIDZcNVfzIwDxvOMXJzGYDRl4kkl83h%2B3FGn6w4WX%2FMLHfAyzdRKWM5bSBnFI%2BGnJERpaViconizzVWaCt%2FKUe4taKPS6lQ2zS4N5YtxbQFM601EpWMV%2FsQoM7ARVxTSvWiyoSPH%2B5ft18Q9IbUIVwdEyRBj%2F90zLb5d%2BddLTGEZ4476Fij%2FPQDPK%2FGDF1kbmltvk2OnQP8A%2FQbXLxK9ZCAi2Ne9%2FCndYZDTC1yjHAC78ENPFQdklvqAP1%2B3Ihv7aMWBwBai997rvA6OT%2FA%2FzNDY60phXcYFp2HvUzP%2BS4pjC%2BlpY%2FesK" rel="nofollow">MySQL 的索引是什么?怎么优化?</a></h5><ul><li>顾名思义,B-tree索引使用B-tree的数据结构存储数据,不同的存储引擎以不同的方式使用B-Tree索引,比如MyISAM使用前缀压缩技术使得索引空间更小,而InnoDB则按照原数据格式存储,且MyISAM索引在索引中记录了对应数据的物理位置,而InnoDB则在索引中记录了对应的主键数值。B-Tree通常意味着所有的值都是按顺序存储,并且每个叶子页到根的距离相同。</li><li>B-Tree索引驱使存储引擎不再通过全表扫描获取数据,而是从索引的根节点开始查找,在根节点和中间节点都存放了指向下层节点的指针,通过比较节点页的值和要查找值可以找到合适的指针进入下层子节点,直到最下层的叶子节点,最终的结果就是要么找到对应的值,要么找不到对应的值。整个B-tree树的深度和表的大小直接相关。</li><li>全键值匹配:和索引中的所有列都进行匹配,比如查找姓名为zhang san,出生于1982-1-1的人</li><li>匹配最左前缀:和索引中的最左边的列进行匹配,比如查找所有姓为zhang的人</li><li>匹配列前缀:匹配索引最左边列的开头部分,比如查找所有以z开头的姓名的人</li><li>匹配范围值:匹配索引列的范围区域值,比如查找姓在li和wang之间的人</li><li>精确匹配左边列并范围匹配右边的列:比如查找所有姓为Zhang,且名字以K开头的人</li><li>只访问索引的查询:查询结果完全可以通过索引获得,也叫做覆盖索引,比如查找所有姓为zhang的人的姓名</li><li><a href="https://link.segmentfault.com/?enc=AFFIpYRy8OR5i1AmEXXH2A%3D%3D.AvD0H5rkGntqA%2FbTKvuJ%2B94oEmQRnrGeZR9A64PBsHqbSqNp56G%2BjmgSVp9sqLFChMpr1Lt6RZXRnI4cABh%2FktbW2QCn4QriDd19%2Bf2tjf0uFiWcJq4ZorQ0Q5A3rfyQQJeb7EmUcqq1xKVbMhfjzEb06YfY%2BkK4fj7RhK3zRB8vwEFGuvJb2kNNiBx2ZwDtpvCfB5FoelhmfOsuvc87Ywv5vuVbSp7yYNPOYFBjacR1Pt8V1BxQtR8j8KFs874QxM2ae59pIjYIb%2BwKH7SsfZG%2BmrLeLKflP46B%2FXTqHZGnm1M9Hg6jeSjWbLK%2BLHlpx5C9WAxvqvYCqQErjCRE4Q%3D%3D" rel="nofollow">MySQL 常用30种SQL查询语句优化方法</a>|</li><li><a href="https://link.segmentfault.com/?enc=vhhd2OUuvJCrjlAlJVnSXA%3D%3D.tc2ye2WoekRc0DQtUfovWcYlJgE7hJdFgni8DX0%2BV2Wc0Gs5jrcBvv0%2BPzkCJ02VV6MlmIse%2BEoJa6%2FoEFBEv3sBRjyu3ZXCJ5hJSJaTTqR2gp1CFcFhc3G5cjkBUQIzBCesp%2FQ3cjCUStUvuAMvRgOb34qm3TFAbnmo9VAYIAS1NQMm1rdc7PoFBXmPTeqS3ci7WkAxrpcxuyR4Xh2Hrs4jBGv2TSz%2FeStXvuGjhvPiHmQgJTAsShseFDeMlrYivlVDitonFhB%2BscDC%2FnpwkZxEQiHS%2FiTFPTVPfNpV%2FDBvMiul0tu2q6sI%2FS9JoqyhhVrxAG1TFfZHwHLtDYpZjQ%3D%3D" rel="nofollow">MySQL太慢?试试这些诊断思路和工具</a></li><li><a href="https://link.segmentfault.com/?enc=rK9JFgsYnAQzvDKWdO9bzg%3D%3D.Jon9zDyj1UH7sL7GKRz%2BfAywEmbuquO0yveyaT9GpicOtbuud7Wx5ggrbN5pUORp1mjJbJgcVm6UVmDkdRekUzuFbx5%2BsiXT9VnQnMWHJLq5S0z6PadvGCS2TLD7PQc1tAsgs1t6vcAy5KpFruKHLFvilR%2BlUcj2AoYmj9fxZArLw%2Fohu5c4T9tR39nLEryjKlSU5cOa2vwnmSsM4hqeLcjV0oNkqUK8N3wo0iyCii%2FmJ9GsWFIiwAMcVpuICSZmmTNK0vxk57K8khOCbuVg%2FTvNrs34UU73qbDvHdhcYhK%2FKhvj99ExRfcSHRmzck6igMVS%2Blp4N6VWIli5iOnWlsycg1mbgzn1BRp9m0FGw68%3D" rel="nofollow">MySQL 性能优化的 9 种姿势,面试再也不怕了!</a></li></ul><h5><strong>MySQL表分区介绍:</strong><a href="https://link.segmentfault.com/?enc=WG%2BhPvI5Oom%2FZKSUlD76kw%3D%3D.xS0Wcuj2LVNtAVlNop3PCbSL13Waba8oLWn2%2Ftjr2477T3WUjXA9lq0RnaCgUWg1g2X19mFE3zK2GGWUjnRz2pwUHB%2F8bRDwJFA%2Bu%2Brep46tYqCqNizIaBvoLyZFfN%2F89PRlfDFyYgx0xgkeSDVcSJvzvSdGIdL5YP9AbyLVcyG0Ok2Jl8Sf1WSOMZyYwHHAX51Po6Cx%2BV7Jm0g9VIyrXsVK%2FScIO29PE8hEcbl3Jc2T%2BpQnlt3CI%2FdrfD9oxK30hgHouiJ3%2BB5GORqrFaaw3e29sKFgGGscAYCSLJ6wg0XtG6T94O5bZV3W1mbmu%2BcD" rel="nofollow">一文彻底搞懂MySQL分区</a></h5><ul><li>可以允许在⼀个表⾥存储更多的数据,突破磁盘限制或者⽂件系统限制。</li><li>对于从表⾥将过期或历史的数据移除在表分区很容易实现,只要将对应的分区移除即可</li><li>对某些查询和修改语句来说,可以⾃动将数据范围缩⼩到⼀个或⼏个表分区上,优化语句执⾏效率。⽽且可以通过显示指定表分区来执⾏语句,⽐如 select * from temp partition(p1,p2) where store\_id < 5;</li><li>表分区是将⼀个表的数据按照⼀定的规则⽔平划分为不同的逻辑块,并分别进⾏物理存储,这个规则就叫做分区函数,可以有不同的分区规则。</li><li>MySQL5.7版本可以通过show plugins语句查看当前MySQL是否⽀持表分区功能。</li><li>MySQL8.0版本移除了show plugins⾥对partition的显示,但社区版本的表分区功能是默认开启的。</li><li>但当表中含有主键或唯⼀键时,则每个被⽤作分区函数的字段必须是表中唯⼀键和主键的全部或⼀部分,否则就⽆法创建分区表。</li></ul><h2>MySQL分库分表</h2><ul><li>能不分就不分,1000万以内的表,不建议分片,通过合适的索引,读写分离等方式,可以很好的解决性能问题。</li><li>分片数量尽量少,分片尽量均匀分布在多个DataHost上,因为一个查询SQL跨分片越多,则总体性能越差,虽然要好于所有数据在一个分片的结果,只在必要的时候进 行扩容,增加分片数量。</li><li>分片规则需要慎重选择,分片规则的选择,需要考虑数据的增长模式,数据的访 问模式,分片关联性问题,以及分片扩容问题,最近的分片策略为范围分片,枚举分片, 一致性Hash分片,这几种分片都有利于扩容。</li><li>尽量不要在一个事务中的SQL跨越多个分片,分布式事务一直是个不好处理的问题。</li><li>查询条件尽量优化,尽量避免Select * 的方式,大量数据结果集下,会消耗大量 带宽和CPU资源,查询尽量避免返回大量结果集,并且尽量为频繁使用的查询语句建立索引。</li></ul><p><strong>数据库分库分表概述:</strong><a href="https://link.segmentfault.com/?enc=zqJd5PQTIj5c%2BdwdpkC5hA%3D%3D.THqpHSHZwTtmNh52LA9vY55785iKI8r5D9Wy5f4yy%2ByHNRnYAgRUZTBn%2BYQ9ZnSI5SNIcOQI2dU133t4VFKD8Z%2FjEjZ5bRS7JzUIcDkw3rgmoIwn5VLxWmj%2FBix3cB8d4lmwMlwmTB%2FsLOMU%2BUvdkNtnaOYAH1cl7Sy3vay2g9oPD33BwatPzBA%2Fk5jW4EvWmVHGt%2FEVKMLKCds8g8P6DjQXMGn62WXHKlfnIFyL1bsiEWkvRnDwPGxjKt5bejCheCPkpaJcCgccuCt9WNi1KIkZ%2FZOQgyuaDO7R%2FVhrrbZ%2F94NVmuGLYvZvuM%2FGJKP4" rel="nofollow">数据库分库分表,何时分?怎样分?</a></p><p><strong>Mysql分库分表方案:</strong><a href="https://link.segmentfault.com/?enc=6bmLESHcsbp%2FcCHMGZyeYw%3D%3D.0dZYKBqrIqQrHbK59wovr8ncmn%2Fi8gEXoTlwL0TJJA2idHvoO07f1hKT%2F81cJzduoKf%2F0Wns47jZxqpVekKwllhr5FurElXSvVP%2FGIxY4Ak%2FmEmQ%2BobTaAlrXam3seZT3u8BzTiAaT9doo1o%2BI90Um4VtTA47a8UwIwD%2FaWmargNv85d9KzhVLiPZCWC0hHVdqrw40a5I55uQZ9Oq0KsqZLdzVrY6LC9z5YXq3u54MmGHdVu28SLYUEVSozkGRVysMCGgh%2B3%2FPOX2XB%2BBxwsb3UB0RB8Gv2ASX2LnbXTBoYyZVypfU49xMHdHrRuhH%2BI" rel="nofollow">MySQL 分库分表方案,总结的非常好!</a></p><p><strong>Mysql分库分表的思路:</strong><a href="https://link.segmentfault.com/?enc=x4yz%2Bxe371%2F4sSFMgdbcMg%3D%3D.DBGDYDUKv9EIKlZHWVsefHqGa4sgb5LjmfnPOvxZYUIbOvivY%2F%2Fi9LsVcZpf34yh2%2FA%2FLLGRj6py6uyqFCAGp3RQA7ez1SfJSyjwl0%2BqCqdMdLMwkZVVfFmgsiYGIo%2Fm3owVZAKvZyqCtYoQEyjGuyrasARloampnEPZ5XtX5oNFlICV%2Bmd4H9gAIzw4f4jSyzpoeVGMBufJX6McaZyACJ%2BCDnVsWkytny6m3dXH74Y%2BLCNMp5OCNpfZSuh72r20%2FKJ%2FIsZc%2BGIUEXrurXpCvRBu8igj3GRN%2Bb46pxk1Z8LXpxKrAq6BHg9WO%2FzNzozx" rel="nofollow">解救 DBA—数据库分库分表思路及案例分析</a></p><h2>MySQL性能监控</h2><p>MySQL性能监控的指标大体可以分为以下4大类:</p><ul><li>查询吞吐量</li><li>查询延迟与错误</li><li>客户端连接与错误</li><li>缓冲池利用率</li></ul><p>对于MySQL性能监控,官方也提供了相关的服务插件:MySQL-Percona,下面简单介绍一下插件的安装</p><pre><code>[root@db01 ~]# yum -y install php php-mysql
[root@db01 ~]# wget https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/redhat/7/x86_64/percona-zabbix-templates-1.1.8-1.noarch.rpm
[root@db01 ~]# rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm
warning: percona-zabbix-templates-1.1.8-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:percona-zabbix-templates-1.1.8-1 ################################# [100%]
Scripts are installed to /var/lib/zabbix/percona/scripts
Templates are installed to /var/lib/zabbix/percona/templates</code></pre><p>最后,可以配合其它监控工具来实现对MySQL的性能监控。</p><p>MySQL服务器配置插件:</p><ul><li>修改php脚本连接MySQL的monitor@localhost用户</li><li><p>修改MySQL的sock文件路径</p><pre><code>[root@db01 ~]# sed -i '30c $mysql_user = "monitor";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
[root@db01 ~]# sed -i '31c $mysql_pass = "123456";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
[root@db01 ~]# sed -i '33c $mysql_socket = "/tmp/mysql.sock";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php</code></pre><p>测试是否可用( 可以从MySQL中获取到监控值 )</p><pre><code>[root@db01 ~]# /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg
gg:12
# 确保当前文件的 属主 属组 是zabbix,否则zabbix监控取值错误。
[root@db01 ~]# ll -sh /tmp/localhost-mysql_cacti_stats.txt
4.0K -rw-rw-r-- 1 zabbix zabbix 1.3K Dec 5 17:34 /tmp/localhost-mysql_cacti_stats.txt</code></pre><p>移动zabbix-agent配置文件到 /etc/zabbix/zabbix_agentd.d/目录</p><pre><code>[root@db01 ~]# mv /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
[root@db01 ~]# systemctl restart zabbix-agent.service</code></pre><p>导入并配置Zabbix模板与主机:</p></li></ul><p>默认模板监控时间为 5分钟 ( 当前测试修改为 30s) 同时也要修改Zabbix模板时间</p><pre><code># 如果要修改监控获取值的时间不但要在zabbix面板修改取值时间,bash脚本也要修改。
[root@db01 scripts]# sed -n '/TIMEFLM/p' /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_cacti_stats.txt`
if [ `expr $TIMENOW - $TIMEFLM` -gt 300 ]; then
# 这个 300 代表 300s 同时也要修改。</code></pre><p>默认模板版本为2.0.9,无法在4.0版本使用,可以先从3.0版本导出,然后再导入4.0版本 。</p><p><a href="https://link.segmentfault.com/?enc=xN1YV6QXvz2Ua8c1hEHP9g%3D%3D.MKmszUEQ5LUJGiXjG7R3T367UM%2BSwPfJBDU%2F9mXEx%2F7qgelQEEcUBGOo9ITEL8W5RfLw0uEPgahOm0yc%2B8q4q1G2FzdP2FWPMseVPxTXaglxT2OcYmdepwfGZZnhkRFIawUPzTbl6eZUHTT0C7z%2BhCtmFFEhIjrWkALHXMf0%2BQaxm9W47%2BDvluUXA14TaT2GwAtLbAvr5WxiczYjtFGeKuEh3iYlrGBq4L06mAvejoZtMcIwSk3zfcH0gHfU3cFCy0nWNLhyWIbFOeT1JdboJYRCSXfGp9ujDf5YvmJWRTr6Rdr5MQyeSOD%2BvaJxQx8wvzeI3tWyTI0oNijtoduCpQ%3D%3D" rel="nofollow">Zabbix自带模板监控MySQL服务</a></p><p>其实,在实际生产过程中,还是有相关的专业监控数据库的第三方开源软件的,民工哥之前也写过相关的文章,今天发出来供大家参考:<a href="https://link.segmentfault.com/?enc=c05ud0NAGLGPfAzjOakYiw%3D%3D.BBK4MTCiIgJRAfYUqMb9LttxobJDCTIZOWe%2BkdUB7v7QX1Vqg7w1YlPUzXIXTgwf7U1ZB7F%2BbzQhP%2B79Qe%2B5DZ%2FkwVYVNKMCpM7Z5%2F0ebZOMUBvzcxovWQ6BByQi0q%2BSZC7cjmabeQ0QsB3Y1OBwaXC1TTkr4qy8fLa%2F5oiD%2FCGhJSSo9Xm6ZaTxg0%2BdDQp%2F%2BnZhSyIsFzzUiOki86spwpoWw3%2BbFAlQ8EMZfC9DcUlI5sKxOlLVe6envXc1pe2SOYbNMytu9bWNBfB73hSozaTYMD9DZbj8QawEtV8WgGBALv5wvK0CV%2FA0D227ZkXU" rel="nofollow">强大的开源企业级数据库监控利器Lepus</a></p><h2>MySQL 管理工具</h2><p>MySQL 是最广泛使用和流行的开源数据库之一,围绕它有许多工具,可以让设计,创建和管理数据库的过程变得更加容易和便捷。但是如何选择最适合自己需求的工具,并不容易。这里为大家推荐:<a href="https://link.segmentfault.com/?enc=S6zjKMBKqypo8qA%2Fke08Lg%3D%3D.dNQBGZ5XH1TfgCCuKGV%2BU6J4ysiw2FnVJTerBZZ7NDvIhiD1wW%2FAJvoM95AoHb3no6XKoaQxGjqwTLdM81g%2B5H4pkkxZprf3WziLqmkJIzdbEjF6l44%2BvWPQvbMTgrFF9%2FmLXJZvNsu1FFjjvB4ktSxZXcr0yk%2Fv2h03Y%2FEKlndZoYafLCqbUWL2Ein%2BS8x9UALAqkQ3HaZewzwb6nJZpxu1rKvMCn682GNMI80qx%2BZQz5%2FL5HIVJWI2DpxkKnNGXCDIcTxdXdNnT3KL7S1mVz2gqDxtmb9OmOtpS%2BRlU6Kd6FjuB5MmUs5T%2FKsxRqU0uh0AKii4Fg32vdZjIn7BtA%3D%3D" rel="nofollow">10款MySQL的GUI工具</a>,它们对开发人员和DBA来说都是不错的解决方案。</p><p>很早之前民工哥就给大家介绍过一款开源的SQL管理工具:<a href="https://link.segmentfault.com/?enc=BH74Vz4YgFa1FI7EpT3g7A%3D%3D.%2B4ddAKzhP7OW0RjsEpeBewC43FpZLTE2oG8VqS6hjdWP%2Bpjo1Bjuvh%2B%2BJEI04%2FvwHiBwTjvl3s4KZicA%2BSUzgBLpTn%2FJ5RI8vR4%2FcKp%2FOcmGGwNKLe%2FC16NET1cHJr6CxXn%2F8HdidMcyLIn3wBF1WfYNVh2TNGm4nDaTRTy7jrPwrADBtHVQ%2Bu7I5Z7UgS%2BHSNuW3dE%2FGOJYDinMIHTDQAz9nD92HNQZOLrWIBedCvIcqA%2BmDqxBvhGC8tGGxdmpkN4KUZVTqr%2BzW5DaIGp6FXH7dNmj6DuIPCMp8LbRpkc4LWicQ8QlFneA8KM8WDhU" rel="nofollow">自动补全、回滚!介绍一款可视化 sql 诊断利器</a>。</p><p>今天,民工哥再给大家推荐一款SQL审核利器:<a href="https://link.segmentfault.com/?enc=f7HDUCJAzS%2F%2BXhotDOsZJg%3D%3D.0kmqtm0O87MluQC333iMXJXa5EnTlR5JUlcR7slU9FeeRBvCETfWgoeFtchkmYFq4Q117yO4YwSYWL2zL0W1i%2FizC%2FnBiTxWjplLGAEOACL2qccwafeRd3nxGuF%2FQpYVqSMiBVxXD5eDE1VWe7ZtYlJdgbR7GFZR6XzJ21qIRVjx3gT4FWPpmLrdfHT2bzZ3XJNg0TbDmBwk3AA%2B2ndAczYRbZ9YZwuhumjuhcBuknTafcbBK28yym82JGrM98sdggwmzvLHRKuysuHama%2BeYoJlyZld%2B%2BEZ0s93hMmJYfJdPRGTAiZ1y9XMDOCqq6h71UMAuDqxPsoofYKL6YmOAQ%3D%3D" rel="nofollow"> MySQL 自动化运维工具 goinception</a>。</p><p>可视化管理工具,大家可以试试这个:<a href="https://link.segmentfault.com/?enc=YPNStw0%2Fi9Sbhp79%2BpHVEQ%3D%3D.O91H%2FTDuNkQvgOQYUXfmIO8PtnMnEPb46kJdgWbi%2F2h1QPoYYzyGWmuEbJOeE6DUTm%2BorUmrQC1uaDJvDnEdmGllZ9zILibeaT0PYZipKTh4PXVAo5QkHLDuyWcTNuXcJEHD2PsiQB2cTySBOsbPIwGCLtkZjpgfbo%2B6yU9f2JvsUpBtfPAnsXH3tTIXFf0paxRwcIHRSmVhulJ3oY%2FjhdFH65mNpaY3%2FtyBTH%2FdRnWXOqRmWEsq9jpYXdy8YP%2F3Kk0KTIxxM%2FaMp3AHPKDUKSFG9cj0UksB8sfMsqd30p%2B8hzULt0Hp%2Fq1QO%2BEc%2F%2F8BZ45LSGZ%2B89oNZt0H1n%2Bp8g%3D%3D" rel="nofollow">介绍一款免费好用的可视化数据库管理工具</a></p><p>俗话说工欲善其事,必先利其器,定期对你的MYSQL数据库进行一个体检,是保证数据库安全运行的重要手段,因为,好的工具是使你的工作效率倍增!</p><p>今天和大家分享几个mysql 优化的工具,你可以使用它们对你的mysql进行一个体检,生成awr报告,让你从整体上把握你的数据库的性能情况。</p><p>性能优化诊断工具:<a href="https://link.segmentfault.com/?enc=vzyZ86DICKFId0150UVtmw%3D%3D.xztVTjQDvCtXqmlh%2BNfEitEdz4mIvPR3L4Giz4J1LwcHNWPFl%2B0kyCQVbfKt%2B7sOKLE91wFdT0vqblU%2B9qhi3C6NDBzelDKCgx4dWeR3bdf3YQx964IrZR19WzgugYsHWeqtIgIsYJmG3V%2BtkGm5ZV00GkUwYFfqQUpXV2BUNjN%2FIK1ZjuibN8zTn7uwVYxaYRuxZc4D0lyb1ZqTnFPFYXHqS74MPqo%2FIgpcXIjkgusAGrROLbkgVsZfM1Cig8va3o9PnBMljcd9rhuXZMnGUY9w1NeDVzxjCNUyf3iLjJnm0Ce1bGyd0Jfc3aZjadP83Oqjo9T1Rw6%2FYpkbBhYBLw%3D%3D" rel="nofollow">别小看这几个工具!关键时能帮你快速解决数据库瓶颈</a></p><h2>MySQL 常见错误代码说明</h2><p>先给大家看几个实例的错误分析与解决方案。</p><ul><li>1.ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysql.sock'</li></ul><p>问题分析:可能是数据库没有启动或者是端口被防火墙禁止。</p><p>解决方法:启动数据库或者防火墙开放数据库监听端口。</p><ul><li>2.ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)</li></ul><p>问题分析:密码不正确或者没有权限访问。</p><p>解决方法:</p><p>1)修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables,重启数据库。最后修改密码命令如下:</p><pre><code>mysql> use mysql;
mysql> update user set password=password("123456") where user="root";</code></pre><p>再删除刚刚添加的 skip-grant-tables 参数,再重启数据库,使用新密码即可登录。</p><p>2)重新授权,命令如下:</p><pre><code>mysql> grant all on *.* to 'root'@'mysql-server' identified by '123456';</code></pre><ul><li>3.客户端报 Too many connections</li></ul><p>问题分析:连接数超出 Mysql 的最大连接限制。</p><p>解决方法:</p><ul><li>1、在 my.cnf 配置文件里面增加连接数,然后重启 MySQL 服务。max_connections = 10000</li><li><p>2、临时修改最大连接数,重启后不生效。需要在 my.cnf 里面修改配置文件,下次重启生效。</p><pre><code>set GLOBAL max_connections=10000;</code></pre></li><li>4.Warning: World-writable config file '/etc/my.cnf' is ignored ERROR! MySQL is running but PID file could not be found</li></ul><p>问题分析:MySQL 的配置文件/etc/my.cnf 权限不对。</p><p>解决方法:</p><pre><code>chmod 644 /et/my.cnf</code></pre><ul><li>5.InnoDB: Error: page 14178 log sequence number 29455369832 InnoDB: is in the future! Current system log sequence number 29455369832</li></ul><p>问题分析:innodb 数据文件损坏。</p><p>解决方法:修改 my.cnf 配置文件,在<code>[mysqld]</code>下添加 <code>innodb_force_recovery=4</code>, 启动数据库后备份数据文件,然后去掉该参数,利用备份文件恢复数据。</p><ul><li>6.从库的 Slave_IO_Running 为 NO</li></ul><p>问题分析:主库和从库的 server-id 值一样.</p><p>解决方法:修改从库的 server-id 的值,修改为和主库不一样,比主库低。修改完后重启,再同步即可!</p><ul><li>7.从库的 Slave_IO_Running 为 NO问题</li></ul><p>问题分析:造成从库线程为 NO 的原因会有很多,主要原因是主键冲突或者主库删除或更新数据, 从库找不到记录,数据被修改导致。通常状态码报错有 1007、1032、1062、1452 等。</p><p>解决方法一:</p><pre><code>mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;</code></pre><p>解决方法二:设置用户权限,设置从库只读权限</p><pre><code>set global read_only=true;
8.Error initializing relay log position: I/O error reading the header from the binary log</code></pre><p>分析问题:从库的中继日志 relay-bin 损坏.<br>解决方法:手工修复,重新找到同步的 binlog 和 pos 点,然后重新同步即可。</p><pre><code>mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx; </code></pre><p>维护过MySQL的运维或DBA都知道,经常会遇到的一些错误信息中有一些类似10xx的代码。</p><pre><code>Replicate_Wild_Ignore_Table:
Last_Errno: 1032
Last_Error: Could not execute Update_rows event on table xuanzhi.test; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000004, end_log_pos 3704</code></pre><p>但是,如果不深究或者之前遇到过,还真不太清楚,这些代码具体的含义是什么?这也给我们排错造成了一定的阻碍。</p><p>所以,今天民工哥就把主从同步过程中一些常见的错误代码,它的具体说明给大家整理出来了:<a href="https://link.segmentfault.com/?enc=3tEKxeOJwr%2FHtQKQ5B18Ng%3D%3D.BWniKI6J4UZGsu40OS7e1UYiXsBkPVi6aMNzeGdCnrGyCCJp4kdhe8a7A44gq8ZdMn2AUPp8MuntnpsjSRJw7f9WLAEsF1sShlbN4HNjESdw%2B7ku%2FrnzFcEoRb6LcNUu0DxVxiZla5ryYo9OLuzRwTqk%2FzwIuBSN4OtufycF6U76X35uCRgmcvxELmXi3FbZofsW1KvOeUkOt3GmC%2F5p1hpDMuq9VyE%2FbxTeM6e8dSG9NzVk%2FYFz2T5ocZZ4%2FOZH2dv2azvTxhRX72y7ceTaHj4PSTTwF43yvv4qgnva87ZtZPGU3bK1XBE%2FJVQCkGp2ebnJOqS5TCEUmMsMcoGCPw%3D%3D" rel="nofollow">建议收藏备查!MySQL 常见错误代码说明</a></p><h2>MySQL 开发规范与使用技巧</h2><h4>命名规范</h4><ul><li><p>1.库名、表名、字段名必须使用小写字母,并采用下划线分割。</p><ul><li>a)MySQL有配置参数lower_case_table_names,不可动态更改,Linux系统默认为 0,即库表名以实际情况存储,大小写敏感。如果是1,以小写存储,大小写不敏感。如果是2,以实际情况存储,但以小写比较。</li><li>b)如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。</li><li>c)字段名显示区分大小写,但实际使⽤用不区分,即不可以建立两个名字一样但大小写不一样的字段。</li><li>d)为了统一规范, 库名、表名、字段名使用小写字母。</li></ul></li><li><p>2.库名、表名、字段名禁止超过32个字符。</p><ul><li>库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符。</li></ul></li><li><p>3.使用INNODB存储引擎。</p><ul><li>INNODB引擎是MySQL5.5版本以后的默认引擘,支持事务、行级锁,有更好的数据恢复能力、更好的并发性能,同时对多核、大内存、SSD等硬件支持更好,支持数据热备份等,因此INNODB相比MyISAM有明显优势。</li></ul></li><li><p>4.库名、表名、字段名禁止使用MySQL保留字。</p><ul><li>当库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号引用属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得⾮非常复杂。</li></ul></li><li><p>5.禁止使用分区表。</p><ul><li>分区表对分区键有严格要求;分区表在表变大后,执⾏行DDL、SHARDING、单表恢复等都变得更加困难。因此禁止使用分区表,并建议业务端手动SHARDING。</li></ul></li><li><p>6.建议使用UNSIGNED存储非负数值。</p><ul><li>同样的字节数,非负存储的数值范围更大。如TINYINT有符号为 -128-127,无符号为0-255。</li></ul></li><li><p>7.建议使用INT UNSIGNED存储IPV4。</p><ul><li>用UNSINGED INT存储IP地址占用4字节,CHAR(15)则占用15字节。另外,计算机处理整数类型比字符串类型快。使用INT UNSIGNED而不是CHAR(15)来存储IPV4地址,通过MySQL函数inet_ntoa和inet_aton来进行转化。IPv6地址目前没有转化函数,需要使用DECIMAL或两个BIGINT来存储。</li></ul></li></ul><p>例如:</p><pre><code class="sql">SELECT INET_ATON('209.207.224.40'); 3520061480SELECT INET_NTOA(3520061480);
209.207.224.40</code></pre><ul><li><p>8.强烈建议使用TINYINT来代替ENUM类型。</p><ul><li>ENUM类型在需要修改或增加枚举值时,需要在线DDL,成本较高;ENUM列值如果含有数字类型,可能会引起默认值混淆。</li></ul></li><li><p>9.使用VARBINARY存储大小写敏感的变长字符串或二进制内容。</p><ul><li>VARBINARY默认区分大小写,没有字符集概念,速度快。</li></ul></li><li><p>10.INT类型固定占用4字节存储</p><ul><li>例如INT(4)仅代表显示字符宽度为4位,不代表存储长度。数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示,Python、Java客户端等不具备这个功能。</li></ul></li><li><p>11.区分使用DATETIME和TIMESTAMP。</p><ul><li>存储年使用YEAR类型。存储日期使用DATE类型。存储时间(精确到秒)建议使用TIMESTAMP类型。</li><li>DATETIME和TIMESTAMP都是精确到秒,优先选择TIMESTAMP,因为TIMESTAMP只有4个字节,而DATETIME8个字节。同时TIMESTAMP具有自动赋值以及⾃自动更新的特性。注意:在5.5和之前的版本中,如果一个表中有多个timestamp列,那么最多只能有一列能具有自动更新功能。</li></ul></li></ul><p>如何使用TIMESTAMP的自动赋值属性?</p><pre><code class="sql">a)自动初始化,而且自动更新:
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP
b)只是自动初始化:
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
c)自动更新,初始化的值为0:
column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
d)初始化的值为0:
column1 TIMESTAMP DEFAULT 0</code></pre><ul><li><p>12.索引字段均定义为NOT NULL。</p><ul><li>a)对表的每一行,每个为NULL的列都需要额外的空间来标识。</li><li>b)B树索引时不会存储NULL值,所以如果索引字段可以为NULL,索引效率会下降。</li><li>c)建议用0、特殊值或空串代替NULL值。</li></ul></li></ul><p>详细的可参阅以下文章</p><ul><li><a href="https://link.segmentfault.com/?enc=yCTf7h0tw4sEgkaqAOtuNw%3D%3D.4UQUEPC48qAQuv%2BaC%2BG3iUBAYFZVbiCZqAyZEPRMhipKiOzcPZDN1DsmkEIb2Wog9d40A5G12d1kkViNltdPdJXn6KDigg34pbf%2F01N1W5BpJkgN9N89845Z6N15GAlXIxTAGte0lV0wo0kII8bLx%2BhEWTyh87w9GgvXwkluP755iRUgVXeHHlMCD6MLfvANE3qtuOQhPD0qMjnhL919IFLlC%2B9BBW%2FOkGDxPJDrHgzvk9pRDVhj0FJLGYHupdTSri2EJvKd0GvaqM%2F0WZyveLqve2d9bhgELhw7pAMj13rVVxwM6E6pG3wOzUqFgTGlG5myrF8GPzTPbmeej9lTFg%3D%3D" rel="nofollow">值得收藏:一份非常完整、详细的MySQL规范</a></li><li><a href="https://link.segmentfault.com/?enc=a44gYx1ovCB4PgK5ijq5%2Fg%3D%3D.6oCQQs6RMB3zsApBK0SDRM1GfVvdsqBBcWDUQKhiPyZRiRQo0WIaTvBCsY1B3jF4Z6op13MI%2BpycCFAMf0BjQf3yKy5qhK%2B5OlZgIvcvbmGlrr%2Bx7kaq3NTXehk%2FxtqbRh%2BtuJU0a0YdAHG%2BujVMQ%2F%2BcOdblFGLcC1tY627JhVCeCaX7pTVE7nnuA2nZQY9oLWWRx19vpT81egEduRyaiOhXJYH10lRCplq0n1CNou9vnpoEyIu%2Fbc56%2FbQj3xOecH904wA2Nm%2FuiJa4YdcGL%2Fm%2BHhOgenCxjwB23HgOnY0KPoN9o9LbLQlcWtSRLBp1ki2zhYM5q1DcxL6B2SGqpg%3D%3D" rel="nofollow">MySQL开发规范与使用技巧总结</a></li></ul><h2>MySQL 高频企业面试题</h2><p>学好知识,当然就得去面试,进大厂,拿高薪。但是进入面试之前,必要的准备是必须的,刷题是其中之一。</p><h5><a href="https://link.segmentfault.com/?enc=7XKGKEgrDBCdWYgfI3XLjw%3D%3D.i0Kc%2FXh03ZwLuIve2Qk7drHw9HEI5w5ql2LQ%2FfK1SiU9MadrtoVvM453%2FItjzjPwDBOuMV8Z90HZj%2FgeZEUOOSYz%2Bi8dZKqBMfvrZRYFl4jOYaHdAoAdwItNjwl0V%2FlFjFwL7tlWe0z5HP%2BbeSY2cBRqmFTuexPH7QzK%2Belku4NXTh7ydD6Kh7HgHI60kOEnvW6xatfZ6%2Ft4imB4haBrQz2rV1YABMXZymXWM6S7qnjHQKVbdudYTnrCeeJZbjG2lQrXx%2Fupt9Lbv6AC6K03WHBuGmxx%2BbkQGdJe%2FQ2On1WNLP%2FLQT9ALRCqYHRBQbVQ" rel="nofollow"><strong>Linux运维必会的100道MySql面试题之(一)</strong></a></h5><h5><a href="https://link.segmentfault.com/?enc=9K%2BoAvsftab7V6hfbHDhsg%3D%3D.onUojnvWuDwzfRtoPivBkqRQEn4400hqrpHLuOgLEeGo7wbBA0qzrSgNrkw17SeHs5kXMzctaDQnhABjtihHrxhhkbNzHDrcqug2txoXna3XY2yOcxFq1688kV4KF5g8%2B%2FGESxFYkc9QP1%2Fn7Z9mts2W7Mb3KZT9q6C%2FuaFLy1AL4boTIQyZUa3fSIg4U4heYOiTOsFX5RzEvIvK2BdjM9dTDN6Ij5sPy4aBwXAT8e6QdGL9CeGDRryLG9JxDkNVT%2FraGofSElJv%2FTk7Xdyv40XnhK8MZbNvvgm9i1c7Jrbc1bBLXIXufaUxayK4Gg%2Ft" rel="nofollow"><strong>Linux运维必会的100道MySql面试题之(二)</strong></a></h5><h5><a href="https://link.segmentfault.com/?enc=om5RBZc9xBpeMrcm8mY8Ng%3D%3D.%2BLTu0hu49wqInFOZrw8lmKWm5F2WbLbyrNQI7gq8MjxlSY%2BXXS9l8bkx67iFOmqXyxdDG93qr0L6%2FipBAMONlwJHNgaV3lits4RQtAXGkMfOKu3P6y%2Bk5AyxwtcWN57mTEKKwqsiI3AUobbIje61g%2B6n6sTX0ThhQjV9QWFWeSC%2FJ8TFqDuyGDyKnp1tAIjRVggA5z0aCBxWMUeg4AIg1HbGr1ysLR5CyF3TFL8ztLSTJqQaWqr7ANIhmV%2B7vwv92ud2E7wOugoLz9OgvAbYTGV%2B4CJitunX%2BcFZXAE%2BNXsv6pt4jxjm7YKTkgniYf5Y" rel="nofollow"><strong>Linux运维必会的100道MySql面试题之(三)</strong></a></h5><h5><a href="https://link.segmentfault.com/?enc=Byw27vMWdIm1YHSHcDu50w%3D%3D.IMoWjjt5vTvc8dp3vQd1QlL0b9jAyr%2BehyS3hPkgJTfUfmtgcUmgFeSheXJrWGlu7B1Pn6o2aePDx%2BpyE6LKzlJ8IapbeP9QsrzYmoIZnjpN4PHsjhdRpipXeqbTE%2F0K02s3Vtg14whWf38190euzaxZ%2BEn5EkJ0ok8B8u0baPpGrEnxmO5JYXf4TDXbvSSxPtG7xkKhssNo%2BL7mgeAfPZBLj%2FqYax%2BpMEJ6g0yy7Se%2FJ31fjcfX5vtdIbhsINgN24ckgmTPbTnwN5wnSn3eoCq8nmvjFiAJ4x79S2i6WKgQrS9hfVtmcBwZIaFo%2BgFU" rel="nofollow"><strong>Linux运维必会的100道MySql面试题之(四)</strong></a></h5><p>以下内容主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水.</p><p>前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来.</p><p>因此决定搞一个MySQL灵魂100问,试着用回答问题的方式,让自己对知识点的理解更加深入一点.</p><p>此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员需要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案.</p><ul><li><a href="https://link.segmentfault.com/?enc=sCxqyxS9oZyVx4Q2Xa17WQ%3D%3D.%2BpyBDW34HshV7n8Fs4D684KbG2WwgEMGmWccyBvxxj0TtNrhszTx0Sq1RE891chRLrxXHxsQnmYSMC085G8kgViXjuiE1qb3%2F4DYYDiKxR6MaYG%2BrFxePmBFcWPbKrOExjf%2BoMBBwrG5a18YOxoLUruHCgtGYLsu4i52aHb6PHVNBZfJcdmQwzGZAXLxMmfK%2Bafmqa4QHaeHvf%2FOhNDylNhdTSUgmETw2iheMruWxHUKR9OG8B8JlyjDiQHl84DmpEq%2Fm4%2FgTsod191ZFGAJZpQXgMngkwhUO%2B1NSyWq3FzK8mFRQCpvK8hFIf%2Fg7CmgA9hkinBSiZ5n1%2BKuf9Dhrw%3D%3D" rel="nofollow">MySQL 高频面试题,都在这了</a></li><li><a href="https://link.segmentfault.com/?enc=pl3FYmll%2BrbOE4UZR6V54g%3D%3D.HZUH%2BnM5vCj3H3GjiQ3MfKASGY0j0N%2FJyiGMM1bd0xW4KRuDqibK1nN3MGaaYEHboU9klPJvqXTaW45Wx3ic4hu0qtFJrs5N%2BTBiV5Vaq5P3DFC2K4eH0aTKZYj8bewlCV3FeszQxmHeGU3bEo9a5i9v4IYWvPF4qS7ohedncSDdo5tzqJNxiBfwirKtXsms1kY0IRkLmZ7t6%2F4vAOmf7QRtz1J2qCrI%2B90yH9ujMQhASCHHtFWvoJHWueGGQ6iqyhP2sz7FAP7LvB%2BotAMHT9RlWV%2B9d56UGbT%2FYfIGM%2FEKkhnA8CJgPCAQRdUT1Jc8Cneq7lJm9cWiP9LkxtamYg%3D%3D" rel="nofollow">史上最全的大厂Mysql面试题在这里</a></li><li><a href="https://link.segmentfault.com/?enc=6Y7047MJ53L7oVeDMOwsFA%3D%3D.XaXYsPlpM91czqQNJrOVnZ8SwHBVHu9cZg4hMxr1Vbo14r%2BKcsBGGil7mp7kO%2FZ99eHlgwTvm1jXiURmzi3aqf4IrK8DZubQiEMwtip75WUm6%2BLSvpKigX3rR8YyC1akBZxdl1H42Jhm9yQgPbMTEKrLaN9r5GJm3qrkAVfUCHWeyoGX85fvsLTcs2tf0GeqvSGLTSmoSxdEAJQZ6Kd%2Bose2btN%2FU1nidPyGwfLz5ggHpUe5hUF9MeYBrsAB0Yug11VQ9zP0BvoSK%2Bm3KoFyxQKcWtVDlyFYuN6tTUz0xpPiRigxFpJ1VI0y8bQj%2FSrR7BEtKbzYGCHFmeJ%2BSH7hZQ%3D%3D" rel="nofollow">MySQL 数据库面试题(2021最新版)</a></li></ul><h2>MySQL用户行为安全</h2><ul><li>假设这么一个情况,你是某公司mysql-DBA,某日突然公司数据库中的所有被人为删了。</li><li>尽管有数据备份,但是因服务停止而造成的损失上千万,现在公司需要查出那个做删除操作的人。</li><li>但是拥有数据库操作权限的人很多,如何排查,证据又在哪?</li><li>是不是觉得无能为力?</li><li>mysql本身并没有操作审计的功能,那是不是意味着遇到这种情况只能自认倒霉呢?</li></ul><p>民工哥技术之路公众号不定期更新MySQL技术知识体系,大家可以关注我查阅 <a href="https://link.segmentfault.com/?enc=T7GHQ7FDb56M1md5fvoXaA%3D%3D.Xz4uRiBne%2BIpEJx4jh8oVnwzlf2zdqVu1mAKAOgXN3TJUG%2BSTDdlp3V63IFq0FOoPQS0a2k26o2rLtLxufrJTZ68%2BroBRC8ChgzfOf%2FFY%2BL6yTW%2FoaNwEstFPlGYBlxupEvHxDC%2BPgkiZCU9Uk8gYGCq%2FAsC1GGOQc1SHcQUK07kuIXVr2fbnpoAgt9iQg8m" rel="nofollow">MySQL技术专栏</a> 学习更多的MySQL知识。</p><p>也欢迎点赞、转发支持,因水平有限,如有错误请留言指正,为感!!!</p>
这 4 种 Redis 常用运维工具都不会?你算啥运维人
https://segmentfault.com/a/1190000041256510
2022-01-10T11:54:14+08:00
2022-01-10T11:54:14+08:00
民工哥
https://segmentfault.com/u/jishuroad
4
<p>我们在应用 <a href="https://link.segmentfault.com/?enc=0rilVUORukvsDNu1PnCOmw%3D%3D.o%2B1o5zjSDAOIDM4pyvY%2BeFsduB7T9Ib7YTUMwJ32LuT%2B8kffi5nXh41JEUkOqROUrUlmShzXdc6GN3GVw5RbLoo5CNS%2BFjjns8l5snFmdtffSm1ejFQ4sN539S19jLKmGtk%2BCRvehcE9W%2FJUeouKZN2uafg3rrxwdCPO58ezrGrH7opxrOiEx7FEOECOyqw0z3I%2F5HoF4D99z8GgeqLsosUm98ZJQXLqerARWxjtXYsPFfwpF83Yb50a2ukKKsTBvLpZWHaK17hNQuk0yN9qRPNg7JB%2BnRyWdX9vhHHC7NhR6M1x%2Flzj61wxeBaIMiG0" rel="nofollow">Redis</a> 时,经常会面临的运维工作,包括 <a href="https://link.segmentfault.com/?enc=Dzmbvr9tQ7Tkupqx4nsOnw%3D%3D.W0HpmHzS%2Be5Sy9%2BA8B9gWG%2FVL1RqIhrRYY8I8iz%2Fx7ajXU3vHs78B9Z7DgDO4Mm4ImQYB2hyXjxJas8v%2BxPJqJXY%2B6YRi9%2BdeNilv%2BA9G51MISWnvhOye2QBz9ivuOtIbjLMphVLqzq9b%2Bfsd10I%2BXevH5MyK36xTUnhmwQMvJPMsjI%2B0qO%2FefGWKMt8AF90rrDtxRSWPf7HA02Hm82ufaNIjYWMt92gE6HgswzyYEfKObFOFKaZHig3f5%2BKZMne07qoC056CH2tvzNT8ShK5j5L0FLrO27xV9yhQPdSTLEkXWjN55zn0gfgwbGxQDcd" rel="nofollow">Redis</a> 的运行状态监控 ,数据迁移 ,主从集群 、切片集群的部署和运维。接下来,我就从这三个方面,给你介绍一些工具。</p><p><img src="/img/remote/1460000041256512" alt="图片" title="图片"></p><p>我们先来学习下监控 Redis 实时运行状态的工具,这些工具都用到了 Redis 提供的一个监控命令:INFO 。</p><h2>最基本的监控命令:INFO 命令</h2><p><a href="https://link.segmentfault.com/?enc=mHPOUHSpqzOxUtWEA9B%2FIA%3D%3D.j1KA27snwqO2HCM8OgjOJ2yJR30xAQcEQ2kup417Wn%2B8v%2F2%2FISg2oOOTPtHhzM7fHJ2r7NcXKb%2Fxwlv3z43Dldl5q%2FQhz6FYHpSyjMx76Pybb7xI38%2FzDm97CTeBMpjOC1B65MKtRQGoFnylFOEtqkaXrzQUH5Cy%2BvqJuCN3TuvS4oSAUZGru18GHvlkG%2BOktW5xR9Lp7omycC0vwpLuhD4ZdGUAVU8SbMQFf4wKH9JSUjVIFrwbBzuAvGKWo65Y%2BLvqj%2Fzd4ETy5KUUePG5hjg8B9zKUCIiGfAAkOAeomYJyPX5O4yzzsJVDikCgktJ" rel="nofollow">Redis</a> 本身提供的 INFO 命令会返回丰富的实例运行监控信息,这个命令是 Redis 监控工具的基础。</p><p>INFO 命令在使用时,可以带一个参数 section,这个参数的取值有好几种,相应的,INFO 命令也会返回不同类型的监控信息。我把 INFO 命令的返回信息分成 5 大类,其中,有的类别当中又包含了不同的监控内容,如下表所示:</p><p><img src="/img/remote/1460000041256513" alt="图片" title="图片"></p><p>在监控 <a href="https://link.segmentfault.com/?enc=VOASxIRzUCkgCQdDzQHRxg%3D%3D.pMbZDm%2F7tj8weLBBrTCPQebDpl3d8zQkpeRgNc73%2Ft3tu%2FTJPeVo3xth5Q05CJtajWYltk2zbZpwUaDP4pmqjrc0gvIlIgil6EKF5IXhgN2VR9TGKmd05y1QEJVQ18iFLKkqOuSUZjHLRr2YJykFEy1YGF3pLrSDSuZOsrUmKv6JzUFQbCF9Zu9gn3F6UvlQHKc2wU1xyw0jssYHTHyv5GHHQSu%2BXzZe3qf2jaEzptlbqsmg9437yHkM1vm8kMCIexxbNTqQSMnYu%2FZOPKlRImb5q8dz4PdV6r1pwO4rOHA1cnbQt2VEWxzjTsmeGkOJ" rel="nofollow">Redis</a> 运行状态时,INFO 命令返回的结果非常有用。如果你想了解 INFO 命令的所有参数返回结果的详细含义,可以查看 Redis官网的介绍。</p><p>这里,我给你提几个运维时需要重点关注的参数以及它们的重要返回结果。</p><p>首先,无论你是运行单实例或是集群,我建议你重点关注一下stat 、commandstat 、cpu 和 memory 这四个参数的返回结果,这里面包含了命令的执行情况(比如命令的执行次数和执行时间、命令使用的 CPU 资源),内存资源的使用情况(比如内存已使用量、内存碎片率),CPU 资源使用情况等,这可以帮助我们判断实例的运行状态和资源消耗情况。</p><p>另外,当你启用 RDB 或 AOF 功能时,你就需要重点关注下 persistence 参数的返回结果,你可以通过它查看到 RDB 或者 AOF 的执行情况。</p><p>如果你在使用主从集群,就要重点关注下 replication 参数的返回结果,这里面包含了主从同步的实时状态。</p><p>不过,INFO 命令只是提供了文本形式的监控结果,并没有可视化,所以,在实际应用中,我们还可以使用一些第三方开源工具,将 INFO 命令的返回结果可视化。接下来,我要讲的 Prometheus ,就可以通过插件将 Redis 的统计结果可视化。<a href="https://link.segmentfault.com/?enc=N%2BxAQoSkaoF86ouRDij%2Bsw%3D%3D.llkYgl2uQmJvJ4BqVqOoVpXEBTVFvg7SRXX%2F9QeGlhiDqzACDIukqhvFKzYd%2BOCCyEntarANCiPgLdSrQPcYoIPnhpgxH2l6PhmJ39TKZy3laW%2FIpy7wqER1uXA5RKvyU1UPPoXQ4q5mYlaBU8DE%2BWwnbFajO1QVjQgAfOSmxakOuMDE2rumBzp4sNxBaO0nlUE0bkDyjEGznKEXAXawc36lGpZw%2FdoCxcyB5%2Fd2TFRxZv%2F3J0LzqsxHYJCwo92RtQUN%2BEQEyuaYermOat9Jw9N4OC8wDgb56bgL0rR63N5X979MLPghL3wjYuPi0ope" rel="nofollow">Redis性能指标监控!你知几何?</a></p><h2>面向 Prometheus 的 Redis-exporter 监控</h2><p>Prometheus 是一套开源的系统监控报警框架。它的核心功能是从被监控系统中拉取监控数据,结合Grafana 工具,进行可视化展示。</p><p>而且,监控数据可以保存到时序数据库中,以便运维人员进行历史查询。同时,Prometheus 会检测系统的监控指标是否超过了预设的阈值,一旦超过阈值,Prometheus 就会触发报警。</p><p>对于系统的日常运维管理来说,这些功能是非常重要的。而 Prometheus 已经实现了使用这些功能的工具框架。我们只要能从被监控系统中获取到监控数据,就可以用 Prometheus 来实现运维监控。</p><p>Prometheus 正好提供了插件功能来实现对一个系统的监控,我们把插件称为 exporter ,每一个 exporter 实际是一个采集监控数据的组件。exporter 采集的数据格式符合 Prometheus 的要求,Prometheus 获取这些数据后,就可以进行展示和保存了。</p><p>Redis-exporter 就是用来监控 Redis 的,它将 INFO 命令监控到的运行状态和各种统计信息提供给 Prometheus,从而进行可视化展示和报警设置。目前,Redis-exporter 可以支持 Redis 2.0 至 6.0 版本,适用范围比较广。</p><p>除了获取 Redis 实例的运行状态,Redis-exporter 还可以监控键值对的大小和集合类型数据的元素个数,这个可以在运行 Redis-exporter 时,使用 check-keys 的命令行选项来实现。</p><p>此外,我们可以开发一个 Lua 脚本,定制化采集所需监控的数据。然后,我们使用 scripts 命令行选项,让 Redis-exporter 运行这个特定的脚本,从而可以满足业务层的多样化监控需求。</p><p>最后,我还想再给你分享两个小工具:redis-stat 和Redis Live。跟 Redis-exporter 相比,这两个都是轻量级的监控工具。它们分别是用 Ruby 和 Python 开发的,也是将 INFO 命令提供的实例运行状态信息可视化展示。</p><p>虽然这两个工具目前已经很少更新了,不过,如果你想自行开发 Redis 监控工具,它们都是不错的参考。</p><p>除了监控 Redis 的运行状态,还有一个常见的运维任务就是数据迁移 。接下来,我们再来学习下数据迁移的工具。</p><h2>数据迁移工具 Redis-shake</h2><p>有时候,我们需要在不同的实例间迁移数据。目前,比较常用的一个数据迁移工具是Redis-shake ,这是阿里云 Redis 和 MongoDB 团队开发的一个用于 Redis 数据同步的工具。</p><p>Redis-shake 的基本运行原理,是先启动 Redis-shake 进程,这个进程模拟了一个 Redis 实例。</p><p>然后,Redis-shake 进程和数据迁出的源实例进行数据的全量同步。</p><p>这个过程和 Redis 主从实例的全量同步是类似的。</p><p>源实例相当于主库,Redis-shake 相当于从库,源实例先把 RDB 文件传输给 Redis-shake ,Redis-shake 会把 RDB 文件发送给目的实例。接着,源实例会再把增量命令发送给 Redis-shake ,Redis-shake 负责把这些增量命令再同步给目的实例。</p><p>下面这张图展示了 Redis-shake 进行数据迁移的过程:</p><p><img src="/img/remote/1460000041256514" alt="图片" title="图片"></p><p>Redis-shake 的一大优势,就是支持多种类型的迁移。</p><p>首先,它既支持单个实例间的数据迁移,也支持集群到集群间的数据迁移。</p><p>其次,有的 Redis 切片集群(例如 Codis)会使用 proxy 接收请求操作,Redis-shake 也同样支持和 proxy 进行数据迁移。</p><p>另外,因为 Redis-shake 是阿里云团队开发的,所以,除了支持开源的 Redis 版本以外,Redis-shake 还支持云下的 Redis 实例和云上的 Redis 实例进行迁移,可以帮助我们实现 Redis 服务上云的目标。</p><p>在数据迁移后,我们通常需要对比源实例和目的实例中的数据是否一致。如果有不一致的数据,我们需要把它们找出来,从目的实例中剔除,或者是再次迁移这些不一致的数据。</p><p>这里,我就要再给你介绍一个数据一致性比对的工具了,就是阿里云团队开发的Redis-full-check 。</p><p>Redis-full-check 的工作原理很简单,就是对源实例和目的实例中的数据进行全量比对,从而完成数据校验。不过,为了降低数据校验的比对开销,Redis-full-check 采用了多轮比较的方法。</p><ul><li>在第一轮校验时,Redis-full-check 会找出在源实例上的所有 key,然后从源实例和目的实例中把相应的值也都查找出来,进行比对。第一次比对后,Redis-full-check 会把目的实例中和源实例不一致的数据,记录到 sqlite 数据库中。</li><li>从第二轮校验开始,Redis-full-check 只比较上一轮结束后记录在数据库中的不一致的数据。</li></ul><p>为了避免对实例的正常请求处理造成影响,Redis-full-check 在每一轮比对结束后,会暂停一段时间。随着 Redis-shake 增量同步的进行,源实例和目的实例中的不一致数据也会逐步减少,所以,我们校验比对的轮数不用很多。</p><p>我们可以自己设置比对的轮数。具体的方法是,在运行 Redis-full-check 命令时,把参数 comparetimes 的值设置为我们想要比对的轮数。</p><p>等到所有轮数都比对完成后,数据库中记录的数据就是源实例和目的实例最终的差异结果了。</p><p>这里有个地方需要注意下,Redis-full-check 提供了三种比对模式,我们可以通过 comparemode 参数进行设置。comparemode 参数有三种取值,含义如下:</p><ul><li>KeyOutline ,只对比 key 值是否相等;</li><li>ValueOutline ,只对比 value 值的长度是否相等;</li><li>FullValue ,对比 key 值、value 长度、value 值是否相等。</li></ul><p>我们在应用 Redis-full-check 时,可以根据业务对数据一致性程度的要求,选择相应的比对模式。如果一致性要求高,就把 comparemode 参数设置为 FullValue 。</p><p>好了,最后,我再向你介绍一个用于 Redis 集群运维管理的工具 CacheCloud 。</p><h2>集群管理工具 CacheCloud</h2><p>CacheCloud 是搜狐开发的一个面向 Redis 运维管理的云平台,它实现了主从集群、哨兵集群和 Redis Cluster 的自动部署和管理,用户可以直接在平台的管理界面上进行操作。</p><p>针对常见的集群运维需求,CacheCloud 提供了 5 个运维操作。</p><ul><li>下线实例 :关闭实例以及实例相关的监控任务。</li><li>上线实例 :重新启动已下线的实例,并进行监控。</li><li>添加从节点 :在主从集群中给主节点添加一个从节点。</li><li>故障切换 :手动完成 Redis Cluster 主从节点的故障转移。</li><li>配置管理 :用户提交配置修改的工单后,管理员进行审核,并完成配置修改。</li></ul><p>当然,作为运维管理平台,CacheCloud 除了提供运维操作以外,还提供了丰富的监控信息。</p><p>CacheCloud 不仅会收集 INFO 命令提供的实例实时运行状态信息,进行可视化展示,而且还会把实例运行状态信息保存下来,例如内存使用情况、客户端连接数、键值对数据量。这样一来,当 Redis 运行发生问题时,运维人员可以查询保存的历史记录,并结合当时的运行状态信息进行分析。</p><p>如果你希望有一个统一平台,把 Redis 实例管理相关的任务集中托管起来,CacheCloud 是一个不错的工具。</p><p>更多关于 Redis 技术栈的学习,可以查阅民工哥技术之路的Redis技术系列专栏文章:<a href="https://link.segmentfault.com/?enc=4%2BfFydX9sIoWiZXg%2FyEo0w%3D%3D.SR7bzRb%2FPoemqNQDdP0LllIG4TyzqWtbBFyAz9RAFnVsPpYOZrTRCZf%2BtdHbPOGUIQdCM3Mdaob2ke5AGrFeUJUHEnCh9Dy%2F7b%2FTfLyZnkinPVn99RIr1XygLCV6TvS2iJbmNMor%2Bbzb0o8kjiJS7UiF724dOZhMAIf9dMuGpG6uC%2BoyFgeFT0B3vb2wI8KI" rel="nofollow"><strong>Redis技术学习笔记总结</strong></a>(<img src="/img/remote/1460000041256515" alt="图片" title="图片">点我直达)</p><blockquote><em>来源:time.geekbang.org/column/article/305195</em></blockquote><p><img src="/img/bVbHCzg" alt="" title=""></p>
谁再说不熟悉 Linux 命令,就把这个给他扔过去!
https://segmentfault.com/a/1190000041229679
2022-01-05T15:55:23+08:00
2022-01-05T15:55:23+08:00
民工哥
https://segmentfault.com/u/jishuroad
25
<p>虽然平时大部分工作都是和Java相关的开发, 但是每天都会接触Linux系统, 尤其是使用了Mac之后, 每天都是工作在黑色背景的命令行环境中. 自己记忆力不好, 很多有用的Linux命令不能很好的记忆, 现在逐渐总结一下, 以便后续查看。</p><h2>基本操作</h2><h6>Linux <a href="https://link.segmentfault.com/?enc=apD33QS45o0xY9rcPSLzFg%3D%3D.Zsuflb1TYKUA1n%2BaPc0MQfcVlueOf1MCSsg7UsCq7cr6%2FPlHtcATLmxpmemrpRC%2FToXnlFMC71ce2YyEMOoM7msmq30e7gXX6OrzwEoDoyBgQVglmsPnSjr3QtFtX8JJsoTi0LjX5N4ruBanFjpjtnVaPDoiyfCGHe9aE6RDMHvqDW%2Bo%2FToFZIOBZ4wqnxHWC8g%2B4pXGTP21XuAck6VdgP2CHo5Yo3ANUTRFputBsbKpq90EEgbokn984Qcotuwiox3cyEfiq5DgDLhI5mVqRpvYwdkySjbVOcjAsBaQ7DEe5ngn8FZ2eCqX2g6c8NPH" rel="nofollow">关机,重启</a></h6><pre><code># 关机
shutdown -h now
# 重启
shutdown -r now</code></pre><h6>查看系统,CPU信息</h6><pre><code># 查看系统内核信息
uname -a
# 查看系统内核版本
cat /proc/version
# 查看当前用户环境变量
env
cat /proc/cpuinfo
# 查看有几个逻辑cpu, 包括cpu型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 查看有几颗cpu,每颗分别是几核
cat /proc/cpuinfo | grep physical | uniq -c
# 查看当前CPU运行在32bit还是64bit模式下, 如果是运行在32bit下也不代表CPU不支持64bit
getconf LONG_BIT
# 结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l</code></pre><h6>建立<a href="https://link.segmentfault.com/?enc=gs5Kn3zbNhFbAO98DM5TRw%3D%3D.4nUqoyJuojSTQIfS3ooWha1n6J2wSwjKBrd1vaUKi4cJceJy9aff6YybYBo75TLca5r2%2Ft%2BpVyq3xFqsw3%2B9j%2BS6mBhProRjGMIKIPXLbgOfCYXCILYY2e6g5b3JOKZTwQoEEE8KG1bdBfty%2BFDHObYlBJT9AohVSfiB8r9AvdU1Ci17gckj2vOnGFEqKfyAl6T2T8dyNmr%2FceQuoimUothBXUpLRXBeVPxH%2FlnkNgGxkJ32CFO6VSbiDn%2FDfkCoeFFa71ssY%2F5nIOITFPJksKauBQVkPbyjzsavIYQBejympxSjfQY4mIr%2Bsj7R00sB" rel="nofollow">软连接</a></h6><pre><code>ln -s /usr/local/jdk1.8/ jdk</code></pre><h6><a href="https://link.segmentfault.com/?enc=WM1PeDMk6l1jElyO9S1iXA%3D%3D.0ZRPIkOLbDSjLfuvIMKBzg5jRTQKe6LLzDiEZ3TpIVaKlH0pQ0R14aUkbfL8OmHfzodwtXmPu1TgKFy%2FVa%2BxKy2R%2FvR4gdukmQlpJwpXlf7DiIo35jysyF%2BsP%2B1DMUka4%2BWASBW3EidL%2FgeFu%2Bwo46PYIsuuPn7hGIB48dFoUTM0p0xVBvwvOWP4WoqBh4Dj8mhDKICfGrMV9rrf6olr5F2jFs6OswTXEyc1vAcY2Ddve5vdtumLfl2Lek1e%2BobO4Z3hIScofn1hL5AtyFgdf0ztOIFtwhjVj%2Bq75nzMyB%2BjKxagQGKMMQL1wvcIbppI" rel="nofollow">rpm</a>相关</h6><pre><code># 查看是否通过rpm安装了该软件
rpm -qa | grep 软件名</code></pre><h6>sshkey</h6><pre><code># 创建sshkey
ssh-keygen -t rsa -C your_email@example.com
#id_rsa.pub 的内容拷贝到要控制的服务器的 home/username/.ssh/authorized_keys 中,如果没有则新建(.ssh权限为700, authorized_keys权限为600)</code></pre><h6>命令<a href="https://link.segmentfault.com/?enc=HmmTqj4xmJBraldvcZgRyA%3D%3D.PYtsLXr2ps4vZPvAL8bPm%2BXYVxiT5dPanTeeTnv2dcH7Aj%2F%2Bc%2BJwoKkPkBdBVLOIa6Roo1QAbDY16nRnaC7aM00QVsMhDYglLRBnX3pbcqmNpRQOpfh4PHhJiq0EhvbSyIVNR8laNKtX7FVHUVRqfZ5KDw46uTdnQBpTkqEDuEYDT13dgZ8e1xlq6VWhkg5Xt%2FZoOgWXBPq3aBecVcsPKwZnN1isTpHY6E3GLHYO8EGCTrMexTF2sib%2B9eAwQ3y4r3U9YGnbAiP%2FHG46%2BSG%2Bvwa%2BTMdYoolusJMfpg6YdQcmrVmU6DtWvmOSIjv9fjx5" rel="nofollow">重命名</a></h6><pre><code># 在各个用户的.bash_profile中添加重命名配置
alias ll='ls -alF'</code></pre><h6><a href="https://link.segmentfault.com/?enc=vD3H9mBJ849vP2uFLEINug%3D%3D.tz%2BPCaNhYZyvi4eJQYbhm3M7gQtNRd59%2FPKx3tTUwrfPp7TxPr5YYeGpEkXUbvReQQkSFR3lhX1IrzJpKCwK%2BZHTyeMJRsmqgdMT%2FgcGhD0ZvQ3zDunoRrs%2FD7oMeCCirTUI41tykedq5%2FwXyb0VAkNGl5uqWOt4O%2BTva4Rsr6o7l0r8PAD%2BqLdnuBVAN8ZnBNwtk94c8UcfhyOmCRVfow0tQXNI3tSEElAbzRyhOst3yB18RUzQBXKzSHSiM7%2Bpeq1dTGNQCnyiX0cC6ipHjDg%2Bhpm41i3zMh%2BQyXaDmpLDr88EjQRMFIbRcf3w%2BO%2Fc" rel="nofollow">同步服务器时间</a></h6><pre><code>sudo ntpdate -u ntp.api.bz</code></pre><h6><a href="https://link.segmentfault.com/?enc=gBdntBMmoHSNFSqeQmdQLA%3D%3D.cDXfpSwNrdSl8c9hDWx53J84rMyRqIDqfjDfZAR%2Bb7sj4nPRPbk60AywiQdwdVjibzaBGNSwxtEzNKFpF2KfQDJZ2YudVzzYhGI1WBygHWKb646KUkiE8l45RL1R8lRHwv9nki%2FB8eAjeQ0%2FOTLWpmEclpTGnAbc3eAT89Tglm30wb6aBZMoZNBtDu2TJU2GMjpO1CB4RM9un1HMq3G%2FI4LU9BBijvCu8Gp6OMkNeEt41RZKGhhq6V62Ug4VBZSQ3RmCj9G0HyEIc7ptFIWSZfV9Mk76VGu4SrckcrBtlG55ni9IVEemhhksfxOfZywo" rel="nofollow">后台运行</a>命令</h6><pre><code># 后台运行,并且有nohup.out输出
nohup xxx &
# 后台运行, 不输出任何日志
nohup xxx > /dev/null &
# 后台运行, 并将错误信息做标准输出到日志中
nohup xxx >out.log 2>&1 &</code></pre><h6><a href="https://link.segmentfault.com/?enc=BJafgOEI6slQNE8zkwLFNg%3D%3D.CdK5oSlkkoGAoeUeK%2F8IaQr2QzlOfwo3nPiiLihxx4z%2FPyKvaFecxX6Au7DwHZaevDO9XBencZQFFpsdLXxgJfNPMrvQLVnSrI0FBeH0omRE47w%2F6lI6920sQDYcWNjnvuI0MKmeTKMyKVIgvzF5keKRgTatOjZlBScR%2BIWa6zKA1Skf7r7FzdYJW2t7gRFy3XgVSVWtmHRF7ujAurqLw5C9hW02slulWzd5WQGVmY%2BGwKJqYAZ5YfFLZ3vFl60UCHYpglvx2H%2B4HljcI%2BzQga2J6H0QeeH2%2BcTv4DsGzy1TlnenP%2FWyI4CQDkUhs9rn" rel="nofollow">强制</a>活动用户退出</h6><pre><code># 命令来完成强制活动用户退出.其中TTY表示终端名称
pkill -kill -t [TTY]</code></pre><h6><a href="https://link.segmentfault.com/?enc=haL0Wiakv6eIo64LKsjwqg%3D%3D.vlwjC7YF1rMpnBrSOaaFI7a38CeD5R2XNWJ1NfmiExuwxw%2FV3Prlnbe0jZIlbpNQau%2F6tyE%2FVh%2B2gQ7OpBv9yyAT%2BhF%2FvzWiHyIkUFMwXKqFMr0TjvpKShfpQFzRb%2BuaVE%2BxKAEQ7BUXGJV%2B2UkV97bYyzxAoiPWWKWJOcqmQFeNJAP7%2BF27CggNSyaGS5KjRlWM%2ByB8l%2FNCeMIwHxVGC6gRjnbkOrgRrV1XtmJeA%2BMQ9HIMGeQeYzGeERwY10AvTcrw55ukQm9YVMyv18e4gje3Vhbpt5HWvcHSRAqeawOAH%2BBm5MLyw4elvCc%2BG2Oc" rel="nofollow">查看</a>命令路径</h6><pre><code>which <命令></code></pre><h6>查看进程所有打开最大fd数</h6><pre><code>ulimit -n</code></pre><h6>配置dns</h6><pre><code>vim /etc/resolv.conf</code></pre><h6><a href="https://link.segmentfault.com/?enc=x4oVhL0nt45DNmr66Z9RIA%3D%3D.4Xcy1a6bqq%2FRyUIbN68nfZJAOQIMEyirXKLOiQAllzCNx5AzOPUTPsXdExLibpqmfKCUjocdwa6SJtZsv8OzFBMfTl2Ui6i9%2BMNHQogT0g5ZCcWYc4g8SWhcGeYKU6GBamim40gfx78hpbuwXpKa047v1PxuctUzyTuP0E162KHic86TMm%2BdKhwG%2FqZDzSePJUe6sQn6bIiCMDvQfztVrfWs%2BqmWAXZma%2FGbXCHWWvc04UfohOHFYlkef7XshQpMgHUUIaRov%2Bg0TtWV9MoRP2ouTGZhYhfyRoJY8mTzNllEkKvYKRBcgHX%2BNW%2BTk1ff" rel="nofollow">nslookup</a>,查看域名路由表</h6><pre><code>nslookup google.com</code></pre><h6>last, 最近登录信息列表</h6><pre><code># 最近登录的5个账号
last -n 5</code></pre><h6><a href="https://link.segmentfault.com/?enc=9E0BBAhj4YbF2Cx2nre3Uw%3D%3D.mdMMTUTJ7CXOKYiwPhEf%2B6YgTY14xfqgdFibVsnVBWXKlIr%2FM60olcyZP5xu%2B0vfe0r9iIp8Q3g%2BOvqNwWwm%2BIQ%2FcfPBQjv5VR0QCHzw4k4n8dFOpnRKLpn%2F7PSa8CTN9EGsg%2FIUtAIZMZ75QELrazeJ6wQw9i7xiDuJ%2Fma23mOKhfiZarxAz6qNNGL0w1b%2B82bqxVdCtIgQQ5X4h3ySJsXuWkvk8gIsKzGZ3%2BODPrdG9aZJfBdkm6S62kWysqKVZ7PuH1x5s3Y8u%2F3OqU9Jx26sc9G815G9ztNy%2BNHKU9aDxzMlI6%2B%2BYmrbEfLW2zUc" rel="nofollow">设置固定ip</a></h6><pre><code>ifconfig em1 192.168.5.177 netmask 255.255.255.0</code></pre><h6>查看进程内加载的环境变量</h6><pre><code># 也可以去 cd /proc 目录下, 查看进程内存中加载的东西
ps eww -p XXXXX(进程号)</code></pre><h6>查看进程树找到服务器进程</h6><pre><code>ps auwxf</code></pre><h6><a href="https://link.segmentfault.com/?enc=qxRSUzZqXiniMxjHSYm4vA%3D%3D.KUGR8CTvvoMAYKEvZSlVHXvh%2Fj29h%2B%2FUDoPNH%2B9eedJkMgOe7S4K8sWOlKoqSMlURTes5Oh08749WKQF3UnoWgumrPRxsYgVfbbQZVleK47hNKzpX0Td%2BEuJZNVtMOeJTIIsvjNxwzwTJ5sCBvzXO%2FwKm0BjRzt%2BR%2Fk1m9m69g2owV6U9zEvLzXOVkntZGgSStN5ReNONDQXyGYtWvvoP5n2Aq4hlbe53HtItPX%2B1t0PPVhCGaXNzyxDj9NVHLdLRJnCtO8UDJpgDbCPFIMYM8avkuIlPdqucyuFIcRiABHTfKe0%2BICiddabeD5Jzhew" rel="nofollow">查看进程</a>启动路径</h6><pre><code>cd /proc/xxx(进程号)
ls -all
# cwd对应的是启动路径</code></pre><h6><a href="https://link.segmentfault.com/?enc=We3tZyQn0NCrnqXMF01gEg%3D%3D.R2QnpvqvvWQ%2BGXdPSMj%2BSB%2B3eEcd3ysU6iWUrEUBBjZ05IaGEOjMguklF7so4lHVcdgvW8hm%2Fi44sqLWGxVVnkuCUNW9cvKPMZn2LqkTTzjLRKJIbegddD2t7dC8SqpWimDNpcW08XV4nWsdOU7JxRIumPR%2Bv%2Bd881PBRZZBE14UhCkVou7GXvTmHzdOhS9w1HynrBteouKbfpCXSqmtZULwRCYpBfIuAlzZX1PeCrwZUwv797QTkwbAH3%2FypxZoAus4e0lZcdxmL0ROBewUS%2BqmtRLYVtkhPVCZwltIRW2VEYLHbHO27%2BgvbWXuC97m" rel="nofollow">添加用户</a>, 配置sudo权限</h6><pre><code># 新增用户
useradd 用户名
passwd 用户名
#增加sudo权限
vim /etc/sudoers
# 修改文件里面的
# root ALL=(ALL) ALL
# 用户名 ALL=(ALL) ALL</code></pre><h6>强制关闭进程名包含xxx的所有进程</h6><pre><code>ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9</code></pre><h2>磁盘,文件,目录相关操作</h2><h6><a href="https://link.segmentfault.com/?enc=gytAN%2FGpK%2FHWJaBsOQ4RHQ%3D%3D.kFTfDrRI18yy9kfxl9ehN5szHkhDqpg0BMj4clODWBEfyBYjd2vkJdq5QVQEWMGiAqBsXB93vFroVrQF6LjnTf%2FQMNhLbXGXtpg%2FmxDsIo%2B2w3diduzemClnqnLrwmDoldu8nWCDas3bZP06roDADkdT3OuiyqLuDyFkqfR2QMgg2tO0BdcIVAhhJyfk3oAlTA8llymAwjcKo0L%2FMtgIBaGvrZhwgT9D47lx376zhVeJspS0TOpBCovkXXLQDV5EmJvZCBZAPvvANHBaRMDRQK4IHTBTJNUXQhTQau5aR6dCiDGd8ld6n6Gd0S4B%2B7Ih" rel="nofollow">vim</a>操作</h6><pre><code>#normal模式下 g表示全局, x表示查找的内容, y表示替换后的内容
:%s/x/y/g
#normal模式下
0 # 光标移到行首(数字0)
$ # 光标移至行尾
shift + g # 跳到文件最后
gg # 跳到文件头
# 显示行号
:set nu
# 去除行号
:set nonu
# 检索
/xxx(检索内容) # 从头检索, 按n查找下一个
?xxx(检索内容) # 从尾部检索</code></pre><h6>打开只读文件,修改后需要保存时(不用切换用户即可保存的方式)</h6><pre><code># 在normal模式下
:w !sudo tee %</code></pre><h6>查看磁盘, 文件目录基本信息</h6><pre><code># 查看磁盘挂载情况
mount
# 查看磁盘分区信息
df
# 查看目录及子目录大小
du -H -h
# 查看当前目录下各个文件, 文件夹占了多少空间, 不会递归
du -sh *</code></pre><h6>wc命令</h6><pre><code># 查看文件里有多少行
wc -l filename
# 看文件里有多少个word
wc -w filename
# 文件里最长的那一行是多少个字
wc -L filename
# 统计字节数
wc -c</code></pre><h2>常用压缩, 解压缩命令</h2><h6><a href="https://link.segmentfault.com/?enc=ZWxFTd7TpLZ096R1ig9ZZw%3D%3D.TlSfUMO7h5mwovAGwJLpXJN9p9mKEpFyYAua5HUk%2F3XjrOHadiOstAiAUS%2FB%2F8lepyqa1vjU%2Be3GqNcrSTiaGfHqNsjjIx6re6EUlHdy2mJpgr%2B%2B2ZrasGhcWGTqeI81%2FHV8WIInb5%2FcmReHQ%2FBy9zESuPhV1Y5Z%2BRkCGyqd%2Fg4nx%2BqQEYmpIdix9gr80HRuVlyK0%2FNUWX3ZdNItvKuwO7yEAyx%2Bp1mF69eQ%2BuYV%2FIqWOUwT0zA0rgdadDav95alhz7CMZK5qd%2BJYr1OqQe1d4AOnaK5hqxR6t%2BCOMXf1jNVpslTZvrpcs19I4z4qcFB" rel="nofollow">压缩</a>命令</h6><pre><code>tar czvf xxx.tar 压缩目录
zip -r xxx.zip 压缩目录</code></pre><h6>解压缩命令</h6><pre><code>tar zxvf xxx.tar
# 解压到指定文件夹
tar zxvf xxx.tar -C /xxx/yyy/
unzip xxx.zip</code></pre><h2>变更文件所属用户, 用户组</h2><pre><code>chown eagleye.eagleye xxx.log</code></pre><h2>cp, scp, mkdir</h2><pre><code>#复制
cp xxx.log
# 复制并强制覆盖同名文件
cp -f xxx.log
# 复制文件夹
cp -r xxx(源文件夹) yyy(目标文件夹)
# 远程复制
scp -P ssh端口 username@10.10.10.101:/home/username/xxx /home/xxx
# 级联创建目录
mkdir -p /xxx/yyy/zzz
# 批量创建文件夹, 会在test,main下都创建java, resources文件夹
mkdir -p src/{test,main}/{java,resources}</code></pre><h6><a href="https://link.segmentfault.com/?enc=fvhLAJLO3eFP6zkofVpP5Q%3D%3D.T%2BHtv2fC%2FHKxA01Dz77Skw9cfdGa6HuwETcWq6hr3YeIm3ATXNAQxDVmNpNe84yCoCIECDxWsLtsVDfO4wj0Q%2Bi%2BkhzOe8MeACEI8I85Q3Dt1pO9EbIsr5AiOFnrH1ygDjI6pSYLHfreT3tIJf8kNG36Tqac7QjIUD9YuNl0v3jJB%2FhxZ6KXxh7h%2BVL11kpVldUNCV2aGPx%2F0lQqKJ6pv6XR2EIPsfN4BbL8t28GYWGhxJ9Lf1ZdDErzc3zf6ALpICkOVarzaxNuShWuJqM5Zk7eFJIkSuypJWkDvKOV0BHdadbmw3Z86%2BsiIu7xz5u5" rel="nofollow">比较</a>两个文件</h6><pre><code>diff -u 1.txt 2.txt</code></pre><h6>日志输出的字节数,可以用作性能测试</h6><pre><code># 如果做性能测试, 可以每执行一次, 往日志里面输出 “.” , 这样日志中的字节数就是实际的性能测试运行的次数, 还可以看见实时速率.
tail -f xxx.log | pv -bt</code></pre><h6>查看, 去除特殊字符</h6><pre><code># 查看特殊字符
cat -v xxx.sh
# 去除特殊字符
sed -i 's/^M//g’ env.sh 去除文件的特殊字符, 比如^M: 需要这样输入: ctrl+v+enter</code></pre><h6>处理因系统原因引起的文件中特殊字符的问题</h6><pre><code># 可以转换为该系统下的文件格式
cat file.sh > file.sh_bak
# 先将file.sh中文件内容复制下来然后运行, 然后粘贴内容, 最后ctrl + d 保存退出
cat > file1.sh
# 在vim中通过如下设置文件编码和文件格式
:set fileencodings=utf-8 ,然后 w (存盘)一下即可转化为 utf8 格式,
:set fileformat=unix
# 在mac下使用dos2unix进行文件格式化
find . -name "*.sh" | xargs dos2unix</code></pre><h6><a href="https://link.segmentfault.com/?enc=fvSNGFARIH46CLWyd9vI9A%3D%3D.UKrg7oiN%2Fql8Y03k2pWtz%2Bo6lME43KvY7blBbMSyuJIGBSjmG1n88O2%2Fj9GlaYd6BPZ8Wm2g7YWEhPXOX2WEoy65PnK8oFmk1Adbb4%2B27Gew1aqGPCeY7eL%2Fs8YAKkrYbqBuMdhdY%2BM4yRoTKzgOdVj8bSz7uS7ZXXVIT76HZQOrjGqHRqZe%2BZRBFKFFel1KbBvwzsWWmwLmv%2FrWkAu1R3YKf59Tzk2kOGx3Q%2FJNNkq95UaTC4L78uYWCD1q9n44oire2nFldTvrBPkAgaimWczwwEOu3%2BOJ%2BtA5pH4ugyAUY46ZbVPPa88EJYtq3cSu" rel="nofollow">tee</a>, 重定向的同时输出到屏幕</h6><pre><code>awk ‘{print $0}’ xxx.log | tee test.log</code></pre><h2>检索相关</h2><h6>grep(<a href="https://link.segmentfault.com/?enc=eb4mM%2B39I07BQVjwDk5uGw%3D%3D.2mRCw%2B2Jsc%2Bquwj9YpjLwkvQ43QqibfAZutK%2Bq22s%2FAzLUVjllTcanRLChVMUeBUFzDUA9Rjdaeto8v8e1762DRYB7jl24g60pOB2SBQGQmaMeEFqO%2B%2FR%2BgJyfM%2F%2FFf5TUNVPF7wOTddu%2FUV6UKqg3l5C0DdEs9k1V6sH0pCbe77hxLm8iojkBzXvhocO9rmuXBxg5Yi7ZORU00Q3iQ6LBfvtEZ5yun%2Bw0KQN5%2FS8EjQvFahqM791lI1%2BH98i9xLDOnN0aI5Yz7jEWBnFhBHHKFZSO9F%2BvZUZqnvFV9bUNfuAa04kyYkuobSDLE4YgCw" rel="nofollow">每天学一个 Linux 命令(5):grep</a>)</h6><pre><code># 反向匹配, 查找不包含xxx的内容
grep -v xxx
# 排除所有空行
grep -v '^/pre>
# 返回结果 2,则说明第二行是空行
grep -n “^$” 111.txt
# 查询以abc开头的行
grep -n “^abc” 111.txt
# 同时列出该词语出现在文章的第几行
grep 'xxx' -n xxx.log
# 计算一下该字串出现的次数
grep 'xxx' -c xxx.log
# 比对的时候,不计较大小写的不同
grep 'xxx' -i xxx.log</code></pre><h6>awk(<a href="https://link.segmentfault.com/?enc=%2FtbsPrAWP%2BeRwlDiKkzgMw%3D%3D.NcL1v1piHzkWL70YT7BUAOc0w1d4pGVtV%2Bj9DSTU8QyLW7XCQ2pHuSn0WGTY7spm7%2BMN8%2FLQnG2W0ZihcewdtbPlbE7rVpTtcT6VRqt8UqthV36vacjJdUvmuALVYLMUd3myPq4eVhBRrkZgTZFvQVtMP%2BrqkNdIfhS9OY%2Bsq9NfHJ06dxw%2F3dXdjcpDq8zpjpcypvMDRlu%2FoOuuG%2BZfUwiVAlldFSCL9%2FKe3MVjqYEkMJgXd4BUuCKcij%2FgT%2FbKPI5XL0ejsg3f6J51uPV158ouJepwwlMWNEPgd64FDkMr6QGy2pgrA%2FpIkpVmJnrl" rel="nofollow">每天一个 Linux 命令(4):awk</a>)</h6><pre><code># 以':' 为分隔符,如果第五域有user则输出该行
awk -F ':' '{if ($5 ~ /user/) print $0}' /etc/passwd
# 统计单个文件中某个字符(串)(中文无效)出现的次数
awk -v RS='character' 'END {print --NR}' xxx.txt</code></pre><h6>find检索命令(<a href="https://link.segmentfault.com/?enc=DNjcmIAsQsQS4peV7lfZ%2Bw%3D%3D.hWzY%2FcwazSuSFsF59wOYAtioBHGM7J2UonEqid0c6ilUUYZI%2FOdoKJs1jqSkThTW8wNZtvWBC8SMrqP79msD7dWLa8jeSLFP0LW5panUPMCq5gz%2Fm8WYm6xqEShLCDLnWUcBpmgPpMZpdm5YfrU0oi6uf5kDaAfzWAK9floQ%2FIKhivR4o5uoK4ZfrLjUN1L9JPvqInj2arFFcQuPKydcyh9aNM4UpYIQzBGkR5Vunx2aQHta%2BNVQVdQg2pdoXeAxdFBp4ZULQvjrTiwrmOV%2FFb1XajZqsnrOZwivhWFlmgXmJXxtxAQLe44%2FLpWp6Mak" rel="nofollow">每天学一个 Linux 命令(20):find</a>)</h6><pre><code># 在目录下找后缀是.mysql的文件
find /home/eagleye -name '*.mysql' -print
# 会从 /usr 目录开始往下找,找最近3天之内存取过的文件。
find /usr -atime 3 –print
# 会从 /usr 目录开始往下找,找最近5天之内修改过的文件。
find /usr -ctime 5 –print
# 会从 /doc 目录开始往下找,找jacky 的、文件名开头是 j的文件。
find /doc -user jacky -name 'j*' –print
# 会从 /doc 目录开始往下找,找寻文件名是 ja 开头或者 ma开头的文件。
find /doc \( -name 'ja*' -o- -name 'ma*' \) –print
# 会从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。-exec 选项是执行的意思,rm 是删除命令,{ } 表示文件名,“\;”是规定的命令结尾。
find /doc -name '*bak' -exec rm {} \;</code></pre><h2>网络相关</h2><h6>查看什么进程使用了该端口</h6><pre><code>lsof -i:por</code></pre><h6>获取本机ip地址</h6><pre><code>/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"</code></pre><h6><a href="https://link.segmentfault.com/?enc=FUOnI5cKqYS87FYJ0izNdw%3D%3D.HDkyEIDiM6ND9NF6l%2B60prZ1vsV%2BFABuaHyDgG02%2BOr0jSJaqWtRey51g14LB82YtWKLqctQzUh12uKvbUFbDk1J7XnRXXglXTVkiPzEnXpWQfLA4659ckcSVMgfOAQRsE6TmgVUHTIynpC6wHR0q1RkjGmj00Z7oQflEiSuwna9iQidoqYDpdNb4mDxLjq3rXNpo4xTdCBB3LIsMoHZ9cfi1Ywl4WjA9vwpy0B1uThSZEhpWC%2Flp5cQ9IlajD1QGbeXuYDiWS75FWcFrh6C7nPCA8CJQDqvx5niGLy3Yv0qC0rEcW2D0wu8QYOd0Oz4" rel="nofollow">iptables</a></h6><pre><code># 查看iptables状态
service iptables status
# 要封停一个ip
iptables -I INPUT -s ***.***.***.*** -j DROP
# 要解封一个IP,使用下面这条命令:
iptables -D INPUT -s ***.***.***.*** -j DROP
备注: 参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放弃连接。
#开启9090端口的访问
/sbin/iptables -I INPUT -p tcp --dport 9090 -j ACCEPT
# 防火墙开启、关闭、重启
/etc/init.d/iptables status
/etc/init.d/iptables start
/etc/init.d/iptables stop
/etc/init.d/iptables restart</code></pre><h6>nc命令, tcp调试利器</h6><pre><code>#给某一个endpoint发送TCP请求,就将data的内容发送到对端
nc 192.168.0.11 8000 < data.txt
#nc可以当做服务器,监听某个端口号,把某一次请求的内容存储到received_data里
nc -l 8000 > received_data
#上边只监听一次,如果多次可以加上-k参数
nc -lk 8000</code></pre><h6>tcpdump(<a href="https://link.segmentfault.com/?enc=%2FrDbJ%2FETp8u29EayPReVDQ%3D%3D.zp2ztVwVQjDtHFQpaHT8wBaf7oKs3GY1HA4dMFbl6N6xa6%2F3zN%2Fpqd5S02Wc5x%2FVe1RqBr%2BmCUnN4vI2PF3bO3RJMIsDWnS7nC8CBtXS11m6ehGw6iB7WMEM3E5mPIooOT%2FuBpHS0axEgbsvzBMNwZ9Z1gX3nFLoSUOFdW%2BIyjlotqhizp0COhZXkQCMdxeMK0vLHP7ciyt2RO0qlOf9ANYbophr7%2BnbwOCX3mRrOMfxiQys3LXsCSzfIQPG0ipXK9uMIKcKPAQCQxN16gFoZRDVdyERKdyfFbx0cwQ0K8wlIJ66ic6vj775Dn%2FJI5%2BC" rel="nofollow">每天学一个 Linux 命令(72):tcpdump</a>)</h6><pre><code># dump出本机12301端口的tcp包
tcpdump -i em1 tcp port 12301 -s 1500 -w abc.pcap</code></pre><h6>跟踪网络路由路径</h6><pre><code># traceroute默认使用udp方式, 如果是-I则改成icmp方式
traceroute -I www.163.com
# 从ttl第3跳跟踪
traceroute -M 3 www.163.com
# 加上端口跟踪
traceroute -p 8080 192.168.10.11
ss
# 显示本地打开的所有端口
ss -l
# 显示每个进程具体打开的socket
ss -pl
# 显示所有tcp socket
ss -t -a
# 显示所有的UDP Socekt
ss -u -a
# 显示所有已建立的SMTP连接
ss -o state established '( dport = :smtp or sport = :smtp )'
# 显示所有已建立的HTTP连接
ss -o state established '( dport = :http or sport = :http )'
#找出所有连接X服务器的进程
ss -x src /tmp/.X11-unix/*
#列出当前socket统计信息
ss -s
解释:netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及</code></pre><h6><a href="https://link.segmentfault.com/?enc=KtzKVx8r%2F7KPfz6iJZ%2Fr5A%3D%3D.QfFDTGvR7D4V%2FAbK96Xs5%2BNH2XOV52L3Ly111FfZGAoibwu4ir5oyhZDInorKpEA2t%2BACm4e255%2FjLotQmfYrIB3Du3GLob45wEp%2FH8dAdpM23Bj70J2haIe5nE1Zo5%2F7ze1KR9KnjDb7qYXW%2BsOtGzrNi0YNrPnk4UU0sgmymH9LLWCDZLezm5T%2BhnCteqOS5r%2FSCGszEznG6tAxOwONyEUtBduJ4A7IauD3tXeSIoeu4gwHlH1z%2F8SJuAsH4caCab0om5INN4%2F67Dxwg%2BbDll1JNd7lTTHnU4t05GlfImzAmA87T%2F8sjS7vKfmE9IZ" rel="nofollow">netstat</a></h6><pre><code># 输出每个ip的连接数,以及总的各个状态的连接数
netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'
# 统计所有连接状态,
# CLOSED:无连接是活动的或正在进行
# LISTEN:服务器在等待进入呼叫
# SYN_RECV:一个连接请求已经到达,等待确认
# SYN_SENT:应用已经开始,打开一个连接
# ESTABLISHED:正常数据传输状态
# FIN_WAIT1:应用说它已经完成
# FIN_WAIT2:另一边已同意释放
# ITMED_WAIT:等待所有分组死掉
# CLOSING:两边同时尝试关闭
# TIME_WAIT:主动关闭连接一端还没有等到另一端反馈期间的状态
# LAST_ACK:等待所有分组死掉
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
# 查找较多time_wait连接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20</code></pre><h2>监控linux性能命令</h2><h6>top</h6><p>按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序, 然后回车。而大写的 R 键可以将当前的排序倒转。<a href="https://link.segmentfault.com/?enc=enF9AwYEVDRd1029ah96uQ%3D%3D.9B%2FQBF5k34vuJl1H5QsMYqtHHjTxEnKySViO7Q8OKalCTXh1sAySGtb9vjyuCbizkff2DSK0nz6poQCqo9mAMs5avsjOpMEojEKDrgmS1A4hj22xjMA1oYsJBSTFLtw2OIKKCNy0sqaDOb4z7TxMhxFFkbzo%2Fs1KqYQ7L%2FevbRRsEai5k%2BFLRaKXYjWOF%2FA5D70VFx4yFrkVUBVP9ELjpFQ8qw%2B4h6mPZB2TC0E2PiVQc6l2heiVJflRIqN8AbrWbtoPzPMPw3qs6TPIKGVKsCkWkxlEYnt6dpPWgTF%2BLyipC0SFyzGEt6EaBa1QJQfs" rel="nofollow">每天学一个 Linux 命令(48):top</a></p><pre><code>PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
S 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志,参考 sched.h</code></pre><h6>dmesg,查看系统日志</h6><pre><code>dmesg</code></pre><h6>iostat,磁盘IO情况监控</h6><pre><code>iostat -xz 1
# r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
# await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
# avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
# %util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。
# 如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。</code></pre><h2><a href="https://link.segmentfault.com/?enc=IjsOrl2LTF3EeHEoP0CiEw%3D%3D.OQCaICycBFsIbA5Lg88NHHQVoKOeMMddp7ul%2BevZAa8Jnj154x5hiv9I7mfFvrWbnUu49JsQKKwi7DZa2DHY8EShWMmkQ1wi%2BLxFBswAGYSUBGujDKsa9lZYMDie7yrbOHP3KNJM%2BLzJ7HHnfnnsMwvI4acm5yAxPNRlLIc%2FdgMGS8eKwltZxLCdsVrQ8LUgeoGffdNvZPEe98BBWPji7He1127WGEiu3TRyFDx89iir%2BtzbBAabeQiVGm%2BnhRRy5lqjrIQW6RfSU9%2Ff9Qq%2BZIVdbNCUhwTGo4EUEnEy6iLdOumFe5YAjE%2B7j07AZyxC" rel="nofollow">free,内存</a>使用情况</h2><pre><code>free -m
eg:
total used free shared buffers cached
Mem: 1002 769 232 0 62 421
-/+ buffers/cache: 286 715
Swap: 1153 0 1153</code></pre><p>第一部分Mem行:</p><pre><code>total 内存总数: 1002
Mused 已经使用的内存数: 769M
free 空闲的内存数: 232M
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数: 62M
cached Page 缓存内存数:421M</code></pre><p>关系:total(1002M) = used(769M) + free(232M)</p><p>第二部分(-/+ buffers/cache):</p><pre><code>(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)</code></pre><p>可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数.</p><p>第三部分是指交换分区</p><h6>sar,查看网络吞吐状态</h6><pre><code># sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。
sar -n DEV 1
#
# sar命令在这里用于查看TCP连接状态,其中包括:
# active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
# passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
# retrans/s:每秒TCP重传数量;
# TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包
sar -n TCP,ETCP 1</code></pre><h6>vmstat, 给定时间监控CPU使用率, 内存使用, 虚拟内存交互, IO读写</h6><pre><code># 2表示每2秒采集一次状态信息, 1表示只采集一次(忽略既是一直采集)
vmstat 2 1
eg:
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0</code></pre><ul><li>r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。</li><li>b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。</li><li>swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。</li><li>free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。</li><li>buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M</li><li>cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)</li><li>si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。</li><li>so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。</li><li>bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒</li><li>bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。</li><li>in 每秒CPU的中断次数,包括时间中断</li><li>cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。</li><li>us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。</li><li>sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。</li><li>id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。</li><li>wt 等待IO CPU时间。</li></ul><p>需要了解与学习更多Linux系统命令的读者可以参考:<a href="https://link.segmentfault.com/?enc=gtlktdCngtf1nkrOu%2Fr3LA%3D%3D.v6Y7SdD83%2B6Qa0JqtGXqf8zFBFz3WLzMSV459IIBfu%2ForaCZyLhULTkU%2BeBXiPHEL1mVhTtK4XTk0RAl2v6OhOtZIbZOlqWruRJ0uM5ky5pdJyzR9EdW0HwHR9%2B8Aq%2BaDiO4j4x8qVpsa%2FZs7bY7e%2B9guySpAUOD9JkBHMHCdDojHqcs2Re%2BzfFGQ9DReLb4lpGM8woa7zDxqOpXPM5iAD6iVqtTf1Yy0GYjlBBh4SVHptcaW1hO%2FNRzT92h596cLhxPOyRBgIHC2DXWwSmOVsqXo4Yl07oCSxb2M8NXnic1ibDK7IhkI%2F8DyCvtm5Cg" rel="nofollow">120 个《 必知必会的 Linux 系统常用命令 》</a></p><p>来源:siye1982.github.io/2016/02/25/linux-list</p><p><img src="/img/bVcThja" alt="image.png" title="image.png"></p>
2021 年年度蕞佳开源软件!
https://segmentfault.com/a/1190000041229389
2022-01-05T15:37:53+08:00
2022-01-05T15:37:53+08:00
民工哥
https://segmentfault.com/u/jishuroad
4
<h2>Svelte</h2><p><a href="https://link.segmentfault.com/?enc=QcVshsTWp31zrWm8VTDo3w%3D%3D.sctg5ridkAG2%2BAwYYcpNQXegJnFncqjRS38FyAi4RxE%3D" rel="nofollow">https://svelte.dev/</a></p><p><img src="/img/remote/1460000041229391" alt="图片" title="图片"></p><p>Svelte 是一种全新的构建用户界面的方法。传统框架如 React 和 Vue 在浏览器中需要做大量的工作,而 Svelte 将这些工作放到构建应用程序的编译阶段来处理。</p><p>与使用虚拟(virtual)DOM 差异对比不同。Svelte 编写的代码在应用程序的状态更改时就能像做外科手术一样更新 DOM。</p><h2>Minikube</h2><p><a href="https://link.segmentfault.com/?enc=GpSriCux%2Forf50qoutYDBw%3D%3D.hcL9d%2BDMdoy8VUt7kULHf8sbIRVtmVkM0fi3qkCbT3I%3D" rel="nofollow">https://minikube.sigs.k8s.io/</a></p><p><img src="/img/remote/1460000041229392" alt="图片" title="图片"></p><p>Minikube 可以在本地单机上运行Kubernetes集群的工具。Minikube可跨平台工作,不需要虚拟机,不需要在MacOS或Windows上安装Linux。支持多种容器,如Docker,CRI-O,Containerd等。</p><h2>Pixie</h2><p><a href="https://link.segmentfault.com/?enc=Qtizr4xBsOj64RNrZ%2FtRVA%3D%3D.g7QYPe6sMMk%2B57Wi8CAxKg%3D%3D" rel="nofollow">https://px.dev</a></p><p><img src="/img/remote/1460000041229393" alt="图片" title="图片"></p><p>Pixie是查看Kubernetes的工具。可查看Kubernetes集群的状态,比如,服务器集群性能,网络状况,集群资源已经相关应用程序等。还可以查看更详细的内容,比如,pod状态,请求量,热点图等。Pixie的资源占用仅有5%左右。</p><h2>FastAPI</h2><p><a href="https://link.segmentfault.com/?enc=JxM4%2B4bQeeOG2z3VSaIWBA%3D%3D.n2O1rO6TNdDL%2Bf5jaQuS8u1Q7ixAPkEMxt7W7sUFeBk%3D" rel="nofollow">https://fastapi.tiangolo.com/</a></p><p><img src="/img/remote/1460000041229394" alt="图片" title="图片"></p><p>FastAPI是一个Python网页框架。FastAPI以其高效、易用赢得了开发者的青睐,直接挑战了Django和Flash的传统地位。FastAPI的优点是,类型检查、自动 swagger UI、支持异步、强大的依赖注入。</p><h2>Crystal</h2><p><a href="https://link.segmentfault.com/?enc=6o1DVEyAMbIWs4TWSin9Tg%3D%3D.l300cU6GsGxh9eDq7owKEl56%2BqRrlZOY4J0FwGTQjpc%3D" rel="nofollow">https://crystal-lang.org/</a></p><p><img src="/img/remote/1460000041229395" alt="图片" title="图片"></p><p>Crystal已经面试很多年了,Crystal的特点是兼具C语言的高效和Ruby的静态类型。今年初已经发布了1.0版本,目前最新版本为1.2.1,已经足够稳定。</p><h2>Microsoft Terminal</h2><p><a href="https://link.segmentfault.com/?enc=NdiK7xcCM7DRC1zq3ZNaQA%3D%3D.T%2FdFFbNnOTPk2ds7HWXrTPuMGLjNRypwiLIOMtcxpqrnM7fOFkEuKI8DPM0UvmAQ" rel="nofollow">https://github.com/Microsoft/...</a></p><p><img src="/img/remote/1460000041229396" alt="图片" title="图片"></p><p>Microsoft Terminal 是一个开源的Windows的终端,提供类似Mac和Linux命令行的体验。Microsoft Terminal具有GPU加速渲染,较传统控制台具有更好的性能提升。</p><h2>OBS Studio</h2><p><a href="https://link.segmentfault.com/?enc=nR4HBeFVCYSw%2BqEzfOsZUQ%3D%3D.jjXZYQCJgG7t59xKaTXCRJkEov8Fp01oxfgoPxSyW5c%3D" rel="nofollow">https://obsproject.com/</a></p><p><img src="/img/remote/1460000041229397" alt="图片" title="图片"></p><p>OBS Studio 是一款用于直播和屏幕录制的软件,为高效捕获,合成,编码,记录和流传输视频内容而设计,支持所有流媒体平台。快捷键可让试图平滑切换,甚至还有画中画和实时字幕的新功能。</p><h2>Shotcut</h2><p><a href="https://link.segmentfault.com/?enc=8J6Vxbjyxkjlp0larktQlA%3D%3D.aTJd%2F0DwpWuab86kFDXt8YO9247J7%2FG4wa6sb8%2BXrkc%3D" rel="nofollow">https://shotcut.org/</a></p><p><img src="/img/remote/1460000041229398" alt="图片" title="图片"></p><p>Shotcut是一个强大的视频编辑工具。Shotcut具有中文版支持,可在Windows,MacOS,Linux,BSD等操作系统上运行,Shotcut具有数百种音频、视频格式,以及编解码器,且无需导入,可直接编辑。</p><h2>Weave GitOps</h2><p><a href="https://link.segmentfault.com/?enc=iDmnYjPA9ou7fHcGunrlqA%3D%3D.wdG2fg6sfnYA%2Bm2B3OjRUFny2hiWNaHg97fZ4Q3OjFp9qVl9BUR4%2FBGplSrmKBxK" rel="nofollow">https://github.com/weaveworks...</a></p><p><img src="/img/remote/1460000041229399" alt="图片" title="图片"></p><p>Weave GitOps 是一个GitOps工具。其目的是简化DevOps的工作流程,通过声明配置使Kubernetes更加稳定和安全。Weave GitOps 基于 云原生基金会的 Flux。</p><h2>Apache Solr</h2><p><a href="https://link.segmentfault.com/?enc=p%2FBTQA%2Fw7cLfy2%2FgctPE5A%3D%3D.CMc%2FB9e6sdinis%2B8oYQJhB6izt1tibgPEAANoCeAeJE%3D" rel="nofollow">https://solr.apache.org/</a></p><p><img src="/img/remote/1460000041229400" alt="图片" title="图片"></p><p>Apache Solr 是基于 Lucene 的全文搜索服务器,也是最流行的企业级搜索引擎。Solr 放弃了开源的许可证,不过现在仍然是免费的。Solr 可集群部署、可在云端部署,甚至包括 LTR 算法,可自动调整加权结果。</p><h2>MLflow</h2><p><a href="https://link.segmentfault.com/?enc=tvCnEd4kDdNDvaSjxu4hjQ%3D%3D.o9Ep9mgg4GOSp3GfCJSUrVgK0nfHkJaYqoYRzqV7Btc%3D" rel="nofollow">https://mlflow.org/</a></p><p><img src="/img/remote/1460000041229401" alt="图片" title="图片"></p><p>MLflow 是由 Apache Spark 技术团队开源的一个机器学习平台。MLflow 由 Databricks 创建,并由 Linux 基金会托管,是一个 MLOps 平台,可让用户跟踪、管理和维护各种机器学习模型、实验及其部署。MLflow提供了记录和查询实验(代码、数据、配置、结果)的工具,将数据科学代码打包成项目,并将这些项目接入工作流程。</p><h2>Orange</h2><p><a href="https://link.segmentfault.com/?enc=uxUXHuur9fOe%2FO2HFuY87Q%3D%3D.By7i2KsI1B1fsRxDgsC95FGUsD0062YrtHTg7jB69QY%3D" rel="nofollow">https://orangedatamining.com/</a></p><p><img src="/img/remote/1460000041229402" alt="图片" title="图片"></p><p>Orange 是一款用于开源机器学习和数据可视化的工具。Orange与 R Studio 和 Jupyter等程序化或文本工具相比,Orange 更直观易操作。Orange 包含了完整的一系列的组件以进行数据预处理,并提供了数据帐目,过渡,建模,模式评估和勘探的功能。</p><h2>Flutter</h2><p><a href="https://link.segmentfault.com/?enc=%2B5e0Z7629Nm7avT7yhg2lg%3D%3D.ZwRdYNfUVO7iMFdpfCnhNRf2iWudWKr4n8AC%2Bzlgde4%3D" rel="nofollow">https://flutter.dev/</a></p><p><img src="/img/remote/1460000041229403" alt="图片" title="图片"></p><p>Flutter是谷歌推出的一个新用于构建跨平台的手机、网页、桌面,嵌入式设备应用的SDK。Flutter 的组件,比如,滚动条、导航、图标和字体,整合了IOS和安卓平台的差异。</p><h2>Apache Superset</h2><p><a href="https://link.segmentfault.com/?enc=rHaPfpr1%2BvQT2UnaiqugGw%3D%3D.0MQwyusmGviRRxmeNiXeCzvO8HUnnDSlFoN3r96taawMx5O6istMPkFwKRuTUexq" rel="nofollow">https://github.com/apache/sup...</a></p><p><img src="/img/remote/1460000041229404" alt="图片" title="图片"></p><p>Apache Superset是一个现代的、轻量级可视化BI分析工具。Apache Superset在可视化、易用性和交互性上非常有特色,用户可以轻松对数据进行可视化分析。而且Apache Superset 已经达到企业级商业软件的水平。</p><h2>Presto</h2><p><a href="https://link.segmentfault.com/?enc=LQHxs0szV%2BXVhIZN%2FORiQg%3D%3D.HVlCx8%2B5WYP2BV2o76FF38o51DVEBzIXKoVQIOV99ew%3D" rel="nofollow">https://prestodb.io/</a></p><p><img src="/img/remote/1460000041229405" alt="图片" title="图片"></p><p>Presto 是一个开源的分布式 SQL 引擎,用于集群中的在线分析处理。Presto 可以查询各种各样的数据源,从文件到数据库,并将结果输出到BI和分析环境。更重要的是,Presto 可以在 Hive、Cassandra、关系型数据库中进行查询,而且Presto 还可以结合多个来源的数据查询。</p><p>脸书、Uber、推特和阿里巴巴创立了 Presto 基金会。其他成员现在包括 Alluxio、Ahana、Upsolver 和英特尔。</p><h2>Apache Arrow</h2><p><a href="https://link.segmentfault.com/?enc=SMyjv6YExfITXEF6NR52cA%3D%3D.6FDRekGPsKbFD%2B8xN9TPm3kZifsX5WSAVHPryiOGjqw%3D" rel="nofollow">https://arrow.apache.org/</a></p><p><img src="/img/remote/1460000041229406" alt="图片" title="图片"></p><p>Apache Arrow 是一个列式内存分析层,旨在为CPU和GPU上加速大数据的分析。它包含了一套平面和分层数据的典型内存表示,Arrow 内存格式支持零拷贝读取,并且不必序列化的情况下访问数据极快。目前Apache Arrow支持的语言包括 C、C++、C#、Go、Java、JavaScript、Julia、MATLAB、Python、R、Ruby 和 Rust。</p><h2>InterpretML</h2><p><a href="https://link.segmentfault.com/?enc=t%2BWkmPj7nHbuJl%2Bjmd6Reg%3D%3D.%2FhHSElZ1b8TcqNnDyzzECPxkgxBq5UCEX6Cz0DnEdKE%3D" rel="nofollow">https://interpret.ml/</a></p><p><img src="/img/remote/1460000041229407" alt="图片" title="图片"></p><p>InterpretML是微软推出的可解释机器学习包。其中包含了几个最先进的机器学习可解释性技术。InterpretML提供了两类解释性类型:明箱(glassbox) 模型和黑箱(blackbox)模型。InterpretML 可让实践者通过在一个统一的 API 下,借助内置的可扩展可视化平台,使用多种方法来轻松地比较可解释性算法。InterpretML 也包含了可解释 Boosting 机(EBM)的首个实现,这是一种强大的可解释明箱模型,可以做到与许多黑箱模型同等准确。</p><h2>Lime</h2><p><a href="https://link.segmentfault.com/?enc=y9fal5zTyokhLKQeNRC8Jw%3D%3D.%2Bpmqg3WWmPu6jQNx5sxg%2BlgD5OWaU6kz8vC19alfLnTAz%2Bp9Pcnz2A52KI1BJ%2Bxk" rel="nofollow">https://github.com/marcotcr/lime</a></p><p><img src="/img/remote/1460000041229408" alt="图片" title="图片"></p><p>Lime(Local interpretable model-agnostic explanations 局部可解释模型-不可知解释的缩写),Lime用于表格或图片的解释机器学习的分类器。Lime 能够解释两个或更多类的黑盒分类器。分类器实现了一个函数,该函数接收原始文本或 numpy 数组并输出每个类的概率。</p><h2>Dask</h2><p><a href="https://link.segmentfault.com/?enc=TajN0FKD4QoJsAmP7qobhw%3D%3D.M3sAVN%2B9jhP2YVTRT4USSHrRuzgQYyQqR5fiTNa7m4s%3D" rel="nofollow">https://dask.org/</a></p><p><img src="/img/remote/1460000041229409" alt="图片" title="图片"></p><p>Dask 是一个用于并行计算的开源库,可将 Python 包扩展到多台机器上。Dask 可将数据和计算分布在多个 GPU 上,即可在单一系统也可在多节点集群中运行。Dask 可与 Rapids cuDF、XGBoost 和 Rapids cuML 集成,用于 GPU 加速的数据分析和机器学习。Dask还可与 NumPy、Pandas 和 Scikit-learn 集成进行并行化工作。</p><h2>BlazingSQL</h2><p><a href="https://link.segmentfault.com/?enc=pIr21mYFln7wYIiMaAd7HQ%3D%3D.f6O3N239qOqSN3xaeHrCkXv3hWo3TSLb%2BfvGdyLDW3o%3D" rel="nofollow">https://blazingsql.com/</a></p><p><img src="/img/remote/1460000041229410" alt="图片" title="图片"></p><p>BlazingSQL 是一个基于 Rapids 生态系统构建的 GPU 加速 SQL 引擎。BlazingSQL基于 Apache 2.0 许可证开源。BlazingSQL是cuDF的SQL接口,具有支持大规模数据科学工作流(包括提取,转换,加载)和企业数据集的各种功能。</p><h2>Rapids</h2><p><a href="https://link.segmentfault.com/?enc=YlpI5FjuyjyXSs0J6SvlgA%3D%3D.rZLA3SmDnLuIPWfxJMUJmTdJNJyOQGJvrN1oliU3ZyE%3D" rel="nofollow">https://rapids.ai/</a></p><p><img src="/img/remote/1460000041229411" alt="图片" title="图片"></p><p>Nvidia 的 Rapids是由英伟达开源的一款开源机器学习GPU加速平台。Rapids 使用英伟达 CUDA 基元进行底层计算优化,通过Python 将 GPU 的并行和高带宽内存以接口方式向外开放。Rapids 依赖于 Apache Arrow 柱状内存格式,包括cuDF(类似 Pandas 的 DataFrame 库);cuML(机器学习库集合,提供 Scikit-learn 中大多数算法的 GPU 版本);以及cuGraph(类似 NetworkX 的加速图分析库)。</p><h2>PostHog</h2><p><a href="https://link.segmentfault.com/?enc=x5AIZuTHbVIYIozN%2BwWPzw%3D%3D.8R9WZhgu5Vu1s2YMOIHnhOHj8X4j6jC%2BDbnpgqF7AZ0%3D" rel="nofollow">https://posthog.com/</a></p><p><img src="/img/remote/1460000041229412" alt="图片" title="图片"></p><p>PostHog 是一个为开发者构建的开源产品分析平台。自动收集网站或应用程序上的每个事件,无需向第三方发送数据。PostHog 提供基于用户事件的分析,捕获网站的使用数据,统计各用户在网站中的具体操作。PostHog会自动捕获点击次数和综合浏览量,以分析网站用户在做什么,而无需手动推送事件。</p><h2>LakeFS</h2><p><a href="https://link.segmentfault.com/?enc=3z078QKRaI1bN1lKO4od7Q%3D%3D.NgvLdA1XrvE2v2Juk8VgagovnQ7upOmZHDOVoYiW27I%3D" rel="nofollow">https://lakefs.io/</a></p><p><img src="/img/remote/1460000041229413" alt="图片" title="图片"></p><p>LakeFS 提供了一种"像管理代码一样管理数据湖"的方式,独特引入类似Git功能来管理数据的版本。LakeFS 可以帮助用户创建独立、零拷贝(Zero-copy)的数据分支,且在运行、测试和建模分析中,又不存在破坏共享对象的风险。与Git类似,LakeFS 的数据中会带有提交记录、元数据字段和回滚等信息,此外还有hooks,即在分支合并到主分支前,hooks会检查数据,确保完整性和质量。Amazon S3 和 Azure Blob已在使用 LakeFS。</p><h2>Meltano</h2><p><a href="https://link.segmentfault.com/?enc=DuDWUYC%2BUT1w1Gn6L5XecA%3D%3D.MdlwWGI7ONTM9G319NsK13brJUMFt01iIC7fTvrSTu0%3D" rel="nofollow">https://meltano.com/</a></p><p><img src="/img/remote/1460000041229414" alt="图片" title="图片"></p><p>Meltano始于2018年GitLab的内部项目,服务于 GitLab 数据管理。2021年从GitLab独立出来成为一个初创公司。</p><p>Meltano是一款免费 DataOps 时代的ETL工具,旨在替代替代传统 ELT的工具,ELT是指数据提取、加载、转换操作的统称。</p><p>Meltano特点是开源、自托管、CLI(命令行)、可调试和可扩展。</p><p>Meltano创建管道即代码的概念,Meltano项目可进行版本控制、代码审查、持续集成和部署 (CI/CD )以及容器化等。</p><h2>Trino</h2><p><a href="https://link.segmentfault.com/?enc=%2BFWTH2AYsNe8DlUZNDfYIQ%3D%3D.ejeALA3m9wRJBIKeRzkQZaA316arHgW99ZddIoq1hto%3D" rel="nofollow">https://trino.io/</a></p><p><img src="/img/remote/1460000041229415" alt="图片" title="图片"></p><p>Trino 用于大数据分析的快速分布式 SQL 查询引擎</p><p>2019年PrestoDB的开发者创建了一个名为PrestoSQL项目分支。由于所属基金会的转移,PrestoSQL于2020年12月更名为 Trino。</p><p>Trino是一款用于大数据分析且性能优越的分布式 SQL 分析引擎。Trino 可同时对EB 级数据湖和海量数据仓库进行高效查询。Trino 符合 ANSI SQL 的查询标准,可与 R、Tableau、Power BI、Superset 等 BI 工具配合使用。可在 Hadoop、S3、Cassandra、MySQL 的数据仓库中联合查询。</p><h2>StreamNative</h2><p><a href="https://link.segmentfault.com/?enc=tmDMFlqRubEvwXNwtK%2BlAw%3D%3D.o3KS8bn1hQpI005daSa7wgHKtastKyG9v4cuzx7m1VE%3D" rel="nofollow">https://streamnative.io/</a></p><p><img src="/img/remote/1460000041229416" alt="图片" title="图片"></p><p>StreamNative 是一款弹性部署且可扩展的消息和事件流平台,大大简化了实时报告和分析工具以及企业应用流的数据管道架设。StreamNative 将 Apache Pulsar 分布式流处理架构与 Kubernetes 和混合云支持等,以及企业级功能、大型数据、认证和授权、性能监控等工具相结合,既简化了应用程序的开发,又简化了流数据应用的部署和管理。</p><h2>Hugging Face</h2><p><a href="https://link.segmentfault.com/?enc=coSOd33CznhCvBu%2Bu8nXjg%3D%3D.8H5NEwdaXzsDW6H0jjISA78gmKwbBA4XVM%2BPlN99jz4%3D" rel="nofollow">https://huggingface.co/</a></p><p><img src="/img/remote/1460000041229417" alt="图片" title="图片"></p><p>Hugging Face是一个公司,也是一个网站。</p><p>Hugging Face 提供了以非常有用的深度学习资源库,比如深度学习的模型,数据集,还有网站的使用空间的等,不过大多是要付费的。</p><p>另外Hugging Face的主要产品是聊天机器人,为此Hugging Face 开发了自己的自然语言处理 (NLP) 模型,称为分层多任务学习 (HMTL) 并在PyTorch-Transformers下管理了一个预训练的 NPL 模型库。</p><h2>EleutherAI</h2><p><a href="https://link.segmentfault.com/?enc=KBVqplWbEWchqosKmHFMiQ%3D%3D.ve72zqXYOrlHWj9IuPgQNV6ViSX7OLG1ptA7PSoX8QQ%3D" rel="nofollow">https://www.eleuther.ai/</a></p><p><img src="/img/remote/1460000041229418" alt="图片" title="图片"></p><p>EleutherAI是一个开源的社区人工智能项目,旨在创建一个完全去中心化的、具有自治文明的单例人工智能。EleutherAI 项目始于 2011 年,任何能连接互联网且有GitHub 帐户的人都可以参与。社区成员可通过提交开发功能以或提案来参与项目。EleutherAI 的开发者每周会更新项目进度,这些更新会在 YouTube 上进行现场直播。</p><p>2021年 EleutherAI 发布了The Pile,是一个 825GB 用于训练的多样化文本数据集;并在6月公布了 GPT-J,一个 60 亿参数的模型,大致相当于 OpenAI 的 GPT-3 的居里变量。随着 GPT-NeoX 的出现,EleutherAI计划将参数一直提高到 1750 亿,发起了争夺最大GPT-3模型的挑战赛。</p><p>补充,OpenAI的 GPT-3 模型在文本生成方面实现了惊人的飞跃,甚至具有了人类级别的性能。但其API始终未能完全开放,目前只有 OpenAI 和微软内部才有完全访问全部训练集。</p><h2>Colab notebooks for generative art/Colab notebooks用于生成艺术品</h2><p>首先是 OpenAI 的 CLIP(对比语言-图像预训练)模型,一种用于生成文本和图像矢量嵌入的多模态模型。虽然 CLIP 是完全开源的,但 OpenAI 的神经网络 DALL-E 却不开源。为了弥补这一空白,Ryan Murdoch 和 Katherine Crowson 开发了 Colab notebooks,将 CLIP 与其他开源模型(如 BigGAN 和 VQGAN)结合起来,制作 Prompt-based 生成性艺术作品。这些 notebooks 基于 MIT 的开源许可证,过去几十年间在互联网上广泛传播,被重新混合、修改、转译,并被用来生成了惊人的艺术作品。</p><p><img src="/img/remote/1460000041229419" alt="图片" title="图片"></p><blockquote>来源:toutiao.com/a7028029253035770371/</blockquote><p><img src="/img/remote/1460000037446300" alt="图片" title="图片"></p>
你还在用 Prometheus 监控 K8S?快试试这 6 个更牛逼的替代方案
https://segmentfault.com/a/1190000041229342
2022-01-05T15:35:22+08:00
2022-01-05T15:35:22+08:00
民工哥
https://segmentfault.com/u/jishuroad
1
<p>监控可帮助您确保Kubernetes应用程序平稳运行并排除可能出现的任何问题。Prometheus是一种流行的开源监视工具,许多公司都使用它来监视其IT基础结构。但是,还有许多其他监视工具可用。本文介绍了6种可以替代Prometheus监视Kubernetes的方法。</p><h2>什么是Prometheus?</h2><p>Prometheus是最初在SoundCloud上构建的开源监视系统。它旨在监视多维数据收集和查询。Prometheus服务器具有自己的独立单元,该独立单元不依赖网络存储或外部服务。因此,Prometheus不需要大量其他基础架构或软件。</p><p><img src="/img/remote/1460000041229344" alt="图片" title="图片"></p><p><a href="https://link.segmentfault.com/?enc=3t8g50Rq67L1uh4kOmbECA%3D%3D.F0t1iFuCqydtxKmuTTVOlgViTw4wRWG%2FvBwMe21iXAtR5giUR9ZApUOI0N%2FsNbIQQchyio9MuF05m4fymErO0ZU2Pr5mr2P%2F8Oj4GL7RMMs87%2BKpr0Fi5MdSMrlLHMvsU3dNm6VvJsKvcRGnD5YBcp%2BBaO7%2Bhq5MliAQIn2lOMas%2FTtwvhGWySfM6zuPYTO%2FEXe1%2FLKATCo2xTZU%2BvX%2FTguBeNxhQ0YcHINXsDb7pjVyvwPcfcsnpCo53tYFsm3HUaYXxtPLuqx2VhhH%2FSN43QQws3kmEDnwamsNvEhLb75Kt%2BN7dCMlT5fsoLnaZ8nj" rel="nofollow">Prometheus</a>的主要优势包括与<a href="https://link.segmentfault.com/?enc=Je%2BBTbA7%2F5JlDoNdeKLU7w%3D%3D.Qn9nG4skHsxvcuWMf19q%2BTqMU6UEZPAikyF2bSDbvbPz5b9ZnT8W4mVW8FW5HmVsNhi2fC%2F9%2FbpT4UmmRmUyV8tNCVRe%2BbfV6pzXiRyGtQ9%2BBTuehB8RiVF%2BbquxjXjxJUk5364cIGXT8bXvF7k0d3li%2FcSQG2iGSZID3xcVJ%2BM6ErcCD2Xy9LLuqkBWECawxr2JVNxW6nUV75VdQcq3M4NUZ8eWE9ZiiOLs2w4RH9zOCdKH6zeRcwlBnJhvbuSsJ8KtE83GylHx7X%2BXhJXGmQxbBeGWnxdsZU8akawhH8863IoMdY5HpGbSS%2ByMG3JU" rel="nofollow">Kubernetes</a>的紧密集成,许多可用的导出器和库以及快速的查询语言和API。Prometheus的主要缺点包括简化的、受约束的数据模型,基于拉取的模型的有限粒度以及缺乏加密。</p><p>以下列出了除Prometheus外监视Kubernetes的6种方法。每种工具都有其自身的优点和缺点,让我们一起看看每个工具的主要功能。</p><h2>1、Grafana</h2><p>Grafana是一个开源平台,用于可视化,监视和分析指标。<a href="https://link.segmentfault.com/?enc=0bFXON0KU%2B%2BhbcDzLW9mzw%3D%3D.Nq8XqWocA49XG%2FhdYqldl0jKf7ONtWtUz%2BJwuVCkuk%2Bp8ksbP7uFOU3ULwcKuyr9ijvFkMyqKJshCp%2FFTjS4WqaAMz%2FhMFCVlgU%2Buejvl%2FlsTlb0b6mSCnbiRqjZOpo%2F7zF%2F4%2FPj2JmjHwNJUZVd8QD%2FX2iwdOZOz1k8j4pitH7vgMHasIy%2BXKsf4VIZKWdOFWUzRfK3QqpddWkPOE33gUTJD0D0%2BHHPn5l81ousOr5jzyl1lwdP%2FpCmtzES0GH9oVRYpBqvpHIJCL9K2BpgRD28JGSYksJdElIPntsmgdGAODM8A59Gd49ul0W8TroG" rel="nofollow">Grafana</a>的主要重点是时间序列分析。Grafana可以通过多种图形选项(包括折线图、热图和条形图)显示分析的数据。当监视的指标超过预定义的阈值时,您会收到警报。</p><p><img src="/img/remote/1460000041229345" alt="图片" title="图片"></p><h6>主要功能包括:</h6><ul><li>警报 - 您可以通过不同的渠道(包括SMS,电子邮件,Slack或PagerDuty)获取警报。如果您更喜欢其他交流渠道,则可以使用一些代码来创建自己的通知程序。</li><li>仪表板模板 - 通过模板化,您可以创建可重复用于多个用例的仪表板。例如,您可以为生产服务器和测试服务器使用相同的仪表板。</li><li>供应 - 您可以使用脚本自动化Grafana中的所有内容。例如,您可以使用包含IP地址,服务器和数据源预设的脚本自动启动Grafana和新的Kubernetes群集。</li><li>注释 - 在发生错误时用于数据关联。您可以通过在图形中添加文本来手动创建注释,也可以从任何数据源获取数据。</li></ul><h2>2、cAdvisor</h2><p>cAdvisor可以收集、处理和导出有关正在运行的容器的性能和资源使用情况信息。cAdvisor具有对Kubernetes的本地支持,因为它已集成到Kubelet二进制文件中。</p><p><img src="/img/remote/1460000041229346" alt="图片" title="图片"></p><h6>主要功能包括:</h6><ul><li>自动发现 - 自动发现给定节点中的所有容器并收集统计信息,包括内存,CPU,网络和文件系统使用情况。</li><li>存储插件 - 将统计信息导出到不同的存储插件,例如Elasticsearch和InfluxDB。</li><li>整体计算机使用率 - 通过分析计算机上的“根”容器来提供整体计算机使用率。</li><li>Web-UI - 您可以在Web-UI上查看指标,该指标显示有关计算机上所有容器的实时信息。</li></ul><h2>3、Fluentd</h2><p>Fluentd 通过在两者之间提供统一的日志记录层,将数据源与后端系统分离。日志记录层使您可以收集生成的多种类型的日志。</p><p><img src="/img/remote/1460000041229347" alt="图片" title="图片"></p><h6>主要功能包括:</h6><ul><li>JSON数据结构 - 使您能够统一所有日志数据处理方面,例如跨不同源缓冲,过滤和输出日志。</li><li>可插拔的体系结构 - 灵活的插件系统使您可以通过连接多个数据源和输出来扩展Fluentd的功能。</li><li>系统资源 - 实例运行在30MB到40MB的内存上,每秒可以处理13,000个事件。如果需要更多内存,则可以使用Fluent Bit轻型转发器。</li><li>可靠性 - 支持基于文件的缓冲和内存缓冲,以防止节点上的数据丢失。此外,您可以设置Fluentd以支持高可用性和强大的故障转移。</li></ul><h2>4、Jaeger</h2><p>Jaeger是一个开源工具,用于监视Kubernetes等分布式服务之间的流量。Jaeger使用分布式跟踪来跟踪通过不同微服务的服务请求的路径。然后,您可以直观地看到请求流。分布式跟踪是一种管理和观察微服务的方法,它作为服务网格的一部分运行。</p><p><img src="/img/remote/1460000041229348" alt="图片" title="图片"></p><h6>主要功能包括:</h6><ul><li>高可扩展性 - 设计为无单点故障(SPOF),可根据业务需求进行扩展。</li><li>多种存储选项 - 支持两个开源NoSQL数据库,Elasticsearch和Cassandra。Jaeger还提供了简单的内存存储用于测试。</li><li>云原生部署 - 支持不同的配置方法,包括环境变量,命令行选项和配置文件。Kubernetes模板,Kubernetes运算符和Helm图表支持Kubernetes部署。</li><li>监视 - Jaeger后端组件默认情况下公开Prometheus指标和日志。</li></ul><h2>5、Telepresence</h2><p>Telepresence是一个开源工具,可以在本地运行单个服务,同时将该服务连接到远程Kubernetes集群。网真在Pod中部署了双向网络代理,该代理可为Kubernetes环境收集数据,包括TCP连接,环境变量和卷。</p><p><img src="/img/remote/1460000041229349" alt="图片" title="图片"></p><h6>主要功能包括:</h6><ul><li>兼容性 - 带有OS原生软件包的Linux和Mac OS均可使用。</li><li>开发工作流程 - 为您提供在Kubernetes上开发的多容器应用程序的快速开发工作流程。您可以在将本地Docker容器代理到集群时运行它。</li><li>在本地调试Kubernetes服务 - 当临时群集中有bug时,您想在本地运行服务。网真使您可以在本地调试服务。</li></ul><p>连接到远程Kubernetes群集 - 您可以从本地进程访问远程群集。通过此访问权限,您可以使用笔记本电脑上的本地工具与群集内的进程进行通信。</p><h2>6、Zabbix</h2><p><a href="https://link.segmentfault.com/?enc=RsGaDPpeQ3gacKMuUcdIfA%3D%3D.quSumUEsLo4tLFuBH9d9TAs64ROVF28qKM8jkox0CJli%2B6%2BKWpQcOpbf9r%2FfrEn7%2B5cqjHkENXlMExJWFXysCjaWkAONYYrktjyJwp1DHBpClXCSYqT7OnDLeQTXOlhLJw%2By74zeiSr6%2BlZhQUz3N06P9Y0TCsyEJNfHbb4moMrYqJK53XLUQw44P3d4%2BGoJC8AuZrhHP%2FA%2FmWLmBo%2B0PLUBPd0KhqnoU4K0t8XxLFVdeyH8ii3rEnNz8V7OSLMWggEK0ANaHSytZQB7le2r4%2Fuqy30NRfjThQPQQ0cjo1II7RSf1qEm7AGI0%2BeENQ3B" rel="nofollow">Zabbix</a>旨在监视大量网络参数和服务器的运行状况,并基于存储的数据提供许多数据可视化和报告功能。具有少量服务器的小型组织和具有多个服务器的大型企业可以使用<a href="https://link.segmentfault.com/?enc=4Tn7AB26NYM1ZmDS8GBGuw%3D%3D.2knA3Y6aO5mPDJV6WVOeUDHerBg89AuBF%2BxKmJxRDL1PQ0tdj0JAfsjbGybT9iCjQlLmM4cp8N0GxhDiEJQKiAnXRjOw6hDEJqzwyL1n%2Bb48lljwxprFwa342JS4sJGWrt6htM3lxp6X6DJiXUyU1l2AhFT2cTg0wLgPC5Avh3EmychUyozmLvwjF42n0u0SrzNguum3FwPS90wmWuWVilny9qk4%2FuPQBWpdPbdRjrWnpkDDFveJNjHgxE5xqNAyDmsa2Cri4Sv7mvek5kuzGbUb8R90aHSYeV1JzprdjmL7L3tkFR%2FhxN%2Fi7Q6vy3LO" rel="nofollow">Zabbix</a>监视IT基础结构。</p><p><img src="/img/remote/1460000041229350" alt="图片" title="图片"></p><h6>主要功能包括:</h6><ul><li>弹性阈值 - 您可以定义弹性问题阈值,也称为触发器。这些触发器基于后端数据库中的值。</li><li>实时可视化 - 您可以使用内置的绘图功能立即查看受监视的项目。</li><li>自动发现 - 提供多种自动化大型环境(如Kubernetes)管理的方法。您可以在组织中自动添加和删除文件系统和网络接口。</li><li>网络发现 - 使您能够定期扫描网络中的外部服务或Zabbix代理,并在发现时采取预定义的措施。</li><li>分布式监视 - 提供使用Zabbix代理监视分布式基础结构的有效方法。您可以使用代理在本地收集数据,然后将数据报告给服务器。</li></ul><h2>结论</h2><p>Prometheus是用于监视Kubernetes工作负载的开源工具。它被本地集成为Kubernetes中的默认监视工具,包括内置的警报管理器。但是,您还应该考虑针对您的Kubernetes环境使用其他监视选项,以补充和改进Kubernetes功能体验。</p><blockquote><em>作者丨by Limor Wainstein 来源丨<a href="https://link.segmentfault.com/?enc=gu6jHe16GorlO2mYOb39Jg%3D%3D.hFsvZAj3%2BPyuDBmDE4LcTQt%2F6tz0IwC9RRshng3QKCYKtv2%2FblMkQC0O%2BCCZJ67QInxVpVuv4JZSTQMQlPmcOiLzBj8xQCp1gvr02REFK4611mvyJsCzGsIVfCb6DX8h" rel="nofollow">https://containerjournal.com/...</a></em></blockquote><p><img src="/img/remote/1460000041229351" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041229352" alt="图片" title="图片"></p><p><img src="/img/remote/1460000037446300" alt="图片" title="图片"></p>
比 ping 强大百倍的可视化工具!结果一目了然
https://segmentfault.com/a/1190000041184936
2021-12-27T12:47:31+08:00
2021-12-27T12:47:31+08:00
民工哥
https://segmentfault.com/u/jishuroad
7
<p>谈到检测网络联通性工具,ping命令必须首当其充。</p><p>但是,今天,民工哥给大家推荐一个强大的命令行工具:gping。</p><p><img src="/img/remote/1460000041184938" alt="图片" title="图片"></p><p>gping 是基于 Rust 编写可视化工具,具有动态图形化界面显示。</p><p><img src="/img/remote/1460000041184939" alt="图片" title="图片"></p><h2>安装</h2><p>下载系统所对应的安装包</p><p><img src="/img/remote/1460000041184940" alt="图片" title="图片"></p><p>本文以CentOS7系统为例,其它系统请参考官方文档。</p><pre><code>[root@centos7 ~]# wget https://github.com/orf/gping/releases/download/gping-v1.2.6/gping-Linux-x86_64.tar.gz
[root@centos7 ~]# ll gping-Linux-x86_64.tar.gz
-rw-r--r-- 1 root root 889865 Dec 7 22:20 gping-Linux-x86_64.tar.gz
[root@centos7 ~]# mkdir /usr/local/gping
[root@centos7 ~]# tar zxf gping-Linux-x86_64.tar.gz -C /usr/local/gping</code></pre><p>如果安装完后,运行命令出现下述错误:</p><pre><code>./gping: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by ./gping)</code></pre><p>解决方案如下:</p><pre><code>curl -O http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
tar zxf glibc-2.18.tar.gz
cd glibc-2.18/
mkdir build
cd build/
../configure --prefix=/usr
make -j2
make install</code></pre><h2>使用</h2><pre><code>[root@centos7 gping]# ./gping --help
gping 1.2.6
Ping, but with a graph.
USAGE:
gping [FLAGS] [OPTIONS] <hosts-or-commands>...
FLAGS:
--cmd Graph the execution time for a list of commands rather than pinging hosts
-h, --help Prints help information
-4 Resolve ping targets to IPv4 address
-6 Resolve ping targets to IPv6 address
-s, --simple-graphics Uses dot characters instead of braille
-V, --version Prints version information
OPTIONS:
-b, --buffer <buffer> Determines the number of seconds to display in the graph. [default: 30]
-n, --watch-interval <watch-interval> Watch interval seconds (provide partial seconds like '0.5'). Default for
ping is 0.2, default for cmd is 0.5.
ARGS:
<hosts-or-commands>... Hosts or IPs to ping, or commands to run if --cmd is provided.</code></pre><p><img src="/img/remote/1460000041184941" alt="图片" title="图片"></p><p>它还可以同时对多个目标地址进行操作。</p><p><img src="/img/remote/1460000041184942" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041184943" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041184944" alt="图片" title="图片"></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
这款开源终端工具逼格更高!比 Xshell 好用
https://segmentfault.com/a/1190000041173615
2021-12-24T13:34:26+08:00
2021-12-24T13:34:26+08:00
民工哥
https://segmentfault.com/u/jishuroad
4
<p>作为一个常常与 Linux 系统打交道的程序员,使用 SSH 终端工具进行远程管理(<strong>之前也分享过:</strong><a href="https://link.segmentfault.com/?enc=Jl%2BFAqgOtSDSDplVbFXL1A%3D%3D.MybypOJJYmoqd%2BJy%2F0gVm25cG665UizTe0J2fBce33fC6QDGDf5DWBYW4BfzYVtFwxWdTNhqIUl%2BgJl3Hnhda4bexus%2BlSoEcPkHFSkrXm5%2Foavm3vTCmrz03LroLlPkWVOfQY0HFJuMk7r7TZ%2FyVuelL4%2F%2BQCVbu3i7J319A%2BooIlWVxmNGPzRO1pSPYJ6P4tAAFhSeOyz5F3K93wOZuelPpAf11OlogskGGDhA5atWnCxBvSkdJ826bpBiNf5de8oHvvfrPUJhAn2JLKSkWOMsQYskeU4jCjMG62c3WAyuG6uzhv4QFncyrhlR12NE" rel="nofollow">还在付费使用 XShell?我选择这款超牛逼的 SSH 客户端,完全免费!</a>)我们的服务器是必不可少的日常工作之一。<strong>好工具是提高工作效率的必备神器!</strong>民工哥在此之前也介绍过不少的常用工具,以及它的使用与配置,大家可以点击文章上方的 <strong>Tools</strong> 专栏查阅。</p><p>很多人一看到就这,就会想到 Xshell 这个工具。但是 Xshell 免费版本不能在商业环境下使用(企业使用可能会有版权问题),还有就是<strong>不支持 Mac,如果想用 FTP 传输文件,需要单独下载 Xftp。</strong></p><p>今天给大家介绍的这个开源终端工具 Tabby,它集成了 SFTP 功能,界面也很酷炫。</p><p><img src="/img/remote/1460000041173617" alt="图片" title="图片"></p><h2>简介</h2><p>Tabby(以前称为Terminus)是一个高度可配置的终端模拟器、SSH 和串行客户端,适用于 Windows、macOS 和 Linux</p><h6>特点</h6><ul><li>集成的 SSH 和 Telnet 客户端和连接管理器</li><li>集成串口终端</li><li>可配置主题和配色方案</li><li>支持PowerShell(和 PS Core)、WSL、Git-Bash、Cygwin、MSYS2、Cmder 和 CMD</li><li>通过 Zmodem 与 SSH 会话的直接进行文件传输(上传/下载)</li><li>非常的流畅的界面输出</li><li>用于 SSH 机密和配置的集成加密容器</li><li>SSH、SFTP 和 Telnet 客户端可用作Web 应用程序</li></ul><h6>丰富的插件</h6><p>插件和主题可以直接从 Tabby 中的设置视图安装。</p><ul><li>clickable-links - 使终端中的路径和 URL 可点击</li><li>docker - 连接到 Docker 容器</li><li>title-control - 允许通过提供要删除的前缀、后缀和/或字符串来修改终端选项卡的标题</li><li>quick-cmds - 快速向一个或所有终端选项卡发送命令</li><li>save-output - 将终端输出记录到文件中</li><li>sync-config - 将配置同步到 Gist 或 Gitee</li><li>clippy - 一个一直让你烦恼的示例插件</li><li>工作区管理器- 允许根据给定的配置创建自定义工作区配置文件</li><li>search-in-browser - 使用从 Tabby 选项卡中选择的文本打开默认系统浏览器</li></ul><h2>安装</h2><p>Tabby 的安装非常简单,完全是傻瓜式操作,下载完成后解压,压缩包文件内容如下:</p><p><img src="/img/remote/1460000041173618" alt="图片" title="图片"></p><p>像平时安装其它软件一样,双击Tabby.exe 就可以直接打开了</p><p><img src="/img/remote/1460000041173619" alt="图片" title="图片"></p><p>下载地址:<a href="https://link.segmentfault.com/?enc=kBB0AxUASDu6oP8WX72dTw%3D%3D.oM%2FAD8rkUhRQ03HFOAj1HtOlMw9%2FYZM2Stn7fIerW%2FJEqoAVZJ5bWhaTZwGd4RpfDHlygFJTJ%2FVw6L6Dp%2F1DnQ%3D%3D" rel="nofollow">https://github.com/Eugeny/tab...</a></p><h2>使用操作</h2><h6>SSH 远程连接</h6><p>创建一个SSH 的连接配置,点击Settings</p><p><img src="/img/remote/1460000041173620" alt="图片" title="图片"></p><p>创建一个新的 profile</p><p><img src="/img/remote/1460000041173621" alt="图片" title="图片"></p><p>选择 SSH connections</p><p><img src="/img/remote/1460000041173622" alt="图片" title="图片"></p><p>填写相关的信息(连接的名称、主机地址、登录用户、密码)</p><p><img src="/img/remote/1460000041173623" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041173624" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041173625" alt="图片" title="图片"></p><p>接下来就可以直接连接到我们需要远程登录的服务器了</p><p><img src="/img/remote/1460000041173626" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041173627" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041173628" alt="图片" title="图片"></p><h6>文件传输</h6><h6>上传/下载文件</h6><p><img src="/img/remote/1460000041173629" alt="图片" title="图片"></p><p>点击Upload就可以选择上传了</p><p><img src="/img/remote/1460000041173630" alt="图片" title="图片"></p><p><img src="/img/remote/1460000041173631" alt="图片" title="图片"></p><p>当然你也可以直接使用拖拽的方式上传文件,下载也一样,还是非常的方便操作的。</p><h6>其它配置</h6><p>字体大小调节,右边可以实时预览</p><p><img src="/img/remote/1460000041173632" alt="图片" title="图片"></p><p>终端配色方案</p><p><img src="/img/remote/1460000041173633" alt="图片" title="图片"></p><p>快捷键</p><p><img src="/img/remote/1460000041173634" alt="图片" title="图片"></p><p>插件</p><p><img src="/img/remote/1460000041173635" alt="图片" title="图片"></p><p>更多相关的功能介绍与使用,感兴趣的读者可以自行查阅官方文档。</p><p><img src="/img/bVbHCzg" alt="" title=""></p>
Docker 大势已去,Podman 即将崛起!
https://segmentfault.com/a/1190000041173604
2021-12-24T13:33:19+08:00
2021-12-24T13:33:19+08:00
民工哥
https://segmentfault.com/u/jishuroad
13
<h2>Podman 简介</h2><h6>什么是Podman?</h6><p><img src="/img/remote/1460000041173606" alt="" title=""></p><p>Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。</p><p>Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。</p><p>Podman 官网地址:<a href="https://link.segmentfault.com/?enc=0uso96ioS2aGGwgJk%2FjALQ%3D%3D.Wxmu0pm09Maqbyj%2FX7XEbh4Ueo7SX94Xf6htnadAU2g%3D" rel="nofollow">https://podman.io/</a></p><h6>Podman和Docker的主要区别是什么?</h6><ul><li>dockers在实现CRI的时候,它需要一个守护进程,其次需要以root运行,因此这也带来了安全隐患。</li><li>podman不需要守护程序,也不需要root用户运行,从逻辑架构上,比docker更加合理。</li><li>在docker的运行体系中,需要多个daemon才能调用到OCI的实现RunC。</li><li>在容器管理的链路中,Docker Engine的实现就是dockerd</li><li>daemon,它在linux中需要以root运行,dockerd调用containerd,containerd调用containerd-shim,然后才能调用runC。顾名思义shim起的作用也就是“垫片”,避免父进程退出影响容器的运训</li><li>podman直接调用OCI,runtime(runC),通过common作为容器进程的管理工具,但不需要dockerd这种以root身份运行的守护进程。</li><li>在podman体系中,有个称之为common的守护进程,其运行路径通常是/usr/libexec/podman/conmon,它是各个容器进程的父进程,每个容器各有一个,common的父则通常是1号进程。podman中的common其实相当于docker体系中的containerd-shim。</li></ul><p><img src="/img/remote/1460000041173607" alt="" title=""></p><p>图中所体现的事情是,<strong>podman不需要守护进程,而dorker需要守护进程</strong>。在这个图的示意中,dorcker的containerd-shim与podman的common被归在Container一层。</p><h6>Podman的使用与docker有什么区别?</h6><p>podman的定位也是与docker兼容,因此在使用上面尽量靠近docker。在使用方面,可以分成两个方面来说,一是系统构建者的角度,二是使用者的角度。</p><p>在系统构建者方面,用podman的默认软件,与docker的区别不大,只是在进程模型、进程关系方面有所区别。如果习惯了docker几个关联进程的调试方法,在podman中则需要适应。可以通过pstree命令查看进程的树状结构。总体来看,podman比docker要简单。由于podman比docker少了一层daemon,因此重启的机制也就不同了。</p><p>在使用者方面,podman与docker的命令基本兼容,都包括容器运行时(run/start/kill/ps/inspect),本地镜像(images/rmi/build)、镜像仓库(login/pull/push)等几个方面。因此podman的命令行工具与docker类似,比如构建镜像、启停容器等。甚至可以通过<code>alias docker=podman</code>可以进行替换。因此,即便使用了podman,仍然可以使用docker.io作为镜像仓库,这也是兼容性最关键的部分。</p><h2>Podman 常用命令</h2><h6>容器</h6><pre><code>podman run 创建并启动容器
podman start #启动容器
podman ps #查看容器
podman stop #终止容器
podman restart #重启容器
podman attach #进入容器
podman exec #进入容器
podman export #导出容器
podman import #导入容器快照
podman rm #删除容器
podman logs #查看日志</code></pre><h6>镜像</h6><pre><code>podman search #检索镜像
docke pull #获取镜像
podman images #列出镜像
podman image Is #列出镜像
podman rmi #删除镜像
podman image rm #删除镜像
podman save #导出镜像
podman load #导入镜像
podmanfile #定制镜像(三个)
podman build #构建镜像
podman run #运行镜像
podmanfile #常用指令(四个)
COPY #复制文件
ADD #高级复制
CMD #容器启动命令
ENV #环境变量
EXPOSE #暴露端口</code></pre><h2>部署 Podman</h2><pre><code>//安装podman
[root@localhost ~]# yum -y install podman
//仓库配置
[root@localhost ~]# vim /etc/containers/registries.conf
[registries.search]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io'] //这个是查找,从这三个地方查找,如果只留一个,则只在一个源里查找
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"] //这里也要改为一个
[registries.insecure]
registries = [10.0.0.1] //这里写那些http的仓库,比如harbor
//配置加速器
[registries.search]
registries = ['https://l9h8fu9j.mirror.aliyuncs.com','docker.io']</code></pre><h2>使用 Podman</h2><p>使用 Podman 非常的简单,Podman 的指令跟 Docker 大多数都是相同的。下面我们来看几个常用的例子:</p><h6>运行一个容器</h6><pre><code>[root@localhost ~]# podman run -d --name httpd docker.io/library/httpd
Trying to pull docker.io/library/httpd...
Getting image source signatures
Copying blob e5ae68f74026 done
Copying blob d3576f2b6317 done
Copying blob bc36ee1127ec done
Copying blob f1aa5f54b226 done
Copying blob aa379c0cedc2 done
Copying config ea28e1b82f done
Writing manifest to image destination
Storing signatures
0492e405b9ecb05e6e6be1fec0ac1a8b6ba3ff949df259b45146037b5f355035
//查看镜像
[root@localhost ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/httpd latest ea28e1b82f31 11 days ago 148 MB</code></pre><h6>列出运行的容器</h6><pre><code>[root@localhost ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0492e405b9ec docker.io/library/httpd:latest httpd-foreground About a minute ago Up About a minute ago httpd</code></pre><p><strong>注意</strong>:如果在ps命令中添加-a,Podman 将显示所有容器。</p><h6>检查正在运行的容器</h6><p>您可以“检查”正在运行的容器的元数据和有关其自身的详细信息。我们甚至可以使用 inspect 子命令查看分配给容器的 IP 地址。由于容器以无根模式运行,因此未分配 IP 地址,并且该值将在检查的输出中列为“无”。</p><pre><code>[root@localhost ~]# podman inspect -l | grep IPAddress\":
"SecondaryIPAddresses": null,
"IPAddress": "10.88.0.5",
[root@localhost ~]# curl 10.88.0.5
<html><body><h1>It works!</h1></body></html></code></pre><p><strong>注意</strong>: -l 是最新容器的便利参数。您还可以使用容器的 ID 代替 -l。</p><h6>查看一个运行中容器的日志</h6><pre><code>选项
--latest #最近的
[root@localhost ~]# podman logs --latest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message
[Mon Dec 13 15:17:53.690844 2021] [mpm_event:notice] [pid 1:tid 140665160166720] AH00489: Apache/2.4.51 (Unix) configured -- resuming normal operations
[Mon Dec 13 15:17:53.690946 2021] [core:notice] [pid 1:tid 140665160166720] AH00094: Command line: 'httpd -D FOREGROUND'
10.88.0.1 - - [13/Dec/2021:15:19:48 +0000] "GET / HTTP/1.1" 200 45
10.88.0.1 - - [13/Dec/2021:15:20:47 +0000] "GET / HTTP/1.1" 200 45</code></pre><h6>查看一个运行容器中的进程资源使用情况</h6><p>可以使用top观察容器中的 nginx pid</p><p>语法:</p><pre><code> podman top <container_id> </code></pre><pre><code>[root@localhost ~]# podman top httpd
USER PID PPID %CPU ELAPSED TTY TIME COMMAND
root 1 0 0.000 15m38.599711321s ? 0s httpd -DFOREGROUND
www-data 7 1 0.000 15m38.599783256s ? 0s httpd -DFOREGROUND
www-data 8 1 0.000 15m38.599845342s ? 0s httpd -DFOREGROUND
www-data 9 1 0.000 15m38.599880444s ? 0s httpd -DFOREGROUND </code></pre><h6>停止一个运行中的容器</h6><pre><code>[root@localhost ~]# podman stop --latest
2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4
[root@localhost ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</code></pre><h6>删除一个容器</h6><pre><code>[root@localhost ~]# podman rm --latest
2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4
[root@localhost ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</code></pre><p><strong>以上这些特性基本上都和 Docker 一样,Podman 除了兼容这些特性外,还支持了一些新的特性。</strong></p><h6>上传镜像</h6><p>例如,如果我们想在 docker.io 上分享我们新建的 Nginx 容器镜像,这很容易。首先登录码头:</p><pre><code>[root@localhost nginx]# tree
.
├── Dockerfile
└── files
└── nginx-1.20.1.tar.gz
[root@localhost nginx]# cat Dockerfile
FROM docker.io/library/centos
ENV PATH /usr/local/nginx/sbin:$PATH
ADD files/nginx-1.20.1.tar.gz /usr/src
RUN useradd -r -M -s /sbin/nologin nginx && \
yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make && \
mkdir -p /var/log/nginx && \
cd /usr/src/nginx-1.20.1 && \
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log && \
make && make install
CMD ["nginx","-g","daemon off"]
[root@localhost nginx]# podman build -t nginx .</code></pre><pre><code>// 修改镜像名
[root@localhost ~]# podman tag docker.io/library/nginx:latest docker.io/1314444/test:latest
// 登录并上传镜像
[root@localhost ~]# podman login docker.io // 需要告诉其要登录到docker仓库
[root@localhost ~]# podman login docker.io
Username: 1314444 #账户
Password: ******** #密码
Login Succeeded!
[root@localhost nginx]# podman push docker.io/1314444/test:latest //上传镜像
Getting image source signatures
Copying blob 38c40d6c2c85 done
Copying blob fee76a531659 done
Copying blob c2adabaecedb done
Copying config 7f3589c0b8 done
Writing manifest to image destination
Copying config 7f3589c0b8 done
Writing manifest to image destination
Storing signatures
//请注意,我们将四层推送到我们的注册表,现在可供其他人共享。快速浏览一下:
[root@localhost ~]# podman inspect 1314444/test:nginx
//输出:
[
{
"Id": "7f3589c0b8849a9e1ff52ceb0fcea2390e2731db9d1a7358c2f5fad216a48263",
"Digest": "sha256:7822b5ba4c2eaabdd0ff3812277cfafa8a25527d1e234be028ed381a43ad5498",
"RepoTags": [
"docker.io/1314444/test:nginx",
......</code></pre><p>总而言之,<strong>Podman 使查找、运行、构建和共享容器变得容易</strong>。</p><h6>配置别名</h6><p>如果习惯了使用 Docker 命令,可以直接给 Podman 配置一个别名来实现无缝转移。你只需要在 .bashrc 下加入以下行内容即可:</p><pre><code>[root@localhost ~]# echo "alias docker=podman" >> .bashrc
source .bashrc
[root@localhost ~]# alias
alias cp='cp -i'
alias docker='podman'
.......</code></pre><h6>用户操作</h6><p>在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置。</p><p>cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资源,如果使用cgroupV2启用了运行Podman的Linux发行版,则可能需要更改默认的OCI运行时。某些较旧的版本runc不适用于cgroupV2,必须切换到备用OCI运行时crun。</p><pre><code>[root@localhost ~]# yum -y install crun //centos8系统自带
[root@localhost ~]# vi /usr/share/containers/containers.conf
446 # Default OCI runtime
447 #
448 runtime = "crun" //取消注释并将runc改为crun
[root@localhost ~]# podman run -d --name web -p 80:80 docker.io/library/nginx
c8664d2e43c872e1e5219f82d41f63048ed3a5ed4fb6259c225a14d6c243677f
[root@localhost ~]# podman inspect web | grep crun
"OCIRuntime": "crun",
"crun",</code></pre><h6>安装slirp4netns和fuse-overlayfs</h6><p>在普通用户环境中使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统,至少需要版本0.7.6。现在新版本默认就是了。</p><pre><code>[root@localhost ~]# yum -y install slirp4netns
[root@localhost ~]# yum -y install fuse-overlayfs
[root@localhost ~]# vi /etc/containers/storage.conf
77 mount_program = "/usr/bin/fuse-overlayfs" //取消注释</code></pre><h6>/etc/subuid和/etc/subgid配置</h6><p>Podman要求运行它的用户在<code>/etc/subuid</code>和<code>/etc/subgid</code>文件中列出一系列UID,shadow-utils或newuid包提供这些文件</p><pre><code>[root@localhost ~]# yum -y install shadow-utils</code></pre><p>可以在/etc/subuid和/etc/subgid查看,每个用户的值必须唯一且没有任何重叠。</p><pre><code>[root@localhost ~]# useradd zz
[root@localhost ~]# cat /etc/subuid
zz:100000:65536
[root@localhost ~]# cat /etc/subgid
zz:100000:65536
// 启动非特权ping
[root@localhost ~]# sysctl -w "net.ipv4.ping_group_range=0 200000" //大于100000这个就表示tom可以操作podman
net.ipv4.ping_group_range = 0 200000</code></pre><p>这个文件的格式是 USERNAME:UID:RANGE</p><ul><li>中/etc/passwd或输出中列出的用户名getpwent。</li><li>为用户分配的初始 UID。</li><li>为用户分配的 UID 范围的大小。</li></ul><p>该usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。</p><pre><code>[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 hh
grep hh /etc/subuid /etc/subgid
/etc/subuid:hh:200000:1001
/etc/subgid:hh:200000:1001</code></pre><h6>用户配置文件</h6><p>三个主要的配置文件是<code>container.conf、storage.conf</code>和<code>registries.conf</code>。用户可以根据需要修改这些文件。</p><ul><li><p>container.conf</p><pre><code>// 用户配置文件
[root@localhost ~]# cat /usr/share/containers/containers.conf
[root@localhost ~]# cat /etc/containers/containers.conf
[root@localhost ~]# cat ~/.config/containers/containers.conf //优先级最高</code></pre><p>如果它们以该顺序存在。每个文件都可以覆盖特定字段的前一个文件。</p></li><li><p>配置storage.conf文件</p><pre><code>1./etc/containers/storage.conf
2.$HOME/.config/containers/storage.conf</code></pre><p>在普通用户中/etc/containers/storage.conf的一些字段将被忽略</p><pre><code>[root@localhost ~]# vi /etc/containers/storage.conf
[storage]
# Default Storage Driver, Must be set for proper operation.
driver = "overlay" #此处改为overlay
.......
mount_program = "/usr/bin/fuse-overlayfs" #取消注释
[root@localhost ~]# sysctl user.max_user_namespaces=15000 #如果版本为8以下,则需要做以下操作:</code></pre><p>在普通用户中这些字段默认</p><pre><code>graphroot="$HOME/.local/share/containers/storage"
runroot="$XDG_RUNTIME_DIR/containers"</code></pre></li><li>registries.conf</li></ul><p>配置按此顺序读入,这些文件不是默认创建的,可以从/usr/share/containers或复制文件/etc/containers并进行修改。</p><pre><code>1./etc/containers/registries.conf
2./etc/containers/registries.d/*
3.HOME/.config/containers/registries.conf</code></pre><h6>授权文件</h6><p>此文件里面写了docker账号的密码,以加密方式显示</p><pre><code>[root@localhost ~]# podman login
Username: 1314444
Password:
Login Succeeded!
[root@localhost ~]# cat /run/user/0/containers/auth.json
{
"auths": {
"registry.fedoraproject.org": {
"auth": "MTMxNDQ0NDpIMjAxNy0xOA=="
}
}
}</code></pre><p>普通用户是无法看见root用户的镜像的</p><pre><code>//root用户
[root@localhost ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/httpd latest ea28e1b82f31 11 days ago 146 MB
//普通用户
[root@localhost ~]# su - zz
[zz@localhost ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE</code></pre><h2>卷</h2><ul><li>容器与root用户一起运行,则root容器中的用户实际上就是主机上的用户。</li><li>UID GID是在/etc/subuid和/etc/subgid等中用户映射中指定的第一个UID GID。</li><li>如果普通用户的身份从主机目录挂载到容器中,并在该目录中以根用户身份创建文件,则会看到它实际上是你的用户在主机上拥有的。</li></ul><h6>使用卷</h6><pre><code>[root@localhost ~]# su - zz
[zz@localhost ~]$ pwd
/home/zz
[zz@localhost ~]$ mkdir /home/zz/data
[zz@localhost ~]$ podman run -it -v "$(pwd)"/data:/data docker.io/library/busybox /bin/sh
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 3cb635b06aa2 done
Copying config ffe9d497c3 done
Writing manifest to image destination
Storing signatures
/ # ls
bin data dev etc home proc root run sys tmp usr var
/ # cd data/
/data # ls
/data # touch 123
/data # ls -l
total 0
-rw-r--r-- 1 root root 0 Dec 13 00:17 123</code></pre><h6>在主机上查看</h6><pre><code>[zz@localhost ~]$ ll data/
总用量 0
-rw-r--r-- 1 zz zz 0 12月 13 00:17 123
//写入文件
[zz@localhost ~]$ echo "hell world" >> 123
[zz@localhost ~]$ cat 123
hell world</code></pre><h6>容器里查看</h6><pre><code>/data # cat 123
hell world
//我们可以发现在容器里面的文件的属主和属组都属于root,那么如何才能让其属于tom用户呢?下面告诉你答案
/data # ls -l
total 4
-rw-rw-r-- 1 root root 12 Dec 13 00:20 123
//只要在运行容器的时候加上一个--userns=keep-id即可。
[zz@localhost ~]$ podman run -it --name test -v "$(pwd)"/data:/data --userns=keep-id docker.io/library/busybox /bin/sh
~ $ cd data/
/data $ ls -l
total 4
-rw-r--r-- 1 zz zz 11 Dec 13 00:21 123</code></pre><p>使用普通用户映射容器端口时会报“ permission denied”的错误</p><pre><code>[zz@localhost ~]$ podman run -d -p 80:80 httpd
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied</code></pre><p>普通用户可以映射>= 1024的端口</p><pre><code>[zz@localhost ~]$ podman run -d -p 1024:80 httpd
58613a6bdc70d4d4f9f624583f795a62a610596d166f0873bdff8fb26aa15092
[zz@localhost ~]$ ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:1024 *:*
LISTEN 0 128 [::]:22 [::]:* </code></pre><p>配置<code>echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf</code>后可以映射大于等于80的端口</p><pre><code>[root@localhost ~]# echo 'net.ipv4.ip_unprivileged_port_start=80' >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_unprivileged_port_start = 80
[zz@localhost ~]$ podman run -d -p 80:80 httpd
1215455a0c300d78e7bf6afaefc9873f818c6b0f26affeee4e2bc17954e72d8e
[zz@localhost ~]$ ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:1024 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:* </code></pre><p>链接:<a href="https://link.segmentfault.com/?enc=HY4Hs2%2BrgDKPVJAnK8iMig%3D%3D.0pM8Vh3llgqCReuKg5gXiI%2FbAMEeytljEOQbKyMEawGyXLzUfTKmc8uf8P6Ld7PTdnQhJuQBIclarzvRnPUQHg%3D%3D" rel="nofollow">https://blog.csdn.net/qq_4828...</a></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
CentOS 将于年底终止!
https://segmentfault.com/a/1190000041146065
2021-12-20T11:03:13+08:00
2021-12-20T11:03:13+08:00
民工哥
https://segmentfault.com/u/jishuroad
0
<p>一年前Red Hat宣布将在<strong>今年底(2021年)结束提供免费的CentOS Linux</strong>(<a href="https://link.segmentfault.com/?enc=7YZaY%2BWuR35O6JHK858zkw%3D%3D.hEVmUjnljg6rntI1n1SjCdBmLNmRXisF8ryOGGJJzw3GqQALhWinsn7gJYV2X67b1fxjufEQH8RqUrDWwFVbkoNTqHwTF%2FKehRE94rMO6JTsnVcXzLPuOukmm8zRfEdBtpcvTYHPzE74IBl1KTXTxHZ6pJMLiUASkeusujUq42fYeT10V5OtUvoKnLkwBNHILf9ltNyX7w2S2MXWAFzRWybkQlFZ%2BL6Al6dCTuZbIxioZHNtUorSWvvqPUo3o7E3hRnHv%2FeVTFJYgeI3AS6C0PlBEzfguaAUUusV4zjKAXwgy%2BYOIVTTut5xzw%2FOKdfn" rel="nofollow">CentOS 已死!"免费"的 RHEL 没了...</a>)。上周五Red Hat再度提醒,CentOS Linux 8将在今年12月31日来到它的生命周期终点(End of Life,EoL)。对于:<a href="https://link.segmentfault.com/?enc=D%2FTOCstCx0vtMAUuSEPAoA%3D%3D.v7h%2B7Rp6%2FvQjP%2BJEDZP0m1sXWK6Ut2KxDpMveskYgDMpaSWbdO4fSPanfWtYsCBOD0Db7kywdEkuQVApw%2FABQ5oeifcq6Wuto0N2DhUfGUnXmj%2B%2FuVkiw3q%2BIB4Nb2TqV3XgGFznzAGEE9DTnIhmwvgcMPJyfoZ2x79eMecrGnWwQ3hqjoMtAeti8gsLYuiMb2xeMUyli7jtIw6E5XK6FYAZkcvuBpPBVDZ1b2UXYb6Y%2BSC7F5rSSGHCL3%2BtV7wi26RPAPLEjynR6n%2BEXyj%2FQ5HJKYC3G3JyXl25GfcR5LxVBwfAghMl70cv2OubTB2m" rel="nofollow">CentOS 停止服务!我们用哪个?Ubuntu or Debian</a>?</p><p><img src="/img/remote/1460000041146067" alt="图片" title="图片"></p><p>CentOS是Linux发行版之一,是Red Hat依照开放源代码推出的Red Hat Enterprise Linux源码编译而成。由于出自相同源码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux。<strong>去年Red Hat宣布CentOS将转为适用DevOps人员开发的平台</strong>,而非稳定服务器应用或VM的操作系统,<strong>新平台称为CentOS Stream,也不会再有CentOS 9</strong>。</p><p>CentOS原定今年第2季度推出的CentOS Stream 9延至11月中推出。用户可以在CentOS网站下载IBM Power、IBM Z、ARM54、x86架构组件。同时CentOS Stream 8不再会自动升级到新版本。</p><p><strong>最后一版CentOS 8只会更新到2021年12月31日</strong>,反而<strong>CentOS 7</strong>会更新到<strong>2024年6月30日</strong>。对于CentOS 8用户,Red Hat还会在推出RHEL 8.5时,发布RHEL rebuild版给CentOS用户,即真正最后一个CentOS版本,时间点也可能落在EOL后。</p><p>一如RHEL小数点版本(point release)会附带数次的安全更新,CentOS Linux 8最后一版也会有类似的更新,但是随着宣布EoL以及新年假期,<strong>Red Hat支持只会延到2022年1月31日,之后就不再发布更新。</strong></p><p>1月底一到,或期间发生CVSS风险值9以上的安全漏洞,这个版本就会从镜像网站上移除,并永久归档于vault.centos.org网站,后者专门储存已经EoL的产品。</p><p>CentOS拥有许多大型企业及网站用户,包括脸书、迪士尼、GoDaddy、丰田汽车、Verizon等,此外一些厂商则以CentOS作为其产品底层,包括Juniper、F5、Fortinet等。</p><p>ZDNet建议,CentOS 8以外的选择包括AlmaLinux、CloudLinux OS、Rocky Linux(<a href="https://link.segmentfault.com/?enc=eEzRxHRPwWfDc0UBLmELAg%3D%3D.TenP5o6n684Hb3JoJ2dJWkA2C2gj0WrNTkkAx7R%2FCWVEiVDlYrIeQeM2eKlfMkOuT%2F9kKhn2I%2FmCrfAb2k5g%2FZpz5LcEQnPWuLr5lbuPgcLI6c1Zi5xhaq5IHGmAk7mvequbgXZnN6ZcA%2FF8b932my5rIjA%2FvXf%2BiSd5MrzEw5pD0MNO%2Fn8%2FhNjJv7fdxlvyTY2FN%2B%2BV%2BI25AqjjnP1BGy5WI6whb97uyBqzMQLCNTaKgPXYu2bpYDlPVS8nxzgIE8Vp8s34pkIzCyW9pik3solxmD%2FFrW%2BAUHkiWBgZH5m3t8USCQC85icGXbseKAMO" rel="nofollow">CentOS 之父创造的 Rocky Linux 8.3 发布了!内附下载链接及安装教程</a>)及Amazon Linux、HPE ClearOS、Oracle Linux、Ubuntu,当然还有RHEL。</p><p>对于在企业中使用的我们而言,<strong>欢迎大家留言分享,你们在CentOS终止之后使用何种系统呢???</strong></p><blockquote><em>参考:ithome.com.tw/news/148329</em></blockquote><p><img src="/img/bVbHCzg" alt="" title=""></p>
掌握 SQL 这些核心知识点,出去吹牛逼再也不担心了
https://segmentfault.com/a/1190000041124651
2021-12-15T21:15:23+08:00
2021-12-15T21:15:23+08:00
民工哥
https://segmentfault.com/u/jishuroad
8
<h2>第一章 SQL的介绍</h2><h6>1.1、什么是sql</h6><ul><li>SQL:Structure Query Language。(结构化查询语言),通过sql操作数据库(操作数据库,操作表,操作数据)</li><li>SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准</li><li>各数据库厂商(MySql,oracle,sql server)都支持ISO的SQL标准。</li><li>各数据库厂商在标准的基础上做了自己的扩展。 各个数据库自己特定的语法</li></ul><h6>1.2、sql的分类</h6><ul><li>Data Definition Language (DDL数据定义语言) 如:操作数据库,操作表</li><li>Data Manipulation Language(DML数据操纵语言),如:对表中的记录操作增删改</li><li>Data Query Language(DQL 数据查询语言),如:对表中数据的查询操作</li><li>Data Control Language(DCL 数据控制语言),如:对用户权限的设置</li></ul><h6>1.3、MySQL的语法规范和要求</h6><p>(1)mysql的sql语法不区分大小写</p><p>MySQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。</p><p>ci(大小写不敏感),cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)</p><p>(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号user_id</p><p>(3)建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中<code>使用`(飘号)引起来</code></p><p>(4)数据库和表名、字段名等对象名中间不要包含空格</p><p>(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名</p><p>(6)标点符号:</p><ul><li>必须成对</li><li>必须英文状态下半角输入方式</li><li>字符串和日期类型可以使用单引号’’</li><li>列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略</li><li>如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。</li></ul><p>(7)SQL脚本中如何加注释</p><ul><li>单行注释:#注释内容</li><li>单行注释:–空格注释内容 其中–后面的空格必须有</li><li>多行注释:/<em> 注释内容 </em>/</li></ul><pre><code class="sql">#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;
#创建表格
#create table student info(...); #表名错误,因为表名有空格
create table student_info(...);
#其中name使用``飘号,因为name和系统关键字或系统函数名等预定义标识符重名了。
CREATE TABLE t_stu(
id INT,
`name` VARCHAR(20)
);
select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略
select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略""
select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""</code></pre><h2>第二章-DDL操作数据库</h2><h6>2.1、创建数据库(掌握)</h6><ul><li>语法</li></ul><pre><code class="sql">create database 数据库名 [character set 字符集][collate 校对规则] 注: []意思是可选的意思</code></pre><p>字符集(charset):是一套符号和编码。</p><ul><li>练习</li></ul><p>创建一个day01的数据库(默认字符集)</p><pre><code class="sql">create database day01;</code></pre><p>创建一个day01_2的数据库,指定字符集为gbk(了解)</p><pre><code class="sql">create database day01_2 character set gbk;</code></pre><h6>2.2、查看所有的数据库</h6><ul><li>查看所有的数据库</li></ul><p>语法</p><pre><code class="sql">show databases; </code></pre><ul><li>查看数据库的定义结构【了解】</li></ul><p>语法</p><pre><code class="sql">show create database 数据库名;</code></pre><p>查看day01这个数据库的定义</p><pre><code class="sql">show create database day01; </code></pre><h6>2.3、删除数据库</h6><p>语法</p><pre><code class="sql">drop database 数据库名;</code></pre><p>删除day01_2数据库</p><pre><code class="sql">drop database day01_2;</code></pre><h6>2.4、修改数据库【了解】</h6><p>语法</p><pre><code class="sql">alter database 数据库名 character set 字符集;</code></pre><p>修改day01这个数据库的字符集(gbk)</p><pre><code>alter database day01 character set gbk;</code></pre><p>注意:</p><ul><li>是utf8,不是utf-8</li><li>不是修改数据库名</li></ul><h6>2.5、其他操作</h6><p>切换数据库, 选定哪一个数据库</p><pre><code class="sql">use 数据库名; //注意: 在创建表之前一定要指定数据库. use 数据库名</code></pre><p>练习: 使用day01</p><pre><code class="sql">use day01;</code></pre><p>查看正在使用的数据库</p><pre><code class="sql">select database();</code></pre><h2>第三章-DDL操作表</h2><h6>3.1、创建表</h6><ul><li><p>语法</p><pre><code class="sql">create table 表名(
列名 类型 [约束],
列名 类型 [约束]
...
);</code></pre></li><li>类型</li></ul><p><strong>数值类型</strong></p><p>整型系列:xxxInt</p><ul><li>int(M),必须和unsigned zerofill一起使用才有意义</li></ul><p><img src="/img/bVcWIyJ" alt="image.png" title="image.png"></p><p>浮点型系列:float,double(或real)</p><ul><li><p>double(M,D):表示最长为M位,其中小数点后D位</p><pre><code>例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。</code></pre><p>定点型系列:decimal(底层实际上是使用字符串进行存储)</p></li><li>decimal(M,D):表示最长为M位,其中小数点后D位</li></ul><p>位类型:bit</p><ul><li>字节范围是:1-8,值范围是:bit(1)~bit(64),默认bit(1)</li></ul><p>用来存储二进制数。对于位字段,直接使用select命令将不会看到结果。可以使用bit()或hex()函数进行读取。插入bit类型字段时,使用bit()函数转为二进制值再插入,因为二进制码是“01”。</p><p><strong>日期时间类型</strong></p><p>日期时间类型:year, date, datetime, timestamp</p><p>注意一下每一种日期时间的表示范围</p><p><img src="/img/remote/1460000041124653" alt="" title=""></p><p>timestamp和datetime的区别:</p><ul><li>timestamp范围比较小</li><li><p>timestamp和时区有关</p><ul><li>show variables like ‘time_zone’;</li><li>set time_zone = ‘+8:00’;</li></ul></li><li>timestamp受MySQL版本和服务器的SQLMode影响很大</li><li>表中的第一个非空的timestamp字段如果插入和更新为NULL则会自动设置为系统时间</li></ul><p><img src="/img/remote/1460000041124654" alt="" title=""></p><p><img src="/img/remote/1460000041124655" alt="" title=""></p><p><strong>字符串类型</strong></p><p>MySQL中提供了多种对字符数据的存储类型,不同的版本可能有所差异。常见的有:</p><pre><code>char,varchar,xxtext,binary,varbinary,xxblob,enum,set等等</code></pre><p><img src="/img/remote/1460000041124656" alt="" title=""></p><ul><li><p>字符串类型char,varchar(M)</p><ul><li>char如果没有指定宽度,默认为1个字符</li><li>varchar(M),必须指定宽度</li></ul></li></ul><p>binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的。</p><p>一般在保存少量字符串的时候,我们会选择char和varchar;而在保存较大文本时,通常会选择使用text或blob系列。blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时,会在数据表中留下很大的“空洞”,为了提高性能,建议定期时候用optimize table功能对这类表进行碎片整理。可以使用合成的(Synthetic)索引来提高大文本字段的查询性能,如果需要对大文本字段进行模糊查询,MySql提供了前缀索引。但是仍然要在不必要的时候避免检索大型的blob或text值。</p><p>enum枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对于1~255个成员的枚举需要1个字节存储;对于<code>【 255`65535】</code>个成员需要2个字节存储。例如:gender enum(‘男’,‘女’)。如果插入枚举值以外的值,会按第一个值处理。一次只能从枚举值中选择一个。</p><p>set集合类型,可以包含0~64个成员。一次可以从集合中选择多个成员。如果选择了1-8个成员的集合,占1个字节,依次占2个,3个。。8个字节。例如:hoppy set(‘吃饭’,‘睡觉’,‘玩游戏’,‘旅游’),选择时’吃饭,睡觉’或’睡觉,玩游戏,旅游’</p><p>示例</p><pre><code class="sql">+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| eid | int(11) | NO | PRI | NULL | auto_increment |
| ename | varchar(20) | NO | | NULL | |
| tel | char(11) | NO | | NULL | |
| gender | char(1) | YES | | 男 | |
| salary | double | YES | | NULL | |
| commission_pct | double(3,2) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| job_id | int(11) | YES | | NULL | |
| email | varchar(32) | YES | | NULL | |
| mid | int(11) | YES | | NULL | |
| address | varchar(150) | YES | | NULL | |
| native_place | varchar(10) | YES | | NULL | |
| did | int(11) | YES | | NULL | |
+----------------+--------------+------+-----+---------+----------------+</code></pre><p><strong>约束</strong></p><ul><li>即规则,规矩 限制;</li><li>作用:保证用户插入的数据保存到数据库中是符合规范的</li></ul><p><img src="/img/remote/1460000041124657" alt="" title=""></p><h6>约束种类:</h6><ul><li>not null: 非空 ; eg: username varchar(40) not null username这个列不能有null值</li><li>unique:唯一约束, 后面的数据不能和前面重复; eg: cardNo char(18) unique; cardNo 列里面不可以有重复数据</li><li><p>primary key;主键约束(非空+唯一); 一般用在表的id列上面. 一张表基本上都有id列的, id列作为唯一标识的</p><ul><li>auto_increment: 自动增长,必须是设置了primary key之后,才可以使用auto_increment</li></ul></li><li>id int primary key auto_increment; id不需要我们自己维护了, 插入数据的时候直接插入null, 自动的增长进行填充进去, 避免重复了.</li></ul><p><strong>注意</strong>:</p><ul><li>先设置了primary key 再能设置auto_increment</li><li>只有当设置了auto_increment 才可以插入null , 否则插入null会报错</li></ul><p>id列:</p><ul><li>给id设置为int类型, 添加主键约束, 自动增长</li><li>或者给id设置为字符串类型,添加主键约束, 不能设置自动增长</li></ul><p><strong>练习</strong></p><p>创建一张学生表(含有id字段,姓名字段不能重复,性别字段不能为空默认值为男. id为主键自动增长)</p><pre><code class="sql">CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增长
NAME VARCHAR(30) UNIQUE, -- 唯一约束
gender CHAR(1) NOT NULL DEFAULT '男'
);</code></pre><h6>3.2、查看表【了解】</h6><p>查看所有的表</p><pre><code class="sql">show tables;</code></pre><p>查看表的定义结构</p><p>语法</p><pre><code class="sql">desc 表名;</code></pre><p>练习: 查看student表的定义结构</p><pre><code class="sql">desc student;</code></pre><h6>3.3、修改表【掌握,但是不要记忆】</h6><p>语法</p><ul><li>增加一列</li></ul><pre><code class="sql">alter table 【数据库名.]表名称 add 【column】 字段名 数据类型;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 first;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 after 另一个字段;</code></pre><ul><li>修改列的类型约束:alter table 表名 modify 字段 类型 约束 ;</li><li>修改列的名称,类型,约束: alter table 表名 change 旧列 新列 类型 约束;</li><li>删除一列: alter table 表名 drop 列名;</li><li>修改表名 : rename table 旧表名 to 新表名;</li></ul><p>练习</p><p>给学生表增加一个grade字段,类型为varchar(20),不能为空</p><pre><code class="sql">ALTER TABLE student ADD grade VARCHAR(20) NOT NULL;</code></pre><p>给学生表的gender字段改成int类型,不能为空,默认值为1</p><pre><code class="sql">alter table student modify gender varchar(20);</code></pre><p>给学生表的grade字段修改成class字段</p><pre><code class="sql">ALTER TABLE student CHANGE grade class VARCHAR(20) NOT NULL;</code></pre><p>把class字段删除</p><pre><code class="sql">ALTER TABLE student DROP class;</code></pre><p>把学生表修改成老师表(了解)</p><pre><code class="sql">RENAME TABLE student TO teacher;</code></pre><h6>3.4、删除表【掌握】</h6><p>语法</p><pre><code class="sql">drop table 表名;</code></pre><p>把teacher表删除</p><pre><code class="sql">drop table teacher;</code></pre><h2>第四章-DML操作表记录-增删改【重点】</h2><p>准备工作: 创建一张商品表(商品id,商品名称,商品价格,商品数量.)</p><pre><code class="sql">create table product(
pid int primary key auto_increment,
pname varchar(40),
price double,
num int
);</code></pre><h6>4.1、插入记录</h6><p>语法</p><ul><li>方式一: 插入指定列, 如果没有把这个列进行列出来, 以null进行自动赋值了.</li></ul><p>eg: 只想插入pname, price , insert into t_product(pname, price) values(‘mac’,18000);</p><pre><code class="sql">insert into 表名(列,列..) values(值,值..);</code></pre><p>注意: 如果没有插入了列设置了非空约束, 会报错的</p><ul><li>方式二: 插入所有的列,如果哪列不想插入值,则需要赋值为null</li></ul><p>insert into 表名 values(值,值....); </p><p>eg:</p><pre><code class="sql">insert into product values(null,'苹果电脑',18000.0,10);
insert into product values(null,'华为5G手机',30000,20);
insert into product values(null,'小米手机',1800,30);
insert into product values(null,'iPhonex',8000,10);
insert into product values(null,'iPhone7',6000,200);
insert into product values(null,'iPhone6s',4000,1000);
insert into product values(null,'iPhone6',3500,100);
insert into product values(null,'iPhone5s',3000,100);
insert into product values(null,'方便面',4.5,1000);
insert into product values(null,'咖啡',11,200);
insert into product values(null,'矿泉水',3,500);</code></pre><h6>4.2、更新记录</h6><ul><li>语法</li></ul><pre><code class="sql">update 表名 set 列 =值, 列 =值 [where 条件]</code></pre><ul><li>练习</li></ul><p>将所有商品的价格修改为5000元</p><pre><code class="sql">update product set price = 5000;</code></pre><p>将商品名是苹果电脑的价格修改为18000元</p><pre><code class="sql">UPDATE product set price = 18000 WHERE pname = '苹果电脑';</code></pre><p>将商品名是苹果电脑的价格修改为17000,数量修改为5</p><pre><code class="sql">UPDATE product set price = 17000,num = 5 WHERE pname = '苹果电脑';</code></pre><p>将商品名是方便面的商品的价格在原有基础上增加2元</p><pre><code class="sql">UPDATE product set price = price+2 WHERE pname = '方便面';</code></pre><h6>4.3、删除记录</h6><ul><li>delete</li></ul><p>根据条件,一条一条数据进行删除</p><p>语法</p><pre><code class="sql">delete from 表名 [where 条件] 注意: 删除数据用delete,不用truncate</code></pre><p>类型</p><p>删除表中名称为’苹果电脑’的记录</p><pre><code class="sql">delete from product where pname = '苹果电脑';</code></pre><p>删除价格小于5001的商品记录</p><pre><code class="sql">delete from product where price < 5001;</code></pre><p>删除表中的所有记录(要删除一般不建议使用delete语句,delete语句是一行一行执行,速度过慢)</p><pre><code class="sql">delete from product;</code></pre><ul><li><p>truncate<br>把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快</p><pre><code class="sql">truncate table 表;</code></pre></li><li><p>工作中删除数据</p><ul><li>物理删除: 真正的删除了, 数据不在, 使用delete就属于物理删除</li><li>逻辑删除: 没有真正的删除, 数据还在. 搞一个标记, 其实逻辑删除是更新 eg: state 1 启用 0禁用</li></ul></li></ul><h2>第五章-DQL操作表记录-查询【重点】</h2><h6>5.1、基本查询语法</h6><pre><code class="sql">select 要查询的字段名 from 表名 [where 条件] </code></pre><h6>5.2、简单查询</h6><p>查询所有行和所有列的记录</p><ul><li><p>语法</p><pre><code class="sql">select * form 表</code></pre><p>查询商品表里面的所有的列</p><pre><code class="sql">select * from product;</code></pre></li></ul><p>查询某张表特定列的记录</p><ul><li><p>语法</p><pre><code class="sql">select 列名,列名,列名... from 表</code></pre><p>查询商品名字和价格</p><pre><code class="sql">select pname, price from product;</code></pre><p>去重查询 distinct</p></li><li><p>语法</p><pre><code class="sql">SELECT DISTINCT 字段名 FROM 表名; //要数据一模一样才能去重</code></pre><p>去重查询商品的名字</p><pre><code class="sql">SELECT DISTINCT pname,price FROM product</code></pre><p><strong>注意点</strong>: 去重针对某列, distinct前面不能先出现列名</p></li></ul><p>别名查询</p><ul><li><p>语法</p><pre><code class="sql">select 列名 as 别名 ,列名 from 表 //列别名 as可以不写
select 别名.* from 表 as 别名 //表别名(多表查询, 明天会具体讲)</code></pre><p>查询商品信息,使用别名</p><pre><code class="sql">SELECT pid ,pname AS '商品名',price AS '商品价格',num AS '商品库存' FROM product</code></pre><p>运算查询(+,-,*,/,%等)</p></li></ul><p>把商品名,和商品价格+10查询出来:我们既可以将某个字段加上一个固定值,又可以对多个字段进行运算查询</p><pre><code class="sql">select pname ,price+10 as 'price' from product;
select name,chinese+math+english as total from student</code></pre><p><strong>注意</strong></p><ul><li>运算查询字段,字段之间是可以的</li><li>字符串等类型可以做运算查询,但结果没有意义</li></ul><h6>5.3、条件查询(很重要)</h6><ul><li><p>语法</p><pre><code class="sql">select ... from 表 where 条件
//取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回</code></pre><h6>运算符</h6></li></ul><p>1、比较运算符</p><pre><code>大于:>
小于:<
大于等于:>=
小于等于:<=
等于:= 不能用于null判断
不等于:!= 或 <>
安全等于: <=> 可以用于null值判断</code></pre><p>2、逻辑运算符(建议用单词,可读性来说)</p><pre><code>逻辑与:&& 或 and
逻辑或:|| 或 or
逻辑非:! 或 not
逻辑异或:^ 或 xor</code></pre><p>3、范围</p><pre><code>区间范围:between x and y
not between x and y
集合范围:in (x,x,x)
not in (x,x,x)</code></pre><p>4、模糊查询和正则匹配(只针对字符串类型,日期类型)</p><pre><code>like 'xxx' 模糊查询是处理字符串的时候进行部分匹配
如果想要表示0~n个字符,用%
如果想要表示确定的1个字符,用_
regexp '正则'</code></pre><p>5、特殊的null值处理</p><pre><code>#(1)判断时
xx is null
xx is not null
xx <=> null
#(2)计算时
ifnull(xx,代替值) 当xx是null时,用代替值计算</code></pre><ul><li>练习</li></ul><p>查询商品价格>3000的商品</p><pre><code class="sql">select * from product where price > 3000;</code></pre><p>查询pid=1的商品</p><pre><code class="sql">select * from product where pid = 1;</code></pre><p>查询pid<>1的商品(!=)</p><pre><code class="sql">select * from product where pid <> 1;</code></pre><p>查询价格在3000到6000之间的商品</p><pre><code class="sql">select * from product where price between 3000 and 6000;</code></pre><p>查询pid在1,5,7,15范围内的商品</p><pre><code class="sql">select * from product where id = 1;
select * from product where id = 5;
select * from product where id = 7;
select * from product where id = 15;
select * from product where id in (1,5,7,15);</code></pre><p>查询商品名以iPho开头的商品(iPhone系列)</p><pre><code class="sql">select * from product where pname like 'iPho%';</code></pre><p>查询商品价格大于3000并且数量大于20的商品 (条件 and 条件 and…)</p><pre><code class="sql">select * from product where price > 3000 and num > 20;</code></pre><p>查询id=1或者价格小于3000的商品</p><pre><code class="sql">select * from product where pid = 1 or price < 3000;</code></pre><h6>5.4、排序查询</h6><p>排序是写在查询的后面,代表把数据查询出来之后再排序</p><ul><li><p>环境的准备</p><pre><code class="sql"># 创建学生表(有sid,学生姓名,学生性别,学生年龄,分数列,其中sid为主键自动增长)
CREATE TABLE student(
sid INT PRIMARY KEY auto_increment,
sname VARCHAR(40),
sex VARCHAR(10),
age INT,
score DOUBLE
);
INSERT INTO student VALUES(null,'zs','男',18,98.5);
INSERT INTO student VALUES(null,'ls','女',18,96.5);
INSERT INTO student VALUES(null,'ww','男',15,50.5);
INSERT INTO student VALUES(null,'zl','女',20,98.5);
INSERT INTO student VALUES(null,'tq','男',18,60.5);
INSERT INTO student VALUES(null,'wb','男',38,98.5);
INSERT INTO student VALUES(null,'小丽','男',18,100);
INSERT INTO student VALUES(null,'小红','女',28,28);
INSERT INTO student VALUES(null,'小强','男',21,95);
</code></pre></li><li>单列排序</li></ul><p>语法: 只按某一个字段进行排序,单列排序</p><pre><code class="sql">SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC]; //ASC: 升序,默认值; DESC: 降序</code></pre><p>案例: 以分数降序查询所有的学生</p><pre><code class="sql">SELECT * FROM student ORDER BY score DESC</code></pre><ul><li>组合排序</li></ul><p>语法: 同时对多个字段进行排序,如果第1个字段相等,则按第2个字段排序,依次类推</p><pre><code class="sql">SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];</code></pre><p>练习: 以分数降序查询所有的学生, 如果分数一致,再以age降序</p><pre><code class="sql">SELECT * FROM student ORDER BY score DESC, age DESC</code></pre><h6>5.5、聚合函数</h6><p>聚合函数用于统计,通常会和分组查询一起使用,用于统计每组的数据</p><ul><li>聚合函数列表</li></ul><p><img src="/img/remote/1460000041124658" alt="" title=""></p><p>语法</p><pre><code class="sql">SELECT 聚合函数(列名) FROM 表名 [where 条件];</code></pre><p>案例</p><pre><code class="sql">-- 求出学生表里面的最高分数
SELECT MAX(score) FROM student
-- 求出学生表里面的最低分数
SELECT MIN(score) FROM student
-- 求出学生表里面的分数的总和(忽略null值)
SELECT SUM(score) FROM student
-- 求出学生表里面的平均分
SELECT AVG(score) FROM student
-- 求出学生表里面的平均分(缺考了当成0分处理)
SELECT AVG(IFNULL(score,0)) FROM student
-- 统计学生的总人数 (忽略null)
SELECT COUNT(sid) FROM student
SELECT COUNT(*) FROM student</code></pre><p>注意: 聚合函数会忽略空值NULL</p><p>我们发现对于NULL的记录不会统计,建议如果统计个数则不要使用有可能为null的列,但如果需要把NULL也统计进去呢?我们可以通过 IFNULL(列名,默认值) 函数来解决这个问题. 如果列不为空,返回这列的值。如果为NULL,则返回默认值。</p><pre><code class="sql">-- 求出学生表里面的平均分(缺考了当成0分处理)
SELECT AVG(IFNULL(score,0)) FROM student;</code></pre><h6>5.6、分组查询</h6><p>GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用</p><ul><li>分组</li></ul><p>语法</p><pre><code class="sql">SELECT 字段1,字段2... FROM 表名 [where 条件] GROUP BY 列 [HAVING 条件];</code></pre><p>案例</p><pre><code class="sql">-- 根据性别分组, 统计每一组学生的总人数
SELECT sex '性别',COUNT(sid) '总人数' FROM student GROUP BY sex
-- 根据性别分组,统计每组学生的平均分
SELECT sex '性别',AVG(score) '平均分' FROM student GROUP BY sex
-- 根据性别分组,统计每组学生的总分
SELECT sex '性别',SUM(score) '总分' FROM student GROUP BY sex</code></pre><ul><li>分组后筛选 having</li></ul><p>分组后的条件,不能写在where之后,where关键字要写在group by之前</p><p>根据性别分组, 统计每一组学生的总人数> 5的(分组后筛选)</p><pre><code class="sql">SELECT sex, count(*) FROM student GROUP BY sex HAVING count(sid) > 5</code></pre><p>根据性别分组,只统计年龄大于等于18的,并且要求组里的人数大于4</p><pre><code class="sql">SELECT sex '性别',COUNT(sid) '总人数' FROM student WHERE age >= 18 GROUP BY sex HAVING COUNT(sid) > 4</code></pre><ul><li>where和having的区别【面试】</li></ul><p>where 子句作用</p><ul><li>1)对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,即先过滤再分组。</li><li>2)where后面不可以使用聚合函数</li></ul><p>having字句作用</p><ul><li>1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。</li><li>2) having后面可以使用聚合函数</li></ul><h6>5.7、分页查询</h6><ul><li><p>语法</p><pre><code class="sql">select ... from .... limit a ,b</code></pre></li></ul><p><img src="/img/remote/1460000041124659" alt="" title=""></p><ul><li><p>案例</p><pre><code class="sql">-- 分页查询
-- limit 关键字是使用在查询的后边,如果有排序的话则使用在排序的后边
-- limit的语法: limit offset,length 其中offset表示跳过多少条数据,length表示查询多少条数据
SELECT * FROM product LIMIT 0,3
-- 查询product表中的前三条数据(0表示跳过0条,3表示查询3条)
SELECT * FROM product LIMIT 3,3
-- 查询product表的第四到六条数据(3表示跳过3条,3表示查询3条)
-- 分页的时候,只会告诉你我需要第几页的数据,并且每页有多少条数据
-- 假如,每页需要3条数据,我想要第一页数据: limit 0,3
-- 假如,每页需要3条数据,我想要第二页数据: limit 3,3
-- 假如,每页需要3条数据,我想要第三页数据: limit 6,3
-- 结论: length = 每页的数据条数,offset = (当前页数 - 1)*每页数据条数
-- limit (当前页数 - 1)*每页数据条数, 每页数据条数</code></pre><h6>5.8、查询的语法小结</h6><pre><code class="sql">select...from...where...group by...order by...limit
select...from...where...
select...from...where...order by...
select...from...where...limit...
select...from...where...order by...imit</code></pre><h2>第六章 数据库三范式</h2></li></ul><p>好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。</p><h6>6.1、第一范式: 确保每列保持原子性</h6><p>第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。</p><p>第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。</p><p><img src="/img/remote/1460000041124660" alt="" title=""></p><p>如果不遵守第一范式,查询出数据还需要进一步处理(查询不方便)。遵守第一范式,需要什么字段的数据就查询什么数据(方便查询)</p><h6>6.2、第二范式: 确保表中的每列都和主键相关</h6><p>第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。</p><p>比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示</p><p><img src="/img/remote/1460000041124661" alt="" title=""></p><p>这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。</p><p>而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示</p><pre><code><img src="imgs/tu_13.png" style="zoom: 67%;" /></code></pre><p>这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可</p><h6>6.3、第三范式: 确保每列都和主键列直接相关,而不是间接相关</h6><p>第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。</p><p>比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。</p><pre><code><img src="imgs/tu_14.png" style="zoom:67%;" /></code></pre><p>这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余</p><h2>第七章 外键约束</h2><h6>7.1、外键约束的概念</h6><p>在遵循三范式的前提下,很多时候我们必须要进行拆表,将数据分别存放在多张表中,以减少冗余数据。但是拆分出来的表与表之间是有着关联关系的,我们必须得通过一种约束来约定表与表之间的关系,这种约束就是外键约束</p><h6>7.2、外键约束的作用</h6><p>外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。</p><h6>7.3、创建外键约束的语法</h6><ul><li><p>在建表时指定外键约束</p><pre><code class="sql">create table [数据名.]从表名(
字段名1 数据类型 primary key ,
字段名2 数据类型 ,
....,
[constraint 外键约束名] foreign key (从表字段) references 主表名(主表字段) [on update 外键约束等级][on delete 外键约束等级]
#外键只能在所有字段列表后面单独指定
#如果要自己命名外键约束名,建议 主表名_从表名_关联字段名_fk
);</code></pre></li><li><p>在建表后指定外键约束</p><pre><code class="sql">alter table 从表名称 add [constraint 外键约束名] foreign key (从表字段名) references 主表名(主表被参照字段名) [on update xx][on delete xx];</code></pre><h6>7.4、删除外键约束的语法</h6><pre><code class="sql">ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;
#查看约束名 SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
#删除外键约束不会删除对应的索引,如果需要删除索引,需要用ALTER TABLE 表名称 DROP INDEX 索引名;
#查看索引名 show index from 表名称;</code></pre><h6>7.5、外键约束的要求</h6></li><li>在从表上建立外键,而且主表要先存在。</li><li>一个表可以建立多个外键约束</li><li>通常情况下,从表的外键列一定要指向主表的主键列</li><li>从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样</li></ul><h6>7.6、外键约束等级</h6><ul><li><strong>Cascade方式</strong>:在主表上update/delete记录时,同步update/delete掉从表的匹配记录</li><li><strong>Set null方式</strong>:在主表上update/delete记录时,将从表上匹配记录的列设为null,但是要注意子表的外键列不能为not null</li><li><strong>No action方式</strong>:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作</li><li><strong>Restrict方式</strong>:同no action, 都是立即检查外键约束</li><li><strong>Set default方式</strong>(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别</li><li><strong>如果没有指定等级,就相当于Restrict方式</strong></li></ul><h6>7.7、外键约束练习</h6><pre><code class="sql">-- 部门表
create table dept(
id int primary key,
dept_name varchar(50),
dept_location varchar(50)
);
-- 员工表
CREATE TABLE emp(
eid int primary key,
name varchar(50) not null,
sex varchar(10),
dept_id int
);
-- 给员工表表的dept_id添加外键指向部门表的主键
alter table emp add foreign key(dept_id) references dept(id)</code></pre><h2>第八章 多表间关系</h2><h6>8.1、一对多关系</h6><ul><li>概念</li></ul><p>一对多的关系是指: 主表的一行数据可以同时对应从表的多行数据,反过来就是从表的多行数据指向主表的同一行数据。</p><ul><li>应用场景</li></ul><p>分类表和商品表、班级表和学生表、用户表和订单表等等</p><ul><li>建表原则</li></ul><p>将一的一方作为主表,多的一方作为从表,在从表中指定一个字段作为外键,指向主表的主键</p><p><img src="/img/remote/1460000041124662" alt="" title=""></p><ul><li><p>建表语句练习</p><pre><code class="sql">-- 创建分类表
CREATE TABLE category(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(50)
);
-- 创建商品表
CREATE TABLE product(
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(50),
price DOUBLE,
cid INT
)
-- 给商品表添加一个外键
alter table product add foreign key(cid) references category(cid)</code></pre><h6>8.2、多对多关系</h6></li><li>概念</li></ul><p>两张表都是多的一方,A表的一行数据可以同时对应B表的多行数据,反之B表的一行数据也可以同时对应A表的多行数据</p><ul><li>应用场景</li></ul><p>订单表和商品表、学生表和课程表等等</p><ul><li>建表原则</li></ul><p>因为两张表都是多的一方,所以在两张表中都无法创建外键,所以需要新创建一张中间表,在中间表中定义两个字段,这俩字段分别作为外键指向两张表各自的主键</p><p><img src="/img/remote/1460000041124663" alt="" title=""></p><ul><li><p>建表语句练习</p><pre><code class="sql">-- 创建学生表
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50)
);
-- 创建课程表
CREATE TABLE course(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(20)
);
-- 创建中间表
CREATE TABLE s_c_table(
sno INT,
cno INT
);
-- 给sno字段添加外键指向student表的sid主键
ALTER TABLE s_c_table ADD CONSTRAINT fkey01 FOREIGN KEY(sno) REFERENCES student(sid);
-- 给cno字段添加外键指向course表的cid主键
ALTER TABLE s_c_table ADD CONSTRAINT fkey03 FOREIGN KEY(cno) REFERENCES course(cid);</code></pre><h6>8.3、一对一关系(了解)</h6></li><li>第一种一对一关系</li></ul><p>我们之前学习过一对多关系,在一对多关系中主表的一行数据可以对应从表的多行数据,反之从表的一行数据则只能对应主表的一行数据。这种一行数据对应一行数据的关系,我们可以将其看作一对一关系</p><ul><li>第二种一对一关系</li></ul><p>A表中的一行数据对应B表中的一行数据,反之B表中的一行数据也对应A表中的一行数据,此时我们可以将A表当做主表B表当做从表,或者是将B表当做主表A表当做从表</p><ul><li>建表原则</li></ul><p>在从表中指定一个字段创建外键并指向主表的主键,然后给从表的外键字段添加唯一约束</p><h2>第九章 多表关联查询</h2><p>多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来</p><h6>9.1、环境准备</h6><pre><code class="sql">-- 创建一张分类表(类别id,类别名称.备注:类别id为主键并且自动增长)
CREATE TABLE t_category(
cid INT PRIMARY KEY auto_increment,
cname VARCHAR(40)
);
INSERT INTO t_category values(null,'手机数码');
INSERT INTO t_category values(null,'食物');
INSERT INTO t_category values(null,'鞋靴箱包');
-- 创建一张商品表(商品id,商品名称,商品价格,商品数量,类别.备注:商品id为主键并且自动增长)
CREATE TABLE t_product(
pid INT PRIMARY KEY auto_increment,
pname VARCHAR(40),
price DOUBLE,
num INT,
cno INT
);
insert into t_product values(null,'苹果电脑',18000,10,1);
insert into t_product values(null,'iPhone8s',5500,100,1);
insert into t_product values(null,'iPhone7',5000,100,1);
insert into t_product values(null,'iPhone6s',4500,1000,1);
insert into t_product values(null,'iPhone6',3800,200,1);
insert into t_product values(null,'iPhone5s',2000,10,1);
insert into t_product values(null,'iPhone4s',18000,1,1);
insert into t_product values(null,'方便面',4.5,1000,2);
insert into t_product values(null,'咖啡',10,100,2);
insert into t_product values(null,'矿泉水',2.5,100,2);
insert into t_product values(null,'法拉利',3000000,50,null);
-- 给 商品表添加外键
ALTER TABLE t_product ADD FOREIGN KEY(cno) REFERENCES t_category(cid);</code></pre><h6>9.2、交叉查询【了解】</h6><p>交叉查询其实就是将多张表的数据没有条件地连接在一起进行展示</p><ul><li><p>语法</p><pre><code class="sql">select a.列,a.列,b.列,b.列 from a,b ;
select a.*,b.* from a,b ;
--或者
select * from a,b;</code></pre></li><li>练习</li></ul><p>使用交叉查询类别和商品</p><pre><code class="sql">select * from t_category,t_product;</code></pre><p>通过查询结果我们可以看到,交叉查询其实是一种错误的做法,在查询到的结果集中有大量的错误数据,我们称交叉查询到的结果集是笛卡尔积</p><ul><li>笛卡尔积</li></ul><p>假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。</p><h6>9.3、内连接查询</h6><p>交叉查询产生这样的结果并不是我们想要的,那么怎么去除错误的、不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过<strong>关联关系(主外键关系)</strong>去除笛卡尔积。这种通过条件过滤去除笛卡尔积的查询,我们称之为连接查询。连接查询又可以分为内连接查询和外连接查询,我们先学习内连接查询</p><ul><li>隐式内连接查询</li></ul><p>隐式内连接查询里面是没有inner join关键字</p><pre><code class="sql">select [字段,字段,字段] from a,b where 连接条件 (b表里面的外键 = a表里面的主键 ) </code></pre><ul><li>显式内连接查询</li></ul><p>显式内连接查询里面是有inner join关键字</p><pre><code class="sql">select [字段,字段,字段] from a [inner] join b on 连接条件 [ where 其它条件]</code></pre><ul><li>内连接查询练习</li></ul><p>查询所有类别下的商品信息,如果该类别下没有商品则不展示</p><pre><code class="sql">-- 1 隐式内连接方式
select *from t_category c, t_product p WHERE c.cid = p.cno;
-- 2 显示内连接方式
-- 查询手机数码这个分类下的所有商品的信息以及分类信息
SELECT * FROM t_product tp INNER JOIN t_category tc ON tp.cno = tc.cid WHERE tc.cname = '手机数码';
SELECT * from t_category c INNER JOIN t_product p ON c.cid = p.cno</code></pre><ul><li>内连接查询的特点</li></ul><p>主表和从表中的数据都是满足连接条件则能够查询出来,不满足连接条件则不会查询出来</p><h6>9.4、外连接查询</h6><p>我们发现内连接查询出来的是满足连接条件的公共部分, 如果要保证查询出某张表的全部数据情况下进行连接查询. 那么就要使用外连接查询了. 外连接分为左外连接和右外连接</p><ul><li>左外连接查询</li></ul><p>概念</p><p>以join左边的表为主表,展示主表的所有数据,根据条件查询连接右边表的数据,若满足条件则展示,若不满足则以null显示。可以理解为:在内连接的基础上保证左边表的数据全部显示</p><p>语法</p><pre><code class="sql">select 字段 from a left [outer] join b on 条件</code></pre><p>练习</p><p>查询所有类别下的商品信息,就算该类别下没有商品也需要将该类别的信息展示出来</p><pre><code class="sql">SELECT * FROM t_category c LEFT OUTER JOIN t_product p ON c.cid = p.cno</code></pre><ul><li>右外连接查询</li></ul><p>概念</p><p>以join右边的表为主表,展示右边表的所有数据,根据条件查询join左边表的数据,若满足则展示,若不满足则以null显示。可以理解为:在内连接的基础上保证右边表的数据全部显示</p><p>语法</p><pre><code class="sql">select 字段 from a right [outer] join b on 条件</code></pre><p>练习</p><p>查询所有商品所对应的类别信息</p><pre><code class="sql">SELECT * FROM t_category c RIGHT OUTER JOIN t_product p ON c.cid = p.cno</code></pre><h6>9.5、union联合查询实现全外连接查询</h6><p>首先要明确,联合查询不是多表连接查询的一种方式。联合查询是将多条查询语句的查询结果合并成一个结果并去掉重复数据。</p><p>全外连接查询的意思就是将左表和右表的数据都查询出来,然后按照连接条件连接</p><ul><li><p>union的语法</p><pre><code class="sql">查询语句1 union 查询语句2 union 查询语句3 ...</code></pre></li><li><p>练习</p><pre><code class="sql"># 用左外的A union 右外的B
SELECT * FROM t_category c LEFT OUTER JOIN t_product p ON c.cid = p.cno
union
SELECT * FROM t_category c RIGHT OUTER JOIN t_product p ON c.cid = p.cno</code></pre><h6>9.6、自连接查询</h6></li></ul><p>自连接查询是一种特殊的多表连接查询,因为两个关联查询的表是同一张表,通过取别名的方式来虚拟成两张表,然后进行两张表的连接查询</p><ul><li><p>准备工作</p><pre><code class="sql">-- 员工表
CREATE TABLE emp (
id INT PRIMARY KEY, -- 员工id
ename VARCHAR(50), -- 员工姓名
mgr INT , -- 上级领导
joindate DATE, -- 入职日期
salary DECIMAL(7,2) -- 工资
);
-- 添加员工
INSERT INTO emp(id,ename,mgr,joindate,salary) VALUES
(1001,'孙悟空',1004,'2000-12-17','8000.00'),
(1002,'卢俊义',1006,'2001-02-20','16000.00'),
(1003,'林冲',1006,'2001-02-22','12500.00'),
(1004,'唐僧',1009,'2001-04-02','29750.00'),
(1005,'李逵',1006,'2001-09-28','12500.00'),
(1006,'宋江',1009,'2001-05-01','28500.00'),
(1007,'刘备',1009,'2001-09-01','24500.00'),
(1008,'猪八戒',1004,'2007-04-19','30000.00'),
(1009,'罗贯中',NULL,'2001-11-17','50000.00'),
(1010,'吴用',1006,'2001-09-08','15000.00'),
(1011,'沙僧',1004,'2007-05-23','11000.00'),
(1012,'李逵',1006,'2001-12-03','9500.00'),
(1013,'小白龙',1004,'2001-12-03','30000.00'),
(1014,'关羽',1007,'2002-01-23','13000.00');
#查询孙悟空的上级
SELECT employee.*,manager.ename mgrname FROM emp employee,emp manager where employee.mgr=manager.id AND employee.ename='孙悟空'</code></pre></li><li>自连接查询练习</li></ul><p>查询员工的编号,姓名,薪资和他领导的编号,姓名,薪资</p><pre><code>#这些数据全部在员工表中
#把t_employee表,即当做员工表,又当做领导表
#领导表是虚拟的概念,我们可以通过取别名的方式虚拟
SELECT employee.id "员工的编号",emp.ename "员工的姓名" ,emp.salary "员工的薪资",
manager.id "领导的编号" ,manager.ename "领导的姓名",manager.salary "领导的薪资"
FROM emp employee INNER JOIN emp manager
#emp employee:employee.,表示的是员工表的
#emp manager:如果用manager.,表示的是领导表的
ON employee.mgr = manager.id # 员工的mgr指向上级的id
#表的别名不要加"",给列取别名,可以用"",列的别名不使用""也可以,但是要避免包含空格等特殊符号。</code></pre><h3>第十章 子查询</h3><p>如果一个查询语句嵌套在另一个查询语句里面,那么这个查询语句就称之为子查询,根据位置不同,分为:where型,from型,exists型。注意:不管子查询在哪里,子查询必须使用()括起来。</p><h6>10.1、where型</h6><p>①子查询是单值结果(单行单列),那么可以对其使用(=,>等比较运算符)</p><pre><code class="sql"># 查询价格最高的商品信息
select * from t_product where price = (select max(price) from t_product)</code></pre><p>②子查询是多值结果,那么可对其使用(【not】in(子查询结果),或 >all(子查询结果),或>=all(子查询结果),<all(子查询结果),<=all(子查询结果),或 >any(子查询结果),或>=any(子查询结果),<any(子查询结果),<=any(子查询结果))</p><pre><code class="sql"># 查询价格最高的商品信息
SELECT * FROM t_product WHERE price >=ALL(SELECT price FROM t_product)
select * from t_product order by price desc limit 0,1</code></pre><h6>10.2、from型</h6><p>子查询的结果是多行多列的结果,类似于一张表格。</p><p>必须给子查询取别名,即临时表名,表的别名不要加“”和空格。</p><pre><code class="sql">-- 思路一: 使用连接查询
-- 使用外连接,查询出分类表的所有数据
SELECT tc.cname,COUNT(tp.pid) FROM t_category tc LEFT JOIN t_product tp ON tp.cno = tc.cid GROUP BY tc.cname
-- 思路二: 使用子查询
-- 第一步:对t_product根据cno进行分组查询,统计每个分类的商品数量
SELECT cno,COUNT(pid) FROM t_product GROUP BY cno
-- 第二步: 用t_category表去连接第一步查询出来的结果,进行连接查询,此时要求查询出所有的分类
SELECT tc.cname,IFNULL(tn.total,0) '总数量' FROM t_category tc LEFT JOIN (SELECT cno,COUNT(pid) total FROM t_product GROUP BY cno) tn ON tn.cno=tc.cid</code></pre><h6>10.3、exists型</h6><pre><code class="sql"># 查询那些有商品的分类
SELECT cid,cname FROM t_category tc WHERE EXISTS (SELECT * FROM t_product tp WHERE tp.cno = tc.cid);</code></pre><p>链接:blog.csdn.net/qq_42076902/article/details/121701974</p><p><img src="/img/bVbHCzg" alt="" title=""></p>
公司用的 MySQL 团队开发规范,太详细了,建议收藏!
https://segmentfault.com/a/1190000041105650
2021-12-12T23:51:19+08:00
2021-12-12T23:51:19+08:00
民工哥
https://segmentfault.com/u/jishuroad
24
<h2>数据库对象命名规范</h2><h6>数据库对象</h6><p>数据库对象是数据库的组成部分,常见的有以下几种:<code>表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)</code>等的命名约定。</p><h6>数据库对象全局命名规范</h6><ul><li>1、命名使用具有意义的英文词汇,词汇中间以下划线分隔</li><li>2、命名只能使用英文字母、数字、下划线,以英文字母开头</li><li>3、避免用MySQL的保留字如:backup、call、group等</li><li>4、所有数据库对象使用小写字母,实际上MySQL中是可以设置大小写是否敏感的,为了保证统一性,我们这边规范全部小写表示。</li></ul><h6>数据库命名规范</h6><ul><li>1、数据库命名尽量不超过30个字符。</li><li>2、数据库命名一般为项目名称+代表库含义的简写,比如IM项目的工作流数据库,可以是 im_flow。</li><li>3、数据库创建时必须添加默认字符集和校对规则子句。默认字符集为UTF8(已迁移dumbo的使用utf8mb4)</li><li>4、命名应使用小写。</li></ul><h6>表命名规范</h6><ul><li>1、常规表表名以t_开头,t代表table的意思,命名规则即 t + 模块(包含模块含义的简写)+ 表(包含表含义的简写),比如用户模块的教育信息表:t_user_eduinfo。</li><li>2、临时表(RD、QA或DBA同学用于数据临时处理的表),命名规则:temp前缀+模块+表+日期后缀:temp_user_eduinfo_20210719</li><li>3、备份表(用于保存和归档历史数据或者作为灾备恢复的数据)命名规则,bak前缀+模块+表+日期后缀:bak_user_eduinfo_20210719</li><li>4、同一个模块的表尽可能使用相同的前缀,表名称尽可能表达含义</li><li>5、多个单词以下划线 _ 分隔</li><li>6、常规表表名尽量不超过30个字符,temp表和bak表视情况而定,也尽量简短为宜,命名应使用小写</li></ul><h6>字段命名规范</h6><ul><li>1、字段命名需要表示其实际含义的英文单词或简写,单词之间用下划线 _ 进行连接,如 service_ip、service_port。</li><li>2、各表之间相同意义的字段必须同名,比如a表和b表都有创建时间,应该统一为create_time,不一致会很混乱。</li><li>3、多个单词以下划线 _ 分隔</li><li>4、字段名尽量不超过30个字符,命名应该使用小写</li></ul><h6>索引命名规范</h6><ul><li>1、唯一索引使用uni + 字段名 来命名:<code>create unique index uni_uid on t_user_basic(uid)</code> 。</li><li>2、非唯一索引使用idx + 字段名 来命名:<code>create index idx_uname_mobile on t_user_basic(uname,mobile)</code> 。</li><li>3、多个单词以下划线 _ 分隔。</li><li>4、索引名尽量不超过50个字符,命名应该使用小写,组合索引的字段不宜太多,不然也不利于查询效率的提升。</li><li>5、多单词组成的列名,取尽可能代表意义的缩写,如 test_contact表member_id和friend_id上的组合索引:idx_mid_fid。</li><li>6、理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)。</li></ul><h6>视图命名规范</h6><ul><li>1、视图名以v开头,表示view,完整结构是v+视图内容含义缩写。</li><li>2、如果视图只来源单个表,则为v+表名。如果视图由几个表关联产生就用v+下划线(_)连接几个表名,视图名尽量不超过30个字符。如超过30个字符则取简写。</li><li>3、如无特殊需要,严禁开发人员创建视图。</li><li>4、命名应使用小写。</li></ul><h6>存储过程命名规范</h6><ul><li>1、存储过程名以sp开头,表示存储过程(storage procedure)。之后多个单词以下划线(_)进行连接。存储过程命名中应体现其功能。存储过程名尽量不能超过30个字符。</li><li>2、存储过程中的输入参数以i_开头,输出参数以o_开头。</li><li><p>3、命名应使用小写。</p><pre><code class="sql">create procedure sp_multi_param(in i_id bigint,in i_name varchar(32),out o_memo varchar(100)) </code></pre><h6>函数命名规范</h6></li><li>1、函数名以func开始,表示function。之后多个单词以下划线(_)进行连接,函数命名中应体现其功能。函数名尽量不超过30个字符。</li><li><p>2、命名应使用小写。</p><pre><code class="sql">create function func_format_date(ctime datetime)</code></pre><h6>触发器命名规范</h6></li><li>1、触发器以trig开头,表示trigger 触发器。</li><li>2、基本部分,描述触发器所加的表,触发器名尽量不超过30个字符。</li><li>3、后缀(_i,_u,_d),表示触发条件的触发方式(insert,update或delete)。</li><li><p>4、命名应使用小写。</p><pre><code class="sql">DROP TRIGGER IF EXISTS trig_attach_log_d;
CREATE TRIGGER trig_attach_log_d AFTER DELETE ON t_dept FOR EACH ROW; </code></pre><h6>约束命名规范</h6></li><li>1、唯一约束:uk_表名称_字段名。uk是UNIQUE KEY的缩写。比如给一个部门的部门名称加上唯一约束,来保证不重名,如下:<code>ALTER TABLE t_dept ADD CONSTRAINT un_name UNIQUE(name);</code></li><li>2、外键约束:fk_表名,后面紧跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名用下划线(_)分隔。如下:<code>ALTER TABLE t_user ADD CONSTRAINT fk_user_dept FOREIGN KEY(depno) REFERENCES t_dept (id);</code></li><li><p>3、非空约束:如无特殊需要,建议所有字段默认非空(not null),不同数据类型必须给出默认值(default)。</p><pre><code class="sql">`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT '',
`deptId` int(11) DEFAULT 0,
`salary` float DEFAULT NULL, </code></pre></li><li>4、出于性能考虑,如无特殊需要,建议不使用外键。参照完整性由代码控制。这个也是我们普遍的做法,从程序角度进行完整性控制,但是如果不注意,也会产生脏数据。</li><li>5、命名应使用小写。</li></ul><h6>用户命名规范</h6><ul><li>1、生产使用的用户命名格式为 code_应用</li><li>2、只读用户命名规则为 read_应用</li></ul><h2>数据库对象设计规范</h2><h6>存储引擎的选择</h6><ul><li>1、如无特殊需求,必须使用innodb存储引擎。</li></ul><p>可以通过 <code>show variables like 'default_storage_engine'</code>来查看当前默认引擎。主要有MyISAM 和 InnoDB,从5.5版本开始默认使用 InnoDB 引擎。点击这里进行刷题。</p><p>基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。</p><p>另外,MySQL 系列面试题和答案全部整理好了,微信搜索民工哥技术之路,在后台发送:MySQL 可以在线阅读。</p><h6>字符集的选择</h6><ul><li>1、如无特殊要求,必须使用utf8或utf8mb4。</li></ul><p>在国内,选择对中文和各语言支持都非常完善的utf8格式是最好的方式,MySQL在5.5之后增加utf8mb4编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。</p><p>所以utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。推荐看下:MySQL数据库开发的 36 条军规。</p><p>可以使用如下脚本来查看数据库的编码格式</p><pre><code class="sql">SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
-- 或
SHOW VARIABLES Like '%char%'; </code></pre><h6>表设计规范</h6><ul><li>1、不同应用间所对应的数据库表之间的关联应尽可能减少,不允许使用外键对表之间进行关联,确保组件对应的表之间的独立性,为系统或表结构的重构提供可能性。目前业内的做法一般 由程序控制参照完整性。</li><li>2、表设计的角度不应该针对整个系统进行数据库设计,而应该根据系统架构中组件划分,针对每个组件所处理的业务进行数据库设计。</li><li>3、表必须要有PK,主键的优势是唯一标识、有效引用、高效检索,所以一般情况下尽量有主键字段。</li><li>4、一个字段只表示一个含义。</li><li>5、表不应该有重复列。</li><li>6、禁止使用复杂数据类型(数组,自定义等),Json类型的使用视情况而定。</li><li>7、需要join的字段(连接键),数据类型必须保持绝对一致,避免隐式转换。比如关联的字段都是int类型。</li><li>8、设计应至少满足第三范式,尽量减少数据冗余。一些特殊场景允许反范式化设计,但在项目评审时需要对冗余字段的设计给出解释。</li><li>9、TEXT字段作为大体量文本存储,必须放在独立的表中 , 用PK与主表关联。如无特殊需要,禁止使用TEXT、BLOB字段。</li><li>10、需要定期删除(或者转移)过期数据的表,通过分表解决,我们的做法是按照2/8法则将操作频率较低的历史数据迁移到历史表中,按照时间或者则曾Id做切割点。</li><li>11、单表字段数不要太多,建议最多不要大于50个。过度的宽表对性能也是很大的影响。</li><li><p>12、MySQL在处理大表时,性能就开始明显降低,所以建议单表物理大小限制在16GB,表中数据行数控制在2000W内。</p><ul><li>业内的规则是超过2000W性能开始明显降低。但是这个值是灵活的,你可以根据实际情况进行测试来判断,比如阿里的标准就是500W,百度的确是2000W。实际上是否宽表,单行数据所占用的空间都有起到作用的。</li></ul></li><li>13、如果数据量或数据增长在前期规划时就较大,那么在设计评审时就应加入分表策略,后续会有专门的文章来分析数据拆分的做法:垂直拆分(垂直分库和垂直分表)、水平拆分(分库分表和库内分表);</li><li>14、无特殊需求,严禁使用分区表</li></ul><h6>字段设计规范</h6><ul><li>1、INT:如无特殊需要,存放整型数字使用UNSIGNED INT型,整型字段后的数字代表显示长度。比如 id int(11) NOT NULL</li><li>2、DATETIME:所有需要精确到时间(时分秒)的字段均使用DATETIME,不要使用TIMESTAMP类型。</li></ul><p>对于TIMESTAMP,它把写入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。</p><p>另外DATETIME存储的范围也比较大:</p><pre><code>timestamp所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。
datetime所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。</code></pre><p>但是特殊情况,对于跨时区的业务,TIMESTAMP更为合适。</p><ul><li>3、VARCHAR:所有动态长度字符串 全部使用VARCHAR类型,类似于状态等有限类别的字段,也使用可以比较明显表示出实际意义的字符串,而不应该使用INT之类的数字来代替;VARCHAR(N),</li></ul><p>N表示的是字符数而不是字节数。比如VARCHAR(255),可以最大可存储255个字符(字符包括英文字母,汉字,特殊字符等)。但N应尽可能小,因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节,且存储字符个数由所选字符集决定。</p><p>如UTF8存储一个字符最大要3个字节,那么varchar在存放占用3个字节长度的字符时不应超过21845个字符。同时,在进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。(如无特殊需要,原则上单个varchar型字段不允许超过255个字符)</p><ul><li>4、TEXT:仅仅当字符数量可能超过20000个的时候,才可以使用TEXT类型来存放字符类数据,因为所有MySQL数据库都会使用UTF8字符集。</li></ul><p>所有使用TEXT类型的字段必须和原表进行分拆,与原表主键单独组成另外一个表进行存放,与大文本字段的隔离,目的是。如无特殊需要,不使用MEDIUMTEXT、TEXT、LONGTEXT类型</p><ul><li>5、对于精确浮点型数据存储,需要使用DECIMAL,严禁使用FLOAT和DOUBLE。</li><li>6、如无特殊需要,尽量不使用BLOB类型</li><li>7、如无特殊需要,字段建议使用NOT NULL属性,可用默认值代替NULL</li><li>8、自增字段类型必须是整型且必须为UNSIGNED,推荐类型为INT或BIGINT,并且自增字段必须是主键或者主键的一部分。</li></ul><h6>索引设计规范</h6><ul><li>1、索引区分度</li></ul><p>索引必须创建在索引选择性(区分度)较高的列上,选择性的计算方式为: <code>selecttivity = count(distinct c_name)/count(*) ; </code>如果区分度结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行</p><ul><li>2、遵循最左前缀</li></ul><p>对于确定需要组成组合索引的多个字段,设计时建议将选择性高的字段靠前放。使用时,组合索引的首字段,必须在where条件中,且需要按照最左前缀规则去匹配。</p><ul><li>3、禁止使用外键,可以在程序级别来约束完整性</li><li>4、Text类型字段如果需要创建索引,必须使用前缀索引</li><li>5、单张表的索引数量理论上应控制在5个以内。经常有大批量插入、更新操作表,应尽量少建索引,索引建立的原则理论上是多读少写的场景。</li><li>6、ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面,形成覆盖索引</li><li>7、正确理解和计算索引字段的区分度,文中有计算规则,区分度高的索引,可以快速得定位数据,区分度太低,无法有效的利用索引,可能需要扫描大量数据页,和不使用索引没什么差别。</li><li>8、正确理解和计算前缀索引的字段长度,文中有判断规则,合适的长度要保证高的区分度和最恰当的索引存储容量,只有达到最佳状态,才是保证高效率的索引。</li><li><p>9、联合索引注意最左匹配原则:必须按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询(>、<、between、like)然后停止匹配。</p><pre><code>如:depno=1 and empname>'' and job=1 如果建立(depno,empname,job)顺序的索引,job是用不到索引的。</code></pre></li><li>10、应需而取策略,查询记录的时候,不要一上来就使用*,只取需要的数据,可能的话尽量只利用索引覆盖,可以减少回表操作,提升效率。</li><li>11、正确判断是否使用联合索引(上面联合索引的使用那一小节有说明判断规则),也可以进一步分析到索引下推(IPC),减少回表操作,提升效率。</li><li>12、避免索引失效的原则:禁止对索引字段使用函数、运算符操作,会使索引失效。这是实际上就是需要保证索引所对应字段的”干净度“。</li><li>13、避免非必要的类型转换,字符串字段使用数值进行比较的时候会导致索引无效。</li><li>14、模糊查询'%value%'会使索引无效,变为全表扫描,因为无法判断扫描的区间,但是'value%'是可以有效利用索引。</li><li>15、索引覆盖排序字段,这样可以减少排序步骤,提升查询效率</li><li>16、尽量的扩展索引,非必要不新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。</li></ul><p>举例子:比如一个品牌表,建立的的索引如下,一个主键索引,一个唯一索引</p><pre><code class="sql">PRIMARY KEY (`id`),
UNIQUE KEY `uni_brand_define` (`app_id`,`define_id`)</code></pre><p>当你同事业务代码中的检索语句如下的时候,应该立即警告了,即没有覆盖索引,也没按照最左前缀原则:</p><pre><code class="sql">select brand_id,brand_name from ds_brand_system where status=? and define_id=? and app_id=?</code></pre><p>建议改成如下:</p><pre><code class="sql">select brand_id,brand_name from ds_brand_system where app_id=? and define_id=? and status=? </code></pre><h6>约束设计规范</h6><ul><li>1、PK应该是有序并且无意义的,由开发人员自定义,尽可能简短,并且是自增序列。</li><li>2、表中除PK以外,还存在唯一性约束的,可以在数据库中创建以“uk_”作为前缀的唯一约束索引。</li><li>3、PK字段不允许更新。</li><li>4、禁止创建外键约束,外键约束由程序控制。</li><li>5、如无特殊需要,所有字段必须添加非空约束,即not null。</li><li>6、如无特殊需要,所有字段必须有默认值。</li></ul><h2>SQL使用规范</h2><h6>select 检索的规范性</h6><ul><li>1、尽量避免使用<code>select *,join</code>语句使用<code>select *</code>可能导致只需要访问索引即可完成的查询需要回表取数。</li><li>一种是可能取出很多不需要的数据,对于宽表来说,这是灾难;一种是尽可能避免回表,因为取一些根本不需要的数据而回表导致性能低下,是很不合算。</li><li>2、严禁使用 <code>select * from t_name</code> ,而不加任何where条件,道理一样,这样会变成全表全字段扫描。</li><li><p>3、MySQL中的text类型字段存储:</p><ul><li>3.1、不与其他普通字段存放在一起,因为读取效率低,也会影响其他轻量字段存取效率。</li><li>3.2、如果不需要text类型字段,又使用了select *,会让该执行消耗大量io,效率也很低下</li></ul></li><li>4、在取出字段上可以使用相关函数,但应尽可能避免出现 now() , rand() , sysdate() 等不确定结果的函数,在Where条件中的过滤条件字段上严禁使用任何函数,包括数据类型转换函数。大量的计算和转换会造成效率低下,这个在索引那边也描述过了。</li><li>5、分页查询语句全部都需要带有排序条件 , 否则很容易引起乱序</li><li>6、用in()/union替换or,效率会好一些,并注意in的个数小于300</li><li>7、严禁使用%前缀进行模糊前缀查询:如:<code>select a,b,c from t_name where a like ‘%name’;</code>可以使用%模糊后缀查询如:<code>select a,b from t_name where a like ‘name%’;</code></li><li>8、避免使用子查询,可以把子查询优化为join操作</li></ul><p>通常子查询在in子句中,且子查询中为简单SQL(不包含union、group by、order by、limit从句)时,才可以把子查询转化为关联查询进行优化。</p><h6>子查询性能差的原因:</h6><ul><li>子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能 会受到一定的影响;</li><li>特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大;</li><li>由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。</li></ul><h6>操作的规范性</h6><ul><li><p>1、禁止使用不含字段列表的INSERT语句</p><pre><code>如:insert into values ('a','b','c'); 应使用 insert into t_name(c1,c2,c3) values ('a','b','c'); 。</code></pre></li><li><p>2、大批量写操作(<code>UPDATE、DELETE、INSERT</code>),需要分批多次进行操作</p><ul><li>大批量操作可能会造成严重的主从延迟,特别是主从模式下,大批量操作可能会造成严重的主从延迟,因为需要slave从master的binlog中读取日志来进行数据同步。</li><li>binlog日志为row格式时会产生大量的日志</li></ul></li></ul><h2>程序上的约束</h2><p>后续我们团队的目标是研发评审工具对开发同学提交的建库、建表、刷数据、查询的语句进行分析,看看是否符合应有的规范。如果不符合,驳回修改。</p><blockquote>作者:翁智华<br>出处:cnblogs.com/wzh2010/</blockquote><p><img src="/img/bVcWDCv" alt="image.png" title="image.png"></p>
深度好文!服务器扩容思路及问题分析
https://segmentfault.com/a/1190000041105635
2021-12-12T23:47:57+08:00
2021-12-12T23:47:57+08:00
民工哥
https://segmentfault.com/u/jishuroad
4
<h2>为什么要扩容</h2><p>说人话就是, 无论如何优化性能,能达到的最大值是一定的,对于一个用户量大的应用,可以对服务器进行各种优化,诸如限流、资源隔离,但是上限还是在那里,这时候就应该改变我们的硬件,例如使用更强的CPU、更大的内存,在前文中举了一个学生食堂打饭的例子,如果学生多了,可以通过令牌桶算法优先给高三学生令牌打饭,但是如果高三的学生还是很多呢?那就只有增加窗口或者食堂的数量,也就是硬件上的扩容。</p><h2>扩容策略</h2><p>扩容策略可以分为两种, 一种是对单机整体扩容,也就是机器内部包含CPU、内存、存储设备等,另一种是扩容对应的组件,例如扩内存、扩磁盘、扩CPU。</p><h6>整机硬件</h6><p>整机扩容的好处是,有很多专业的服务器硬件供应商,例如IBM、浪潮、DELL、HP等,专业的硬件供应商,他们组装以及搭配方面可能经验更加丰富,另外有些公司会对组件进行一些优化,从而服务器更加稳定,可以类比为买电脑,有的人可能选择买淘宝卖家已经组装好的台式,有的人可能自己买各种硬件自己回家组装,对于一般人而言,选择前者是较为靠谱的选择,因为你即使懂硬件的一些参数,也难保自己搭配的机器是否能发挥各个部件最大性能。</p><h6>组件</h6><p>对于一些技术能力强悍的公司,更多的是自己买各种组件组装,这样成本更低,因为节省了组装等费用,并且可以根据业务个性化定制,例如有的公司是计算密集型的,那么主要是更换更强的CPU,有的IO密集型,那么扩容的应该是内存等,有的公司需要存储大量的数据,那么可能扩容的是硬盘等存储设备。</p><p>组件包含:</p><ul><li><p>cpu</p><ul><li>Intel、Amd ,参考频率、线程数等</li></ul></li><li><p>网卡</p><ul><li>百兆->千兆 -> 万兆</li></ul></li><li><p>内存</p><ul><li>ECC校验</li></ul></li><li><p>磁盘</p><ul><li>SCSI HDD(机械)、HHD(混合)、SATA SSD、PCI-e SSD、 MVMe SSD</li></ul></li></ul><h2>AKF拆分原则</h2><p>在Redis集群拆分原则之AKF中,详细介绍了AKF拆分原则的详情,这儿简单回顾一下:</p><p>对于一个应用,如果单机不足以支撑服务请求,那么可以建立诸如主主、主从等模式的集群:</p><p><img src="/img/remote/1460000041105637" alt="" title=""></p><p>这个叫AKF原则X轴扩展,目的是将请求分流在多台机器上,但是多台机器中间要解决数据同步性的问题,越多的机器数据不同步的可能性越大,这也就意味着没法无限整体复制扩容。所以可以整理搜集服务器内热点的业务请求,将业务分离出来,只对热点业务进行扩容,这就是AKF原则的Y轴拆分:</p><p><img src="/img/remote/1460000041105638" alt="" title=""></p><p>对业务拆分之后,某个业务还可能太热点,也就是Y轴拆分后水平复制还是不足以支撑数据请求,那么可以将业务的数据进行拆分, 具体来说就是,某个业务的数据,可以放在多个地方,例如在湖北、北京、上海部署机房,各地的人们需要请求数据时,由离得近的服务器提供服务。</p><h2>拆分扩容后存在的问题</h2><p>随着业务的增长,系统变得越来越庞大, 根据系统功能拆分成独立而又互通的项目, 比如交易系统、财务系统、生产流程系统、物流系统、网站系统等等,但是分布式结构会存在很多问题。对于这些问题每一个都值得深入探讨,这儿简单的提一下,后面再开篇幅。</p><h6>数据共享问题</h6><p>所有的服务之间数据如何共享同步,这是一个需要考虑的问题,微服务架构中,数据不可能只有一份,没法避免机器损坏等原因造成的数据丢失,多份数据之间如何同步?目前可供参考的解决思路是建立数据中心、搭建数据库集群。</p><h6>接口调用问题</h6><p>不同的服务器之间进行调用遵循远程调用协议RPC</p><p>JAVA RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。 它使客户机上运行的程序可以调用远程服务器上的对象。</p><p>dubbo:提供了面向接口代理的高性能RPC调用</p><h6>持久化数据雪崩问题</h6><ul><li>数据库分库分表,参考:MySQL调优之分区表。</li><li>资源隔离,参考:亿级流量架构之资源隔离思路与方法。</li><li>缓存设定数据持久化策略:Redis持久化之RDB和AOF。</li></ul><h6>高并发问题</h6><p>缓存:诸如缓存击穿、穿透、雪崩等,参考Redis击穿、穿透、雪崩产生原因以及解决思路。</p><p>数据闭环:为了便于理解,举个例子,对于淘宝而言,有网页版、IOS版、安卓版、还有什么一淘等等,虽然客户端不一样,但是展示的商品信息是相同的,也就是一件商品,无论是哪个端用的数据是一样的,需要一套方案来解决并发下根据相同数据在不同端进行不同展示的问题,这就叫数据闭环。</p><h6>数据一致性问题</h6><p>这是一个难点,大意就是多个服务器之间数据如何保证一致性,同样的商品在不同客户端服务端端价格应该是一样的, 通常使用分布式锁。</p><h2>数据库扩容:集群</h2><p>先简单说一下分布式与集群的区别,这两个词儿经常一起出现,但是意义却有所不同,分布式会缩短单个任务的执行时间来提升工作效率,而集群强调的是提高单位时间内执行操作数的增加来提高效率。更简单的来说,分布式是将步骤分到每台电脑上,不考虑依赖关系,集群方案是指几个任务同时在处理。</p><p>单一数据库存储难以满足业务需求时,采取集群的方式,将数据存储在不同的服务器,这可以是主主或者主从,主从中主负责写,从负责读,将与数据库有关的压力进行分解到多台机器上。</p><h2>分布式ID</h2><p>在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。很容易想到的是利用自增,但是自增有很多问题,例如ID有太强的规律,可能会被恶意查询搜集,面对数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,这样数据库的自增ID显然不能满足需求;特别一点的如商品、订单、用户也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。概括下来,那业务系统对ID号的要求有哪些呢?</p><h6>分布式ID要求</h6><p>面对分布式ID,需要满足下面的要求:</p><ul><li><strong>全局唯一</strong>性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。</li><li><strong>趋势递增</strong>:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。</li><li><strong>单调递增</strong>:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。</li><li><strong>信息安</strong>全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。</li></ul><p>上述123对应三类不同的场景,但是3和4的需求是互斥的,也就是无法使用同一个方案满足。除了对ID号码自身的要求,业务还对ID号生成系统的可用性要求极高,想象一下,如果ID生成系统瘫痪,整个与数据有关的动作都无法执行,会带来一场灾难。由此总结下一个ID生成系统最少应该做到如下几点:</p><ul><li>平均延迟和TP999延迟都要尽可能低;</li><li>可用性5个9(这是美团的要求,有些企业例如阿里要求6个9);</li><li>高QPS。</li></ul><h6>分布式ID生成策略</h6><p>目前业界常用的ID生成策略有很多,例如UUID、雪花生成算法、Redis、Zookeeper等,这儿只简单讲讲UUID以及Snowflake,后面要开篇详谈。</p><h6>UUID生成算法</h6><p>UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种方式生成UUID,详情见IETF发布的UUID规范 A Universally Unique IDentifier (UUID) URN Namespace。</p><ul><li><p>优点:</p><ul><li>性能非常高:本地生成,没有网络消耗。</li></ul></li><li><p>缺点:</p><ul><li>不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。</li><li>信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。</li><li>ID作为主键时在特定的环境会存在一些问题,比如做DB主键的场景下,UUID就非常不适用:</li></ul></li></ul><p>① MySQL官方有明确的建议主键要尽量越短越好[4],36个字符长度的UUID不符合要求。</p><p>All indexes other than the clustered index are known as secondary indexes. In InnoDB, each record in a secondary index contains the primary key columns for the row, as well as the columns specified for the secondary index. InnoDB uses this primary key value to search for the row in the clustered index.If the primary key is long, the secondary indexes use more space, so it is advantageous to have a short primary key.</p><p> ② 对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变 动,严重影响性能。</p><h6>雪花生成算法</h6><p>这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示:</p><p><img src="/img/remote/1460000041105639" alt="" title=""></p><p>41-bit的时间可以表示<code>(1L<<41)/(1000L360024*365)=69</code>年的时间,10-bit机器可以分别表示1024台机器。如果我们对IDC划分有需求,还可以将10-bit分5-bit给IDC,分5-bit给工作机器。这样就可以表示32个IDC,每个IDC下可以有32台机器,可以根据自身需求定义。12个自增序列号可以表示212个ID,理论上snowflake方案的QPS约为409.6w/s,这种分配方式可以保证在任何一个IDC的任何一台机器在任意毫秒内生成的ID都是不同的。</p><p>这种方式的优缺点是:</p><ul><li><p>优点:</p><ul><li>毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。</li><li>不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。</li><li>可以根据自身业务特性分配bit位,非常灵活。</li></ul></li><li><p>缺点:</p><ul><li>强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。</li></ul></li></ul><h2>弹性扩容</h2><p>说人话,就是让集群根据计划在某一段时间自动对资源进行扩容,并在设置的计划还原时间时释放资源。这样能解决规律性的资源峰谷需求,达到充分合理利用资源的目的。<br><img src="/img/bVbHCzg" alt="" title=""><br>但是弹性扩容有一些问题:</p><p><strong>第一,虚拟机弹性能力较弱</strong>。使用虚拟机部署业务,在弹性扩容时,需要经过申请虚拟机、创建和部署虚拟机、配置业务环境、启动业务实例这几个步骤。前面的几个步骤属于私有云平台,后面的步骤属于业务工程师。一次扩容需要多部门配合完成,扩容时间以小时计,过程难以实现自动化。如果可以实现自动化“一键快速扩容”,将极大地提高业务弹性效率,释放更多的人力,同时也消除了人工操作导致事故的隐患。</p><p><strong>第二,IT成本高</strong>。由于虚拟机弹性能力较弱,业务部门为了应对流量高峰和突发流量,普遍采用预留大量机器和服务实例的做法。即先部署好大量的虚拟机或物理机,按照业务高峰时所需资源做预留,一般是非高峰时段资源需求的两倍。资源预留的办法带来非常高的IT成本,在非高峰时段,这些机器资源处于空闲状态,也是巨大的浪费。</p><p>作者:等不到的口琴<br>链接:cnblogs.com/Courage129/p/14425669.html</p>
企业级日志平台新秀!比 ELK 更轻量、更高效
https://segmentfault.com/a/1190000041105621
2021-12-12T23:46:06+08:00
2021-12-12T23:46:06+08:00
民工哥
https://segmentfault.com/u/jishuroad
3
<p>当我们公司内部部署很多服务以及测试、正式环境的时候,查看日志就变成了一个非常刚需的需求了。是多个环境的日志统一收集,然后使用 Nginx 对外提供服务,还是使用专用的日志收集服务 ELK 呢?这就变成了一个问题!</p><p><img src="/img/bVcWDAS" alt="image.png" title="image.png"></p><p>而 Graylog 作为整合方案,使用 Elasticsearch 来存储,使用 MongoDB 来缓存,并且还有带流量控制的(throttling),同时其界面查询简单易用且易于扩展。所以,使用 Graylog 成为了不二之选,为我们省了不少心。</p><p><img src="/img/bVcWDAT" alt="image.png" title="image.png"></p><h2>Filebeat 工具介绍</h2><h6>Filebeat 日志文件托运服务</h6><p>Filebeat 是一个日志文件托运工具,在你的服务器上安装客户端后,Filebeat 会自动监控给定的日志目录或者指定的日志文件,追踪读取这些文件,不停的读取,并且转发这些信息到 Elasticsearch 或者 Logstarsh 或者 Graylog 中存放。</p><h6>Filebeat 工作流程介绍</h6><p>当你安装并启用 Filebeat 程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件。</p><p>对于探测器找出的每一个日志文件,Filebeat 都会启动一个收割进程(harvester)。</p><p>每一个收割进程读取一个日志文件的最新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件。</p><p>最后 Filebeat 会发送集合的数据到你指定的地址上去(我们这里就是发送给 Graylog 服务了)。</p><h6>Filebeat 图示理解记忆</h6><p>我们这里不适用 Logstash 服务,主要是因为 Filebeat 相比于 Logstash 更加轻量级。</p><p>当我们需要收集信息的机器配置或资源并不是特别多时,且并没有那么复杂的时候,还是建议使用 Filebeat 来收集日志。</p><p>日常使用中,Filebeat 的安装部署方式多样且运行十分稳定。</p><p><img src="/img/bVcWDAV" alt="image.png" title="image.png"></p><h6>Filebeat 配置文件</h6><p>配置 Filebeat 工具的核心就是如何编写其对应的配置文件!</p><p>对应 Filebeat 工具的配置主要是通过编写其配置文件来控制的,对于通过 rpm 或者 deb 包来安装的情况,配置文件默认会存储在,/etc/filebeat/filebeat.yml 这个路径下面。而对于,对于 Mac 或者 Win 系统来说,请查看解压文件中相关文件,其中都有涉及。</p><p>下面展示了 Filebeat 工具的主配置文件,注释信息中都对其各个字段含义进行了详细的解释,我这里就不再赘述了。<strong>需要注意的是</strong>,我们将日志的输入来源统统定义去读取 inputs.d 目录下的所有 yml 配置。</p><p>所以,我们可以更加不用的服务(测试、正式服务)来定义不同的配置文件,根据物理机部署的实际情况具体配置。</p><pre><code># 配置输入来源的日志信息
# 我们合理将其配置到了 inputs.d 目录下的所有 yml 文件
filebeat.config.inputs:
enabled: true
path: ${path.config}/inputs.d/*.yml
# 若收取日志格式为 json 的 log 请开启此配置
# json.keys_under_root: true
# 配置 Filebeat 需要加载的模块
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
# 配置将日志信息发送那个地址上面
output.logstash:
hosts: ["11.22.33.44:5500"]
# output.file:
# enable: true
processors:
- add_host_metadata: ~
- rename:
fields:
- from: "log"
to: "message"
- add_fields:
target: ""
fields:
# 加 Token 是为了防止无认证的服务上 Graylog 服务发送数据
token: "0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX "</code></pre><p>下面展示一个简单的 inputs.d 目录下面的 yml 配置文件的具体内容,其主要作用就是配置单独服务的独立日志数据,以及追加不同的数据 tag 类型。</p><pre><code># 收集的数据类型
- type: log
enabled: true
# 日志文件的路径地址
paths:
- /var/log/supervisor/app_escape_worker-stderr.log
- /var/log/supervisor/app_escape_prod-stderr.log
symlinks: true
# 包含的关键字信息
include_lines: ["WARNING", "ERROR"]
# 打上数据标签
tags: ["app", "escape", "test"]
# 防止程序堆栈信息被分行识别
multiline.pattern: '^\[?[0-9]...{3}'
multiline.negate: true
multiline.match: after
# 需要配置多个日志时可加多个 type 字段
- type: log
enabled: true
......</code></pre><p>需要注意的是,针对于不同的日志类型,filebeat 还提供了不同了模块来配置不同的服务日志以及其不同的模块特性,比如我们常见的 PostgreSQl、Redis、Iptables 等。</p><pre><code># iptables
- module: iptables
log:
enabled: true
var.paths: ["/var/log/iptables.log"]
var.input: "file"
# postgres
- module: postgresql
log:
enabled: true
var.paths: ["/path/to/log/postgres/*.log*"]
# nginx
- module: nginx
access:
enabled: true
var.paths: ["/path/to/log/nginx/access.log*"]
error:
enabled: true
var.paths: ["/path/to/log/nginx/error.log*"]</code></pre><h2>Graylog 服务介绍</h2><h6>Graylog 日志监控系统</h6><p>Graylog 是一个开源的日志聚合、分析、审计、展现和预警工具。在功能上来说,和 ELK 类似,但又比 ELK 要简单很多。</p><p>依靠着更加简洁,高效,部署使用简单的优势很快受到许多人的青睐。当然,在扩展性上面确实没有比 ELK 好,但是其有商业版本可以选择。</p><h6>Graylog 工作流程介绍</h6><p>部署 Graylog 最简单的架构就是单机部署,复杂的也是部署集群模式,架构图示如下所示。我们可以看到其中包含了三个组件,分别是 Elasticsearch、MongoDB 和 Graylog。</p><p>其中,Elasticsearch 用来持久化存储和检索日志文件数据(IO 密集),MongoDB 用来存储关于 Graylog 的相关配置,而 Graylog 来提供 Web 界面和对外接口的(CPU 密集)。</p><p>最小化单机部署</p><p><img src="/img/bVcWDBU" alt="image.png" title="image.png"></p><p>最优化集群部署</p><p><img src="/img/bVcWDBV" alt="image.png" title="image.png"></p><h6>Graylog 组件功能</h6><p>配置 Graylog 服务的核心就是理解对应组件的功能以及其运作方式!</p><p>简单来讲,Input 表示日志数据的来源,对不同来源的日志可以通过 Extractors 来进行日志的字段转换,比如将 Nginx 的状态码变成对应的英文表述等。</p><p>然后,通过不同的标签类型分组成不用的 Stream,并将这些日志数据存储到指定的 Index 库中进行持久化保存。</p><p><img src="/img/bVcWDBW" alt="image.png" title="image.png"></p><p><img src="/img/bVcWDBX" alt="image.png" title="image.png"></p><p>Graylog 通过 Input 搜集日志,每个 Input 单独配置 Extractors 用来做字段转换。</p><p>Graylog 中日志搜索的基本单位是 Stream,每个 Stream 可以有自己单独的 Elastic Index Set,也可以共享一个 Index Set。</p><p>Extractor 在 System/Input 中配置。Graylog 中很方便的一点就是可以加载一条日志,然后基于这个实际的例子进行配置并能直接看到结果。</p><p>内置的 Extractor 基本可以完成各种字段提取和转换的任务,但是也有些限制,在应用里写日志的时候就需要考虑到这些限制。Input 可以配置多个 Extractors,按照顺序依次执行。</p><p>系统会有一个默认的 Stream,所有日志默认都会保存到这个 Stream 中,除非匹配了某个 Stream,并且这个 Stream 里配置了不保存日志到默认 Stream。</p><p>可以通过菜单 Streams 创建更多的 Stream,新创建的 Stream 是暂停状态,需要在配置完成后手动启动。</p><p>Stream 通过配置条件匹配日志,满足条件的日志添加 stream ID 标识字段并保存到对应的 Elastic Index Set 中。</p><p>Index Set 通过菜单 System/Indices 创建。日志存储的性能,可靠性和过期策略都通过 Index Set 来配置。</p><p>性能和可靠性就是配置 Elastic Index 的一些参数,主要参数包括,Shards 和 Replicas。</p><p>除了上面提到的日志处理流程,Graylog 还提供了 Pipeline 脚本实现更灵活的日志处理方案。</p><p>这里不详细阐述,只介绍如果使用 Pipelines 来过滤不需要的日志。下面是丢弃 level > 6 的所有日志的 Pipeline Rule 的例子。</p><p>从数据采集(input),字段解析(extractor),分流到 stream,再到 Pipeline 的清洗,一气呵成,无需在通过其他方式进行二次加工。</p><p>Sidecar 是一个轻量级的日志采集器,通过访问 Graylog 进行集中式管理,支持 Linux 和 windows 系统。</p><p>Sidecar 守护进程会定期访问 Graylog 的 REST API 接口获取 Sidecar 配置文件中定义的标签(tag),Sidecar 在首次运行时会从 Graylog 服务器拉取配置文件中指定标签(tag)的配置信息同步到本地。</p><p>目前 Sidecar 支持 NXLog,Filebeat 和 Winlogbeat。他们都通过 Graylog 中的 web 界面进行统一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等输出类型。</p><p>Graylog 最厉害的在于可以在配置文件中指定 Sidecar 把日志发送到哪个 Graylog 群集,并对 Graylog 群集中的多个 input 进行负载均衡,这样在遇到日志量非常庞大的时候,Graylog 也能应付自如。</p><pre><code>rule "discard debug messages"
when
to_long($message.level) > 6
then
drop_message();
end</code></pre><p>日志集中保存到 Graylog 后就可以方便的使用搜索了。不过有时候还是需要对数据进行近一步的处理。</p><p>主要有两个途径,分别是直接访问 Elastic 中保存的数据,或者通过 Graylog 的 Output 转发到其它服务。</p><h2>服务安装和部署</h2><p>主要介绍部署 Filebeat+Graylog 的安装步骤和注意事项!</p><p><img src="/img/bVcWDBZ" alt="image.png" title="image.png"></p><h6>部署 Filebeat 工具</h6><p>官方提供了多种的部署方式,包括通过 rpm 和 deb 包安装服务,以及源代码编译的方式安装服务,同时包括了使用 Docker 或者 kubernetes 的方式安装服务。</p><p>我们根据自己的实际需要,进行安装即可:</p><pre><code># Ubuntu(deb)
$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-amd64.deb
$ sudo dpkg -i filebeat-7.8.1-amd64.deb
$ sudo systemctl enable filebeat
$ sudo service filebeat start
# 使用 Docker 启动
docker run -d --name=filebeat --user=root \
--volume="./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
--volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
docker.elastic.co/beats/filebeat:7.8.1 filebeat -e -strict.perms=false \
-E output.elasticsearch.hosts=["elasticsearch:9200"]</code></pre><p><img src="/img/remote/1460000041105623" alt="" title=""></p><h6>部署 Graylog 服务</h6><p>我们这里主要介绍使用 Docker 容器来部署服务,如果你需要使用其他方式来部署的话,请自行查看官方文档对应章节的安装部署步骤。</p><p>在服务部署之前,我们需要给 Graylog 服务生成等相关信息,生成部署如下所示:</p><pre><code># 生成 password_secret 密码(最少 16 位)
$ sudo apt install -y pwgen
$ pwgen -N 1 -s 16
zscMb65...FxR9ag
# 生成后续 Web 登录时所需要使用的密码
$ echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
Enter Password: zscMb65...FxR9ag
77e29e0f...557515f</code></pre><p>生成所需密码信息之后,我们将如下 yml 信息保存到 docker-comopse.yml 文件中,使用 docker-compose 命令启动该服务,即可完成部署。</p><p>之后,通过浏览器访问对应服务器地址的 9000 端口,即可登录主页。</p><pre><code>version: "3"
services:
mongo:
restart: on-failure
container_name: graylog_mongo
image: "mongo:3"
volumes:
- "./mongodb:/data/db"
networks:
- graylog_network
elasticsearch:
restart: on-failure
container_name: graylog_es
image: "elasticsearch:6.8.5"
volumes:
- "./es_data:/usr/share/elasticsearch/data"
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Xms512m -Xmx5120m"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 12g
networks:
- graylog_network
graylog:
restart: on-failure
container_name: graylog_web
image: "graylog/graylog:3.3"
ports:
- 9000:9000 # Web 服务提供的访问端口
- 5044:5044 # Filebeat 工具提供端口
- 12201:12201 # GELF TCP
- 12201:12201/udp # GELF UDP
- 1514:1514 # Syslog TCP
- 1514:1514/udp # Syslog UDP
volumes:
- "./graylog_journal:/usr/share/graylog/data/journal"
environment:
- GRAYLOG_PASSWORD_SECRET=zscMb65...FxR9ag
- GRAYLOG_ROOT_PASSWORD_SHA2=77e29e0f...557515f
- GRAYLOG_HTTP_EXTERNAL_URI=http://11.22.33.44:9000/
- GRAYLOG_TIMEZONE=Asia/Shanghai
- GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
networks:
- graylog
depends_on:
- mongo
- elasticsearch
networks:
graylog_network:
driver: bridge</code></pre><p>需要注意的是,GELF(Graylog Extended Log Format)的 input 模式可以接受结构化的事件,支持压缩和分块。恰好,Docker 服务的 log-driver 驱动原生提供了 GELF 的支持。</p><p>只需要我们在 Graylog 的 system/inputs 下面创建对应的 input 之后,启动容器时候指定 log-driver,就可以将容器内的输出都会发送到 Graylog 里面了。</p><p><img src="/img/remote/1460000041105624" alt="" title=""></p><pre><code># [docker] 启动容器指定地址和 driver
docker run --rm=true \
--log-driver=gelf \
--log-opt gelf-address=udp://11.22.33.44:12201 \
--log-opt tag=myapp \
myapp:0.0.1
# [docker-compose] 启动使用方式
version: "3"
services:
redis:
restart: always
image: redis
container_name: "redis"
logging:
driver: gelf
options:
gelf-address: udp://11.22.33.44:12201
tag: "redis"
......</code></pre><h6>Graylog 界面功能</h6><p>主要介绍 Graylog 界面的相关功能和对应特点!</p><p><img src="/img/bVcWDB1" alt="image.png" title="image.png"></p><p><img src="/img/remote/1460000041105625" alt="" title=""></p><p><img src="/img/remote/1460000041105626" alt="" title=""></p><p><img src="/img/remote/1460000041105627" alt="" title=""></p><p><img src="/img/bVcWDB2" alt="image.png" title="image.png"></p><p>作者:Escape<br>来源:escapelife.site/posts/38c81b25.html</p><p><img src="/img/bVbHCzg" alt="" title=""></p>
还在付费使用 XShell?我选择这款超牛逼的 SSH 客户端,完全免费!
https://segmentfault.com/a/1190000041041396
2021-11-30T16:46:02+08:00
2021-11-30T16:46:02+08:00
民工哥
https://segmentfault.com/u/jishuroad
7
<p>分享过FinallShell这款SSH客户端,也是xiaoz目前常用的SSH客户端工具,FinalShell使用起来方便顺手,但令我不爽的是tab数量变多的时候FinalShell越来越卡,而且内存占用也比较高。</p><p>最近发现一款使用使用C语言开发的跨平台SSH客户端WindTerm,完全免费用于商业和非商业用途,没有限制。 所有发布的源代码(第三方目录除外)均在 Apache-2.0 许可条款下提供。性能方面也比FinalShell和Electerm好很多。</p><p><img src="/img/remote/1460000041041398" alt="" title=""></p><h2>主要功能</h2><p>以下内容为机器翻译:</p><ul><li>实施了 SSH v2、Telnet、Raw Tcp、串行、Shell 协议。</li><li>会话认证时支持 SSH 自动执行。</li><li>支持 SSH ProxyCommand 或 ProxyJump。</li><li>支持SSH代理转发。介绍视频</li><li>支持使用密码、公钥、键盘交互、gssapi-with-mic 的 SSH 自动登录。</li><li>支持X11转发。介绍视频</li><li>支持直接/本地端口转发、反向/远程端口转发和动态端口转发。</li><li>支持 XModem、YModem 和 ZModem。</li><li>集成sftp、scp客户端,支持下载、上传、删除、重命名、新建文件/目录等。</li><li>集成本地文件管理器,支持移动到、复制到、复制自、删除、重命名、新建文件/目录等。</li><li>支持 Windows Cmd、PowerShell 和 Cmd、PowerShell 作为管理员。</li><li>支持Linux bash、zsh、powershell core等。</li><li>支持 MacOS bash、zsh、powershell core 等。</li></ul><p>功能实在太多,我就不一一粘贴了。</p><h2>安装WindTerm</h2><p>WindTerm支持三大平台(Windows、Linux、macos),前往Github:<a href="https://link.segmentfault.com/?enc=dAhREJwwofD37stsF%2Bvd%2FA%3D%3D.xvR55tAvpGfZnreAQeY7B288qk5jo%2BpljHwrSHfiMm7ItRMNtfxhDwuFo%2BC%2Blc6vrOmIpwBwh5QlI5Kh6gQsXQ%3D%3D" rel="nofollow">https://github.com/kingToolbo...</a>下载最新版本。</p><p>Windows用户直接解压<code>WindTerm_2.x.x_Windows_Portable.zip</code>并双击WindTerm.exe即可使用。</p><h6>设置与使用</h6><p>作者在他的博客介绍了各种特性和使用说明,见:<a href="https://link.segmentfault.com/?enc=EAxb71P003vry6wHsKlzPQ%3D%3D.wOfVzirtOlX8fqKjrde5SLm%2Blj5e13qNSgU52j9WpFg%3D" rel="nofollow">https://kingtoolbox.github.io/</a>,我整理了一些常用的设置选项,希望对各位有所帮助。</p><ul><li>设置终端字体</li></ul><p>WindTerm并没有将设置字体的功能做到窗口选项,不过我们可以通过修改主题文件来完成。默认使用的dige-black这个主题,打开:WindTerm目录下的global\themes\dige-black\scheme.theme找到:</p><pre><code>{
"name": "text.default",
"style": {
"foreground": "#F8F8F2",
"background": "#1c1c1c",
"fontFamily": "Microsoft-Yahei-Mono,Consolas Yahei Hybrid,Roboto Mono, Fira Code Retina, Lucida Sans Typewriter, Lucida Console, Monoca",
"fontSize": 11
}
}</code></pre><p>修改fontFamily属性即可。</p><ul><li>设置窗口透明度</li></ul><p>打开顶部窗口的View - Window Opacity - Custom Opacity,根据喜好进行设置,如下图。</p><p><img src="/img/remote/1460000041041399" alt="" title=""></p><ul><li>配置同步</li></ul><p>如果您需要在多台电脑使用WindTerm,希望Session信息保持同步,可以用网盘直接同步WindTerm下的profiles文件夹即可。有点遗憾的是WindTerm不支持自定义profiles路径,希望后续能够支持吧。</p><ul><li>关闭自动锁屏</li></ul><p>出于安全性考虑WindTerm默认30分钟后自动锁屏,并要求用户输入密码,如果您不希望自动锁屏,可以修改global\wind.config将application.lockScreenTimeout设置为0或负数即可(需要重启客户端)。</p><ul><li>快捷命令</li></ul><p>挺实用的一个功能,可以将常用且难记的命令添加到快捷命令中,方便下次快速使用。点击右下方齿轮按钮,根据提示添加即可。</p><p><img src="/img/remote/1460000041041400" alt="" title=""></p><ul><li>设置跳板机</li></ul><p>当你连接某台VPS网络不佳,还可以通过现有的任何机器作为跳板机登录,只需要编辑<code>Session - SSH - Proxy - Jump Server 1</code>进行选择即可。</p><p><img src="/img/remote/1460000041041401" alt="" title=""></p><p>WindTerm还有很多功能,我就不一一介绍了,有兴趣的同学可以去作者博客看看:<a href="https://link.segmentfault.com/?enc=GrUZrIuClT1SuSxXkNKXEw%3D%3D.S0S9w2S9%2FlFnw2OOjTu%2FSIjCTa6k5NurNqfOGx%2BnSyM%3D" rel="nofollow">https://kingtoolbox.github.io/</a></p><h2>关于性能</h2><p>作者在Github放出了性能测试数据,WindTerm使用C语言开发,性能自然不弱,不过作为SSH工具似乎也不需要太好的性能,只要不卡就行了,不是么。下意识的看了下WindTerm内存占用仅70M左右,比起FinalShell吃我2G内存真是好太多了。</p><p><img src="/img/remote/1460000041041402" alt="" title=""></p><h2>最后</h2><p>WindTerm功能丰富,完全满足运维人员需要,用来替代Xshell、FinalShell也完全没有问题。但WindTerm并不完美,比如很多选项还没有做到窗口设置,只能通过手动修改配置文件,这点有些不方便。据作者透露,多语言支持也会在下个版本上线,希望WindTerm后续做得更好。</p><p>来源:xiaoz.me/archives/16314</p><p><img src="/img/bVbHCzg" alt="" title=""></p>
又一款性能监控利器——火焰图
https://segmentfault.com/a/1190000041020301
2021-11-26T09:22:55+08:00
2021-11-26T09:22:55+08:00
民工哥
https://segmentfault.com/u/jishuroad
3
<h2>前言</h2><p>工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快问题排查的进度。这也是我为什么非常喜欢 shell 的原因,它丰富的命令行工具集加管道特性处理起文本数据集来真的精准而优雅,让人迷醉。</p><p>但很多时候文本的表现力非常有限,可以说匮乏,表达绝对值时,自然是无往不利,但在展示相对值时,就有些捉襟见肘了,就更不用说多维数据了。</p><p>我们用 shell 可以非常快速地查询出文本内的累加值、最大值等,但一遇到两组值的相关性分析时,就束手无策了。这个时候,就需要使用另一种分析工具 – 图了,如散点图就能很清晰地展示相关性。</p><p>今天就准备介绍一种图,<strong>火焰图</strong>,之前组内大神分享过它的使用办法,但我之后很久都没有用过,以至于对它没有什么深刻印象,最近排查我们 Java 应用负载问题时试用了一下,这才对它的用途有了点心得。</p><h2>介绍</h2><h6>引子</h6><p>在排查性能问题时,我们通常会把线程栈 dump 出来,然后使用</p><pre><code>grep --no-group-separator -A 1 java.lang.Thread.State jstack.log | awk 'NR%2==0' | sort | uniq -c | sort -nr </code></pre><p>类似的 shell 语句,查看大多数线程栈都在干什么。而由线程栈的出现频率,来推断 JVM 内耗时最多的调用。</p><p>至于其原理,设想广场上有一个大屏幕在不停地播放各种广告。如果我们随机对大屏幕拍照,次数多了,统计照片中各个广告出现的频率,基本可以得出每个广告的播放时长占比了。</p><p>而我们应用的资源就像大屏幕,每次调用就像是播放一次广告,统计 dump 出的线程栈出现比例,也就基本能看出线程栈的耗时占比,虽然有误差,但是多次统计下应该差不了多少。这也就是为什么有些家长每次进孩子房间都发现孩子在看系统桌面后以为孩子平时喜欢对着桌面发呆的原因。:)</p><pre><code>2444 at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1200)
1587 at sun.misc.Unsafe.park(Native Method)
795 at java.security.Provider.getService(Provider.java:1035)
293 at java.lang.Object.wait(Native Method)
292 at java.lang.Thread.sleep(Native Method)
73 at org.apache.logging.log4j.core.layout.TextEncoderHelper.copyDataToDestination(TextEncoderHelper.java:61)
71 at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
70 at java.lang.Class.forName0(Native Method)
54 at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(RollingFileManager.java:217)</code></pre><p>但是这样有些问题,首先写 shell 挺费事的,另外如果我想查看自栈顶第二个栈的最多调用,即使修改了 shell 命令,结果也不直观。</p><p>产生这个问题的主要原因是,我们的线程栈是有调用关系的,即我们需要考虑线程栈的 调用链 和 出现频率 两个维度,而单一的文本表现这两种维度比较困难,所以,著名性能分析大师 brendan gregg 就提出了火焰图。</p><h2>介绍</h2><p>火焰图,因其形似火焰而得名,其开源代码地址:</p><pre><code>https://github.com/brendangregg/FlameGraph</code></pre><p>它是一种 svg 可交互式图形,我们通过点击和鼠标指向可以展示出更多的信息。下图就是一个典型的火焰图,从结构上,它是由多个大小和颜色各异的方块构成,每个方块上都有字符,它们底部连接在一块,组成火焰的基底,顶部分出许多”小火苗”。</p><p><img src="/img/bVcWhpR" alt="image.png" title="image.png"></p><p>当我们点击方块时,图片会从我们点击的方块为基底向上展开,而我们鼠标指向方块时,会展示出方块的详细说明。</p><h6>特性</h6><p>介绍火焰图的分析前,我们要首先说明它的特性:</p><ul><li>由底部到顶部可以追溯一个唯一的调用链,下面的方块是上面方块的父调用。</li><li>同一父调用的方块从左到右以字母序排列。</li><li>方块上的字符表示一个调用名称,括号内是火焰图指向的调用在火焰图中出现的次数和这个方块占最底层方块的宽度百分比。</li><li>方块的颜色没有实际意义,相邻方块的颜色差只为了便于查看。</li></ul><h6>分析</h6><p>那么,给我们一张火焰图,我们怎么能看出系统哪里有问题呢?</p><p>由上文中的火焰图特性特性,查看火焰图时,我们最主要的关注点要放在方块的宽度上,因为宽度代表了调用栈在全局出现的次数,次数代表着出现频率,而频率也就可以说明耗时。</p><p>但是观察火焰图底部或中部方块的宽度占比意义不大,如上面的火焰图,中部的 do_redirections 函数宽度是 24.87%,也就是说它耗用了整个应用近四分之一的时间,但是真正消耗时间的并不是 do_redirections 函数,而是 do_redirections 内部又调用的其他函数,而它的子调用分为了很多个,每个调用的耗时并没有异常。</p><p>我们更应该关注的是火焰图顶部的一些 “平顶山”,顶部说明它没有子调用,方块宽说明它耗时长,长时间 hang 住,或者被非常频率地调用,这种方块指向的调用才是性能问题的罪魁祸首。</p><p>找到了异常调用,直接优化它,或者再根据火焰图的调用链层层向下,找到我们的业务代码进行优化,也就大功告成。</p><h6>应用场景</h6><p>每种工具都有其适合的应用场景,火焰图则适合用在:</p><ul><li>代码循环分析:如果代码中有很大的循环或死循环代码,那么从火焰图的顶部或接近项部的地方会有很明显的”平顶”,表示代码频繁地在某个线程栈上下切换。但需要注意的是,如果循环的总耗时不长,在火焰图上不会很明显。</li><li>IO 瓶颈/锁分析:在我们的应用代码中,我们的调用普遍都是同步的,也就是说在进行网络调用、文件 I/O 操作或未成功获得锁时,线程会停留在某个调用上等待 I/O 响应或锁,如果这个等待非常耗时,会导致线程在某个调用上一直 hang 住,这在火焰图上表现得会非常清晰。与此相对的是,我们应用线程构成的火焰图无法准确地表达 CPU 的消耗,因为应用线程内没有系统的调用栈,在应用线程栈 hang 住时,CPU 可能去做其他事了,导致我们看到耗时很长,而 CPU 却很闲。</li><li>火焰图倒置分析全局代码:火焰图倒置有时也会很实用,如果我们的代码 N 个不同的分支都调用某一方法,倒置后,所有栈顶相同的调用被合并在一块,我们就能看出这个方法的总耗时,也就很容易评估出优化这个方法的收益。</li></ul><h2>实现</h2><p>既然火焰图这么强大,那么我们该怎么实现呢?</p><h6>生成工具</h6><p>brendan gregg 大神已经把生成火焰图的方法用 perl 实现了,开源代码就在上文的 Github 仓库中,根目录下的 <code>flamegraph.pl</code> 文件就是可执行的 perl 文件了。</p><p>这个命令还可以传入各种参数,支持我们修改火焰图的颜色、大小等。</p><p>但 flamegraph.pl 只能处理特定格式的文件,像:</p><pre><code>a;b;c 12
a;d 3
b;c 3
z;d 5
a;c;e 3</code></pre><p>前面是调用链,每个调用之间用 ; 隔开,每行后面的数字是调用栈出现的次数。</p><p>如上面的数据,用 flamegraph.pl 生成的火焰图如下图:</p><p><img src="/img/remote/1460000041020303" alt="" title=""></p><h6>数据准备</h6><p>至于我们的 <code>jstack</code> 信息如何被处理成上面的格式,大神则为常见的 dump 格式都提供了工具,像 <code>stackcollapse-perf.pl</code>可以处理 <code>perf</code> 命令的输出,<code>stackcollapse-jstack.pl</code> 处理 jstack 输出,<code>stackcollapse-gdb.pl</code> 处理 gdb 输出的栈等。</p><p>也可以用 shell 简单地实现一下 <code>jstack</code> 的处理方式:</p><pre><code>grep -v -P '.+prio=d+ os_prio=d+' | grep -v -E 'locked <' | awk '{if ($0==""){print $0}else{printf"%s;",$0}}' | sort | uniq -c | awk '{a=$1;$1="";print $0,a}'</code></pre><h2>小结</h2><p>火焰图总结完了,以后再遇到性能问题又多了一种应对方式。</p><p>做开发越久,越能感受得到工具的重要性,所以我准备加一个专题来专门介绍我使用的各种工具。当然,这也就更需要我更多地了解、使用和总结新的工具了。</p><p>来源:<a href="https://link.segmentfault.com/?enc=%2BDtCQ9kf5H4pPVYeRnjTSA%3D%3D.nLS%2BJ1KsbCGDQGKZTrIszf1jgxmguiTRT6tum0iiq2k%3D" rel="nofollow">https://zhenbianshu.github.io</a></p><p><img src="/img/bVbHCzg" alt="" title=""></p>
超牛逼的一款开源即时性能监控系统!
https://segmentfault.com/a/1190000041012828
2021-11-24T19:53:58+08:00
2021-11-24T19:53:58+08:00
民工哥
https://segmentfault.com/u/jishuroad
6
<p>当网站上线后,流量增加或短暂功能故障,都会造成使用者体验相当不好,而这时该怎么快速找到性能的瓶颈呢?通常 CPU 达到 100% 时,有时候也很难复制及找出关键问题点。</p><p>本篇文章,我们会介绍一套工具叫 Pyroscope,让开发者可以快速找到性能瓶颈的代码。Pyroscope 目前可以支持 Python, Ruby 或 Go 的环境。本文笔者会针对 Go 环境做介绍。</p><p><img src="/img/bVcWfs1" alt="image.png" title="image.png"></p><h2>什么是 Pyroscope?</h2><p>Pyroscope 是一套开源的性能即时监控平台,简单的 Server 及 Agent 架构,让开发者可以轻松监控代码性能,不管你要找 10 秒或几分钟内的性能数据,都可以快速的即时呈现,开发者也不用在意装了此监控会造成任何性能上的负担。Pyroscope 背后的储存采用 Badger 这套 Key-Value 数据库,性能上是非常好的。目前只支持 3 种语言 (Python, Ruby 及 Go) 未来会预计支持 NodeJS。假设您还没引入任何性能分析工具或平台,那 Pyroscope 会是您最好的选择。</p><h2>Pyroscope 架构</h2><p>如果你有打算找性能分析工具平台,Pyroscope 提供了三大优势,让开发者可以放心使用</p><ul><li>低 CPU 使用率,不会影响既有平台</li><li>可储存好几年的资料,并且可用 10 秒细颗粒度查看资料</li><li>压缩储存资料,减少浪费硬盘空间</li><li>架构只有分 Server 和 Agent,除了 Go 语言之外,Python 跟 Ruby App 都是透过 pyroscope 指令启动相关 app 来监控系统效能。</li></ul><p><img src="/img/bVcWftg" alt="image.png" title="image.png"></p><h2>启动 Pyroscope 服务</h2><p>启动方式有两种,第一是直接用 docker 指令启动。</p><pre><code>$ docker run -it -p 4040:4040 pyroscope/pyroscope:latest server</code></pre><p>另一种可以用 docker-compose 启动。</p><pre><code>---
services:
pyroscope:
image: "pyroscope/pyroscope:latest"
ports:
- "4040:4040"
command:
- "server"</code></pre><h2>安装 Agent</h2><p><img src="/img/bVcWfti" alt="image.png" title="image.png"></p><h6>在 Go 语言中使用</h6><p>本篇用 Go 语言当作示例,先 import package</p><pre><code>import "github.com/pyroscope-io/pyroscope/pkg/agent/profiler"</code></pre><p>接著在 main.go 写入底下代码即可:</p><pre><code>profiler.Start(profiler.Config{
ApplicationName: "simple.golang.app",
ServerAddress: "http://pyroscope:4040",
})</code></pre><p>其中 <a href="https://link.segmentfault.com/?enc=kFkZuYZRi71nS%2FLV%2BGNLjQ%3D%3D.bQSZJ%2Ff6CuTjFvW%2B8OlHNeFEPiVzJHe688TRsLOVjkw%3D" rel="nofollow">http://pyroscope</a> 可以换成自定义的 hostname 即可,接着打开上述网址就可以看到性能监控的画面了。<br><img src="/img/bVcWftk" alt="image.png" title="image.png"><br><img src="/img/bVcWftl" alt="image.png" title="image.png"><br><img src="/img/bVcWftm" alt="image.png" title="image.png"></p><h6>在 Python 和 Ruby 语言中使用</h6><pre><code># If using Python
$ pyroscope exec python manage.py runserver
# If using Ruby
$ pyroscope exec rails server </code></pre><h2>心得</h2><p>这套工具相当方便,在 Go 语言虽然可以用 pprof 快速找到问题,但是难免还是需要手动的一些地方才可以查出性能瓶颈,有了这套平台,就可以将全部 App 都进行监控,当使用者有任何问题,就可以快速透过 Pyroscope 查看哪些代码出了问题。</p><p>作者:小恶魔 原文:<a href="https://link.segmentfault.com/?enc=fv%2BORhEYcR%2FUUjSAIMcJeA%3D%3D.MeZ%2BHG20X0koP8CU9VZHjttLS0WopV8fw9rEuf1n0vs%3D" rel="nofollow">http://t.cn/A6c0G3dm</a></p><p><img src="/img/bVbHCzg" alt="" title=""></p>