• 关于

    分散式算法不可用

    的搜索结果

问题

Redis 集群模式的工作原理能说一下么?【Java问答】36期

面试题 Redis 集群模式的工作原理能说一下么?在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 面试官心...
剑曼红尘 2020-06-12 15:07:18 2 浏览量 回答数 1

问题

分布式服务接口的幂等性如何设计(比如不能重复扣款)?【Java问答学堂】52期

面试题 分布式服务接口的幂等性如何设计(比如不能重复扣款)? 面试官心理分析 从这个问题开始,面试官就已经进入了实际的生产问题的面试了。 一个分布式系统中的某个接口࿰...
剑曼红尘 2020-07-08 09:15:27 3 浏览量 回答数 1

问题

学术界关于HBase在物联网/车联网/互联网/金融/高能物理等八大场景的理论研究

转载自:http://www.hbase.group/article/2 引言 HBase在互联网领域有广泛的应用,比如:互联网的消息系统的存储、订单的存储、搜索原材料的存储、用户画像数据的存储...
pandacats 2019-12-18 16:06:18 1 浏览量 回答数 0

回答

【丁宁-清华大学-阿里达摩院自然语言技术实习体验】 作者简介:丁宁,清华大学计算机科学与技术系2年级博士生,研究方向为自然语言处理、信息抽取、语言表示学习等,在ACL、EMNLP、AAAI、IJCAI等发表多篇文章,作为研究型实习生在阿里达摩院实习半年+。 实习体会 很幸运能来到阿里巴巴进行实习!组里的氛围特别好,同事和师兄师姐都非常专业、友善、亲切。无论是科研上还是工作生活上的任 何问题,都能得到慷慨的帮助。在这里,我认识了一批学术和生活上的榜样(我的主管每天都吃健康餐,而我牛肉汤泡饼),结交了志同道合的朋友(排队喝牛肉汤回来写论文的日子),见识到了IT同学的认真负责(远程帮我调试打印机,周末修电脑),见过了马云老师,也亲身经历了一次双十一奋战。阿里的科研积淀和文化氛围都让我感到收获颇丰,感谢阿里巴巴提供研究型实习生这一高水平项目,也期待更多的同学可以加入研究型实习生的大家庭。 科研心得& 工作宣传 今年在阿里巴巴所做的跨领域分词工作被ACL 2020高分接收,其中meta review说“well-written, well-motivated with strong results, sure accept”。其实这句话可以很好地总结评判科研论文好坏的标准,实际上或许现阶段的科研也并没有什么秘密,动机明确、方法得当、实验充分,就可以形成一篇不错的科研论文。当然了,如果想做出让领域内眼前一亮的工作,可能就需要一些灵光一闪了。 具体到我们的工作上来,跨领域任务往往面临目标领域精标注数据缺失的问题,具体到分词任务上来说,这种数据缺失往往会导致OOV和词的分布差异问题。本文通过弱监督启发式算法来进行远程标注,并引入对抗学习来进行降噪。本文的实验中以newswire (新闻语料)作为源领域,在5个不同的目标领域数据上都取得了较好的效果。 这个工作或许有助于我们真正的往跨领域的两个通用问题上去设计了相关的解决办法。论文名字:《Coupling Distant Annotation and Adversarial Training for Cross-Domain Chinese Word Segmentation》,具体可以查看达摩院的官方宣传~:ACL 2020有哪些值得关注的论文? - 阿里巴巴达摩院的回答 - 知乎https://www.zhihu.com/question/385259014/answer/1190808208 另外,也宣传一下作为co-author的另一篇ACL 2020论文,是实习生同事周洁(上海交大研究生)的工作,瞄准多层级文本分类任务,设计层级敏感编码器将多层结构作为有向图建模,并且实现了一个串行和并行的版本,论文名字:Hierarchy-Aware Global Model for Hierarchical Text Classification。 还有另一个实习生同事张浩宇(国防科大博士生)在IJCAI 2020的工作,使用noisy learning的方法去进行远程监督entity typing降噪,方法非常优雅,论文名字:Learning with Noise: Improving Distantly-Supervised Fine-grained Entity Typing via Automatic Relabeling。 【杜志浩-哈尔滨工业大学-我在达摩院作实习研究僧的那些事儿】 经韩老师介绍,2019年7月,有幸进入阿里巴巴达摩院成为一名实习研究僧。如今也已半年有余,期间发生的事情仍然历历在目。从初出茅庐的不安,到积极融入的快乐,再到宠辱不惊的泰然,一路走来收获良多! 初出茅庐 其实,刚到达摩院语音算法组时,我的内心充满了不安。这种不安来自于初出茅庐的不自信,不知自己能否胜任这份工作,为公司带来效益。同时,也来自于环境转变的不适应,换了一个全新的环境,对公司内的工作方式、待人接物都不甚了解。 但是,在算法组师兄师姐的帮助下,我的这些不安很快就烟消云散了。为了能够使我尽快熟悉工作内容、了解工作方式,雷鸣师兄坚持每周四晚上为实习生开组会,拉着仕良哥、智颖等很多小伙伴一起讨论算法思路和实验中遇到的问题。我想他们应该都挺忙的吧,但还是牺牲自己休息的时间来参加组会。 刚来的那段时间,除了“雷老师,xxx麻烦审批通过一下”以外,我说的最多的恐怕就是“xx姐/哥,xxx在哪”。由于对很多事情都不了解,比如服务器怎么申请啊,oss怎么弄啊,我总是要麻烦逍北姐、遥仙哥等目之所及的小伙伴。他们一边在忙自己的工作一边还不厌其烦的告诉我,为我提供了莫大的帮助。 积极融入 在算法组这段时间,让我印象最为深刻的一句话就是“我们做事情都很直接,有什么问题,就带着方案提出来”。以前,总是被教育和鼓励发现问题,在阿里,找到问题只是完成了第一步,还需要再提出一个切实可行的解决方案。期间发生的一段小插曲让我现在依然记忆犹新。  为了准备910,语音测试组的小伙伴每天都在紧张的进行测试。其中一项是对语音实时转录及翻译软件的稳定性测试。由于已经进入应用阶段,不能在直接将数据送入到模型中,需要将语音播放出来,再由软件录音进行测试。播放的内容是马老师的演讲,对于坐在旁边的小伙伴来说既是一件好事,也是一件坏事。由于马老师的演讲实在太引人入胜了,每次他们进行测试时,我们都无法专心工作,最终只能……。 咳咳,我心想,这么下去也不是事儿啊,梦想要有,生活也得继续啊,得想想办法解决一下这个问题。我尝试了各种办法,但似乎都无法绕过功放这个问题。最终功夫不负有心人,找到了一款虚拟声卡的软件,能够将一个应用程序的音频输出直接作为另一个应用程序的输入。在熟悉过这个软件的使用方式后,我找到测试组的组长,向他提出了我现在的处境和解决方案。他告诉我,他也知道这样会打扰到周边的人,但是之前也没有太好的办法,感谢我提出的解决方案。 虽然这只是实习期间的一段小插曲,但是我依然印象深刻。通过这件事,我践行了带着方案提问题,这一阿里人所特有的工作方式,让我感觉自己正在逐渐融入到这个集体当中。 宠辱不惊 经过几个月“死去”又“活来”的做实验、写论文,我跟雷鸣师兄合作的语音增强相关工作投稿到了ICASSP 2020。这是语音信号处理领域的顶级会议,在来阿里之前,我也投稿过一次,但不幸被拒。为了准备这篇文章,雷鸣师兄跟我保持着很高互动,了解实验进度,适时的进行指导。此外,还有仕良哥帮助我进行语音畸变的评估。 2020年1月25日这一天,是我国的传统节日,春节,同时也是ICASSP出结果的日子。在得知结果前,我的内心非常忐忑。但当得知接收的喜讯时,我反而没有想象中那么兴奋,没有想象中那么高兴。我的第一反应是看看审稿人的意见,看看我专家们对我文章的看法,还有哪些不足和需要改进的地方。 我想宠辱不惊的心态应该是我在阿里的一个重要收获吧,不以物喜不以己悲。尽力做好自己该做的事儿,结果自然水到渠成。 再说两句 在阿里的这段实习使我受益匪浅。这里有乐于助人、善解人意的师兄师姐,也有认真负责、要求严格的主管Leader;有弹性自由的工作时间,也有肝到深夜的满腔热情;有最新最热的研究成果,也有成熟稳定的应用软件。这里不像实验室的象牙塔,关注技术的同时,也更关注技术如何落地、如何应用到生活中去,最终如何造福亿万用户。 韩鹏-KAUST-青春没有我之阿里巴巴天猫精灵争夺赛被迫写的研究心得 竞选宣言: 在阿里实习摸了几个月的鱼,最开心的就是又吃到了祖国的美食,虽然杭州的食物实在是太清淡了,但总比我在沙特每天吃水煮青菜不放盐要好很多。在阿里的这几个月,让我看淡了很多,发现生命里比较重要的就是长在自己脑袋上的头发,不能太年轻就失去他们。女网红我是感觉自己这辈子没机会了,毕竟流量明星也不是靠推荐算法能捧红的,也就希望能够得到这次500块钱的天猫精灵,请大家pick我。 研究心得: 多抱大腿 为了凑足300字的内心情感白描: 这个世界实在是太无聊了,尤其疫情导致的只能居家办公,我已经憋得快精神失常了,虽然平时也不是那么正常。希望这个世界早日恢复原来的美好,我还打算去越南胡志明市的日式KTV感受一下女仆装呢,希望疫情不会让这些服务业倒闭呢吧。 居然还不够300字,感觉生命浪费在写文字上要比大保健上还是好一些的,希望这些文字能够启发你,虽然我感觉也并没有什么意义,而人活着的意义又是什么呢? 【韩镕罄-南加州大学- 阿里研究型实习生体验】 简介: 经过两年研究时间,找到了学校的教职,也找到了老婆,感谢阿里~ 2018年八月来阿里做研究型实习生,本人在南加州大学商学院读Operations Management 的Ph.D. 块两年时间做了几篇 field experiment paper, 感觉阿里有太多好玩有趣的商业问题可以讨论直接研究。 通过和阿里的合作顺利找到UIUC 伊利诺伊大学香槟分校的常任轨教职。 更神奇的是,在实习期间,随便刷个阿里妹儿的相亲帖, 加个微信 聊一聊 发现和自己一天生日。 就是你了!现在已经结婚快半年! 三十而立,一切静好,感谢阿里! 【马腾-清华大学- 阿里巴巴RI项目心得】 我与阿里之缘 在2019年的夏天,后来成为我主管的文侑来到清华进行交流,当时的我刚刚完成了一个学术项目的研究,正在寻求于之后的研究方向。恰好在交流会上碰见了文侑,经过一番交流之后吗,了解到操作系统团队是阿里 RDMA 技术的先行者和推广者,这正是我计划之后想要研究的方向,于是便一拍即合。由于我之前所研究的领域刚好符合是阿里目前正在做的一些项目,所以文侑提供了一个可以在阿里实习的机会。 在通过了多轮面试之后,我终于成功的入职了操作系统内核组作为学术型实习生。从2018年九月初入职至今,将近两年的时间,我也逐渐地适应了在阿里的生活,松弛有度而又充满欢乐。在这里我也结识了许多要好的朋友,并且,通过公司组织的各种聚会和团建的活动,让我解释了许多有着共同语言爱好的伙伴,大家给与了我这个新人很多的帮助和照顾,使我也渐渐地融入了这个有爱的团队。 在阿里的学术成果 在阿里实习期间,在同事们的帮助下,我顺利地完成了两个与我所在实验室合作的学术项目,并且这两个项目也幸运的产出了两篇高质量的论文,分别发表在了不同领域的高水平会议当中。 其中,第一篇论文发表在第21届Cluster会议,与2019年在美国阿尔伯克基召开。Cluster 是高性能计算方向计算机系统领域的主要会议,这个工作提出并实现了统一高效的 RDMA 消息中间件,解决了 RDMA 在实际生产过程中的一些关键可靠性和可用性问题,例如:极简的接口抽象,必要的上层消息确认机制,中间件辅助流控配合 DCQCN,结合生产系统的诊断机制等等,目前该技术已经被广泛应用在阿里巴巴基础云产品中(包括:数据库,分布式存储等)。另外一个工作则发表在了第25届 ASPLOS会议。ASPLOS 是操作系统,体系结构和编程语言三个方向综合的计算机系统领域顶级会议。这篇论文是和我所在的清华高性能所合作完成的,文章中第一次提出了利用RDMA将数据中心的NVM做disaggregation, 实现了高效的框架,同时证明了这种新架构的可行性。 在阿里的感想 阿里巴巴操作系统团队是一直致力于建立和完善系统领域工业界和学术界的纽带,并且在持续实践工业界和学术界之间的问题分享和工作互动,他们希望通过这些分析和互动能够更好地促进中国在世界计算机系统领域的整体发展和创新。作为操作系统团队中的一员,我深切了解到了先进技术对于企业发展的重要性,在实习的过程中,同我所在的实验室进行合作,我更是深深感受到只有通过学术与工业相辅相成,才能够真正让企业发展先进技术。另外一方面,经过一段时间的实习,我对所在的操作系统团队和阿里技术部门的工作有了更深入的了解,我对自己也有了进一步的规划,计划在毕业之后能够入职阿里,通过我的努力,继续在追逐技术之路上奋斗着。 【亓家鑫-新加坡南洋理工大学- 阿里云实习心得】 非常荣幸我们的研究工作*《Two causal principles for improving visual dialog》*获得了同行的认可,并收录在CVPR 2020会议中。在此要特别感谢我的教授,MReaL实验室成员以及阿里城市大脑实验室师兄师姐一直以来的支持和帮助。比起论文本身的内容,我更希望跟大家分享一年来做研究的心得和感悟,虽然目前我仍然是一个萌新,不过我希望通过萌新的角度能带给大家一些研究上的启发。 开始一个研究之前,选择方向很重要。当然,每一个方向都有自己的优缺点,比如新的方向“容易”发文章,可能将其他领域原有的方法引入加一些调整就可以达到比较高的结果。不过如果没有坚实的创新,在同行评议时,可能会受到质疑。一旦没有通过,再转投时可能发现已经落后于其他人。“老“的方向可能会感觉灌水困难,不过因为我没有真正做过经典的方向,所以不太好发表评论。根据观察,在一堆全面而又坚实的研究中找到创新点,对萌新来说确实困难,不过一旦有所突破,肯定会对这个社区产生广泛的影响。作为一个萌新,可能不会自己选择方向或者领域,所以接受导师或者主管的安排成了唯一的选择,不过要相信自己的导师和主管,因为大家都是在帮助你,而且他们经验丰富。只有当自己走完一套研究的流程,并且真正找到自己感兴趣或者觉得可以有所突破的方向,那可能才是真正属于自己的研究的开始。 当选定了方向,开始做研究的时候,清楚的了解所有有关的方法是非常重要的,因为这样可以防止你的idea被存在的方法“抄袭“。其实对一个比较成熟的研究方向来说,简单思考得到的idea一般都会被提出过。不过研究完所有存在方法后,要跳出这些方法,因为阅读他们的方法可能不是来借鉴,更多的是防止撞车,想要真正有创新,在别人的方法上改动往往是不够的,这就要求我们重新审视这个任务甚至数据集的每一个样本。当然目前即使是学术界toy的数据集也有动辄几十万的数据量,看完是不可能的,不过根据自己的思路统计一些数据特征,有时候对研究会产生很大的帮助。当觉得自己已经掌握了这个数据集或者这个任务的时候,应该是跑一些baseline来练习了。 我作为萌新,没有从零开始写,而是找了一个现成的模型开始修改,这样难度会减少很多,不过毕竟是别人的代码,还是有很多不舒服的地方,所以等自己成熟了的时候,有空的时候,一定要从头写一遍。当然我也不知道什么时候有空。当我开始修改baseline的时候,此次的研究旅行就算是上路了,在接受导师的指引的同时也可以自己不断的尝试自己的想法,因为不知道什么是有用的。我作为萌新刚开始的感受是我觉得可能我想的都有用,那一定要去试一下,所以我也建议大家多试一下,说不定真的有用呢,反正电费不花自己的。当一个东西有用的时候,就可以来思考他为什么有用了,当你想好它为什么有用并且通过了广泛的测试,就到了跟大家分享成果的时候。 当然,一个有用的idea背后可能有无数个没用的idea,至于他们为什么没用,我觉得如果实在是有兴趣,可以研究一下,但是有时候会花大量的时间。举一个实际的例子,我在去年做visual dialog比赛,大概四月份就发现了一个有用的方法,之后也顺利的拿到了第一并且在此基础上进行探究和扩展发表了自己的成果。不过同时,当时有一个效果降低的操作一直困扰着我,直到六个月以后,当然这六个月中还做了其他的事情,我才发现了它真正的原因,并且最终变成了我文章中的一句话。举这个例子的目的是,研究没有效果的idea会对研究有所帮助,不过可能会收益较低。 研究成果的发表是一个很重要的过程,它可以给领域内的同行以启发,甚至可以影响本领域之外的人,所以有时候高度总结自己的思想是一件有用的事情。比如我所做的工作我认为进行高度总结之后可以得到一个启发是:对多模态任务来说不一定所有模态都是平等的,对模型来说所存在模态也不一定是影响结果的全部。除了对自己motivation的总结,应用细节以及结果展示也是非常重要的,因为我是萌新,怎样写出一篇文章的经验肯定是不足的,所以在此不再赘述。在发表完文章之后,“售后服务“也是非常重要的一点,这也是我的教授教我的很重要的理念。因为发表的内容不是刊登出来就结束了,而是你对社区贡献的开始,之后做研究可能会发现更好的实现,或者当时的理论没有讲清楚完善,这些都可以补充到自己的代码中,让大家更好的了解你的思路和工作,或许以后还能收获好评。 此外,实验室的成员就是自己研究道路上的引导者和伙伴,会对自己的研究产生各种各样至关重要的影响,大多时候大家都不会吝惜跟你讨论分享自己的观点,有时还会亲自帮助你解决问题,所以要记得经常参加团建和小集体聚会。不过也不能太依赖别人,每当遇到问题的时候,特别是技术性的问题,还是依靠自己解决的好,毕竟未来总会离开实验室,离开乐于帮助你的人。最后,保护好自己的头发,还是要早睡早起,调不出来的bug熬夜也调不出来,不work的idea可能真的不work,没有人保证炼出来的一定是金子,不要过分影响正常的作息,毕竟这不是百米赛跑,也不能算是马拉松,而是长久的起码好几年以上要坚持的事业。不过我作为萌新才刚刚起步,依然没有体会到最艰难的时刻,不过做好心理准备还是应该的,该来的总是会来的。最后的最后希望这些浅显的经验总结能够给大家带来一点儿帮助,谢谢大家的阅读。 【田冰川-南京大学- 在阿里网络团队实习两年是一种怎样的体验?】 简介: 大家好!我是田冰川,南京大学2016级直博生,导师为田臣老师,研究方向为计算机网络。2018年6月,我以研究型实习生的身份入职阿里巴巴基础设施事业部网络研究团队,实习期间主要从事网络验证相关的研究工作,即通过形式化方法与灰度测试,来降低网络变更中的潜在风险。 2018年既是网络研究团队刚刚组建的一年,也是研究型实习生在阿里刚刚起步的一年。这年春天,经我导师田臣老师介绍,我参加了研究型实习生面试,加入了网络研究团队。 来到团队后,我参加的第一个研究项目是“金睛”,用以保障复杂ACL变更的正确性。ACL即访问控制列表,网络中的ACL决定着流量的连通性。网络架构演化有时会伴随着对ACL的迁移,如何保证迁移前后网络连通性是等价的,是困扰架构与运营部门的一大难题,而金睛项目则是为该问题而生。项目落地以来,金睛系统多次在骨干网ACL迁移中对变更方案进行了验证,并逐渐扩展至对边缘网络的验证。相关论文发表于SIGCOMM 2019主会,我在会场进行了20余分钟的演讲,与我们团队的另一篇文章HPCC共同成为阿里集团在网络领域top1学术会议主会中的首次亮相。 时间总是过的很快。转眼间,我来阿里已经两年了,自金睛之后,又陆续参与了多个研究课题。在阿里的时间越久,就越能切身体会到学术界研究与工业界研究的不同。在阿里实习以来,我接触到的所有研究课题,都不是凭空“想”出来的空中楼阁,更不是靠别人论文“启发”出来的二手课题,而是源自于真实业务的现阶段瓶颈与下一阶段发展趋势——这一点是高校科研很难做到的。 这两年间,我对科研这件事的心态也发生了进一步的变化。2017年,来到阿里之前,我的论文达到了学校博士毕业的最低要求,相当于没有了毕业之忧,对科研的心态从“先拿到博士学位再说”,变成了“想要做出点什么,不想让自己的博士5年就这么水过去”;在来到阿里,接触到工业界的前沿课题之后,我对科研的心态再一次发生了转变,变成“因为认可一件事的价值,所以想要去做好”——这已经成为一种内在的驱动力,让我在认真工作的同时,享受研究带来的乐趣。 如果一切顺利的话,我将于2021年6月博士毕业。能在阿里巴巴度过专属实习生的“三年醇”,想必也是人生中的一大成就了! 【吴秉哲-北京大学- 吴师傅的博士研究课题:大数据时代的数据隐私研究方向初探】 加上本科的时间,不知不觉已经在燕园里面呆了八年了,明年不出意外应该就会离开学校去业界工作。准备最近以文章的形式梳理一下博士几年的研究以及生活的心路历程。由于内容比较分散,所以决定分为几个不同的部分。这次推送封面图片是16年骑行到加乌拉山口遥看喜马拉雅山脉的图片,而我在阿里的花名是风远,意为远处的风。希望多年之后,还有一颗少年的心,投入每天永不变。这次借着阿里内部一个活动的机会,写了今天的这篇稿子,为大家介绍一下我的thesis topic。 已经在蚂蚁实习了一年了,一年时光匆匆而过,而在蚂蚁金服度过的这段时光带给了我很多研究以及生活中的体验,这一年里学到的经验也将伴随着我之后的研究之路。 我本科四年是在数院度过,在研究生阶段决定转换方向到计算机系。博士的前两年一直在跌跌撞撞地寻找自己的研究方向,尝试过很多方向均以失败告终。终于在第三年的时候,误打误撞开始研究起机器学习的隐私保护问题并找到了很多灵感,开始沉淀了一些基本的研究工作。有一天我从一个朋友那里听到了她关于金服这边隐私保护机器学习的团队介绍,当时我就决定要到业界的前沿去看一看隐私保护的真实业界需求。在此之前,我已经在谷歌,IBM等公司有过多段实习的经历,但是在蚂蚁这一次实习经历,是与我自己研究方向最接近,也是时间最长的一次。借着这次约稿的机会,以此文简单总结一下自己过去两年在这一方向的研究。 隐私保护与共享学习 目前随着各种机器学习算法在集团的业务落地,许多隐私泄露与数据滥用的风险相继而来。 尤其是在蚂蚁金服这样一个拥有很多支付数据的企业,数据安全以及隐私保护的重要性更是不言而喻。站在商业合作的角度,如何实现不同公司或者部门之间的数据共享学习也是我所在的团队现在攻坚的一个问题。在这样一个研究背景下,我来到了蚂蚁金服的共享智能团队,开始和师兄师姐们从不同的维度对上述问题展开了深入的研究。 共享学习这样一个概念听起来很美好,但是实际落地起来却困难重重,需要考虑到上层软件算法的设计以及底层系统和硬件的优化,才有可能真正在实际的业务中兼顾效率和隐私保护强度。共享智能团队在这一方向上有着得天独厚的优势。一是领先的业务场景,在国际同行好多还停留在学术研究阶段时,我们团队已经和国内多家银行有了合作。另一个则是技术沉淀的领先。因为金服自身业务的特殊性,我们团队很早就开始了隐私保护机器学习和共享学习的布局,包括很多原始的技术沉淀,强大的工程团队以及学术预研团队。这些积累也使得我们能够很快地摸清最新的一些研究成果并能将其吸入到我们自己的系统当中。 我自己关于隐私保护机器学习的研究主要是围绕着三个层面展开,分别是理论,算法设计,以及系统和硬件优化。在理论层面,我主要针对现有的各种机器学习算法,建立相应的隐私泄露分析框架,比如我们在之前的工作中,针对一种常用的贝叶斯学习的算法根据雷尼差分隐私建立了隐私泄露的定量分析框架,我们进一步使用我们的框架和已有的一些泛化误差上界做了联系,从而能从多个角度去解释该算法的隐私泄露原因。在算法设计层面,我们针对各种已有的新兴算法以及场景,比如图神经网络,推荐系统建立了相应的共享学习算法,并利用我们的理论框架,对这些算法的隐私保护强度做了定量的评估。除开上层的理论和算法设计,底层的系统和硬件的优化同样是非常重要的一环。 在我们团队,我们主打基于硬件可信执行环境 (TEE)的机器学习serving系统,我针对我们当前这套服务系统,结合神经网络计算的一些特点,定制了该系统的一系列优化措施大大提升了整个系统的吞吐量。我也将其中一些措施注册了专利,并在前几天得到了内部的专利授权。除开上述介绍的学术研究方面的成果,我也参与了IEEE共享学习标准的制定会议,这也使得我从标准制定者的角度去更深地思考如何使用技术在未来社会中实现隐私与效率的兼顾。 总之,我自己很感谢能成为共享智能团队的一员,我在这里学到的最宝贵的经验就是详细地从上到下了解了这样一个大团队的合作与分工,学习他们是如何一步步从最初的需求分析,算法设计,到最后真正的业务落地。也很高兴和各位共享智能的同事度过自己博士生涯中很重要的一年。也非常感谢我的博士导师对我研究的无条件支持。回看博士这一路的艰辛,也是感慨万千。有点像自己之前高原骑行的经历,经历了爬到坡顶的缺氧与无力,终在转角处遇见了骑行途中最美的雪山风光。
游客bnlxddh3fwntw 2020-05-19 16:05:51 0 浏览量 回答数 0

