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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

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

参加活动:0

组织活动:0

发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 adminlily 于 2018-11-5 10:13 编辑
0 v, P2 J- \( W; l$ S3 P' v8 w! n) l! z5 M
背景

" L0 @& V5 r. ?* j7 V
* X: W# V  v+ M& W  A- b; A
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点

  A5 X) F  e& ]1 f6 v. V* S4 `; ?# Z# [# Q: H
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png
" J5 R/ b0 n9 r& o9 e; \/ m
8 D& L1 T2 _  J2 Z+ ]7 S

' ~1 \( U) z) g* m
当前的数据库变更方式已经过时,数据库的变更存在以下问题:
5 T- i8 ~- w* B7 \5 N
+ Y9 H# j2 V- m; A- _8 y2 H, U$ Y
1.依赖人工修改
4 t" u4 q4 r. m/ Z
* L/ I4 i$ f; \! N
3 ]' D6 O4 _5 Q2 q
2.速度慢。
8 F) |3 @, H, j$ Y; w8 K% F- P0 p! J/ F
3.风险大。; C' S& L( T4 l* T, d8 X: j5 ~- I( ?1 }

! {6 f8 y# o; @6 m8 s
1.png

1 H& W* c/ _! J1 G: D! p
6 T# e) w* _0 q  E2 ?4 h: u9 l; z
/ h7 P8 h0 r+ i5 a2 B! V
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

! i1 `2 x+ N3 Z% M3 Y# `& |

4 a, i1 |& d, C: E
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:

% M6 p# F5 W7 F( I, {! h

