实验2:模拟灾难与故障发生验证高可用架构(意外停机的电商购物车与支付会话)

业务系统的稳定性,可靠性对我们非常重要。 在本章节我们通过灾难的模拟检验系统的可用性,评估是否满足生产系统要求。我们将完成下面架构图的模拟:

DR


应用层高可用

1,登录到您的Odoo界面,您或许已经通过上一个实验搭建了您的第一个网站,可能是电商,可能是在线教育。现在请您处于登录状态,任意做一些操作,例如,将商品添加都购物车、创建一个新的报销单,打开网站编辑模式等。 像示范中,实验admin账户登录,并将两个商品放入了购物车。 DR

2,登录到您的EC2控制台界面,如果您使用默认的Cloudformation参数进行部署,您可以查看到3台实例,分别是两台跨AZ的EKS worknode和一台管理环境用的堡垒机

DR

3,现在我们关闭一台EKS worknode,勾选任意一台odoo-ng-odoo-Node为名称的实例,点击实例状态,点击终止实例。 DR

4,我们回到刚刚打开的Odoo页面,查看我们是否依然处于登录状态,继续进行您刚刚的操作,例如,继续添加购物车,继续填报报销,检查关闭一台机器系统是否正常运行。 DR

5,现在我们回到EC2控制台界面,您会发现刚刚我们手动关闭的EC2已经关闭,但是自动重新启动了一台同类型的EC2实例。 DR 这是因为我们EKS节点组的默认节点数配置如下:

  • desiredSize: 2
  • minSize: 1
  • maxSize: 5

您可以通过控制台扩展EKSCTL命名更改这些配置

6,现在您可以再回到EC2控制台界面,勾选全部的EKS work Node 将他们一起关闭。再观察实例自动回复的状态。可以预见的是,您的系统会有3分钟左右的不可用(新实例启动时间),而一旦ASG触发的新的实例启动完成,您的Odoo又将恢复服务,并且玩着保存着关机前的会话和所有系统数据。 DR

Ps:如果您习惯更直观的使用EKS控制台管理EKS节点组,您可能会发现控制台中并未出现我们部署的两台ec2实例所反应的应用层work node。那是因为您当前登录控制台的用户没有在kubeconf中配置权限。在实验1中我们已经提到,将用户的权限加到EKS kubeconf中。请您转移到实验1的配置堡垒机之外的Role获得EKS集群控制权 DR


数据库层高可用

1,登录RDS控制台,检查您的RDS postgreSQL是否多AZ部署,如果您按照默认参数启动Cloudformation,将设定为默认部署。如果你当前不是多AZ部署,您可以通过modify,勾选多AZ部署,选择立即生效改成多AZ部署以继续试验。

DR

2,导航至RDS控制台点击您的数据库,导航至配置,您可以看到当前实例所处的AZ和辅助实例所处的AZ。

DR

3,导航至RDS控制台点击您的数据库,导航至操作,再点击重启。AWS RDS为我可以提供了重启和故障转移模拟的途径,我们勾选是否进行重启和故障转移??点击确认,即可开始故障转移的模拟。

DR

4,现在我们回到odoo应用,进行操作,如果碰巧,您可能会感觉到响应出现一点点卡顿,但依然正常返回我们进行的任何操作。

DR

5,回到RDS控制台点击您的数据库,导航至配置,您会发现数据库当前可用区已经切换到刚才的辅助可用区,而之前的当前可用区变为了现在的辅助可用区。因为后台数据库完成了自动故障转移。

DR

数据库实例故障转移完全自动化,无需管理干预。Amazon RDS 会监控您的主实例和备用实例的运行状况,并且会启动故障转移以应对各种故障条件。 Amazon RDS 可检测多可用区部署中最常见的故障并自动从中恢复过来,这样您可在无管理干预的情况下尽快恢复数据库操作。如果发生以下任何一种情况,Amazon RDS 将自动执行故障转移:

  • 主可用区的可用性受损
  • 主节点的网络连接受损
  • 主节点的计算单位出现故障
  • 主区域的存储故障

万一发生基础设施故障,Amazon RDS 可自动故障转移至备用实例中 (如果是 Amazon Aurora,则会故障转移至只读副本中),以便您能够在故障转移结束后立即恢复数据库操作。由于故障转移后数据库实例的终端节点维持不变,因此应用程序可在无需手动管理干预的情况下恢复数据库操作。

会话层高可用

1,登录ElastiCache控制台,检查您的Redis 是否多AZ部署,如果您按照默认参数启动Cloudformation,将设定为默认部署。如果你当前不是多AZ部署,您可以通过modify,勾选多AZ部署,选择立即生效改成多AZ部署以继续试验。 DR DR

2,导航至您的redis节点,选择主节点,选择操作,选择主节点故障转移

DR

3,选择确认切换,回到您的redis控制台,发现主节点和备用节点的AZ发生互换

DR

4,回到您的Odoo应用,您会发现您的登录状态依然还在,可以继续进行任何操作。如果您有购物车选项,购物车内的内容依然存在。

DR

通过堡垒机操作您的数据库(可选实验)

在上面的实验中,我们通过业务端的界面体会的了故障的切换,您当然也可以通过客户端配置命令与数据库服务进行连接,更直接的观察高可用切换的表象。

1,登录到堡垒机,下载postgresql的客户端软件。

sudo amazon-linux-extras enable postgresql11

sudo yum install postgresql

2,使用psql命令连接您的RDS postgresql数据库,例如(您需要将RDS的地址替换成自己的地址,如下的p17jzs156c51j9.c9be4pcviz8k.us-east-1.rds.amazonaws.com,如果您替换了用户名,您也需要将odoo替换成你在Cloudformation模板里的您填写的用户名)

