首页 文章 精选 留言 我的

精选列表

搜索[思考模型],共10004篇文章
优秀的个人博客,低调大师

[Android Pro] InputStream.skip方法的思考

参考 :http://blog.csdn.net/gsyzhu/article/details/8102286 在java.io.InputStream类中定义了skip这个方法。在API中的描述如下: skip public long skip(longn) throws IOException Skips over and discards nbytes of data from this input stream. The skipmethod may, for a variety of reasons, end up skipping over some smaller number of bytes, possibly 0. This may result from any of a number of conditions; reaching end of file before nbytes have been skipped is only one possibility. The actual number of bytes skipped is returned. If nis negative, no bytes are skipped. Theskipmethod of this class creates a byte array and then repeatedly reads into it untilnbytes have been read or the end of the stream has been reached. Subclasses are encouraged to provide a more efficient implementation of this method. For instance, the implementation may depend on the ability to seek. Parameters: n- the number of bytes to be skipped. Returns: the actual number of bytes skipped. Throws: IOException- if the stream does not support seek, or if some other I/O error occurs. 翻译如下: skip(long n) throwsIOException 跳过和丢弃此输入流中数据的n个字节。出于各种原因,skip方法结束时跳过的字节数可能小于该数,也可能为0。导致这种情况的原因很多,跳过n个字节之前已到达文件末尾只是其中一种可能。返回跳过的实际字节数。如果n为负,则不跳过任何字节。 此类的skip方法创建一个 byte 数组,然后重复将字节读入其中,直到读够n个字节或已到达流末尾为止。建议子类提供此方法更为有效的实现。例如,可依赖搜索能力的实现。 n 要跳过的字节数。 return 跳过的实际字节数。 Throws IOException: 如果流不支持搜索,或者发生其他 I/O 错误。 同时,其子类FileInputStream中也继承了skip这个方法。如API中所描述的,skip方法会存在跳过的字节数小于预期的情况。如果不对返回值进行处理的话,很容易忽视这个问题,导致结果错误。最近在看baksmali的源码,其中有一个简单而巧妙的方法来避过skip方法的这个弊端。 在分片上传文件的时候,进行skip,该处理手段非常重要。 FileInputStream in = new FileInputStream(file); int at = offset; while(at > 0) { long realSkip = in.skip(at); if (realSkip == -1) { throw new RuntimeException(file + ": unexpected EOF"); } at -= realSkip; } 分类: Android Pro, Java基础 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/4973042.html如需转载请自行联系原作者 demoblog

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

智慧城市建设要点问题的思考

