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

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

 找回密码
 微信、QQ、手机号一键注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

搜索
查看: 569|回复: 0

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

[复制链接]
发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式
本帖最后由 adminlily 于 2018-11-5 10:13 编辑
  d, h7 R6 s' {& `
& |! C& k5 S9 m$ Y: V( I1 x* c
背景
, k' X$ i3 n( K; Q! W
  n9 p: a5 j: }0 ^) p
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点

3 F: G# [& q9 e7 L
3 w8 ]1 o- s8 Q6 J' }8 y
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png

7 f! ?( C; ?3 @% P" u3 w

" {# x  ?. z% L$ B
& Q3 l7 T7 ?* }( `! R  S
当前的数据库变更方式已经过时,数据库的变更存在以下问题:
. b9 [# N  X8 L; _8 `0 M' ~

: p/ q; g- l3 x# T
1.依赖人工修改  J, ~+ n. E* B

( y  B8 ]7 P* [! Z& F  P- t/ q3 k
& A6 ~) N" T, _) c! A' K: R
2.速度慢。6 |$ m  y! v4 i8 j0 M
$ ?; F5 s/ D8 u' ?% a3 U& s
3.风险大。
6 {5 [5 b( A# x
8 w4 I7 D/ A$ ]
1.png
" X( F3 g$ x7 v( W; A8 C+ |/ T6 u

. w& ?2 M2 p9 ]9 t
2 q3 X4 z5 g0 q% b
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

* I+ Z& c2 X/ V
4 b0 }3 @1 G; b9 H, M" X7 Q
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:
% h8 M1 x# k: I
; \) R9 N5 ?3 W2 M6 F
1.png
6 x7 `; O8 q' }' u+ ]
- |- t8 k6 _: z+ |  j
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。

, m; W$ I# Y( R

# l( G; `( D: S5 S# h5 r8 r
1.png

4 Y4 a1 @. y/ l4 M) i# e
: F- ]7 x) t5 g, ~
5 J* U. E4 d) f  |/ f
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

( b& o) i, |" Z: E* C
% }1 X2 a+ U8 b7 i# I* r' P# r
1.png

; I7 S4 Z. A* N* j1 D

% _. O- J1 o9 L* _& |
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。
5 P8 w  t6 D* h+ J" w

0 [4 k- O( d! f% U
1.png
5 r( H2 ]% j% e

$ z& e; N( y" G' L
将数据库的脚本版本化存储起来,和应用程序一起管理。

7 C' A' U) e! t! o, G6 @, @
; y0 q9 q8 h& _* X  a& ~2 b
1.png

( }- M2 ^1 U( e7 F. a# l' L/ h
2 G+ U2 u& s; ?$ N0 D4 z
Datical 带来了他们的最佳实践:
4 q- B2 J- y  s. U, Y7 j/ \  `. m, m0 l
1 H6 Q1 C; _7 `) B; C. d' R0 \
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。8 y* w. B! c4 P

: P: {+ n; B5 K0 i* z% `2 |: e& m/ E4 y. x5 r5 g0 `- e; X1 ~
2.使用 CI 工具上传构建信息

3 H. b$ o( j/ A+ r
; h5 N- B8 C  _/ [' y: ^4 l( j
+ x: h7 h1 B& e- y
1 c& y4 z: r- h
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。( o2 g  J- |0 v7 Q+ B

" W9 M* a, J2 J; y6 I- Z$ C6 B) m+ p

. x0 j# F( ]' ?7 |; s- [0 P1 u
& d9 X7 j# b& ?( q& D( Z2 o7 X
b.将制品上传到 Artifactory。
( k( O4 n/ l- d; Q( ?3 b
- ]! Y0 ]8 e, Y! N1 D6 `
0 g5 b1 ~# d3 [# V5 T- g7 ]3 T5 u

# w2 J5 N- u9 v$ m& _: o
c.通过浏览器可以直观的看到所有制品。1 A- O& W6 N# I; P1 B' g

; {3 ~$ J* F, ?0 h; |
) l6 w6 K, ~2 S& w: s

  j/ `  d! G/ l, l2 e& b
d.版本化所有脚本。
4 g0 v; @# ]( o+ C/ h
) F$ r5 L! E- u* M. D9 L/ }3 |! ^9 }# G* B
3.为所有制品添加 Key-Value 的元数据进行版本化。
, o1 X# k3 B( [* U. F0 w0 v/ u

" S, H$ E1 d& U9 z1 r* g: x$ K& Y! e
' M' x2 d% w' Q" V3 L3 V; G
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。
& G7 x* ]7 U& ]6 D" H( T
' v- L3 l! [- N* \. k. A9 ?) D( r
1.png
- J6 E6 ~! E8 l/ Y

6 a! ~$ p7 r5 N: @
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
; P2 a9 D- ~; v& M/ ^3 ]

3 p/ v' F6 {# _2 o1 v8 p
1.png
/ w9 s6 t4 q- B' {: J4 F
! c. f. [# L; i1 j9 V) \0 z9 K# O
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。

4 a% l$ W; C$ G3 |6 c

) K$ Q# H3 T: ~8 G# V) P% c
1.png
2 {' w1 Y0 E9 |# }, T+ `

' M* p( {; O0 m5 A1 m
好的数据库标准包括:
( p1 i$ i5 }. M1 r* ^: ]! M; u$ E
7 D7 _2 Q- w, t* x) H, c
1.在一个索引里不能增加太多列。' O& a: C/ `1 X. J* I; [9 p1 c
9 ~: X9 w( ]$ U
2.在一个表里不能增加太多索引。
  @2 ^& x9 {1 }" Y$ A; A6 A

