当前位置: 欧洲杯竞猜 > 计算机知识 > 正文

深切深入分析大数目虚构化的架构,大数目虚构

时间:2019-08-22 17:36来源:计算机知识
Serengeti管理服务器包括几个重要的模块:Serengeti Web Service,Ironfan Service,Chef Server,Package Repository和vHadoop Runtime Manager。这里会简单介绍各个模块的功能。 Ironfan架构 下图描绘了Ironfan的

Serengeti管理服务器包括几个重要的模块:Serengeti Web Service,Ironfan Service,Chef Server,Package Repository和vHadoop Runtime Manager。这里会简单介绍各个模块的功能。

Ironfan架构

下图描绘了Ironfan的架构。Ironfan主要包括Cluster OrchestrationEngine,VM Provision Engine,SoftwareProvision Engine和用于存储数据的Chef Server 和Package Server。

·ClusterOrchestration Engine:Ironfan的总控制器,负责加载解析集群定义文件,创建虚拟机,在ChefServer中保存集群的配置信息,并调用Chef REST API为各个虚拟机创建对应的ChefNode和Chef Client, 并设定各个虚拟机的ChefRole。

·VMProvision Engine:创建cluster中的所有虚拟机,并等待虚拟机得到IP。VM Provision Engine提供了接口以支持在各种虚拟机云环境中创建虚拟机,目前实现了Amazon EC2和VMware vCenter的支持。在Serengeti中,所有虚拟机由Ironfan的调用者在VMware vCenter中创建,并将IP保存在cluster spec文件中,传递给Ironfan的VM Provision Engine。

·SoftwareProvision Engine: 使用虚拟机中预先创建好的缺省用户名和密码,SSH远程登录到所有虚拟机中同时启动chef-client来安装软件。chef-client是Chef框架中的代理程序,负责在其运行的结点上执行预先由Chef Role指定的安装配置脚本。chef-client也会将执行进度数据保存在Chef Server中。

·ChefServer:用于存储Chef  Nodes,Chef Clients, Chef Roles, Chef Cookbooks, 提供Chef RESTAPI, 是Chef框架的重要组成部件。

·PackageServer:用于存储所需的Hadoop和其他Hadoop所依赖的安装包。

Ironfan对外提供了Knife CLI命令行接口,其调用者即SerengetiWeb Service 组件)创建单独进程调用Knife CLI,通过进程退出状态值判断成功或者失败。具体的集群结点数据和执行进度信息由调用者随时从ChefServer获取。

图片 1

在博文《灵活管理Hadoop各发行版的运维利器》中,我们介绍了vSphere Big Data ExtensionsBDE)是解决企业部署和管理Hadoop发行版的利器,通过它可以很方便可靠地运维Hadoop多个主流的商业发行版包括社区的Apache Hadoop)。本文的内容围绕上述主题,以具体实例深入讲解如何做到灵活部署和管理Hadoop发行版的。

Cluster Service Discovery

在集群部署过程之中,有些组件的安装和服务的启动顺序是有先后依赖的,比如Datanode服务需要在Namenode服务启动之后再启动,Tasktracker服务需要在Jobtracker服务启动之后再启动,并且这些服务通常不在同一个虚拟机上。因此Ironfan在部署过程中需要控制不同结点上服务的安装和启动顺序,让有依赖关系的结点同步。Ironfan是使用一个名为cluster_service_discovery的cookbook实现相关结点之间同步。

cluster_service_discoverycookbook定义了provide_service,provider_fqdn,provider_fqdn_for_role,all_providers_for_service等等方法,用于实现结点同步。我们以datanode服务需要等待namenode服务启动为例讲解如何实现同步:

·在namenoderecipe中,启动namenode服务之后,调用provide_service(node[:hadoop][:namenode_service_name]),向Chef Server把此结点注册为namenode 服务的提供者;

·在datanoderecipe中,启动datanode服务之前,调用provider_fqdn(node[:hadoop][:namenode_service_name])向Chef Server查询namenode服务提供者的FQDN(或IP); provider_fqdn方法会每隔5秒种向Chef Server查询一次,直到查询到结果,或者30分钟后超时报错。

