• 关于

    交互控制系统宕机的原因

    的搜索结果

回答

两阶段提交协议是一种经典的强一致性中心化副本控制协议。虽然在工程中该协议有较多 的问题,但研究该协议能很好的理解分布式系统的几个典型问题。 流程描述 两阶段提交协议是一种典型的“中心化副本控制”协议。在该协议中,参与的 节点分为两类:一个中心化协调者节点(coordinator)和N 个参与者节点(participant)。每个参与 者节点即上文背景介绍中的管理数据库副本的节点。 两阶段提交的思路比较简单,在第一阶段,协调者询问所有的参与者是否可以提交事务(请参 与者投票),所有参与者向协调者投票。在第二阶段,协调者根据所有参与者的投票结果做出是否事 务可以全局提交的决定,并通知所有的参与者执行该决定。在一个两阶段提交流程中,参与者不能 改变自己的投票结果。两阶段提交协议的可以全局提交的前提是所有的参与者都同意提交事务,只 要有一个参与者投票选择放弃(abort)事务,则事务必须被放弃。 流程:两阶段提交协调者流程 写本地日志“begin_commit”, 并进入WAIT 状态; 向所有参与者发送“prepare 消息”; 等待并接收参与者发送的对“prepare 消息”的响应; 3.1 若收到任何一个参与者发送的“vote-abort 消息”; 3.1.1 写本地“global-abort”日志,进入ABORT; 3.1.2 向所有的参与者发送“global-abort 消息”; 3.1.3 进入ABORT 状态; 3.2 若收到所有参与者发送的“vote-commit”消息; 3.2.1 写本地“global-commit”日志,进入COMMIT 状态; 3.1.2 向所有的参与者发送“global-commit 消息”; 等待并接收参与者发送的对“global-abort 消息”或“global-commit 消息”的确认响应消息, 一旦收到所有参与者的确认消息,写本地“end_transaction” 日志流程结束。 流程:两阶段提交协调者流程 写本地日志“init”记录,进入INIT 状态 等待并接受协调者发送的“prepare 消息”,收到后 2.1 若参与者可以提交本次事务 2.1.1 写本地日志“ready”,进入READY 状态 2.1.2 向协调者发送“vote-commit”消息 2.1.4 等待协调者的消息 2.1.4.1 若收到协调者的“global-abort”消息 2.1.4.1.1 写本地日志“abort”,进入ABORT 状态 2.1.4.1.2 向协调者发送对“global-abort”的确认消息 2.1.4.2 若收到协调者的“global-commit”消息 2.1.4.1.1 写本地日志“commit”,进入COMMIT 状态 2.1.4.1.2 向协调者发送对“global-commit”的确认消息 2.2 若参与者无法提交本次事务 2.2.1 写本地日志“abort”,进入ABORT 状态 2.2.2 向协调者发送“vote-abort”消息 2.2.3 流程对该参与者结束 2.2.4 若后续收到协调者的“global-abort”消息可以响应 即使流程结束,但任何时候收到协调者发送的“global-abort”消息或“global-commit”消息 也都要发送一个对应的确认消息。 异常处理 宕机恢复 协调者宕机恢复 协调者宕机恢复后,首先通过日志查找到宕机前的状态。 如果日志中最后是“begin_commit”记录,说明宕机前协调者处于WAIT 状态,协调者可能已经 发送过“prepare 消息”也可能还没发送,但协调者一定还没有发送过“global-commit 消息”或 “global-abort 消息”,即事务的全局状态还没有确定。此时,协调者可以重新发送“prepare 消息” 继续两阶段提交流程,即使参与者已经发送过对“prepare 消息”的响应,也不过是再次重传之前的 响应而不会影响协议的一致性。 如果日志中最后是“global-commit”或“global-abort”记录,说明宕机前协调者处于COMMIT 或ABORT 状态。此时协调者只需重新向所有的参与者发送“global-commit 消息”或“global-abort 消息”就可以继续两阶段提交流程。 参与者宕机恢复 参与者宕机恢复后,首先通过日志查找宕机前的状态。 如果日志中最后是“init”记录,说明参与者处于INIT 状态,还没有对本次事务做出投票选择, 参与者可以继续流程等待协调者发送的“prepare 消息”。 如果日志中最后是“ready”记录,说明参与者处于REDAY 状态,此时说明参与者已经就本次 事务做出了投票选择,但宕机前参与者是否已经向协调者发送“vote-commit”消息并不可知。所以 此时参与者可以向协调者重发“vote-commit”,并继续协议流程。 如果日志中最后是“commit”或“abort”记录,说明参与者已经收到过协调者的“global-commit 消息”(处于COMMIT 状态)或者“global-abort 消息”(处于ABORT 状态)。至于是否向协调者发 送过对“global-commit”或“global-abort”的确认消息则未知。但即使没有发送过确认消息,由于 协调者会不断重发“global-commit”或“global-abort”,只需在收到这些消息时发送确认消息既可, 不影响协议的全局一致性。 协议分析 两阶段提交协议在工程实践中真正使用的较少,主要原因有以下几点: 两阶段提交协议的容错能力较差。从上文的分析可以看出,两阶段提交协议在某些情况 下存在流程无法执行下去的情况,且也无法判断流程状态。在工程中好的分布式协议往往总是可以 在即使发生异常的情况下也能执行下去。例如,回忆Lease 机制(2.3 ),一旦lease 发出,无论出 现任何异常,Lease 服务器节点总是可以通过时间判定出Lease 是否有效,也可以用等待Lease 超时 的方法收回Lease 权限,整个Lease 协议的流程不存在任何流程被阻塞而无法执行下去的情况。与 Lease 机制的简单有效相比,两阶段提交的协议显得较为复杂且容错能力差。 两阶段提交协议的性能较差。一次成功的两阶段提交协议流程中,协调者与每个参与者 之间至少需要两轮交互4 个消息“prepare”、“vote-commit”、“global-commit”、“确认global-commit”。 过多的交互次数会降低性能。另一方面,协调者需要等待所有的参与者的投票结果,一旦存在较慢 的参与者,会影响全局流程执行速度。 虽然存在一些改进的两阶段提交协议可以提高容错能力和性能,然而这类协议依旧是在工程中 使用较少的一类协议,其理论价值大于实践意义。
kun坤 2020-04-24 15:32:58 0 浏览量 回答数 0

