当前位置:首页 » 存储配置 » 如何设计高可用的配置中心

如何设计高可用的配置中心

发布时间: 2022-09-19 17:03:22

⑴ 开发自动化运维架构六要素

运维自动化是我们所渴望获得的,但是我们在一味强调自动化能力时,却忽略了影响自动化落地的一个关键因素。那便是跟运维朝夕相处,让人又爱又恨的业务架构。
要点一:架构独立
任何架构的产生都是为了满足特定的业务诉求,如果我们在满足业务要求的同时,能够兼顾运维对架构管理的非功能性要求。那么我们有理由认为这样的架构是对运维友好的。
站在运维的角度,所诉求的架构独立包含四个方面:独立部署,独立测试,组件化和技术解耦。
独立部署
指的是一份源代码,可以按照便于运维的管理要求去部署、升级、伸缩等,可通过配置来区分地域分布。服务间相互调用通过接口请求实现,部署独立性也是运维独立性的前提。
独立测试
运维能够通过一些便捷的测试用例或者工具,验证该业务架构或服务的可用性。具备该能力的业务架构或服务让运维具备了独立上线的能力,而不需要每次发布或变更都需要开发或测试人员的参与。
组件规范
指的是在同一个公司内对相关的技术能有很好的框架支持,从而避免不同的开发团队使用不同的技术栈或者组件,造成公司内部的技术架构失控。
这种做法能够限制运维对象的无序增加,让运维对生产环境始终保持着掌控。同时也能够让运维保持更多的精力投入,来围绕着标准组件做更多的效率与质量的建设工作。
技术解耦
指的是降低服务和服务之间相互依赖的关系,也包含了降低代码对配置文件的依赖。这也是实现微服务的基础,实现独立部署、独立测试、组件化的基础。
要点二:部署友好
DevOps 中有大量的篇幅讲述持续交付的技术实践,希望从端到端打通开发、测试、运维的所有技术环节,以实现快速部署和交付价值的目标。可见,部署是运维日常工作很重要的组成部分,是属于计划内的工作,重复度高,必须提升效率。
实现高效可靠的部署能力,要做好全局规划,以保证部署以及运营阶段的全方位运维掌控。有五个纬度的内容是与部署友好相关的:
CMDB配置
在每次部署操作前,运维需要清晰的掌握该应用与架构、与业务的关系,为了更好的全局理解和评估工作量和潜在风险。
在织云自动化运维平台中,我们习惯于将业务关系、集群管理、运营状态、重要级别、架构层等配置信息作为运维的管理对象纳管于CMDB配置管理数据库中。这种管理办法的好处很明显,集中存储运维对象的配置信息,对日后涉及的运维操作、监控和告警等自动化能力建设,将提供大量的配置数据支撑和决策辅助的功效。
环境配置
在运维标准化程度不高的企业中,阻碍部署交付效率的原罪之一便是环境配置,这也是容器化技术主要希望解决的运维痛点之一。
腾讯的运维实践中,对开发、测试、生产三大主要环境的标准化管理,通过枚举纳管与环境相关的资源集合与运维操作,结合自动初始化工具以实现标准环境管理的落地。
依赖管理
解决应用软件对库、运营环境等依赖关系的管理。在织云实践经验中,我们利用包管理,将依赖的库文件或环境的配置,通过整体打包和前后置执行脚本的方案,解决应用软件在不同环境部署的难题。业界还有更轻量的容器化交付方法,也是不错的选择。
部署方式
持续交付原则提到要打造可靠可重复的交付流水线,对应用软件的部署操作,我们也强烈按此目标来规划。业界有很多案例可以参考,如Docker的Build、Ship、Run,如织云的通过配置描述、标准化流程的一键部署等等。
发布自测
发布自测包含两部分:
应用的轻量级测试;
发布/变更内容的校对。
建设这两种能力以应对不同的运维场景需求,如在增量发布时,使用发布内容的校对能力,运维人员可快速的获取变更文件md5,或对相关的进程和端口的配置信息进行检查比对,确保每次发布变更的可靠。
同理,轻量级测试则是满足发布时对服务可用性检测的需求,此步骤可以检测服务的连通性,也可以跑些主干的测试用例。
灰度上线
在《日常运维三十六计》中有这么一句话:对不可逆的删除或修改操作,尽量延迟或慢速执行。这便是灰度的思想,无论是从用户、时间、服务器等纬度的灰度上线,都是希望尽量降低上线操作的风险,业务架构支持灰度发布的能力,让应用部署过程的风险降低,对运维更友好。
要点三:可运维性
运维脑海中最理想的微服务架构,首当其冲的肯定是可运维性强的那类。不具可运维性的应用或架构,对运维团队带来的不仅仅是黑锅,还有对他们职业发展的深深的伤害,因为维护一个没有可运维性的架构,简直就是在浪费运维人员的生命。
可运维性按操作规范和管理规范可以被归纳为以下七点:
配置管理
在微服务架构管理中,我们提议将应用的二进制文件与配置分离管理,以便于实现独立部署的目的。
被分离出来的应用配置,有三种管理办法:
文件模式;
配置项模式;
分布式配置中心模式。
限于篇幅不就以上三种方式的优劣展开讨论。不同的企业可选用最适用的配置管理办法,关键是要求各业务使用一致的方案,运维便可以有针对性的建设工具和系统来做好配置管理。
版本管理
DevOps持续交付八大原则之一“把所有的东西都纳入版本控制”。就运维对象而言,想要管理好它,就必须能够清晰的描述它。
和源代码管理的要求类似,运维也需要对日常操作的对象,如包、配置、脚本等都进行脚本化管理,以备在运维系统在完成自动化操作时,能够准确无误的选定被操作的对象和版本。
标准操作
运维日常有大量重复度高的工作需要被执行,从精益思想的视角看,这里存在极大的浪费:学习成本、无价值操作、重复建设的脚本/工具、人肉执行的风险等等。
倘若能在企业内形成统一的运维操作规范,如文件传输、远程执行、应用启动停止等等操作都被规范化、集中化、一键化的操作,运维的效率和质量将得以极大的提升。
进程管理
包括应用安装路径、目录结构、规范进程名、规范端口号、启停方式、监控方案等等,被收纳在进程管理的范畴。做好进程管理的全局规划,能够极大的提升自动化运维程度,减少计划外任务的发生。
空间管理
做好磁盘空间使用的管理,是为了保证业务数据的有序存放,也是降低计划外任务发生的有效手段。
要求提前做好的规划:备份策略、存储方案、容量预警、清理策略等,辅以行之有效的工具,让这些任务不再困扰运维。
日志管理
日志规范的推行和贯彻需要研发密切配合,在实践中得出的经验,运维理想中的日志规范要包含这些要求:
业务数据与日志分离
日志与业务逻辑解耦
日志格式统一
返回码及注释清晰
可获取业务指标(请求量/成功率/延时)
定义关键事件
输出级别
管理方案(存放时长、压缩备份等)
当具体上述条件的日志规范得以落地,开发、运维和业务都能相应的获得较好的监控分析能力。
集中管控
运维的工作先天就容易被切割成不同的部分,发布变更、监控分析、故障处理、项目支持、多云管理等等,我们诉求一站式的运维管理平台,使得所有的工作信息能够衔接起来和传承经验,杜绝因为信息孤岛或人工传递信息而造成的运营风险,提升整体运维管控的效率和质量。
要点四:容错容灾
在腾讯技术运营(运维)的四大职责:质量、效率、成本、安全。质量是首要保障的阵地,转换成架构的视角,运维眼中理想的高可用架构架构设计应该包含以下几点:
负载均衡
无论是软件或硬件的负责均衡的方案,从运维的角度出发,我们总希望业务架构是无状态的,路由寻址是智能化的,集群容错是自动实现的。
在腾讯多年的路由软件实践中,软件的负载均衡方案被广泛应用,为业务架构实现高可用立下汗马功劳。
可调度性
在移动互联网盛行的年代,可调度性是容灾容错的一项极其重要的运维手段。在业务遭遇无法立刻解决的故障时,将用户或服务调离异常区域,是海量运营实践中屡试不爽的技巧,也是腾讯QQ和微信保障平台业务质量的核心运维能力之一。
结合域名、VIP、接入网关等技术,让架构支持调度的能力,丰富运维管理手段,有能力更从容的应对各种故障场景。
异地多活
异地多活是数据高可用的诉求,是可调度性的前提。针对不同的业务场景,技术实现的手段不限。
腾讯社交的实践可以参考周小军老师的文章“2亿QQ用户大调度背后的架构设计和高效运营”。
主从切换
在数据库的高可用方案中,主从切换是最常见的容灾容错方案。通过在业务逻辑中实现读写分离,再结合智能路由选择实现无人职守的主从切换自动化,无疑是架构设计对DBA最好的馈赠。
柔性可用
“先扛住再优化”是腾讯海量运营思想之一,也为我们在做业务架构的高可用设计点明了方向。
如何在业务量突增的情况下,最大程度的保障业务可用?是做架构规划和设计时不可回避的问题。巧妙的设置柔性开关,或者在架构中内置自动拒绝超额请求的逻辑,能够在关键时刻保证后端服务不雪崩,确保业务架构的高可用。
要点五:质量监控
保障和提高业务质量是运维努力追逐的目标,而监控能力是我们实现目标的重要技术手段。运维希望架构为质量监控提供便利和数据支持,要求实现以下几点:
指标度量
每个架构都必须能被指标度量,同时,我们希望的是最好只有唯一的指标度量。对于业务日趋完善的立体化监控,监控指标的数量随之会成倍增长。因此,架构的指标度量,我们希望的是最好只有唯一的指标度量。
基础监控
指的是网络、专线、主机、系统等低层次的指标能力,这类监控点大多属于非侵入式,很容易实现数据的采集。
在自动化运维能力健全的企业,基础监控产生的告警数据绝大部分会被收敛掉。同时,这部分监控数据将为高层次的业务监控提供数据支撑和决策依据,或者被包装成更贴近上层应用场景的业务监控数据使用,如容量、多维指标等。
组件监控
腾讯习惯把开发框架、路由服务、中间件等都统称为组件,这类监控介于基础监控和业务监控之间,运维常寄希望于在组件中内嵌监控逻辑,通过组件的推广,让组件监控的覆盖度提高,获取数据的成本属中等。如利用路由组件的监控,运维可以获得每个路由服务的请求量、延时等状态和质量指标。
业务监控
业务监控的实现方法分主动和被动的监控,即可侵入式实现,又能以旁路的方式达到目的。这类监控方案要求开发的配合,与编码和架构相关。
通常业务监控的指标都能归纳为请求量、成功率、延时3种指标。实现手段很多,有日志监控、流数据监控、波测等等,业务监控属于高层次的监控,往往能直接反馈业务问题,但倘若要深入分析出问题的根源,就必须结合必要的运维监控管理规范,如返回码定义、日志协议等。需要业务架构在设计时,前置考虑运维监控管理的诉求,全局规划好的范畴。
全链路监控
基础、组件、业务的监控手段更多的是聚焦于点的监控,在分布式架构的业务场景中,要做好监控,我们必须要考虑到服务请求链路的监控。
基于唯一的交易ID或RPC的调用关系,通过技术手段还原调用关系链,再通过模型或事件触发监控告警,来反馈服务链路的状态和质量。该监控手段属于监控的高阶应用,同样需要业务架构规划时做好前置规划和代码埋点。。
质量考核
任何监控能力的推进,质量的优化,都需要有管理的闭环,考核是一个不错的手段,从监控覆盖率、指标全面性、事件管理机制到报表考核打分,运维和开发可以携手打造一个持续反馈的质量管理闭环,让业务架构能够不断进化提升。
要点六:性能成本
在腾讯,所有的技术运营人员都肩负着一个重要的职能,就是要确保业务运营成本的合理。为此,我们必须对应用吞吐性能、业务容量规划和运营成本都要有相应的管理办法。
吞吐性能
DevOps持续交付方法论中,在测试阶段进行的非功能需求测试,其中很重要一点便是对架构吞吐性能的压测,并以此确保应用上线后业务容量的健康。
在腾讯的实践中,不仅限于测试阶段会做性能压测,我们会结合路由组件的功能,对业务模块、业务SET进行真实请求的压测,以此建立业务容量模型的基准。也从侧面提供数据论证该业务架构的吞吐性能是否达到成本考核的要求,利用不同业务间性能数据的对比,来推动架构性能的不断提高。
容量规划
英文capacity一词可以翻译成:应用性能、服务容量、业务总请求量,运维的容量规划是指在应用性能达标的前提下,基于业务总请求量的合理的服务容量规划。
运营成本
减少运营成本,是为公司减少现金流的投入,对企业的价值丝毫不弱于质量与效率的提升。
腾讯以社交、UGC、云计算、游戏、视频等富媒体业务为主,每年消耗在带宽、设备等运营成本的金额十分巨大。运维想要优化运营成本,常常会涉及到产品功能和业务架构的优化。因此,运维理想的业务架构设计需要有足够的成本意识,
小结
本文纯属个人以运维视角整理的对微服务架构设计的一些愚见,要实现运维价值最大化,要确保业务质量、效率、成本的全面提高,业务架构这块硬骨头是不得不啃的。
运维人需要有架构意识,能站在不同角度对业务架构提出建议或需求,这也是DevOps 精神所提倡的,开发和运维联手,持续优化出最好的业务架构。