其他相关结点的同步也与此机制相似,例如Zookeeper结点之间的相互等待,HBase结点等待Zookeeper结点,具体方法调用可查看cluster_service_discovery,zookeeper,hadoop, 和hbase cookbook的源代码。

关于vSphere Big Data Extensions:

VMware vSphere Big Data Extensions简称BDE)基于vSphere平台支持大数据和Apache Hadoop作业。BDE以开源Serengeti项目为基础,为企业级用户提供一系列整合的管理工具,通过在vSphere上虚拟化Apache Hadoop,帮助用户在基础设施上实现灵活、弹性、安全和快捷的大数据部署、运行和管理工作。了解更多关于VMware vSphere Big Data Extensions的信息,请参见

作者介绍

图片 2

胡辉 (Jesse Hu)

VMware高级开发工程师

担任VMware大数据产品vSphere BDE和Serengeti开源项目的技术带头人之一,是Serengeti开源项目最早期的开发者,并实现了第一个原型系统,是Serengeti集群软件安装配置管理模块Ironfan的设计者。在加入VMware之前,曾就职于Yahoo,IBM,Oracle等多家IT企业,对开源社区,云计算, Mobile, SNS, Web 2.0, Ruby都有了解和研究。

介 绍 在 Serengeti中,有二个最重要最关 键 的功能:一是虚拟机管理,即在 vCenter中为一个Hadoop集群创建和管理所需要的虚拟机;另一...

图片 3

IronfanKnife CLI

每一个SerengetiCLI cluster命令都对应一个IronfanKnife CLI命令,包括create (创建集群)、list(查看集群)、config(配置集群)、stop(停止集群)、start(启动集群)、delete(删除集群)。

clustercreate => knife cluster create <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes --bootstrap

clusterlist => knife cluster show <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes

clusterconfig => knife cluster bootstrap <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes

clusterstop => knife cluster stop <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes

clusterstart => knife cluster start <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json–yes --bootstrap

clusterdelete => knife cluster kill <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes

其中参数/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json是Serengeti Web Service传递给Ironfan的cluster spec文件,这是一个JSON格式的文件,包含了集群的结点分组、结点个数、结点软件定义描述、集群的配置、PackageServer和所有虚拟机的名称和IP等信息。Ironfan会分析cluster spec文件,生成Ironfan所需要的cluster定义文件并保存在/opt/serengeti/tmp/.ironfan-clusters/<cluster_name>.rb。

实例:Tarball方式部署GPHD1.2发行版

首先,需要下载GPHD 1.2发行版到本地。这里是Tarball的下载地址,完成后解压缩文件。可以看到一组目录:

图片 4

这个实例,我们要部署的是黄色高亮的组件。

  1. 以serengeti账号SSH 到BDE服务器,Windows上推荐使用WinSCP 工具进行