本文首先对智慧城市的概念和内涵进行了分析,然后阐述了智慧城市建设的重要意义,最后对推进智慧城市建设的策略进行了深入研究。 智慧城市是信息化发展到一定阶段的必然产物,本文在此提出了自己的建议和观点。 一、智慧城市的概念和内涵 随着智慧城市建设的不断深入,国内外学者、IT企业等开始对智慧城市进行研究,并就智慧城市的内涵提出了自己的观点。智慧城市充分利用信息化相关技术,通过监测、分析、整合以及智能响应的方式,综合各职能部门,整合优化现有资源,提供更好的服务、绿色环境、和谐社会,保证城市可持续发展,为企业及大众建立一个良好的工作、生活和休闲的环境,它包括城市智能交通系统、城市指挥中心、能源管理系统、公共安全、环境保护等;智慧城市充分运用信息和通信技术手段感测、分析、整合城市运行核心系统的各项关键信息,从而对包括民生、环保、公共安全、城市服务、工商业活动在内的各种需求做出智能响应,能为人类创造更好的城市生活; 智慧城市就是一个网络城市,物联网是智慧城市的重要标志。 二、智慧城市建设的重要意义 1、 有利于保持经济持续快速发展,转变增长方式 由于资源紧张,人口膨胀、环境恶化等问题日益严重,我国大多数城市发展遇到了瓶颈,面临的土地、空间、能源、清洁水等压力越来越大,这些都成为制约城市发展的因素。目前发达国家正在研究如何创新性地使用新一代信息技术、知识和智能技术手段来重新审视城市的本质、城市发展目标的定位、城市功能的培育、城市结构的调整、城市形象与特色等一系列现代城市发展中的关键问题,特别是通过智慧传感和城市智能决策平台解决节能、环保、水资源短缺等问题。 2、 有利于促进产业升级和结构调整,保持可持续发展 在未来世界,一个城市能否获得可持续发展,关键要看其是否拥有一批具有核心竞争力的企业。目前的资源密集型和劳动密集型产业在未来的发展中是不具备竞争力的。智慧城市建成以后,国内各企业与高校之间将实现产、学、研一条龙资源链,从而达到资源互补,实现强强联合,并建立起协同创新机制和平台,提高创新能力。还可以通过技术引入手段,以行业为单位建立创新协同机制,并整合不同行业之间的协同机制,进一步提升城市内部和城市之间的创新能力,以达到推动产业升级和结构调整的目的。 3、 有利于改变人们后工业时代的生活方式 随着近几十年工业化步伐的加快,我国的城市迅速发展,在工业化发展的同时,人们不仅收获了物质财富,同时也彻底改变了以往的生活模式。伴随着历史巨变,生活逐渐社会化和国际化,一些旧有的意识形态和价值观被人们怀疑和背叛,也出现了众多的安全问题。城市规模不断扩大,人员构成复杂,流动人口增多,物流系统遍布各个角落,不安全因素空前增加,传统的由质检部门和居委会进行管理的传统方式已经捉襟见肘。为应对这一现状,城市管理系统必须进行革新,即利用新一代信息技术建立起智能监控和管理系统,实现智慧化管理,维护现代城市的宜居、安全和舒适。智慧社区就是其中一个重点建设目标,它是指充分利用物联网、云计算、移动互联网等新一代信息技术的集成应用,为社区居民提供一个安全、舒适、便利的现代化、智慧化生活环境,从而形成基于信息化、智能化社会管理与服务的一种新的管理形态的社区。城市宜居性的提高也是吸引人才的一个重要元素。 4、 有利于迅速和妥善解决突发性事件和应急事件 经济和技术的发展促进了全球的一体化,但全球一体化也带来了许多弊端,如恶性传染病爆发、恶性犯罪事件的增加、国际恐怖主义的威胁等问题。通过其智能化的调控能力和行为意识加快(由城市智能决策平台或由市长)判断和决策的准确性、有效性和及时性,从而实现不同区域和行业的协同和应对能力。同时智慧城市也具备“学习能力”,从而不断提高处理突发性事件和应急事件的水平,使应急预案程序化、智能化。 三、推进智慧城市建设的策略 1、 强化智慧城市顶层设计 第一,全面规划。智慧城市顶层设计规划的范围不仅应包括信息通信基础设施、城市信息产业发展战略、城市信息应用系统,还应包括城市建设与运行机制、相关法律法规与网络安全机制。 第二,设计顶层架构。“信息孤岛”造成资源难以高效整合,如何有效利用采集来的信息,如何实现相关信息应用系统效能的整合,以及各信息系统如何实现互联互通,都需要一个完整的体系结构与顶层设计加以协调。 第三,制定实施规划。智慧城市顶层设计不能是纯理论的,而应同时制定切实可行的实施规划。智慧城市建设需分阶段进行,并应针对不同的情况及时做出调整,不能因智慧城市建设而影响到当地社会经济的发展以及居民的正常生活。 2、 构建高效综合的协调机制 智慧城市建设涉及领域广泛,包括城市管理、城市运行、城市交通、社会公共服务、电子政府等,因此,需要构建一个高效综合的协调机制对各个领域进行协调。但是,目前我国尚未建立一个高效综合的协调机制对智慧城市建设加以引导规划。实际上,由任何一个单一部门来主导智慧城市建设都难免出现问题。因此,当前我们应以国家信息化领导小组颁布的关于智慧城市建设的指导意见为根本,成立智慧城市建设管理办公室,并定期或不定期地就智慧城市建设中出现的相关问题举行跨部门的协调会议,共同商讨解决对策。 3、 有效整合资源 首先,制定统一的行业标准与规范。目前,我国物联网技术缺乏国家标准,在高频领域主要使用国际标准,而关键的超高频领域的标准仍由国外控制。行业标准与规范的缺失,导致我国智慧城市建设存在着诸多问题,如信息孤岛现象严重、信息共享与协同难度大、各地区信息化水平差异大等。因此,在智慧城市建设中我们必须加强技术标准化、行业应用标准化、服务标准化建设,从而实现各部门之间信息的互联互通,尽可能减少“信息孤岛”。我们应充分利用各级管理部门的力量,制定智慧城市建设的标准体系。另外,在制定行业标准与规范过程中,应注意制标队伍的整体素质。 其次,做好智慧城市顶层设计的前期规划。我们应在借鉴西方发达国家智慧城市建设成功经验的基础上,结合我国的具体国情,做好智慧城市顶层设计的规划工作。通过科学规划,明确城市系统内各部门的业务范围以及相应的责任,加强部门之间的分工合作,避免管理分治。另外,应充分整合各部门的信息资源,实现资源优化配置,避免低水平重复建设现象的发生。 再次,进一步完善城市管理运行体系,构建一套全方位的合作机制。当前我国智慧城市建设中城市管理运行体系尚不健全,各部门之间缺乏有效的协同合作,因此,我们必须构建一套全方位的合作机制。从横向上看,同级部门应密切融合; 从纵向上看,上下级政府部门应当保持良好的沟通合作关系,省市之间在智慧城市建设中应加强沟通合作,同时还要加强政企之间的沟通合作 总之,建设智慧城市并不轻松,从宏观上需要统一规划,完整的科学标准以及运行体系,从微观上需要丰富的人才储备和强大的技术研发能力,还要有持续不断的资金投入。 本文转自d1net(转载)

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

