本文讲述的是一种灰度策略,在讲灰度策略之前,先说一下线上数据库的delete,update操作。
程序员删除线上数据时运行以下示例语句:
delete from table where id=xxx and name=’xxx’;
如果忘记加where条件或者where条件少了一个and或者or,将会删除很多数据。
稍微有经验的程序员,会分两步操作:
1. select * from table where id=xxx andname=’xxx’; 观察满足删除条件的数据情况
2.用“delete”替换第一点语句的“select*”
第一点可以理解为“灰度发布观察”,第二点可以理解为“全量发布”。
那么接下来讲的就是在微服务中实现上面思路的灰度发布。
举个例子:
某个微服务系统中,要对A表添加一个uid字段,插入数据时填写上uid数据,update数据时where再加上“uid=xxx”的条件。系统的服务杂性,无法预料到插入的uid和update的uid是否一致,如果存在大量不一致,将导致大量数据无法被update更新,引起大面积报障。
该改造要上线,就是要先摸清不一致的情况有多少。
按以下步骤上线:
1. 线上数据表增加uid字段
2. 上线程序,上线的程序有insert uid的功能,update逻辑先不加上uid=xxx的过滤条件。再加多几行程序,程序执行”select * from table where condition=yyy and uid=xxx”,当返回的结果集为0时,打印日志并且上报到统计系统中,通过日志或者统计系统监控将要update的影响记录条数。
3. 第二点灰度观察一天,正常无误后把”select * from table where condition=yyy and uid=xxx”的执行语句去掉,再到原来的update语句加上uid=xxx,再上线灰度一台服务器
4. 第三点的一台服务器灰度一天无误后,再继续灰度其他机器。