![](http://www.bkjia.com/uploads/allimg/131228/00423511S-1.png)
  1. 在文件系统中,定位到/opt/serengeti/www/distros/,创建新的目录,命名为gphd/1.2.0.0/

  2. 将本地的GPHD 1.2发行版中的hadoop、pig、hive这三个文件夹中的tar文件上传到gphd/1.2.0.0/目录下,如图所示:

![](http://www.bkjia.com/uploads/allimg/131228/00423541F-2.png)
  1. 打开/opt/seregneti/www/distros/manifest文件,更新gphd相关tarball的注册清单。这个文件非常重要,记录了BDE支持的所有Hadoop发行版的信息
需要更新的清单信息如下:



<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><p>1</p></td>
<td><p>{</p></td>
</tr>
<tr class="even">
<td><p>2</p></td>
<td><p>   &quot;name&quot; : &quot;gphd&quot;,</p>
<p>   &quot;vendor&quot; : &quot;GPHD&quot;,</p></td>
</tr>
<tr class="odd">
<td><p>3</p></td>
<td><p>   &quot;version&quot; :  &quot;1.2.0.0&quot;,</p></td>
</tr>
<tr class="even">
<td><p>4</p></td>
<td><p>   &quot;hveSupported&quot; : true,</p></td>
</tr>
<tr class="odd">
<td><p>5</p></td>
<td><p>   &quot;packages&quot; : [</p></td>
</tr>
<tr class="even">
<td><p>6</p></td>
<td><p>    {</p></td>
</tr>
<tr class="odd">
<td><p>7</p></td>
<td><p>      &quot;roles&quot; :  [&quot;hadoop_namenode&quot;, &quot;hadoop_jobtracker&quot;,  &quot;hadoop_tasktracker&quot;, &quot;hadoop_datanode&quot;,  &quot;hadoop_client&quot;],</p></td>
</tr>
<tr class="even">
<td><p>8</p></td>
<td><p>      &quot;tarball&quot; :  &quot;gphd/1.2.0.0/hadoop-1.0.3-gphd-1.2.0.0-GA.tar.gz&quot;</p></td>
</tr>
<tr class="odd">
<td><p>9</p></td>
<td><p>    },</p></td>
</tr>
<tr class="even">
<td><p>10</p></td>
<td><p>    {</p></td>
</tr>
<tr class="odd">
<td><p>11</p></td>
<td><p>      &quot;roles&quot; : [&quot;pig&quot;],</p></td>
</tr>
<tr class="even">
<td><p>12</p></td>
<td><p>      &quot;tarball&quot; :  &quot;gphd/1.2.0.0/pig-0.9.2-gphd-1.2.0.0-GA.tar.gz&quot;</p></td>
</tr>
<tr class="odd">
<td><p>13</p></td>
<td><p>    },</p></td>
</tr>
<tr class="even">
<td><p>14</p></td>
<td><p>    {</p></td>
</tr>
<tr class="odd">
<td><p>15</p></td>
<td><p>      &quot;roles&quot; : [&quot;hive&quot;,  &quot;hive_server&quot;],</p></td>
</tr>
<tr class="even">
<td><p>16</p></td>
<td><p>      &quot;tarball&quot; :  &quot;gphd/1.2.0.0/hive-0.8.1-gphd-1.2.0.0-GA.tar.gz&quot;</p></td>
</tr>
<tr class="odd">
<td><p>17</p></td>
<td><p>    }</p></td>
</tr>
<tr class="even">
<td><p>18</p></td>
<td><p>   ]</p></td>
</tr>
<tr class="odd">
<td><p>19</p></td>
<td><p> }</p></td>
</tr>
</tbody>
</table>



**说明**:

行1:将这段信息加在Apache Hadoop清单信息之后,用逗号分隔。

行2:name字段可以是任意名称,vendor字段必须是GPHD(不区分大小写),BDE以此识别为GPHD发行版。

行3:版本号和目录1.2.0.0保持一致

行4:hveSupported表示这个Hadoop发行版是否已支持HVE,GPHD1.2已经支持,所以填写true。关于HVE,后续有文章介绍)

行5– 18:是描述GPHD当前包含的Hadoop组件,这个例子使用了Hadoop,Pig和Hive,所以在Packages里,按照三个不同的tarball,分别描述tarball支持的角色。

行6– 9:描述gphd中hadoop的tarball位置以及它支持的角色名称。其中,tarball的路径和实际路径应该保持一样,并且大小写一致。Pig和Hive tarball的描述按照同样要求遵循。每个tarball的描述用{}包含,逗号分隔开。
  1. 用serengeti账号SSH登录BDE服务器,重启Tomcat服务。

    sudo service tomcat restart

    这个重启过程中,BDE服务器会执行一些后台脚本,并重新加载更新后的manifest文件以识别新添加的GPHD发行版,

  2. 重启完成后,打开Serengeti CLI,输入distro list,gphd已经列在其中了。

    注意:如果distrolist给出一些错误提示,表明用户在完成前5步中有一些问题,可以简单自查,如果问题依旧不明确,可以定位到/opt/serengeti/logs目录中的日志文件查看详细错误信息。

验证GPHD 1.2发行版

  1.  验证发行版部署成功的有效办法,就是创建一个GPHD的新集群,这在BDE中非常方便,10分钟搞定。

CLI命令行如下:

cluster create --name gpcluster --distro gphd

--distro是cluster create的一个参数,表示用户希望用哪个发行版创建集群,这里指定“GPHD”为发行版名称,必须大写。如果不提供distro参数,cluster create默认创建的是Apache Hadoop 1.2集群。

创建成功后可以运行cluster list查看该集群运行参数和状态,如下图所示

图片 5

另外,也可以使用BDE的WEB UI创建一个GPHD的集群,步骤如下:

  1. 打开vSphere Web Client,点击Big Data Extensions,进入BDE管理界面。

  2. 点击Big Data Clusters,进入集群管理界面

  3. 在中央的集群列表上方,点击 】图标

  4. 填写创建集群的表单,在Hadoop Distribution选项里,选择GPHD。其余默认即可。

  5. 提交表单。

创建成功后如图所示:

图片 6

了解更多大数据虚拟化精彩内容,欢迎报名参加VMware大数据沙龙。VMware中国研发团队邀请了直接参与vSphere Big Data Extension产品设计和开发的资深专家和工程师、具有丰富经验的美国解决方案架构师,通过精彩演讲和演示,探讨VMware大数据战略,讲解大数据最新技术和核心价值,深度介绍BDE产品的特性和应用场景。VMware大数据沙龙上海站报名:

如有任何问题,您可以发邮件至[email protected]。

关于vSphere Big Data Extensions:

VMware vSphere Big Data Extensions简称BDE)基于vSphere平台支持大数据和Hadoop作业。BDE以开源Serengeti项目为基础,为企业级用户提供一系列整合的管理工具,通过在vSphere上虚拟化Hadoop,帮助用户在基础设施上实现灵活、弹性、安全和快捷的大数据部署、运行和管理工作。了解更多关于VMware vSphere Big Data Extensions的信息,请参见

