isv大规模数据迁移和加密

公司的核心业务合作伙伴淘宝网,最近出现泄漏用户信息的现象,找了好久找不到根源,于是乎,淘宝那边决定对所有敏感数据进行加密,从出口和入口都走密文,于是乎,我们的工作量就来了。

  我们的一个底单数据库,存储了大量淘宝卖家和买家的订单打印,申请单号,发货,回收单号等等操作的日志,大概有10亿左右数据(自动删除2个月之前的数据),哎呦我的fuck啊,也就是说,我们这边要对10亿数据做加密处理。。。。。。。。。

  很荣幸,整个数据的操作过程由我来写工具,其中的考虑和过程,我来这里大致的记录一下,以便留下深的记忆。

  好吧,先上一张我们用户与底单库的数据架构图。

图上,我大致说一下,我们这一个独立库存储用户的独立信息,有一张总用户表,用户id/5000取int值,也就是5000个用户的底单数据插入到底单库中对应的一张表中。

  底单库的服务器是阿里聚石塔最高级别的专用数据库服务器,容量2T,由于表的字段很多,数据占用磁盘空间的限制,我们保存用户2个月的数据,勉强维持2T的数据容量,但是,表中的例如用户手机,收件人,买家旺旺等字段需要加密,加密都是走阿里提供的加密解密接口方式,本来一个字段就20个字符最多,加密后就要200以内字符,这样不用全部加密硬盘空间就没了,经过讨论,确定方案是,加数据库,增加两台新的底单库,存储逻辑下图:

上图显示,加了新库,所以,在加密之前,首先要迁移用户数据。

  要把底单1库(老库)中的51-100的表数据迁移到底单2库,101以上的表数据迁移到底单3库。为了保存老数据,底单2和3库新建的表要分别是51-100,101+,这里注意一点,新库的新表的起始自增id千万不要从0开始,因为,当你开始迁移数据的时候,对应的应用服务器一定会更新程序,这时候51表以上的用户的数据不会再往老库插,而是对应的入到新库里面,由于要把老库数据迁移过来,如果自增id从0开始,就会导致新数据的id和老数据的id产生唯一约束冲突。所以,看了下所有的旧表数据最大自增id,最多的在8000多W,所以,再程序上线前,我们给新表的自增id设置成1亿,来防止这个问题出现。

  最后落实的迁移数据方案:由于数据比较多,就算每天半夜12点以后大规模迁移,也不现实,应用服务器不可能同时更新,所以最后决定细水长流模式,以业务服务器和用户为外循环,来操作迁移,每台业务服务器的用户的用户不规律的操作日志数据存在不同的底单库表中,也就是说一个老底单库的51-148(我们老底单库分表分了148张)的表中可能都会有当前服务器用户的数据,我以每个表启动一个线程来分别跑当前表的用户数据,,写的是每个业务服务器,固定开98个线程,去跑不同的底单表用户数据,跑了几台服务器后,发现个严重问题,由于每用户可跑的线程,也会循环查一次独立库的服务器,开2台服务器同时跑数据,就会造成独立库服务器的CPU飙升到100%,计算加上各种延迟,也不可避免,还影响效率。所以,最后在当前业务服务器的站点启动的时候,计算当前服务器的用户具体分布到哪几张底单表中,然后就单独开这几个线程,极大的降低了独立库的数据库压力,改完之后,同时更新10台服务器同时跑数据,毫无压力,因为很多服务器的用户数据分布的底单表比较少,都是10以内张。这样在独立库创建一个用户状态表,里面字段:

再加一个字段host,当前用户对应的应用服务器。

这样,每台应用服务器每个线程的任务就是,不断的取当前线程(表)的底单数据,我是每次取1000条,往新库对应表里通过事务导入,并且在状态表记录logid,当前1000条数据最小的id,下次循环,再查数据的时候只查比这个logid小的数据的1000条,这么做的原因是,防止中间程序未知问题挂掉,不知道从哪里开始继续导入,防止重复数据,当循环取当前用户数据为0的时候,跳出当前用户的循环,更改状态表的status为1,线程休眠自定义时间,继续下一个用户。做好日志记录。思维导图就不画了。

  经过2周时间,用户数据全部迁移完毕,过程也不是那么一番顺利,有个别用户,出现问题,从新跑的数据。接下来开始数据加密了。

  数据加密,因为还有一个纯打印日志表,这个表也需要进行加密,也就是1个用户需要加密的是底单数据和打印日志数据,为了可以让所有服务器可以同时更新加密数据,每台服务器只开两个线程,1个线程加密用户底单数据,一个线程加密打印日志数据。打印日志表,跟每台业务服务器数据库放在一起,,下图是我们公司对这几个数据存储的架构图:

加密数据,老底单库的前50张表也要加密。具体的代码逻辑和迁移数据差不多,只是稍微复杂了一些流程而已。

  最后落实的工具,导用户到用户迁移/加密状态表页面,用户数据迁移/加密的监控页面,业务数据库连接层的扩展。

时间: 2024-10-10 20:19:34

isv大规模数据迁移和加密的相关文章

