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

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

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

扫描二维码登录本站

QQ登录

只需一步,快速开始

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

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

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

参加活动:0

组织活动:0

发表于 2018-11-5 10:08:46 | 显示全部楼层 |阅读模式 来自- 广东广州
本帖最后由 adminlily 于 2018-11-5 10:13 编辑 $ B9 I( J$ d! W- e1 V* u& @4 L

' R3 M; M' O. q1 b3 p/ i, |
背景

. H# m. e3 }% V

% f1 k# V. J! w, z
软件发布过程中最困难的就是数据库变更的发布。Datical 是专注于数据库变更发布产品的公司,Datical 可以帮助企业快速上线数据库的变更,软件软件发布更加自动化。
痛点
, f6 R' n8 V2 T" |' y1 m0 W# F* e

/ o; h3 t0 ~* ^# D6 r$ M. y
DevOps 的时代,软件发布的速度可以很快,而数据库的变更速度却跟不上软件发布的速度。
1.png

. q# M( ~1 e2 M) D8 j( t

) Q4 \! }+ `! v$ h3 P

3 G$ Z* ~" ^) ?: v* V: ]) E
当前的数据库变更方式已经过时,数据库的变更存在以下问题:

( p" [# k3 k; M" }% E8 i5 ]1 Q" m
6 d- [1 d2 N# ~3 `3 q. `  W
1.依赖人工修改
* E) g2 {6 k9 r& S4 W: Z! f

. H# A/ K* L, g' Z7 h
( u- a/ y6 ?4 F' f( M* A0 I8 o/ x& B
2.速度慢。
0 b4 R) \, o* f8 u- y$ D6 ]1 F! r8 u# s2 P" C# a
3.风险大。
. M( s2 H4 z5 g/ j$ ^( [
0 h, D& o* s$ L7 D7 Q2 Y, C9 [- ?! ~
1.png

/ f+ s9 ?) c  ?
: u, R% Q& q) _8 Z
1 j) C% m9 O" O0 Y6 y* _/ b: W
上图是一个研发人员需要提交数据库变更到生产环境时,DBA 们的表情。

8 e9 {6 o! P% R; w9 N1 d# p

4 B- S8 y- v8 X3 n! {% m. E  A
如果你邀请团队的 DBA 参加 Scrum 会议,那么画面会是这样的:

) h1 R5 b& Z+ E$ b2 _$ g. S) P

( R+ L+ a7 ?2 ]
1.png

7 V* ^6 \# g4 G; e

. O& l6 |4 }+ z- q4 Z* ^+ }
从各个公司的实际情况来看,也是基本符合这个情况,数据库的变更依赖人工操作,且风险大。我甚至不止一次的听说某公司程序员将生产环境数据库 Drop 掉的案例。

3 U+ [1 L+ \: K5 v, v5 U
; }' A* Z0 S: [9 N3 a4 `- Q
1.png

' T- Z, }/ [( [  K& ~

