Redis集群在有轨电车车载系统中的应用

2018-02-27 03:25昕,黄
现代城市轨道交通 2018年2期
关键词:实例车载内存

高 昕,黄 真

(国电南瑞科技股份有限公司,江苏南京 210061)

1 Redis 介绍

Redis 的全名为远程字典服务(Remote Dictionary Server),它是一个基于内存的键-值(Key-Value)数据库,在很大程度上弥补了内存缓冲存储的匮乏[1]。Redis 为 Value 提供了非常灵活的数据形式,主要包括字符串(String)、链表(List)、集合(Set)、有序集合(Zset)及哈希表等[2]。对于不同的存储需求,Redis 中总可以找到相应的键-值数据类型来匹配,例如将 String与 Json(JavaScript 对象表示法)进行结合,可以将完整的数据结构存入值中,而哈希表的方式又为成员变量的快速存取提供了极大的方便。Redis 在将数据实时写入内存的同时,可以根据系统设计的需要,采用快照存储(Snapshotting)或附加文件(AOF)的方式将数据进行持久化[3],一定程度上保证了数据安全,防止系统故障等意外事故对重要数据的影响。

Redis 支持多个实例的集群,采用一主(Master)多从(Slave)的方式,主/从之间采用数据复制的方式,可以将因单一 Redis 实例故障而导致的数据丢失及系统故障的概率降至最低,且结构上支持多级主/从[4]。集群内的主/从复制功能对双方都不会产生阻塞(图1),从节点可以只当作主节点的数据冗余备份,也可以提供只读命令来减轻主节点服务器的压力[5]。

图1 主/从复制原理

2 Redis-Sentinel 服务及发布/订阅机制

2.1 Redis-Sentinel 服务

Redis-Sentinel 是 Redis 官方推荐的高可用性解决方案,其本身也是一个独立运行的进程,它能监控多个主/从集群,发现主节点宕机后能进行自动切换。主要有以下功能。

(1)监控:Sentinel 时刻监控 Redis 是否按照预期良好地运行。

(2)提醒:如果发现某个 Redis 节点运行出现状况,能够通知集群中其他 Sentinel 进程或应用服务。

(3)自动故障迁移:当 1 个主节点不可用时,能够从该主节点的多个从节点中推选出 1 个可用的升为主节点,并通知其他从节点从新的主节点复制数据。

(4)Sentinel 本身支持集群的方式,对于主/从的切换采用多数表决的方法进行推选。另外,即使并非全部的 Sentinel 都在工作,Sentinel 也可以正常工作。Redis 与Redis-Sentinel 建立的集群结构如图2 所示。

图2 Redis 集群框架

2.2 Redis 的发布/订阅机制

Redis 的发布/订阅(Pub/Sub)功能类似于以往的消息路由功能,发布/订阅模式包含 2 种角色,分别是发布者和订阅者。发布者发布消息,订阅者接收消息,而订阅的频道则用来沟通发布者和订阅者。发布/订阅模式可以为进程之间提供消息传递,订阅者可以订阅 1 个或若干个频道,发布者可以向任意频道发送消息,只要订阅了此频道,都将收到此消息[6]。

在 Redis-Sentinel 的集群应用中,客户端通过应用程序接口(API)向任一 Sentinel 服务订阅主/从切换的通知消息,则当 Sentinel 监测到主节点或从节点的任何状态变化时(上线、下线、表决结果及故障切换状态等),都将通过消息通道发送到客户端,通知客户端重新连接最新的主/从节点以进行数据操作。

3 典型的车载系统组成

与地铁不同,有轨电车因为自身的特点(与公共交通共享路权、行驶速度低等)决定了车载系统为非“故障-安全”系统[7]。在该系统中,控制及采集、显示终端均采用双机热备的方式,分别放置于车厢两端的驾驶舱中[8]。典型的有轨电车车载系统的组成如图3 所示。

该系统的组成主要包括以下几个特点:

(1)2 套冗余的车载控制主机(OBU)独立接收各种外部接口数据;

(2)数据汇集在被接收的 OBU 中,2 套OBU 之间进行数据交互;

(3)1 套 OBU 故障时,由另外 1 套系统进行控制接管。

该系统构架对于非“故障-安全”的系统可以满足系统功能要求,但可能带来的问题主要有:

(1)2 套 OBU 之间需要在软件级别同步数据,如当主用机 GPS 接收故障时,备用机接收到 GPS 位置数据时需要与主用机同步,既要考虑数据同步周期等问题,也要定义复杂的通信接口;

(2)针对每个 OBU 系统来说,接收到的外部数据及系统关键数据一般被存储在进程自身的内存中,关键数据的持久化通过应用软件进行本地文件的读写来完成,当系统故障重启时可能会造成关键数据的丢失;

(3)客户端对数据的访问只能通过向主用 OBU 主动查询或接收主用 OBU 的数据推送而获得。

综上列举的应用层的问题,虽然不会对系统安全稳定带来影响,但却为功能的实现增加了操作复杂度,同时系统结构中各个模块之间需要定义非常复杂的基于网络的通信接口,也为系统间模块增加了很大的耦合性。