利用Tsunami UDP将大数据迁移至云中

当你的数据规模达到PB级别的时候,想要移动这样大规模数据时就会变的费时费力,这也是企业在利用AWS规模化和弹性优势处理分析任务时面临的最大挑战之一.本文主要介绍了加速文件传输协议,谈到如何利用Tsunami DUP实现将大规模数据迁移到云中,其中利用UDP处理数据传输,TCP负责连接控制. 值得一提的是,与SCP.FTP或者HTTP等纯粹基于TCP的协议不同,这些混合型UDP/TCP协议处理数据的吞吐量更加出色,它可以充分利用当前的可用带宽的情况下,不易受到网络延迟的影响,这些特性使其成为远距离

Apsara Clouder云计算技能认证:云数据库管理与数据迁移

一.课程介绍 二.云数据库的简介及使用场景 1.云数据库简介 云数据库基于云计算平台构建,克服了传统数据库引擎引擎的局限性,是按使用量付费,稳定可靠,可弹性伸缩的在线数据库服务.无需购买软件和硬件,也无需专人维护 IT 基础设施. 云数据库能够让您在云中轻松设置,操作和扩展数据库.它在管理耗时的数据库管理任务的同时,可提供经济实用的可调容量,是您能够腾出时间专注于应用程序和业务. 1.1云数据库的特点: 用户按存储容量和带宽的需求付费 云的可移植性可以将数据库从一个地方转移到另一个地方 按需扩展

EF 中 Code First 的数据迁移以及创建视图

写在前面: EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别.Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功),我摸索出了一种简单有效的方法,这里分享给大家. EF是Entity Framework(实体框架)的简写,是微软出品的用来操作数据库的一个框架,会ASP.NET MVC的朋友对他肯定都不陌生.由于学艺不精,我对EF存在一疑虑,就不以[提问]的方式来问了,我以[总结]的方式来表达,如果总结有误的地

基于内容的数据迁移计划和方案--转载

越来越多的企业用内容管理系统来管理电子发票,电子文档,人力资源等结构化或非结构化数据内容,而且把这些业务外包到第三方的 IT 公司.外包公司的更换,或者现有内容管理系统不能满足业务增长,性能,兼容性等方面的需要,企业计划采用业务管理,性能以及兼容性更好的系统. 还有的企业目前根本没有采用内容管理系统,所有的发票,电子文档,人力资源信息都是以纸质文字或者档案的形式管理维护,为了提高企业的运营效率,这些企业计划采用内容管理解决方案. 如何在不干扰现有业务的基础上把这些内容数据从一个系统迁移到另外一个

HDFS数据迁移解决方案之DistCp工具的巧妙使用

前言 在当今每日信息量巨大的社会中,源源不断的数据需要被安全的存储.等到数据的规模越来越大的时候,也许瓶颈就来了,没有存储空间了.这时候怎么办,你也许会说,加机器解决,显然这是一个很简单直接但是又显得有些欠缺思考的办法.无谓的加机器只会带来无限上升的成本消耗,更好的办法应该是做到更加精细化的数据存储与管理,比如说非常典型的冷热数据的存储.对于巨大的长期无用的冷数据而言,应该用性能偏弱,但是磁盘空间富余的机器存,热数据则反之.数据的分类存储一定会带来数据的同步问题,假若我有2套集群,1个是线上的正

数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案

作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一数据库按照一定的规则进行切分,把数据分散到多台物理机(我们称之为Shard)上存储,从而突破单机限制,使系统能以Scale-Out的方式应对不断上涨的海量数据,但是这种切分对上层应用来说是透明的,多个物理上分布的数据库在逻辑上依然是一个库.实现Sharding需要解决一系列关键的技术问题,这些问题主

数据迁移心得

  前几天出差,去客户现场帮忙迁移数据,经过几天的奋战,终于将迁移数据自动化起来,并且可以日跑批操作,这里小编就跟大家分享下,这其中踩过的坑(也可能是实战经验不丰富导致).  首先,荣小编我抱怨一下,不是自己熟悉的开发环境真的有些难过,给一台电脑,咱不说没有IDE,就连java都没有安装,连接数据库的工具也没有,唯一值得庆幸的是有xshell,但是完全不符合个人快捷键的喜好,没办法,想要开发高效,自己动手配置吧.单单是配置这些开发环境就整整牺牲了小编一上午的时间,还好后期开发有明显的提速.中午吃

AJAX+REA实现前后台数据交互的加密解密

AJAX+REA实现前后台数据交互的加密解密 1.创建js文件Encryption.js /**  * 加密解密  */ /** RSA加密用 生成key */ function bodyRSA(){ /** 1024位的key参数写130,2014位的key参数写260 */ setMaxDigits(130); /** ajax 调用后台方法,取回公钥 */ var keyR ;     $.ajax({      url: "/GHGL/Key/pk",//请求后台的url,本例

Code First Migrations更新数据库结构(数据迁移) 【转】

背景 code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成. 要求 已安装NuGet 过程示例 [csharp] view plaincopyprint? //原model //原model [csharp] view plaincopyprint? us