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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

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

参加活动:0

组织活动:0

发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 adminlily 于 2018-11-5 10:13 编辑
7 s& B' @2 ^  R) C  u( r" ?; a5 U; y9 e( q5 _
背景
" x6 V$ Y& _4 H; V' b- b3 f

( G7 q! `+ j. S  Q
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点

3 a4 ~6 M, [* D$ y* C9 ~! Y8 c) h2 ^
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png
$ D8 [) A1 s, i) [4 m; Z

7 D$ Z: c: t+ h. t/ G3 M+ i% R: Q
) ]8 o; A  \; y' B+ m+ m$ H, e
当前的数据库变更方式已经过时,数据库的变更存在以下问题:

- @1 C4 w. c6 S" s# }. P. g

5 k4 H$ ~9 U% H# p; z3 M0 K
1.依赖人工修改. r% }  @. q4 e9 H4 {

8 {7 j$ _; x) h& `# [- j# r5 w& ?+ s) r. p% I& Q9 Z. V
2.速度慢。) a! c9 Q# C" R* C2 |# [
) c1 x% p. N( Z% d8 x8 O, ]8 g
3.风险大。% v/ k: o( c3 e% [
/ Q5 s; B, T! q' h  H
1.png

/ c& U4 x& f1 M  H

& J) f; ?1 z0 D( n) D1 D& ?7 \! W

7 C& t1 s6 c. @# W& c9 c
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

6 w% V8 y. j! S& I5 y7 s& z, q
: L8 G7 Z7 u6 E/ A& e" ~! _
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:

' @0 V+ W0 z  T' S
4 N9 w6 Y" O/ ~" m- e" u( u
1.png

4 u! ^- u7 ~: D  Y/ F

4 y4 J4 m7 t9 M. a
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。
" t" J* h7 v! N3 z! G% w

% n& `8 w: q: V# S; I4 m
1.png

6 U% U5 u! V, m/ E, Z' s# ^

, Z6 U+ R. g3 \  K2 H
7 e3 I' f6 o/ r3 |
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

6 |5 M& z% U& o5 Q3 R; ?' T
. z& P5 m9 @% b( u0 O) k/ w
1.png
* L+ L8 X6 @) U- v3 d2 N* |
; n: h) b2 ?$ e( ]$ V2 U
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。

3 U2 U+ i  T: C/ i4 B7 }
; L6 G' r# l& m& @/ U3 r: N$ l
1.png

( R) ?. k& @7 b, v

3 q% J: c0 o( Z& G9 L, l! @
将数据库的脚本版本化存储起来,和应用程序一起管理。

6 W. X- Z3 [; L

7 I  O9 C4 |7 I
1.png
1 M/ t' I, n, L8 O' x. {; |/ q
$ P( y- H6 D/ n1 Z6 ^
Datical 带来了他们的最佳实践:
# k7 j' g% c# \9 s) `; Z! v

& y# z* ~7 y' a/ p9 u
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。; b) a2 |! h* y7 h
  x/ ^& D9 X' ^8 M
% {% Q$ k: q8 g. ^* a1 v
2.使用 CI 工具上传构建信息
8 D: e& ?8 p" O3 s

$ j3 d: W: `1 ~1 |1 p5 U6 @( m

& @; C: Z+ U1 W, |& l! r4 c: V/ e4 x! n
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。
- Q" q& Z, {% M% V/ P" Q
8 u* ]* D/ H$ w% U* ?

7 ~* U6 g0 J+ a. r/ S8 q$ P9 f
; _' p6 {6 _. ]. O5 `- _; d& t
b.将制品上传到 Artifactory。
& Y$ t. }/ m4 N5 X2 y  q! y7 E4 |9 D, p

/ @: K! w# e% \; K: J3 g6 w5 s5 a4 Z0 L& y& P* t( N
c.通过浏览器可以直观的看到所有制品。
8 s+ M; G9 A5 N
! ?  M, ?! e" ]6 E/ O0 H