一个索引创建错误引发的思考

MySQL 创建索引的操作提示失败,这是什么原因导致的?字段类型和索引创建之间有什么关系? 作者:刘晨,网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,公众号”bisal的个人杂货铺”。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本文约 800 字,预计阅读需要 3 分钟。 背景 同事反馈说某个 MySQL 数据库创建索引提示错误,模拟报错如下: CREATE INDEX t_reg_code_idx USING BTREE ON t(reg_code) BLOB/TEXT column 'reg_code' used in key specification without a key length 从该提示可知,给 T 表的 reg_code 列创建一个 BTREE 索引,而这个 reg_code 列的字段类型是 BLOB 或 TEXT。 需要在键的说明中有长度定义,这是什么意思? 表索引前缀长度限制 MySQL 8.0 从 MySQL 8.0 的官方手册可以找到这段对 Index Prefixes 的说明。意思是如果对 BLOB 或者 TEXT 列创建索引,必须指定索引的前缀长度。对于使用 REDUNDANT 或者 COMPACT 行格式的 InnoDB 表,索引前缀最多 767 个字节,对于使用 DYNAMIC 或者 COMPRESSED 行格式的 InnoDB 表,索引前缀的上限最多是 3072 个字节,如果是 MyISAM 表,前缀长度最多可以达到 1000 个字节。 MySQL 5.7 而 MySQL 5.7 官方手册中,对索引前缀的限制有所不同,InnoDB 表的索引前缀最多可以达到 1000 个字节(此处我认为是错误的,应该是 3072),但前提是设置了 innodb_large_prefix(只对 DYNAMIC 或者 COMPRESSED 行格式生效,对 REDUNDANT 或者 COMPACT 行格式无效),否则只能达到 767 个字节。 因此可知,MySQL 8.0 在 InnoDB 表的索引前缀长度限制的设置上有所调整,但是限制还是有,这是和 Oracle 等数据库有所不同的一个特性。 验证 通过实验,验证 MySQL 8.0 对于前缀长度的限制。 创建一张 row format 是 COMPACT 的 InnoDB 表,指定前缀长度 10000,提示最大键的长度只能是 767 个字节。 create table test01 ( id int(30) not null auto_increment, t_a text, primary key(id), index idx_t_a(t_a(10000)) ) COLLATE='gbk_chinese_ci' ENGINE=InnoDB ROW_FORMAT=COMPACT; SQL 错误 [1071] [42000]: Specified key was too long; max key length is 767 bytes 创建一张 row format 是 COMPRESSED 的 InnoDB 表,指定前缀长度 10000,提示最大键的长度只能是 3072 个字节。 create table test01 ( id int(30) not null auto_increment, t_a text, primary key(id), index idx_t_a(t_a(10000)) ) COLLATE='gbk_chinese_ci' ENGINE=InnoDB ROW_FORMAT=COMPRESSED; SQL 错误 [1071] [42000]: Specified key was too long; max key length is 3072 bytes 总结 抛开技术问题,和同事追问了下这个操作的背景。原始需求是某个厂商的 ETL 任务需要从源库将数据导入目标库,源库字段是 VARCHAR 类型,目标库定义为 TEXT,才间接引起的这个问题。推测一种可能的原因,因为 VARCHAR、TEXT 都可以存储字符串类型的数据,所以没做区分,另一种可能,为了图省事儿,不用关注源库和目标库字符串类型定义的长度,直接设置了 TEXT 类型,保证肯定能存下。 无论是何种原因,TEXT 这种大字段类型,一般不推荐作为索引检索字段,因为往往它存储了很多字符,索引存储空间会占用更多,索引的区分度也会有影响。 因此,虽然这个问题表象是个技术问题,但实际上来源于不合理的设计,我们在进行应用设计、数据库设计时,如果能多考虑一些合理性,避免一些所谓的省事儿,可能在实际使用过程中,就会更顺畅,相辅相成的。 更多技术文章,请访问:https://opensource.actionsky.com/ 关于 SQLE 爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 SQLE 获取 类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.github.io/sqle-docs/ 发布信息 https://github.com/actiontech/sqle/releases 数据审核插件开发文档 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

