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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

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

参加活动:0

组织活动:0

发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 adminlily 于 2018-11-5 10:13 编辑 5 L  m4 X4 k7 R, J0 O

2 I2 i1 w$ L& j, V. `" {7 m6 v
背景
. n, \/ c6 s! O, K. J4 ]. W

# G6 J3 O' ~6 {* N7 a  j# t
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点

, h/ m6 t' `8 j
2 h2 C+ `' p3 v3 ^) d
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png

$ t) i( ?' K: e- D) x, H
+ P7 W" B6 v, k

) `8 _, H2 k! w8 ?  A5 J
当前的数据库变更方式已经过时,数据库的变更存在以下问题:

7 O( O0 Z8 I3 W6 _- f

5 K5 f; }8 _, v+ }; O9 r
1.依赖人工修改4 z# _- p- e1 y2 W
, u2 G9 s. T6 J% s% l& e9 L6 m
3 M+ X& X& Z& E7 i: _
2.速度慢。
& D5 @# W$ I4 X
3 V  E% A" h0 A# b# k# ?% S
3.风险大。
/ B; S7 G: o. T! u5 z$ e
7 f& |' D& h' @$ p4 T+ V% A2 }
1.png
7 |: I! i4 Z1 F9 F

8 |! x8 T! h3 z
# h4 T8 N' X# d0 A0 U
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。
# p) n6 R4 I5 _9 K0 ]4 [

; Z1 J5 L- f( u" r2 c
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:
; p1 B: N  J6 t1 x+ _

8 U8 Q' @0 ^3 Z5 F% z
1.png

1 V8 _3 I6 ?2 d4 o7 X

* n+ Y" E0 K* ~
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。

; I# X% D) t# Y/ [/ A
7 c+ A( l- [: F
1.png

; ~1 T3 _* O( t, V& ~) A1 h* E
$ `' A! x/ v( T/ L' I* w

+ v5 ^  X1 r% Z- y. y: E
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。

2 r7 Z4 i9 a5 e6 }
. ^0 N1 {  V: s  Q$ R( ~$ ~
1.png

6 z7 f  H2 m: X1 C

* F" b. Q* {" H9 z' t
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。

% G; g$ F1 ]2 o+ j$ @6 b2 t, W

) |  [& ~( V! Q( l$ n5 {
1.png
" Y  }7 r; [" s( }3 T+ s# B& e' b7 G
' V6 R9 l, Y; }$ |" S+ J! Y) {
将数据库的脚本版本化存储起来,和应用程序一起管理。
2 A: a" `+ t6 g7 l% u, }) d" v
; o) H  x3 ]. |% t- x1 u
1.png

* }* C+ E& h% v

! h8 J9 A; o! A6 r* N
Datical 带来了他们的最佳实践:

