请选择 进入手机版 | 继续访问电脑版

ITIL,DevOps,ITSS,ITSM,IT运维管理-ITIL先锋论坛

 找回密码
 立即注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

查看: 1913|回复: 0

DevOps 来了,如数据库变更速度跟不上该怎么办?

[复制链接]
发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式
本帖最后由 adminlily 于 2018-11-5 10:13 编辑
) |0 _9 j& g9 Q5 {* P; H$ n
) W+ A  b7 h" w7 U
背景
  j! V% K) h8 p  g* e

4 B1 z1 |9 _9 b, E1 y
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点
% B) d4 X. P" @/ |

; Q( n( {# d! a$ Q- ]
ITILxf.com" target="_blank" class="relatedlink">DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png
8 N3 [& g# e8 G6 P' Q1 z- U/ W

" u- v( K& X: C9 C4 H
/ }8 f% k8 u. D  `; s2 ~
当前的数据库变更方式已经过时,数据库的变更存在以下问题:
% |! {+ L0 P% q- Y

9 u( g, f2 s  _: F) ~7 I
1.依赖人工修改- O0 n% K' q& Q, g5 G3 P  Z! q
& J# O8 i# r1 l- ?. y
. _7 _( j) Z8 T: ?* f4 g
2.速度慢。
( E, b1 o  n: p
. A8 m; A4 [" q+ e4 I( {  f) ?8 {
3.风险大。' h7 J! D4 P, h# Q: p

  a8 D. ]& R$ o
1.png
# C/ v- b8 S! J# c* o& A
! o' h8 v9 A5 E. {7 Q
2 A, {- P3 {: K3 J+ [# P! L
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

3 P  o, d! o. [& W. F% m: }  R

3 ]& {1 z. y  B! G- S
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:

4 V3 O9 N0 _8 D

/ s- G' @* V0 o' |
1.png
6 ?! }& F' O7 e9 u! y$ ]

( \' H! [) J# n2 `
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。
/ \9 W8 _6 o% ]) A5 @
6 {4 }5 T: h9 T0 g' \
1.png

" d/ A* U% M- V# g" O

- ^. f8 A. O' H5 ~. F) }

0 t8 k9 E+ r) u9 E5 G4 M8 T0 e% X
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

" Z8 K6 A7 T6 j$ n/ e

' y1 [4 ~6 x3 ~2 p
1.png

% s3 b7 O8 N. `" ?" O

1 }2 d  ]+ r4 M  V$ X7 ^9 @
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。
% n2 U6 q* _8 g. E1 [7 a: I% g- f* L

8 \7 @5 k9 U# H
1.png
8 E7 u% T" u6 q" i( D
& ^4 C6 b# l' s( h1 l( ~
将数据库的脚本版本化存储起来,和应用程序一起管理。
2 p7 q. p2 y! u1 G& {; W! R: j
$ ~/ ~" v0 u8 r$ J3 _
1.png
+ a- ^6 I1 B# e5 e( g" ?* b( ]
) l1 Q1 p+ |) ~" k3 X9 n& r2 U
Datical 带来了他们的最佳实践:
: n& h: D6 E1 o7 J0 M

! O+ g" Y! g4 d. v8 v, P3 A
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。5 ?- v( [5 E: {3 i7 g
( |3 |. m/ i+ c3 L8 s# j
" Y1 D- ~, w3 A: w- ^9 H3 n
2.使用 CI 工具上传构建信息

3 {* q2 d0 t2 e9 Z+ A! E# L* D; S
5 N, F: R7 W# U, G5 \
( Q* y8 B2 m& O
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。
5 A9 R: H3 ~+ I9 u5 V7 W& C( c' w9 T6 b  K' K  O

. f: s2 b' ^+ u& r! o( S; F% w0 w* j$ {; g! U, a
b.将制品上传到 Artifactory。0 N( M) }$ a+ q
! a# g- M/ \! S+ _

+ P* T) l$ _$ Z- g5 K# m) u% y( I& y9 |7 h1 M
c.通过浏览器可以直观的看到所有制品。
( g3 p8 W" \/ V9 L" u- n% @5 ]% ?3 O; B3 G1 {/ L+ `+ k! B

  B8 j$ U0 s" k2 }/ }. F5 F! ~* N1 G# O* i# |