作者简介:

图片 7

张君迟

VMware大数据解决方案项目经理

目前负责VMware大数据解决方案的管理和市场工作。曾担任VMware数据库管理产品vFabric Data Director产品经理,对虚拟化、云计算、关系型数据库和大数据等企业产品、技术方案和市场有深入的理解和实战经验。在此之前,就职于Microsoft从事分布式系统的产品管理和研发工作。

Big Data ExtensionsBDE)是解决企业部署和管理Hadoop发行版的利器,通过它可...

  • 上: Serengeti虚拟化应用

  • 下: Serengeti管理服务器的系统架构即本文)

Ironfan介绍

在Serengeti中,有二个最重要最关键的功能:一是虚拟机管理,即在vCenter中为一个Hadoop集群创建和管理所需要的虚拟机;另一个是集群软件安装配置管理,即在已安装好操作系统的虚拟机上安装Hadoop相关组件(包括Zookeeper,Hadoop,Hive,Pig等),更新配置文件(例如Namenode/Jobtracker/Zookeeper结点的IP等信息),然后启动Hadoop服务。Ironfan就是在Serengeti中负责集群软件安装配置管理的组件。

Ironfan是基于Chef技术开发的集群软件部署配置管理工具。Chef是一个类似于Puppet和CFEngine的开源的系统配置管理工具,它定义了一套简单易用的DSL(Domain Specific language)语言用于在一台已安装好基本操作系统的机器上安装配置任意软件和配置系统本身。Ironfan基于Chef的框架和API提供了简单易用的自动化部署和管理集群的命令行工具。Ironfan支持部署Zookeeper,Hadoop和HBase集群,也可以编写新的cookbook以部署任意其他非Hadoop集群。

Ironfan最初由美国一家Big Data初创公司Infochimps使用Ruby语言开发,并在github.com上以Apache Licensev2开源。最开始Ironfan只支持在Amazon EC2的Ubuntu虚拟机上部署Hadoop集群。VMwareProject Serengeti团队选择了基于Ironfan来开发Big Data集群工具,并实现了一系列重大改进,让Ironfan可以在VMware vCenter中的CentOS 5.x虚拟机上创建部署Hadoop集群。ProjectSerengeti改进后的Ironfan同样以Apache License v2在github.com上开源,供用户免费下载和修改。

继《零起点部署大数据虚拟化》系列教程之后,本着“知其然,亦知其所以然”的原则,本系列走进大数据虚拟化的内部,分上下两篇博文,帮助读者了解vSphere Big Data Extensions以下简称BDE)的部署架构和系统架构,理解部署原理和内部构成,以及各自的作用。希望对您有所帮助,也欢迎您留言评价。

