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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

艾拓先锋
搜索
查看: 91|回复: 0

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

[复制链接]
来自- 广东广州

参加活动:0

组织活动:0

发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 adminlily 于 2018-11-5 10:13 编辑 6 c5 x$ H6 J% z/ z+ M2 k* Y8 J
1 A; K; R0 c- B
背景

( q( Q' F8 ~" v+ W

( l' @* i( s% u1 X7 w
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点

- Q5 B, B- C% b; R2 o
  ]6 A% c& D  X9 Q
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png
3 w. T" j( Q' g1 X4 L8 O

, y: w3 o2 O, l+ U2 W+ Q9 W
* F3 {! z* b8 }/ z/ `9 P
当前的数据库变更方式已经过时,数据库的变更存在以下问题:
1 R$ H4 R  [8 r( x$ Q3 {

) o8 d) O4 {9 I$ P
1.依赖人工修改
; N  J5 K/ d+ P0 C5 k" U
( ^1 L, |4 C( e
( M& B3 G- F$ G) C1 n
2.速度慢。
8 u/ O# A& _4 p, N+ N
. N" h; D% F2 i; h; b4 i
3.风险大。" B& w" S7 I4 j8 g" X. C1 m& f4 z0 A

6 L$ H9 y% k, m: T' g1 A* s
1.png

3 K4 r9 G+ E+ N
  }6 Y. S: z. H5 f
& v+ [! C; E  O! v
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。
7 Y$ R5 w( j4 Z* x8 M) F6 c5 j% E

, y# J+ C) @% K
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:
+ X# ]0 f4 w) K# d

2 k( D" m  B, j/ ]' w. E" [' L3 a
1.png

9 n! ?, [) O6 K

; R3 ~3 b7 t2 m/ r5 d, f
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。
8 A' d9 y" ?; u- n7 h

% J  m/ h  T: u
1.png

4 r- l7 v9 c. K3 L4 z  _) T: D8 \

) W$ \- w, H8 m2 W
7 b  ^7 b) o( R6 N2 E2 j8 L+ O8 e
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

+ l- L6 r1 F6 }4 V0 y% _

$ i. M4 j+ C, B6 d7 l7 [) X: ^
1.png

6 r: k; s; T6 R+ X2 v  n# Y

' \5 `5 Z% d# i" d( n, _& f3 [# N. U3 ]$ \
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。

" E$ u7 j4 e: p4 T

6 j8 g& o9 P! H1 q
1.png
* w+ a/ l* M0 x  o& g* a) o" p0 _
, e: H2 A$ j5 m& \
将数据库的脚本版本化存储起来,和应用程序一起管理。

* S1 u8 o: j' k( E1 r' V: @

" F# M$ V4 X4 ^
1.png

4 y4 I% O, v  p2 n* ^
& n3 @/ x) O7 B% v/ u) f
Datical 带来了他们的最佳实践:
. G& f, v. A( Y9 f

, {; t# j$ Q5 n, S
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。( W) L: z! E6 E! T, ?: P
& X; W/ E! \) b# t" z

+ z$ [0 Q/ E2 G) l! w4 W: c2.使用 CI 工具上传构建信息

* O! W' x8 F3 a# r1 D: N5 }' M, I& s: c$ R4 g

+ J0 b! Y3 A8 _$ F- l; M! _
+ h/ }4 ~5 w- S, O$ u
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。+ R8 V  o) }1 s6 ~9 M% J

3 f8 z! Y/ F. r1 C# A) C
: `: f4 |7 V) N) i. C

+ ]4 O1 H& P% R3 s/ w
b.将制品上传到 Artifactory。, h$ V( A+ w4 B: B
7 q, g. V3 ]) b, X6 Q7 K
+ |0 d% m/ V1 \. \, z) V

/ @) I4 U4 u4 L8 T9 W
c.通过浏览器可以直观的看到所有制品。
7 j9 ~5 e" P& Q8 J9 f+ q& N$ U9 Z) s3 k3 ]! f1 l

% M6 T/ F, F. n& o% x% K0 \* F7 c6 F' @7 Y
d.版本化所有脚本。
1 C' O9 E" q7 C; ?. R( r( f
/ r% g- s& b) [: e- H) k" _
& O) r2 U/ {$ ]6 B+ V3 |  @3.为所有制品添加 Key-Value 的元数据进行版本化。, |" ?+ g6 S# r' ]7 q
8 k0 n& Y* n( U0 f, [9 B( M; e6 v

# J1 Z8 E% p5 i$ [8 W' p
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。

# V" v7 ]$ N$ s2 d. C
7 ~+ l$ f, ]# @9 x" _: U  `
1.png
1 {: a) r9 ?7 c/ n
$ U; \. c, B- e
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
7 L1 @' i$ L0 _/ U$ b6 K: z3 H

