回滚的两种模式,大多数人只懂一种……

084f2bea31abba00acfea7fe043a96dd.jpeg

回滚是一种运维操作。通常发生在部署过程中发现问题,需要将目标环境恢复到部署前的状态。

在我看来,回滚有两种模式。其中一种是一步步执行反向操作,我称之为反向操作模式

基于反向操作的回滚模式

可能是由于过去手工运维的思维方式的惯性,我发现不少人只知道这一种模式。

比如使用手工部署Nginx的配置的操作如下:

  1. 1. SSH登录到目标服务器

  2. 2. 进入到存放Nginx的/etc/nginx/sites-enabled/目录

  3. 3. 编辑目标配置文件vim example.443.conf

  4. 4. 增加一个location配置

  5. 5. reload nginx使配置生效

在反向操作模式的回滚方案中,我们应该该如何回滚呢?回滚步骤1,2,3,5步骤与部署时一致。第4步,需要操作人员找到该配置,并删除。

这时,操作人员在操作时就可能会出错,而且出错了,你可能很难觉察到。因为他是手工操作的。

那么,有人就想,以上步骤能自动回滚就好了。

可是,该如何自动回滚呢?我们需要在部署时就设计好相应的自动化回滚脚本。当需要时,就触发其自动回滚。

然而这个回滚方案的方案是无法通用的,而且增加了运维成本。因为普通的运维人员对于一个Nginx的配置的变更,是非常不愿意写回滚的脚本的,而且,他本人也不一定能写出正确的、可靠的自动化回滚脚本。

那么,有人就会想了,我能否实现自动生成回滚代码的平台?

答案是可以的。你必须预先定义每一个步骤动作,比如在平台上将Nginx配置的修改作为一个动作定义。然后再定义它的反操作。

如果你是实现过类似平台项目,你会知道,这工作量是无穷无尽的。因为运维的操作是无穷无尽的。

你可以说平台可以提供自定义步骤动作的能力,那么你同样会遇到“他本人也不一定能写出正确的、可靠的自动化回滚脚本”的问题。而且,既然是平台了,定义操作的责任就应该是平台的责任。

所以,这是一个业界的难题。

在面试过程中,面试官通常假设我也会遇到同样的难题。然而,我根本不会遇到这个问题。

基于版本的回滚模式

我在解释这个模式时,很多人无法理解。

还是以部署Nginx配置为案例。但是通过Ansible来实现自动化部署。假设已经存在以下部署脚本:

- hosts: prod-nginx
  gather_facts: yes
  become: true
  vars_files: 
        # Nginx的配置
    - common_vars/nginx.yaml
  roles:
     # Nginx的部署逻辑,是声明式的、幂等的。
    - ansible-role-nginx

以上代码含义大概是:部署Nginx到prod-nginx主机列表上,并使用common_vars/nginx.yaml文件中的配置。

nginx.yaml的配置如下:

nginx_vhosts:
- listen: "80"
  server_name: "*.example.com"
  return: "301 https://{{example_domain}}$request_uri"
  filename: "example.80.conf"

我们对以上代码版本化(提前到Git中,并通过自动化构建),得到版本号:v1.0.1。

现在我们需要像“反向操作的回滚模式”中的案例那样修改线上的配置时,我们的做法是在nginx.yaml配置增加相应的配置,最终效果如下:

nginx_vhosts:
- listen: "80"
  server_name: "*.example.com"
  return: "301 https://{{example_domain}}$request_uri"
  filename: "example.80.conf"
- listen: "80"
  server_name: "*.abc.com"
  return: "301 https://{{example_domain}}$request_uri"
  filename: "abc.80.conf"

然后将代码push到代码库中,经过构建,我们得到版本号:v1.1.0。

部署时,使用v1.1.0的代码部署即可。

基于版本的回滚模式,回滚就很简单了。就是再执行一次v1.0.1版本(v1.1.0的上一个版本)的代码就可以了。

基于这种模式实现平台化,也非常简单。平台不需要关心具体运行的内容,就要选择上一个正确的版本的代码执行,就完成了回滚。不会遇到“基于反向操作的回滚模式”的实现过程遇到的各种问题。

也因为这种简单化,平台实现部署的标准化,也非常简单。

但是,基于版本的回滚模式是有前提的,你的部署代码的执行必须是幂等的、声明式的。幂等的,指的是同一份代码,运行多次,得到的结果是一样的。

小结

基于版本的回滚模式准确来说,也是部署。也就是它使用老版本部署代替传统的“回滚”。

最后,希望这篇文章能给读者新的启发。

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Transactional注解可以用来对事务进行管理。在这个注解中,有两个参数需要注意,即rollbackFor和propagation。其中,rollbackFor用来指定在哪些异常发生时需要回滚事务。而propagation用来指定事务的传播行为。在这里,引用和引用分别展示了两种常见的@Transactional注解的使用方式。 引用展示了一个@Transactional注解的例子,其中rollbackFor参数被设为Exception.class,表示当出现Exception及其子类的异常时,需要回滚事务。而propagation参数被设为Propagation.REQUIRES_NEW,表示在当前方法执行时,将会创建一个新的事务。这样,如果这个方法中发生了异常,只会回滚这个方法的事务,不会影响到调用该方法的事务。 引用展示了另一个@Transactional注解的例子,其中rollbackFor参数同样被设为Exception.class,表示当出现Exception及其子类的异常时,需要回滚事务。而propagation参数被设为Propagation.REQUIRED,表示在当前方法执行时,如果已经存在一个事务,就沿用该事务,如果不存在事务,就创建一个新的事务。这样,如果这个方法中发生了异常,将会回滚整个事务。 所以,@Transactional注解可以根据设置的rollbackFor参数和propagation参数来控制事务的回滚范围。根据具体的需求,可以选择在方法级别或类级别使用@Transactional注解,并根据异常的情况来指定回滚范围。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Transactional-循环中事务单独回滚](https://blog.csdn.net/qq_24409613/article/details/103280982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SpringBoot 之@Transactional事务回滚](https://blog.csdn.net/weixin_42286635/article/details/103525851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值