回答

概述 本文主要介绍无法远程登录Linux实例的案例和排查方法。 详细信息 本文主要通过如下2个方面解决无法远程登录Linux实例的问题。 常见报错案例 排查方法 常见报错案例 SSH无法远程登录Linux实例的常见案例如下所示,可根据实际报错信息选择不同的方案进行排查和处理。 PAM安全框架 Linux系统环境配置 SSH服务及参数配置 SSH服务关联目录或文件配置 SSH服务密钥配置 PAM安全框架 Linux系统的PAM安全框架可以加载相关安全模块,对云服务器的账户策略、登录策略等进行访问控制。如果相关配置存在异常,或触发了相关策略,就可能会导致SSH登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:pam_listfile(sshd:auth): Refused user root for service sshd SSH登录时出现如下错误:requirement “uid >= 1000” not met by user “root” SSH登录时出现如下错误:Maximum amount of failed attempts was reached SSH登录时出现如下错误:login: Module is unknown Linux系统环境配置 Linux内的系统环境,比如中毒、账户配置、环境变量配置等,如果出现异常,也可能会导致SSH登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:ssh_exchange_identification: read: Connection reset by peer 中毒导致SSH服务运行异常,出现如下错误:fatal: mm_request_send: write: Broken pipe SSH启动时出现如下错误:main process exited, code=exited SSH连接时出现如下错误:pam_limits(sshd:session):could not sent limit for ‘nofile’ SSH连接时出现如下错误:pam_unix(sshdsession) session closed for user SSH连接时出现如下错误:error Could not get shadow infromation for root SSH服务及参数配置 SSH服务的默认配置文件为/etc/ssh/sshd_config。配置文件中的相关参数配置异常,或启用了相关特性或策略,也可能会导致 SSH登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:Disconnected:No supported authentication methods available SSH登录时出现如下错误:User root not allowed because not listed in SSH登录时出现如下错误:Permission denied, please try again SSH登录时出现如下错误:Too many authentication failures for root SSH启动时出现如下错误:error while loading shared libraries SSH启动时出现如下错误:fatal: Cannot bind any address SSH启动时出现如下错误:Bad configuration options 云服务器ECS Linux SSH启用UseDNS导致连接速度变慢 Linux实例中由于SELinux服务开启导致SSH远程连接异常 SSH服务关联目录或文件配置 SSH服务基于安全性考虑,在运行时,会对相关目录或文件的权限配置、属组等进行检查。过高或过低的权限配置,都可能会引发服务运行异常,进而导致客户端登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:No supported key exchange algorithms SSH启动时出现如下错误:must be owned by root and not group or word-writable SSH服务密钥配置 SSH服务采用非对称加密技术,对所传输的数据进行加密。客户端及服务端会交换和校验相关密钥信息的有效性。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:Host key verification failed SSH服务的公私钥异常导致无法SSH登录Linux实例 排查方法 若常见报错案例没有解决问题,可以参考如下流程排查问题。 检查CPU负载、带宽及内存使用情况 客户端排查 中间网络 网络检查 端口检查 安全组检查 示例 提示: 以下操作在CentOS 6.5 64位操作系统中进行过测试,在其他Linux发行版中可能存在差异,具体情况请参阅对应Linux发行版的官方文档。 客户端SSH连接Linux实例是运维操作的主要途径。通过管理终端可以用于临时运维操作,或者在客户端SSH登录异常时,用于问题排查和分析。 下图为SSH登录关联因素示意图。由此可见,通过SSH无法远程登录Linux实例时,可能涉及的关联因素较多。 检查CPU负载、带宽及内存使用情况 确认是否存在CPU负载过高的情况,如果存在,则参考本步骤解决问题,如果不存在,则执行下一步步骤。 提示:您无法主动监控系统内部的程序运行状态,但是可以借助云监控进行查看。 登录云监控控制台,依次选择 主机监控 > 进程监控。 查看应用运行情况,排除CPU负载过高的原因,如何查看CPU负载问题,请参见Linux系统ECS实例CPU使用率较高的排查思路。 提示:在某个时间段CPU负载过高可能导致远程连接失败,建议您查询程序或者实例资源是否不满足现有要求。 无法远程连接可能是公网带宽不足导致的,具体排查方法如下。可通过续费ECS实例,然后重启实例解决。详情参见手动续费或者自动续费。 登录ECS管理控制台。 找到该实例, 单击 管理 进入 实例详情 页面,查看网络监控数据。 检查服务器带宽是否为“1k”或“0k”。如果购买实例时没有购买公网带宽,后来升级了公网带宽,续费的时候没有选择续费带宽,带宽就会变成“1k”。 远程连接输入用户密码登录后,不能正常显示桌面直接退出,也没有错误信息。这种情况可能是服务器内存不足导致的,需要查看一下服务器的内存使用情况。具体操作如下。 使用控制台远程连接功能登录到Linux实例。 查看内存使用情况,具体请参考Linux系统的ECS实例中如何查看物理CPU和内存信息,确认内存不足后,请参考Linux服务器内存消耗过高进行处理。 客户端排查 客户端无法正常登录时,先使用不同的SSH客户端基于相同账户信息进行登录测试。如果能正常登录,则判断是客户端配置问题,需要对客户端配置或软件运行情况做排查分析。关于如何使用客户端SSH登录Linux实例,您可以参考远程连接Linux实例。 步骤一:使用管理终端登录实例 无论何种原因导致无法远程连接实例,请先尝试用阿里云提供的远程连接功能进行连接,确认实例还有响应,没有完全宕机,然后再按原因分类进行故障排查。 登录云服务器管理控制台,单击左侧导航栏中的 实例,然后在目标实例右侧单击 远程连接。 在首次连接或忘记连接密码时,单击 修改远程连接密码,修改远程连接的密码。 然后通过远程连接密码连接实例。 步骤二:检查客户端本地网络是否异常 确认是否存在用户本地无法连接外网的故障。 如果存在,则检查网卡驱动,如果存在异常,则重新安装。使用管理终端登录实例,查看/etc/hosts.deny文件,查看是否存在拦截IP,如果存在则删除此IP配置即可。 如果不存在,则执行下一步步骤。 步骤三:重启实例 在确保登录密码正确的情况下,确认之前是否曾重置过密码。检查重置实例密码后是否未重启实例,如果存在实例密码修改记录,但无重启实例记录,则参考以下操作步骤重启实例。 登录ECS管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。 中间网络 中间网络包括网络检查和端口检查。 网络检查 无法正常远程连接Windows实例时,需要先检查网络是否正常。 用其他网络环境中,不同网段或不同运营商)的电脑连接对比测试,判断是本地网络问题还是服务器端的问题。如果是本地网络问题或运营商问题,请联系本地IT人员或运营商解决。如果是网卡驱动存在异常,则重新安装。排除本地网络故障后进行下一步检查。 在客户端使用ping命令测试与实例的网络连通性。 网络异常时,请参考网络异常时如何抓取数据包进行排查。 当出现ping丢包或ping不通时,请参考使用ping命令丢包或不通时的链路测试方法进行排查。 如果出现间歇性丢包,ECS实例的网络一直处于不稳定状态时,请参考使用ping命令测试ECS实例的IP地址间歇性丢包进行解决。 系统内核没有禁ping的情况下,使用ping命令测试ECS服务器,发现网络不通,请参考Linux系统的ECS中没有禁PING却PING不通的解决方法。 端口检查 网络检查正常后,进一步检查端口是否正常。 使用管理终端登录实例,执行如下命令,编辑SSH配置文件。 vi /etc/ssh/sshd_config 找到“#port 22”所在行,检查默认端口22是否被修改,且前面的“#”是否删除,如果没有删除,可以把前面的“#”删除,然后将22改为其它的端口,再保存退出即可。 注:服务监听能使用的端口范围为0到65535,错误配置监听端口会导致远程桌面服务监听失败。 执行如下命令,重启SSH服务。 /etc/init.d/sshd restart 注:也可执行如下命令,重启SSH服务。 service sshd restart 使用Python自带的Web服务器用于临时创建新的监听端口进行测试。 python -m SimpleHTTPServer [$Port] 如果登录方式改变或者ECS安全组规则中未放行修改后的端口号,则参考如下步骤放行修改后的端口。 注:ECS的安全组规则中默认放行22端口。修改了远程桌面的端口后,需要在安全组规则中放行修改后的端口号。 登录ECS管理控制台。 找到该实例,单击 管理 进入 实例详情 页面,切换到 本实例安全组 标签页,单击 配置规则。 在安全组规则页面,单击 添加安全组规则。 在弹出的页面中,端口范围 输入修改后的远程桌面端口号。授权对象 输入客户端的公网IP地址。比如修改后的远程桌面端口号为2222,则 端口范围 应输入“2222/2222”。填写完成后,单击 确定。 通过上一步获取的端口,参考如下命令,进行端口测试,判断端口是否正常。如果端口测试失败,请参考使用ping命令正常但端口不通时的端口可用性探测说明进行排查。 telnet [$IP] [$Port] 注: [$IP]指Linux实例的IP地址。 [$Port]指Linux实例的SSH端口号。 系统显示类似如下,比如执行telnet 192.168.0.1 22命令,正常情况下,系统会返回服务端中SSH的软件版本号。 安全组检查 检查安全组配置,是否允许远程连接的端口。 参考查询安全组规则,查看安全组规则。如果远程连接端口没有进行配置,则参考Linux实例启用SSH服务后设置对应的安全组策略配置。 确认是否存在无法ping通ECS实例,在排除Iptables和网卡IP配置问题且回滚系统后,仍然无法ping通。可能是ECS实例安全组默认的公网规则被删除,则需要重新配置ECS实例的安全组公网规则,具体操作请参见ECS实例安全组默认的公网规则被删除导致无法ping通。如果不存在,则继续下一步骤检查。 示例 如果根据前述问题场景进行排查和处理后,还是无法正常登录。则建议按照如下步骤逐一排查和分析。 使用不同的客户端SSH及管理终端做对比访问测试,判断是否是个别客户端自身配置或软件运行问题所致。 参阅中间网络问题相关说明,测试网络连通性。 参阅管理终端,登录云服务器,在客户端进行访问测试的同时,执行如下命令,查看相关日志。 tailf /var/log/secure 参考如下命令, 比如ssh -v 192.168.0.1 命令,获取Linux环境中详细的SSH登录交互日志。 ssh -v [$IP] 通过管理终端登录Linux实例,参考如下步骤,检查SSH服务运行状态。 执行如下命令,检查服务运行状态。 service sshd status service sshd restart 正常情况下会返回SSH服务的运行状态及进程PID,系统显示类似如下。 [root@centos ~]# service sshd status openssh-daemon (pid 31350) is running... [root@centos ~]# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] 执行如下命令,检查服务监听状态。 netstat -ano | grep 0.0.0.0:22 正常情况下会返回相应端口监听信息,系统显示类似如下。 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0) 通过管理终端登录Linux实例,执行如下命令。如果能正常登录,则推断是系统防火墙或外部安全组策略等配置异常,导致客户端登录失败。 ssh 127.0.0.1 若用阿里云提供的远程连接功能仍无法成功连接实例,请尝试重启实例。重启操作会使实例停止工作,从而中断业务,请谨慎执行。 提示:重启实例前,需给实例创建快照,用于数据备份或者制作镜像。创建快照的方法请参见创建快照。 登录ECS管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,在目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。
1934890530796658 2020-03-26 09:52:57 0 浏览量 回答数 0