psql -h gp17jzs156c51j9.c9be4pcviz8k.us-east-1.rds.amazonaws.com -U odoo 

3,psql会提示您输入odoo的密码,模板的默认密码是 awspartner 成功登录效果如下:

[ec2-user@ip-10-0-143-37 ~]$ psql -h gp17jzs156c51j9.c9be4pcviz8k.us-east-1.rds.amazonaws.com -U odoo
用户 odoo 的口令:
psql (11.12, 服务器 12.5)
警告:psql 主版本11,服务器主版本为12.
     一些psql功能可能无法正常使用.
SSL 连接(协议:TLSv1.2,密码:ECDHE-RSA-AES256-GCM-SHA384,密钥位:256,压缩:关闭)
输入 "help" 来获取帮助信息.

odoo=> 

4,现在您可以通过Psql的命令查看odoo创建的表,或者查询表的数据:

odoo=> \d
                                           关联列表
 架构模式 |                              名称                               |  类型  | 拥有者 
----------+-----------------------------------------------------------------+--------+--------
 public   | account_account                                                 | 数据表 | odoo
 public   | account_account_account_journal_rel                             | 数据表 | odoo
 public   | account_account_account_tag                                     | 数据表 | odoo
 public   | account_account_id_seq                                          | 序列数 | odoo
 public   | account_account_tag                                             | 数据表 | odoo
 public   | account_account_tag_account_move_line_rel                       | 数据表 | odoo
 public   | account_account_tag_account_tax_repartition_line_rel            | 数据表 | odoo
 public   | account_account_tag_id_seq                                      | 序列数 | odoo
 public   | account_account_tax_default_rel                                 | 数据表 | odoo
 public   | account_account_template                                        | 数据表 | odoo
 public   | account_account_template_account_tag                            | 数据表 | odoo
 public   | account_account_template_id_seq                                 | 序列数 | odoo

 ............


 odoo=> select * from account_account;
 id |             name             | currency_id |  code  | deprecated | user_type_id | internal_type | internal_group | reconcile | note | company_id | group_id | root_id | is_off_balance
 | create_uid |        create_date         | write_uid |         write_date         
----+------------------------------+-------------+--------+------------+--------------+---------------+----------------+-----------+------+------------+----------+---------+---------------
-+------------+----------------------------+-----------+----------------------------
  2 | Current Assets               |             | 101000 | f          |            5 | other         | asset          | f         |      |          1 |          |   49048 | f             
 |          1 | 2021-09-09 06:12:12.183258 |         1 | 2021-09-09 06:12:12.183258
 35 | Account Receivable (PoS)     |             | 101300 | f          |            1 | receivable    | asset          | t         |      |          1 |          |   49048 | f             
 |          1 | 2021-09-09 06:12:12.183258 |         1 | 2021-09-09 06:12:12.183258
  1 | Liquidity Transfer           |             | 101701 | f          |            5 | other         | asset          | t         |      |          1 |          |   49048 | f             
 |          1 | 2021-09-09 06:12:12.183258 |         1 | 2021-09-09 06:12:12.183258

 .............

5,安装redis-cli客户端工具

sudo yum install gcc  tcl -y

wget http://download.redis.io/releases/redis-6.0.9.tar.gz

tar xzf redis-6.0.9.tar.gz

6,编译安装redis

cd  redis-6.0.9/deps  #进入这个目录

make hiredis jemalloc linenoise lua geohash-int

cd ..  #回到redis主目录

make

7,现在使用./src/redis-cli -h XXX_IP命令连接您的redis数据库,例如(请将gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com替换为您自己的elasticache地址)

[ec2-user@ip-10-0-143-37 redis-6.0.9]$ ./src/redis-cli -h gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com
gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com:6379> 
gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com:6379> ping
PONG

gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com:6379[1]> SET db redis
OK
gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com:6379[1]> GET db

gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com:6379[1]> keys *
 1) "ae96338583cbde5a6f965133440aed0d3f544c82"
 2) "9e758b67ec5ba147af932f2e098560554fa4ce21"
 3) "5241990afe2cc3361d7e217d04e870fec98b0e44"
 4) "c54089045bf2528bb8a59c0b5df9c8091720fd51"
 5) "3bb2c3b96b353b5b1d41184b81de5c4737c06e55"
 6) "5037d9233d0be309405847ad3b3437f4ce82042e"
 7) "8704f3450ad1c6aeaaf174cd92432b7e881c7514"
 8) "f5fbe796d5c30a144916dce05cd568b06ec6e45f"
 9) "2dab70b5445ce6cf71e4d7f3f4021382261d96b6"
10) "80683329451c501eeea908fcff618a69e9bd0650"
11) "db"
12) "4de99b388c2e3e1fe8ae44d8fbb3ad3df522f2b3"
13) "e6f6487e68bb0219ce2b71205b6da69c61023a03"
14) "04d6a98dd06ab05baebf94b0e9294845881d0ffc"
15) "0b4dd4e77436899144e2db9dcbd5267189d64d0c"

gre17mozillfaa7p-001.cknfxb.0001.use1.cache.amazonaws.com:6379[1]> get 0b4dd4e77436899144e2db9dcbd5267189d64d0c
"\x80\x03}q\x00(X\x02\x00\x00\x00dbq\x01X\x04\x00\x00\x00odooq\x02X\x03\x00\x00\x00uidq\x03NX\x05\x00\x00\x00loginq\x04NX\r\x00\x00\x00session_tokenq\x05NX\a\x00\x00\x00contextq\x06}q\aX\x04\x00\x00\x00langq\bX\x05\x00\x00\x00en_USq\tsX\x05\x00\x00\x00debugq\nX\x00\x00\x00\x00q\x0bX\x05\x00\x00\x00geoipq\x0c}q\ru."