概述
DBaaS是目前云计算服务的重要部分,数据库作为一种特殊的应用程序,在应用中普遍存在。而其独特性不仅在于普遍性,而且其性能对应用的表现是至关重要的。数据库的通用性和重要性使得维护一个健壮的数据库实例变得极为复杂和繁琐,DBaaS服务旨在解决让用户能够在云中轻松设置、操作和扩展关系数据库。 在承担耗时的数据库管理任务的同时,又可提供经济高效的可调容量,使您能够腾出时间专注于应用程序和业务。
Trove是OpenStack实现Database as a Service(DBaaS)的项目,(他的前身是Rackspace的reddwarf)为要能够给用户提供可扩展和高可靠性的云数据库,并作为一个基本服务可以同时支持关系和非关系型数据库。Trove目前还只是一个 OpenStack 孵化器项目,现在致力于提供高性能前提下的资源隔离,并且提供自动化的复杂管理任务包括部署、配置、打补丁、备份、恢复和监控。
Trove作为OpenStack中提供关系型数据库、非关系型数据库等Database服务的项目,目前由Trove-api、Trove-taskmanager、Trove-conductor、Trove-guestagent四个组件组成。Trove的数据库引擎运行于云主机,与Nova、Cinder、Swift、Glance、Keystone、Neutron(Nova-network)等组件紧密相连。OpenStack的第十个版本—Juno版已经问世,在该版本中,增加了一些数据库服务的新功能。数据库服务(Trove)允许用户对关系型数据库进行管理,实现了Mysql实例的异步复制(主-从复制)和提供PostgreSQL数据库的实例。非关系数据库的管理也得到了增强,引入新的集群API,首次支持MongoDB集群;支持Couchbase的备份和恢复。支持可选择强制使用Cinder作为Trove卷的后端;支持使用Neutron网络的OpenStack解决方案部署Trove;支持在Trove数据库中使用自定义的数据存储配置参数;能够获取所有数据的存储类型和版本;其他的改进包括在Trove中增加日志审计来优化日志级别、加入stevedore来优化扩展加载的机制等。
基本概念1UserUser即用户,他们代表可以通过keystone进行访问的人或程序。Users通过认证信息(credentials,如密码、API Keys等)进行验证。
2TenantTenant即租户,又称为project(H\I版本都使用Project来代替),它是各个服务中的一些可以访问的资源集合。例如,在Nova中一个tenant可以是一些机器,在Swift和Glance中一个tenant可以是一些镜像存储,在neutron中一个tenant可以是一些网络资源。Users默认的总是绑定到某些tenant上,用户访问租户的资源前,必须与该租户关联,并且指定该用户在该租户下的角色。
3RoleRole即角色,Roles代表一组用户可以访问的资源权限,例如Nova中的虚拟机、Glance中的镜像。Users可以被添加到任意一个全局的或租户内的角色中。在全局的role中,用户的role权限作用于所有的租户,即可以对所有的租户执行role规定的权限;在租户内的role中,用户仅能在当前租户内执行role规定的权限。
4ServiceService即服务,如Nova、Glance、Swift。根据前三个概念(User,Tenant和Role),一个服务可以确认当前用户是否具有访问其资源的权限。但是当一个user尝试着访问其租户内的service时,他必须知道这个service是否存在以及如何访问这个service,这里通常使用一些不同的名称表示不同的服务。在上文中谈到的Role,实际上也是可以绑定到某个service的。例如,当swift需要一个管理员权限的访问进行对象创建时,对于相同的role我们并不一定也需要对nova进行管理员权限的访问。为了实现这个目标,我们应该创建两个独立的管理员role,一个绑定到swift,另一个绑定到nova,从而实现对swift进行管理员权限访问不会影响到Nova或其他服务。
5EndpointEndpoint,翻译为“端点”,我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道他的endpoint。因此,在keystone中包含一个endpoint模板(endpoint template,在安装keystone的时候我们可以在conf文件夹下看到这个文件),这个模板提供了所有存在的服务endpoints信息。一个endpoint template包含一个URLs列表,列表中的每个URL都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限。public url可以被全局访问(如http://compute.example.com),private url只能被局域网访问(如http://compute.example.local),admin url被从常规的访问中分离。
6TokenToken即是信物、令牌,用户通过用户名和密码获取在某个租户下的token,通过token,可以实现单点登录。7Credentials与user关联的认证凭据。一个user可能有一个或多个credential,一个credential与某一个project关联。该术语可以简单的理解为用户和密码。
8Domains表示一组tenants和users的集合。每一个tenant或user只能属于一个domain,但user可以属于多个tenants。domain有命名空间的概念,即在一个命名空间内的名称是否是全局唯一。
9Datastore存储数据的数据库管理程序。例如trove现在支持的数据库管理程序有MySQL、cassandra、mongodb。
10datastore_version存储数据的数据库管理程序的版本, datastore_version是指这些数据库管理程序的版本,例如5.1,还是5.5之类的。11Replica Setmongodb高可用性架构—Replica Set副本集。Replica Set使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。mongodb使用Replica Set来实现读写分离。
12swiftswift是object storage(对象存储),将object(可以理解为文件)存储到bucket(可以理解为文件夹)里,你可以用swift创建container,然后上传文件,例如视频,照片,这些文件会被replication到不同服务器上以保证可靠性,swift可以不依靠虚拟机工作。所谓的云存储,OpenStack就是用swift实现的,类似于Amazon AWS S3(Simple Storage Service)。
13cindercinder是block storage(块存储),你可以把cinder当做优盘管理程序来理解。你可以用cinder创建volume,然后将它接到(attach)虚拟机上去,这个volume就像虚拟机的一个存储分区一样工作。如果你把这个虚拟机terminate了,这个volume和里边的数据依然还在,你还可以把它接到其他虚拟机上继续使用里边的数据。cinder创建的volume必须被接到虚拟机上才能工作。类似于Amazon AWS EBS(Elastic Block Storage)。
架构介绍整个Trove由四大部分构成,虚拟机服务、trove-api、trove-taskmanager、trove-guestagent,其中虚拟机服务包括compute和volume服务,至于compute服务具体是由kvm、lxc、xen等哪个来提供,trove并不关心,当用户请求创建一个数据库实例时,虚拟机只要能提供运行数据库服务的环境即可。trove-api接收用户的各种请求(数据库实例创建、删除、备份、重启等),通过rpc消息队列与trove-taskmanager服务通信(这一点与OpenStack的其它系统一样)。trove-taskmanager是实际的服务管理器,负责管理一个请求任务整个过程,主要是与nova-compute通信创建compute、与cinder-volume通信创建volume、与trove-guestagent通信在虚拟机内完成包括启动数据库服务/创建用户/初始化数据库/备份数据库服务/重启数据库服务等等操作。trove-guestagent是运行与虚拟机内完成数据库操作的“机器人”(具体任务由trove-taskmanager下达)。
1与其他组件的关系Trove与其他组件之间的关系,即表结构如下图所示:2组件构成Trove 与nova一样是一个无共享信息系统(share nothing messaging system)。它的所有组件通过信息总线互相通讯,而且可以运行在不同的服务器上。与nova类似,Trove通过 http 发送消息,消息通过消息总线发送并翻译并得到同步响应。目前主要包括以下主要的组件:
1Trove-Api Server(Trove API服务器) API server用来控制客户端和数据库。 API端点是一些基本的 http web 服务,这些服务处理 鉴权,授权 以及基本的与数据库相关的命令和控制功能。API server目前与两类系统通讯。 它与Trove Task Manager通讯来处理复杂的异步任务。 它也直接与Trove Guest Agent通讯来处理简单的任务(例如:获取MySQL 用户的列表),这些任务都是同步任务。API不处理任何负荷,它们的工作只是产生请求,并将请求转化为消息,并将消息发送到Trove Task Manager 和 Trove Guest Agent上去。
2Trove-TaskManager主要完成具体的繁重的工作,如部署数据库实例,管理实例的生命周期,完成对数据库实例的操作等等。它主要监听RabbitMQ 消息队列来得到请求。 Task Manager接受从API Server发出的消息,并根据消息的内容进行反馈和开启任务。其中一些复杂的任务包括改变数据库flavor(套餐)的大小以及创建实例。这些任务都需要 HTTP调用OpenStack的服务,并轮询这些服务直到实例激活为止并发送消息到Trove Guest Agent。
在多用户的分布式系统中,Task Manager处理这些复杂的流程。它是有状态的。在它的系统中包含了复杂的流程图。如果在状态迁移过程中Task Manager离线了,则操作会失败。
3Trove-GuestAgent Task-GuestAgent: 是一种运行在客户端实例上的服务,主要提供具体数据库的运行和管理,并且对数据库本身进行操作。guestagent同样监听RabbitMQ消息队列c来得到请求,并且运行在每一个数据库实例上。每一种数据库都需要一个自己的guestagent实现,目前只有MySQL agent。GuestAgent 主要负责将datastore上电等复杂的任务。Guest Agent也通过conductor 给API 发送心跳消息。GuestAgent 运行在每一个数据库实例上,并通过RabbitMQ消息队列 进行消息监听( 通过实例ID进行识别)。
4Trove Conductor Trove Conductor是一种运行在主机上的服务。主要负责接受客户机实例的消息从而更新主机上的对应信息(例如:实例状态和一个备份的当前状态)。有了Trove Conductor,客户机实例不再需要直接访问主机上的数据库。Trove Conductor隐藏了DB的实现,从而更方便升级且更安全。
Trove Conductor监听message bus 上的 RPC消息并做相关的操作。Trove Conductor与GuestAgent 一样监听RabbitMQ消息队列。 两者区别在于conductor驻留在主机上而不在客户机上。Guest agents与conductor通讯,该消息配置在conductor_queue中定义,缺省值为trove-conductor。
5Trove Message Bus Trove Message Bus 是一种消息队列,主要负责API 端点, Trove Task Manager 和 Trove Guest Agent 之间的消息交互。从云控制器往来的消息是从多个API发来的HTTP请求消息。
一个典型的消息传送例子:API server 从一个用户接受到一个请求。 API server 对该用户进行鉴权以确保该用户允许提交该命令。在请求消息中的对象的可用性也被 API server 进行评估。如果对象可用,该请求被路由到相关处理者的队列引擎中。处理者持续监听消息队列。当监听到一个任务请求,则处理者开始接受任务并执行任务。当任务结束时,一个消息被发送到API server 的消息队列中并返回给发起的用户。在整个过程中,按照需求,数据库条目被查询,添加或者删除。

Trove系列(一)—入门篇的更多相关文章

  1. Pandas系列之入门篇

    Pandas系列之入门篇 简介 pandas 是 python用来数据清洗.分析的包,可以使用类sql的语法方便的进行数据关联.查询,属于内存计算范畴, 效率远远高于硬盘计算的数据库存储.另外pand ...

  2. Pandas系列之入门篇——HDF5

    Pandas系列之入门篇--HDF5 简介 HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响, 压缩效率越高,查询效率越低.pandas ...

  3. Python系列之入门篇——HDFS

    Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...

  4. Python系列之入门篇——MYSQL

    Python系列之入门篇--MYSQL 简介 python提供了两种mysql api, 一是MySQL-python(不支持python3),二是PyMYSQL(支持python2和python3) ...

  5. 【转】C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。

    C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子. 标签: c#objectnewlineexceptionbytestring 2010-05-17 01:10 117109人阅读 ...

  6. C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?

    第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...

  7. Docker系列之入门篇

    Dcoker是什么? 概述 Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行 ...

  8. Python系列之入门篇——pytables及其客户端

    pytables及其客户端查看 pytables # ubuntu sudo apt-get install python-tables pip install flask flask-httpaut ...

  9. Python系列之入门篇——python2.7.13安装

    Python2.7.13 安装 说明 以下所有操作都基于centos6.9 1. Issue zlib zlib-devel是安装setuptools依赖的模块,需要在安装python之前先安装这两个 ...

  10. Redis系列一 - 入门篇

    问:项目中为何要选用Redis? 答:传统的关系型数据库(如MySQL)已经不适用所有的场景了,比如美云销抢单活动的库存扣减,APP首页的访问流量高峰等等,都容易把数据库打崩,所以引入了缓存中间件,目 ...

随机推荐

  1. vscode 使用sublime风格代码

    Monokai 主题 One Dark Pro主题   vscode设置字体 "editor.fontFamily": "MONACO, Consolas, 'Couri ...

  2. 链表的基础题目学习(EPI)

    链表的题目总体来说细节比较多,因为链表的题目在操作链表的过程中本身有些复杂,所以如果链表作为编程题出现的时候,多数情况下题目本身的思路可能不是很复杂,不要把题目往复杂的方向去思考就好了~这里的链表只是 ...

  3. Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGBitmapinfo' (aka) 'enum CGBitmapInfo')

    The constants for specifying the alpha channel information are declared with the CGImageAlphaInfo ty ...

  4. iOS interface适配

  5. you do not have permission to pull from the repository解决方法

    使用git进行项目的版本管理,换了台电脑,配置了账号和邮箱后,pull一个私有项目的时候,发现一个问题: 原因分析: 这是由于没有设置Gitee的SSH公钥.在未设置SSH公钥的情况下,可以使用git ...

  6. vue--使用过滤器

    有个项目需要可以添加和删除选项,但是左侧要显示的 A,B,C,D.... 解决思路: 循环的时候

  7. tomcat内存溢出:PermGen space解决方法

    最近集群服务器中的几台服务器在半夜自动重启tomcat后一段时间便都会报java.lang.OutOfMemoryError: PermGen space. 习惯性的百度,得到的答案基本上都是统一的解 ...

  8. JavaEE JSP 学习笔记

    一.JSP简介 1.也是SUN公司推出的开发动态web资源的技术,属于JavaEE技术之一.由于原理上是Servlet, 所以JSP/Servlet在一起. 二.HTML.Servlet和JSP 1. ...

  9. 从本机IIS中管理 远程服务器 IIS

    有时候,一般情况下,我们对服务器上 IIS 上的管理局限于 使用远程桌面:现在介绍一种,通过  本机 管理管理远程IIS 的方法! 1. 服务器端设置: 服务器管理器 ==>增加角色和功能向导= ...

  10. logstash实战tcp插件

    vim /etc/logstash/conf.d/tcp.conf input{ tcp{ type => "tcp" port => "6666" ...