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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

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

参加活动:0

组织活动:0

发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 adminlily 于 2018-11-5 10:13 编辑
  l) a( |, D% U0 \( |$ Q
  S) [6 a* r9 Z" Q
背景

: E- R) {6 Z$ G# |

! w: ?* Q* Z% N6 H8 O; |  c
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点
. g& P# t8 ^8 ~& f* Z
. T% o' H& }1 U1 W% g9 c. C
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png
+ d- v, P) b) D6 z
6 S: k, R2 h$ Q9 i6 H

$ w2 B* J) B) W9 J
当前的数据库变更方式已经过时,数据库的变更存在以下问题:
. W! v. j  P& p+ X
! H- A# p0 ^6 B, w
1.依赖人工修改
! B8 j% n/ a! N$ j/ m1 p2 W
0 _( ]( i$ _4 S! u( \5 e# T
1 V" F( N1 m' k5 j
2.速度慢。
. I8 H; m) e& o2 V
/ w9 R1 o. E2 }& C
3.风险大。
( j- P5 f8 t4 p5 K: z% d% ?* R

+ A- F- A, \( e0 p2 A
1.png
/ Q# `/ m. i6 k& |/ M4 W

# O3 j% b0 a; w# O/ i# E
- n. e; u6 f/ B! ~& Q5 r- q% t
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

6 o7 o0 ?  }; F! W$ ?  G; I

7 _6 O  S' P& u5 G
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:
) s8 ~4 B; R' p  C' C& T6 ?
! ]7 F" B: Y6 }2 Q; U! Q$ s
1.png

; y2 f, H# w* }+ ?0 Y1 O

; H8 z4 s0 x# [7 [7 h
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。
) t* w& d* N' A7 q( c& K8 k; v3 @

: ^9 L& p0 ~0 C6 s5 b$ e4 ~
1.png

! }5 f1 ?7 n. F7 G

, ]3 _9 j, J& E  z1 M6 f

