system: [SYSTEM]

user: 3. 存储设计 存储模块主要包括多维因素数据(机械传动部分、电机运行特性、测试环境等因素) HBase存储、常规数据(电动葫芦基本信息注册数据、多种检测任务周期信息等) MySQL存储以及热点数据(检测任务周期的实时数据) Redis存储，实际部署环境拓扑图如图3。 图3. 部署数据库拓扑图 3.1. 多维因素HBase数据库 HBase是一个列存储、多维度 [ 8 ] 、可伸缩、结构稀疏的分布式nosql数据库，数学模型可以看成以行键(Row Key)、单元(Cell)、时间戳(timestamp)标识的Map数据结构的数据库 [ 9 ] ，其中，单元包括列族(Column Family)、列标识(Column Qualifier)，每个列族包括多个列标识，创建表时，仅需定义表名与列族，列标识也无需预定义，因此不同行键对应的同一列族的列标识可以不一致。定位数据也必须指定行健、列族名、列标识名、版本号(时间戳)。 列存储中查询中的索引规则是通过列来定义，因此HBase中数据本身即索引，每次查询只会访问涉及的列，极大的降低了IO操作频率，同时，每一列的字段数据类型一致，列聚集存储可以进行高效压缩，节省物理空间。能效数据统计模型、能效分级等数据分析需求的数据量较为庞大，出于存储、索引性能、多维因素存储的考虑，HBase成为最佳选择。能测信息管理系统整合HBase存储多维因素数据步骤如下： 1) 在Spring Boot中引入hbase-client以及spring-data-hadoop依赖； 2) 设置好quorum与port后，配置Hbase Properties与HBase Configuration获取Hbase Template与Connection实例；应用Connection实例，获取表名称( Table Name)、行键(Row Key)、列族(Column Family)、列标识(Column Qualifier)等信息实现create、put、scan、get、count等操作，并封装成Service类； 3) 调用HBase Service类创建表，列族(含有多个列标识)对应机械传动部分因素(电动葫芦型号、电机、传动摩擦)、电机运行状态(运行速度、电机功率)、测试环境(不同工作级别、起重量、起升高度)。 为了便于展示列族与列标识，针对Row Key为id1时，展开列族的数据结构见表3。 Table 3 Attributes of column family in multidimensional factor data tabl TableName Row Key Column Family Column Qualifier multid_factor id1 mechanical type， motor， friction electrical speed， power environmental level， weight， height 表3. 多维因素数据表的列族属性 多维因素数据表multid_factor数据模型见表4。 Table 4 HBase multidimensional factor data table multid_facto Row Key timestamp Column Family: mechanical Column Family: electrical … column: type column: motor column: friction column: speed column: power … id1 1539576300 {type:， motor:， friction:} {speed:， power:} … id2 1539576330 … … … … … … … … 表4. HBase多维因素数据表multid_factor 优化配置措施： 1) 由于过多的Column Family之间会互相影响，本系统限制每张表列族不超过4个；列族名、列标识名的长度影响I/O读写的性能以及发送的数据量，设置简洁。 2) Row Key是HBase的key-value存储中的key，HBase通过对Row Key按字典序(存储排序)来建立索引，本系统考虑存储数据scan范围较大的特点采取散列字段(高2个字节，0~65，535程序循环产生)+时间字段(低4个字节，保留小时分钟毫秒)的组成方式优化Row Key的Hash以获得固定长度的Row Key，使数据分布均匀，均衡负载。 3.2. 常规MySQL数据库 MySQL是一个关系型数据库管理系统，表结构涉及字段名称、字段类型、字段长度、是否为空、主键；表操作支持insert、delete、update、select (条件、排序、分组、多表等)；支持事务以及配置事务粒度；表间关系支持多种关联映射；表数据有多种约束类型，如primary key(PK)、unique等。 能测信息管理系统使用MyBatis及相关组件整合MySQL步骤如下： 1) 在Spring Boot中引入mybatis-spring-boot-starter，添加mysql、jdbc相关依赖spring-boot-starter-jdbc、mysql-connector-java； 2) 配置MySQL远程地址、登录信息、驱动名称、线程池信息等； 3) 创建常规数据(检测执行人、检测时间、工作周期等基本信息)、实时热点数据(时间、高度等)的实体类，创建数据操作相关方法的接口Interface，使用通用Mapper组件配置生成对应的MapperXML进行数据库CRUD操作，使用PageHelper组件实现物理分页；同时，可以创建Service进一步封装上述的数据操作相关方法，对外仅暴露Service，降低系统模块耦合度； 4) 开启事务，方法级别指定事务管理器，配置事务传播行为、隔离级别、读写类型等； 检测任务相关信息表detect_info数据模型见表5。 Table 5 Table data model of information related to detection tas 名称 类型 长度 NULL PK 数据举例 id int 11 not null primary key {1，2，3，4，…} execStaff varchar 24 null no {甲|乙|丙|…} workLevel string 10 null no {M1|M2|…|M8} operationSpeed string 10 null no {Single|Double} updateTime date default null unique {3.24，4.19，5.27，4.28，…} 表5. 检测任务相关信息表数据模型 优化配置措施： 1、使用Druid Spring Boot Starter集成Alibaba Druid数据库连接池与监控，Druid数据库连接池，监控数据库访问性能，统计SQL的执行性能。 2、AOP切换多数据源数据库，实现读写分离。 3、@Transational注解事务，实现非侵入式的方法级别的事务回滚。 3.3. 热点Redis数据 Redis是一款支持String、List、Hash、Set、Sorted Set数据类型的内存高速缓存数据库，key-value存储类型使得数据查询性能极高，支持主从模式，支持持久化，支持事务，set/get、add/remove等都是原子操作。 管理系统使用Redis存储检测任务周期的实时数据，用以图表显示、即时分析、能效计算等，并设置key的过期时间为检测周期的2倍，过期之前不采用redis持久化，而是转存于MySQL成为常规历史检测数据；系统以主备方式保证Redis的High Availability，redis-master以异步rehash的方式保证redis-slave数据同步，实现数据最终一致性。 能测信息管理系统整合Redis步骤如下： 1) 基于Spring Boot架构，使用spring-boot-starter-data-redis引入redis； 2) 添加配置文件，设置spring.redis.host、spring.redis.port等Redis服务器与连接池信息； 3) 使用RedisTemplate进行set、get、add、remove、hasKey等操作。 数据模型见表6。 Table 6 Data type stored by Redi Key 类型 操作 子系统下指标常权 execTimeSec list lpush {3.00，15.00，18.00，…} workLevel string set {M1|M2|…|M8} operationSpeed string set {Single|Double} height list lpush {3.24，4.19，5.27，4.28，…} 表6. Redis存储的数据类型 优化配置措施： 1、redis-master不做任何持久化工作，转存至MySQL代替RDB内存快照、AOF日志文件。 2、主备方式代替主从方式，对外提供一个虚拟IP(VIP)，keepalived保证Redis HA，WEB app通过VIP进行存储操作，正常时主机redis-master提供服务，宕机时VIP自动漂移到备机redis-slave上；另外，主备数据同步使用异步同步，在性能得到保证的同时，最终一致性已足够需求。