& J: e) Z5 h. e% r% g( G' f) `
1.png
5 S+ P7 ?* ^  g( B( E; K2 u

0 y8 }  H* }+ O$ I2 |5 F# K
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。

7 g9 F2 L& i; u3 R) Z( K

8 h9 r; X* R$ W* t
1.png
5 y6 O, I0 U9 M8 x$ P

# {9 t$ h' F  T' |5 W
: P  R6 [- ^5 Y, o- X
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

" n- p+ b- l) q6 {8 x. D
0 o% b4 s6 T6 y
1.png

& N! N' M  o1 l" s9 o+ t2 h

) L- X  {% `. ?
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。
  I; u. X/ p# @
: p$ L, V8 U- r8 Y, C& h9 H; x
1.png
* g( j' u' H2 `& t* j
0 m! d& E5 y( c
将数据库的脚本版本化存储起来,和应用程序一起管理。
! b  U9 [, t& v4 X& G
9 t- |3 @7 _1 X2 p, M
1.png

4 [# @/ @4 V6 i
2 ]  y2 x0 C8 {8 ~5 H6 ^* n4 L5 ~
Datical 带来了他们的最佳实践:
: Y7 |. n  H+ |0 c

# l! q' f) c. m9 g
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。' N# d/ i& G& A' o6 b
4 x7 l2 v% ^' G/ o

7 g* N! N; T- X) k' _4 j" K2.使用 CI 工具上传构建信息

+ m3 _: {. i( x5 f2 S5 }* n$ n' G- s4 [

8 v8 Q% D8 F! E
- m7 ]% K2 y; P1 Y' ^" @0 l% q( i
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。+ c+ T& [* j1 B4 i: r
6 w: ^% ]8 K# }3 Y% p' ]

2 x4 X  M2 p5 i8 P+ J! |0 ]  b: I" o# b' \1 U
b.将制品上传到 Artifactory。0 S- X# G, M3 |
2 {  f7 w3 Z* ~1 k/ O

7 f* D0 y  O! Z7 ^1 X
2 @& _. W* P7 A0 A, B9 z& w
c.通过浏览器可以直观的看到所有制品。
, o# m2 l" ^9 h  r" }; ^$ p' p# H9 ]: _' i: j

9 Y$ N: r& `! U  S" I
' l# w( E2 T& t7 i( W+ l
d.版本化所有脚本。
- l5 n8 l1 n9 ]7 D9 ?9 v. W. T* e1 R6 K9 D. i3 F

7 m7 E2 i+ v+ W7 S. z9 c3.为所有制品添加 Key-Value 的元数据进行版本化。
* C$ }. `* m1 `- U9 {& p
4 O, }' G0 E" L# h
( g8 V  B8 R. @0 n
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。
& W- X; ~2 ^5 x, i

- m9 r8 `6 T; i* |) [- _& l3 u
1.png
! a; @0 y# o- y# j. K) x

9 l5 S; H. Q  U8 x. ~8 U
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
5 K. o/ O2 y" V2 O8 _9 C
5 n4 |5 j2 K0 @6 V# C/ t
1.png

, z7 i1 I- v% p; [

  \* H- M1 M+ V; L" l% v
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。
  L. S$ w; r4 T1 e8 a
4 f9 |) u6 v! U. i
1.png
& m! |5 Y, y% K. P' a
& O. f  t6 z, c7 D  Y
好的数据库标准包括:
& h' J# J( c2 c* y/ m1 P

/ P) B2 Z1 N+ u. e; Y5 t
1.在一个索引里不能增加太多列。
* D. U) o, F8 s5 |  k  |% Z0 W  U3 ^' D3 o
2.在一个表里不能增加太多索引。

2 C1 n1 `/ y. Z+ U
$ W+ ~* k& z& F0 P

  a* I0 u  _0 H# d) s8 S
8 y( U) k/ N0 k5 t+ _3.外键都应该有索引。
$ Q* A$ t8 k9 r) q& k

$ e: M( C" D( P1 V
) I6 _; j  z, l. `
! y  B7 S( }( m9 n. H" b
4.不滥用数据库字段空间。例如 VarChar2(100000)
: ^# }# b' n8 p0 H
3 z( {  m! J: X! w

0 t" M% G8 R: E, ?1 p8 {* t5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。
  s4 O  G, V1 `+ o
# n0 a  p1 p# |6 K7 j
1.png
  [. H. y: B, |" Z- {/ X; ^
+ ]+ J% z) F, n. F- b1 [. q6 _, G

7 }- ]  L8 j; m7 z
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。
5 w" ?% L+ {+ X) x( d* o

' [; i& A, T( ~" u8 Q( C9 B
1.png
, l& a3 W: }+ {5 V2 K
. m0 a- x1 R3 D+ ]5 K
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。
+ a2 q5 s# S, V) U6 Y

7 N5 Z3 B* l7 n+ l4 X- ~
1.png

0 U3 T3 c- b; r4 x7 E' w6 c- c8 N* w
2 q& `; e1 G  [) ?

( D  t$ b: k7 a6 `9 h" w$ ?
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
0 {! l! F! D/ p8 H. q; y# S9 v; A7 T
1.png

$ c$ c6 J: l  j+ c; K

# p' _% J7 B6 k6 _2 G
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
! l. J9 H+ D( X5 k( e
( l& H2 j. |9 _/ G/ ^9 p4 G
1.png

4 Q6 w9 Q& T6 r# M+ E/ R

! A8 B% ~# b: t, s7 {' k5 u4 Q
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。
" ~9 z  m5 h8 u" r# m* L7 |; ~
1.png

7 @9 ~: H9 o" `0 |: R# M, `

5 u" v7 [5 t# g+ S0 O# F$ R9 n
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png

' }7 Z+ h$ K* U! }) W3 J# x
# w" K3 M  x% A) @5 \: b8 u
, u  R8 ]0 v% Y2 y
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。

  }/ z+ g8 u: e8 J, J
$ K' j) k+ ?4 t% u, A
原创:王青
; h9 c( |  w7 J6 x! p6 D3 @
" e8 r8 C1 p* a- a. @

本版积分规则

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

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

Baidu

GMT+8, 2018-11-20 04:25 , Processed in 0.229060 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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