公司定义了所有软件系统需要有4个9的可靠性,姑且不论这是外行还是伪内行提出的,在国企领导的话就是规章。(虽然现在运行的系统达到2个9的都很少)。这个先抛开不论,
本人是去IOE的严重支持者。本文基于X86平台和开源软件为基础,虽然这样的架构在国企不受待见,原因大家都应该明白。不想在系统建设中担责任的人员请绕行。本文就自己的理解写写如果要建设一个接近4个9的系统该做些什么。
硬件可靠性:
服务器:在X86体系中,现在普遍使用的双路服务器,由于主板和raid卡是单点,加上CPU是CISC结构,双路的又较少RAS特性,单机的可靠性最多也就3个9。
交换机:交换机单机可以做到5个9的运营商级别,可以使用VRRP/HSRP实现主备,这部分不在本文讨论范围。
负载均衡设备:F5,A10都可以支持主备,但是和IOE一样,贵的离谱。本文考虑用LVS,nginx等方案,个人认为和LVS比起来,F5,A10的性价比为零。
整体考虑:
现代的软件系统一般都至少有负载均衡,应用和数据库三层,要保证4个9,每层都需要在4个9以上,系统至少不能有单点失效(SPOF)。由于企业应用还是已JAVAEE为主,这里的应用层只关注JAVA的,至于是否java就是企业应用最适合的语言,另外写文章讨论(见
JAVA是否最适合企业应用开发)。
下图是个整体方案,mysql使用DRDB方式
相关硬件软件:
服务器:双路带管理的IBM,HP,DELL服务器,如果使用ISCSI,选取带TOE的网卡
ISCSI:带TOE网卡的存储服务器,如dell R720XD,这里不讨论FC SAN和DAS。
交换机:CISCO/H3C带网管交换机
---------------------------------
操作系统:CentOS6,TCMALLOC
负载均衡:LVS,KeepAlived,Nginx
应用服务器:Tomcat,APR,Nginx
数据库服务器:mariaDB,HeartBeat,DRBD
缓存/KV:redis,redis sentinel
JOB:quartz数据库集群
运维:cacti,nagios
代码检查:CheckStyle,PMD,findbug
下面分层讨论:
LVS
LVS可以工作在3层或4层,通常使用三层的DR(Direct Routing),这需要ARP转发,故交换机上不能禁。另外需要VIP和RIP在一个网段,公网IP不在时可以使用内网IP转发,但实测内网转发nginx时,反向代理没问题,fcgi有问题。
LVS使用VRRP的keepalived进行报活和故障转移
LVS性能优秀,因为只在内核中处理,不会调用fd。在i3-2100,broadcom 5709实测可以达到20w/s的转发速率。但CPU的1个核会被网卡软中断压到99%。在使用支持RSS的网卡(intel 82576)和e3-1230下,系统性能和稳定性都很好。
nginx
虽然在使用java的环境里,部署nginx还是有很大必要的。
1、nginx做反向代理:这样可以使得tomcat部署更具灵活性(如虚拟机部署,多端口部署)
2、静态资源的处理:一般情况下,如果有比较大并发压力时,静态资源需要web服务器分开域名部署,nginx是十分可靠,性能十分强(epoll)的web服务 器,而且有强大的插件体系。
3、文件上传下载:JVM处理上传下载极易导致频繁的fullgc。这时比较理想的做法是使用nginx+fcgi/php来完成,系统互通可以使用性能接近变态的thrift。
Tomcat+APR
本人一直认为java应用的可靠性是比较难做上去的,主要是JVM的共享HEAP和stop world的 fullgc机制,另外java语言的exception特性也导致很多问题(本人更喜欢C/C++的fail fast)。
由于现代的很多javaee框架还是以thread local为根本,Tomcat只能按照thread pool的方式来部署,添加APR(apache portable runtime)后,线程调度和IO有明显改善。
另外一个要注意的是JVM的调优,因为JVM并不能有效管理太大内存(8G以下),另外垃圾回收算法也是一个影响性能和稳定性的因素。一般情况会使用类似如下的JVM参数。
-server -Xmx3500m -Xms3500m -Xss256k -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection
数据库
开源关系数据库主要是mysql和postgresql。mysql是线程连接,postgresql是进程连接,对于JAVA使用连接池来说,可能postgresql更好些。但是从多方面对比,还是倾向于mysql。参考
http://www.wikivs.com/wiki/MySQL_vs_PostgreSQL
由于oracle手下的mysql已经不是个东西了,选择了创始者创建的mariadb5.5分支,另外percona也不错。关于mariadb,会单独写文章讨论。
DRBD:通过TCP协议实现的块设备复制的应用,原理图如下(来自官方)
mariadb的HA使用DRBD和Heartbeat实现,这种方案要注意心跳线的问题,防止脑裂产生,建议使用2-3条心跳线,如串口Null Modem Cable,交叉网线,fence(Drac/IPMI,iLO,RSA-II)。
其它考虑:
操作系统和malloc
操作系统使用基于RHEL源码的CentOS6,在国内,由于红帽的技术支持十分单薄,有没有技术支持差别不大。centos6是基于2.6.32的内核,支持RSS,FUSE等。
TCmalloc:是google使用C++实现的malloc,对多线程支持相当好,内存使用的稳定性远好于libc的malloc,另外基于BSD的jemalloc也是可以考虑的。本人在mariaDB,nginx,redis的使用中都使用了TCmalloc,但拒绝使用LD_PRELOAD方式。
集中式session
为了增强系统的可扩展性,可以考虑share nothing的架构,将session用redis集中管理,tomcat的redis session插件可参照
https://github.com/jcoleman/tomcat-redis-session-manager
同样也可实用session wrapper的方式将httpsession转换为redis数据
这样可以避免传统集群session复制的低效,session sticky的用户体验差等问题。
redis是高效动态分配内存的KV内存数据库,比之memacached没有命中问题,并且有多种实用数据结构
redis的可以使用原作者redis sentinel的HA方案,具体见
http://redis.io/topics/sentinel
代码检查
java是最流行的企业应用开发语言,有大量的开发着,但是水平是参差不齐的。尤其是一些过度设计的框架,如hibernate,struts2(webwork时尚好)。使用不到位都会使JVM变得不稳定,性能出现波动,乃至假死。使用findbug/PMD来检查代码隐含的漏洞,这是一个较简单的提升代码质量的方法,能解决一部分问题。就我的经验,即便是IBM的开发人员(其实也是外包),检查一下也是大批的BUG。更多信息见
类国企的软件开发过程和工具集
运维监控
系统的可靠性依赖好的运维策略,对于上述的架构,计算了以下整体可靠性在99.7左右,离4个9还有不少差距。主要是数据库的问题,用ISCSI块共享存储要好很多。这个另外讨论。
那么自动化的运维监控就是解决问题的一个补充。(我们公司在这方面做的有点
,而且还发明了好多新词,如巡检,呵呵,虽然我不是专注运维的)
使用cacti+nagios实现图形化的监控网络流量,主机资源,服务健壮性等。从而实现实时的故障通知,运维人员可以第一时间查找和处理问题。加上系统架构设计的是可以优雅的重启,所以会快速恢复普通故障。
细节不写了,上两张监控图做纪念。
mysql的
nagios的
乱七八糟的写了一些,作为告别IT行当前回顾这10年的工作的第一篇文章。
另外建议女ITer趁早离开技术行当,别像我一样傻傻的坚持了10年。
- 大小: 40.2 KB
- 大小: 19.4 KB
- 大小: 63.5 KB
- 大小: 134.1 KB
分享到:
相关推荐
成晓平在其论文《矿山机械设备自动化供电系统可靠性思考》中,系统地分析了矿山供电系统的可靠性问题,并对相关管理策略进行了探讨。以下内容将详细解释与供电系统可靠性相关的几个重要知识点。 1. 供电系统可靠性...
4. 系统可靠性增强措施 - 采用冗余技术提升网络通信的可靠性。 - 光电传感器和网关协同工作,实现信号的有效管理和数据交换。 5. 结论 基于总线的矿山自动化供电系统通过集中控制和智能化管理,显著提升了设备...
综上所述,矿山机械设备自动化供电系统的可靠性是一个多维度的问题,涉及了电力工程、自动化技术、设备管理等多个领域的知识。只有全面理解和掌握这些要点,才能确保系统的稳定运行,为矿山生产提供坚实的电力保障。
4. 直流PWM变换er-电动机系统的动态性能:包括开关频率的影响、电流的连续性、谐波的减少、电动机损耗和发热的减少等。 5. 直流脉宽调速系统:包括电枢两端的电压、电流的存在性等。 6. 反并联二极管的作用:包括...
2. 系统可靠性的概念:在自动化控制设备的语境下,系统可靠性指的是设备在规定条件下和规定时间内完成规定功能的能力。高可靠性意味着设备更不容易出现故障,即使出现故障也能迅速恢复正常工作。 3. 可靠性提升策略...
综上所述,要提升电子设备的可靠性,设计人员必须在系统层面进行全局思考,关注微观设计中的每一个细节,并在设备的过渡过程中严格把控,避免瞬态效应引发的故障。通过这三个层面的深入分析和综合考虑,可以在很大...
#资源达人分享计划#
这篇压缩包中的“关于电气自动化控制设备可靠性测试的思考.pdf”文档,很可能会探讨这一主题的各个方面,包括但不限于测试的目的、方法、标准以及如何通过测试提升设备的可靠性。 首先,我们要理解可靠性测试的基本...
- 可靠性:由于内核较小,出错概率低。 - 支持分布式系统:便于构建分布式应用。 - 支持面向对象的操作系统:更易于实现面向对象的设计理念。 - **缺点**: - 性能开销:所有进程都需要通过微内核进行通信,可能...
其自研的基于开源Linux的操作系统,具备高可靠性、高安全性和高实时性等特点,特别适合于5G时代的物联网应用场景。 - **上海华元创信的成就**:该公司研发的锐华高安全嵌入式操作系统(ReWorksCert)已经通过了IEC...
电气自动化控制设备是现代工业生产中不可或缺的重要组成部分,其可靠性直接关系到生产活动的稳定性和产品的质量。可靠性测试作为确保电气自动化控制设备稳定运行的关键环节,对于提升设备的性能和质量有着至关重要的...
油罐自动计量系统中的罐前处理器取舍问题是一个复杂的技术问题,需要从多个方面进行分析和解决,需要考虑系统的整体性能和可靠性,选择合适的罐前处理器,以提高系统的整体性能和可靠性,并降低系统的维护成本和故障...
4. 硬件和软件是企业信息系统的两个非常关键的因素,因为软件具有很强的虚拟化特征,进而增加了项目管理的复杂程度。 二、企业信息系统开发安全的思考 1. 立项阶段 在项目立项环节,业务主管部门应评估新建信息...
安全品质等级(SIL)是衡量安全系统可靠性和性能的标准,IEC 61508将其分为四个等级(SIL1到SIL4),而DIN V 19250则设置了更为细致的八级标准(AK1到SIL8)。SIL的确定通常依据风险评估,这涉及到对风险发生的频率...
每一层的架构设计都要保证数据的安全性、系统的可靠性以及业务的连续性。设计时应进行风险评估,确保各层次的安全措施到位。 在项目安全策略的实施过程中,必须考虑岗位设置、设计方案、制度机制、员工安全意识以及...
首先,PLC的抗干扰能力较强,提高了系统的可靠性,减少了接地数量和由于接触不良导致的系统故障。其次,PLC具有较高的性价比,能够使用小型PLC系统实现复杂的控制目标,满足多样化控制需求。第三,PLC的安装、调试和...