⑵ 如何设计一个支持高并发的高可用服务

服务程序最为关键的设计是并发服务模型,当前有以下几种典型的模型:-单进程服务,使用非阻塞IO使用一个进程服务多个客户,通常与客户通信的套接字设置为非阻塞的,阻塞只发生在select()、poll()、epoll_wait()等系统调用上面。这是一种行之有效的单进程状态机式服务方式,已被广泛采用。缺点是它无法利用SMP(对称多处理器)的优势,除非启动多个进程。此外,它尝试就绪的IO文件描述符后,立即从系统调用返回,这会导致大量的系统调用发生,尤其是在较慢的字节传输时。select()本身的实现也是有局限的:能打开的文件描述符最多不能超过FD_SETSIZE,很容易耗尽;每次从select()返回的描述符组中扫描就绪的描述符需要时间,如果就绪的描述符在末尾时更是如此(epoll特别彻底修复了这个问题)。-多进程服务,使用阻塞IO也称作accept/fork模型,每当有客户连线时产生一个新的进程为之服务。这种方式有时是必要的,比如可以通过操作系统获得良好的内存保护,可以以不同的用户身份运行程序,可以让服务运行在不同的目录下面。但是它的缺点也很明显:进程比较占资源,进程切换开销太大,共享某些信息比较麻烦。Apache1.3就使用了这种模型,MaxClients数很容易就可以达到。-多线程服务,使用阻塞IO也称之accept/pthread_create模型,有新客户来时创建一个服务线程而不是服务进程。这解决了多进程服务的一些问题,比如它占用资源少,信息共享方便。但是麻烦在于线程仍有可能消耗光,线程切换也需要开销。-混合服务方式所谓的混合服务方式,以打破服务方和客户方之间严格的1:1关系。基本做法是:新客户到来时创建新的工作线程,当该工作线程检测到网络IO会有延迟时停止处理过程,返回给Server一个延迟处理状态,同时告诉Server被延迟的文件描述符,延迟超时时间。Server会在合适的时候返回工作线程继续处理。注意这里的工作线程不是通过pthread_create()创建的,而是被包装在专门用于处理延迟工作的函数里。这里还有一个问题,工作线程如何检测网络IO会有延迟?方法有很多,比如设置较短的超时时间调用poll(),或者甚至使用非阻塞IO。如果是套接字,可以设置SO_RCVTIMEO和SO_SNDTIMEO选项,这样更有效率。除了延迟线程,Server还应提供了未完成线程的支持。如有有特别耗费时间的操作,你可以在完成部分工作后停止处理,返回给Server一个未完成状态。这样Server会检查工作队列是否有别的线程,如果有则让它们运行,否则让该工作线程继续处理,这可以防止某些线程挨饿。典型的一个混合服务模型开源实现ServerKitServerkit的这些线程支持功能可简化我们的服务程序设计,效率上应该也是有保证的。2.队列(queue)ServerKit提供的队列是一个单向链表,队列的存取是原子操作,如果只有一个执行单元建议不要用,因为原子操作的开销较大。3.堆(heap)malloc()分配内存有一定的局限,比如在多线程的环境里,需要序列化内存分配操作。ServerKit提供的堆管理函数,可快速分配内存,可有效减少分配内存的序列化操作,堆的大小可动态增长,堆有引用计数,这些特征比较适合多线程环境。目前ServerKit堆的最大局限是分配单元必须是固定大小。4.日志记录日志被保存在队列,有一个专门的线程处理队列中的日志记录:它或者调用syslog()写进系统日志,或者通过UDP直接写到远程机器。后者更有效。5.读写锁GNUlibc也在pthreads库里实现了读写锁,如果定义了__USE_UNIX98就可以使用。不过ServerKit还提供了读写锁互相转换的函数,这使得锁的应用更为弹性。比如拥有读锁的若干个线程对同一个hash表进行检索,其中一个线程检索到了数据,此时需要修改它,一种法是获取写锁,但这会导致释放读锁和获取写锁之间存在时间窗,另一种法是使用ServerKit提供的函数把读锁转换成写锁,无疑这种方式更有效率。除了以上这些功能,ServerKit还提供了数据库连接池的管理(当前只支持MySQL)和序列化(Sequences),如感兴趣可参见相关的API文档。二、ServerKit服务模块编写ServerKit由3部分组成:server程序,负责加载服务模块、解析配置文件、建立数据库连接池;libserver,动态链接库,提供所有功能的库支持,包括server本身也是调用这个库写的;API,编程接口,你编写的服务模块和ServerKit框架进行对话的接口。ServerKit需要libConfuse解析配置文件,所以出了安装ServerKit,还需要安装libConfuse。关于libConfuse可参考。下面我们看一个简单的服务模块FOO:#include#includestaticlongintsleep_ration;staticintFOO_construct(){fprintf(stderr,"FOO_construct\n");return1;}staticintFOO_prestart(cfg_t*configuration){fprintf(stderr,"FOO_prestart\n");return1;}staticvoid*FOO_operator(void*foobar){fprintf(stderr,"FOO_operator\n");for(;;)sleep(sleep_ration);returnNULL;}staticvoidFOO_report(void){fprintf(stderr,"FOO_report\n");}staticcfg_opt_tFOO_config[]={CFG_SIMPLE_INT("sleep_ration",&sleep_ration),CFG_END()};staticchar*FOO_authors[]={"VitoCaputo",NULL};SERVER_MODULE(FOO,0,0,1,"")按以下方法编译:$gcc-c-fPIC-pthread-D_REENTRANT-gFOO.c$gcc-shared-lserver-lconfuse-lpthread-g-e__server_mole_main-oFOO.soFOO.o-e选项指定程序运行入口,这使得你可以直接在命令行敲./FOO.so运行模块。server程序根据环境变量SERVER_PERSONALITY_PATH定位主目录,并查找主目录下的c11n作为配置文件,动态加载的模块需放在主目录下的moles目录。$exportSERVER_PERSONALITY_PATH=`pwd`$mkdirmoles$cpFOO.somoles$vic11nc11n的内容:identity="any_id"FOO{sleep_ration=1;}identity标识server实例,用ps可看到程序名称形如server.identity,本例为server.any_id。执行server启动服务程序。三、ServerKit其他功能缺陷缺乏daemon模式;只能运行在linuxbox;DBpool只支持MySQL;Heap管理内存的功力有限

