文/杜明晶 背景随着信息产业的不断发展,人们在生活中往往使用着手机、PAD、笔记本电脑等多款智能产品。在生活节奏日益加快的今天,用户经常对其拥有的单一终端设备进行记录、处理等操作,并在网络连接状态下能够进行分享、同步至多终端进行后续操作。针对网络连接失败有可能导致的问题,可以用以下思路解决:在网络连接成功时记录下操作,而在网络连接成功时上传服务器。2 应用系统设计本文将多终端数据同步设计应用在C/S 模式下的系统中,该系统拥有安卓、IOS、WP8和windows 四个版本,服务器端是采用经典的LAMP 组合,通信方面则采用了Thrift 架构。以下对系统框架中重要组件进行详细说明。2.1 Thrift框架Apache Thrift 是Facebook 公司开发的远程服务调用框架,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在C++,Java,Python,PHP 等多种语言中创建高效的、无缝的服务,其传输数据采用二进制格式,与相对体积庞大且传输效率低的XML 相比,Thrift框架的优势非常明显,而相比于JSON,Thrift则更加成熟完善,具有更高的效率。2.2 终端设计2.2.1 终端的操作时间轴表【关键词】系统架构 数据同步 ThriftMySQL 分布式数据库随着科技的不断发展,人们拥有新兴终端设备的趋势愈发具有多样性和广泛性,而随着生活节奏的加快,人们在多终端设备中记录管理事务的需求也在逐渐增长,但由于目前网络覆盖面积的局限性和网络的不稳定性,终端设备并不能时刻保持着连接到网络的状态。在连接网络异常的情况下进行操作,就会出现发布失败、各终端同步异常、分享失败等问题。针对以上问题,本文提出并设计了一款系统架构,该系统架构具有远程同步和其他用户分享的功能,能够使人们在终端设备网络未连接时进行无差别操作,保持多终端数据的一致性。摘 要每个终端设备对每个用户创建一个操作时间轴表,以记录在一段时间范围内,该用户在该终端上对本地数据库进行的各种操作,包括增删改。当用户同步成功之后,服务器会返回给设备一个全新的时间戳。同步时间戳由服务器统一发放管理维护,保证了终端更新的可靠性。2.2.2 简化同步信息算法因为用户离线操作的很多内容没有必要全部与服务器同步,如用户创建一个事务不久之后将其删除,再进行同步,服务器就没有必要再去接受与该事务有关的任何信息,为了节省传输成本,在终端上做一个优化算法使客户端同步给服务器的信息尽可能的少。这部分一般由本地数据库的触发器完成,如果本地数据库不支持触发器,由程序完成。2.2.3 全球唯一ID所有的数据库,无论是本地数据库还是服务器数据库,都不使用数据库自身的ID,而用一个接口专门生成全球唯一ID,随数据信息一同写入数据库,这不仅确保前后台数据同步的定位准确,更为以后的多库扩展做好了准备。2.3 服务器设计2.3.1 MySQL 服务器采用单点master 的分布式MySQL服务器,实现读写分离。2.3.1.1 复制机制目前主流的两种复制方式是,基于记录的复制(Row-Based Replication) 与基于语句的复制(Statement-Based Replication)。因为,本系统中很少出现一个SQL 语句能批量操作大量记录的情况,体现不了基于语句复制的优势,又因为数据库中使用了触发器,因此选择使用基于记录的复制。2.3.1.2 存储引擎MySQL 常用的存储引擎有MyISAM 与InnoDB,因为数据更新时,有大量的写入操作,同一时间不能排除没有读取操作的可能性。为了调高读取效率,我们选择InnoDB 存储引擎,其在修改内容时采用的是行锁机制,避免了MyISAM 中表锁所导致的整个数据表无法读取的情况。2.3.1.3 分表数据量巨大,分表是必须的。系统主要采用的是水平分表。大量信息的访问率对时间的依赖性很强,因此大部分的分表是依据时间进行的。当然还有一些是根据用户ID 进行分表的,如私信表等。2.3.1.4 索引使用了大量索引,因为对时间依赖性强,大部分组合索引都以时间戳作为第一索引。2.3.2 同步机制2.3.2.1 同步策略一次同步的大体流程如下:每次终端同步时,除了会发送一些认证信息之外,还有在一段时期内的操作,此时服务器在认证成功之后,采取优先写入的方式,即将客户端的信息先写进服务器(写入的内容如与其他用户有关,就会在其相关用户相应的时间轴表中插入一行操作记录,也属于一种用空间换取读取效率的方式)。写入完成后,再将比这段同步时期略久一点的时间范围内接收到的有关该用户在该终端上的操作变化返回,同变化内容一起返回的还有一个比此次终点时间戳略大的值,此值作为下次同步的起点。接着介绍下,一次同步,同步起点与终点时间的概念。起点:客户端上会有一个上次同步成功之后返回的时间戳,以此为起点。终点:服务器接收到同步请求时服务器的时间戳为终点。2.3.2.2 服务器操作时间轴表服务器也有一个操作时间轴表,此表以时间戳为基准存储每个用户使用不同终端同步的操作。仅包含,用户ID,设备ID,操作ID,操作表ID,行ID 和时间戳字段,不含有任何内容字段,以尽量小的空间换取读取速度。此表以用户ID 和时间戳作为组合索引。每次读取一个用户在某一设备上,从起点到比此次终点略大一点时间范围内的所有操作。通过算法优化整合出对于各记录所做操作的最终结果,之后进行读取,并返回给客户端。3 结束语对面向可离线多终端的前后台数据同步进行了分析,总结了一种架构设计,并给出了许多细节及难点上的解决方法。随着大数据时代的到来,此种架构也将受到大数据请求的冲击,其中仍有许多需要改进和扩展的地方。例如:MySQL 服务器可以扩展成为多点master 的;对apache 服务器也进行负载均衡;对冲突策略和优化算法进行进一步改进等。参考文献[1] 李华植. 海量数据库解决方案[M]. 郑保卫, 盖国强, 译. 北京: 电子工业出版社,2011:332-339.[2] 姜承尧.MySQL 技术内幕:InnoDB 存储引擎[M]. 北京: 电子工业出版社,2011:114-115.作者单位成都理工大学信息科学与技术学院1 四川省成都市 610059