6 H. R8 N3 H& B; {& `4 U
2 T% h, m6 W. i3 z  k  }/ H2 U
% v6 W  g* j0 ]! |- m
3.外键都应该有索引。

$ A0 z2 C8 ^! t9 O2 l5 o$ j% s9 Z/ u# l/ I. `% V

8 n6 E. V2 e9 d' {7 r& p$ V# p# P  g' H( I
4.不滥用数据库字段空间。例如 VarChar2(100000)
3 ]: |9 Q0 x: A, q8 P

& a# P8 L* A. r+ {" C& x9 L
, D( k6 M* B7 y' @3 j  x
5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。$ B( O0 t$ f+ b' _7 b" b

1 c1 [9 z3 v- {' L$ P
1.png
, j' g7 r+ g: ?0 f

; v; j% X8 e- B2 ~' y+ p3 V

/ e+ i  ?1 J6 E; Z0 E" u( n
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。

$ {$ ?1 V/ h  @/ ]# c
) s2 O3 @9 g4 o# T
1.png
: T4 L) R; X7 O( B" Y7 o  y
7 H7 S0 }- U, h) ^
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。
8 V: [' v- g, g/ N" I' g
: ~9 l* _4 J2 J
1.png

* k. C4 c* Z: K" m# u

; c* a% ]. g) a: g
# {( C% B# ?+ _' ]/ F' }' q" `7 |
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
# m; P* q2 b. y, X" t* C' v) B
1.png

- R3 f: T: i* x; G: c" p- \

& |0 ^; O% V8 m; r0 k1 y
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
4 x1 A% K% C/ Z" b& E
4 _# c4 x0 B* S* W
1.png
9 G0 H) Y; }5 [' G

" R5 k/ D) k( }9 k
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。

2 F6 w/ w9 b7 P0 d: x8 b6 k
1.png

% R$ ^( d3 L; Q! p& G; ]' R3 ~
! \# [6 ]1 ~# C/ X4 ]* L4 W
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png
8 [. t, \% m9 }' i& H

+ e$ K  ]! |: l* z

2 C( n* y1 |" I" L( h# `
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。
) s* O  m% u+ ^$ h4 y, ]# O3 O. P
$ l9 w  a0 |% N0 n; l% \1 W/ e, \
原创:王青
5 Q  Y( V- V6 ]' O
( Q. z9 G# J& X, L

本版积分规则

QQ|小黑屋|手机版|Archiver|艾拓先锋网 ( 粤ICP备11099876号-1 )|网站地图

Baidu

GMT+8, 2019-9-23 07:05 , Processed in 0.156403 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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