⑶ 静脉药物配置中心如何设计建设

喜格实验室工程:静脉药物配置中心设计建设,如下
1静脉药物配置中心的建立
1.1某院PIVAS位于医院医技楼六楼,便于药品运输和成品配送,便于配制管理和环境控制,水电等基础条件符合规定。其面积309m2,设计合理,流程顺畅。主要功能区域包括排药、贮药、充配、信息、核发、更衣、洗洁等;配有6台生物安全柜和先进的空气净化系统。无菌工作间有严密的隔离措施及消毒设备,进入工作间,必须经过两道隔离门,并安装了空调设备。工程完工后由具有检测资质的单位对净化系统进行静态检测,沉降菌、微粒、噪音、照度、换气次数、温湿度等各项指标达标后,方才投入使用。保证了洁净室的洁净度,从而确保临床用药安全。
1.2某院PIVAS的管理模式采用以药为主,由药剂科负责日常工作管理,护理部负责护理人员的配备,现有药师5名,护师13名,工友2名,为医院19个病区进行服务,每天提供约1 500袋静脉液体。药学人员主要负责审方、排药、加药、核对、药品管理等;护理人员职责为复核、冲配、帮助排药;工勤人员需及时运送药品与打扫卫生等。
1.3信息系统是实现静脉药物配制的基础,分管院长多次召集药剂科、护理部、医务处、信息科的相关人员协调工作、统一认识确定电脑程序。电脑信息系统包括处方传输、标签打印、药费支付、药品管理、咨询服务、药历生成;标签内容应包括患者基本信息、药品处方信息、配制核对信息等,是药师审核用药与记录配制过程的重要凭证。信息管理系统应设置管理权限,完善数据统计的功能,自动生成批次,实行配置全程化管理。另外还将在系统中嵌入配伍监控系统,对用药实施合理用药监控。
2静脉药物配置中心工作流程设计
2.1医生按照《处方管理办法》有关规定开具静脉用药处方,由专人将处方输入医院的信息系统中。处方可分为两类:长期处方与临时处方。病区负责按规定时间将患者次日需要静脉输液的长期处方传送至PIVAS,临时处方按照医院的相关规定和要求传入PIVAS。
2.2 PIVAS的药师接收到处方后,逐一核对患者处方信息,审核确认其正确性、合理性与完整性。对于处方存在错误的,及时与医生沟通,请其调整并签名。对于处方存在错误而医生拒绝不同意修改的,拒绝调配,并报请相关部门协调解决。
2.3经药师审核通过的处方打印成处方标签,标签上需有患者姓名、病区、床号、日期、处方组成、自动生成的编号等内容,且要有各个工序签名或盖章的空间,标签需能贴到输液瓶(袋)上。
2.4药师接到审方合格的标签,应仔细核查标签内容是否准确、完整,如有错误或不全应告知审方药师校对纠正。药师根据审核后的标签上所列药物的顺序,按照其性质、不同的用药时间,分批次将药品放置于不同颜色的容器中,并在标签上签名或盖章,按照病区、药物的不同性质放置于不同的配置间内。
2.5配置间为洁净间,洁净级别为万级,按照配置药物的种类不同可分为普通药物与全静脉营养药配置间、抗生素与细胞毒性药物配置间。普通药物与全静脉营养药配置间需配备净化层流台,使配置环境达到百级,从而保证药品不被污染。抗生素与细胞毒性药物配置间主要配置含有抗生素或细胞毒性药物的处方,本房间配备生物安全柜,使配置环境的洁净级别达到百级,且为负压,从而防止药品对工作人员的伤害。护士严格遵守无菌操作原则及时充配好药品并在其标签上签名或盖章。
2.6完成冲配的药物经传递窗或传送带等方式传送到成品核对包装区,进行再次核对与确认,并按照病区分类装入密闭的容器中,并附成品随行单,由专人送至各个病区。病区护士接收并核对,无误后,给患者用药。盛放药物的容器需能密封,且定期消毒,避免冲配好的药物受到二次污染。

