BingerSoft

兴趣方向:1)大数据/数据分析; 2)信息安全/网络安全; 3)人工智能; 4) 云计算/微服务; 5) C/C++/Java/Python/Go.     
C/C++群:26678700     
交流QQ: 704839634,申请时请说明来自C++博客网友
合作: 1) 可全职远程办公开发; 2) 有一套Go+C+Python开发的行业短信云平台可出售。

数据同步设计与实现之分析1

       最近刚做完一个小项目,涉及到数据同步;现在正在进行另一个项目,也涉及到与合作公司系统的数据同步。
       同一个领域,同一个命题,我们常常一遍又一遍换着方式重复着,是不可重复的特性让我们不得不重复,还是我们能力的问题,没有抓住共性来一劳永逸解决问题呢。我无法回答,无法清楚。
       在软件设计与实现上,正如艺术领域,你根本不知道什么是最优最好的,即不知道尽头,何况自己技术水平一般。因而要问还有没有更好的,别人是怎么做的,网上还有什么现成的解决方案,还有什么开源项目可用。
      探讨主要的目的,一个在于记录和整理自己的解决思路,另一个在于有做过或见过数据同步的同行,能回复自己的实际可行的解决方案,以便互相学习,取长补短。 
      
      正式项目性的开发,一定有一个具体而特定的需求,我碰到的数据同步需求,一般有两类:
      1)公司自己系统之间的数据同步;
      2)本公司系统与合作公司系统之间的数据同步。
      
      先分析第一类:公司自己系统之间的数据同步。这里也有几种情况。、
      1)数据库的双机热备:
         我接触过政府、公安、国税、移动电信,好大一部分的公司出的方案叫双机备份,但是他们把一台机器放到客户机房或仓库里,是关闭着的,常常叫冷备。这那里是备份方案,那一台热的跨掉了,你那台冷的能立即使用吗?即使软件都是一样的,但是数据是不一样的,不懂技术的人都知道是卖硬件赚钱而已,做政府项目就这样,大家心知肚明。
         若真要在几分钟之内,服务能立即恢复,很多工作要做,其中之一就是要数据库的双机热备,两台数据库里的数据相差无几。当然也有多数据库节点提供服务的模式,也是一样需要数据同步,更复杂。
         有人提出云计算,我不讨论这个新事物,至少我们做不了,我们做项目的,不可能拿钱给云服务提供商分一杯羔,自己也没能力也没必要去搞一个什么云计算。我相信很多很多国内公司也是一样,等别人做的成熟了实施便宜了,中小公司才去做。
         从实现上说,谈到数据库,一般它自己都提供复制的功能,常见的oracle、sqlserver、mysql等都有,但是也没有那么容易,真的就很完美,我们不用花一分力气就垂手可得了?
         比如mysql,这个开源数据库我们用最多,因为不用钱,做政府项目,他们不敢不用正版,但用了oracle、sqlserver正版,光数据库费用就把项目钱占光了,公司喝西北风啊。
         复制有两种:1) 主备;2) 主主,即互为主备。
         不管网上文章吹的天花乱坠,2)主主复制的方案,mysql是支持很弱的,至少我不敢直接使用它。
         没有真实项目实施经验的人,可能直接考虑两台数据库服务器在正常运行的情况下,主主复制难道有什么问题。没有问题,我们只考虑这个就完了,我们要考虑一台机器突然软件运行异常、硬件故障、电源线被人扒掉、网线被人一脚不小心踩掉,在这些情况下,我们系统怎么办,当机房管理员把网线插好了怎么办,把坏内存条换好了重新开机,你的数据能一致吗?
         配置过mysql复制功能的人知道,它是依靠binlog来做同步的,有一个同步点,是需要你去设置的,也就是说,你需要机器修复之后开机能自动正常同步,你必须自己编写同步控制程序,自然在unix/linux世界里,shell、perl、python等脚本语言能漂亮解决问题,用不着c/c++和java。
        主备复制模式是不能解决问题的!
        我们最终是要考虑给用户提供连续不间断的服务,如果是主备架构模式,那么数据的写入,肯定在主数据库服务器上操作,然后同步复制同步到备份服务器上去。那么,当主数据库服务器发生故障,考虑软件运行异常、硬件故障、电源线被人扒掉、网线被人一脚不小心踩掉,维护人员没有处理或处理需要一定时间,不管他怎么处理,现在要立即提供服务,前端应用系统是连接不了主数据库服务器,要提供服务,只有连接备份服务器了,只有往备份服务器写数据了,自然,我们只有把备份服务器切换为主服务器角色了,等维护人员慢慢折腾把那台原主服务器启动起来,那么原主服务器就要有能力自己自动切换为备服务器,而不是维护人员手工去处理----这就是我常常采取的自动主备切换,是需要使用自己编写脚本去控制的。
        有人可能说为什么不叫维护人员手工处理下,毕竟人处理是最好的,可是我们一个项目,在十几个物理机房部署了服务器,我们只有一两个维护人员偶尔去一下省中心,有时候某个市级机房里服务器被人错扒了网线或电源线,当我们手机接收到系统报警短信后,只能在家里电话叫客户网管去插线,如果这时还要手工去切换主备,我们又进不了客户的内网网络,做过政府项目的人知道他们分内外网,那么我们系统不能自动切换主备,我们维护人员就惨了,需要自己亲自进入客户内网。当然,我们的硬盘坏了,我们必须去换硬盘,还要去具体市级机房,但是有了自动主备切换,维护人员就可以慢慢去,过完周末下周一再去上门。
        这样解决没有缺陷吗?有,同步复制总会在故障点丢失数据,但绝对不多,如果前端应用系统能处理这种数据差异,则总体上能解决问题。
        总之,比那种需要立即手工处理好很多,比冷备好很多很多。
        
 (待续.....)

posted on 2012-07-14 15:19 BingerSoft 阅读(1197) 评论(0)  编辑 收藏 引用 所属分类: 其它


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理