一次网络不通“争吵”引发的思考

为啥争吵,吵什么? "你到底在说什么啊,我K8s的ecs节点要访问clb的地址不通和本地网卡有什么关系..." 气愤语气都从电话那头传了过来,这时电话两端都沉默了。过了好一会传来地铁小姐姐甜美的播报声打断了刚刚的沉寂「乘坐地铁必须全程佩戴口罩,下一站西湖文化广场...」。 pod需要访问clb的443的监听, 但是如果是集群内(集群内后面都指的K8s的节点或者POD)访问就会出现如下报错Connection refused: 所以就捋了一下客户链路如下: 具体现象是什么 无论是节点node还是pod里访问192.168.1.200:443都是不通的,但是访问192.168.1.200:80却是正常的。同时集群外的ECS192.168.3.100访问192.168.1.200:443和192.168.1.200:80都是正常的。 进一步分析看看 CLB1的IP192.168.1.200被绑定到了K8s的node节点的kube-ipvs0网卡上,这个是一张dummy 网卡,参考dummy interface。由于 SVC1 是LoadBalancer类型的,同时复用了这个CLB1,关联endpoint是POD1192.168.1.101:80,那么就可以解释为何访问192.168.1.200:80是正常,是由于kube-proxy根据SVC1的配置创建ipvs规则同时挂载了可被访问的后端服务。而集群里访问192.168.1.200:443都是不通的,因为IP被绑定到dummy网卡后,就不会再出节点去访问到CLB1,同时没有443对应ipvs规则,所以直接是拒绝的。 这个时候如果节点里没有ipvs规则(ipvs优先于监听)但是又能访问通的话, 可以检查一下是否本地有监听0.0.0.0:443的服务,那么这个时候所有网卡IP+443都能通,但是访问的是本地服务,而不是真正的CLB后端的服务。 是否有办法解决呢 最建议的方式 最好的方式拆分, 集群内和集群外的服务分开两个CLB使用。 阿里云svc注解的方式 SVC1使用这个注解http://service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname,进行占位,这样就不会绑定CLB的IP到kube-ipvs0的网卡上,集群内访问CLB的IP就会出集群访问CLB,但是需要注意如果监听协议为TCP或UDP,集群内访问CLB IP时将会存在回环访问问题。详细信息,请参见客户端无法访问负载均衡CLB[1]。 需要CCM版本在 v2.3.0及以上版本才支持这个注解, 具体参考:通过Annotation配置传统型负载均衡CLB [2] demo: apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname: "${your_service_hostname}" name: nginx-svc namespace: default spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer 集群内访问 ExternalTrafficPolicy 策略有影响吗? 我们都知道K8s的nodeport和loadbalancer模式是可以调整外部流量策略的,那么图中的「外部策略为Local/Cluster,所有集群节点创建IPVS规则是有区别的」该如何解释呢, 以及集群内访问nodePort/CLBIP的时候会发生什么。 以下都是针对svc的internalTrafficPolicy都是Cluster或者缺省的情况,这个ServiceInternalTrafficPolicy特性在1.22的K8s中默认开启,具体参考service-traffic-policy [3] 此处我们只讨论ipvs TrafficPolicy Local在Kubernetes 从1.22升级到1.24的行为变化。 Kubernetes 1.24 IPVS的变化 以下均以kube-proxy的IPVS模式为例: 当externalTrafficPolicy为Cluster模式或缺省的时候,ipvs规则里的nodePort/CLBIP后端会挂载所有的Endpoint的IP,这时候集群内访问会丢失源IP,因为节点会做一层SNAT。 当externalTrafficPolicy是Local的时候 当节点上有对应service的Endpoint的时候,ipvs规则里的nodePort/CLBIP后端只挂载自己节点的Endpoint的IP,集群内访问会保留源IP。 当节点上没有对应service的Endpoint的时候 在1.24之前的版本是会挂空的后端的,集群内访问会拒绝。 在1.24之后的K8s集群里,当节点上没有对应service的Endpoint的时候,ipvs规则里的nodePort/CLB IP后端会挂载所有的Endpoint的IP,这时候集群内访问会丢失源IP,因为节点会做一层SNAT。社区调整了Local策略后端服务的规则挂载策略,具体参考社区PR[4]。 https://github.com/kubernetes/kubernetes/pull/97081/commits/61085a75899a820b5eebfa71801e17423c1ca4da 集群外访问SLB 集群外访问SLB的话,CCM只会挂载Local类型的节点,情况跟1.24 kubernetes前一样,这里不做过多阐述,请见上面连接。 集群外访问NodePort 1.24 Kubernetes之前版本 访问有Endpoint的节点的NodePort,可以通,可以保留源IP Nginx分布在cn-hongkong.10.0.4.174和cn-hongkong.10.0.2.84节点。 从外部10.0.3.72节点访问有后端pod所在节点的cn-hongkong.10.0.2.84的30479端口,可以访问。 cn-hongkong.10.0.0.140节点上是有相关的IPVS的规则的,但是只有该节点上后端Pod IP。 通过conntrack表可以到,这是由于在cn-hongkong.10.0.0.140节点上,相关的链路被dnat,最后是由pod cn-hongkong.10.0.2.84节点上的 的nginx-7d6877d777-tzbf7 10.0.2.87返回源,所有的相关转化都在该节点上,所以TCP四层建连可以成功。 访问没有Endpoint的节点的NodePort,不能通,因为节点上没有相关的ipvs转发规则 从外部10.0.3.72节点访问无后端pod所在节点的cn-hongkong.10.0.0.140的30479端口,不可以访问。 查看该cn-hongkong.10.0.0.140节点,并没有相关的ipvs转发规则,所以无法进行dnat,访问会失败。 1.24 Kubernetes版本之后(含) 访问有Endpoint节点的NodePort,可以通,可以保留源IP 访问没有Endpoint节点的NodePort: terway ENIIP or host网络:不通 Nginx分布在cn-hongkong.10.0.2.77和cn-hongkong.10.0.0.171 节点。 从外部10.0.3.72节点访问无后端pod所在节点的cn-hongkong.10.0.5.168的30745端口,可以看到,访问失败。 cn-hongkong.10.0.5.168节点上是有相关的IPVS的规则的,并且会把所有的后端Pod IP加到IPVS规则中。 通过conntrack表可以到,这是由于在cn-hongkong.10.0.5.168节点上,相关的链路被dnat,最后是由pod cn-hongkong.10.0.2.77节点上的nginx-79fc6bc6d-8vctc 10.0.2.78返回源,源在接受这个链路后,会发现和自己的五元组不匹配,直接丢弃,三次握手必然失败,所以建连失败。 flannel网络:可以通,但是保留不了源IP Nginx分布在cn-hongkong.10.0.2.86。 从外部访问cn-hongkong.10.0.4.176的31218端口,可以访问成功。 cn-hongkong.10.0.4.176记录了src是10.0.3.72,并做了dnat为172.16.160.135,期望它返回给10.0.4.176的58825端口。 后端ep所在节点cn-hongkong.10.0.2.86,conntrack表记录了src是10.0.4.176,sport是58825。所以可以看到应用pod是记录的源IP是10.0.4.176,丢失了源IP。 集群内访问SLB或者NodePort 1.24 Kubernetes之前版本 有Endpoint的节点上访问,可以通,可以保留源IP Nginx分布在ap-southeast-1.192.168.100.209和ap-southeast-1.192.168.100.208节点,ap-southeast-1.192.168.100.210节点没有Nginx pod。 从集群任意节点(本例就在209节点)访问有后端pod所在节点的ap-southeast-1.192.168.100.209的NodePort 31565端口,可以访问。 从有后端pod所在节点ap-southeast-1.192.168.100.209访问SLB 8.222.252.252 的80端口,可以访问。 ap-southeast-1.192.168.100.209节点上是有NodePort 和SLB 的IPVS的规则的,但是只有该节点上后端Pod IP。 通过conntrack表可以到,这是由于在ap-southeast-1.192.168.100.209 节点上,相关的链路被dnat,最后是由pod 在ap-southeast-1.192.168.100.209 节点上的 的nginx-7d6877d777-2wh4s 192.168.100.222返回源,所有的相关转化都在该节点上,所以TCP四层建连可以成功。 没有Endpoint的节点上访问,不能通,因为节点上没有相关的ipvs转发规则 从集群任意节点(本例就在210节点)访问没有后端pod所在节点的ap-southeast-1.192.168.100.210 的NodePort 31565端口或者SLB,不可以访问。 也进一步证实,集群内访问关联svc的SLB不出节点,即使SLB有其他监听端口,访问SLB其他端口也会拒绝。 查看该ap-southeast-1.192.168.100.210 节点,并没有相关的ipvs转发规则,所以无法进行dnat,访问会失败。 1.24 Kubernetes版本之后(含) 有Endpoint节点上访问,可以通,可以保留源IP 与上文的1.24 Kubernetes之前版本集群内访问一致,可以参考上文描述。 没有Endpoint节点上访问: Nginx分布在cn-hongkong.10.0.2.77和cn-hongkong.10.0.0.171节点,所以在没有Nginx的cn-hongkong.10.0.4.141节点上测试。 分别有以下几种情况: terway或后端为hostNetwork 节点访问的通 NodePort(源 IP 是 ECS IP,不需要做 SNAT),无法保留源IP 可以看到没有Endpoint的节点的NodePort 110.0.4.141:30745 的IPVS 的规则添加的Nginx的所有后端POD nginx-79fc6bc6d-8vctc 10.0.2.78 和 nginx-79fc6bc6d-j587w 10.0.0.172。 集群内节点自身访问没有后端pod所在节点的cn-hongkong.10.0.4.141 的NodePort 30745/TCP端口,可以访问。 通过conntrack表可以到,在cn-hongkong.10.0.4.141节点上,相关的链路被dnat,最后是由后盾Nginx pod nginx-79fc6bc6d-8vctc 10.0.2.78返回源。 而在nginx-79fc6bc6d-8vctc 10.0.2.78 所在的节点cn-hongkong.10.0.2.77上的conntrack表记录的是10.04.141访问10.0.2.78,并期望10.0.2.78直接返回10.0.4.141的的39530端口。 集群内有endpoint 节点访问没有后端pod所在节点的ap-southeast-1.192.168.100.131 的NodePort 32292端口,不可以访问,与上文1.24 Kubernetes版本之后(含) 集群外访问一致,可以参考上文描述。 节点访问不通 SLB IP(源 IP 是 SLB IP,没有人做 SNAT) 可以看到没有Endpoint的节点的SLB IP 的IPVS 的规则添加的Nginx的所有后端POD nginx-79fc6bc6d-8vctc 10.0.2.78 和 nginx-79fc6bc6d-j587w 10.0.0.172。 没有Endpoint的节点上访问 SLB 47.243.247.219,访问确是超时。 通过conntrack表可以到,在没有ep的节点访问SLB的IP,可以看到期望的是后端pod返回给SLB IP。而SLB IP 在节点上已经被kube-ipvs虚拟占位了,所以没有做snat,造成无法访问。 flannel并且后端为普通pod,可以访问通,但是保留不了源IP Nginx分布在cn-hongkong.10.0.2.86。 在cn-hongkong.10.0.4.176访问SLB 47.242.86.39 是可以访问成功的。 cn-hongkong.10.0.4.176节点的conntrack表可以看到是src和dst都是47.242.86.39,但是期望的是 nginx pod172.16.160.135 返回给 10.0.4.176 的54988端口,47.242.86.39 snat成10.0.4.176。 后端ep所在节点cn-hongkong.10.0.2.86,conntrack表记录了src是10.0.4.176,sport是54988。所以可以看到应用pod是记录的源IP是10.0.4.176,丢失了源IP。 相关链接: [1] 客户端无法访问负载均衡CLB https://help.aliyun.com/document_detail/55206.htm [2] 通过Annotation配置传统型负载均衡CLB https://www.yuque.com/r/goto?url=https%3A%2F%2Fhelp.aliyun.com%2Fzh%2Fack%2Fack-managed-and-ack-dedicated%2Fuser-guide%2Fadd-annotations-to-the-yaml-file-of-a-service-to-configure-clb-instances [3] service-traffic-policy https://kubernetes.io/zh-cn/docs/concepts/services-networking/service-traffic-policy/ [4] 社区PR https://github.com/kubernetes/kubernetes/pull/97081/commits/61085a75899a820b5eebfa71801e17423c1ca4da 作者: 郑明泉、余凯 点击立即免费试用云产品 开启云上实践之旅! 原文链接 本文为阿里云原创内容,未经允许不得转载

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