4 基于 Redis 集群的系统设计方案

图3 车载系统结构简图

基于 Redis 集群的车载系统方案,在系统的结构上带来的优势主要有:

(1)Redis 是一个开放网络访问的数据库,系统内的任意授权节点都可以通过相应的应用程序接口(API)从集群中获取最新的数据,在数据访问的随机性上十分灵活;

(2)任意的接口程序都可以通过 API 及集群代理软件将最新的数据写入 Redis,数据库中只保存 1 份最新的数据,为冗余系统的应用层开发带来便利;

(3)Redis 系统集群中,主/从的复制由 Redis 负责执行,用户不需要关心冗余系统中多个数据库数据不一致或新上电机器的数据同步问题;

(4)集群系统的稳定性不会因为某个客户端或服务端的故障而受到影响,且 Redis 的持久化技术可以将内存数据按照设定的方式固化到本地文件中,保证了数据的安全性,当 Redis 故障重启时,可以从本地文件中重新加载数据到内存;

(5)Redis 的数据访问十分高效,支持单步、事务、异步及管道技术等方法进行批量数据库访问[9]。

由此可见,采用 Redis 集群技术的车载系统可以为应用层的开发提供极大的便利性和系统数据的安全稳定性,基于此思路建立的车载系统结构图如图4 所示。

分析图4 的系统结构图,可知:

(1)字母 A、B 分别代表2 套车载设备对应的实例,每套设备均配备独立的前置接口程序;

(2)2 个以上的 Redis 实例被平分在 2 套车载设备OBU中,组成 Redis 集群;多个 Redis-Sentinel 实例被平分在 2 套车载设备 OBU 中,组成 Redis-Sentinel 集群,如图4 中虚线框部分;

(3)Redis 集群数据库的内部主/从关系由 Sentinel集群表决决定,Redis 集群内部提供主/从数据复制及数据持久化功能;

(4)Redis 集群内的主/从状态由 Sentinel 集群进行广播通知,所有集群内部 Redis 实例对系统结构内元素开放,如智能显示终端(TOD)可根据 OBU 的主备状态及 Redis 集群的主/从关系,动态设定读访问实例及写访问实例,实行负载均担;

(5)在 Redis 集群及应用软件之间添加集群代理层软件(Redis-Proxy),集群的任何状态变化由代理软件进行收集并实时切换读写链接,同时代理软件的功能将实现集群的主/从切换对上层应用程序透明,通过接口实现对Redis数据的读写访问;

(6)2 套系统中任何进程的单点故障都不会导致系统的不稳定,包括智能显示终端(TOD)、通信接口、单一的 Redis 库、单一的 Redis-Sentinel 实例等。

图4 基于 Redis 集群的车载系统结构

5 结语

自 Redis 问世以来就以其高效的内存访问速度、灵活的数据形式、可靠的数据存储及基于 Web 的访问方式等优点被越来越多的大型互联网企业所应用[8],如新浪微博建立了史上最大的 Redis 集群,用于数据发布及存储,说明 Redis 的强大功能已经获得了互联网及数据缓存行业的认可。但在城市轨道交通信号领域中,Redis的应用则少之又少,一方面是通信信号领域的安全性要求使然,另一方面则是由长久以来信号领域的技术垄断造成的。

本文主要结合江苏省经信委资助项目——“有轨电车运行控制系统关键技术研究”的实施,对自主研发的有轨电车车载系统中 Redis 的应用情况进行了简要描述,证明 Redis 集群在城市轨道交通信号领域的产品研发及应用中是可行的。其实,Redis 功能的强大远远超过了文中描述的内容,还需要在实际使用中对 Redis 集群功能进行更加深入的研究与挖掘。

[1]王 如. Redis消息推送机制应用技术研究[J]. 科技广场,2016(8):41-44.

[2]曾超宇,李金香. Redis在高速缓存系统中的应用[J].微型机与应用,2013,32(12):11-13.

[3]王心 ,毛莉君. 基于Twemproxy的Redis集群解决方案的设计与实现[J]. 电子测试,2016(6):16-17.

[4]赖 . 基于Redis的分布式锁的实现方案[J]. 信息通信,2016(10):83-84.

[5]明. 高可用可扩展集群化Redis设计与实现[D]. 陕西西安:西安电子科技大学,2014.

[6]余博,贾利民,秦勇,等. 城轨列车视频数据传输系统的设计与实现[J]. 物流技术,2014,33(2):316-319,383.

[7]明瑞利. 有轨电车系统安全性分析[J]. 城市交通,2016(4):59-63,12.

[8]蒋卫中. 轨道交通车载综合监控系统设计[J]. 都市快轨交通,2012,25(4):116-118,122.

[9]柳 亮,王丽,周阳辰. Redis集群性能测试分析[J].微型机与应用,2016,35(10):70-71,78.

猜你喜欢
实例车载内存
一种车载可折叠宿营住房
高速磁浮车载运行控制系统综述
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
奔驰S级48V车载电气系统(下)
智能互联势不可挡 车载存储需求爆发
内存搭配DDR4、DDR3L还是DDR3?
完形填空Ⅱ
完形填空Ⅰ
上网本为什么只有1GB?