查看原文
其他

精品翻译:《OpenStack HA》第九章 高可用应用设计原则

2016-12-20 李刚强 李世军 云技术实践

编者按


《OpenStack HA》这本书由云技术社区志愿者翻译,因为没有出版纸质书的计划,本书的翻译只会翻译重点章节。


翻译的过程是译者和作者思想沟通的过程,也是一个学习的过程,中间充满艰辛,也充满快乐,欢迎大家加入云技术社区翻译小组,一起交流、学习、提高,加入请联系群主(群主微信:xiaoli17kvm,群穿越使者北极熊微信:hadxiaer)。


在过去的几年里,云计算已经产生了重大影响,它将IT从一个小技巧转换为企业生产环境的一个关键因素。从基础设施即服务(IaaS)的角度来看,云计算比虚拟化先进很多,各种行业和网上贸易已经开始迁移测试环境、过渡环境和生产环境移到IaaS,开始用按需使用的资源模型替代传统的模型。


OpenStack是最流行的和广泛使用的开源云计算平台之一,并且它常被用来基础设施即服务解决方案。让OpenStack具备高可用性对云计算管理者和云计算工程师来说是必须的。

译者 云技术社区 金牌翻译 

李刚强

校审 云技术社区 金牌翻译 

李世军



如果运行云上的应用没有采用弹性设计的原则和概念的优点,拥有一个高可用的云基础环境还不足够。本章将主要介绍一个正确的应用如何设计才能提高最终用户服务的稳定性和在线时间,会着重介绍微服务架构和分布式web应用。


在本章节中,你将学习到如下内容:

  • 设计特点及原则

  • 一个简单的应用部署示例

  • 一个应用与OpenStack交互示例

9.1设计特点及原则

在开发部署在OpenStack上的应用时,需要考虑一些设计特点和原则。对于分布式web应用,有如下设计原则需要遵循。

9.1.1微服务化及弹性扩展


使用一种软件架构风格或设计模式,有助于实现应用的模块化,进而可实现独立服务的可维护性及可重用性。在这种风格下1,一个复杂的应用由多个独立进程组成。各进程间使用专门的APIs进行通信。由于这种去耦合处理,可以扩展所有需要的独立组件。这样就保证云应用具有可扩展性和容错性。


一般情况下,云应用运行在云基础设施的虚机。相对于使用大量虚机来运行应用,运行他们只是使用少量的虚机。模块化是确保具备微服务架构的应用可以在少量虚机中运行。因此,所有的虚机需要更多可用的能力,才使运行态的应用可扩展性是增加的。

9.1.2 容错性


当系统环境发生了一个意外变化时,云计算的容错性特点是保证系统弹性可用的一个重要因素。在云计算中,大型昂贵的服务器被小型的虚拟服务器代替,以达到降低服务器维护成本和人力成本的目的。利用云计算的自动化能力,这些虚机在不需要时是可以自动销毁。当某个虚机出现故障时,云自动化机制会关闭故障虚机,然后启动一个新的虚机。在传统的云方案中,总是会有不可避免的故障情况出现,包括云基础设施资源故障。因此,设计具有高度容错性的应用是必须的,要适应云环境中所有可能出现的异常情况。

9.1.3 云自动化


为了适应业务请求,运行在云环境中的应用可以自动扩大部署规模或减小部署规模。为了在云环境中运行应用,我们部署任何组件的过程不需要太多步骤。当应用遇到任一组件故障时,自动化机制减少了应用的故障恢复时间。因此,弹性可用性及容错性会自动地增加。

9.1.4 RESTful API 接口


在OpenStack云环境中,所有运行在云上的应用都被称为云应用。和其它云应用一样,REST API在分形应用中也有用到。为了能够使用这些API,我们必须把它们和云组件进行集成。这样。我们可以提高软件质量,并且可以进行可行性自动化测试。

9.2 一个简单的应用部署示例

为了对以上提到的,在云部署中所要遵循的设计原则,进一步进行阐释说明,我们举一个实际分形应用的部署示例。 This cloud application is used to generate some fractals in which mathematical equations are used. 3这个应用通过使用数学公式产生一些分形应用。在这个应用中,微服务架构用来解耦应用的逻辑功能,以便于我们能简单的处理单个功能的异常。