关于自动限流的思考 | 京东云技术团队

目标 保证系统不因流量过载而挂。 现状:人工限流 正常的微服务限流工具都需要人工配置:支持应用负责人事先配置限流规则(接口+调用方+限流阈值),流量在阈值以下可以正常响应,超过阈值的流量会快速失败。这种方案存在如下问题: 问题1. 接口多,无法全面覆盖 要想保证系统不因流量过载而挂,那就需要对所有中高频接口进行流量管控,不然任意接口的流量上升都可能成为“压倒骆驼的最后一根稻草”。假设存在a个应用,按每个应用平均b个中高频接口, 每个接口对应c个调用方,限流规则配置那数量为(axbxc),稍微有点规模的部门这个数量就能上万, 要想全面覆盖靠人工基本不可行。 问题2.限流阈值无法准确评估 当前限流阈值评估主要有2类: 历史流量峰值:比如近7天系统正常提供服务的流量峰值。但是这个值偏低,容易产生误杀。 压测:通过压测演练得出接口的容量上限。但是压测的方式很难模拟真实的线上环境,无论是数据质量,流量的参数质量,依赖方的性能,亦或同应用内不同接口的流量分布都很难与真实环境保持一致。 问题3. 限流阈值无法长期有效 限流阈值会随着环境的变化而变化。例如流程中新增了一个依赖、或者数据库的数据量增多、热点数据增多、其他接口流量上升占用了更多系统资源、底层的基础设施发生变化等都会导致真实容量降低,限流阈值失效。在这种情况下,持续评估阈值来匹配系统的最新状态根本无法通过人工进行保证。 解决方案:自动限流 针对如上问题解法如下: 问题1. 接口多,无法全面覆盖 解:系统自动配置 问题2.限流阈值无法准确评估 解:系统自动评估 问题3. 限流阈值无法长期有效 解:系统动态调整 具体方案如下: 系统资源到达使用率到达预警线的时候, 系统自动触发系统进行全面限流, 各接口的限流值根据应用当前的流量状态以及历史的流量状态而定。 什么时候限流:应用的容量取决于系统的资源瓶颈,当资源的使用率到达某一水平的时候才需要限流。资源包括数据库、缓存、应用服务器等。 谁来限:系统自动 限哪些接口:由于同一个应用不同接口都共享了数据库、缓存等、应用服务器等资源,接口之间的容量会相互影响,所以需要全部接口都限制才能保证资源的使用率不再上升。 各接口限多少?在资源使用率到达瓶颈的时候,所有的接口性能都会下降,对应的限流阈值也应该下调。具体的限流计算有两种方式: 可以把系统在当前状态下各接口能够正常完成的请求量作为限流的参考值,来保证资源利用率不在上升。比如接口A接受到的请求速率为100,其中50排队,20报错,30正常完成,那么该接口限流值可以参考30(为排除正常抖动,具体的值可以通过滑动窗口进行平滑)。 可以把上一同比周期的同时间(比如昨天的同一时间)的各接口的请求量作为限流的参考值。 可以看着一种回滚:我不知道问题出在哪个接口,但是按照上个周期同时刻的流量来是没问题的。 落地实践: 为防止自动限流的不可控性,可同时使用自动限流和人工限流两种方式,具体方法如下: 系统分为正常状态和戒严状态:正常状态下使用人工限流,戒严状态下使用自动限流。 正常情况下系统使用人工限流,开发人员可以针对重点接口进行限流配置。 当限流值失效或者未配置限流的时候导致系统资源到达预警值时,系统进入戒严状态,此时系统由自动限流接管,并通知开发人员。 开发人员收到通知后进行排查,确定导致资源利用率上升的原因,并针对相关接口进行人工限流值的调整(可以参考到达瓶颈前的qps),并使系统重新切换到正常状态。 备注 该方案还需更多场景验证,如有疏漏还请指出,欢迎有兴趣的小伙伴共同探讨。 作者:京东零售马坚 来源:京东云开发者社区

资源下载

更多资源
Mario

Mario

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

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册