* k5 {' h& W$ ?2 b" H5 [9 q" N% L
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

& {3 r6 k: _0 V; D

2 p" k* ~  b/ }  W/ t( o. f8 {
1.png
3 X* y. ^8 U2 J1 {& o/ h

: D; H& N- B# d& ~$ H1 \
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。
# s% X: m" D; _$ E! a% W
  _$ v  |5 c$ k' Y& ]) r
1.png
( g/ J  H* L4 o
7 b4 b/ J$ M3 s, y- l* V: v3 r
将数据库的脚本版本化存储起来,和应用程序一起管理。

( n9 p( i+ h1 m4 p6 s' X

. H- _: v) H: I* j" ~2 c# r! t
1.png

- ^) r: y5 A' U& D6 G
, m, ]/ p5 T4 z& U
Datical 带来了他们的最佳实践:
/ H6 M( }, e, V: i9 a7 z/ a

, ?2 b- h" ^( g. j5 D6 p* I& J
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。( u/ e7 ~  `" d5 `) w; u

2 ?  }* w8 p% J8 }9 j. g& N" @8 t& X9 G' L: r. E: l4 ]& U
2.使用 CI 工具上传构建信息

8 Y6 |6 P4 V, ?( V, j' \; n/ M* c3 K
/ a, G: M4 ?: L. p- P  h
- ^$ c  Z4 q1 [, r
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。8 J; X- e: F7 m! Z

6 [. J/ _6 U- r5 i! V! {

; ]2 m+ z4 l/ f8 y
- R0 T7 |3 O+ b) c: z2 w
b.将制品上传到 Artifactory。# N6 E( m3 f: e! U! m
/ `4 O9 g( c: [' q3 N
  e" ~; b( [, S5 S& s" N& o

! Y% V1 |" J7 y; e; T
c.通过浏览器可以直观的看到所有制品。
  m- t: W# _' L) T
* e& R3 m. |$ `3 \

. @- s$ s/ F7 p0 T* [6 b; s0 {% x6 D, O
d.版本化所有脚本。! S8 d; t! s+ {1 D+ L3 R- r
+ n/ S, J& d  z4 f
/ U& z5 _) y! s: H/ I. h3 i
3.为所有制品添加 Key-Value 的元数据进行版本化。# T8 U6 a' N9 `
+ u% C0 R0 X" L+ @+ o/ P6 B

" C6 j: ]/ t. f1 c
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。

  ~9 c+ _$ C1 D+ Z+ k8 i
+ h5 w$ E* D: M* D: U; e4 Y; i1 ?
1.png
2 Y  b1 d2 x+ V# Z

, r5 E" B( y% Q# W; D& ]8 R
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
0 O$ ^. Q- x. t

* g5 u0 t; c8 W1 J& ?
1.png

. U5 @* V4 D% A! D( t* ?
* ?3 g* D( f$ p5 L  L9 Z
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。
& Z9 L2 e" N6 T1 ]4 D+ Q

/ \- V7 [" F( |; K& `1 j% G
1.png

9 I' S( h1 F- W4 v/ U0 ^

' J3 j4 p* I: U2 r. ?& G
好的数据库标准包括:

1 e  p- Y& L9 I2 o

3 M. }; Q! H8 {( D. V# G1 F
1.在一个索引里不能增加太多列。
5 ^  s) y: w4 K9 n% e$ b3 w( B8 N
2.在一个表里不能增加太多索引。

' f8 g& y8 X( s, K; F, s6 Q- \  v  m0 r  V* E
3 t: f4 G  I* m9 Y' I
' ?. t0 A# ~# A$ w. j
3.外键都应该有索引。
! C5 x; U4 D0 Z# w$ Y& u* J! {. W
4 v  o- G9 T, g6 @: g' f7 R
7 O" w6 F9 R: o2 m0 C

8 ]5 T( N% M  C: R0 W- x4.不滥用数据库字段空间。例如 VarChar2(100000)

" |# j9 |3 ?, K# H6 ~. Q) ~" b" o. X& q

9 B: P+ E4 f% {$ X3 L7 d* u+ w5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。
8 B3 K4 }' H) G& s* F9 j
9 h# H1 s6 L% x: P# e4 ~9 `4 o+ [1 L
1.png
  L2 `5 f: h+ m
7 ~0 w4 u9 v# U. E" K, M
) o+ J! X! O! \, C, B% _
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。

0 Z* ^# j. O# L1 t

( t( E. I2 V* D( x8 l
1.png

4 F1 t0 ]$ S8 y9 L+ O# D: J% }9 D
2 ^0 G# N7 p: b9 e# p5 b
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。

& b1 r2 V& t4 ^: K( \

# |* H* r. [$ w, K. a. P" E! `  C
1.png
7 O$ y- }" R" T+ _3 f$ O% Q

" |6 i# x/ I% }# T, H

& H1 h% S  X6 X1 O/ q, T  R
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
. V! A- ~. E6 h$ s: G
1.png
% x' A9 E/ H' o
# u5 w' k: G: [5 q0 i1 ~! |
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
; @, j* L& I( c/ L/ F; x( {( Y

3 _, v, G2 ]! r/ Z2 z) e2 q
1.png
- O% {0 a! w8 J/ o

4 V/ y( S. g0 m6 A- M- I+ R7 Z1 G
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。

! F, @+ d5 Y$ V2 M% ?; G
1.png

! D( S2 F! T! D" i4 o+ Y  [* F8 }

3 F  r; g- p0 V% E$ j
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png

- S. s0 d+ F0 u4 |: y0 h- e' O
# Z1 }5 T7 l) a
( f- L% _2 \# j
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。

& X5 u! U, `9 r9 k3 e
/ y4 G/ b5 p* A1 k
原创:王青
5 f& u0 }  z2 ?3 u9 g5 [7 w
" M, ~& C" i+ w; C

本版积分规则

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

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

Baidu

GMT+8, 2019-3-24 07:16 , Processed in 0.209320 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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