回答

一、建表高级属性 下面几个 shell 命令在 hbase 操作中可以起到很到的作用,且主要体现在建表的过程中,看 下面几个 create 属性 1、bloomfilter 布隆过滤器 默认是 NONE 是否使用布隆过虑及使用何种方式, 布隆过滤可以每列族单独启用 使用 HColumnDescriptor.setBloomFilterType(NONE | ROW | ROWCOL) 对列族单独启用布隆 Default = ROW 对行进行布隆过滤(默认是ROW过滤) 对 ROW,行键的哈希在每次插入行时将被添加到布隆 对 ROWCOL,行键 + 列族 + 列族修饰的哈希将在每次插入行时添加到布隆 使用方法: create 'table',{BLOOMFILTER =>'ROW'} 作用: 用布隆过滤可以节省读磁盘过程,可以有助于降低读取延迟 2、versions 默认是 1 这个参数的意思是数据保留 1 个 版本,如果我们认为我们的数据没有这么大 的必要保留这么多,随时都在更新,而老版本的数据对我们毫无价值,那将此参数设为 1 能 节约 2/3 的空间 使用方法: create 'table',{VERSIONS=>'2'} 附: MIN_VERSIONS => '0'是说在 compact 操作执行之后,至少要保留的版本 3、compression 默认值是 NONE 即不使用压缩, 这个参数意思是该列族是否采用压缩,采用什么压缩算 法, 方法: create 'table',{NAME=>'info',COMPRESSION=>'SNAPPY'} , 建议采用 SNAPPY 压缩算法 , HBase 中,在 Snappy 发布之前( Google 2011 年对外发布 Snappy),采用的 LZO 算法, 目标是达到尽可能快的压缩和解压速度,同时减少对 CPU 的消耗; 在 Snappy 发布之后,建议采用 Snappy 算法(参考《 HBase: The Definitive Guide》),具体 可以根据实际情况对 LZO 和 Snappy 做过更详细的对比测试后再做选择。 4、TTL 默认是 2147483647 即:Integer.MAX_VALUE 值大概是 68 年 , 这个参数是说明该列族数据的存活时间,单位是 毫秒 这个参数可以根据具体的需求对数据设定存活时间,超过存过时间的数据将在表中不在 显示,待下次 major compact 的时候再彻底删除数据 注意的是 TTL 设定之后 MIN_VERSIONS=>'0' 这样设置之后, TTL 时间戳过期后,将全部 彻底删除该 family 下所有的数据,如果 MIN_VERSIONS 不等于 0 那将保留最新的 MIN_VERSIONS 个版本的数据,其它的全部删除,比如 MIN_VERSIONS=>'1' 届时将保留一个 最新版本的数据,其它版本的数据将不再保存。 5、alter 使用方法: 如 修改压缩算法 disable 'table' alter 'table',{NAME=>'info',COMPRESSION=>'snappy'} enable 'table' 但是需要执行 major_compact 'table' 命令之后 才会做实际的操作。 6、describe/desc 这个命令查看了 create table 的各项参数或者是默认值。 使用方式: describe 'user_info' 7、disable_all/enable_all disable_all 'toplist.*' disable_all 支持正则表达式,并列出当前匹配的表的如下: toplist_a_total_1001 toplist_a_total_1002 toplist_a_total_1008 toplist_a_total_1009 toplist_a_total_1019 toplist_a_total_1035 ... Disable the above 25 tables (y/n)? 并给出确认提示 8、 drop_all 这个命令和 disable_all 的使用方式是一样的 9、 hbase 预分区 默认情况下,在创建 HBase 表的时候会自动创建一个 region 分区,当导入数据的时候, 所有的 HBase 客户端都向这一个 region 写数据,直到这个 region 足够大了才进行切分。一 种可以加快批量写入速度的方法是通过预先创建一些空的 regions,这样当数据写入 HBase 时,会按照 region 分区情况,在集群内做数据的负载均衡。 命令方式: create table with specific split points hbase>create 'table1','f1',SPLITS => ['\x10\x00', '\x20\x00', '\x30\x00', '\x40\x00'] create table with four regions based on random bytes keys hbase>create 'table2','f1', { NUMREGIONS => 8 , SPLITALGO => 'UniformSplit' } create table with five regions based on hex keys create 'table3','f1', { NUMREGIONS => 10, SPLITALGO => 'HexStringSplit' } 也可以使用 api 的方式: bin/hbase org.apache.hadoop.hbase.util.RegionSplitter test_table HexStringSplit -c 10 -f info 参数: test_table 是表名 HexStringSplit 是 split 方式 -c 是分 10 个 region -f 是 family 这样就可以将表预先分为 15 个区,减少数据达到 storefile 大小的时候自动分区的时间 消耗,并且还有以一个优势,就是合理设计 rowkey 能让各个 region 的并发请求平均分配(趋 于均匀) 使 IO 效率达到最高,但是预分区需要将 filesize 设置一个较大的值,设置哪个参数 呢 hbase.hregion.max.filesize 这个值默认是 10G 也就是说单个 region 默认大小是 10G 这个参数的默认值在 0.90 到 0.92 到 0.94.3 各版本的变化: 256M--1G--10G 但是如果 MapReduce Input 类型为 TableInputFormat 使用 hbase 作为输入的时候,就要注意 了,每个 region 一个 map,如果数据小于 10G 那只会启用一个 map 造成很大的资源浪费, 这时候可以考虑适当调小该参数的值,或者采用预分配 region 的方式,并将检测如果达到 这个值,再手动分配 region。 二、表的设计 1、列簇设计 追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇。 最优设计是: 将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率 最高,也能保持尽可能少的访问不同的磁盘文件 以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在 另一列族 2、rowkey设计 (100字节以内,合理的取8的倍数,一般是8或者16) HBase 中,表会被划分为 1...n 个 Region,被托管在 RegionServer 中。 Region 二个重要的 属性: StartKey 与 EndKey 表示这个 Region 维护的 rowKey 范围,当我们要读/写数据时,如果 rowKey 落在某个 start-end key 范围内,那么就会定位到目标 region 并且读/写到相关的数 据 那怎么快速精准的定位到我们想要操作的数据,就在于我们的 rowkey 的设计了 rowkey设计 三原则: (1)rowkey长度原则 Rowkey 是一个二进制码流, Rowkey 的长度被很多开发者建议说设计在 10~100 个字节,不 过建议是越短越好,不要超过 16 个字节。 原因如下: 1、 数据的持久化文件 HFile 中是按照 KeyValue 存储的,如果 Rowkey 过长比如 100 个字 节, 1000 万列数据光 Rowkey 就要占用 100*1000 万=10 亿个字节,将近 1G 数据,这会极大 影响 HFile 的存储效率; 2、 MemStore 将缓存部分数据到内存,如果 Rowkey 字段过长内存的有效利用率会降低, 系统将无法缓存更多的数据,这会降低检索效率。因此 Rowkey 的字节长度越短越好。 3、 目前操作系统是都是 64 位系统,内存 8 字节对齐。控制在 16 个字节, 8 字节的整数 倍利用操作系统的最佳特性。 (2)rowkey散列原则 如果 Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将 Rowkey 的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个 Regionserver 实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有 新数据都在一个 RegionServer 上堆积的热点现象,这样在做数据检索的时候负载将会集中 在个别 RegionServer,降低查询效率。 (3)rowkey唯一原则 必须在设计上保证其唯一性。 rowkey 是按照字典顺序排序存储的,因此,设计 rowkey 的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问 的数据放到一块。 三、数据热点 1、数据热点 HBase 中的行是按照 rowkey 的字典顺序排序的,这种设计优化了 scan 操作,可以将相 关的行以及会被一起读取的行存取在临近位置,便于 scan。然而糟糕的 rowkey 设计是热点 的源头。 热点发生在大量的 client 直接访问集群的一个或极少数个节点(访问可能是读, 写或者其他操作)。大量访问会使热点 region 所在的单个机器超出自身承受能力,引起性能 下降甚至 region 不可用,这也会影响同一个 RegionServer 上的其他 region,由于主机无法服 务其他 region 的请求。 设计良好的数据访问模式以使集群被充分,均衡的利用。 为了避免写热点,设计 rowkey 使得不同行在同一个 region,但是在更多数据情况下,数据 应该被写入集群的多个 region,而不是一个。 2、防止数据热点的措施 (1)加盐 这里所说的加盐不是密码学中的加盐,而是在 rowkey 的前面增加随机数,具体就是给 rowkey 分配一个随机前缀以使得它和之前的 rowkey 的开头不同。分配的前缀种类数量应该 和你想使用数据分散到不同的 region 的数量一致。加盐之后的 rowkey 就会根据随机生成的 前缀分散到各个 region 上,以避免热点。 (2)哈希 哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是 可以预测的。使用确定的哈希可以让客户端重构完整的 rowkey,可以使用 get 操作准确获取 某一个行数据 (3)反转 第三种防止热点的方法时反转固定长度或者数字格式的 rowkey。这样可以使得 rowkey 中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机 rowkey,但是牺 牲了 rowkey 的有序性。 反转 rowkey 的例子以手机号为 rowkey,可以将手机号反转后的字符串作为 rowkey,这 样的就避免了以手机号那样比较固定开头导致热点问题 (4)时间戳反转 一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为 rowkey 的一部分对这个问题十分有用,可以用 Long.Max_Value - timestamp 追加到 key 的末尾,例 如 [key][reverse_timestamp] , [key] 的最新值可以通过 scan [key]获得[key]的第一条记录,因 为 HBase 中 rowkey 是有序的,第一条记录是最后录入的数据。比如需要保存一个用户的操 作记录,按照操作时间倒序排序,在设计 rowkey 的时候,可以这样设计 [userId 反转][Long.Max_Value - timestamp],在查询用户的所有操作记录数据的时候,直接指 定 反 转 后 的 userId , startRow 是 [userId 反 转 ][000000000000],stopRow 是 [userId 反 转][Long.Max_Value - timestamp] 如果需要查询某段时间的操作记录, startRow 是[user 反转][Long.Max_Value - 起始时间], stopRow 是[userId 反转][Long.Max_Value - 结束时间
游客2q7uranxketok 2021-02-22 13:25:43 0 浏览量 回答数 0

问题

词汇表是什么样的?(S-V)

S A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z SASL ...
轩墨 2019-12-01 22:06:08 2089 浏览量 回答数 0

回答

92题 一般来说,建立INDEX有以下益处:提高查询效率;建立唯一索引以保证数据的唯一性;设计INDEX避免排序。 缺点,INDEX的维护有以下开销:叶节点的‘分裂’消耗;INSERT、DELETE和UPDATE操作在INDEX上的维护开销;有存储要求;其他日常维护的消耗:对恢复的影响,重组的影响。 需要建立索引的情况:为了建立分区数据库的PATITION INDEX必须建立; 为了保证数据约束性需要而建立的INDEX必须建立; 为了提高查询效率,则考虑建立(是否建立要考虑相关性能及维护开销); 考虑在使用UNION,DISTINCT,GROUP BY,ORDER BY等字句的列上加索引。 91题 作用:加快查询速度。原则:(1) 如果某属性或属性组经常出现在查询条件中,考虑为该属性或属性组建立索引;(2) 如果某个属性常作为最大值和最小值等聚集函数的参数,考虑为该属性建立索引;(3) 如果某属性经常出现在连接操作的连接条件中,考虑为该属性或属性组建立索引。 90题 快照Snapshot是一个文件系统在特定时间里的镜像,对于在线实时数据备份非常有用。快照对于拥有不能停止的应用或具有常打开文件的文件系统的备份非常重要。对于只能提供一个非常短的备份时间而言,快照能保证系统的完整性。 89题 游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。 88题 事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。 87题 MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。具体原因为:MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。 86题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 85题 存储过程是一组Transact-SQL语句,在一次编译后可以执行多次。因为不必重新编译Transact-SQL语句,所以执行存储过程可以提高性能。触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 84题 存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。 83题 减少表连接,减少复杂 SQL,拆分成简单SQL。减少排序:非必要不排序,利用索引排序,减少参与排序的记录数。尽量避免 select *。尽量用 join 代替子查询。尽量少使用 or,使用 in 或者 union(union all) 代替。尽量用 union all 代替 union。尽量早的将无用数据过滤:选择更优的索引,先分页再Join…。避免类型转换:索引失效。优先优化高并发的 SQL,而不是执行频率低某些“大”SQL。从全局出发优化,而不是片面调整。尽可能对每一条SQL进行 explain。 82题 如果条件中有or,即使其中有条件带索引也不会使用(要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引)。对于多列索引,不是使用的第一部分,则不会使用索引。like查询是以%开头。如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。如果mysql估计使用全表扫描要比使用索引快,则不使用索引。例如,使用<>、not in 、not exist,对于这三种情况大多数情况下认为结果集很大,MySQL就有可能不使用索引。 81题 主键不能重复,不能为空,唯一键不能重复,可以为空。建立主键的目的是让外键来引用。一个表最多只有一个主键,但可以有很多唯一键。 80题 空值('')是不占用空间的,判断空字符用=''或者<>''来进行处理。NULL值是未知的,且占用空间,不走索引;判断 NULL 用 IS NULL 或者 is not null ,SQL 语句函数中可以使用 ifnull ()函数来进行处理。无法比较 NULL 和 0;它们是不等价的。无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。NULL 值可以使用 <=> 符号进行比较,该符号与等号作用相似,但对NULL有意义。进行 count ()统计某列的记录数的时候,如果采用的 NULL 值,会被系统自动忽略掉,但是空值是统计到其中。 79题 HEAP表是访问数据速度最快的MySQL表,他使用保存在内存中的散列索引。一旦服务器重启,所有heap表数据丢失。BLOB或TEXT字段是不允许的。只能使用比较运算符=,<,>,=>,= <。HEAP表不支持AUTO_INCREMENT。索引不可为NULL。 78题 如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者只用(Ox)前缀输入十六进制数字。如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。 77题 Mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。 76题 在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。 75题 它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。 74题 创建索引的时候尽量使用唯一性大的列来创建索引,由于使用b+tree做为索引,以innodb为例,一个树节点的大小由“innodb_page_size”,为了减少树的高度,同时让一个节点能存放更多的值,索引列尽量在整数类型上创建,如果必须使用字符类型,也应该使用长度较少的字符类型。 73题 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下: 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读。垂直分区: 根据数据库里面数据表的相关性进行拆分。简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。水平分区: 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。 72题 乐观锁失败后会抛出ObjectOptimisticLockingFailureException,那么我们就针对这块考虑一下重试,自定义一个注解,用于做切面。针对注解进行切面,设置最大重试次数n,然后超过n次后就不再重试。 71题 一致性非锁定读讲的是一条记录被加了X锁其他事务仍然可以读而不被阻塞,是通过innodb的行多版本实现的,行多版本并不是实际存储多个版本记录而是通过undo实现(undo日志用来记录数据修改前的版本,回滚时会用到,用来保证事务的原子性)。一致性锁定读讲的是我可以通过SELECT语句显式地给一条记录加X锁从而保证特定应用场景下的数据一致性。 70题 数据库引擎:尤其是mysql数据库只有是InnoDB引擎的时候事物才能生效。 show engines 查看数据库默认引擎;SHOW TABLE STATUS from 数据库名字 where Name='表名' 如下;SHOW TABLE STATUS from rrz where Name='rrz_cust';修改表的引擎alter table table_name engine=innodb。 69题 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);哈希索引也不支持多列联合索引的最左匹配规则;B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。 68题 decimal精度比float高,数据处理比float简单,一般优先考虑,但float存储的数据范围大,所以范围大的数据就只能用它了,但要注意一些处理细节,因为不精确可能会与自己想的不一致,也常有关于float 出错的问题。 67题 datetime、timestamp精确度都是秒,datetime与时区无关,存储的范围广(1001-9999),timestamp与时区有关,存储的范围小(1970-2038)。 66题 Char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。Varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储。char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较。Varbinary保存变长的字符串,后面不会补\0。 65题 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。 64题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 63题 存储过程是一些预编译的SQL语句。1、更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。2、存储过程是一个预编译的代码块,执行效率比较高,一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全。 62题 密码散列、盐、用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率。 61题 推荐使用自增ID,不要使用UUID。因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。总之,在数据量大一些的情况下,用自增主键性能会好一些。 60题 char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容。该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间。在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar。例如存储用户MD5加密后的密码,则应该使用char。 59题 一. read uncommitted(读取未提交数据) 即便是事务没有commit,但是我们仍然能读到未提交的数据,这是所有隔离级别中最低的一种。 二. read committed(可以读取其他事务提交的数据)---大多数数据库默认的隔离级别 当前会话只能读取到其他事务提交的数据,未提交的数据读不到。 三. repeatable read(可重读)---MySQL默认的隔离级别 当前会话可以重复读,就是每次读取的结果集都相同,而不管其他事务有没有提交。 四. serializable(串行化) 其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格的,但是这样做势必对性能造成影响。所以在实际的选用上,我们要根据当前具体的情况选用合适的。 58题 B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了。范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于3的数据,当在叶子节点中查到3时,通过3的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到3的父节点。 57题 因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。 56题 redo log是物理日志,记录的是"在某个数据页上做了什么修改"。 binlog是逻辑日志,记录的是这个语句的原始逻辑,比如"给ID=2这一行的c字段加1"。 redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。 redo log是循环写的,空间固定会用完:binlog 是可以追加写入的。"追加写"是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。 最开始 MySQL 里并没有 InnoDB 引擎,MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog日志只能用于归档。而InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统,也就是 redo log 来实现 crash-safe 能力。 55题 重做日志(redo log)      作用:确保事务的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性。 回滚日志(undo log)  作用:保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。 二进 制日志(binlog)    作用:用于主从复制,实现主从同步;用于数据库的基于时间点的还原。 错误日志(errorlog) 作用:Mysql本身启动,停止,运行期间发生的错误信息。 慢查询日志(slow query log)  作用:记录执行时间过长的sql,时间阈值可以配置,只记录执行成功。 一般查询日志(general log)    作用:记录数据库的操作明细,默认关闭,开启后会降低数据库性能 。 中继日志(relay log) 作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放。 54题 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 死锁: 是指两个或两个以上的进程在执行过程中。因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。 那么对应的解决死锁问题的关键就是:让不同的session加锁有次序。死锁的解决办法:1.查出的线程杀死。2.设置锁的超时时间。3.指定获取锁的顺序。 53题 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性(脏读,不可重复读,幻读等),可能产生死锁。 乐观锁:乐观锁不是数据库自带的,需要我们自己去实现。 悲观锁:在进行每次操作时都要通过获取锁才能进行对相同数据的操作。 共享锁:加了共享锁的数据对象可以被其他事务读取,但不能修改。 排他锁:当数据对象被加上排它锁时,一个事务必须得到锁才能对该数据对象进行访问,一直到事务结束锁才被释放。 行锁:就是给某一条记录加上锁。 52题 Mysql是关系型数据库,MongoDB是非关系型数据库,数据存储结构的不同。 51题 关系型数据库优点:1.保持数据的一致性(事务处理)。 2.由于以标准化为前提,数据更新的开销很小。 3. 可以进行Join等复杂查询。 缺点:1、为了维护一致性所付出的巨大代价就是其读写性能比较差。 2、固定的表结构。 3、高并发读写需求。 4、海量数据的高效率读写。 非关系型数据库优点:1、无需经过sql层的解析,读写性能很高。 2、基于键值对,数据没有耦合性,容易扩展。 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 缺点:1、不提供sql支持,学习和使用成本较高。 2、无事务处理,附加功能bi和报表等支持也不好。 redis与mongoDB的区别: 性能:TPS方面redis要大于mongodb。 可操作性:mongodb支持丰富的数据表达,索引,redis较少的网络IO次数。 可用性:MongoDB优于Redis。 一致性:redis事务支持比较弱,mongoDB不支持事务。 数据分析:mongoDB内置了数据分析的功能(mapreduce)。 应用场景:redis数据量较小的更性能操作和运算上,MongoDB主要解决海量数据的访问效率问题。 50题 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。 49题 分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。 48题 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6种策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: 1.定时去清理过期的缓存; 2.当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,可以根据应用场景来权衡。 47题 Redis提供了两种方式来作消息队列: 一个是使用生产者消费模式模式:会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听 。另一个就是发布订阅者模式:也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是平等的。 46题 Redis的数据结构列表(list)可以实现延时队列,可以通过队列和栈来实现。blpop/brpop来替换lpop/rpop,blpop/brpop阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。Redis的有序集合(zset)可以用于实现延时队列,消息作为value,时间作为score。Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。 45题 1.热点数据缓存:因为Redis 访问速度块、支持的数据类型比较丰富。 2.限时业务:expire 命令设置 key 的生存时间,到时间后自动删除 key。 3.计数器:incrby 命令可以实现原子性的递增。 4.排行榜:借助 SortedSet 进行热点数据的排序。 5.分布式锁:利用 Redis 的 setnx 命令进行。 6.队列机制:有 list push 和 list pop 这样的命令。 44题 一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。 43题 RDB的优点:适合做冷备份;读写服务影响小,reids可以保持高性能;重启和恢复redis进程,更加快速。RDB的缺点:宕机会丢失最近5分钟的数据;文件特别大时可能会暂停数毫秒,或者甚至数秒。 AOF的优点:每个一秒执行fsync操作,最多丢失1秒钟的数据;以append-only模式写入,没有任何磁盘寻址的开销;文件过大时,不会影响客户端读写;适合做灾难性的误删除的紧急恢复。AOF的缺点:AOF日志文件比RDB数据快照文件更大,支持写QPS比RDB支持的写QPS低;比RDB脆弱,容易有bug。 42题 对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。而在程序中执行多个Redis命令并非是原子性的,这也和普通数据库的表现是一样的,可以用incr或者使用Redis的事务,或者使用Redis+Lua的方式实现。对Redis来说,执行get、set以及eval等API,都是一个一个的任务,这些任务都会由Redis的线程去负责执行,任务要么执行成功,要么执行失败,这就是Redis的命令是原子性的原因。 41题 (1)twemproxy,使用方式简单(相对redis只需修改连接端口),对旧项目扩展的首选。(2)codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数改变情况下,旧节点数据可恢复到新hash节点。(3)redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。(4)在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的代替算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。 40题 (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 (4) 尽量避免在压力很大的主库上增加从库 (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。 39题 比如订单管理,热数据:3个月内的订单数据,查询实时性较高;温数据:3个月 ~ 12个月前的订单数据,查询频率不高;冷数据:1年前的订单数据,几乎不会查询,只有偶尔的查询需求。热数据使用mysql进行存储,需要分库分表;温数据可以存储在ES中,利用搜索引擎的特性基本上也可以做到比较快的查询;冷数据可以存放到Hive中。从存储形式来说,一般情况冷数据存储在磁带、光盘,热数据一般存放在SSD中,存取速度快,而温数据可以存放在7200转的硬盘。 38题 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。 37题 分层架构设计,有一条准则:站点层、服务层要做到无数据无状态,这样才能任意的加节点水平扩展,数据和状态尽量存储到后端的数据存储服务,例如数据库服务或者缓存服务。显然进程内缓存违背了这一原则。 36题 更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。 35题 redis分布式锁加锁过程:通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功;redis分布式锁解锁过程:匹配随机值,删除redis上的特点key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的,为保证原子性一般使用lua脚本实现;在此基础上进一步优化的话,考虑使用心跳检测对锁的有效期进行续期,同时基于redis的发布订阅优雅的实现阻塞式加锁。 34题 volatile-lru:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。 volatile-ttl:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选将要过期的数据淘汰。 volatile-random:当内存不足以容纳写入数据时,从已设置过期时间的数据集中任意选择数据淘汰。 allkeys-lru:当内存不足以容纳写入数据时,从数据集中挑选最近最少使用的数据淘汰。 allkeys-random:当内存不足以容纳写入数据时,从数据集中任意选择数据淘汰。 noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错。 33题 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 32题 缓存击穿,一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。如何避免:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。 31题 缓存雪崩,是指在某一个时间段,缓存集中过期失效。大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。而缓存服务器某个节点宕机或断网,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。如何避免:1.redis高可用,搭建redis集群。2.限流降级,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。3.数据预热,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间。 30题 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。一些恶意的请求会故意查询不存在的 key,请求量很大,对数据库造成压力,甚至压垮数据库。 如何避免:1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清理缓存。2:对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 bitmap 过滤。 29题 1.memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型。 2.redis 的速度比 memcached 快很多。 3.redis 可以持久化其数据。 4.Redis支持数据的备份,即master-slave模式的数据备份。 5.Redis采用VM机制。 6.value大小:redis最大可以达到1GB,而memcache只有1MB。 28题 Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过spring提供的@ImportResource来加载xml配置。例如:@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"}) 27题 Spring像一个大家族,有众多衍生产品例如Spring Boot,Spring Security等等,但他们的基础都是Spring的IOC和AOP,IOC提供了依赖注入的容器,而AOP解决了面向切面的编程,然后在此两者的基础上实现了其他衍生产品的高级功能。Spring MVC是基于Servlet的一个MVC框架,主要解决WEB开发的问题,因为 Spring的配置非常复杂,各种xml,properties处理起来比较繁琐。Spring Boot遵循约定优于配置,极大降低了Spring使用门槛,又有着Spring原本灵活强大的功能。总结:Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个MVC框架,而Spring Boot是基于Spring的一套快速开发整合包。 26题 YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。YAML 的配置文件后缀为 .yml,是一种人类可读的数据序列化语言,可以简单表达清单、散列表,标量等数据形态。它通常用于配置文件,与属性文件相比,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。 25题 Spring Boot有3种热部署方式: 1.使用springloaded配置pom.xml文件,使用mvn spring-boot:run启动。 2.使用springloaded本地加载启动,配置jvm参数-javaagent:<jar包地址> -noverify。 3.使用devtools工具包,操作简单,但是每次需要重新部署。 用
游客ih62co2qqq5ww 2020-03-27 23:56:48 0 浏览量 回答数 0

问题

达达O2O后台架构演进实践:从0到4000高并发请求背后的努力:报错

1、引言 达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台。 达达的业务模式与滴滴以及Uber很相似...
kun坤 2020-06-09 15:20:48 4 浏览量 回答数 1

回答

您可以在安全沙箱容器Kubernetes集群中使用镜像创建一个可公网访问的nginx应用。 前提条件 创建一个安全沙箱容器集群。详情请参见创建安全沙箱容器集群。 操作步骤 登录容器服务管理控制台。 在Kubernetes菜单下,单击左侧导航栏中的应用 > 无状态,然后单击页面右上角的使用镜像创建。 设置应用名称、部署集群 、 命名空间、副本数量、类型、容器运行时、注解和标签,副本数量即应用包含的Pod数量。然后单击下一步 进入容器配置页面。 说明 本例中选择无状态类型,即Deployment类型。 容器运行时:可选择runc和runv,如果没有选择,默认为runc。创建安全沙箱容器应用时,需要选择为runv。 如果您不设置命名空间,系统会默认使用 default 命名空间。 应用基本信息 设置容器配置。 说明 您可为应用的Pod设置多个容器。 设置容器的基本配置。 镜像名称:您可以单击选择镜像,在弹出的对话框中选择所需的镜像并单击确定,本例中为 nginx。 您还可以填写私有 registry。填写的格式为domainname/namespace/imagename:tag 镜像版本:您可以单击选择镜像版本 选择镜像的版本。若不指定,默认为 latest。 总是拉取镜像:为了提高效率,容器服务会对镜像进行缓存。部署时,如果发现镜像 Tag 与本地缓存的一致,则会直接复用而不重新拉取。所以,如果您基于上层业务便利性等因素考虑,在做代码和镜像变更时没有同步修改 Tag ,就会导致部署时还是使用本地缓存内旧版本镜像。而勾选该选项后,会忽略缓存,每次部署时重新拉取镜像,确保使用的始终是最新的镜像和代码。 镜像密钥:单击设置镜像密钥设置镜像的密钥。对于私有仓库访问时,需要设置密钥,具体可以参见使用镜像密钥 资源限制:可指定该应用所能使用的资源上限,包括 CPU 和内存两种资源,防止占用过多资源。其中,CPU 资源的单位为 cores,即一个核;内存的单位为 Bytes,可以为 Mi 。 所需资源:即为该应用预留资源额度,包括 CPU 和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争占资源,导致应用不可用。 Init Container:勾选该项,表示创建一个Init Container,Init Container包含一些实用的工具,具体参见https://kubernetes.io/docs/concepts/workloads/pods/init-containers/。 基本信息配置 可选: 配置环境变量。 支持通过键值对的形式为 Pod 配置环境变量。用于给 Pod 添加环境标志或传递配置等,具体请参见 Pod variable。 可选: 设置健康检查 支持存活检查(liveness)和就绪检查(Readiness)。存活检查用于检测何时重启容器;就绪检查确定容器是否已经就绪,且可以接受流量。关于健康检查的更多信息,请参见https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes。 健康检查 请求类型 配置说明 HTTP请求 即向容器发送一个HTTPget 请求,支持的参数包括: 协议:HTTP/HTTPS 路径:访问HTTP server 的路径 端口:容器暴露的访问端口或端口名,端口号必须介于1~65535。 HTTP头:即HTTPHeaders,HTTP请求中自定义的请求头,HTTP允许重复的header。支持键值对的配置方式。 延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为3秒。 执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为10s,最小为1s。 超时时间(秒):即timeoutSeconds,探测超时时间。默认1秒,最小1秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(liveness)必须是1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。 TCP连接 即向容器发送一个TCP Socket,kubelet将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。支持的参数包括: 端口:容器暴露的访问端口或端口名,端口号必须介于1~65535。 延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为15秒。 执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为10s,最小为1s。 超时时间(秒):即timeoutSeconds,探测超时时间。默认1秒,最小1秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(liveness)必须是1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。 命令行 通过在容器中执行探针检测命令,来检测容器的健康情况。支持的参数包括: 命令行:用于检测容器健康情况的探测命令。 延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为5秒。 执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为10s,最小为1s。 超时时间(秒):即timeoutSeconds,探测超时时间。默认1秒,最小1秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(liveness)必须是1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。 配置生命周期。 您可以为容器的生命周期配置容器启动项、启动执行、启动后处理和停止前处理。具体参见https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/。 启动执行:为容器设置预启动命令和参数。 启动后处理:为容器设置启动后的命令。 停止前处理:为容器设置预结束命令。 配置生命周期 可选: 配置数据卷信息。 支持配置本地存储和云存储。 本地存储:支持主机目录(hostpath)、配置项(configmap)、保密字典(secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息参见 volumes。 云存储:支持云盘/NAS/OSS三种云存储类型。 本例中配置了一个云盘类型的数据卷,将该云盘挂载到容器中/tmp 路径下,在该路径下生成的容器数据会存储到云盘中。 配置数据卷 完成容器配置后,单击 下一步。 进行高级设置。 设置访问设置。 您可以设置暴露后端Pod的方式,最后单击创建。本例中选择ClusterIP服务和路由(Ingress),构建一个可公网访问的nginx应用。 说明 针对应用的通信需求,您可灵活进行访问设置: 内部应用:对于只在集群内部工作的应用,您可根据需要创建ClusterIP或NodePort类型的服务,来进行内部通信。 外部应用:对于需要暴露到公网的应用,您可以采用两种方式进行访问设置: 创建LoadBalancer类型的服务:使用阿里云提供的负载均衡服务(Server Load Balancer,SLB),该服务提供公网访问能力。 创建ClusterIP、NodePort类型的服务,以及路由(Ingress):通过路由提供公网访问能力,详情参见https://kubernetes.io/docs/concepts/services-networking/ingress/。 创建应用1 在服务栏单击创建,在弹出的对话框中进行配置,最后单击创建。 创建应用2 名称:您可自主设置,默认为applicationname-svc。 类型:您可以从下面 3 种服务类型中进行选择。 虚拟集群 IP:即 ClusterIP,指通过集群的内部 IP 暴露服务,选择该项,服务只能够在集群内部访问。 节点端口:即 NodePort,通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。 负载均衡:即 LoadBalancer,是阿里云提供的负载均衡服务,可选择公网访问或内网访问。负载均衡可以路由到 NodePort 服务和 ClusterIP 服务。 端口映射:您需要添加服务端口和容器端口,若类型选择为节点端口,还需要自己设置节点端口,防止端口出现冲突。支持 TCP/UDP 协议。 注解:为该服务添加一个注解(annotation),支持负载均衡配置参数,参见通过负载均衡(Server Load Balancer)访问服务。 标签:您可为该服务添加一个标签,标识该服务。 在路由栏单击创建,在弹出的对话框中,为后端Pod配置路由规则,最后单击创建。更多详细的路由配置信息,请参见路由配置说明。 说明 通过镜像创建应用时,您仅能为一个服务创建路由(Ingress)。本例中使用一个虚拟主机名称作为测试域名,您需要在hosts中添加一条记录。在实际工作场景中,请使用备案域名。 101.37.224.146 foo.bar.com #即ingress的IP 配置路由规则 在访问设置栏中,您可看到创建完毕的服务和路由,您可单击变更和删除进行二次配置。 变更和删除路由 可选: 容器组水平伸缩。 您可勾选是否开启容器组水平伸缩,为了满足应用在不同负载下的需求,容器服务支持服容器组(Pod)的弹性伸缩,即根据容器 CPU 和内存资源占用情况自动调整容器组数量。 容器组水平伸缩 说明 若要启用自动伸缩,您必须为容器设置所需资源,否则容器自动伸缩无法生效。参见容器基本配置环节。 指标:支持CPU和内存,需要和设置的所需资源类型相同。 触发条件:资源使用率的百分比,超过该使用量,容器开始扩容。 最大容器数量:该Deployment可扩容的容器数量上限。 最小容器数量:该Deployment可缩容的容器数量下限。 可选: 设置调度设置。 您可设置升级方式、节点亲和性、应用亲和性和应用非亲和性,详情参见https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity。 说明 亲和性调度依赖节点标签和Pod标签,您可使用内置的标签进行调度;也可预先为节点、Pod配置相关的标签。 设置升级方式。 升级方式包括滚动升级(rollingupdate)和替换升级(recreate),详细请参见https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/ 设置节点亲和性,通过Node节点的Label标签进行设置。 设置节点亲和性 节点调度支持硬约束和软约束(Required/Preferred),以及丰富的匹配表达式(In, NotIn, Exists, DoesNotExist. Gt, and Lt): 必须满足,即硬约束,一定要满足,对应requiredDuringSchedulingIgnoredDuringExecution,效果与NodeSelector相同。本例中Pod只能调度到具有对应标签的Node节点。您可以定义多条硬约束规则,但只需满足其中一条。 尽量满足,即软约束,不一定满足,对应preferredDuringSchedulingIgnoredDuringExecution。本例中,调度会尽量不调度Pod到具有对应标签的Node节点。您还可为软约束规则设定权重,具体调度时,若存在多个符合条件的节点,权重最大的节点会被优先调度。您可定义多条软约束规则,但必须满足全部约束,才会进行调度。 设置应用亲和性调度。决定应用的Pod可以和哪些Pod部署在同一拓扑域。例如,对于相互通信的服务,可通过应用亲和性调度,将其部署到同一拓扑域(如同一个主机)中,减少它们之间的网络延迟。 应用亲和性调度 根据节点上运行的Pod的标签(Label)来进行调度,支持硬约束和软约束,匹配的表达式有:In, NotIn, Exists, DoesNotExist。 必须满足,即硬约束,一定要满足,对应requiredDuringSchedulingIgnoredDuringExecution,Pod的亲和性调度必须要满足后续定义的约束条件。 命名空间:该策略是依据Pod的Label进行调度,所以会受到命名空间的约束。 拓扑域:即topologyKey,指定调度时作用域,这是通过Node节点的标签来实现的,例如指定为kubernetes.io/hostname,那就是以Node节点为区分范围;如果指定为beta.kubernetes.io/os,则以Node节点的操作系统类型来区分。 选择器:单击选择器右侧的加号按钮,您可添加多条硬约束规则。 查看应用列表:单击应用列表,弹出对话框,您可在此查看各命名空间下的应用,并可将应用的标签导入到亲和性配置页面。 硬约束条件:设置已有应用的标签、操作符和标签值。本例中,表示将待创建的应用调度到该主机上,该主机运行的已有应用具有app:nginx标签。 尽量满足,即软约束,不一定满足,对应preferredDuringSchedulingIgnoredDuringExecution。Pod的亲和性调度会尽量满足后续定义的约束条件。对于软约束规则,您可配置每条规则的权重,其他配置规则与硬约束规则相同。 说明 权重:设置一条软约束规则的权重,介于1-100,通过算法计算满足软约束规则的节点的权重,将Pod调度到权重最大的节点上。 设置应用非亲和性调度,决定应用的Pod不与哪些Pod部署在同一拓扑域。应用非亲和性调度的场景包括: 将一个服务的Pod分散部署到不同的拓扑域(如不同主机)中,提高服务本身的稳定性。 给予Pod一个节点的独占访问权限来保证资源隔离,保证不会有其它Pod来分享节点资源。 把可能会相互影响的服务的Pod分散在不同的主机上。 说明 应用非亲和性调度的设置方式与亲和性调度相同,但是相同的调度规则代表的意思不同,请根据使用场景进行选择。 最后单击创建。 创建成功后,默认进入创建完成页面,会列出应用包含的对象,您可以单击查看应用详情进行查看。 查看详情 默认进入新建的nginx-deployment的详情页面。 查看详情2 说明 您也可以通过以下操作创建路由与服务。如上图所示,在访问方式页签。 单击服务右侧的创建,也可以进行服务创建,操作步骤同6.i.a。 您单击路由右侧的创建,进行路由的创建,操作同6.i.b。 单击左侧导航栏的路由与负载均衡 > 路由,可以看到路由列表下出现一条规则。 路由规则 在浏览器中访问路由测试域名,您可访问 nginx 欢迎页。 访问nginx
1934890530796658 2020-03-27 10:03:36 0 浏览量 回答数 0

回答

您可以使用镜像创建一个可公网访问的 nginx 应用。 前提条件 创建一个 Kubernetes 集群。详情请参见创建 Kubernetes 集群。 操作步骤 登录容器服务管理控制台。 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 无状态,然后单击页面右上角的使用镜像创建。 设置应用名称、部署集群 、命名空间、副本数量、类型、注解和标签,副本数量即应用包含的 Pod 数量。然后单击下一步 进入容器配置页面。 说明 本例中选择无状态类型,即 Deployment 类型。 如果您不设置命名空间,系统会默认使用 default 命名空间。 基本配置 设置容器配置。 说明 您可为应用的Pod设置多个容器。 设置容器的基本配置。 镜像名称:您可以单击选择镜像,在弹出的对话框中选择所需的镜像并单击确定,本例中为 nginx。 您还可以填写私有 registry。填写的格式为domainname/namespace/imagename:tag 镜像版本:您可以单击选择镜像版本 选择镜像的版本。若不指定,默认为 latest。 总是拉取镜像:为了提高效率,容器服务会对镜像进行缓存。部署时,如果发现镜像 Tag 与本地缓存的一致,则会直接复用而不重新拉取。所以,如果您基于上层业务便利性等因素考虑,在做代码和镜像变更时没有同步修改 Tag ,就会导致部署时还是使用本地缓存内旧版本镜像。而勾选该选项后,会忽略缓存,每次部署时重新拉取镜像,确保使用的始终是最新的镜像和代码。 镜像密钥:单击设置镜像密钥设置镜像的密钥。对于私有仓库访问时,需要设置密钥,具体可以参见使用镜像密钥 资源限制:可指定该应用所能使用的资源上限,包括 CPU 和内存两种资源,防止占用过多资源。其中,CPU 资源的单位为 cores,即一个核;内存的单位为 Bytes,可以为 Mi 。 所需资源:即为该应用预留资源额度,包括 CPU 和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争占资源,导致应用不可用。 Init Container:勾选该项,表示创建一个 Init Container,Init Container 包含一些实用的工具,具体参见https://kubernetes.io/docs/concepts/workloads/pods/init-containers/。 基本信息配置 可选: 配置环境变量。 支持通过键值对的形式为 Pod 配置环境变量。用于给 Pod 添加环境标志或传递配置等,具体请参见 Pod variable。 可选: 设置健康检查 支持存活检查(liveness)和就绪检查(Readiness)。存活检查用于检测何时重启容器;就绪检查确定容器是否已经就绪,且可以接受流量。关于健康检查的更多信息,请参见https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes。 健康检查 请求类型 配置说明 HTTP请求 即向容器发送一个 HTTPget 请求,支持的参数包括: 协议:HTTP/HTTPS。 路径:访问 HTTP server 的路径。 端口:容器暴露的访问端口或端口名,端口号必须介于 1~65535。 HTTP 头:即 HTTPHeaders,HTTP 请求中自定义的请求头,HTTP 允许重复的 header。支持键值对的配置方式。 延迟探测时间(秒):即 initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为 3 秒。 执行探测频率(秒):即 periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即 timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 TCP连接 即向容器发送一个 TCP Socket,kubelet 将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。支持的参数包括: 端口:容器暴露的访问端口或端口名,端口号必须介于 1~65535。 延迟探测时间(秒):即 initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为 15 秒。 执行探测频率(秒):即 periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即 timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 命令行 通过在容器中执行探针检测命令,来检测容器的健康情况。支持的参数包括: 命令行:用于检测容器健康情况的探测命令。 延迟探测时间(秒):即 initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为 5秒。 执行探测频率(秒):即 periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为1秒。 超时时间(秒):即 timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 配置生命周期。 您可以为容器的生命周期配置容器启动项、启动执行、启动后处理和停止前处理。具体参见 https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/。 启动执行:为容器设置预启动命令和参数。 启动后处理:为容器设置启动后的命令。 停止前处理:为容器设置预结束命令。 配置生命周期 可选: 配置数据卷信息。 支持配置本地存储和云存储。 本地存储:支持主机目录(hostpath)、配置项(configmap)、保密字典(secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息参见 volumes。 云存储:支持云存储。 本例中配置了一个云存储类型的数据卷,将该云盘挂载到容器中 /tmp 路径下。 配置数据卷 可选: 配置日志服务,您可进行采集配置和自定义 Tag 设置。 说明 请确保已部署 Kubernetes 集群,并且在此集群上已安装日志插件。 您可对日志进行采集配置: 日志库:即在日志服务中生成一个对应的 logstore,用于存储采集到的日志。 容器内日志路径:支持 stdout 和文本日志。 stdout:stdout 表示采集容器的标准输出日志。 文本日志:表示收集容器内指定路径的日志,本例中表示收集 /var/log/nginx 下所有的文本日志,也支持通配符的方式。 您还可设置自定义 tag,设置 tag 后,会将该 tag 一起采集到容器的日志输出中。自定义 tag 可帮助您给容器日志打上 tag,方便进行日志统计和过滤等分析操作。 日志采集配置 完成容器配置后,单击 下一步。 进行高级设置。 设置访问设置。 您可以设置暴露后端 Pod 的方式,最后单击创建。本例中选择 ClusterIP 服务和路由(Ingress),构建一个可公网访问的 nginx 应用。 说明 针对应用的通信需求,您可灵活进行访问设置: 内部应用:对于只在集群内部工作的应用,您可根据需要创建 ClusterIP 或 NodePort 类型的服务,来进行内部通信。 外部应用:对于需要暴露到公网的应用,您可以采用两种方式进行访问设置: 创建 LoadBalancer 类型的服务:使用阿里云提供的负载均衡服务(Server Load Balancer,SLB),该服务提供公网访问能力。 创建路由(Ingress):通过路由(Ingress)提供公网访问能力,详情参见https://kubernetes.io/docs/concepts/services-networking/ingress/。 创建应用1 在服务栏单击创建,在弹出的对话框中进行配置,最后单击创建。 名称:您可自主设置,默认为 applicationname-svc。 类型:您可以从下面 3 种服务类型中进行选择。 虚拟集群 IP:即 ClusterIP,指通过集群的内部 IP 暴露服务,选择该项,服务只能够在集群内部可以访问。 节点端口:即 NodePort,通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 : ,可以从集群的外部访问一个 NodePort 服务。 负载均衡:即 LoadBalancer,是阿里云提供的负载均衡服务,可选择公网访问或内网访问。负载均衡可以路由到 NodePort 服务和 ClusterIP 服务。 端口映射:您需要添加服务端口和容器端口,若类型选择为节点端口,还需要自己设置节点端口,防止端口出现冲突。支持 TCP/UDP 协议。 注解:为该服务添加一个注解(annotation),支持负载均衡配置参数,参见通过负载均衡(Server Load Balancer)访问服务。 标签:您可为该服务添加一个标签,标识该服务。 在路由栏单击创建,在弹出的对话框中,为后端 Pod 配置路由规则,最后单击创建。更多详细的路由配置信息,请参见路由配置说明。 说明 通过镜像创建应用时,您仅能为一个服务创建路由(Ingress)。本例中使用一个虚拟主机名称作为测试域名,您需要在 hosts 中添加一条记录。在实际工作场景中,请使用备案域名。 101.37.224.146 foo.bar.com #即ingress的IP 配置路由规则 在访问设置栏中,您可看到创建完毕的服务和路由,您可单击变更和删除进行二次配置。 变更和删除路由 可选: 容器组水平伸缩。 您可勾选是否开启容器组水平伸缩,为了满足应用在不同负载下的需求,容器服务支持容器组(Pod)的弹性伸缩,即根据容器 CPU 和内存资源占用情况自动调整容器组数量。 容器组水平伸缩 说明 若要启用自动伸缩,您必须为容器设置所需资源,否则容器自动伸缩无法生效。参见容器基本配置环节。 指标:支持 CPU 和内存,需要和设置的所需资源类型相同。 触发条件:资源使用率的百分比,超过设置的Pod request值,容器开始扩容。 最大容器数量:该 Deployment 可扩容的容器数量上限。 最小容器数量:该 Deployment 可缩容的容器数量下限。 可选: 设置调度设置。 您可设置升级方式、节点亲和性、应用亲和性和应用非亲和性,详情参见https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity。 说明 亲和性调度依赖节点标签和 Pod 标签,您可使用内置的标签进行调度;也可预先为节点、Pod 配置相关的标签。 设置升级方式。 升级方式包括滚动升级(rollingupdate)和替换升级(recreate),详细请参见https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/ 设置节点亲和性,通过 Node 节点的 Label 标签进行设置。 设置节点亲和性 节点调度支持硬约束和软约束(Required/Preferred),以及丰富的匹配表达式(In, NotIn, Exists, DoesNotExist. Gt, and Lt): 必须满足,即硬约束,一定要满足,对应 requiredDuringSchedulingIgnoredDuringExecution,效果与 NodeSelector 相同。本例中 Pod 只能调度到具有对应标签的 Node 节点。您可以定义多条硬约束规则,但只需满足其中一条。 尽量满足,即软约束,不一定满足,对应 preferredDuringSchedulingIgnoredDuringExecution。本例中,调度会尽量不调度 Pod 到具有对应标签的 Node 节点。您还可为软约束规则设定权重,具体调度时,若存在多个符合条件的节点,权重最大的节点会被优先调度。您可定义多条软约束规则,但必须满足全部约束,才会进行调度。 设置应用亲和性调度。决定应用的 Pod 可以和哪些 Pod 部署在同一拓扑域。例如,对于相互通信的服务,可通过应用亲和性调度,将其部署到同一拓扑域(如同一个主机)中,减少它们之间的网络延迟。 应用亲和性调度 根据节点上运行的 Pod 的标签(Label)来进行调度,支持硬约束和软约束,匹配的表达式有:In, NotIn, Exists, DoesNotExist。 必须满足,即硬约束,一定要满足,对应 requiredDuringSchedulingIgnoredDuringExecution ,Pod 的亲和性调度必须要满足后续定义的约束条件。 命名空间:该策略是依据 Pod 的 Label 进行调度,所以会受到命名空间的约束。 拓扑域:即 topologyKey,指定调度时作用域,这是通过 Node 节点的标签来实现的,例如指定为kubernetes.io/hostname,那就是以 Node 节点为区分范围;如果指定为 beta.kubernetes.io/os,则以 Node 节点的操作系统类型来区分。 选择器:单击选择器右侧的加号按钮,您可添加多条硬约束规则。 查看应用列表:单击应用列表,弹出对话框,您可在此查看各命名空间下的应用,并可将应用的标签导入到亲和性配置页面。 硬约束条件:设置已有应用的标签、操作符和标签值。本例中,表示将待创建的应用调度到该主机上,该主机运行的已有应用具有 app:nginx 标签。 尽量满足,即软约束,不一定满足,对应 preferredDuringSchedulingIgnoredDuringExecution。Pod 的亲和性调度会尽量满足后续定义的约束条件。对于软约束规则,您可配置每条规则的权重,其他配置规则与硬约束规则相同。 说明 权重:设置一条软约束规则的权重,介于 1-100,通过算法计算满足软约束规则的节点的权重,将 Pod 调度到权重最大的节点上。 设置应用非亲和性调度,决定应用的 Pod 不与哪些 Pod 部署在同一拓扑域。应用非亲和性调度的场景包括: 将一个服务的 Pod 分散部署到不同的拓扑域(如不同主机)中,提高服务本身的稳定性。 给予 Pod 一个节点的独占访问权限来保证资源隔离,保证不会有其它 Pod 来分享节点资源。 把可能会相互影响的服务的 Pod 分散在不同的主机上。 说明 应用非亲和性调度的设置方式与亲和性调度相同,但是相同的调度规则代表的意思不同,请根据使用场景进行选择。 最后单击创建。 创建成功后,默认进入创建完成页面,会列出应用包含的对象,您可以单击查看应用详情进行查看。 查看详情 默认进入新建的 nginx-deployment 的详情页面。 查看详情2 说明 您也可以通过以下操作创建路由与服务。如上图所示,在访问方式页签。 单击服务右侧的创建,也可以进行服务创建,操作步骤同 6.i.a。 您单击路由右侧的创建,进行路由的创建,操作同 6.i.b。 单击左侧导航栏的路由与负载均衡 > 路由,可以看到路由列表下出现一条规则。 路由规则 在浏览器中访问路由测试域名,您可访问 nginx 欢迎页。 访问nginx
1934890530796658 2020-03-26 11:41:33 0 浏览量 回答数 0

回答

阿里云容器服务 Kubernetes 集群支持通过界面创建 StatefultSet 类型的应用,满足您快速创建有状态应用的需求。本例中将创建一个 nginx 的有状态应用,并演示 StatefulSet 应用的特性。 前提条件 您已成功创建一个 Kubernetes 集群。参见创建 Kubernetes 集群。 您已成功创建一个云盘存储卷声明,参见创建持久化存储卷声明。 您已连接到 Kubernetes 集群的 Master 节点,参见通过 kubectl 连接 Kubernetes 集群。 背景信息 StatefulSet 包括如下特性: 场景 说明 Pod 一致性 包含次序(启动、停止次序)、网络一致性。此一致性与 Pod 相关,与被调度到哪个 node 节点无关。 稳定的持久化存储 通过 VolumeClaimTemplate 为每个 Pod 创建一个 PV。删除、减少副本,不会删除相关的卷。 稳定的网络标志 Pod 的 hostname 模式为:(statefulset名称)−(序号)。 稳定的次序 对于N个副本的 StatefulSet,每个 Pod 都在 [0,N)的范围内分配一个数字序号,且是唯一的。 操作步骤 登录容器服务管理控制台。 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 有状态,然后单击页面右上角的使用镜像创建。 在应用基本信息页面进行设置,然后单击下一步 进入应用配置页面。 应用名称:设置应用的名称。 部署集群:设置应用部署的集群。 命名空间:设置应用部署所处的命名空间,默认使用 default 命名空间。 副本数量:即应用包含的 Pod 数量。 类型:可选择无状态(Deployment)和有状态(StatefulSet)两种类型。 说明 本例中选择有状态类型,创建 StatefulSet 类型的应用。 标签:为该应用添加一个标签,标识该应用。 注解:为该应用添加一个注解(annotation)。 应用配置页面 设置容器配置。 说明 您可为应用的 Pod 设置多个容器。 设置容器的基本配置。 镜像名称:您可以单击选择镜像,在弹出的对话框中选择所需的镜像并单击确定,本例中为 nginx。 您还可以填写私有 registry。填写的格式为domainname/namespace/imagename:tag 镜像版本:您可以单击选择镜像版本 选择镜像的版本。若不指定,默认为 latest。 总是拉取镜像:为了提高效率,容器服务会对镜像进行缓存。部署时,如果发现镜像 Tag 与本地缓存的一致,则会直接复用而不重新拉取。所以,如果您基于上层业务便利性等因素考虑,在做代码和镜像变更时没有同步修改 Tag ,就会导致部署时还是使用本地缓存内旧版本镜像。而勾选该选项后,会忽略缓存,每次部署时重新拉取镜像,确保使用的始终是最新的镜像和代码。 镜像密钥:单击设置镜像密钥设置镜像的密钥。对于私有仓库访问时,需要设置密钥,具体可以参见使用镜像密钥。 资源限制:可指定该应用所能使用的资源上限,包括 CPU 和内存两种资源,防止占用过多资源。其中,CPU 资源的单位为 millicores,即一个核的千分之一;内存的单位为 Bytes,可以为 Gi、Mi 或 Ki。 所需资源:即为该应用预留资源额度,包括 CPU 和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争夺资源,导致应用不可用。 Init Container:勾选该项,表示创建一个Init Container,Init Container 包含一些实用的工具,具体参见https://kubernetes.io/docs/concepts/workloads/pods/init-containers/。 设置容器基本信息 可选: 配置环境变量。 支持通过键值对的形式为 Pod 配置环境变量。用于给 Pod 添加环境标志或传递配置等,具体请参见 Pod variable。 可选: 配置健康检查。 支持存活检查(liveness)和就绪检查(Readiness)。存活检查用于检测何时重启容器;就绪检查确定容器是否已经就绪,且可以接受流量。关于健康检查的更多信息,请参见https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes。 请求类型 配置说明 HTTP请求 即向容器发送一个HTTPget 请求,支持的参数包括: 协议:HTTP/HTTPS。 路径:访问HTTP server 的路径。 端口:容器暴露的访问端口或端口名,端口号必须介于1~65535。 HTTP头:即HTTPHeaders,HTTP请求中自定义的请求头,HTTP允许重复的header。支持键值对的配置方式。 延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为3秒。 执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 TCP连接 即向容器发送一个 TCP Socket,kubelet 将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。支持的参数包括: 端口:容器暴露的访问端口或端口名,端口号必须介于 1~65535。 延迟探测时间(秒):即 initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为 15 秒。 执行探测频率(秒):即 periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即 timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 命令行 通过在容器中执行探针检测命令,来检测容器的健康情况。支持的参数包括: 命令行:用于检测容器健康情况的探测命令。 延迟探测时间(秒):即 initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为5秒。 执行探测频率(秒):即 periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即 timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 可选: 配置生命周期。 您可以为容器的生命周期配置启动执行、启动后处理和停止前处理。具体参见https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/。 启动执行:为容器设置预启动命令和参数。 启动后处理:为容器设置启动后的命令。 停止前处理:为容器设置预结束命令。 配置生命周期 配置数据卷信息。 支持配置本地存储和云存储。 本地存储:支持主机目录(hostpath)、配置项(configmap)、保密字典(secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息参见 volumes。 云存储:支持云存储。 本例中配置了一个云存储类型的数据卷声明 disk-ssd,将其挂载到容器的 /tmp 路径下。 配置数据卷 可选: 配置日志服务,您可进行采集配置和自定义 Tag 设置。 说明 请确保已部署 Kubernetes 集群,并且在此集群上已安装日志插件。 您可对日志进行采集配置: 日志库:即在日志服务中生成一个对应的 logstore,用于存储采集到的日志。 容器内日志路径:支持 stdout 和文本日志。 stdout: stdout 表示采集容器的标准输出日志。 文本日志:表示收集容器内指定路径的日志,本例中表示收集/var/log/nginx 下所有的文本日志,也支持通配符的方式。 您还可设置自定义 tag,设置 tag 后,会将该 tag 一起采集到容器的日志输出中。自定义 tag 可帮助您给容器日志打上 tag,方便进行日志统计和过滤等分析操作。 配置日志采集 完成容器配置后,单击 下一步。 进行高级设置。本例中仅进行访问设置。 设置访问设置。 您可以设置暴露后端 Pod 的方式,最后单击创建。本例中选择 ClusterIP 服务和路由(Ingress),构建一个公网可访问的 nginx 应用。 说明 针对应用的通信需求,您可灵活进行访问设置: 内部应用:对于只在集群内部工作的应用,您可根据需要创建 ClusterIP 或 NodePort 类型的服务,来进行内部通信。 外部应用:对于需要暴露到公网的应用,您可以采用两种方式进行访问设置: 创建 LoadBalancer 类型的服务:使用阿里云提供的负载均衡服务(Server Load Balancer,SLB),该服务提供公网访问能力。 创建路由(Ingress):通过路由(Ingress)提供公网访问能力,详情参见https://kubernetes.io/docs/concepts/services-networking/ingress/。 访问设置 在服务栏单击创建,在弹出的对话框中进行配置,最后单击创建。 创建服务 名称:您可自主设置,默认为 applicationname-svc。 类型:您可以从下面 3 种服务类型中进行选择。 虚拟集群 IP:即 ClusterIP,指通过集群的内部 IP 暴露服务,选择该项,服务只能够在集群内部访问。 节点端口:即 NodePort,通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 : ,可以从集群的外部访问一个 NodePort 服务。 负载均衡:即 LoadBalancer,是阿里云提供的负载均衡服务,可选择公网访问或内网访问。负载均衡可以路由到 NodePort 服务和 ClusterIP 服务。 端口映射:您需要添加服务端口和容器端口,若类型选择为节点端口,还需要自己设置节点端口,防止端口出现冲突。支持 TCP/UDP 协议。 注解:为该服务添加一个注解(annotation),支持负载均衡配置参数,参见通过负载均衡(Server Load Balancer)访问服务。 标签:您可为该服务添加一个标签,标识该服务。 在路由栏单击创建,在弹出的对话框中,为后端 Pod 配置路由规则,最后单击创建。更多详细的路由配置信息,请参见路由配置说明。 说明 通过镜像创建应用时,您仅能为一个服务创建路由(Ingress)。本例中使用一个虚拟主机名称作为测试域名,您需要在 hosts 中添加一条记录。在实际工作场景中,请使用备案域名。 101.37.224.146 foo.bar.com #即ingress的IP 创建路由 在访问设置栏中,您可看到创建完毕的服务和路由,您可单击变更和删除进行二次配置。 变更或删除路由 可选: 容器组水平伸缩。 您可勾选是否开启容器组水平伸缩,为了满足应用在不同负载下的需求,容器服务支持服容器组 Pod 的弹性伸缩,即根据容器 CPU 和内存资源占用情况自动调整容器组数量。 说明 若要启用自动伸缩,您必须为容器设置所需资源,否则容器自动伸缩无法生效。参见容器基本配置环节。 指标:支持 CPU 和内存,需要和设置的所需资源类型相同。 触发条件:资源使用率的百分比,超过该使用量,容器开始扩容。 最大副本数量:该 StatefulSet 可扩容的容器数量上限。 最小副本数量:该 StatefulSet 可缩容的容器数量下限。 可选: 设置调度设置。 您可设置升级方式、节点亲和性、应用亲和性和应用非亲和性,详情参见https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity。 说明 亲和性调度依赖节点标签和 Pod 标签,您可使用内置的标签进行调度;也可预先为节点、Pod 配置相关的标签。 设置升级方式。 升级方式包括滚动升级(rollingupdate)和替换升级(recreate),详细请参见https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/ 设置节点亲和性,通过 Node 节点的 Label 标签进行设置。 节点亲和性 节点调度支持硬约束和软约束(Required/Preferred),以及丰富的匹配表达式(In, NotIn, Exists, DoesNotExist. Gt, and Lt): 必须满足,即硬约束,一定要满足,对应 requiredDuringSchedulingIgnoredDuringExecution,效果与 NodeSelector 相同。本例中 Pod 只能调度到具有对应标签的 Node 节点。您可以定义多条硬约束规则,但只需满足其中一条。 尽量满足,即软约束,不一定满足,对应 preferredDuringSchedulingIgnoredDuringExecution。本例中,调度会尽量不调度 Pod 到具有对应标签的 Node 节点。您还可为软约束规则设定权重,具体调度时,若存在多个符合条件的节点,权重最大的节点会被优先调度。您可定义多条软约束规则,但必须满足全部约束,才会进行调度。 设置应用亲和性调度。决定应用的 Pod 可以和哪些 Pod 部署在同一拓扑域。例如,对于相互通信的服务,可通过应用亲和性调度,将其部署到同一拓扑域(如同一个主机)中,减少它们之间的网络延迟。 应用亲和性调度 根据节点上运行的 Pod 的标签(Label)来进行调度,支持硬约束和软约束,匹配的表达式有:In, NotIn, Exists, DoesNotExist。 必须满足,即硬约束,一定要满足,对应 requiredDuringSchedulingIgnoredDuringExecution,Pod 的亲和性调度必须要满足后续定义的约束条件。 命名空间:该策略是依据 Pod 的 Label 进行调度,所以会受到命名空间的约束。 拓扑域:即 topologyKey,指定调度时作用域,这是通过 Node 节点的标签来实现的,例如指定为 kubernetes.io/hostname,那就是以 Node 节点为区分范围;如果指定为 beta.kubernetes.io/os,则以 Node 节点的操作系统类型来区分。 选择器:单击选择器右侧的加号按钮,您可添加多条硬约束规则。 查看应用列表:单击应用列表,弹出对话框,您可在此查看各命名空间下的应用,并可将应用的标签导入到亲和性配置页面。 硬约束条件:设置已有应用的标签、操作符和标签值。本例中,表示将待创建的应用调度到该主机上,该主机运行的已有应用具有 app:nginx 标签。 尽量满足,即软约束,不一定满足,对应 preferredDuringSchedulingIgnoredDuringExecution。Pod 的亲和性调度会尽量满足后续定义的约束条件。对于软约束规则,您可配置每条规则的权重,其他配置规则与硬约束规则相同。 说明 权重:设置一条软约束规则的权重,介于 1-100,通过算法计算满足软约束规则的节点的权重,将 Pod 调度到权重最大的节点上。 设置应用非亲和性调度,决定应用的 Pod 不与哪些 Pod 部署在同一拓扑域。应用非亲和性调度的场景包括: 将一个服务的 Pod 分散部署到不同的拓扑域(如不同主机)中,提高服务本身的稳定性。 给予 Pod 一个节点的独占访问权限来保证资源隔离,保证不会有其它 Pod 来分享节点资源。 把可能会相互影响的服务的 Pod 分散在不同的主机上。 说明 应用非亲和性调度的设置方式与亲和性调度相同,但是相同的调度规则代表的意思不同,请根据使用场景进行选择。 最后单击创建。 创建成功后,默认进入创建完成页面,会列出应用包含的对象,您可以单击查看应用详情进行查看。 查看详情1 默认进入有状态副本集详情页面。 查看副本详情 然后单击左上角返回列表,进入有状态副本集列表页面,查看创建的 StatefulSet 应用。 查看应用 可选: 选择所需的 nginx 应用,单击右侧伸缩,验证服务伸缩性。 在弹出的对话框中,将容器组数量设置为 3,您可发现扩容时,扩容容器组的排序依次递增;反之,进行缩容时,先按 Pod 次序从高到低进行缩容。这体现 StatefulSet 中 Pod 的次序稳定性。 验证服务伸缩 单击左侧导航栏中的应用 > 存储声明,您可发现,随着应用扩容,会随着 Pod 创建新的云存储卷;缩容后,已创建的 PV/PVC 不会删除。 存储声明 后续步骤 连接到 Master 节点,执行以下命令,验证持久化存储特性。 在云盘中创建临时文件: kubectl exec nginx-1 ls /tmp #列出该目录下的文件 lost+found kubectl exec nginx-1 touch /tmp/statefulset #增加一个临时文件statefulset kubectl exec nginx-1 ls /tmp lost+found statefulset 删除 Pod,验证数据持久性: kubectl delete pod nginx-1 pod"nginx-1" deleted 过一段时间,待Pod自动重启后,验证数据持久性,证明 StatefulSet 应用的高可用性。 kubectl exec nginx-1 ls /tmp #数据持久化存储 lost+found statefulset 想要了解更多信息,参见Kubernetes有状态服务-StatefulSet使用最佳实践。
1934890530796658 2020-03-26 11:41:16 0 浏览量 回答数 0

回答

阿里云容器服务 Kubernetes 集群支持通过界面创建 StatefultSet 类型的应用,满足您快速创建有状态应用的需求。本例中将创建一个 nginx 的有状态应用,并演示 StatefulSet 应用的特性。 前提条件 您已成功创建一个 Kubernetes 集群。参见创建Kubernetes集群。 您已成功创建一个云盘存储卷声明,参见创建持久化存储卷声明。 您已连接到 Kubernetes 集群的 Master 节点,参见通过kubectl连接Kubernetes集群。 背景信息 StatefulSet 包括如下特性: 场景 说明 Pod 一致性 包含次序(启动、停止次序)、网络一致性。此一致性与 Pod 相关,与被调度到哪个 node 节点无关。 稳定的持久化存储 通过 VolumeClaimTemplate 为每个 Pod 创建一个 PV。删除、减少副本,不会删除相关的卷。 稳定的网络标志 Pod 的 hostname 模式为:(statefulset名称)−(序号)。 稳定的次序 对于N个副本的 StatefulSet,每个 Pod 都在 [0,N)的范围内分配一个数字序号,且是唯一的。 操作步骤 登录容器服务管理控制台。 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 有状态,然后单击页面右上角的使用镜像创建。 在应用基本信息页面进行设置,然后单击下一步 进入应用配置页面。 应用名称:设置应用的名称。 部署集群:设置应用部署的集群。 命名空间:设置应用部署所处的命名空间,默认使用 default 命名空间。 副本数量:即应用包含的 Pod 数量。 类型:可选择无状态(Deployment)和有状态(StatefulSet)两种类型。 说明 本例中选择有状态类型,创建 StatefulSet 类型的应用。 标签:为该应用添加一个标签,标识该应用。 注解:为该应用添加一个注解(annotation)。 应用配置页面 设置容器配置。 说明 您可为应用的 Pod 设置多个容器。 设置容器的基本配置。 镜像名称:您可以单击选择镜像,在弹出的对话框中选择所需的镜像并单击确定,本例中为 nginx。 您还可以填写私有 registry。填写的格式为domainname/namespace/imagename:tag 镜像版本:您可以单击选择镜像版本 选择镜像的版本。若不指定,默认为 latest。 总是拉取镜像:为了提高效率,容器服务会对镜像进行缓存。部署时,如果发现镜像 Tag 与本地缓存的一致,则会直接复用而不重新拉取。所以,如果您基于上层业务便利性等因素考虑,在做代码和镜像变更时没有同步修改 Tag ,就会导致部署时还是使用本地缓存内旧版本镜像。而勾选该选项后,会忽略缓存,每次部署时重新拉取镜像,确保使用的始终是最新的镜像和代码。 镜像密钥:单击设置镜像密钥设置镜像的密钥。对于私有仓库访问时,需要设置密钥,具体可以参见使用镜像密钥。 资源限制:可指定该应用所能使用的资源上限,包括 CPU 和内存两种资源,防止占用过多资源。其中,CPU 资源的单位为 millicores,即一个核的千分之一;内存的单位为 Bytes,可以为 Gi、Mi 或 Ki。 所需资源:即为该应用预留资源额度,包括 CPU 和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争夺资源,导致应用不可用。 Init Container:勾选该项,表示创建一个Init Container,Init Container 包含一些实用的工具,具体参见https://kubernetes.io/docs/concepts/workloads/pods/init-containers/。 设置容器基本信息 可选: 配置环境变量。 支持通过键值对的形式为 Pod 配置环境变量。用于给 Pod 添加环境标志或传递配置等,具体请参见 Pod variable。 可选: 配置健康检查。 支持存活检查(liveness)和就绪检查(Readiness)。存活检查用于检测何时重启容器;就绪检查确定容器是否已经就绪,且可以接受流量。关于健康检查的更多信息,请参见https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes。 请求类型 配置说明 HTTP请求 即向容器发送一个HTTPget 请求,支持的参数包括: 协议:HTTP/HTTPS。 路径:访问HTTP server 的路径。 端口:容器暴露的访问端口或端口名,端口号必须介于1~65535。 HTTP头:即HTTPHeaders,HTTP请求中自定义的请求头,HTTP允许重复的header。支持键值对的配置方式。 延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为3秒。 执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 TCP连接 即向容器发送一个 TCP Socket,kubelet 将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。支持的参数包括: 端口:容器暴露的访问端口或端口名,端口号必须介于 1~65535。 延迟探测时间(秒):即 initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为 15 秒。 执行探测频率(秒):即 periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即 timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 命令行 通过在容器中执行探针检测命令,来检测容器的健康情况。支持的参数包括: 命令行:用于检测容器健康情况的探测命令。 延迟探测时间(秒):即 initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为5秒。 执行探测频率(秒):即 periodSeconds,指执行探测的时间间隔,默认为 10 秒,最小为 1 秒。 超时时间(秒):即 timeoutSeconds,探测超时时间。默认 1 秒,最小 1 秒。 健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,最小值是 1。对于存活检查(liveness)必须是 1。 不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。 可选: 配置生命周期。 您可以为容器的生命周期配置启动执行、启动后处理和停止前处理。具体参见https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/。 启动执行:为容器设置预启动命令和参数。 启动后处理:为容器设置启动后的命令。 停止前处理:为容器设置预结束命令。 配置生命周期 配置数据卷信息。 支持配置本地存储和云存储。 本地存储:支持主机目录(hostpath)、配置项(configmap)、保密字典(secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息参见 volumes。 云存储:支持云存储。 本例中配置了一个云存储类型的数据卷声明 disk-ssd,将其挂载到容器的 /tmp 路径下。 配置数据卷 可选: 配置日志服务,您可进行采集配置和自定义 Tag 设置。 说明 请确保已部署 Kubernetes 集群,并且在此集群上已安装日志插件。 您可对日志进行采集配置: 日志库:即在日志服务中生成一个对应的 logstore,用于存储采集到的日志。 容器内日志路径:支持 stdout 和文本日志。 stdout: stdout 表示采集容器的标准输出日志。 文本日志:表示收集容器内指定路径的日志,本例中表示收集/var/log/nginx 下所有的文本日志,也支持通配符的方式。 您还可设置自定义 tag,设置 tag 后,会将该 tag 一起采集到容器的日志输出中。自定义 tag 可帮助您给容器日志打上 tag,方便进行日志统计和过滤等分析操作。 配置日志采集 完成容器配置后,单击 下一步。 进行高级设置。本例中仅进行访问设置。 设置访问设置。 您可以设置暴露后端 Pod 的方式,最后单击创建。本例中选择 ClusterIP 服务和路由(Ingress),构建一个公网可访问的 nginx 应用。 说明 针对应用的通信需求,您可灵活进行访问设置: 内部应用:对于只在集群内部工作的应用,您可根据需要创建 ClusterIP 或 NodePort 类型的服务,来进行内部通信。 外部应用:对于需要暴露到公网的应用,您可以采用两种方式进行访问设置: 创建 LoadBalancer 类型的服务:使用阿里云提供的负载均衡服务(Server Load Balancer,SLB),该服务提供公网访问能力。 创建路由(Ingress):通过路由(Ingress)提供公网访问能力,详情参见https://kubernetes.io/docs/concepts/services-networking/ingress/。 访问设置 在服务栏单击创建,在弹出的对话框中进行配置,最后单击创建。 创建服务 名称:您可自主设置,默认为 applicationname-svc。 类型:您可以从下面 3 种服务类型中进行选择。 虚拟集群 IP:即 ClusterIP,指通过集群的内部 IP 暴露服务,选择该项,服务只能够在集群内部访问。 节点端口:即 NodePort,通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 : ,可以从集群的外部访问一个 NodePort 服务。 负载均衡:即 LoadBalancer,是阿里云提供的负载均衡服务,可选择公网访问或内网访问。负载均衡可以路由到 NodePort 服务和 ClusterIP 服务。 端口映射:您需要添加服务端口和容器端口,若类型选择为节点端口,还需要自己设置节点端口,防止端口出现冲突。支持 TCP/UDP 协议。 注解:为该服务添加一个注解(annotation),支持负载均衡配置参数,参见通过负载均衡(Server Load Balancer)访问服务。 标签:您可为该服务添加一个标签,标识该服务。 在路由栏单击创建,在弹出的对话框中,为后端 Pod 配置路由规则,最后单击创建。更多详细的路由配置信息,请参见路由配置说明。 说明 通过镜像创建应用时,您仅能为一个服务创建路由(Ingress)。本例中使用一个虚拟主机名称作为测试域名,您需要在 hosts 中添加一条记录。在实际工作场景中,请使用备案域名。 101.37.224.146 foo.bar.com #即ingress的IP 创建路由 在访问设置栏中,您可看到创建完毕的服务和路由,您可单击变更和删除进行二次配置。 变更或删除路由 可选: 容器组水平伸缩。 您可勾选是否开启容器组水平伸缩,为了满足应用在不同负载下的需求,容器服务支持服容器组 Pod 的弹性伸缩,即根据容器 CPU 和内存资源占用情况自动调整容器组数量。 说明 若要启用自动伸缩,您必须为容器设置所需资源,否则容器自动伸缩无法生效。参见容器基本配置环节。 指标:支持 CPU 和内存,需要和设置的所需资源类型相同。 触发条件:资源使用率的百分比,超过该使用量,容器开始扩容。 最大副本数量:该 StatefulSet 可扩容的容器数量上限。 最小副本数量:该 StatefulSet 可缩容的容器数量下限。 可选: 设置调度设置。 您可设置升级方式、节点亲和性、应用亲和性和应用非亲和性,详情参见https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity。 说明 亲和性调度依赖节点标签和 Pod 标签,您可使用内置的标签进行调度;也可预先为节点、Pod 配置相关的标签。 设置升级方式。 升级方式包括滚动升级(rollingupdate)和替换升级(recreate),详细请参见https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/ 设置节点亲和性,通过 Node 节点的 Label 标签进行设置。 节点亲和性 节点调度支持硬约束和软约束(Required/Preferred),以及丰富的匹配表达式(In, NotIn, Exists, DoesNotExist. Gt, and Lt): 必须满足,即硬约束,一定要满足,对应 requiredDuringSchedulingIgnoredDuringExecution,效果与 NodeSelector 相同。本例中 Pod 只能调度到具有对应标签的 Node 节点。您可以定义多条硬约束规则,但只需满足其中一条。 尽量满足,即软约束,不一定满足,对应 preferredDuringSchedulingIgnoredDuringExecution。本例中,调度会尽量不调度 Pod 到具有对应标签的 Node 节点。您还可为软约束规则设定权重,具体调度时,若存在多个符合条件的节点,权重最大的节点会被优先调度。您可定义多条软约束规则,但必须满足全部约束,才会进行调度。 设置应用亲和性调度。决定应用的 Pod 可以和哪些 Pod 部署在同一拓扑域。例如,对于相互通信的服务,可通过应用亲和性调度,将其部署到同一拓扑域(如同一个主机)中,减少它们之间的网络延迟。 应用亲和性调度 根据节点上运行的 Pod 的标签(Label)来进行调度,支持硬约束和软约束,匹配的表达式有:In, NotIn, Exists, DoesNotExist。 必须满足,即硬约束,一定要满足,对应 requiredDuringSchedulingIgnoredDuringExecution,Pod 的亲和性调度必须要满足后续定义的约束条件。 命名空间:该策略是依据 Pod 的 Label 进行调度,所以会受到命名空间的约束。 拓扑域:即 topologyKey,指定调度时作用域,这是通过 Node 节点的标签来实现的,例如指定为 kubernetes.io/hostname,那就是以 Node 节点为区分范围;如果指定为 beta.kubernetes.io/os,则以 Node 节点的操作系统类型来区分。 选择器:单击选择器右侧的加号按钮,您可添加多条硬约束规则。 查看应用列表:单击应用列表,弹出对话框,您可在此查看各命名空间下的应用,并可将应用的标签导入到亲和性配置页面。 硬约束条件:设置已有应用的标签、操作符和标签值。本例中,表示将待创建的应用调度到该主机上,该主机运行的已有应用具有 app:nginx 标签。 尽量满足,即软约束,不一定满足,对应 preferredDuringSchedulingIgnoredDuringExecution。Pod 的亲和性调度会尽量满足后续定义的约束条件。对于软约束规则,您可配置每条规则的权重,其他配置规则与硬约束规则相同。 说明 权重:设置一条软约束规则的权重,介于 1-100,通过算法计算满足软约束规则的节点的权重,将 Pod 调度到权重最大的节点上。 设置应用非亲和性调度,决定应用的 Pod 不与哪些 Pod 部署在同一拓扑域。应用非亲和性调度的场景包括: 将一个服务的 Pod 分散部署到不同的拓扑域(如不同主机)中,提高服务本身的稳定性。 给予 Pod 一个节点的独占访问权限来保证资源隔离,保证不会有其它 Pod 来分享节点资源。 把可能会相互影响的服务的 Pod 分散在不同的主机上。 说明 应用非亲和性调度的设置方式与亲和性调度相同,但是相同的调度规则代表的意思不同,请根据使用场景进行选择。 最后单击创建。 创建成功后,默认进入创建完成页面,会列出应用包含的对象,您可以单击查看应用详情进行查看。 查看详情1 默认进入有状态副本集详情页面。 查看副本详情 然后单击左上角返回列表,进入有状态副本集列表页面,查看创建的 StatefulSet 应用。 查看应用 可选: 选择所需的 nginx 应用,单击右侧伸缩,验证服务伸缩性。 在弹出的对话框中,将容器组数量设置为 3,您可发现扩容时,扩容容器组的排序依次递增;反之,进行缩容时,先按 Pod 次序从高到低进行缩容。这体现 StatefulSet 中 Pod 的次序稳定性。 验证服务伸缩 单击左侧导航栏中的应用 > 存储声明,您可发现,随着应用扩容,会随着 Pod 创建新的云存储卷;缩容后,已创建的 PV/PVC 不会删除。 存储声明 后续步骤 连接到 Master 节点,执行以下命令,验证持久化存储特性。 在云盘中创建临时文件: kubectl exec nginx-1 ls /tmp #列出该目录下的文件 lost+found kubectl exec nginx-1 touch /tmp/statefulset #增加一个临时文件statefulset kubectl exec nginx-1 ls /tmp lost+found statefulset 删除 Pod,验证数据持久性: kubectl delete pod nginx-1 pod"nginx-1" deleted 过一段时间,待Pod自动重启后,验证数据持久性,证明 StatefulSet 应用的高可用性。 kubectl exec nginx-1 ls /tmp #数据持久化存储 lost+found statefulset 想要了解更多信息,参见Kubernetes有状态服务-StatefulSet使用最佳实践。
1934890530796658 2020-03-31 15:46:45 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT