分布式数据库数据从属与客户端与服务器的数据同步

老实说,目前市面上许多产品,的确是不成熟的产品。

用过一些,给人蛋痛的感觉。

导言

分布还是集总

今天我们来探讨一个很重要的问题。

每个程序员都有其思想,我的思想之一,就是分布式。

分布式,面对的一个问题,就数据的同步。

比如说,我们人类是分布式的,我们每个细胞都在无时无刻与其它细脑交换数据。

而现实世界,我们的设计是什么样子?一般都是集总式。

首先来说,这种方式,与现实世界并不一致。所以,带来的最严重的一个影响就是效率的问题。

自己这些年,一直在无线通信领域。

无线通信,有两个重要的特点:

1. 无线带宽有限,所以这些带宽就成为重要的国家资源,所以无线通信的费用,很高。

2. 无线通信,信号不稳定。

当然,wifi是另一回事,但不是哪里都可以用wifi接入。至少现在是这样(当然,wifi的存在,也是一个莫大的讽剌:国际电联占用了那么多带宽,可真正传的数据,可能根本不如开放给Wi-Fi的那么一点可怜的带宽。国际电联,有时真是应当反思)。

基于这两点,一个手机电的客户端应用程序,一定要在本地存数据。如果不能做到这样,其本上就是个垃圾产品。浪费生命的产品。

举个例子,比如腾讯新闻,其实这是一个实时性很强的产品,但腾讯,还是非常负责地实现了全面的离线和缓存功能。这是对用户的负责。

用户没有道理,在等你的软件在后台同步数据。这是在浪费用户 的生命。

同步与版本兼容

但是同步并不是件简单的工作,事实上,相当复杂,而且是检查一个架构师的架构是否合理的关键要点。

网上有许多讨论同步的帖子。但都不是很理想。

同步,作为一个架构人员,你首先要考虑同式的方式。进而思考版本兼容的问题。

什么叫版本兼容?这么说吧,你去理发,看一个理发师水平怎么看?过一个星期再看他给你理的发的效果,那才是真水平。

版本兼容,事实上,是真正能体现一个复杂软件的灵魂之处。

特别是对数据的兼容。

我为什么总是把这四个字放在嘴边?因为这不止是我缺的,更是我们整个民族所缺的。我们五千年文化的特点是什么?每300年大扫除一次!每个朝代的书,都被下个朝代烧光。所以,我们总是在原地踏步。

然后,美其名日:新的版本完全抛弃了旧版本的弊端。

我告诉你,这样的软件,送我也不要——缺少一个程序员的其本良知。

同样,一个公司,你怎么看他强不强?你就看他的产品升级的时候,是怎么处理用户数据的。

比如,目前我维护的任务之一就是Pre-E公司的windchill ,PDM系统,不论你告诉我这是一家多么强大的公司,当我听说,它的新版本不能从旧版本平兼容升级,需要完全重做,我就知道,这是个不能买的软件——windchill团队,也是个不怎么负责的团队——也可能是能力问题。

那么,版本兼容、分布式、数据、同步,它们之间的联系是什么?

真的思考过的人,你自然会理解。、

你精心设计的CS系统(比如OA,流程平台,CRM,物流,等等),现在数据库结构变了。

问题是,你的客户端那里,有一个本地数据库,存在属于他的数据。

那么,这两个数据库之间,如何处理?

当然,最简单的办法就是通知所有用户:你的数据不能用了,请重新同步。

这是一种浪费。对服务器的压力,也会增加很多。

事实上,我了解过的许多系统,服务器的压力,就是因为服务器承担了本不需要在服务端完成的工作。

现在的手机、PC运算能力,完全是一个小型服务器。

有时的确搞不懂,人们为什么无节制地在服务端搞来搞去,而不是从分布式的思想上下功夫——其实这也是一种民主暴政:搞服务端看起来很专业,很有型,工资自然高。

浪费所以总是有道理。

但,错误,总会有人来纠正的。

------------------------------------------

好了,我们来探讨,数据同步的一些细节。

数据同步,由几部分构成。

1. 信息的从属。这可能是最先需要思考的。

有属于个人的,有属于团队的,有公共的,有属于BI团队的,还有属于管理人员,或是财务这种专业团队的。

所以,第一步,需要明确界面哪些需要同步每个个体的终端(User Equment)上.

2. 信息的唯一描述。

有了从属,每一条信息,需要一个唯一ID。

以解决当一条信息发生改变时的记录。服务端与客户端,都需要此项工作。

3. 数据结构的描述,与版本。

为实现版本兼容,每个对象(或表,或树)需要有描述(类似人类的DNA,类似数据库的Schema),这些描述体系,相对而言,需要固定的模式。

比如,数据库,一定是非业务、非对象、非表的模式来存储。比如,可以用OID + value的方式来存储。

4. 数据的同步,需要两步,第一步是检查数据结构是否有改变,第二步才是数据的同步。

5. 注意这里软件的版本升级,与数据描述的演进,是两回事。

6. 另一个要选择的问题,何时同步,同步多少数据。比如,当用户用到一个功能时,再同步,还是用户每登上,就进行一次全同步。

这里,需要与具体的情况结合来考虑。最好是两种功能,都实现,不同的情况下,使用不同的同步方式。

7. 实时上报。当两个用户在进行协同时,最好需要有实时上报的功能。这里看以看出,为什么,信息的从属,和信息的唯一描述,是这同步体系的基础。

8.容错,当体系出现问题时,有机缺能避免掉入升级陷阱。

9.区分wifi与电信网络的接入情况。当用户使用的是wifi时,可以在后台自动进行全同步。

如果能实现这些,其本上就比较理想了。

平滑升级,为什么如此重要?

几个方面。

一个是版本的回溯。

版本回溯的重要性是什么呢?

好比我们早晨醒来第一件事是什么?回忆。不错,可能你没有意识到。

我们中国人学的英语为什么都是哑巴英语?一方面,我们没有注意到语言的核心是动词,另一方面,也是根本原因,是因为我们没有形成英语记忆。

这是母语与后天习成语言的本质差别。

版本回溯的重要,类似于此。

比如说,你的软件升级20个版本后,你可以研究一下,整个演进的过程。哪个能参数被删除了,哪些是一分为二的,哪些合并了,哪些,是你删除了又加上,然后又删除了的。

这种情况,有没有?肯定有。

如果这个团队,就你一个人,这无所谓了。

但,如果在巨大的团队,很可能有人在偷懒,也有可能是糊涂(但更可能是管理问题)。

这么说吧,大团队,有意和无意的这种走转圈路的情况,层出不穷。早晨又听研发的同事在讨论,十年前的问题。相信,再过一百年,也会再出。

现在你懂了,这个版本兼容有多重要了吧?及使不考虑客户端、服务器,也需要有这个功能。

去年维护物流的时想,开发了一个复杂的功能,需要改动许多表,把原有的数据进行处理后导入,后来,不得不开发了一个很复杂的升级脚本来实现。

事实证明是明智的——手工升级,一个星期也能都升不上去,有了脚本,只需几分钟。

时间: 2024-10-15 11:58:52

分布式数据库数据从属与客户端与服务器的数据同步的相关文章

ICE学习第四步-----客户端请求服务器返回数据

这次我们来做一个例子,流程很简单:客户端向服务器发送一条指令,服务端接收到这条指令之后,向客户端发送数据库中查询到的数据,最终显示在DataGridView上. 根据上一篇文章介绍的Slice语法,我们先来定义ICE文件.我定义两个ICE文件,一个用来描述测试数据库表中属性相关信息,另一个则是请求数据的方法. 结构如下:    定义结构体,和数据库中表的列对应,添加序列(相当于数组类型). 在获取表的方法中注意要记得#include带有结构的ice文件,并把接口函数的返回值类型写成之前定义的数组

android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)

在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包 首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包 然后新建android项目 以

一个客户端向服务器发送数据,服务器向连接的客户端转发数据demo

服务端代码: // 负责处理每个线程通信的线程类 public class ServerThread implements Runnable { // 定义当前线程所处理的Socket Socket s = null; // 该线程所处理的Socket所对应的输入流 BufferedReader br = null; public ServerThread(Socket s) throws IOException { this.s = s; // 初始化该Socket对应的输入流 br = ne

C语言Socket-单工通信(客户端向服务器发送数据)

服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") //把ws2_32.lib加到Link页的连接库 #define PORT 15001 //通信的端口(指服务器端) #define ERROR 0 #define BUFFER_SIZE 1024 //注意:此Server端数据接收缓冲区 >= Client端数据发送缓冲区 ,否则造

如何在游戏客户端和服务器之间精确同步玩家的状态?

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多Unity3D资源.Unity3D培训视频.Unity3D教程.Unity3D常见问题.Unity3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 假定技能有前摇,攻击,后摇3个阶段. 前摇阶段可以理解为发招前的酝酿或者念几句咒语,攻击阶段可以理解为开始挥刀砍直至砍中目标身上这个时间段,后摇阶段可以理解为收刀恢复攻击姿势的阶段. 我们的技能的连招系统允许在某些技能(称为技

分布式数据库数据从属与client与server的数据同步

老实说,眼下市面上很多产品,的确是不成熟的产品. 用过一些,给人蛋痛的感觉. 导言 分布还是集总 今天我们来探讨一个非常重要的问题. 每一个程序猿都有其思想,我的思想之中的一个,就是分布式. 分布式,面对的一个问题,就数据的同步. 比方说.我们人类是分布式的,我们每一个细胞都在无时无刻与其他细脑交换数据. 而现实世界.我们的设计是什么样子?一般都是集总式. 首先来说,这样的方式,与现实世界并不一致.所以.带来的最严重的一个影响就是效率的问题. 自己这些年,一直在无线通信领域. 无线通信.有两个重

负载均衡,分布式,集群的理解,多台服务器代码如何同步

集群 我们的项目如果跑在一台机器上,如果这台机器出现故障的话,或者用户请求量比较高,一台机器支撑不住的话.我们的网站可能就访问不了.那怎么解决呢?就需要使用多台机器,部署一样的程序,让几个机器同时的运行我们的网站.那怎么怎么分发请求的我们的所有机器上.所以负载均衡的概念就出现了. 负载均衡 负载均衡是指基于反向代理能将现在所有的请求根据指定的策略算法,分发到不同的服务器上.常用实现负载均衡的可以用nginx,lvs.但是现在也有个问题,如果负载均衡服务器出现问题了怎么办?所有冗余的概念就出现了.

探析大数据需求下的分布式数据库

一.前言 大数据技术从诞生到现在,已经经历了十几个年头.市场上早已不断有公司或机构,给广大金融从业者"洗脑"大数据未来的美好前景与趋势.随着用户对大数据理念与技术的不断深入了解,人们已经开始从理论探索转向对场景落地的寻找,让大数据在企业中落地并开花结果. 从大数据的管理和应用方向集中在两个领域.第一,大数据分析相关,针对海量数据的挖掘.复杂的分析计算:第二,在线数据操作,包括传统交易型操作以及海量数据的实时访问.大数据高并发查询操作.用户根据业务场景以及对数据处理结果的期望选择不同的大

分布式数据库选型——数据水平拆分方案

概述 水平拆分的概念随着分布式数据库的推广已为大部分人熟知.分库分表.异构索引.小表广播.这些功能几乎是产品功能需求标配.然而有些客户使用分布式数据库后的体验不尽如意.本文尝试从数据的角度总结分布式数据的复制(replication)和分区(partition)技术原理和方案,其中分区也有称为分片(sharding),希望能引起读者一些思考,在分布式数据库选型中能注意这些细节的区别,选择适合业务的数据水平拆分方案. 分布式数据库架构 分布式数据库以集群形式存在,有多个节点.集群架构有共享磁盘架构