& {5 {+ ~6 i4 h% r. E& x1 d- k

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

& H! ?# i4 B) H% t: ^

; {& e6 B4 J9 A- r2 e
1.png
" O" O0 B! \% z3 z
8 B+ H( k& w' R0 k" T, ^& {! M
给程序员灌输一个理念,开发不仅仅是在本地和测试环境完成了测试,开发的职责就完成了,而是要负责到将数据库的变更正确上线,应用部署被顺利到生产环境,且用户访问不发生异常,才能算是一次成功的代码提交。
* s( J0 V& d4 b5 g6 ?2 X6 _% F" k
" E, P# x2 n) ~) \: p+ V* I
1.png
4 e1 w7 a# @5 L

5 B' ]1 N  g5 t1 Z4 _8 E
将数据库的脚本版本化存储起来,和应用程序一起管理。
: `1 e( ?* O/ _6 Y  K

  I% F" E. ^/ p# Q$ u/ k
1.png

1 X4 r: w+ H/ u- q; z
, Z; g8 H2 r( I' g) n
Datical 带来了他们的最佳实践:
& c5 Q: _) ~" ?, r- ?2 p3 T
! `1 U$ ?( c( c# q7 k8 ~7 ~
1.应用程序所有的依赖(包括数据库变更)都提交到通一个代码管理库里进行管理-例如 Artifactory 的 VSC 仓库。
* l% u6 H- l4 L8 L; s7 h' a6 |% Y5 q" ]" X$ i9 i/ {

& O$ H* {/ g1 C2.使用 CI 工具上传构建信息

' d* O' k1 ^. s
2 U3 `: [) Z* B% U: Y' o
8 D/ i+ x8 V$ h) W, B4 Q% v

! f) p) P2 ]9 p% W
a.选择 Jenkins,TeamCity,TFS,Bamboo 作为 CI 服务器。7 _1 h- }1 V- \& r+ j

: b1 d2 n8 P8 l2 \

8 B; ~/ q% \; y) B, d
- x. P' `$ i, M; W
b.将制品上传到 Artifactory。& l0 ]; l# b3 b- [2 ]

. r5 a" e+ [9 P2 |( A: B

" Z( h, c# n$ b" F1 v# V- m& Z% _! `- n2 l
c.通过浏览器可以直观的看到所有制品。
# @# f9 J9 P- X+ x
; W2 V, z6 O: \

1 Q# [4 R2 ~" d' V. o8 X1 F. W+ N" w$ U
. K. G6 Q: X, v3 o/ o
d.版本化所有脚本。, Q: J) e5 m( d! b7 |4 s

4 E. B4 `6 u9 q$ V
' {' \% E/ u6 t4 Y3 j% q$ T8 u- K3.为所有制品添加 Key-Value 的元数据进行版本化。5 ~# x' T0 Q7 u( D, O7 r4 @
7 U- c! \, n9 O7 x0 A

7 |- k' ~+ J' ]2 V7 T" y
每次构建,必须将数据库的变更脚本也和应用一起发布,这样才能做到完全自动化的上线应用。
) ]( }/ ]  v5 {; p$ f" {' |1 w

: Q! ]  s* ^$ S- g. n
1.png
% h3 r" l; l& O6 j
, d" V" g' U- U) a2 g! I
上图是 Datical 软件发布包的截图,它们的用户可以直接下载,安装。发布包里包含了该软件所对应的所有配置文件和数据库脚本。

% ^3 ^, t5 v4 _% C# f% O8 O
  K4 X. n' `1 d7 k
1.png

: @0 j; U9 o- s8 V
/ x5 {2 Q2 b4 I0 z9 t
Datical 认为软件开发团队必须建立良好的数据库标准,在提交数据库变更时要设立较高的门槛,落地一些数据库的最佳实践。

3 f  n1 a0 z& S* e2 u

& \+ [% h1 b+ [1 @0 k
1.png
" l8 E$ t  h  y- r1 Z, h

6 L; n) E7 z" d5 ^4 j
好的数据库标准包括:
% Z  P0 Z* w/ n: j
1 G* w- N2 J8 n9 \( y* s( C3 f) u
1.在一个索引里不能增加太多列。
  X* I) u, i, z& e- S* d& r5 Y: q  z7 D* s3 |$ O/ j
2.在一个表里不能增加太多索引。
% Z  H9 K, y& f/ E' J7 ~% o
- G9 O; x, `1 {3 g% `

5 G" ~3 H& F9 v/ u
5 `; p4 @* X1 S% a# A3.外键都应该有索引。

1 x: w) o% x8 J/ s+ W) v% j. h! q1 |6 q: o; |
" F. `1 p  I: ]4 e: N2 t

( k" b* K& ~- k* x9 G5 v1 t6 O( P) q4.不滥用数据库字段空间。例如 VarChar2(100000)

' }- N! D2 V1 s* _  p* R" U/ E
/ R, Y0 S0 I6 e- X

: m  H8 u* [! r! h/ J- x5.不滥用数据库的某些关键字,例如 Trancate,Drop,Grant。7 x, P( a( e: o, `1 w5 n& O) u
, X5 U9 Y7 u! l0 B# |3 E2 |
1.png
/ Q% H% X" X' h; a

4 t- K& A1 I4 C# I' i% ~4 ]# [% }

2 N8 M/ z9 P) X  i% r4 q6 y
在微服务的时代,我们可以实现灰度发布,将新服务上线的同时,保留老的服务。
$ U; x; G* s9 k$ r) V9 K
4 t- K! Y: _+ v1 d
1.png
& \8 E5 f/ y2 s
; m# ~) S& W: d$ f
在新服务运行一段时间之后,如果用户反馈监控没有异常,再将后端的老版本服务下线。

; s* }; |# G6 @. w

2 F/ H% |. U. g2 I& _. T5 K* I
1.png

; K) c* w$ o; h, g5 X6 f& k1 t: l  T" R

2 @) a& l% L1 \4 F& ?7 a
8 J+ d$ b5 _6 z# X3 n; p9 K* T
如何在数据库层面支持灰度发布?来看一个例子:程序员设计了一个丑陋的列,Name 里面包含了用户的名和姓(Giacomo Guilizzoni)。

6 v  B# H0 ?5 i' ~% Q; }' L
1.png

( N' D$ q1 c1 ^7 u9 g$ O2 n. r
6 k5 p. t% P# `6 m% U! U
上线之后产品经理提了一个需求,需要按照用户的 LastName 排序,程序员蒙圈。于是决定将 Name 列拆分为两列 FirstName 和 LastName。但这样并不可行,因为数据库变更上线之后,老版本的服务没法用了。于是程序员决定在前面加两列,FirstName 和 LastName。
0 n* W3 u* T/ x3 T$ O
" Y: W" t- D1 ^# G* A( [7 W/ W) B
1.png
. p* M/ U2 {- d5 n0 g
0 c6 U; K) W3 T, K; }# m
这种方法实现了老版本 APP 的兼容,同时也可以上线新的服务,不间断的为用户提供服务。

& z3 @  m5 b0 l% Y& A% @
1.png
% K  D. i' d3 ~
+ ?5 q7 }5 i# ^" G/ j# c) `
等待新 APP 上线之后,处于稳定的状态,即可将老的服务下线,然后进行数据库的变更,将 Name 字段去掉。
1.png

" T/ `$ O& p* C, w* e  `/ ~# a% W0 R$ O" A

  P, |+ x& b& l6 P( z2 N
实现 DevOps 需要整个研发团队进行思想上和行为上的转变,包括开发人员有义务参与端到端的部署,提交代码就走人的模式已经被淘汰。数据库的变更不能依赖于给 DBA 提交 Ticket,而需要在提交数据库变更时多参考 DBA 的建议,为整个研发团队建立数据库变更的标准,同时将配置文件,数据库脚本和应用程序一起打包,版本化,实现自动化部署。这样数据库的变更才不会成为软件发布的瓶颈。
/ s; a& c. p, p" s

5 \7 U( d; I1 d0 f# H
原创:王青

3 ^8 J% G0 s; y1 F  |' E$ {  S
. A; J& e0 J/ J) }

本版积分规则

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

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

Baidu

GMT+8, 2019-1-17 11:23 , Processed in 0.228314 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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