问题

HBase查询优化

转载自:http://www.hbase.group/article/38 1.概述 HBase是一个实时的非关系型数据库,用来存储海量数据。但是,在实际使用场景中,在使用HBas...
pandacats 2019-12-20 21:09:28 0 浏览量 回答数 0

回答

前言 这期我想写很久了,但是因为时间的原因一直拖到了现在,我以为一两天就写完了,结果从构思到整理资料,再到写出来用了差不多一周的时间吧。 你们也知道丙丙一直都是创作鬼才来的,所以我肯定不会一本正经的写,我想了好几个切入点,最后决定用一个完整的电商系统作为切入点,带着大家看看,我们需要学些啥,我甚至还收集配套视频和资料,暖男石锤啊,这期是呕心沥血之作,不要白嫖了。 正文 在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。 Tip:请多欣赏一会,每个点看一下,看看什么地方是你接触过的,什么技术栈是你不太熟悉的,我觉得还算是比较全的,有什么建议也可以留言给我。 不知道大家都看了一下没,现在我们就要庖丁解牛了,我从上到下依次分析。 前端 你可能会会好奇,你不是讲后端学习路线嘛,为啥还有前端的部分,我只能告诉你,傻瓜,肤浅。 我们可不能闭门造车,谁告诉你后端就不学点前端了? 前端现在很多也了解后端的技术栈的,你想我们去一个网站,最先接触的,最先看到的是啥? 没错就是前端,在大学你要是找不到专门的前端同学,去做系统肯定也要自己顶一下前端的,那我觉得最基本的技术栈得熟悉和了解吧,丙丙现在也是偶尔会开发一下我们的管理系统主要是VUE和React。 在这里我列举了我目前觉得比较简单和我们后端可以了解的技术栈,都是比较基础的。 作为一名后端了解部分前端知识还是很有必要的,在以后开发的时候,公司有前端那能帮助你前后端联调更顺畅,如果没前端你自己也能顶一下简单的页面。 HTML、CSS、JS、Ajax我觉得是必须掌握的点,看着简单其实深究或者去操作的话还是有很多东西的,其他作为扩展有兴趣可以了解,反正入门简单,只是精通很难很难。 在这一层不光有这些还有Http协议和Servlet,request、response、cookie、session这些也会伴随你整个技术生涯,理解他们对后面的你肯定有不少好处。 Tip:我这里最后删除了JSP相关的技术,我个人觉得没必要学了,很多公司除了老项目之外,新项目都不会使用那些技术了。 前端在我看来比后端难,技术迭代比较快,知识好像也没特定的体系,所以面试大厂的前端很多朋友都说难,不是技术多难,而是知识多且复杂,找不到一个完整的体系,相比之下后端明朗很多,我后面就开始讲后端了。 网关层: 互联网发展到现在,涌现了很多互联网公司,技术更新迭代了很多个版本,从早期的单机时代,到现在超大规模的互联网时代,几亿人参与的春运,几千亿成交规模的双十一,无数互联网前辈的造就了现在互联网的辉煌。 微服务,分布式,负载均衡等我们经常提到的这些名词都是这些技术在场景背后支撑。 单机顶不住,我们就多找点服务器,但是怎么将流量均匀的打到这些服务器上呢? 负载均衡,LVS 我们机器都是IP访问的,那怎么通过我们申请的域名去请求到服务器呢? DNS 大家刷的抖音,B站,快手等等视频服务商,是怎么保证同时为全国的用户提供快速的体验? CDN 我们这么多系统和服务,还有这么多中间件的调度怎么去管理调度等等? zk 这么多的服务器,怎么对外统一访问呢,就可能需要知道反向代理的服务器。 Nginx 这一层做了反向负载、服务路由、服务治理、流量管理、安全隔离、服务容错等等都做了,大家公司的内外网隔离也是这一层做的。 我之前还接触过一些比较有意思的项目,所有对外的接口都是加密的,几十个服务会经过网关解密,找到真的路由再去请求。 这一层的知识点其实也不少,你往后面学会发现分布式事务,分布式锁,还有很多中间件都离不开zk这一层,我们继续往下看。 服务层: 这一层有点东西了,算是整个框架的核心,如果你跟我帅丙一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,Linux操作,算法数据结构,架构框架,研发工具等等。 我想在看这个文章的各位,计算机基础肯定都是学过的吧,如果大学的时候没好好学,我觉得还是有必要再看看的。 为什么我们网页能保证安全可靠的传输,你可能会了解到HTTP,TCP协议,什么三次握手,四次挥手。 还有进程、线程、协程,什么内存屏障,指令乱序,分支预测,CPU亲和性等等,在之后的编程生涯,如果你能掌握这些东西,会让你在遇到很多问题的时候瞬间get到点,而不是像个无头苍蝇一样乱撞(然而丙丙还做得不够)。 了解这些计算机知识后,你就需要接触编程语言了,大学的C语言基础会让你学什么语言入门都会快点,我选择了面向对象的JAVA,但是也不知道为啥现在还没对象。 JAVA的基础也一样重要,面向对象(包括类、对象、方法、继承、封装、抽象、 多态、消息解析等),常见API,数据结构,集合框架,设计模式(包括创建型、结构型、行为型),多线程和并发,I/O流,Stream,网络编程你都需要了解。 代码会写了,你就要开始学习一些能帮助你把系统变得更加规范的框架,SSM可以会让你的开发更加便捷,结构层次更加分明。 写代码的时候你会发现你大学用的Eclipse在公司看不到了,你跟大家一样去用了IDEA,第一天这是什么玩意,一周后,真香,但是这玩意收费有点贵,那免费的VSCode真的就是不错的选择了。 代码写的时候你会接触代码的仓库管理工具maven、Gradle,提交代码的时候会去写项目版本管理工具Git。 代码提交之后,发布之后你会发现很多东西需要自己去服务器亲自排查,那Linux的知识点就可以在里面灵活运用了,查看进程,查看文件,各种Vim操作等等。 系统的优化很多地方没优化的空间了,你可能会尝试从算法,或者优化数据结构去优化,你看到了HashMap的源码,想去了解红黑树,然后在算法网上看到了二叉树搜索树和各种常见的算法问题,刷多了,你也能总结出精华所在,什么贪心,分治,动态规划等。 这么多个服务,你发现HTTP请求已经开始有点不满足你的需求了,你想开发更便捷,像访问本地服务一样访问远程服务,所以我们去了解了Dubbo,Spring cloud。 了解Dubbo的过程中,你发现了RPC的精华所在,所以你去接触到了高性能的NIO框架,Netty。 代码写好了,服务也能通信了,但是你发现你的代码链路好长,都耦合在一起了,所以你接触了消息队列,这种异步的处理方式,真香。 他还可以帮你在突发流量的时候用队列做缓冲,但是你发现分布式的情况,事务就不好管理了,你就了解到了分布式事务,什么两段式,三段式,TCC,XA,阿里云的全局事务服务GTS等等。 分布式事务的时候你会想去了解RocketMQ,因为他自带了分布式事务的解决方案,大数据的场景你又看到了Kafka。 我上面提到过zk,像Dubbo、Kafka等中间件都是用它做注册中心的,所以很多技术栈最后都组成了一个知识体系,你先了解了体系中的每一员,你才能把它们联系起来。 服务的交互都从进程内通信变成了远程通信,所以性能必然会受到一些影响。 此外由于很多不确定性的因素,例如网络拥塞、Server 端服务器宕机、挖掘机铲断机房光纤等等,需要许多额外的功能和措施才能保证微服务流畅稳定的工作。 **Spring Cloud **中就有 Hystrix 熔断器、Ribbon客户端负载均衡器、Eureka注册中心等等都是用来解决这些问题的微服务组件。 你感觉学习得差不多了,你发现各大论坛博客出现了一些前沿技术,比如容器化,你可能就会去了解容器化的知识,像**Docker,Kubernetes(K8s)**等。 微服务之所以能够快速发展,很重要的一个原因就是:容器化技术的发展和容器管理系统的成熟。 这一层的东西呢其实远远不止这些的,我不过多赘述,写多了像个劝退师一样,但是大家也不用慌,大部分的技术都是慢慢接触了,工作中慢慢去了解,去深入的。 好啦我们继续沿着图往下看,那再往下是啥呢? 数据层: 数据库可能是整个系统中最值钱的部分了,在我码文字的前一天,刚好发生了微盟程序员删库跑路的操作,删库跑路其实是我们在网上最常用的笑话,没想到还是照进了现实。 这里也提一点点吧,36小时的故障,其实在互联网公司应该是个笑话了吧,权限控制没做好类似rm -rf 、fdisk、drop等等这样的高危命令是可以实时拦截掉的,备份,全量备份,增量备份,延迟备份,异地容灾全部都考虑一下应该也不至于这样,一家上市公司还是有点点不应该。 数据库基本的事务隔离级别,索引,SQL,主被同步,读写分离等都可能是你学的时候要了解到的。 上面我们提到了安全,不要把鸡蛋放一个篮子的道理大家应该都知道,那分库的意义就很明显了,然后你会发现时间久了表的数据大了,就会想到去接触分表,什么TDDL、Sharding-JDBC、DRDS这些插件都会接触到。 你发现流量大的时候,或者热点数据打到数据库还是有点顶不住,压力太大了,那非关系型数据库就进场了,Redis当然是首选,但是MongoDB、memcache也有各自的应用场景。 Redis使用后,真香,真快,但是你会开始担心最开始提到的安全问题,这玩意快是因为在内存中操作,那断点了数据丢了怎么办?你就开始阅读官方文档,了解RDB,AOF这些持久化机制,线上用的时候还会遇到缓存雪崩击穿、穿透等等问题。 单机不满足你就用了,他的集群模式,用了集群可能也担心集群的健康状态,所以就得去了解哨兵,他的主从同步,时间久了Key多了,就得了解内存淘汰机制…… 他的大容量存储有问题,你可能需要去了解Pika…. 其实远远没完,每个的点我都点到为止,但是其实要深究每个点都要学很久,我们接着往下看。 实时/离线/大数据 等你把几种关系型非关系型数据库的知识点,整理清楚后,你会发现数据还是大啊,而且数据的场景越来越多多样化了,那大数据的各种中间件你就得了解了。 你会发现很多场景,不需要实时的数据,比如你查你的支付宝去年的,上个月的账单,这些都是不会变化的数据,没必要实时,那你可能会接触像ODPS这样的中间件去做数据的离线分析。 然后你可能会接触Hadoop系列相关的东西,比如于Hadoop(HDFS)的一个数据仓库工具Hive,是建立在 Hadoop 文件系统之上的分布式面向列的数据库HBase 。 写多的场景,适合做一些简单查询,用他们又有点大材小用,那Cassandra就再合适不过了。 离线的数据分析没办法满足一些实时的常见,类似风控,那Flink你也得略知一二,他的窗口思想还是很有意思。 数据接触完了,计算引擎Spark你是不是也不能放过…… 搜索引擎: 传统关系型数据库和NoSQL非关系型数据都没办法解决一些问题,比如我们在百度,淘宝搜索东西的时候,往往都是几个关键字在一起一起搜索东西的,在数据库除非把几次的结果做交集,不然很难去实现。 那全文检索引擎就诞生了,解决了搜索的问题,你得思考怎么把数据库的东西实时同步到ES中去,那你可能会思考到logstash去定时跑脚本同步,又或者去接触伪装成一台MySQL从服务的Canal,他会去订阅MySQL主服务的binlog,然后自己解析了去操作Es中的数据。 这些都搞定了,那可视化的后台查询又怎么解决呢?Kibana,他他是一个可视化的平台,甚至对Es集群的健康管理都做了可视化,很多公司的日志查询系统都是用它做的。 学习路线 看了这么久你是不是发现,帅丙只是一直在介绍每个层级的技术栈,并没说到具体的一个路线,那是因为我想让大家先有个认知或者说是扫盲吧,我一样用脑图的方式汇总一下吧,如果图片被平台二压了。 资料/学习网站 Tip:本来这一栏有很多我准备的资料的,但是都是外链,或者不合适的分享方式,博客的运营小姐姐提醒了我,所以大家去公众号回复【路线】好了。 絮叨 如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。 如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。 丙丙发现在工作中发现我身边的人真的就是实力越强的越努力,最高级的自律,享受孤独(周末的歪哥)。 总结 我提到的技术栈你想全部了解,我觉得初步了解可能几个月就够了,这里的了解仅限于你知道它,知道他是干嘛的,知道怎么去使用它,并不是说深入了解他的底层原理,了解他的常见问题,熟悉问题的解决方案等等。 你想做到后者,基本上只能靠时间上的日积月累,或者不断的去尝试积累经验,也没什么速成的东西,欲速则不达大家也是知道的。 技术这条路,说实话很枯燥,很辛苦,但是待遇也会高于其他一些基础岗位。 所实话我大学学这个就是为了兴趣,我从小对电子,对计算机都比较热爱,但是现在打磨得,现在就是为了钱吧,是不是很现实?若家境殷实,谁愿颠沛流离。 但是至少丙丙因为做软件,改变了家庭的窘境,自己日子也向小康一步步迈过去。 说做程序员改变了我和我家人的一生可能夸张了,但是我总有一种下班辈子会因为我选择走这条路而改变的错觉。 我是敖丙,一个在互联网苟且偷生的工具人。 创作不易,本期硬核,不想被白嫖,各位的「三连」就是丙丙创作的最大动力,我们下次见! 本文 GitHub https://github.com/JavaFamily 已经收录,有大厂面试完整考点,欢迎Star。 该回答来自:敖丙
剑曼红尘 2020-03-06 11:35:37 0 浏览量 回答数 0

云产品推荐

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