阅读了这篇文章,不进学到了数据库部署上线的知识,对于面试技巧也学到了一点点,哈哈,收获不小,
数据库的部署分为两种方法,一种是比较简单的停机部署法,另外是双写部署法,也就是不停机部署法,停机部署法的大概思路就是挂一个公告,半夜停机升级,然后半夜把服务停了,跑数据迁移程序,进行数据迁移。(1)出一个公告,比如“今晚00:00~6:00进行停机维护,暂停服务” (2)写一个迁移程序,读db-old数据库,通过中间件写入新库db-new1和db-new2(3)校验迁移前后一致性,没问题就切该部分业务到新库。,这个中间件。现在流行的分库分表的中间件有两种,一种是proxy形式的,例如mycat,是需要额外部署一台服务器的。还有一种是client形式的,例如当当出的Sharding-JDBC,就是一个jar包,使用起来十分轻便。但是此方案有一个缺点,累!不止身体累,心也累!本来定六点结束,你五点把数据库迁移好,但是不知怎么滴,程序切新库就是有点问题。于是,眼瞅着天就要亮了,赶紧把数据库切回老库。第二个晚上继续这么干,简直是身心俱疲。
双写部署法,也就是不停机部署法,流程稍微复杂一些,首先要明白,历史数据和增量数据,历史数据就是在部署前,数据库表中的有关数据,称为历史数据,增量数据是在部署后,数据库表新产生的数据,称之为增量数据,
迁移流程如下 (1)先计算你要迁移的那张表的max(主键)。在迁移过程中,只迁移db-old中test_tb表里,主键小等于该max(主键)的值,也就是所谓的历史数据。 这里有特殊情况,如果你的表用的是uuid,没法求出max(主键),那就以创建时间作为划分历史数据和增量数据的依据。如果你的表用的是uuid,又没有创建时间这个字段,我相信机智的你,一定有办法区分出历史数据和增量数据。 (2)在代码中,与test_tb有关的业务,多加一条往消息队列中发消息的代码,将操作的sql发送到消息队列中,至于消息体如何组装,大家自行考虑。需要注意的是,只发写请求的sql,只发写请求的sql,只发写请求的sql。重要的事情说三遍! 原因有二:(1)只有写请求的sql对恢复数据才有用。(2)系统中,绝大部分的业务需求是读请求,写请求比较少。
(3)系统上线。另外,写一段迁移程序,迁移db-old中test_tb表里,主键小于该max(主键)的数据,也就是所谓的历史数据。
(4)将迁移程序下线,写一段订阅程序订阅消息队列中的数据 (5)订阅程序将订阅到到数据,通过中间件写入新库 (6)新老库一致性验证,去除代码中的双写代码,将涉及到test_tb表的读写操作,指向新库。
至于说到面试技巧,假设面试官问到你关于数据库分表的问题,你大可回答他分表的相关内容,至于部署不必拓展,在最后问面试官问题是,可以反问他贵公司部署问题是怎样解决的,这样面试官在最后肯定会认为你是真的做过数据库分库分表,自然面试效果也会不错。