下面这个图展示了这个应用的架构。它由几个组件组成,如下:

  • API: 应用编程接口

  • Database: 数据库

  • Web interface: web界面

  • Queue service: 消息队列服务

  • Worker: 业务处理应用

 

分形应用服务架构

9.2.1 应用编程接口


这部分组件支持API接口,可以使用这些接口直接连接运行在OpenStack基础设施上的应用。

9.2.2 数据库


这个数据库是用来为其它组件服务的,由此,我们得到一个获取各组件通信机制的想法。所有这些API相关的服务地址都存储在数据库中。

9.2.3 web 界面


web界面使得 API间运行更方便。。通过web界面,可以获取完整的所有api接口信息。

9.2.4 消息队列服务


消息队列服务是用来为云应用中具备队列的服务间通信提供服务的。这个队列是用来在各种运行的服务间传播消息的。


在我们的应用中,无论是有一个服务或者是有多个服务,消息队列服务同一时间只接受一个服务请求。

这种类型的云应用有一个请求列表。这些请求会由资源池中任意的可用资源处理。

9.2.5 业务处理应用


业务处理应用会从消息队列服务接收队列消息,如下图。

接下来,消息会被处理,用来生成一个分形文件,文件由图片组成。另外,在OpenStack提供的web界面上,我们可用访问这些图片。

9.3应用与OpenStack的一个交互示例

我们假设可以访问OpenStack云环境,我们的应用运行在由云基础设施提供的虚机中。

9.3.1 OpenStack SDK选择


要开发与OpenStack云环境交互的应用,首先,我们需要根据要使用的开发部署语言选择OpenStack 软件开发工具包。OpenStack SDK支持多种开发语言,如Python、Java、Ruby、PHP、Node.js。

9.3.2 硬件配置模板和镜像选择


我们需要选择用来创建虚机所需要的硬件配置模板和镜像,我们的分形应用会运行在这个虚机中。硬件配置模板是用来设置虚机的硬件配置,如虚拟cpu数量、RAM大小,以及硬盘空间,如下所示:

<NodeImage:      id=2cccbea0-cea9-4f86-a3ed-065c652adda5,    name=ubuntu-14.04,

driver=OpenStack            ...>

<NodeImage:      id=f2a8dadc-7c7b-498f-996a-b5272c715e55,    name=cirros-0.3.3-

x86_64, driver=OpenStack            ...>

Our fractal   applications can run  on   any type of    distributions such       as   

Ubuntu, fedora,   OpenSUSE,  and Debians.       These    distributions are  available       as   

ready-made  operating      systems to    create    virtual   machines      for  our 

application.

<OpenStackNodeSize:     id=1,      name=m1.tiny,    ram=512,     disk=1,       bandwidth=None,     

price=0.0,     driver=OpenStack,    vcpus=1,             ...>

<OpenStackNodeSize:     id=2,      name=m1.small, ram=2048,   disk=20,       bandwidth=None,     

price=0.0,     driver=OpenStack,    vcpus=1,             ...>

<OpenStackNodeSize:     id=3,      name=m1.medium,   ram=4096,   disk=40,

bandwidth=None,      price=0.0,     driver=OpenStack,    vcpus=2,             ...>

9.3.3 启动虚机实例


一个用户必须选择镜像和硬件配置模板,用来启动一个虚机,用来部署分形应用。从列表中选择硬件配置模板和镜像后,用户必须使用相应大小的镜像来启动虚机,如下所示:

<Node:  uuid=1242d56cac5bcd4c110c60d57ccdbff086515133,    name=testing,    

state=RUNNING,      public_ips=[],     private_ips=[],    provider=OpenStack...>


启动后的虚机会有虚机id,名称,分配的公共和私有id,也包括虚机状态,运行中或者其它状态。

9.3.4 虚机实例销毁


如下python代码会销毁一个虚机实例。如果我们不销毁一个无用的虚机实例,它会导致一定的云资源消耗。

conn.destroy_node    (testing_instance)


当我们再次想要查看这个虚机时,它不会再在正在运行的虚机列表出现。

9.3.5 在一个新虚机实例上部署应用


为了在一个运行的虚机中部署一个应用,需要更多的资源信息。第一个资源是密钥对。默认情况下,密钥对已经安装在新虚机中。有一个公钥和一个私钥。公钥位于.ssh/id_rsa.pub文件中。密钥对由如下步骤产生:

print('Checking   for  existing SSH       key pair...')

keypair_name     =     'demokey'

pub_key_file       =     '~/.ssh/id_rsa.pub'


网络访问是另外一个需要的重要资源。OpenStack会过滤所有的网络请求。为此,我们需要创建一个安全组,并且分配给虚机。这样,我们就可以通过http和ssh来访问虚机:

if    security_group_exists:

                            print('Security    Group    '      +     all_in_one_security_group.name       +     '      already 

exists.    Skipping      creation.')

else:

                            all_in_one_security_group     =    

conn.ex_create_security_group(security_group_name,   'network access    for  all-

in-one    application.')

                            conn.ex_create_security_group_rule(all_in_one_security_group,       'TCP',   

80,  80)

                            conn.ex_create_security_group_rule(all_in_one_security_group,       'TCP',   

22,  22)


用户数据也是一个必须预先安装到虚机镜像中的资源。

这样,OpenStack使用特定的镜像来配置虚机。

userdata ='''#!/usr/bin/env bash

curl -L -s https://git.OpenStack.org/cgit/stackforge/faafo/plain/contrib/install.sh | bash   -s  -i faafo -i messaging   -r    api  -r    worker   -r    demo'''

9.3.6 引导配置虚机


完成上述提到的配置后,虚机就可以准备在OpenStack基础设施上启动了。在虚机完成启动之前,用户的分形应用运行需要等一会儿。

if    instance_exists:

       print('Instance ' +  testing_instance.name  +     ' already exists.    Skipping     

creation.')

else:

        testing_instance =     conn.create_node(name=instance_name,image=image, size=flavor,     ex_keyname=keypair_name,

ex_userdata=userdata,

       ex_security_groups=[all_in_one_security_group])

       conn.wait_until_running([testing_instance])

9.3.7 关联一个浮动ip,以访问外部网络


浮动ip是虚机访问外部网络的ip地址。使用这个ip,用户可以从互联网访问虚机。一般来说,OpenStack虚机具有外部网络访问权限。

print('Checking   for  unused   Floating IP...')

unused_floating_ip = None

for floating_ip in conn.ex_list_floating_ips():

       if floating_ip.node_id:

              unused_floating_ip    =     floating_ip

              break


函数 conn.ex_list_floating_ips()用来从ip池中选择一个ip,然后分配给虚机。所以,上面的代码会返回一个浮动ip地址,如下:


<OpenStack_1_1_FloatingIpAddress:  id=4536ed1e-4374-4d7f-b02c-c3be2cb09b67,  

ip_addr=203.0.113.101,pool=<OpenStack_1_1_FloatingIpPool:name=floating001>,driver=<libcloud.compute.drivers.OpenStack.OpenStack_1_1_NodeDriver       object    at   

0x1310b50>>

接下来,我们将这个ip关联到虚机。


if len(testing_instance.public_ips) > 0:

       print('Instance    ' + testing_instance.name + '   already  has  a public ip. Skipping       attachment.')

else:

       conn.ex_attach_floating_ip_to_node(testing_instance, unused_floating_ip)

9.3.8 访问应用


下面的代码会进行分形应用的部署。我们可以在web浏览器上看到正在运行的应用。


print('The     Fractals app will be   deployed      to    http://%s'     %   

unused_floating_ip.ip_address)


如果我们需要通过ssh登陆虚机,我们必须使用秘钥进行登陆:

$     ssh  -i    ~/.ssh/id_rsa USERNAME@IP_WORKER_1

9.4总结

在这个章节中,我们学习到了高可用应用设计的基本特点,比如微服务、弹性扩展、容错性、云自动化、RESTful API。我们也了解到了应用架构中的各个组件,以及在OpenStack中各个组件间的交互细节。


下章中,我们将要学习到OpenStack中对各个基础设施组件监控的基础和高级监控方法。


相关阅读:

翻译:《OpenStack HA》第一章

精品翻译:《OpenStack HA》第三章 对双激活服务的负载均衡

精品翻译:《OpenStack HA》第四章 集群、隔离以及主备服务


云技术社区长期招募热爱翻译人员,参与社区翻译外文资料工作,有意加入请加微信xiaolikvm 。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存