0 b1 V7 Q4 ^: T. e& G
1.png
& T3 ]  m7 @! q; J  w

) v& e  T) N" Q
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。
! K# e" u$ `+ v. E2 d! D9 y

+ _. j& i9 n* W; }: J; H! S
1.png

& I. h1 d+ h+ m, ^  K

" D9 Q6 ^8 {7 L2 H4 B! d+ H
好的数据库标准包括:
/ {$ ~2 `& N( |7 j" r

" P( ]+ U1 ~# V" l2 U1 v/ r
1.在一个索引里不能增加太多列。
% V  K) L, v( w1 V1 e. ?$ B9 f0 R5 c8 t2 ]- j7 a. c5 Q0 U  ~
2.在一个表里不能增加太多索引。

% \* ?4 H: c8 ~. Z$ ]; {3 a* D, C& D) R

7 ^, m  _" x2 a3 ~4 g* l7 G$ K8 o* Y  O; i
3.外键都应该有索引。

0 g7 x; }7 r( d& c0 Q; V) l# O; \- d7 F/ B  ?& M! ~
0 E9 r: G) o- f  w0 b
  X5 E1 y% T& m
4.不滥用数据库字段空间。例如 VarChar2(100000)

" [4 A/ Z/ E2 V1 e- A5 E$ V8 C; I
/ e& B" z9 `/ y& I6 F
7 b5 S' r5 @. j! G8 g9 x& o
5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。4 }* A; g" r4 _+ S5 ~* r
/ {0 ^% W% R3 x+ f; X
1.png

2 ~0 y4 d$ J1 \# K! p; `
9 x( U% @  a+ B
* S1 z2 h: r- q2 A8 k4 q3 f- y8 W
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。
# S% V- A3 K, ~1 p6 s

, N# ?6 I! O& A8 L0 a9 N- r0 H
1.png

' O  _) p1 K. h% t. \# L1 F' Z! L( H
: O7 [" N8 ?& r' Y" v, Z
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。
" i( C- o. L; ]# U0 f7 O

2 o7 T) k7 z' h' w6 C
1.png

) b$ }+ W5 n+ I4 V' y, t1 A9 D3 E
9 f1 T; ~! S% p6 B. c
5 Q+ J+ R. a: J( Z. ~% u
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
9 C# P4 d* N5 S' u8 v. x
1.png
- R/ h( ]0 R7 |# F* r  M% n' {

9 U+ J1 B" W1 c% e  V( p, r
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
7 b- g# \) N' r$ U& O# p

0 S2 ^1 [  O1 k. T) x" Z. E2 P) U
1.png

- H  E$ u0 J' K* W+ N* g4 \

1 D8 M; [1 Y4 U. b, |# w# m
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。

& J5 K5 v; ?2 Z9 l1 A2 V
1.png
  e" p2 k# l3 P2 o( ~9 N

8 H% \8 x6 T- \" |; e! e) R3 O9 d
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png

) p5 c2 c: u  V5 S9 e3 _; Z; R/ {/ Q. |# F4 z+ R
3 L, A7 H  C  T% F# m9 P8 V
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。

, a7 r( O# M2 P; ~% u1 G* @( e

, B' `" O) C" d+ u, m
原创:王青
+ A. O" b9 ?1 c+ ?' M( ^4 q

% |, V# J6 W( c8 F8 U9 P

本版积分规则

选择云运维时代的王牌讲师-长河老师,助你轻松入门ITIL Foundation培训课程

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

Baidu

GMT+8, 2018-12-15 20:15 , Processed in 0.227072 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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