⑷ 如何设定服务器中心

这样说的话
中心服务器就是将两个分公司的服务器,通过中心服务器来互联,在中心服务上生成一个公钥 和私钥文件,生成之后会提示文件的存放位置,将公钥文件发给要集群的服务器,在中心服务器上添加企业,输入名称和总机号码,密码可以设置,也可以不设置。在子公司的RTX服务器上RCA管理器中配置中心服务器连接,输入中心服务器的ip导入公钥文件,然后配置共享的组织架构。如果有不明白的M我吧。连接是实现文档。

⑸ 基于DNS搭建高可用Eureka注册中心

按Alt + 回车键,将会生成eureka-server.zip,解压缩后得到一个maven 项目,将该项目录入IDE。

我们首先来看一下pom文件,可以看出项目中引用了spring-cloud-starter-netflix-eureka-server, 并且springboot 的版本号为:2.1.2.RELEASE, Spring Cloud的版本号为:Greenwich.RC2RC2 表示还没有正式发布,只是第二个Release Candidate。
接下来我们只需要两个步骤,
a、修改EurekaServerApplication, 在@SpringBootApplication的注解上面,加入一个新的注解:@EnableEurekaServer
b、在resources 目录中加入application.yml 文件, 并配置以下信息:

一个简单的Eureka 注册中心就已经可以使用了,我们运行一下这个spring boot 应用,找开浏览器:localhost:8761,即可看到我们的注册中心就已经运行启来了。并且EUREKA-SERVER也注册到自己的注册中心了。

