现状一现有MES系统不堪重负
随着企业规模的扩大,生产线数量快速扩张(从40条生
产线扩展到未来的1000多条), 同时传感器和检测系统
每天产生大量的数据,如果仍然采用原有的架构将不堪
重负(。 性能和吞吐量等非功能性需求开始超越功能性
需求,成为决定软件架构的关键性驱动力量。
为了应付未来公司业务规模的高速扩展,必须作出具有
前瞻性的设计。
问题
大数据建设的关键,是解决系统的关键性非功能需求,
尤其是下面的四个方面:
吞吐量(扩 展性) 高性能
海量存储 高可用
以交通运输系统来比喻:吞吐量可类比道路的车道数量
可容纳多少辆车同时跑(而不用显著降低车辆的行
驶速度) ;高性能可类比车辆的速度一每辆车 可以跑
得多快;海量存储可类比停车场一可以容纳多 少辆车
同时停放;高可用意味着道路上一-直有车在跑,一两辆
车的故障不会使整个运输系统失效。
解决问题
解决方案由两部分组成:
大数据基础设施建设,主要解决吞吐量(扩展性)、 海
量存储和高可用问题,并部分解决性能问题;
业务设计和代码重构,主要解决性能问题。
为了实现上面的四个非功能性需求,以及异构集成的需
求,我们设计了新的大数据平台架构,整体架构如图
数据分流
结构化数据(生产和生产支持)存储在关系数据库(MySQL和
Greenplum)上, 半结构化数据(传感器和检测)存储在
HBase上,非结构化数据(图片、 视频和文件)存储在TFS上。
主数据作为全局表,存储于所有的MySQL分片服务器上;事务
性数据分片存储到不同的MySQL分片服务器上。
实时数据存储于MySQl数据库和HBase上,历史数据和统计性
数据存储于Greenplum上。
所有的数据最终汇聚到Greenplum,用于永久存储和数据分析。
数据分流
通过将非结构化数据和历史数据分别分流到HBase、Greenplum和TFS, MySQL
中只储存主数据和在制品(正在制造,未交付给客户的产品)的事务性数据,已经
大大减少生产数据库MySQL要存储的数据量。但是,为了进-步提高性能和吞吐
量,我们还需要使用MyCAT对MySQL进行分片。
分片决策:
分片的最高原则是:绝不允许跨分片关联(例如分片A中的一行数据的一个外键列关联到分片B中的一-行数据的主键列),但允许跨分片聚合(从多个分片中获取数据,聚合为- 个总数据集返回给用户)
暂定以生产单元(各个生产公司)作为分片依据。如果每个公司的规模不均匀,可能要选择其他的分片字段,例如产品条码。
主数据存储于每台分片服务器上,不同生产单元的事务性数据保存在不同的分片服务器上。因为事务性数据关联主数居,这样的设计可以使得关联可以局限在分片内部。
主从表(例如订单表和订单条目表)中的数据行必须划分到同一个分片,以消除跨分片关联的需要。
分片中最重要的决策是为每个数据表选择分片字段。在不允许跨分片关联的前提下,让数据尽可能均匀地分布在多个分片服务器上,而且当未来数据规模增长时,能够比较容易地通过增加更多的分片服务器来扩展系统的存储能力。
集群和高可用
每个MySQL分片用三台服务器做主-从-备配置,以保证高可用
和数据安全。
部署4个MyCAT集群服务器,以保证高可用和高并发。
LVS服务器采用主/备方式保证高可用。
HBase采用标准的集群和高可用方案,消除单点失败的可能。
TFS采用主/备方式部署Master节点,通过数据节点冗余备份。
计算
1 应用服务器集群和负载均衡
2 缓存服务器Redis
3 用全文检索代替大表模糊查询
4 SQL重构
5 用响应式编程取代触发器
6 并发、并行和异步编程
接入
Netty
Netty是一个高性能高并发的Socket通信设施。
在卓越制造平台中建立Netty高性能Socket通信服务器,接收传感
器和检测系统发送过来的海量数据。Netty可充分应对这方面的高
并发需求。未来的产线系统也通过Netty将产线系统的数据上报到
卓越制造平台。
ActiveMQ
ActiveMQ用于在卓越制造系统和ERP、OA等第三方系统之间的通
信上。另外,卓越制造平台也通过ActiveMQ向产线系统下发生产
指令。
WebSocket
WebSocket接受系统中产生的事件,向分布在各厂区的电子显示
屏广播,例如呈现传感器的时间序列数据。
总结
改进建议总结如下:
将单一数据库拆分为物料、库存、设备、工艺、品质和生产五个独立的
数据库以降低并发压力。提供自动化封装,使得分库对开发入员透明。
将单一数据库拆分为物料、库存、设备、工艺、品质和生产五个独立的
数据库以降低并发压力。提供自动化封装,使得分库对开发人员送明。
对生产数据库中的大表进行分片以降低并发压力。建议按产品码分片。
冗余存储关联表的不安字段。
冗余存储计算字段。
通过全文检索,根据要宣询的关联表的字段反宣到其ID,然后根据这个
ID在当前表中进行单表查询。
根据外键D,全文检索到关联表的其他字段,呈现给用户。
用全文检索取代模糊查询。
通过缓存加速查询速度。
用事件驱动的方式处理大粒度事务。
离线报表用Hive + Spark实现。
实时报表用Spark即时计算出来。