Chef Roles和 Cookbooks

在Serengeti中所有Chef Role文件存放于/opt/serengeti/cookbooks/roles/*.rb,所有

Chef Cookbook 文件存放于/opt/serengeti/cookbooks/cookbooks/

以hadoop_namenode role为例,/opt/serengeti/cookbooks/roles/hadoop_namenode.rb 内容如下:

name 'hadoop_namenode'

description 'runs a namenode infully-distributed mode. There should be exactly one of these per cluster.'

run_list %w[

  role[hadoop]   # 一个role可以包含引用另一个role

  hadoop_cluster::namenode   # hadoop_cluster 是一个cookbook, namenode是此cookbook中的一个recipe

]

如果开发者需要修改调试 role和cookbook,可在修改role和cookbook 文件后,运行以下命令上传role和cookbook:

knife role from file/opt/serengeti/cookbooks/roles/<role_name>.rb –V

knifecookbook upload <cookbook_name> -V

Serengeti Web Service

Serengeti Web Service是Serengeti的工作流控制中心,提供对外的RESTAPI,外部客户端可以通过REST API访问所有Serengeti提供的功能。

这是一个运行在Tomcat之上的Web Service,大量使用了SpringFramework提供的各种功能,包括使用Spring Batch进行Workflow的控制,Spring Security保证用户安全性,Spring MVC提供REST API,以及集成Hibernate进行内部数据的管理。

Web Service同时集成了vCenter Extension的注册和管理。在Serengeti部署完成之后,注册成为vCenter的扩展服务器。负责和VC的通讯,VC 会话的管理,虚拟机的创建,配置和管理。

在Web Service中,一个重要的功能就是虚拟机的分布计算Virtual Machine Placement)。

在虚拟化环境之下,用户提出的请求通常都是创建多少个node,可用的资源有哪些,比如那些主机host),那些存储datastore)可以使用。那么在这些要求之下,我们面对的一个问题抽象来说,就是在n个host之上,创建m个VM,每个VM的硬盘,网络有一定的要求。

在这个命题之下,Serengeti为了满足hadoop对资源使用的特殊要求,开发了一些通用的分布算法。比如典型的应用是在可用host之上平均分布。这样就保证Hadoop的节点不会分布在同一台host之上,为数据的可靠性提供了基础。

为了满足数据和计算能力的分离,Serengeti还提供了节点关联的策略。具体来说就是在每台host之上,同时放置m个节点,其中k个是存放数据的节点,j个是进行计算的节点。并且满足k j=m的条件。

之后的文章中会详细介绍Serengeti支持的VM placement算法,以及适合的应用场景,在此不做详细讨论。

vHadoop Runtime ManagerHRM)

HRM提供了集群的弹性伸缩功能。它会监听Hadoop 任务的运行情况和VC资源使用情况,动态调整集群的计算功能,以满足用户对虚拟机共享资源的高级需求。比如调整Hadoop集群对资源使用的优先级,保证高优先级的任务优先完成等等。

在虚拟化的环境中,VC的DRS就提供了资源动态调整的功能,保证某些虚拟机获得更多的资源,来完成高优先级的任务。但是在Hadoop集群的应用场景中,对整个集群的资源使用进行优化调整就是HRM的任务。

Serengeti Web Serivce和HRM之间通过RabbitMQ进行通信。用户也可以在Serengeti的客户端发起手动调整资源的命令。这个命令就是通过RabbitMQ传递给HRM的。

在这里需要强调的一点是HRM的功能只有在BDE,也就是Serengeti的商业版中提供。

之后的文章会对HRM的功能和算法进行详细的讨论。

如有任何问题,您可以发邮件至[email protected]。

关于vSphereBig Data Extensions:

VMware vSphere Big Data Extensions简称BDE)基于vSphere平台支持大数据Hadoop作业。BDE以开源Serengeti项目为基础,为企业级用户提供一系列整合的管理工具,通过在vSphere上虚拟化Hadoop,帮助用户在基础设施上实现灵活、弹性、安全和快捷的大数据部署、运行和管理工作。了解更多关于VMware vSphere Big Data Extensions的信息,请参见

作者简介

图片 8

蔺永华 Emma Lin)

VMware高级开发工程师,Staff Engineer

担任VMware大数据产品vSphere BDE、Serengeti开源项目的技术带头人,引领和参与Serengeti核心架构与功能的设计和研发,经历Serengeti自问世以来的6个版本的研发和发布。长期致力于通过vSphere BDE/Serengeti使VMware虚拟化基础架构成为大数据应用的最好选择。在VMware之前,就职于BEA/Oracle软件开发中心,长期从事分布式系统的开发、设计工作,拥有丰富的企业软件开发经验。

《零起点部署大数据虚拟化》系列教程之后,本着“知其然,亦知其所以然”的原则, 本系列走进大数据虚拟化的内部,分上下两篇博...

Ironfancluster定义文件 (DSL, roles)

接下来,我们看看Ironfan是如何定义集群的。下图是一个名为demo的cluster的定义文件demo.rb,它是一个Ruby文件,用Ironfan所定义的DSL语言描述集群的组成结构,定义了3个虚拟机组。其中每一个facet定义了一个虚拟机组,包含若干个安装同样软件的虚拟机。每个分组中结点个数由instance指定,虚拟机上要安装的软件由role指定。这个role就是Chef中所定义的role。

图片 9

Serengeti管理服务器的系统架构图

Ironfan Service

Ironfan是基于Chef的Hadoop 集群部署和管理工具。在Web Service完成虚拟机的创建之后,负责控制整个Hadoop集群的软件安装,和配置工作。

Web Service会把整个集群的虚拟机信息,包括虚拟机的名字,ip地址,需要安装的Hadoop组件比如namenode,jobtracker)等信息传递给Ironfan。

而Ironfan将会调用Chef提供的Knife命令行工具,和Chef Server提供的REST API,把所有节点的信息提供给Chef Server,并且通过SSH远程启动集群中所有虚拟机之上的Chef Client,以便在每一个节点上安装和配置软件。

除此之外,Ironfan还会监听软件安装运行的进展情况,实时报告给Serengeti Web Service,以确保用户在集群创建过程中,直观看到各个虚拟机的软件安装进度。

Chef和Ironfan都是用Ruby开发的工具,我们为Ironfan专门开发了Thrift Service,使Serengeti Web Service可以直接通过RPC方式来调用Ironfan,而不需要通过Java的本地调用来执行Ironfan的命令行。

之后会有专门的文章详细介绍Ironfan和Chef,以及他们在Serengeti中所起的作用。

Chef Service

Chef是当前流行的分布式软件配置管理工具,在数据中心管理运维中广泛使用。例如Facebook和Amazon都是Chef的用户。Serengeti在虚拟机创建完成之后,使用Chef的脚本进行hadoop软件的安装和管理。

Serengeti包含一系列Chef脚本,支持多个hadoop发行版的安装和配置,包括Hadoop1.x,Hadoop2.x,和HBase。这些脚本都预先安装在Chef Server之上。

Chef Client组件预先安装在Serengeti创建的虚拟机之中。当虚拟机创建完成之后,Chef Client将会从Chef Server下载并运行相应的脚本,真正完成Hadoop的安装和配置工作。

Package Repository

Package Repository的设计使得Serengeti不再绑定任何的hadoop发行版,用户可以在Serengeti中自行安装自己需要的hadoop发行版,之后就可以用Serengeti灵活创建需要的hadoop集群。

Package Repository可以包含Hadoop不同发行版的安装包,CDH3/CDH4,MapR,PivotalHD,GreenPlum HD 和Hortonworks Data Platform。以方便用户指定使用哪种发行版。

Chef 脚本中包含了Hadoop软件的下载和安装指令,它可以从Serengeti内置的Package Repository之上下载安装包,也可以到指定的URL去下载。当然如果需要连接到外网下载,虚拟机需要连接外网的权限,或者配置httpproxy。

Serengeti管理服务器的系统架构

编辑:计算机知识 本文来源:深切深入分析大数目虚构化的架构,大数目虚构

关键词: 欧洲杯竞猜