单节点的注册中心已经搭建完毕,但单节点的注册中心存在单点故障的可能,不能用于生产环境。生产环境的Eureka一般采用集群方式进行部署。

通过client.serviceUrl.defaultZone配置多个peer节点,因为是在单机上测试,所以修改了host文件,并且使用不同的端口号来启动注册中心。正式的生产环境请根据自己的实际情况进行配置,比如:第一台Eureka的IP地址为:192.168.0.100,则defaultZone配置其他三台注册中心http://192.168.0.101:8761/eureka/,http://192.168.0.102:8761/eureka/,http://192.168.0.103:8761/eureka/
依次启动4台注册中心,打开网页:http://localhost:8764

可以看到其它三台注册中心已经出现在已注册的replicas和可用的replicas列表里边。

如上图所示,4台注册中心,每台注册中心需要配置其他三台服务器,以Eureka 1为例,其配置如下:

注册中心是本应该是无状态的,可以横向扩展。但由于每台注册中心的配置都不一样,所以扩展起来比较麻烦,需要修改配置文件,这样就无法做到快速的扩容。

微服务客户端需要配置注册中心的地址,使用的是如下的配置:

由于配置的是固定的IP地址,如果我们要扩容注册中心,增加新的注册中心节点,那我们就需要修改微服务客户端的配置文件,将新的注册中心节点进入的服务器列表中。试想一下,如果有几十个微服务,每个微服务有4个节点,那将会要修改上百个配置文件。很显然这种方式不太可取,从软件设计角度来说,违反了开闭原则。

其实Eureka 注册中心还有另一种高可用配置方式,基于DNS。Eureka天生就可以部署在像AWS这样的公有云上,并且可以跨Region,跨Available Zone部署。虽然我们不用部署在云端,依然可以利用这一特性,我们可以把Region看作我们数据中心的机房,Avaiable Zone 看作是机房中的网络区域,结合内部DNS服务来实现高可用的注册中心。

画重点:
a. region: default,配置地区
b. useDnsForFetchingServiceUrls,表示基于DNS获取服务信息
c. eurekaServerDNSName: eureka.txzq.com.cn,配置域名服务器名称

键:txt.default.eureka.txzq.com.cn 值:shenzhen.eureka.txzq.com.cn
键:txt.shenzhen.eureka.txzq.com.cn 值:172.18.10.1 172.18.10.2 172.18.10.3 172.18.10.4

第一条记录表示,default 区域,包含了哪些可用区,我们用shenzhen表示是深圳机房,txt记录的值就设置为:shenzhen.eureka.txzq.com.cn
第二第记录表示 , shenzhen机房有哪些服务器,多台服务器使用空格格开。
如果在本地测试,需要搭建一台自己的DNS服务器,可以参考我的另一篇文章: 基于Docker快速搭建DNS Server

Client View是指DNS服务应用到哪一个网段,比如:172.18.10.0/24网段的IP连接到BIND服务器,才会解析指定的域名。

在添加域名的时候,需要指定Client View,这里我们选择我们刚刚创建的View_172.18.10.0,指的是只有在这个网段的IP访问这台DNS服务器,才能解析。

