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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

搜索
查看: 381|回复: 0

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

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

参加活动:0

组织活动:0

发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 adminlily 于 2018-11-5 10:13 编辑 ) O# f* V4 d+ A9 B3 b, q

" s( }; Q1 {/ _2 H5 e
背景

: D+ L& m' {- M4 b) P

" s4 M+ h2 d3 @& s6 r) ~" x, D
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点
% J/ j" I, c2 ]9 M( V/ w

1 k7 _3 _/ _& F7 [* O% k
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png
& J$ O3 S( ]) V1 o1 N. E
0 T* v) g7 D7 ~1 Z! u! F$ u
; L& f( x5 d: q& h  H6 ]0 ?  i
当前的数据库变更方式已经过时,数据库的变更存在以下问题:
9 y% c# |7 o  u% V+ ~: \

9 c4 J; v/ k7 \4 {. Y
1.依赖人工修改
  ~  y; R! d4 f, c( |) P% c2 B# R
4 l- A8 ^; V  @' {

4 w6 X% W* j3 m/ R" e1 ^
2.速度慢。7 O) f* b6 q/ S' S; d' K  Z* z4 z* K
' y$ `( L' a* ]$ o  K, S
3.风险大。6 V, }8 I) J; C4 p9 B) x

! Q# Z) f8 x. I* c0 h( M
1.png
/ S9 K0 [0 ?) a( s9 A
" o; e1 H& p% l5 b
0 `7 z: |3 X5 r) A
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

" [$ x1 M/ x3 B" A) ~7 _4 M- L+ t& |

4 A# W" ~& e8 [% N' s0 J
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:
2 P. I# N2 ?/ d* r- t
; W5 a" _# _5 R
1.png
  h/ I, R$ o# O9 Y7 v& \' i! v9 l
5 B- E$ k+ ]& u. S; y
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。

# G" u( n2 I/ x  e7 K# d

1 c- I2 T2 p; d: e
1.png

0 s9 Q. V5 D; G
/ M1 ]4 d1 T; R2 a6 h9 W

5 `( T5 |+ t% U4 R# I
亚马逊公司在评估团队效率的时候,只看重一个数据,就是软件功能从需求变成线上服务的响应时间。很多公司包括互联网公司,在提交数据库变更时,都会提交一个 Ticket 给 DBA 团队,其实应用已经写好很久,但就是非得等到 DBA 处理这个 Ticket 之后,才能上线。这种情况其实是延长了业务需求到功能上线的响应时间,延长了软件研发投入变成公司利润的时间。
4 C8 ?. n) Q3 N1 Z2 D! h

: ?" T; N- [9 I1 `% d* E3 n5 w
1.png

% z3 A& T2 v3 j2 O) F$ t. e" }" V

/ P2 I5 u# j0 ?/ o: X1 z2 B
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。

4 R( _" k2 ~8 k$ v/ f  Y
; @  X) j  `+ a
1.png
3 K( W9 o: O- p0 b+ f# s- t

: d" c  T% M. G9 s; u/ F
将数据库的脚本版本化存储起来,和应用程序一起管理。

+ S7 S! j, K5 y( ~+ R( T) u

# \. U/ R$ |, t$ |# V" o4 }# g
1.png

/ s! N* P2 _! Q# }- K) @
* H* w3 z/ ~7 h
Datical 带来了他们的最佳实践:
, T! ]. @6 r& ~# i% b
4 |& G6 M. y, [8 R  m
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。3 q- w) F0 C; r9 ?7 g( G

1 i$ L6 u/ b2 Q. N. r% t4 R; X. B. Q, k" H
2.使用 CI 工具上传构建信息
* C0 Y, O5 b% c- n- H, O
# g6 f+ M9 R" [" ]/ a
% v9 |5 z/ u4 O1 m8 O2 y1 R

  L( D* c# `* [+ L
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。# R" k3 }0 Y& s" d9 H

, Q: y3 F+ M* _9 e

/ ^2 d; e, a2 l$ g3 ~7 X- F) \2 i
. j4 M. T; Z/ A3 f* T; i. Q
b.将制品上传到 Artifactory。% s; N8 n" n. I! c2 @( F8 T+ G
  k3 Q  T' Y$ z5 \
& E5 U' o) H+ o1 Z# H- g" {; j0 n9 G
, T& X7 q. |0 N4 {9 i3 A
c.通过浏览器可以直观的看到所有制品。
$ t2 \- ?7 Q0 {$ I' T
" W$ J) C5 \. V+ ~/ X0 |! J

7 ~; O  ^: {. m7 N* z: G
7 x8 _% `# g3 S* j
d.版本化所有脚本。
" F+ v$ n4 V5 @$ U" W$ f! \( Q/ W5 Q; w$ z' K' T6 r

- g; A# \; C+ L% O" j3.为所有制品添加 Key-Value 的元数据进行版本化。
' [. D% f% _) B* ]  v+ X7 L

& k, a- M2 `! B& K  c. x% E
. ?/ ^2 Q: D3 X$ ~- y. B. c, \
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。
+ n( q- p- }' l) T
, H+ }7 N, P- N1 J
1.png
# t, W/ h5 S! ~% {( M7 ]
- A! B9 _* z* x) E& ?  p
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。
0 V1 ?8 j' b$ [3 Y

0 V6 X+ @- }/ R; x8 j1 k/ G
1.png