d.版本化所有脚本。0 O: h+ ]6 b6 @% Q
3 h$ \0 `# y2 W9 }% O( S
( p8 W' l  Y6 u0 p# i
3.为所有制品添加 Key-Value 的元数据进行版本化。% A3 K1 o: [- ]+ G' u& ]
5 ~+ u$ N% z" i0 y3 h# U8 R5 X! r
% K% l( m, v  \3 Z
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。

: B$ H0 X- e0 N! {7 o8 {

6 B& l) s, u( h2 c/ ^2 r
1.png

' h- U# d% a: x, Q) J; G6 P0 f* Y1 e

* ]# y6 C4 u9 t, w
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
* T! u9 T8 ?$ n$ n2 A
% W% U! R# X, F4 ]# ~
1.png
) _& h: Z4 G, A# K/ p' X& ~6 v- ?( E
5 C9 X$ o2 X$ M" F
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。
0 h8 ~: n) `6 k; V

2 K- H$ u% _+ L
1.png
. y3 w9 Q2 u! e% I% B( V  x% E

" ^2 M: c" w$ c8 X5 w
好的数据库标准包括:
2 h8 r; Y/ D, R' C/ c

* G- b* y. ^( }3 j$ E7 y
1.在一个索引里不能增加太多列。4 X3 C- [7 L: G
  q( F9 N& K( ^$ t: i( U* ?
2.在一个表里不能增加太多索引。

& A9 Z9 I! b2 i' s6 X* ^5 @3 B7 I& ]

' e/ {/ c: a6 z6 t  r& P8 N
% d0 R) J) ?8 e. L0 x9 l: P3.外键都应该有索引。

, _* k5 y6 I" g3 E$ l9 V, I
+ ^/ f: H' n! |# M! ^. g) ^

" V$ L0 j. i% R2 I3 ]! L
0 q  J* F7 C5 n- K+ G4.不滥用数据库字段空间。例如 VarChar2(100000)

1 R5 o& e/ N' `3 ~; a& Z7 f6 s: L# |. {2 A- j

0 d/ Y" q4 X- R- P7 J5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。, k. Z: c) n5 b7 R
8 y) i8 {( Q, U" j* X* H; p, |
1.png

! H# T+ Q' |: e8 {. C3 w
& L( E+ u  s2 G" v/ |# }
5 \! {1 s4 Y2 U9 o  @+ f
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。
1 E8 ~' y: s+ }* d5 \7 C
# _. T. W; |; D/ |* h) W' t
1.png

* d5 O  Q  p$ P; m
& P) A5 D- a# X2 z% O
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。
; D. ~: H1 ]' ~* q
8 b& L& v2 j3 J& f2 D
1.png
8 k% \' A. `/ h" i, i4 t
4 F  `) n" K( q. O- C

1 ?  _( O$ u# M7 X& W" D
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
% c: j1 H& @1 [& c  f8 h$ A7 A
1.png

& h  w9 f3 _% {0 O% X
# T$ n# U$ \( M3 E
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
9 V/ Q( E+ v" ?
3 n% t! H6 @1 U
1.png

! I% K8 {4 j5 D; L. c0 P& I/ U' S5 g
1 h) G# W+ t% |. S+ s0 H7 `3 b
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。
7 ]& g, c$ t0 |! x+ R3 S- v- w* }) R
1.png
6 Q0 I1 i- p* i

1 g4 S3 B8 N  x4 \
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png

3 y* z; m$ w7 @' Z( H; n. @3 l. {8 u, A0 \0 Q/ _

& Z( T! L; z. K# `# S& u
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。

" f: B  E0 W0 D) n! Z

- s1 o0 a& {+ I9 M0 v
原创:王青
: E/ \& x9 u6 Q" A. }5 u+ \3 b
8 o! L9 q. z- Y% R6 N& J, n




上一篇:用DevOps 5.0版本的150天经验总结
下一篇:基于DevOps如何建设Android交付工具链
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

参加 ITIL 4 基础和专家认证、长河ITIL实战沙盘、DevOps基础级认证、ITSS服务经理认证报名
本站关键字: ITIL| ITSM| ISO20000| ITIL培训| ITIL认证| ITIL考试| ITSS| ITSS培训| ITSS认证| IT运维管理| DevOps| DevOps培训| DevOps认证| itop| itil4| sre| 开源ITSM软件

QQ|ITIL先锋论坛 ( 粤ICP备11099876号 )|appname

Baidu

GMT+8, 2022-5-23 03:28 , Processed in 0.115293 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表