添加完一级域名后我们刷一下这个ZONE,然后设置一下本地DNS服务器

DNS域名服务器验证通过后,我们接下来就可以在为这个域名添加我们所需要的txt 记录了。

到这里我们的准备工作就已经基本完成了。使用Maven将注册中心编译成,输出jar包。新建一个Eureka的docker镜像,并启动4个容器。基于DNS的注册中心就搭建完毕了。

你只需要对DNS记录进行变更,就可以实现动态的、快速扩容/缩容了。

关于如何将Eureka部署到Docker,请参考另一篇文章:

⑹ 如何快速构建高可用集群

我们在信息中心的服务器中实施了虚拟化技术,任何一台物理服务器的断电都会导致多个虚拟机停止工作。一个高可用的(HA)集群系统可以帮助我们预防这种情况出现,当主机故障发生后,虚拟机可以在集群系统中迅速重建。举例来说,假设虚拟化集群中的一个物理节点失效,虚拟机可以迅速迁移到其他节点继续运行。在这种集群模式下,即使在服务器宕机的情况下,核心业务系统仍然可以持续地提供服务。
在Xen虚拟机可以被集群系统管理并实现在节点间自由迁移之前,所有节点必须具备访问虚拟机的配置文件及后端存储的能力。在本文中,TechTarget中国的特约虚拟化专家Sander van Vugt将讲述如何对它们实现共享访问。
实现对虚拟机配置文件的访问
实现虚拟机配置文件在所有节点的共享访问是非常简单的。首先,把文件存放在SAN系统中的逻辑单元号LUN(logic unitnumber)上;接下来,把LUN中/etc/xen/vm目录映射给节点中所有相关主机;最后,把配置文件设置为网络共享状态,使其所在目录可以被主机动态加载。或者您也可以在配置发生变化后,手动同步文件(而且这种变化并不会经常发生)。然而,为了虚拟机后端存储的共享访问,设置方式是完全不同的。
配置后端存储设备
这里提供两种不同的配置虚拟机后端存储的方法。第一种是,虚拟机默认状态下是把后端存储作为一个文件来处理的。在这种情形下,设置该文件可以被集群中的每个主机访问就可以共享了。同时,我们建议把该文件放置在安全的集群文件系统中,例如Oracle的Oracle Cluster FileSystem 2。
第二种更加简单的方式是,设置专门的设备作为后端存储。当创建虚拟机时,在安装过程中把逻辑卷配置为虚拟机的后端存储。这样,只需确保逻辑卷是位于SAN中的LUN上,并且可以被集群中的所有主机访问到就可以了。
配置Xen主机
在准备好多个Xen主机后,就可以开始创建集群系统了。首先,从主服务器上启动hb_gui终端,并认证为hacluster用户。接下来,选择Configuration进行配置,再选择Resources。在这页中,单击Add,对Primitive相关选项进行配置。最后,为resource命名输入其ID(在测试过程中,命名为\"Xen-node\"是个不错的选择)。下一步依次选择Class OCF, ProviderHeartbeat和Type Xen进行相应配置。全部完成后,点击Forward。
在下一个窗口中,我们可以进一步配置新Xen虚拟机的相应参数。选择Instance Attributes页,在xmfile参数中指定正确的Xen虚拟机配置文件。然后,提供虚拟机配置文件的完整路径并点击Apply。现在我们已经在集群中创建了源虚拟机。
到现在,在hb_gui终端的管理窗口中,我们已经可以看到源虚拟机了,但是它还处于非激活状态。右键点击虚拟机,选择Start。
恭喜,现在我们已经完成第一台集群系统中虚拟机的创建。

⑺ 架构高可用高并发系统的设计原则

通过学习《亿级流量网站架构核心技术》及《linux就该这么学》学习笔记及自己的感悟:架构设计之高可用高并发系统设计原则,架构设计包括墨菲定律、康威定律和二八定律三大定律,而系统设计包括高并发原则、高可用和业务设计原则等。
架构设计三大定律
墨菲定律 – 任何事没有表面看起来那么简单 – 所有的事都会比预计的时间长 – 可能出错的事情总会出错 – 担心某种事情发生,那么它就更有可能发生
康威定律 – 系统架构师公司组织架构的反映 – 按照业务闭环进行系统拆分/组织架构划分,实现闭环、高内聚、低耦合,减少沟通成本 – 如果沟通出现问题,应该考虑进行系统和组织架构的调整 – 适合时机进行系统拆分,不要一开始就吧系统、服务拆分拆的非常细,虽然闭环,但是每个人维护的系统多,维护成本高 – 微服务架构的理论基础 – 康威定律https://yq.aliyun.com/articles/8611– 每个架构师都应该研究下康威定律http://36kr.com/p/5042735.html
二八定律 – 80%的结果取决于20%的原因
系统设计遵循的原则
1.高并发原则
无状态
无状态应用,便于水平扩展
有状态配置可通过配置中心实现无状态
实践: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、Xdiamond等
拆分
系统维度:按照系统功能、业务拆分,如购物车,结算,订单等
功能维度:对系统功能在做细粒度拆分
读写维度:根据读写比例特征拆分;读多,可考虑多级缓存;写多,可考虑分库分表
AOP维度: 根据访问特征,按照AOP进行拆分,比如商品详情页可分为CDN、页面渲染系统,CDN就是一个AOP系统
模块维度:对整体代码结构划分Web、Service、DAO
服务化
服务化演进: 进程内服务-单机远程服务-集群手动注册服务-自动注册和发现服务-服务的分组、隔离、路由-服务治理
考虑服务分组、隔离、限流、黑白名单、超时、重试机制、路由、故障补偿等
实践:利用Nginx、HaProxy、LVS等实现负载均衡,ZooKeeper、Consul等实现自动注册和发现服
消息队列
目的: 服务解耦(一对多消费)、异步处理、流量削峰缓冲等
大流量缓冲: 牺牲强一致性,保证最终一致性(案例:库存扣减,现在Redis中做扣减,记录扣减日志,通过后台进程将扣减日志应用到DB)
数据校对: 解决异步消息机制下消息丢失问题
数据异构
数据异构: 通过消息队列机制接收数据变更,原子化存储
数据闭环: 屏蔽多从数据来源,将数据异构存储,形成闭环
缓存银弹
用户层:
DNS缓存
浏览器DNS缓存
操作系统DNS缓存
本地DNS服务商缓存
DNS服务器缓存
客户端缓存
浏览器缓存(Expires、Cache-Control、Last-Modified、Etag)
App客户缓存(js/css/image…)
代理层:
CDN缓存(一般基于ATS、Varnish、Nginx、Squid等构建,边缘节点-二级节点-中心节点-源站)
接入层:
Opcache: 缓存PHP的Opcodes
Proxy_cache: 代理缓存,可以存储到/dev/shm或者SSD
FastCGI Cache
Nginx+Lua+Redis: 业务数据缓存
Nginx为例:
PHP为例:
应用层:
页面静态化
业务数据缓存(Redis/Memcached/本地文件等)
消息队列
数据层:
NoSQL: Redis、Memcache、SSDB等
MySQL: Innodb/MyISAM等Query Cache、Key Cache、Innodb Buffer Size等
系统层:
CPU : L1/L2/L3 Cache/NUMA
内存
磁盘:磁盘本身缓存、dirtyratio/dirtybackground_ratio、阵列卡本身缓存
并发化
2.高可用原则
降级
降级开关集中化管理:将开关配置信息推送到各个应用
可降级的多级读服务:如服务调用降级为只读本地缓存
开关前置化:如Nginx+lua(OpenResty)配置降级策略,引流流量;可基于此做灰度策略
业务降级:高并发下,保证核心功能,次要功能可由同步改为异步策略或屏蔽功能
限流
目的: 防止恶意请求攻击或超出系统峰值
实践:
恶意请求流量只访问到Cache
穿透后端应用的流量使用Nginx的limit处理
恶意IP使用Nginx Deny策略或者iptables拒绝
切流量
目的:屏蔽故障机器
实践:
DNS: 更改域名解析入口,如DNSPOD可以添加备用IP,正常IP故障时,会自主切换到备用地址;生效实践较慢
HttpDNS: 为了绕过运营商LocalDNS实现的精准流量调度
LVS/HaProxy/Nginx: 摘除故障节点
可回滚
发布版本失败时可随时快速回退到上一个稳定版本
3.业务设计原则
防重设计
幂等设计
流程定义
状态与状态机
后台系统操作可反馈
后台系统审批化
文档注释
备份
4.总结
先行规划和设计时有必要的,要对现有问题有方案,对未来有预案;欠下的技术债,迟早都是要还的。
本文作者为网易高级运维工程师

⑻ maxwell如何实现高可用

一旦我们在信息中心的服务器中实施了虚拟化技术,任何一台物理服务器的断电都会导致多个虚拟机停止工作。一个高可用的(HA)集群系统可以帮助我们预防这种情况出现,当主机故障发生后,虚拟机可以在集群系统中迅速重建。举例来说,假设虚拟化集群中的一个物理节点失效,虚拟机可以迅速迁移到其他节点继续运行。在这种集群模式下,即使在服务器宕机的情况下,核心业务系统仍然可以持续地提供服务。
在Xen虚拟机可以被集群系统管理并实现在节点间自由迁移之前,所有节点必须具备访问虚拟机的配置文件及后端存储的能力。在本文中,TechTarget中国的特约虚拟化专家Sander van Vugt将讲述如何对它们实现共享访问。
实现对虚拟机配置文件的访问
实现虚拟机配置文件在所有节点的共享访问是非常简单的。首先,把文件存放在SAN系统中的逻辑单元号LUN(logic unitnumber)上;接下来,把LUN中/etc/xen/vm目录映射给节点中所有相关主机;最后,把配置文件设置为网络共享状态,使其所在目录可以被主机动态加载。或者您也可以在配置发生变化后,手动同步文件(而且这种变化并不会经常发生)。然而,为了虚拟机后端存储的共享访问,设置方式是完全不同的。

⑼ 如何为高可用集群Hyper-V系统选择合适的硬件配置

和其他的虚拟机技术环境中不同的是,Hyper-V不能支持内存过分配技术(memory
overcommit
)。因此,当创建的虚拟机所占用的内存总数大于主机实际的物理内存时,您将无法启动虚拟机。如果您在分配完可用物理内存之后,尝试去启动另外的虚拟机,即
使只是再多分配一台,结果只有一种可能就是返回错误提示信息。
如果在一台服务器环境中,这不会是一个大问题,因为所有的虚拟机启动过程都是由管理员人工管理的。在带有自动故障切换技术的集群环境中,这点就会变成一个
很大的障碍。因此,搭建一个拥有足够的可用物理内存的Hyper-V集群环境就变得非常重要,只有满足这个条件后主机才可以成功的从发生故障的源节点切换
到集群中的可用目标节点。这也就是说,如果在一个拥有两个节点的集群中,一半的物理内存必须预留出来;假如拥有四个节点,就意味着需要预留四分之一的物理
内存,以此类推。
简单错误三:缺少支持CSV(Cluster
Shared
Volume,即集群共享卷)技术的备份方式
在Windows
Server
2008
R2中,微软发布了一项称为Cluster
Shared
Volume的新技术。它基于现有NTFS格式文件系统基础上,为Hyper-V虚拟机提供特殊功能支持的技术。您可以把这项技术认为是R2版本的一个属
性,使得分布在集群中的多个虚拟机可以同时访问一个共享的LUN。这项新技术解决了集群中的节点失效时,磁盘子系统也作为其一部分而无法工作的情况。允许
必要情况下,虚拟机可以在一个LUN内无缝地迁移。
CSV技术面临一项潜在的挑战,那就是:很少有基于虚拟主机的备份产品可以支持。今天,甚至于
微软的Windows
Server
Backup也无法实现支持。即使这样,还是有一些像Data
Protection
Manager
2010(仍然只有测试版本)这样的产品,可以实现对这种工作方式的支持。
简单错误四:对虚拟CPU的过度分配
今天,用户购买带有两个及更多物理CPU的服务器已经很普遍。拥有更多的CPU意味着多线程应用程序可以在多个CPU之间实现负载均衡。或者当其中一个
CPU被某个单线程应用所占用时,还可以使用剩余的CPU来满足其他应用的需求。这就是为什么现在几乎所有的服务器都有至少两个甚至有时是四个或更多
CPU的原因。现在的数据中心工作负载需要配备额外的处理器资源以满足性能以及可用性方面的需求。
在Hyper-V的虚拟化环境中,对虚拟处理器的分配方式是比较特别的。Hyper-V的虚拟机环境中的最佳做法是:在初期只为一台物理机分配一个单独的虚拟处理器,只有在需要的情况下才去分配额外的处理器资源。
虽然表面看起来增加虚拟处理器数量是一个很好的方式,但实际上这种操作反而会由于调度管理上引起的冲突而降低性能。当多个虚拟处理器被分配给虚拟机后,
这些处理器必须通过调度管理的方式,把它们的使用情况跟实际的物理资源对应起来。假设两个虚拟处理器分配给一台虚拟机,hypervisor的调度程序
(scheler)必须等待对应的两个物理处理器都可用后再去分配虚拟处理器。当在多个虚拟机竞争处理资源时,每个请求的响应时间会变得比普通情况长
得多。当物理处理器的个数少于所有虚拟机中分配的虚拟处理器之和时,情况甚至还会变得更糟。(关于这种情况为什么会产生,您可以参考文章
Microsoft
Developers
Network
site中的Measuring
Processor
Performanc部分。)
还有,请时刻谨记,管理程序(hypervisor)分配的虚拟处理器需要横跨服务器上所有可用的物理处理器。这样,虚拟处理器才可以充分利用所有可用的物理处理器资源。

⑽ 如何在Kubernetes中部署一个高可用的PostgreSQL集群环境

虽然 kubernetes 社区一直在努力使得有状态应用成为一等公民,也推出了 statefulset 控制器支持 pod 的顺序部署,稳定的域名访问和存储访问。但鉴于 MySQL 部署运维的多样性和复杂性,在 kubernetes 上部署 MySQL 仍然要面临众多挑战。
1、业务流量入口的配置方式
传统虚拟机环境下,我们通过虚IP的方式,让业务应用都配置事先定义的一个虚IP为链接数据库的地址,然后由高可用服务保证虚IP始终能被路由到master数据库。在kubernetes中,出现了一层网络插件屏蔽了底层网络拓扑,高可用服务管理虚IP的方式需要随之适应调整,比如通过service结合标签完成虚IP的漂移,但service本身是kubernetes提供的一项功能,其可靠性和性能都取决于kubernetes服务的稳定。以性能来说,service是kubeproxy组件通过配置iptables实现的,当iptables规则较多时不可避免的会产生时延,需要我们针对性的解决。
2、容器隔离带来的监控视野问题
在 kubernetes 中,如果将 MySQL 制作为 container 运行在一个 pod 中,container 会将 MySQL 进程和运行环境隔离在一个单独的 namespace 中。监控组件在获取 MySQL 的一些 metirc 时,可能不得不进入与 MySQL 同一个 namespace 中,在部署和设计监控组件时需要考虑到这些限制。
3、存储在 kubernetes 中,支持配置各种不同的存储。
如果使用本地存储 local persistent volume,则需要绑定 MySQL 在一个固定的节点,这就完全浪费了 kubernetes 灵活调度的天然优势;而如果使用远程共享存储,确实是将 MySQL 进程与其存储完全解耦,使得 MySQL 进程可以在任意节点调度,然而考虑到高 I/O 吞吐量的情况,就不是那么美好了。设计时需要考量远程存储是否能够满足 MySQL 的带宽要求。
4、高可用/备份恢复
kubernetes 提供的 statefulset 控制器只能提供最基本的部署,删除功能,无法实现完善的 MySQL 集群高可用/备份恢复操作。对于有状态应用的部署,仍需要定制开发,所以多数公司提供了定制的 operator 来完成应用容器的管理。比如 etcd operator,MySQL operator,后文将为大家详述我测试使用 MySQL operator 的一些记录。

热点内容
制作自解压安装 发布:2025-03-20 05:41:49 浏览:303
华为连接电视密码是多少 发布:2025-03-20 05:31:11 浏览:493
算法第五版 发布:2025-03-20 05:17:57 浏览:730
湖南台访问 发布:2025-03-20 05:10:32 浏览:38
脚本和秒抢 发布:2025-03-20 05:06:29 浏览:591
b35锁如何设置密码 发布:2025-03-20 05:06:27 浏览:905
淘宝如何租云服务器 发布:2025-03-20 05:05:12 浏览:213
编程忌讳 发布:2025-03-20 04:58:35 浏览:427
国家知识产权专利数据库 发布:2025-03-20 04:54:29 浏览:416
win7怎么给文件夹设密码 发布:2025-03-20 04:52:38 浏览:725