4 D0 [  R) T) C8 x0 ?# p3 I' W  o( q6 H" @" K* Y/ z: x
d.版本化所有脚本。
3 K0 e1 i5 f2 V0 G9 Q$ }1 {! \' O( @! H
% M( r0 R3 u/ e. ?
3.为所有制品添加 Key-Value 的元数据进行版本化。
! M8 f9 K; {6 T( d5 N
/ C+ }5 m0 [2 V! _9 j

7 _  m' w! r: p7 m0 P# J1 h
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。
. b* \# F4 Q: _! V1 V" e

0 v+ H9 A- N! V- [9 Z( |3 ?
1.png

: x2 p: z7 t7 T8 t7 _- D5 ~
. M5 [2 [/ [+ Q4 f' s
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
% {  n1 @& G1 T
0 k0 l# ]; C' S1 @' K1 Q' U
1.png
) q' F) |5 i! z# d- p) u3 Y

2 e0 v; K+ r) b
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。
+ ]# O% Z% {" W) {* K
+ ^6 i: P7 h, Y+ M  \5 D6 a
1.png

6 P# q5 O0 z% J# E

! Z- [9 [3 e3 ~- x+ [2 l
好的数据库标准包括:
0 o$ m9 A: F) W" i# w

- E3 i5 M$ P4 T5 K2 u9 F
1.在一个索引里不能增加太多列。
' v6 V% ?4 o4 |' @' y& C% ~' I, D, V
2.在一个表里不能增加太多索引。
1 k% R: M+ L& U& X; R
* h8 ]6 X  s. C# m! c8 D

8 i/ R! C; s7 K  M. w
, J$ W, {: D6 w6 v/ `+ Q3.外键都应该有索引。

- ^* ^+ x. d* y+ c0 i7 z3 I: {5 A5 @% j9 |8 H# L3 ^9 X4 u2 R
: j) M: n4 ~+ l: b# v* `- T

" k. U8 O: X' u& ~: S' P( f4.不滥用数据库字段空间。例如 VarChar2(100000)
6 M6 s; Y: }9 G% `. D+ P
) v  L, s# D& ~  L! L& D' @

/ A9 J; j* ~2 E+ B3 j' b5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。
2 ~. _) `7 ]3 y* Z  J

2 h8 X+ ^5 V, {
1.png
* Y& [- L( x* A9 |
4 L( l- W2 ^# k0 Q7 ], u. J
6 o; A4 }, I, g2 Q4 f) \
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。
* x5 l, w+ i' i( w: m" h  ~
, B2 V" D  C9 A
1.png
  Y: i  {- x7 {/ J& B/ R

8 [* o; A! m8 ]5 F8 R! d- ~9 ~
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。
* K9 w1 C7 N* `* ~: Y4 C3 l6 Y7 m

. x' J4 \& w, l
1.png

1 e% W/ ?" |3 }) j. P1 C: a$ O

6 w. j0 l  P# B2 C3 C$ y5 g% o
/ ?- X6 G+ \' z. i# o4 q
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
8 g/ c6 m# j+ o! \# y
1.png
, H! }  v2 p% ?; z3 u* G4 e

1 g( A% Q5 f% D9 a" w
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。

# v& y( v' c+ K! V# H1 O

4 H+ h; S# n. h5 G
1.png

" `; e: m! `- R. U0 ^( J2 u

  [6 C8 P$ H! W
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。

5 U4 Y& n- ^# m( @1 D: p) `  L$ ^
1.png
  ^1 w+ @2 z* c$ p3 U, \
% R- L& E  f8 N( o
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png
; v1 O! Q3 M6 v( v' w: [4 |
6 X1 D5 z* g7 s
4 f8 G- f9 m+ B# i  u- S- u
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。

. e2 ~2 k* y# Z$ S( B2 P5 @* S2 ^2 p
. {7 R- i0 q) Y2 C, }. Z8 x
原创:王青
5 n, w3 ^' S- w* [  {. v+ U3 |% V' i

  [9 i' s* [6 `" u$ S& l

本版积分规则

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

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

Baidu

GMT+8, 2019-2-24 13:52 , Processed in 0.212630 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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