4 h. F9 l' v$ B" Z0 p7 y
8 u& K3 l6 q* L6 S, y' @6 N% l
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。
; K* c; M. M7 X# a8 N
, J$ s9 u# o5 k  y& v( ^; ~
1.png
( u% d+ Q# l' V( \; `

' G8 G8 Z) m, B' |% i% x4 Z. Z( [
好的数据库标准包括:
, e/ B. d  T. b( S; y, c
3 y3 G9 T! ^- H1 N" |* U- q
1.在一个索引里不能增加太多列。
: L4 D. }0 N5 G4 e  z; Q
! X3 w' {3 ?; q
2.在一个表里不能增加太多索引。
) i4 I& J. W" Q7 n

. ]. y3 h2 `6 s0 z! B- r, w

  ?" F* a% G  t4 F
2 T1 }7 A" p/ C/ D1 k3.外键都应该有索引。
2 m! \9 A. X8 n, p$ u, i6 ^! e& N

! r' n6 @! f# Q3 ]
1 a8 |: U1 x' N6 k' S$ ]

( v" \# U2 x& p! g+ b" [4.不滥用数据库字段空间。例如 VarChar2(100000)
# H. f: ?" q$ j% T  D

& z. g+ V+ ~0 j

+ j% D& d/ q2 d1 @+ j5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。
, U2 J4 ]/ J1 P: w7 h/ N# l
' _! p- \2 e, P% j7 U
1.png

9 q# t' b1 n# a, E

4 X4 ]2 l4 N( h3 e
* a& @  T0 y# i) {( ~# A, c
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。

8 G% w! M4 d; d" \% ^
* }/ v+ k( x$ M
1.png
5 G; c( x/ Q  H) E4 O# u; I

0 }) z& W' t/ {3 J& `# Z
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。

$ v  ]7 G7 P% n
9 _2 J) x; k; V& s- o
1.png

8 b: P' Y" F  J5 X$ R' m
/ N9 W& g* s2 _. a4 P7 i: p

# R  X9 x" v% k' d' W
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。

7 Z4 n1 V- v) ~# h8 B
1.png
( a5 ~7 l. s$ z, [2 d

4 o5 f5 K) {3 k8 o
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。

; g- z. m) ~( v

5 E( J$ W2 N$ q9 f; R4 @0 K
1.png

- r! g( e/ W, S0 t- I1 S; X2 x
- x& ^' ^0 E2 |8 D- T5 a
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。

/ l2 I- \) O+ t$ s- N
1.png
% j' b, L& }( q; _% i
- H2 [/ X3 W2 A
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png
0 B) z, @& ^- ]5 H; t$ I

: d" ~0 {- }4 D8 }: q. W5 P
8 H5 M4 s; H6 l% O1 f
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。

8 E* B" K" A: T1 X# e7 Y/ l

* a8 r8 a8 _+ y* c/ N
原创:王青

% |9 B1 B, v2 ?3 p# {2 H9 ~6 y

本版积分规则

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

Baidu

GMT+8, 2019-6-17 23:20 , Processed in 0.213085 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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