9 s& h4 P( t/ L* G# l" ]( m

& m4 v- B, G7 X' E3 l8 v
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。* D0 Y2 k' P9 n0 O/ k/ L) H
0 w; T! F. e& i. I5 L% Q/ ?
/ r% o/ M. p5 O
2.使用 CI 工具上传构建信息

" g% Q- o' L( A6 a+ ]' A8 P' A! ?% \' K6 V, i6 @# s" H4 a
+ |" N( o/ w2 C, [8 x

6 ], m8 W6 |* F( n- ~5 V8 `
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。
5 @+ P4 x1 A) y  S/ d& j# ]% S1 D; z6 ~
" [1 }) K% u, f! E  [0 i

. B! p* }) d% A" C3 q9 Y: r
b.将制品上传到 Artifactory。2 n1 T& ~: `! D/ x
# g' i( }- o) x' {2 D0 {
7 `' t9 q' |" \! c% D9 t
1 @% j7 T- E0 i8 W* E
c.通过浏览器可以直观的看到所有制品。" c: w. J( Z& n/ {/ F8 Z9 ?! p, Y

! m  H! Z' I: f, i2 ~4 Y8 g! ?

5 Q, _' ^4 j8 @) ?( W! _0 i: m3 b) q; [5 C5 d6 O9 x
d.版本化所有脚本。
& S; W/ \! a9 q7 i6 G* X( A* U& z+ {& f4 \

/ m% [1 A" j( q' p  V. r3.为所有制品添加 Key-Value 的元数据进行版本化。  e5 a( T* v7 ]1 ]1 U
% T3 U0 Z/ A( H5 z5 ~) A

( u! ?; g0 {7 @$ q
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。

. k5 n& S8 S5 Q8 D8 M2 D" a

( X0 k7 T" d$ G2 H& J
1.png
5 q, t' z, V' c7 \6 Z
- Q) g$ f: k7 F6 j! b1 a
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
- I: h! g# w1 y5 e& I
/ f9 D9 S  Z. _/ v6 q3 I+ a0 ?+ l: w
1.png
8 u; A% H6 s* D( z# r0 s
: H9 o; j, T$ `) W
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。
) a1 z: M( X& t* {7 A- q' P8 Y) i

0 a3 n( F8 T. v5 x7 r$ a* G
1.png

( q9 G* W7 S- R! ?5 j

- y1 |. C: G  G) ^0 Y9 c
好的数据库标准包括:

2 R4 B8 I* p. s8 y# v

! t# z5 A4 D* h7 F1 q
1.在一个索引里不能增加太多列。
! K* }1 r3 |3 P9 r
( H. I' T* u# A( T3 L7 B+ x' _
2.在一个表里不能增加太多索引。
/ J6 H0 U- n+ q- f4 `) S% n
) K) M1 Y$ |9 P

2 A3 G( x7 q* ~# \5 j( T: r9 `" D
3.外键都应该有索引。
' O2 V& r8 [$ Z" a

+ M1 b. P4 X# u

3 U$ ~/ x* t3 ?, F& Q& i" ^. |0 Y, j0 U& r6 y1 K% Q
4.不滥用数据库字段空间。例如 VarChar2(100000)
  S6 ~3 Y6 k! R/ v3 n, m, |. W; P

, I' P/ J* o% v; A

5 j" z, D- I2 B* r+ E8 I5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。
- B0 d& P* w7 Y- m4 Z7 F% F2 L
; a- @) e9 M% U4 y1 v% h- k
1.png

, c3 Z! J6 v5 S/ }, i% M# s
9 Y( t9 Y7 |+ @6 F( r

, [9 T/ ~' D7 F" k% F9 [( u( m
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。

1 d) {, T) K& ^9 {
4 V+ F7 ?6 Q* Z7 V6 Z
1.png
2 p! Y3 X5 Z/ u0 y3 _- x& `9 F

, M# N! {8 b: O" S
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。
" u2 D5 h$ W4 H" N: S8 b1 k

$ J9 \" T1 O' m) V1 V$ F1 }
1.png
; o7 C, c6 ^! j+ H' P0 T
; K8 F5 x- ^7 d7 ~/ q/ v( |/ c3 i

- g0 @" h$ N( ~& @$ B9 ^: j
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。
) ]* y  x5 g) P1 k3 r$ k
1.png

, D3 D- ^% n4 j+ T* d! G7 ~  _

7 Z% ^7 @# `- q5 R/ y8 p& m
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
1 L& k) n9 S$ ?) T1 C' E5 Z

; D* V9 c* h6 s5 l# R' l( M
1.png

2 @+ {/ H: z+ p, l" `

* p  q& t5 m5 ^
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。

/ L- w, G8 w% B0 n+ _2 E2 [
1.png

. L4 {8 T& O# i+ ^% X

: o1 w% N3 n! u
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png
# v% h. t* o( {9 \6 k, T* c9 h
9 e8 W9 ~6 T; [
6 G* l- q/ w. f& H2 M
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。
* S' Y. _6 Q" k, X& y% R
, ~1 o$ [5 j/ ^% n8 I
原创:王青
" e6 I  ]+ ?% v

& ~3 b$ X- _# x6 \

本版积分规则

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

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

Baidu

GMT+8, 2019-4-25 00:40 , Processed in 0.211658 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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