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

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

 找回密码
 立即注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

查看: 1802|回复: 0

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

[复制链接]
发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式
本帖最后由 adminlily 于 2018-11-5 10:13 编辑
! F; Z1 c% G3 s2 u
+ z+ O* v3 G+ U- X- e4 [" P; r
背景

7 f6 O; s4 }% h+ N3 ~$ x
1 Z9 c# B5 ]% X" p6 n; @9 K1 P
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点

. Q, f/ Q1 ~5 M. n. o
. A1 r3 R; x" F& B8 e7 m% {- i3 R
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png

0 b! _4 w, r0 y" ^
" Z% }+ ~( c9 R

5 L. I% R3 q0 v( ^! e( _
当前的数据库变更方式已经过时,数据库的变更存在以下问题:

9 m% b: s9 W( |! X6 D/ Q. s% w; S

5 c1 V/ _. z& w; {* t+ _
1.依赖人工修改
3 ?# Y3 F& F; h! c- x1 @$ c- h

9 e* j% f2 i5 |" {' ^
3 `0 l2 e3 E; a1 s. n
2.速度慢。
& A) `7 Q: H  h% z5 O! S
0 L! C2 y5 b* c  T) r7 ^' o" r! `( I
3.风险大。0 }. X4 Q$ Y5 P) c7 t+ H( f
. B- M# O9 g3 G- H8 \  n4 K
1.png

1 _' P! ~5 J7 a7 E# H7 O1 B+ q
: k  {( C3 T- d, E) G
2 a+ L  w1 R$ L9 h. @& U( W
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

: J& l7 }' ^3 [& V' a! q$ T

  Y1 V- Q6 }( [- K2 `" m4 A5 J/ l
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:
3 @" {7 ?1 g- M

! p& M! b2 n6 i0 G
1.png
3 e/ }: d! ]4 A# c$ l$ u& C' k
0 w' [% k+ t) i  c  y
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。

# _& L! d0 X+ f. a- b5 Z

$ A' J# y! Z* {2 |
1.png
  z' D1 b( N& P+ p5 x: l+ Z
* V! U) Z& z7 u8 x. p( K5 W: b* |, ^

0 A4 S) L' D  w9 {) x- K9 z2 K# ~" y
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

1 {6 L3 v3 Q2 J6 p% U$ ?1 b4 r

2 s1 h7 ~) q6 F4 t! }& E2 m
1.png

+ o0 H/ e) [! v. o5 V6 u+ M) R8 [' `

) g1 p( o( t  Z$ D5 n- I5 L$ d
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。

6 n( M! X1 Y9 T3 _

# H$ U/ B& z3 W, T0 x- L" m2 s
1.png
2 d! {! g* d) s) |
3 u; O. q6 E! z; l5 b
将数据库的脚本版本化存储起来,和应用程序一起管理。

  R! q! [' J0 d  {) r
& s4 ~" O+ T4 A& G5 Y' [
1.png
! G1 J3 N! `+ f5 ^9 o" d8 l
1 w0 k- q" g; y! x, I* [
Datical 带来了他们的最佳实践:

) o' m0 h  r% m" h5 q

/ b0 }3 r, Z: Q
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。+ `+ \. a! P3 f" e: J/ v- p0 W! x

1 `1 b& T( @/ D) X0 c- x2 \* n' {6 o' q  Q( ^" V
2.使用 CI 工具上传构建信息

8 W, W+ _, _" C! T
* K+ `2 B+ b6 }* e

5 A1 K( P5 ^: F: g* \1 z
7 W. w  M5 e. T
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。
* e3 {5 n3 ^) R: s1 J8 d$ N$ u, H% ^; B" V8 [# D! B

( H8 g! ]: k/ W  p5 T1 j6 O2 X" Y' H* Z  u6 t6 q; y, G
b.将制品上传到 Artifactory。1 U& y: ^) _6 s# U

& h) C9 M3 Q7 R7 V7 x
6 C" |3 t, Q# Y# A/ H2 S, v

* v; y# q2 S8 e$ P
c.通过浏览器可以直观的看到所有制品。- C4 J: U$ S. H, \: a

, B7 u5 {- O) ~% f2 w

3 i& X: U, K7 O; w$ v' f3 _+ S- U; H4 O+ J# ~7 l! f1 W* Q
d.版本化所有脚本。& T1 @+ `+ w2 ?, }) A! w3 o1 {
; \: N9 A! c# v6 W# B: @

$ E. l) X$ a- E# y; C, E6 h9 i3.为所有制品添加 Key-Value 的元数据进行版本化。+ _% ^8 m; k3 E; C5 H

# A) A. D  j& E0 ]/ j( Y' w# T/ |
1 l; f. n1 Y" n: X* r- E. q1 L
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。

/ ^% |/ C' d5 C- T8 J# L
( z2 J9 B3 [9 k3 V
1.png
' u9 C7 J) T* `( |0 n6 J6 z8 `

& H  n. E) {( Z8 a0 ~0 Q+ n
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。

, }% U2 C# G) X& G- G* P& S& G
) f2 y# ?; g- v
1.png
% m& A1 k, S& ~8 C0 z, ^
% o( [2 V4 b$ D+ M: X; W  }
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。

" v8 }3 S# w8 v3 |, R
% n2 _. z9 R) o/ P. z& w; [
1.png

+ T& x1 @8 q/ a5 S: o7 r
1 y8 e- b3 z0 u8 c
好的数据库标准包括:

$ y' n5 X# q8 k* J0 _

' l9 d2 g2 Q6 G3 s% r/ ~
1.在一个索引里不能增加太多列。
2 f5 C& S9 y! _1 g; N0 C) y6 O  O& Q2 _& m- y+ s: K
2.在一个表里不能增加太多索引。

- {1 y; j  t, U0 m& x. p0 ?8 |2 g, X4 m6 M  A1 D" M( j

8 T4 S) e" Z; P' c0 b  J, G
# w5 I- p5 |' J3 `/ [3.外键都应该有索引。
) x, H! Q. O0 O% V& b

# Z: j6 B* g$ k; d% X' x

1 W7 A: ?" v! Z' V6 E/ l' [
" I3 A/ }9 P, c! j7 c; i; P6 J4.不滥用数据库字段空间。例如 VarChar2(100000)
" y9 r  Y* P/ V* S# S' O) ~
2 E6 B* z& X  `0 |
: l2 N* K" p7 \1 V
5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。
  ]1 l9 N3 O. N/ C8 u, e9 r

1 }0 T% ^/ ^" A$ e
1.png

: D7 K% M: d% z, x$ x7 A8 @  _. e3 W, j
, O5 Q* @! S# A) M7 G" y! H
. u3 X% J" V) ?/ W9 x  w
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。
) o% X6 b: n, v8 B7 k* Y3 B- r# H) S

) B7 n) [/ Q' J/ T8 V0 a9 b% ^2 L
1.png

, X7 a) N; [* v3 q- U4 n! q
; F3 B- B$ X- N
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。

9 p% v7 X$ y- i9 K4 T- W* j

5 T6 j+ E# Q9 i/ U1 ]3 [
1.png

  s8 R( Q6 S7 _8 Z/ f+ ]* b
- B; h. k% E1 a: \! l
- g4 s: j0 Y6 t& K2 Y2 A7 ?, A
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
+ o' R0 a) p# C6 u9 T+ j2 [- H, `
1.png
6 Z& `7 ]+ \7 ~& u7 G
6 _' }# Q5 Y2 K$ |. {2 J. ~
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
. E( x: E3 C# n7 b
3 v' @1 h% q' m2 k6 x4 ^6 {( C
1.png

# F; H) l( R. F! E6 A/ F# R

$ H, M% R5 x% P8 {2 e! \. _
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。
) C# O( D# Z7 C/ ?- K
1.png

. O% J: k  q9 t/ Z
, Y  L7 O0 B* S( q2 y
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png
2 X! |1 i# x: b( ~! N+ m

, W# u+ U, n) ]; e* _  D3 N! |- Y

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

  ]; |1 M+ g& O. r1 r

/ X, W. E8 T8 D6 L, k
原创:王青
: J& B4 i. D' X1 V' v. p3 S' p- b

) `! W& o+ u/ A4 ^




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

本版积分规则

参加 ITIL 4 基础和中级专家认证、v3专家升级、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, 2021-10-20 17:17 , Processed in 0.118341 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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