Far Away in Distance, Friendship in Heart.
15

NoSQL 数据建模技术

分类:其他 | 给我留言 |

全文译自墙外文章“NoSQL Data Modeling Techniques”,译得不好,还请见谅。这篇文章看完之后,你可能会对NoSQL的数据结构会有些感觉。我的感觉是,关系型数据库想把一致性,完整性,索引,CRUD都干好,NoSQL只干某一种事,但是牺牲了很多别的东西。总体来说,我觉得NoSQL更适合做Cache。下面是正文——

NoSQL 数据库经常被用作很多非功能性的地方,如,扩展性,性能和一致性的地方。这些NoSQL的特性在理论和实践中都正在被大众广泛地研究着,研究的热点正是那些和性能分布式相关的非功能性的东西,我们都知道 CAP 理论被很好地应用于了 NoSQL 系统中(陈皓注:CAP即,一致性(Consistency), 可用性(Availability), 分区容忍性(Partition tolerance),在分布式系统中,这三个要素最多只能同时实现两个,而NoSQL一般放弃的是一致性)。但在另一方面,NoSQL的数据建模技术却因为缺乏像关系型数据库那样的基础理论没有被世人很好地研究。这篇文章从数据建模方面对NoSQL家族进行了比较,并讨论几个常见的数据建模技术。

要开始讨论数据建模技术,我们不得不或多或少地先系统地看一下NoSQL数据模型的成长的趋势,以此我们可以了解一些他们内在的联系。下图是NoSQL家族的进化图,我们可以看到这样的进化:Key-Value时代,BigTable时代,Document时代,全文搜索时代,和Graph数据库时代:(陈皓注:注意图中SQL说的那句话,NoSQL再这样发展下去就是SQL了,哈哈。)


NoSQL Data Models

首先,我们需要注意的是SQL和关系型数据模型已存在了很长的时间,这种面向用户的自然性意味着:

 

  • 最终用户一般更感兴趣于数据的聚合显示,而不是分离的数据,这主要通过SQL来完成。
  • 我们无法通过人手工控制数据的并发性,完整性,一致性,或是数据类型校验这些东西的。这就是为什么SQL需要在事务,二维表结构(schema)和外表联合上做很多事。

另一方面,SQL可以让软件应用程序在很多情况下不需要关心数据库的数据聚合,和数据完整性和有效性进行控制。而如果我们去除了数据一致性,完整性这些东西,会对性能和分布存储有着重的帮助。正因为如此,我们才有数据模型的进化:

  • Key-Value 键值对存储是非常简单而强大的。下面的很多技术基本上都是基于这个技术开始发展的。但是,Key-Value有一个非常致命的问题,那就是如果我们需要查找一段范围内的key。(陈皓注:学过hash-table数据结构的人都应该知道,hash-table是非序列容器,其并不像数组,链接,队列这些有序容器,我们可以控制数据存储的顺序)。于是,有序键值 (Ordered Key-Value) 数据模型被设计出来解决这一限制,来从根本上提高数据集的问题。
  • Ordered Key-Value 有序键值模型也非常强大,但是,其也没有对Value提供某种数据模型。通常来说,Value的模型可以由应用负责解析和存取。这种很不方便,于是出现了 BigTable类型的数据库,这个数据模型其实就是map里有map,map里再套map,一层一层套下去,也就是层层嵌套的key-value(value里又是一个key-value),这种数据库的Value主要通过“列族”(column families),列,和时间戳来控制版本。(陈皓注:关于时间戳来对数据的版本控制主要是解决数据存储并发问题,也就是所谓的乐观锁,详见《多版本并发控制(MVCC)在分布式系统中的应用》)
  • Document databases 文档数据库 改进了 BigTable 模型,并提供了两个有意义的改善。第一个是允许Value中有主观的模式(scheme),而不是map套map。第二个是索引。 Full Text Search Engines 全文搜索引擎可以被看作是文档数据库的一个变种,他们可以提供灵活的可变的数据模式(scheme)以及自动索引。他们之间的不同点主要是,文档数据库用字段名做索引,而全文搜索引擎用字段值做索引。
  • Graph data models 图式数据库 可以被认为是这个进化过程中从 Ordered Key-Value 数据库发展过来的一个分支。图式数据库允许构建议图结构的数据模型。它和文档数据库有关系的原因是,它的很多实现允许value可以是一个map或是一个document。

 NoSQL 数据模型摘要

本文剩下的章节将向你介绍数据建模的技术实现和相关模式。但是,在介绍这些技术之前,先来一段序言:

  • NoSQL 数据模型设计一般从业务应用的具体数据查询入手,而不是数据间的关系:
    • 关系型的数据模型基本上是分析数据间的结构和关系。其设计理念是: ”What answers do I have?”
    • NoSQL 数据模型基本上是从应用对数据的存取方式入手,如:我需要支持某种数据查询。其设计理念是 ”What questions do I have?”
  • NoSQL 数据模型设计比关系型数据库需要对数据结构和算法的更深的了解。在这篇文章中我会和大家说那些尽人皆知的数据结构,这些数据结构并不只是被NoSQL使用,但是对于NoSQL的数据模型却非常有帮助。
  • 数据冗余和反规格化是一等公民。
  • 关系型数据库对于处理层级数据和图式数据非常的不方便。NoSQL用来解决图式数据明显是一个非常好的解决方案,几乎所有的NoSQL数据库可以很强地解决此类问题。这就是为什么这篇文章专门拿出一章来说明层级数据模型。
下面是NoSQL的分类表,也是我用来写这篇文章时做实践的产品:
  • Key-Value 存储: Oracle Coherence, Redis, Kyoto Cabinet
  • 类BigTable存储: Apache HBase, Apache Cassandra
  • 文档数据库: MongoDB, CouchDB
  • 全文索引: Apache Lucene, Apache Solr
  • 图数据库: neo4j, FlockDB

概念技术 Conceptual Techniques

这一节主要介绍NoSQL数据模型的基本原则。

(1) 反规格化 Denormalization

反规格化 Denormalization 可以被认为是把相同的数据拷贝到不同的文档或是表中,这样就可以简化和优化查询,或是正好适合用户的某中特别的数据模型。这篇文章中所说的绝大多数技术都或多或少地导向了这一技术。

总体来说,反规格化需要权衡下面这些东西:

  • 查询数据量 /查询IO  VS  总数据量。使用反规格化,一方面可以把一条查询语句所需要的所有数据组合起来放到一个地方存储。这意味着,其它不同不同查询所需要的相同的数据,需要放在别不同的地方。因此,这产生了很多冗余的数据,从而导致了数据量的增大。
  • 处理复杂度  VS 总数据量. 在符合范式的数据模式上进行表连接的查询,很显然会增加了查询处理的复杂度,尤其对于分布式系统来说更是。反规格化的数据模型允许我们以方便查询的方式来存构造数据结构以简化查询复杂度。

适用性: Key-Value Store 键值对数据库, Document Databases文档数据库, BigTable风格的数据库。

(2) 聚合 Aggregates

所有类型的NoSQL数据库都会提供灵活的Schema(数据结构,对数据格式的限制):

  • Key-Value Stores 和 Graph Databases 基本上来说不会Value的形式,所以Value可以是任意格式。这样一来,这使得我们可以任意组合一个业务实体的keys。比如,我们有一个用户帐号的业务实体,其可以被如下这些key组合起来: UserID_name, UserID_email, UserID_messages 等等。如果一个用户没有email或message,那么相应也不会有这样的记录。
  • BigTable 模型通过列集合来支持灵活的Schema,我们称之为列族(column family)。BigTable还可以在同一记录上出现不同的版本(通过时间戳)。
  • Document databases 文档数据库是一种层级式的“去Schema”的存储,虽然有些这样的数据库允许检验需要保存的数据是否满足某种Schema。

灵活的Schema允许你可以用一种嵌套式的内部数据方式来存储一组有关联的业务实体(陈皓注:类似于JSON这样的数据封装格式)。这样可以为我们带来两个好处。

  • 最小化“一对多”关系——可以通过嵌套式的方式来存储实体,这样可以少一些表联结。
  • 可以让内部技术上的数据存储更接近于业务实体,特别是那种混合式的业务实体。可能存于一个文档集或是一张表中。
下图示意了这两种好处。图中描给了电子商务中的商品模型(陈皓注:我记得我在“挑战无处不在”一文中说到过电商中产品分类数据库设计的挑战)
  • 首先,所有的商品Product都会有一个ID,Price 和 Description。
  • 然后,我们可以知道不同的类型的商品会有不同的属性。比如,作者是书的属性,长度是牛仔裤的属性。其些属性可能是“一对多”或是“多对多”的关系,如:唱片中的曲目。
  • 接下来,我们知道,某些业务实体不可能使用固定的类型。如:牛仔裤的属性并不是所有的牌子都有的,而且,有些名牌还会搞非常特别的属性。

对于关系型数据库来说,要设计这样的数据模型并不简单,而且设计出来的绝对离优雅很远很远。而我们NoSQL中灵活的Schema允许你使用一个聚合 Aggregate (product) 可以建出所有不同种类的商品和他们的不同的属性:

Entity Aggregation

上图中我们可以比较关系型数据库和NoSQL的差别。但是我们可以看到在数据更新上,非规格化的数据存储在性能和一致性上会有很大的影响,这就是我们需要重点注意和不得不牺牲的地方

适用性: Key-Value Store 键值对数据库, Document Databases文档数据库, BigTable风格的数据库。

(3) 应用层联结 Application Side Joins

表联结基本上不被NoSQL支持。正如我们前面所说的,NoSQL是“面向问题”而不是“面向答案”的,不支持表联结就是“面向问题”的后果。表的联结是在设计时被构造出来的,而不是在执行时建造出来的。所以,表联结在运行时是有很大开销的(陈皓注:搞过SQL表联结的都知道笛卡尔积是什么东西,大可以在参看以前酷壳的“图解数据库表Joins”),但是在使用了 Denormalization 和 Aggregates 技术后,我们基本不用进行表联结,如:你们使用嵌套式的数据实体。当然,如果你需要联结数据,你需要在应用层完成这个事。下面是几个主要的Use Case:

  • 多对多的数据实体关系——经常需要被连接或联结。
  • 聚合 Aggregates 并不适用于数据字段经常被改变的情况。对此,我们需要把那些经常被改变的字段分到另外的表中,而在查询时我们需要联结数据。例如,我们有个Message系统可以有一个User实体,其包括了一个内嵌的Message实体。但是,如果用户不断在附加 message,那么,最好把message拆分到另一个独立的实体,但在查询时联结这User和Message这两个实体。如下图:

适用性: Key-Value Store 键值对数据库, Document Databases文档数据库, BigTable风格的数据库, Graph Databases 图数据库。

通用建模技术 General Modeling Techniques

在本书中,我们将讨论NoSQL中各种不同的通用的数据建模技术。

(4) 原子聚合 Atomic Aggregates

很多NoSQL的数据库(并不是所有)在事务处理上都是短板。在某些情况下,他们可以通过分布式锁技术或是应用层管理的MVCC技术来实现其事务性(陈皓注:可参看本站的“多版本并发控制(MVCC)在分布式系统中的应用”)但是,通常来说只能使用聚合Aggregates技术来保证一些ACID原则。

这就是为什么我们的关系型数据库需要有强大的事务处理机制——因为关系型数据库的数据是被规格化存放在了不同的地方。所以,Aggregates聚合允许我们把一个业务实体存成一个文档、存成一行,存成一个key-value,这样就可以原子式的更新了:


Atomic Aggregates

当然,原子聚合 Atomic Aggregates 这种数据模型并不能实现完全意义上的事务处理,但是如果支持原子性,锁,或 test-and-set 指令,那么, Atomic Aggregates 是可以适用的。

适用性Key-Value Store 键值对数据库, Document Databases文档数据库, BigTable风格的数据库。

(5) 可枚举键 Enumerable Keys

也许,对于无顺序的Key-Value最大的好处是业务实体可以被容易地hash以分区在多个服务器上。而排序了的key会把事情搞复杂,但是有些时候,一个应用能从排序key中获得很多好处,就算是数据库本身不提供这个功能。让我们来思考下email消息的数据模型:

  1. 一些NoSQL的数据库提供原子计数器以允许生一些连续的ID。在这种情况下,我们可以使用 userID_messageID 来做为一个组合key。如果我们知道最新的message ID,就可以知道前一个message,也可能知道再前面和后面的Message。
  2. Messages可以被打包。比如,每天的邮件包。这样,我们就可以对邮件按指定的时间段来遍历。

适用性Key-Value Store 键值对数据库

(6) 降维 Dimensionality Reduction

Dimensionality Reduction 降维是一种技术可以允许把一个多维的数据映射成一个Key-Value或是其它非多给的数据模型。

传统的地理位置信息系统使用一些如“四分树QuadTree” 或 “R-Tree” 来做地理位置索引。这些数据结构的内容需要被在适当的位置更新,并且,如果数据量很大的话,操作成本会很高。另一个方法是我们可以遍历一个二维的数据结构并把其扁平化成一个列表。一个众所周知的例子是Geohash(地理哈希)。一个Geohash使用“之字形”的路线扫描一个2维的空间,而且遍历中的移动可以被简单地用0和1来表示其方向,然后在移动的过程中产生0/1串。下图展示了这一算法:(陈皓注:先把地图分成四份,经度为第一位,纬度为第二位,于是左边的经度是0,右边的是1,纬度也一样,上面是为1,下面的为0,这样,经纬度就可以组合成01,11,00,10这四个值,其标识了四块区域,我们可以如此不断的递归地对每个区域进行四分,然后可以得到一串1和0组成的字串,然后使用0-9,b-z 去掉(去掉a, i, l, o)这32个字母进行base32编码得到一个8个长度的编码,这就是Geohash的算法)


Geohash Index

Geohash的最强大的功能是使用简单的位操作就可以知道两个区域间的距离,就像图中所示(陈皓:proximity框着的那两个,这个很像IP地址了)。Geohash把一个二维的坐标生生地变成了一个一维的数据模型,这就是降维技术。BigTable的降维技术参看到文章后面的 [6.1]。更多的关于Geohash和其它技术可以参看 [6.2] 和 [6.3]。

适用性: Key-Value Store 键值对数据库, Document Databases文档数据库, BigTable风格的数据库。

(7) 索引表 Index Table

Index Table 索引表是一个非常直白的技术,其可以你在不支持索引的数据库中得到索引的好处。BigTable是这类最重要的数据库。这需要我们维护一个有相应存取模式的特别表。例如,我们有一个主表存着用户帐号,其可以被UserID存取。某查询需要查出某个城市里所有的用户,于是我们可以加入一张表,这张表用城市做主键,所有和这个城市相关的UserID是其Value,如下所示:


Index Table Example

可见,城市索引表的需要和对主表用户表保持一致性,因此,主表的每一个更新可能需要对索引表进行更新,不然就是一个批处理更新。无论哪个方式,这都会损伤一些性能,因为需要保持一致性。

Index Table 索引表可以被认为是关系型数据库中的视图的等价物。

适用性: BigTable 数据库。

(8) 键组合索引 Composite Key Index

Composite key 键组合是一个很常用的技术,对此,当我们的数据库支持键排序时能得到极大的好处。Composite key组合键的拼接成为第二排序字段可以让你构建出一种多维索引,这很像我们之前说过的 Dimensionality Reduction 降维技术。例如,我们需要存取用户统计。如果我们需要根据不同的地区来统计用户的分布情况,我们可以把Key设计成这样的格式 (State:City:UserID),这样一来,就使得我们可以通过State到City来按组遍历用户,特别是我们的NoSQL数据库支持在key上按区查询(如:BigTable类的系统):

1
2
SELECT Values WHERE state="CA:*"
SELECT Values WHERE city="CA:San Francisco*"


Composite Key Index

适用性BigTable 数据库。

(9) 键组合聚合 Aggregation with Composite Keys

Composite keys  键组合技术并不仅仅可以用来做索引,同样可以用来区分不用的类型的数据以支持数据分组。考虑一个例子,我们有一个海量的日志数组,这个日志记录了互联网上的用户的访问来源。我们需要计算从某一网站过来的独立访客的数量,在关系型数据库中,我们可能需要下面这样的SQL查询语句:

1
SELECT count(distinct(user_id)) FROM clicks GROUP BY site

我们可以在NoSQL中建立如下的数据模型:


Counting Unique Users using Composite Keys

这样,我们就可以把数据按UserID来排序,我们就可以很容易把同一个用户的数据(一个用户并不会产生太多的event)进行处理,去掉那些重复的站点(使用hash table或是别的什么)。另一个可选的技术是,我们可以对每一个用户建立一个数据实体,然后把其站点来源追加到这个数据实体中,当然,这样一来,数据的更新在性能相比之下会有一定损失。

适用性: Ordered Key-Value Store 排序键值对数据库, BigTable风格的数据库。


(10) 反转搜索 Inverted Search – 直接聚合 Direct Aggregation

这个技术更多的是数据处理技术,而不是数据建模技术。尽管如此,这个技术还是会影响数据模型。这个技术最主要的想法是使用一个索引来找到满足某条件的数据,但是把数据聚合起需要使用全文搜索。还是让我们来说一个示例。还是用上面那个例子,我们有很多的日志,其中包括互联网用户和他们的访问来源。让我们假定每条记录都有一个UserID,还有用户的种类 (Men, Women, Bloggers, 等),以及用户所在的城市,和访问过的站点。我们要干的事是,为每个用户种类找到满足某些条件(访问源,所在城市,等)的的独立用户。

很明显,我们需要搜索那些满足条件的用户,如果我们使用反转搜索,这会让我们把这事干得很容易,如: {Category -> [user IDs]} 或 {Site -> [user IDs]}。使用这样的索引, 我们可以取两个或多个UserID要的交集或并集(这个事很容易干,而且可以干得很快,如果这些UserID是排好序的)。但是,我们要按用户种类来生成报表会变得有点麻烦,因为我们用语句可能会像下面这样

1
SELECT count(distinct(user_id)) ... GROUP BY category

但这样的SQL很没有效率,因为category数据太多了。为了应对这个问题,我们可以建立一个直接索引 {UserID -> [Categories]} 然后我们用它来生成报表:


Counting Unique Users using Inverse and Direct Indexes

最后,我们需要明白,对每个UserID的随机查询是很没有效率的。我们可以通过批查询处理来解决这个问题。这意味着,对于一些用户集,我们可以进行预处理(不同的查询条件)。

适用性: Key-Value Store 键值对数据库, Document Databases文档数据库, BigTable风格的数据库。

层级式模型 Hierarchy Modeling Techniques

(11) 树形聚合Tree Aggregation

树形或是任意的图(需反规格化)可以被直接打成一条记录或文档存放。

  • 当树形结构被一次性取出时这会非常有效率(如:我们需要展示一个blog的树形评论)
  • 搜索和任何存取这个实体都会存在问题。
  • 对于大多数NoSQL的实现来说,更新数据都是很不经济的(相比起独立结点来说)


Tree Aggregation

适用性: Key-Value 键值对数据库, Document Databases 文档数据库

(12) 邻接列表 Adjacency Lists

Adjacency Lists 邻接列表是一种图 – 每一个结点都是一个独立的记录,其包含了 所有的父结点或子结点。这样,我们就可以通过给定的父或子结点来进行搜索。当然,我们需要通过hop查询遍历图。这个技术在广度和深度查询,以及得到某个结点的子树上没有效率。

适用性: Key-Value 键值对数据库, Document Databases 文档数据库


(13) Materialized Paths

Materialized Paths 可以帮助避免递归遍历(如:树形结构)。这个技术也可以被认为是反规格化的一种变种。其想法是为每个结点加上父结点或子结点的标识属性,这样就可以不需要遍历就知道所有的后裔结点和祖先结点了:


Materialized Paths for eShop Category Hierarchy

这个技术对于全文搜索引擎来说非常有帮助,因为其可以允许把一个层级结构转成一个文档。上面的示图中我们可以看到所有的商品或Men’s Shoes下的子分类可以被一条很短的查询语句处理——只需要给定个分类名。

Materialized Paths 可以存储一个ID的集合,或是一堆ID拼出的字符串。后者允许你通过一个正则表达式来搜索一个特定的分支路径。下图展示了这个技术(分支的路径包括了结点本身):


Query Materialized Paths using RegExp

适用性: Key-Value 键值对数据库, Document Databases 文档数据, Search Engines 搜索引擎

(14) 嵌套集 Nested Sets

Nested sets 嵌套集是树形结构的标准技术。它被广泛地用在了关系性数据库中,它完全地适用于 Key-Value 键值对数据库 和 Document Databases 文档数据库。这个技术的想法是把叶子结点存储成一个数组,并通过使用索引的开始和结束来映射每一个非叶子结点到一个叶子结点集,就如下图所示一样:


Modeling of eCommerce Catalog using Nested Sets

这样的数据结构对于immutable data不变的数据 有非常不错的效率,因为其点内存空间小,并且可以很快地找出所有的叶子结点而不需要树的遍历。尽管如此,在插入和更新上需要很高的性能成本,因为新的叶子结点需要大规模地更新索引。

适用性: Key-Value Stores 键值数据库, Document Databases 文档数据库

(15) 嵌套文档扁平化:有限的字段名 Nested Documents Flattening: Numbered Field Names

搜索引擎基本上来说和扁平文档一同工作,如:每一个文档是一个扁平的字段和值的例表。这种数据模型的用来把业务实体映射到一个文本文档上,如果你的业务实体有很复杂的内部结构,这可能会变得很有挑战。一个典型的挑战是把一个有层级的文档映映射出来。例如,文档中嵌套另一个文档。让我们看看下面的示例:


Nested Documents Problem

上面的每一个业务实体代码一种简历。其包括了人名和一个技能列表。我把这个层级文档映射成一个文本文档,一种方法是创建 Skill 和 Level 字段。这个模型可以通过技术或是等级来搜索一个人,而上图标注的那样的组合查询则会失败。(陈皓注:因为分不清Excellent是否是Math还是Poetry上的)

在引用中的 [4.6] 给出了一种解决方案。其为每个字段都标上数字 Skill_i 和 Level_i,这样就可以分开搜索每一个对(下图中使用了OR来遍历查找所有可能的字段):


Nested Document Modeling using Numbered Field Names

这样的方式根本没有扩展性,对于一些复杂的问题来说只会让代码复杂度和维护工作变大。

适用性: Search Engines 全文搜索

(16)嵌套文档扁平化:邻近查询 Nested Documents Flattening: Proximity Queries

在附录 [4.6]中给出了这个技术用来解决扁平层次文档。它用邻近的查询来限制可被查询的单词的范围。下图中,所有的技能和等级被放在一个字段中,叫 SkillAndLevel,查询中出现的 “Excellent” 和 “Poetry” 必需一个紧跟另一个:


Nested Document Modeling using Proximity Queries

附录 [4.3] 中讲述了这个技术被用在Solr中的一个成功案例。

适用性: Search Engines 全文搜索

(17) 图结构批处理 Batch Graph Processing

Graph databases 图数据库,如 neo4j 是一个出众的图数据库,尤其是使用一个结点来探索邻居结点,或是探索两个或少量结点前的关系。但是处理大量的图数据是很没有效率的,因为图数据库的性能和扩展性并不是其目的。分布式的图数据处理可以被 MapReduce 和 Message Passing pattern 来处理。如: 在我前一篇的文章中的那个示例。这个方法可以让 Key-Value stores, Document databases, 和 BigTable-style databases 适合于处理大图。

Applicability: Key-Value Stores, Document Databases, BigTable-style Databases

参考

Finally, I provide a list of useful links related to NoSQL data modeling:

  1. Key-Value Stores:
    1. http://www.devshed.com/c/a/MySQL/Database-Design-Using-KeyValue-Tables/
    2. http://antirez.com/post/Sorting-in-key-value-data-model.html
    3. http://stackoverflow.com/questions/3554169/difference-between-document-based-and-key-value-based-databases
    4. http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html
  2. BigTable-style Databases:
    1. http://www.slideshare.net/ebenhewitt/cassandra-datamodel-4985524
    2. http://www.slideshare.net/mattdennis/cassandra-data-modeling
    3. http://nosql.mypopescu.com/post/17419074362/cassandra-data-modeling-examples-with-matthew-f-dennis
    4. http://s-expressions.com/2009/03/08/hbase-on-designing-schemas-for-column-oriented-data-stores/
    5. http://jimbojw.com/wiki/index.php?title=Understanding_Hbase_and_BigTable
  3. Document Databases:
    1. http://www.slideshare.net/mongodb/mongodb-schema-design-richard-kreuters-mongo-berlin-preso
    2. http://www.michaelhamrah.com/blog/2011/08/data-modeling-at-scale-mongodb-mongoid-callbacks-and-denormalizing-data-for-efficiency/
    3. http://seancribbs.com/tech/2009/09/28/modeling-a-tree-in-a-document-database/
    4. http://www.mongodb.org/display/DOCS/Schema+Design
    5. http://www.mongodb.org/display/DOCS/Trees+in+MongoDB
    6. http://blog.fiesta.cc/post/11319522700/walkthrough-mongodb-data-modeling
  4. Full Text Search Engines:
    1. http://www.searchworkings.org/blog/-/blogs/query-time-joining-in-lucene
    2. http://www.lucidimagination.com/devzone/technical-articles/solr-and-rdbms-basics-designing-your-application-best-both
    3. http://blog.griddynamics.com/2011/07/solr-experience-search-parent-child.html
    4. http://www.lucidimagination.com/blog/2009/07/18/the-spanquery/
    5. http://blog.mgm-tp.com/2011/03/non-standard-ways-of-using-lucene/
    6. http://www.slideshare.net/MarkHarwood/proposal-for-nested-document-support-in-lucene
    7. http://mysolr.com/tips/denormalized-data-structure/
    8. http://sujitpal.blogspot.com/2010/10/denormalizing-maps-with-lucene-payloads.html
    9. http://java.dzone.com/articles/hibernate-search-mapping-entit
  5. Graph Databases:
    1. http://docs.neo4j.org/chunked/stable/tutorial-comparing-models.html
    2. http://blog.neo4j.org/2010/03/modeling-categories-in-graph-database.html
    3. http://skillsmatter.com/podcast/nosql/graph-modelling
    4. http://www.umiacs.umd.edu/~jimmylin/publications/Lin_Schatz_MLG2010.pdf
  6. Demensionality Reduction:
    1. http://www.slideshare.net/mmalone/scaling-gis-data-in-nonrelational-data-stores
    2. http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves
    3. http://www.trisis.co.uk/blog/?p=1287

(全文完)

 

FROM:http://coolshell.cn/articles/7270.html

12

Instagram 架构分析笔记

分类:其他 | 给我留言 |

Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队。作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张。不得不说,这真他妈是个业界奇迹。

几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,披露了 Instagram 架构的一些信息,足够勾起大多数人的好奇心。读罢做点笔记,各种线索还是有一定参考价值的。能打开原文的建议直接读原文。

Instragram.png

Instagram 开发团队奉行的三个核心原则:

  • Keep it very simple (极简主义)
  • Don’t re-invent the wheel (不重复发明轮子)
  • Go with proven and solid technologies when you can(能用就用靠谱的技术)

OS/主机

操作系统的选择,在Amazon EC2上跑 Ubuntu Linux 11.04 (Natty Narwhal) ,这个版本经过验证在 EC2 上够稳定。因为只有三名工程师,只有三名工程师,所以自己部署机器到 IDC 是不靠谱的事情。幸好有亚马逊。

 

负载均衡

此前曾用过两台 Nginx 做 DNS 轮询承载前端请求,这样做会有副作用,现在已经迁移到Amazon的ELB(Elastic Load Balancer),起了三个 Nginx 实例,在 ELB 层停掉了 SSL , 以缓解 CPU 压力。DNS 服务使用 Amazon Route53 服务。

 

应用服务器

启用了 25 个 Django 实例,运行在 High-CPU Extra-Large 类型的服务器实例上,之所以用 High-CPU Extra-Large 实例是因为应用请求是 CPU 密集型而非 IO 密集型。

 

使用 Gunicorn 作为 WSGI 服务器。过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源。使用 Fabric 加速部署。

数据存储

用户信息、图片元数据、标签等大部分数据存储在 PostgreSQL 中。主要的 Shard 数据库集群有 12个节点。

实践中发现 Amazon 的网络磁盘系统单位时间内寻道能力不行,所以有必要将数据尽量放到内存中。创建了软 RAID 以提升 IO 能力,使用的 Mdadm 工具进行 RAID 管理。

管理内存中的数据,vmtouch 这个小工具值得推荐。

PostgreSQL 设置为 Master-Replica 方式,流复制模式。利用 EBS 的快照进行数据库备份。使用 XFS 文件系统,以便和快照服务充分配合。 使用 repmgr 这个小工具做 PostgreSQL 复制管理器器。

连接池管理,用了 PgbouncerChristophe Pettus 的文章包含了不少 PostgreSQL 数据库的信息。

TB 级别的海量图片存储在 Amazon S3 上,CDN 采用的也是 Amazon 的服务,CloudFront。

Instagram 也是 Redis 的重度用户,Feed 以及 Session 信息都用 Redis 处理,Redis 也是以 Master-Replica 方式部署。在 Replica 节点上进行数据备份。

使用了 Apache Solr 承担 Geo-search API 的工作,Solr 简单的 JSON 接口也不错。

缓存使用了 6 个 Memcached 实例,库使用 pylibmc 和 libmemcached。亚马逊也提供缓存服务-Elastic Cache service ,Instagram 也有尝试,不过不便宜。

任务队列/发布通知

队列服务使用 Gearman ,通知系统则使用 pyapns 来实现。

监控

前面提及的服务器实例数量加起来,的确有100多个,有效的监控是相当有必要的。使用 Munin 作为主要监控工具 , 也写了不少定制插件,外部监控用 Pingdom 的服务。通知服务使用PagerDuty

对于 Python 的错误报告,使用 Disqus 团队开源的 Sentry 来处理。

几个感想

0)轻装上阵说起来容易,做起来非常难。这也是 Instagram 团队目前最令人着迷的地方;

1)Python 社区已经足够成熟,各个环节上都已经有不错的解决方案了。

2)如果要问我最大的一个感慨,我要说:Amazon 真是一家伟大的公司,甚至比 Google 还伟大

 

FROM:http://www.dbanotes.net/arch/instagram.html

09

安装mysql UDF

分类:MySQL | 给我留言 |
将MySQL数据映射到Memcached

1. 安装memcached
tar zxvf libevent-1.2.tar.gz
cd libevent-1.2
./configure –prefix=/usr
make
make install
tar zxvf memcached-1.2.0.tar.gz
cd memcached-1.2.0
./configure --prefix=/usr/local/memcached --with-libevent=/usr
make
make install

2. 启动memcached
/usr/local/memcached/memcached -d -m 100 -p 11211 -u root
	如果出错,则执行:
	ln -s /usr/local/lib/libevent-1.2.so.1 /lib/libevent-1.2.so.1

3. 安装memcache的php扩展
tar vxzf memcache-2.2.1.tgz
cd memcache-2.2.1
/usr/local/php/bin/phpize
./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir
make
make install
上述安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/
把php.ini中的extension_dir = './'修改为
extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/”
添加一行来载入memcache扩展:extension=memcache.so

4. 安装libmemcached和memcached_functions_mysql
wget http://download.tangent.org/libmemcached-0.42.tar.gz
wget http://download.tangent.org/memcached_functions_mysql-0.9.tar.gz
tar zxvf libmemcached-0.42.tar.gz
tar zxvf memcached_functions_mysql-0.9.tar.gz
cd libmemcached-0.42
./configure --prefix=/usr/local/libmemcached/ --with-memcached=/usr/local/memcached/bin/memcached
make
make install
	如果出错,可执行:
	./configure --prefix=/usr/local/libmemcached/ --with-memcached=/usr/local/memcached/bin/memcached --disable-64bit CFLAGS="-O3 -march=i686"

cd memcached_functions_mysql-0.9
./configure --with-mysql=/usr/bin/mysql_config --libdir=/var/lib/mysql  --with-libmemcached=/usr/local/libmemcached
make
make install
	如果出错,可执行:
	ln -s /usr/local/libmemcached/lib/libmemcached.so /lib/libmemcached.so
	ln -s /usr/local/libmemcached/lib/libmemcached.so.5 /lib/libmemcached.so.5
	或者重装libmemcached,换一个较低的版本(例如:libmemcached-0.30.tar.gz)

5. 进行映射
mysql -hlocalhost -uroot -p
将UDFs加载到MySQL中:
	create function memc_servers_set returns int soname "libmemcached_functions_mysql.so";
	create function memc_set returns int soname "libmemcached_functions_mysql.so";
	create function memc_get returns string soname "libmemcached_functions_mysql.so";
	create function memc_delete returns string soname "libmemcached_functions_mysql.so";
	如果出错,可执行:
	ln -s /var/lib/mysql/libmemcached_functions_mysql.so /lib/libmemcached_functions_mysql.so

测试UDF是否安装成功:
	先添加Memcached,可以添加多台
	select memc_servers_set('127.0.0.1:11211');
	select memc_set('libing', 'roast');
	select memc_get('libing');

6. 进行测试
mysql -hlocalhost -uroot -p
	create table mctest(`key` int, `value` varchar(100));
	create trigger mysqlmmc before insert on mctest for each row set @tmp = memc_set(NEW.key, NEW.value);
	show triggers;

	select memc_servers_set('127.0.0.1:11211');

	insert into mctest values(9, 'roast');
	select memc_get('9');
	select * from mctest;

	telnet 127.0.0.1 11211
	get 9

7. 程序测试
<?
// 向数据库插入数据
$num = rand(1, 100);
$conn = mysql_connect("127.0.0.1", 'root', 'MySql') or die ('connect error : ' . mysql_error());
mysql_select_db('qianbao', $conn) or die ("Can't use qianbao : ". mysql_error());
$sql = "insert into mctest values(".$num.", 'this is a tset : ".$num."')";
echo "SQL : ".$sql."<br>";
$result = mysql_query($sql) or die ("query error : ". mysql_error());

// 从MC读数据
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$get_value = $memcache->get($num);
echo "MC : ".$get_value;
?>
07

copy to tmp table

分类:MySQL | 给我留言 |

登陆mysql数据库系统中,用show processlist分析查看当前运行状态。

mysql> show processlist;

+—–+————-+——————–+

| Id | User | Host | db | Command | Time| State | Info

+—–+————-+——————–+

|207|root |192.168.0.2:51621 |mytest | Sleep | 5 | | NULL

|208|root |192.168.0.2:51622 |mytest | Sleep | 5 | | NULL

|220|root |192.168.0.2:51676 |mytest |Query | 84 | Locked |

select name,culture,value,type from book where id=1

说明各列的含义和用途,
id列:一个标识,你要kill 一个语句的时候很有用。
user列: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。
host列:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户。
db列:显示这个进程目前连接的是哪个数据库。
command列:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。
time列:此这个状态持续的时间,单位是秒。
state列:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql 语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成。
info列:显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

这个命令中最关键的就是state列,mysql列出的状态主要有以下几种:

Checking table

正在检查数据表(这是自动的)。

Closing tables

正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。

Connect Out

复制从服务器正在连接主服务器

Copying to tmp table on disk

由于临时结果集大于 tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。

Creating tmp table

正在创建临时表以存放部分查询结果。

deleting from main table

服务器正在执行多表删除中的第一部分,刚删除第一个表。

deleting from reference tables

服务器正在执行多表删除中的第二部分,正在删除其他表的记录。

Flushing tables

正在执行 FLUSH TABLES,等待其他线程关闭数据表。

Killed

发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill 标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。

Locked

被其他查询锁住了。

Sending data

正在处理 SELECT 查询的记录,同时正在把结果发送给客户端。

Sorting for group

正在为 GROUP BY 做排序。

Sorting for order

正在为 ORDER BY 做排序。

Opening tables

这个过程应该会很快,除非受到其他因素的干扰。例如,在执 ALTER TABLE 或 LOCK TABLE 语句行完以前,数据表无法被其他线程打开。 正尝试打开一个表。

Removing duplicates

正在执行一个 SELECT DISTINCT 方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。

Reopen table

获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。

Repair by sorting

修复指令正在排序以创建索引。

Repair with keycache

修复指令正在利用索引缓存一个一个地创建新索引。它会比 Repair by sorting 慢些。

Searching rows for update

正在讲符合条件的记录找出来以备更新。它必须在 UPDATE 要修改相关的记录之前就完成了。

Sleeping

正在等待客户端发送新请求.

System lock

正在等待取得一个外部的系统锁。如果当前没有运行多个 mysqld 服务器同时请求同一个表,那么可以通过增加 –skip-external-locking参数来禁止外部系统锁。

Upgrading lock

INSERT DELAYED 正在尝试取得一个锁表以插入新记录。

Updating

正在搜索匹配的记录,并且修改它们。

User Lock

正在等待 GET_LOCK()。

Waiting for tables

该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以 下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE。

waiting for handler insert

INSERT DELAYED 已经处理完了所有待处理的插入操作,正在等待新的请求。

大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。还有其它的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着。

31

使用memcached用到的问题

1. magent只能绑定127.0.0.1,不能绑内网ip

2. 安装libmemcached时,32位和64位系统参数不一样

 

安装memcached扩展如下:

tar zxvf libmemcached-0.48.tar.gz
cd libmemcached-0.48
./configure --prefix=/usr/local/libmemcached --with-memcached
#./configure --prefix=/usr/local/libmemcached --with-memcached --disable-64bit CFLAGS="-O3 -march=i686"(32)
make
make install

cd ../

tar zxvf memcached-1.0.2.tgz
cd memcached-1.0.2
/usr/local/php/bin/phpize
./configure --prefix=/usr/local/phpmemcached --with-memcached -with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached
make
make install
29

整理国家+省份的js数据

var area = new Array(
new Array(‘阿尔巴尼亚’,'爱尔巴桑’,'迪勃拉’,'地拉那’,'都拉斯’,'发罗拉’,'费里’,'吉诺卡斯特’,'科尔察’,'库克斯’,'莱什’,'培拉特’,'斯库台’),
new Array(‘阿尔及利亚’,'阿德拉尔’,'阿尔及尔’,'艾因-德夫拉’,'艾因-蒂姆沈特’,'安纳巴’,'奥兰’,'巴特纳’,'贝贾亚’,'贝沙尔’,'贝伊德’,'比斯卡拉’,'布尔吉-布阿雷里吉’,'布利达’,'布迈德斯’,'布依拉’,'蒂巴扎’,'蒂齐乌祖’,'蒂斯姆西勒特’,'盖尔马’,'格尔达亚’,'罕西拉’,'赫利赞’,'吉杰尔’,'杰勒法’,'君士坦丁’,'拉格瓦特’,'马斯卡拉’,'梅德阿’,'密拉’,'莫斯塔加纳姆’,'姆西拉’,'纳阿马’,'塞蒂夫’,'赛伊达’,'斯基克达’,'苏克-阿赫拉斯’,'塔里夫’,'塔曼拉塞特’,'特贝萨’,'特累姆森’,'提亚雷特’,'廷杜夫’,'瓦德’,'乌尔格拉’,'乌姆布阿基’,'西迪-贝勒-阿贝斯’,'谢里夫’,'伊利齐’),
new Array(‘阿富汗’,'巴达赫尚’,'巴德吉斯’,'巴尔赫’,'巴格兰’,'巴米扬’,'戴孔迪’,'法拉’,'法利亚布’,'古尔’,'赫尔曼德’,'赫拉特’,'霍斯特’,'加兹尼’,'喀布尔’,'卡比萨’,'坎大哈’,'库纳尔’,'昆都士’,'拉格曼’,'洛加尔’,'尼姆鲁兹’,'努尔斯坦’,'帕尔旺’,'帕克蒂卡’,'帕克蒂亚’,'潘杰希尔’,'萨尔普勒’,'萨曼甘’,'塔哈尔’,'瓦尔达克’,'乌鲁兹甘’,'扎布尔’,'朱兹詹’,'楠格哈尔’),
new Array(‘阿拉斯加’,'阿拉斯加’),
new Array(‘阿鲁巴岛’,'阿鲁巴岛’),
new Array(‘阿曼’,'巴推奈地区’,'达希莱地区’,'东部地区’,'马斯喀特省’,'穆桑达姆省’,'内地地区’,'中部地区’,'佐法尔省’),
new Array(‘阿穆尔州’,'阿尔泰边疆区’,'阿尔泰共和国’,'奥伦堡州’,'巴什科尔托斯坦共和国’,'北奥塞梯-阿兰共和国’,'奔萨州’,'彼尔姆边疆区’,'滨海边疆区’,'布里亚特共和国’,'车臣共和国’,'车里雅宾斯克州’,'楚科奇自治区’,'楚瓦什共和国’,'达吉斯坦共和国’,'鄂木斯克州’,'哈巴罗夫斯克边疆区’,'哈卡斯共和国’,'汉特-曼西自治区’,'基洛夫州’,'卡巴尔达-巴尔卡尔共和国’,'卡拉恰伊-切尔克斯共和国’,'堪察加边疆区’,'克拉斯诺亚尔斯克边疆区’,'克麦罗沃州’,'库尔干州’,'马加丹州’,'马里埃尔共和国’,'摩尔多瓦共和国’,'秋明州’,'萨哈共和国’,'萨哈林州’,'萨拉托夫州’,'萨马拉州’,'斯塔夫罗波尔边疆区’,'斯维尔德洛夫斯克州’,'图瓦共和国’,'托木斯克州’,'外贝加尔边疆区’,'乌德穆尔特共和国’,'乌里扬诺夫斯克州’,'下诺夫哥罗德州’,'新西伯利亚州’,'亚马尔-涅涅茨自治区’,'印古什共和国’,'犹太自治州’,'鞑靼斯坦共和国’),
new Array(‘阿森松’,'阿森松’),
new Array(‘埃及’,'阿斯旺省’,'艾斯尤特省’,'北西奈省’,'贝尼苏韦夫省’,'布海拉省’,'代盖赫利耶省’,'东部省’,'杜姆亚特省’,'法尤姆省’,'盖卢比尤省’,'红海省’,'基纳省’,'吉萨省’,'开罗省’,'卢克索省’,'马特鲁省’,'曼努菲亚省’,'明亚省’,'南西奈省’,'塞得港省’,'苏伊士省’,'索哈杰省’,'西部省’,'谢赫村省’,'新河谷省’,'亚历山大省’,'伊斯梅利亚省’),
new Array(‘埃塞俄比亚’,'巴赫达尔巴赫达尔’,'德卜勒泽特’,'德雷达瓦德雷达瓦’,'德塞沃洛’,'贡德尔贡德尔’,'哈勒尔龠协尔盖’,'季马咖法’,'纳兹雷特纳兹雷特’,'亚的斯亚贝巴’),
new Array(‘爱尔兰’,'奥法利郡’,'北蒂珀雷里’,'邓莱里-拉斯当郡’,'蒂珀雷里郡’,'都柏林地区’,'都柏林郡级市’,'多尼戈尔郡’,'风峡湾/拉勒港郡级市’,'高威郡级市’,'格列维郡’,'加曼湖郡’,'坚尼教堂郡’,'凯里郡’,'科克郡’,'科克郡级市’,'克莱尔郡’,'拉勒港郡’,'莱伊什郡’,'朗格福德郡’,'劳斯郡’,'利默里克郡’,'利默里克郡级市’,'利特里姆郡’,'罗斯康芒郡’,'曼坦教堂郡’,'梅奥郡’,'米斯郡’,'南蒂珀雷里’,'南都柏林’,'山丘郡’,'斯莱戈郡’,'四湖郡’,'外侨郡’,'西米斯郡’,'橡树教堂郡’),
new Array(‘安哥拉’,'安哥拉’,'北宽扎’,'北隆达’,'本戈’,'本格拉’,'比耶’,'卡宾达’,'库内内’,'宽多库邦戈’,'罗安达’,'马兰热’,'莫希科’,'纳米贝’,'南宽扎’,'南隆达’,'万博’,'威拉’,'威热’,'扎伊尔’),
new Array(‘安圭拉岛’,'安圭拉岛’),
new Array(‘奥地利’,'布尔根兰’,'蒂罗尔’,'福拉尔贝格’,'克恩顿’,'萨尔茨堡’,'上奥地利’,'施蒂利亚’,'维也纳’,'下奥地利’),
new Array(‘澳大利亚’,'北领地’,'昆士兰’,'南澳大利亚’,'首都领地’,'塔斯马尼亚州’,'维多利亚’,'西澳大利亚州’,'新南威尔士’),
new Array(‘巴巴多斯’,'布里奇敦’),
new Array(‘巴哈马’,'拿骚’),
new Array(‘巴基斯坦’,'联邦管辖部落地区’,'联邦首都地区’,'旁遮普省’,'西北边境省’,'信德省’,'俾路支省’),
new Array(‘巴杰’,'本阿鲁斯’,'比塞大’,'吉比利’,'加贝斯’,'加夫萨’,'坚杜拜’,'马努巴’,'梅德宁’,'纳布勒’,'斯法克斯’,'苏塞’,'泰塔温’,'突尼斯’,'托泽尔’,'西迪布济德’,'锡勒亚奈’,'宰格万’),
new Array(‘巴拉圭’,'阿曼拜’,'阿耶斯总统省’,'巴拉瓜里’,'巴拉圭’,'博克龙’,'瓜伊拉’,'卡瓜苏’,'卡嫩迪尤’,'卡萨帕’,'康塞普西翁’,'科迪勒拉’,'米西奥内斯’,'涅恩布库’,'上巴拉圭’,'上巴拉那’,'圣佩德罗’,'亚松森特别区’,'伊塔普亚’,'中央’),
new Array(‘巴林’,'北方省’,'穆哈拉格省’,'南方省’,'首都省’,'中央省’),
new Array(‘巴拿马’,'Emberá’,'Kuna Yala’,'Kuna de Madungandí’,'Kuna de Wargandi’,'Ngobe Buglé’,'埃雷拉’,'巴拿马’,'巴拿马 Panamá’,'贝拉瓜斯’,'博卡斯·德尔托罗’,'达连’,'科克莱’,'科隆’,'洛斯·桑托斯’,'奇里基’),
new Array(‘巴西’,'阿克里’,'阿拉戈斯’,'阿马帕’,'巴拉那’,'巴伊亚’,'北里奥格兰德’,'伯南布哥’,'戈亚斯’,'朗多尼亚’,'里约热内卢’,'罗赖马’,'马拉尼昂’,'马托格罗索’,'米纳斯吉拉斯’,'南里奥格兰德’,'南马托格罗索’,'帕拉’,'帕拉伊巴’,'皮奥伊’,'塞阿拉’,'塞尔希培’,'圣埃斯皮里图’,'圣保罗’,'圣卡塔琳’,'托坎廷斯’,'亚马孙’),
new Array(‘保加利亚’,'贝尔尼克大区’,'布尔加斯大区’,'布拉格耶夫格勒大区’,'大特尔诺沃大区’,'多布里奇大区’,'弗拉察大区’,'哈斯科沃大区’,'加布洛沃大区’,'克尔扎里大区’,'拉兹格勒大区’,'老扎果拉大区’,'鲁塞大区’,'洛维奇大区’,'蒙塔纳大区’,'帕扎尔吉克大区’,'普列文大区’,'普罗夫迪夫大区’,'丘斯坦迪尔大区’,'舒门大区’,'斯利文大区’,'斯莫梁大区’,'索非亚大区’,'索非亚区’,'特尔戈维什特大区’,'瓦尔纳大区’,'维丁大区’,'西利斯特拉大区’,'亚姆博尔大区’),
new Array(‘贝宁’,'阿黎博里’,'阿塔科拉’,'滨海’,'博尔古’,'大西洋’,'东加’,'高原’,'库福’,'莫诺’,'丘陵’,'韦梅’,'祖’),
new Array(‘比利时’,'埃诺’,'安特卫普’,'北布拉邦’,'东弗兰德’,'列日’,'林堡’,'卢森堡’,'那慕尔’,'南布拉邦’,'西弗兰德’),
new Array(‘冰岛’,'阿库雷里’,'哈夫纳夫约杜尔’),
new Array(‘玻利维亚’,'奥鲁罗省’,'贝尼省’,'波托西省’,'科恰班巴省’,'拉巴斯省’,'潘多省’,'丘基萨卡省’,'圣克鲁斯省’,'塔里哈省’),
new Array(‘波多黎各’,'马亚圭斯’,'蓬塞’),
new Array(‘波兰’,'奥波莱省’,'滨海省’,'波德拉谢省’,'大波兰省’,'喀尔巴阡山省’,'库亚维-滨海省’,'卢布林省’,'卢布斯卡省’,'罗兹省’,'马佐夫舍省’,'圣十字省’,'瓦尔米亚-马祖里省’,'西滨海省’,'西里西亚省’,'下西里西亚省’,'小波兰省’),
new Array(‘博茨瓦纳’,'东北’,'东南’,'杭济’,'卡拉哈迪’,'卡特伦’,'昆嫩’,'南部’,'乔贝’,'西北’,'中部’),
new Array(‘伯利兹’,'伯利兹’,'伯利兹’,'卡约’,'科罗萨尔’,'斯坦港’,'托莱多’,'橘园’),
new Array(‘不丹’,'东方区’,'南方区’,'西方区’,'中央区’),
new Array(‘布基拉法索’,'布基拉法索’),
new Array(‘布隆迪’,'布班扎’,'布隆迪’,'布鲁里’,'布琼布拉城市’,'恩戈齐’,'基龙多’,'基特加’,'卡鲁济’,'卡扬扎’,'坎库佐’,'鲁塔纳’,'鲁伊吉’,'马坎巴’,'穆拉姆维亚’,'穆瓦洛’,'穆因加’,'锡比托凯’),
new Array(‘朝鲜’,'慈江道’,'黄海北道’,'黄海南道’,'江原道’,'开城特别市’,'两江道’,'罗先特别市’,'南浦特别市’,'平安北道’,'平安南道’,'平壤特别市’,'咸镜北道’,'咸镜南道’,'新义州特别行政区’),
new Array(‘赤道几内亚’,'安诺本’,'北比奥科’,'滨海’,'赤道几内亚’,'大陆’,'海岛’,'基埃-恩特姆’,'南比奥科’,'韦莱-恩萨斯’,'中南’),
new Array(‘丹麦’,'奥胡斯’,'北日德兰’,'博恩霍尔姆’,'法罗群岛’,'菲特烈堡’,'菲特烈堡’,'菲茵’,'哥本哈根’,'哥本哈根’,'格陵兰’,'里伯’,'灵克宾’,'罗斯基勒’,'南日德兰’,'斯多斯特姆’,'维堡’,'维厄勒’,'西希兰’,'直辖市’),
new Array(‘德国’,'巴登-符腾堡’,'巴伐利亚’,'柏林’,'北莱茵-威斯特法伦’,'勃兰登堡’,'不来梅’,'汉堡’,'黑森’,'莱茵兰-法耳茨’,'梅克伦堡-前波莫瑞’,'萨尔’,'萨克森’,'萨克森-安哈特’,'石勒苏益格-荷尔斯泰因’,'图林根’,'下萨克森’),
new Array(‘东萨摩亚’,'帕果帕果’),
new Array(‘多哥’,'滨海区’,'高原区’,'和草原区’,'卡拉区’,'中部区’),
new Array(‘俄罗斯’,'阿迪格共和国’,'阿尔汉格尔斯克州’,'阿斯特拉罕州’,'奥廖尔州’,'别尔哥罗德州’,'布良斯克州’,'伏尔加格勒州’,'弗拉基米尔州’,'加里宁格勒州’,'卡尔梅克共和国’,'卡累利阿共和国’,'卡卢加州’,'科米共和国’,'科斯特罗马州’,'克拉斯诺达尔边疆区’,'库尔斯克州’,'利佩茨克州’,'梁赞州’,'列宁格勒州’,'罗斯托夫州’,'摩尔曼斯克州’,'莫斯科市’,'莫斯科州’,'涅涅茨自治区’,'诺夫哥罗德州’,'普斯科夫州’,'圣彼得堡市’,'斯摩棱斯克州’,'坦波夫州’,'特维尔州’,'图拉州’,'沃罗涅日州’,'沃洛格达州’,'雅罗斯拉夫尔州’,'伊万诺沃州’),
new Array(‘厄瓜多尔’,'阿苏艾省’,'埃尔奥罗省’,'埃斯梅拉尔达斯省’,'奥雷利亚纳省’,'瓜亚斯省’,'加拉帕戈斯省’,'卡尔奇省’,'卡尼亚尔省’,'科托帕希省’,'洛哈省’,'洛斯里奥斯省’,'马纳比省’,'莫罗纳-圣地亚哥省’,'纳波省’,'帕斯塔萨省’,'皮钦查省’,'钦博拉索省’,'萨莫拉-钦奇佩省’,'苏昆毕奥斯省’,'通古拉瓦省’,'因巴布拉省’),
new Array(‘法国’,'阿尔萨斯’,'阿基坦’,'奥弗涅’,'北部-加莱海峡’,'勃艮第’,'布列塔尼’,'法兰西岛’,'弗朗什-孔泰’,'瓜德鲁普’,'科西嘉’,'朗克多克-鲁西永’,'利穆赞’,'卢瓦尔’,'罗讷-阿尔卑斯’,'洛林’,'马提尼克’,'南部-比利牛斯’,'皮卡第’,'普罗旺斯-阿尔卑斯-蓝色海岸’,'普瓦图-夏朗德’,'上诺曼底’,'下诺曼底’,'香槟-阿登’,'中部’),
new Array(‘法罗群岛’,'托尔斯港’),
new Array(‘法属圭亚那’,'圣洛朗’,'圣乔治’),
new Array(‘菲律宾’,'北棉兰老区’,'比科尔区’,'东米沙鄢’,'国家首都区’,'甲拉巴松区’,'卡加延河谷区’,'卡拉加区’,'民马罗巴区’,'南棉兰老区’,'西米沙鄢区’,'西棉兰老区’,'伊罗戈斯区’,'中米沙鄢区’,'中棉兰老区’,'中央吕宋区’),
new Array(‘芬兰’,'奥兰府’,'奥卢省’,'东芬兰省’,'拉普兰省’,'南芬兰省’,'西芬兰省’),
new Array(‘佛得角’,'博阿维斯塔市’,'布拉瓦市’,'大里贝拉市’,'大里贝拉市’,'马尤市’,'明德罗市’,'莫斯特罗市’,'帕乌尔市’,'普拉亚市’,'萨尔市’,'圣多明戈市’,'圣菲利佩市’,'圣克鲁斯市’,'圣洛伦索多斯奥尔冈市’,'圣米戈尔市’,'圣尼古劳市’,'圣萨尔瓦多多蒙多市’,'圣塔卡塔利那市’,'圣塔卡塔利那市’,'塔拉法尔市’,'塔拉法尔市’,'新港市’),
new Array(‘福克兰群岛’,'福克兰群岛’),
new Array(‘冈比亚’,'班珠尔市’,'北岸区’,'卡尼芬市’,'麦卡锡岛区’,'上河区’,'西方区’,'下河区’),
new Array(‘刚果’,'波尔’,'布昂扎’,'高原’,'奎卢’,'雷库木’,'利库阿拉’,'尼阿里’,'盆地’,'桑加’,'西盆地’),
new Array(‘哥伦比亚’,'阿劳卡省’,'安蒂奥基亚省’,'北桑坦德省’,'比查达省’,'玻利瓦尔省’,'波哥大’,'博亚卡省’,'大西洋省’,'瓜维亚雷省’,'瓜希拉省’,'瓜伊尼亚省’,'金迪奥省’,'卡尔达斯省’,'卡克塔省’,'卡萨纳雷省’,'考卡山谷省’,'考卡省’,'科尔多瓦省’,'昆迪纳马卡省’,'里萨拉尔达省’,'马格达莱纳省’,'梅塔省’,'纳里尼奥省’,'普图马约省’,'乔科省’,'塞萨尔省’,'桑坦德省’,'圣安德列斯-普罗维登西亚省’,'苏克雷省’,'托利马省’,'沃佩斯省’,'乌伊拉省’,'亚马孙省’),
new Array(‘哥斯达黎加’,'阿拉胡埃拉’,'埃雷迪亚’,'瓜纳卡斯特’,'卡塔戈’,'利蒙’,'彭塔雷纳斯’,'圣何塞’),
new Array(‘格陵兰岛’,'努克’),
new Array(‘古巴’,'阿尔特米萨’,'比那尔德里奥’,'哈瓦那省’,'马坦萨斯’,'马亚贝克’,'西恩富戈斯’),
new Array(‘关岛’,'关岛’),
new Array(‘圭亚那’,'乔治敦’),
new Array(‘海地’,'戈纳伊夫’,'和平港’),
new Array(‘韩国’,'大邱广域市’,'大田广域市’,'釜山广域市’,'光州广域市’,'济州特别自治道’,'江原道’,'京畿道’,'庆尚北道’,'庆尚南道’,'全罗北道’,'全罗南道’,'仁川广域市’,'世宗特别自治市’,'首尔特别市’,'蔚山广域市’,'忠清北道’,'忠清南道’),
new Array(‘荷兰’,'北布拉邦’,'北荷兰’,'德伦特’,'弗雷佛兰’,'弗里斯兰’,'格尔德兰’,'格罗宁根’,'林堡’,'南荷兰’,'欧弗艾塞尔’,'乌特勒支’,'西兰’),
new Array(‘洪都拉斯’,'阿特兰蒂达省’,'埃尔帕拉伊索省’,'奥科特佩克省’,'奥兰乔省’,'弗朗西斯科-莫拉桑省’,'格拉西亚斯-阿迪奥斯省’,'海湾群岛’,'科尔特斯省’,'科隆省’,'科马亚瓜’,'科潘省’,'拉巴斯省’,'伦皮拉省’,'乔卢特卡省’,'山谷’,'圣巴巴拉省’,'因蒂布卡省’,'约罗省’),
new Array(‘基里巴斯’,'塔拉瓦’),
new Array(‘吉布提’,'阿里萨比地区’,'奥博克地区’,'迪基尔地区’,'和阿尔塔地区’,'吉布提市’,'塔朱拉地区’),
new Array(‘几内亚’,'贝拉’,'博法’,'博凯’,'达波拉’,'达拉巴’,'丁基拉耶’,'杜布雷卡’,'杜盖’,'恩泽雷科雷’,'法拉纳’,'弗雷卡里亚’,'弗里亚’,'高瓦尔’,'吉西杜古’,'金迪亚’,'金迪亚’,'凯鲁阿内’,'科纳克里’,'科亚’,'孔达拉’,'库比亚’,'库鲁萨’,'拉贝’,'莱鲁马’,'洛拉’,'玛木’,'马利’,'马桑达’,'芒加纳’,'皮塔’,'特里梅莱’,'西基里’,'尤木’),
new Array(‘几内亚比绍’,'北部省’,'东部省’,'南部省’),
new Array(‘加拿大’,'阿尔伯塔’,'爱德华王子岛’,'安大略’,'魁北克’,'拉布拉多’,'曼尼托吧’,'纽芬兰’,'努勒维特’,'萨斯喀彻温’,'新布伦瑞克’,'新斯科舍’,'英属哥伦比亚’,'育空’),
new Array(‘加纳’,'阿散蒂省’,'北部省’,'布朗-阿哈福省’,'大阿克拉省’,'东部省’,'上东部省’,'上西部省’,'沃尔特省’,'西部省’,'中部省’),
new Array(‘加蓬’,'奥果韦-伊温多’,'奥果韦—洛洛’,'滨海奥果韦’,'恩古涅’,'河口’,'尼扬加’,'上奥果韦’,'沃勒-恩特姆’,'中奥果韦’),
new Array(‘柬埔寨’,'金边’),
new Array(‘津巴布韦’,'北马塔贝莱兰’,'东马绍纳兰’,'马尼卡’,'马旬戈’,'南马塔贝莱兰’,'西马绍纳兰’,'中部’,'中马绍纳兰’),
new Array(‘喀麦隆’,'阿达马瓦省’,'北部省’,'滨海省’,'东部省’,'极北省’,'南部省’,'西北省’,'西部省’,'西南省’,'中部省’),
new Array(‘卡塔尔’,'北部区’,'多哈’,'古韦里耶’,'豪尔’,'杰里扬拜特奈’,'赖扬’,'梅萨伊德’,'沃克拉’,'乌姆锡拉勒’,'朱迈利耶’),
new Array(‘科科斯岛’,'科科斯岛’),
new Array(‘科克群岛’,'拉罗通阿’),
new Array(‘科摩罗’,'恩加济贾(大科摩罗)’,'恩佐瓦尼(昂儒昂)’,'科摩罗’,'莫伊利(莫埃利)’),
new Array(‘科特迪瓦’,'阿本古鲁’,'阿比让’,'阿博维尔’,'阿博伊索’,'阿迪阿凯’,'阿莱贝’,'阿尼比莱库’,'阿佐佩’,'巴芬’,'邦达马河谷’,'邦杜库’,'邦古阿努’,'贝乌米’,'本贾利’,'比昂库马’,'博康达’,'布纳’,'布瓦夫莱’,'布瓦凯’,'达巴卡拉’,'达布’,'达纳内’,'达乌克罗’,'大巴桑’,'大拉乌’,'迪埃奎’,'迪沃’,'蒂亚萨莱’,'丁博克罗’,'恩济-科莫埃’,'费尔凯塞杜古’,'湖泊’,'吉格洛’,'加尼奥阿’,'科霍戈’,'科特迪瓦’,'拉科塔’,'马拉韦’,'芒’,'芒科诺’,'姆巴亚克罗’,'南邦达马’,'南科莫埃’,'萨卡苏’,'萨桑德拉’,'萨桑德拉’,'萨瓦纳’,'塞盖拉’,'山地’,'圣佩德罗’,'苏布雷’,'塔布’,'坦达’,'腾格雷拉’,'铁比苏’,'图巴’,'图莫迪’,'瓦武阿’,'沃罗杜古’,'乌梅’,'下萨桑德拉’,'泻湖’,'辛夫拉’,'雅克维尔’,'亚穆苏克罗’,'伊西亚’,'赞赞’,'中卡瓦利’,'中科莫埃’),
new Array(‘科威特’,'艾哈迈迪省’,'法尔瓦尼亚省’,'哈瓦里省’,'贾哈拉省’,'穆巴拉克·卡比尔省’,'首都省’),
new Array(‘肯尼亚’,'东北省’,'东部省’,'海岸省’,'裂谷省’,'奈洛比省’,'尼扬扎省’,'西部省’,'中部省’),
new Array(‘莱索托’,'伯里亚’,'布塔布泰’,'古廷’,'加查斯内克’,'莱里贝’,'莱索托’,'马费滕’,'马塞卢’,'莫哈莱斯胡克’,'莫霍特隆’,'塔巴采卡’),
new Array(‘老挝’,'阿速坡’,'波里坎赛’,'博乔’,'川圹’,'丰沙里’,'甘蒙’,'华潘’,'琅勃拉邦’,'琅南塔’,'老挝’,'赛宋本行政特区’,'色贡’,'沙拉湾’,'沙湾拿吉’,'沙耶武里’,'万象’,'万象直辖市’,'乌多姆赛’,'占巴塞’),
new Array(‘黎巴嫩’,'贝鲁特’),
new Array(‘利比里亚’,'巴波卢’,'邦’,'博米’,'大巴萨’,'大吉德’,'大角山’,'大克鲁’,'吉河’,'里弗塞斯’,'利比里亚’,'洛法’,'马吉比’,'马里兰’,'蒙特塞拉多’,'宁巴’,'锡诺’),
new Array(‘利比亚’,'巴延奥卢’,'的黎波里’,'绿山’,'沙拉拉’,'苏尔特湾’,'五点’,'西山’),
new Array(‘列支敦士登’,'瓦杜兹’),
new Array(‘留尼汪岛’,'圣保罗’,'圣伯努瓦’,'圣但尼’,'圣皮埃尔’),
new Array(‘卢森堡’,'迪基希’,'格雷文马赫’),
new Array(‘卢旺达’,'比温巴’,'布塔雷’,'基本古’,'基布耶’,'基加利-恩加利’,'基加利市’,'吉孔戈罗’,'吉塞尼’,'吉塔拉马’,'卢旺达’,'鲁亨盖里’,'尚古古’,'乌姆塔拉’),
new Array(‘罗马尼亚’,'阿尔巴’,'阿尔杰什’,'阿拉德’,'奥尔特’,'巴克乌’,'比霍尔’,'比斯特里察-诺色乌德’,'博托沙尼’,'布拉索夫’,'布勒伊拉’,'布泽乌’,'登博维察’,'蒂米什’,'多尔日’,'弗朗恰’,'戈尔日’,'哈尔吉塔’,'洪尼多阿拉’,'加拉茨’,'卡拉什-塞维林’,'康斯坦察’,'科瓦斯纳’,'克勒拉希’,'克鲁日’,'马拉穆列什’,'梅赫丁茨’,'穆列什’,'尼亚姆茨’,'普拉霍瓦’,'萨图-马雷’,'色拉日’,'苏恰瓦’,'特列奥尔曼’,'图尔恰’,'瓦斯鲁伊’,'维尔恰’,'锡比乌’,'雅洛米察’,'雅西’,'伊尔福夫’,'朱尔朱’),
new Array(‘马达加斯加’,'安齐拉贝’,'安塔拉哈’,'安塔那那利佛’,'迭戈苏瓦雷斯’,'多几堡’,'菲亚纳兰楚阿’,'马鲁武艾’,'马纳卡拉’,'马南扎里’,'马任加’,'穆龙达瓦’,'圣玛丽角’,'图阿马西纳’,'图莱亚尔’),
new Array(‘马耳他’,'瓦莱塔’),
new Array(‘马尔代夫’,'阿杜’,'北阿里’,'北蒂拉杜马蒂’,'北马洛斯马杜卢’,'北米拉杜马杜卢’,'北尼兰杜’,'北苏瓦迪瓦’,'法迪福卢’,'费利杜’,'福阿穆拉库’,'哈杜马蒂’,'科卢马杜卢’,'玛律’,'穆拉库’,'南阿里’,'南蒂拉杜马蒂’,'南马洛斯马杜卢’,'南米拉杜马杜卢’,'南尼兰杜’,'南苏瓦迪瓦’),
new Array(‘马拉维’,'北部’,'南部区’,'中部’),
new Array(‘马来西亚’,'玻璃市’,'布特拉再也’,'登嘉楼’,'吉打’,'吉兰丹’,'吉隆坡’,'马六甲’,'纳闽’,'彭亨’,'霹雳’,'柔佛’,'森美兰’,'砂拉越’,'沙巴’,'雪兰莪’,'槟城’),
new Array(‘马提尼克’,'马提尼克’),
new Array(‘毛里求斯’,'阿加莱加群岛’,'大港’,'弗拉克’,'黑河’,'里维耶尔-迪朗帕’,'路易港’,'罗德里格斯’,'毛里求斯’,'毛里求斯岛’,'莫卡’,'庞普勒穆斯’,'萨凡纳’,'圣布兰登群岛’,'威廉平原’),
new Array(‘毛里塔尼亚’,'阿德拉尔’,'阿萨巴’,'布拉克纳’,'达赫莱特-努瓦迪布’,'东霍德’,'戈尔戈尔’,'吉迪马卡’,'努瓦克肖特’,'塔岗’,'特拉扎’,'提里斯-宰穆尔’,'西霍德’,'因奇利’),
new Array(‘美国’,'阿肯色州’,'阿拉斯加州’,'艾奥瓦州’,'爱达荷州’,'北达科他州’,'北卡罗来纳州’,'宾夕法尼亚州’,'德克萨斯州’,'俄亥俄州’,'俄克拉何马州’,'俄勒冈州’,'佛罗里达州’,'佛蒙特州’,'弗吉尼亚州’,'华盛顿州’,'怀俄明州’,'加利福尼亚州’,'堪萨斯州’,'康涅狄格州’,'科罗拉多州’,'肯塔基州’,'路易斯安那州’,'罗得岛州’,'马里兰州’,'马萨诸塞州’,'蒙大拿州’,'密苏里州’,'密西西比州’,'密歇根州’,'缅因州’,'明尼苏达州’,'南达科他州’,'南卡罗来纳州’,'内布拉斯加州’,'内华达州’,'纽约州’,'特拉华州’,'田纳西州’,'威斯康星州’,'西弗吉尼亚州’,'夏威夷州’,'新罕布什尔州’,'新墨西哥州’,'新泽西州’,'亚拉巴马州’,'亚利桑那州’,'伊利诺伊州’,'印第安纳州’,'犹他州’,'佐治亚州’),
new Array(‘蒙古’,'巴彦洪格尔省’,'巴彦乌勒盖省’,'布尔干省’,'达尔汗乌勒省’,'东方省’,'东戈壁省’,'鄂尔浑省’,'戈壁阿尔泰省’,'戈壁苏木贝尔省’,'后杭爱省’,'科布多省’,'肯特省’,'库苏古尔省’,'南戈壁省’,'前杭爱省’,'色楞格省’,'苏赫巴托尔省’,'乌布苏省’,'扎布汗省’,'中戈壁省’,'中央省’),
new Array(‘孟加拉国’,'巴里萨尔’,'吉大港’,'库尔纳’,'拉吉沙希’,'锡莱特’),
new Array(‘秘鲁’,'阿雷基帕省’,'阿普里马克省’,'阿亚库乔省’,'安卡什省’,'胡宁省’,'拉利伯塔德省’,'兰巴耶克省’,'利马省’,'洛雷托省’,'马德雷-德迪奥斯省’,'莫克瓜省’,'帕斯科省’,'皮乌拉省’,'普诺省’,'圣马丁省’,'塔克纳省’,'通贝斯省’,'瓦努科省’,'万卡维利卡省’,'乌卡亚利省’,'亚马孙省’,'伊卡省’),
new Array(‘缅甸’,'勃固省’,'掸邦’,'德林达依省’,'克伦邦’,'克钦邦’,'克耶邦’,'马圭省’,'曼德勒省’,'孟邦’,'内比都联邦特区’,'钦邦’,'若开邦’,'实皆省’,'仰光省’,'伊洛瓦底省’),
new Array(‘摩洛哥’,'阿加迪尔’,'阿尤恩-布支杜尔’,'布勒曼’,'达赫拉’,'大卡萨布兰卡’,'丹吉尔’,'杜卡拉-阿卜达’,'盖勒敏’,'拉巴特-萨累-宰穆尔’,'马拉喀什-坦西夫特-豪兹’,'梅克内斯-塔菲拉勒特’,'沙维雅-瓦拉迪格’,'舍拉拉德’,'塔德莱-艾济拉勒’,'塔鲁丹特’,'塔塔’,'坦坦’,'陶纳特’,'提兹尼特’,'瓦尔扎扎特’),
new Array(‘莫桑比克’,'德尔加杜角省’,'加扎省’,'马尼卡省’,'马普托’,'马普托省’,'尼亚萨省’,'索法拉省’,'太特省’,'伊巴扬巴内省’,'赞比西省’,'楠普拉省’),
new Array(‘墨西哥’,'阿瓜斯卡连特斯’,'北下加利福尼亚’,'波托西’,'杜兰戈’,'格雷罗’,'瓜纳华托’,'哈利斯科’,'金塔纳罗奥’,'坎佩切’,'科阿韦拉’,'科利马’,'克雷塔罗’,'克鲁斯’,'联邦区’,'米却肯’,'莫雷洛斯’,'墨西哥城’,'纳亚里特’,'南下加利福尼亚’,'普埃布拉’,'奇瓦瓦’,'恰帕斯州’,'萨卡特卡斯’,'圣路易斯’,'索诺拉’,'塔巴斯科’,'塔毛利帕斯’,'特拉斯卡拉’,'瓦哈卡’,'韦拉’,'锡那罗亚’,'新莱昂’,'伊达尔戈’,'尤卡坦半岛’),
new Array(‘纳米比亚’,'奥卡汉贾’,'奥马鲁鲁’,'奥奇瓦龙戈’,'奥乔’,'贝塔尼恩’,'戈巴比斯’,'赫鲁特方丹’,'基特曼斯胡普’,'卡奥科兰’,'卡拉斯堡’,'卡里比布’,'马林塔尔’,'翁丹瓜’),
new Array(‘南非’,'北方’,'北开普’,'东开普’,'豪登’,'夸祖鲁/纳塔尔’,'姆普马兰加’,'西北’,'西开普’,'自由州’),
new Array(‘南斯拉夫’,'贝尔格莱德’),
new Array(‘尼泊尔’,'加德满都’),
new Array(‘尼加拉瓜’,'埃斯特利省’,'博阿科省’,'格拉纳达省’,'卡拉索省和里瓦斯省’,'莱昂省’,'马德里斯省’,'马那瓜省’,'马萨亚省’,'马塔加尔帕省’,'奇南德加省’,'琼塔莱斯省’,'塞拉亚省’,'塞拉亚省北部地区’,'塞拉亚省南部地区’,'希诺特加省’,'辖圣胡安河省’,'新塞戈维亚省’),
new Array(‘尼日尔’,'阿加德兹’,'迪法’,'蒂拉贝里’,'多索’,'津德尔’,'马拉迪’,'尼亚美’,'塔瓦’),
new Array(‘尼日利亚’,'阿比亚’,'阿达玛瓦’,'阿夸伊博姆’,'阿南布拉’,'埃邦伊’,'埃多’,'埃基蒂’,'埃努古’,'奥贡’,'奥逊’,'奥约’,'巴耶尔萨’,'包奇’,'贝努埃’,'博尔诺’,'高原’,'贡贝’,'河流’,'吉加瓦’,'卡杜纳’,'卡诺’,'卡齐纳’,'凯比’,'科吉’,'夸拉’,'拉各斯’,'联邦首都区’,'纳萨拉瓦’,'尼日尔’,'尼日利亚’,'三角州’,'十字河流’,'索科托’,'塔拉巴’,'翁多’,'伊莫’,'约比’,'赞法拉’),
new Array(‘纽埃岛’,'纽埃岛’),
new Array(‘挪威’,'阿克什胡斯’,'奥普兰’,'奥斯陆’,'卑尔根’,'北特伦德拉格’,'布斯克吕’,'东阿格德尔’,'东福尔’,'芬马克’,'海德马克’,'霍达兰’,'罗加兰’,'默勒-鲁姆斯达尔’,'南特伦德拉格’,'诺尔兰’,'松恩-菲尤拉讷’,'泰勒马克’,'特罗姆斯’,'西阿格德尔’,'西福尔’,'希望岛’),
new Array(‘诺福克岛’,'诺福克岛’),
new Array(‘葡萄牙’,'埃武拉区’,'贝雅区’,'波尔图区’,'波塔莱格雷区’,'布拉干萨区’,'布拉加区’,'布朗库堡区’,'法鲁区’,'瓜达区’,'科英布拉区’,'莱里亚区’,'雷阿尔城区’,'里斯本区’,'马德拉群岛’,'塞图巴尔区’,'圣塔伦区’,'维塞乌区’,'维亚纳堡区’,'亚速尔群岛’,'亚威罗区’),
new Array(‘普林西比’,'普林西比’),
new Array(‘日本’,'埼玉县’,'栃木县’,'爱知县’,'爱媛县’,'兵库县’,'长崎县’,'长野县’,'冲绳县’,'茨城县’,'大分县’,'大阪府’,'岛根县’,'德岛县’,'东京都’,'福岛县’,'福冈县’,'福井县’,'富山县’,'冈山县’,'高知县’,'宫城县’,'宫崎县’,'广岛县’,'和歌山县’,'京都府’,'静冈县’,'鹿儿岛县’,'奈良县’,'鸟取县’,'千叶县’,'青森县’,'秋田县’,'群马县’,'三重县’,'山口’,'山梨县’,'山形县’,'神奈川县’,'石川县’,'香川县’,'新潟县’,'熊本县’,'岩手县’,'滋贺县’,'佐贺县’,'岐阜县’),
new Array(‘瑞典’,'北博滕省’,'布莱金厄省’,'达拉纳省’,'东约特兰省’,'厄勒布鲁省’,'哥特兰省’,'哈兰省’,'卡尔马省’,'克鲁努贝里省’,'南曼兰省’,'斯德哥尔摩省’,'斯科讷省’,'韦姆兰省’,'乌普萨拉省’,'西博滕省’,'西曼兰省’,'西诺尔兰省’,'西约塔兰省’,'延雪平省’,'耶夫勒堡省’,'耶姆特兰省’),
new Array(‘瑞士’,'阿尔高州’,'巴塞尔城市半州’,'巴塞尔乡村半州’,'伯尔尼州’,'楚格州’,'弗里堡州’,'格拉鲁斯州’,'格劳宾登州’,'卢塞恩州’,'纳沙泰尔州’,'内阿彭策尔州’,'日内瓦州’,'汝拉州’,'沙夫豪森州’,'上瓦尔登州’,'圣加仑州’,'施维茨州’,'苏黎世州’,'索洛图恩州’,'提契诺州’,'图尔高州’,'瓦莱州’,'外阿彭策尔州’,'沃州’,'乌里州’,'下瓦尔登州’),
new Array(‘萨尔瓦多’,'阿瓦查潘’,'查拉特南戈’,'卡瓦尼亚斯’,'库斯卡特兰’,'拉巴斯’,'拉利伯塔德’,'拉乌尼翁’,'莫拉桑’,'圣安娜’,'圣米格尔’,'圣萨尔瓦多’,'圣维森特’,'松索纳特’,'乌苏卢坦’),
new Array(‘萨摩亚’,'阿纳’,'阿图阿’,'艾加伊勒泰’,'法塞莱莱阿加’,'加盖福毛加’,'加加埃毛加’,'帕劳利’,'萨图帕伊泰阿’,'图阿马萨加’,'瓦奥福诺蒂’,'韦西加诺’),
new Array(‘塞拉利昂’,'邦巴利’,'邦特’,'北部’,'博城’,'东部’,'弗里敦’,'郊区’,'凯拉洪’,'凯内马’,'坎比亚’,'科诺’,'科伊纳杜古’,'洛科港’,'莫扬巴’,'南部’,'普杰洪’,'塞拉里昂’,'通科利利’,'西部区’,'歇尔布罗镇区’),
new Array(‘塞内加尔’,'邦贝’,'达喀尔’,'法蒂克’,'芳久涅’,'盖迪亚瓦耶’,'戈萨’,'久尔贝勒’,'久尔贝勒’,'卡夫林’,'卡内’,'凯贝梅尔’,'考拉克’,'考拉克’,'科尔达’,'拉内鲁弗洛’,'林盖尔’,'卢加’,'卢加’,'鲁菲克’,'马塔姆’,'姆巴克’,'尼奥罗’,'皮金’,'塞久’,'韦兰加拉’),
new Array(‘塞浦路斯’,'法马古斯塔’,'拉纳卡’,'利马索尔’,'尼科西亚’,'帕佛斯’),
new Array(‘塞舌尔’,'维多利亚’),
new Array(‘沙特阿拉伯’,'阿西尔地区’,'巴哈地区’,'北部边疆地区’,'东部地区’,'哈伊勒地区’,'季赞地区’,'卡西姆地区’,'利雅得地区’,'麦地那地区’,'麦加地区’,'纳季兰地区’,'塔布克地区’,'朱夫地区’),
new Array(‘圣诞岛’,'圣诞岛’),
new Array(‘圣多美’,'圣多美’),
new Array(‘圣赫勒拿’,'詹姆斯敦’),
new Array(‘圣卢西亚’,'卡斯特里’),
new Array(‘圣路易’,'巴克尔’,'比尼奥纳’,'波多尔’,'达加纳’,'蒂瓦瓦内’,'济金绍尔’,'济金绍尔’,'捷斯’,'捷斯’,'凯杜古’,'姆布尔’,'塞内加尔’,'坦巴昆达’,'坦巴昆达’,'乌苏耶’),
new Array(‘圣马力诺’,'阿夸维瓦’,'博尔戈-马吉欧雷’,'多玛尼亚诺’,'法尔齐亚诺’,'基埃萨努欧瓦’,'科里阿尼诺’,'蒙泰吉阿迪诺’,'塞拉瓦莱’,'圣马力诺’),
new Array(‘斯里兰卡’,'北方省’,'北中央省’,'东方省’,'南方省’,'萨巴拉加穆瓦省’,'乌瓦省’,'西北省’,'西方省’,'中央省’),
new Array(‘斯威士兰’,'卢邦博’,'曼齐尼’,'斯威士兰’,'希塞卢韦尼’),
new Array(‘苏丹’,'白尼罗’,'北部’,'北达尔富尔’,'北科尔多凡’,'红海’,'加达里夫’,'杰济拉’,'喀土穆’,'卡萨拉’,'南达尔富尔’,'南科尔多凡’,'尼罗’,'青尼罗’,'森纳尔’,'西达尔富尔’,'西科尔多凡’),
new Array(‘苏里南’,'巴拉’,'勃洛克彭都’,'科罗尼’,'科摩维纳’,'马罗维纳’,'尼克里’,'萨拉马卡’,'瓦尼卡’,'西帕里维尼’),
new Array(‘索马里’,'阿瓦达勒’,'巴科尔’,'巴里’,'拜多阿’,'贝纳迪尔’,'盖多’,'哈尔格萨’,'加尔古杜德’,'穆杜格’,'努加尔’,'萨纳格’,'苏勒’,'托格代尔’,'希兰’,'下谢贝利’,'下朱巴’,'中谢贝利’,'中朱巴’),
new Array(‘所罗门群岛’,'瓜达尔卡纳尔’,'霍尼亚拉’,'拉纳尔和贝罗纳’,'马基拉’,'马莱塔’,'乔伊索’,'泰莫图’,'西部’,'伊萨贝尔’,'中部群岛’),
new Array(‘泰国’,'安纳乍能府’,'巴吞他尼府’,'巴真府’,'班武里府’,'北碧府’,'北标府’,'北柳府’,'北榄坡府’,'碧差汶府’,'猜纳府’,'猜也贲府’,'程逸府’,'春武里府’,'大城府’,'东北地区’,'佛统府’,'佛丕府’,'甘烹碧府’,'呵叻府’,'横逸府’,'红统府’,'华富里府’,'加拉信府’,'尖竹汶府’,'坤敬府’,'坤西育府’,'来兴府’,'廊开府’,'廊磨喃蒲府’,'黎府’,'龙仔厝府’,'罗勇府’,'吗哈沙拉堪府’,'曼谷’,'莫肯府’,'莫拉限府’,'那空拍侬府’,'南邦府’,'南奔府’,'暖武里府’,'帕府’,'拍天府’,'彭世洛府’,'披集府’,'清莱府’,'清迈府’,'色军府’,'沙缴府’,'四色菊府’,'素可泰府’,'素攀府’,'素辇府’,'桐艾府’,'乌泰他尼府’,'乌汶府’,'武里喃府’,'信武里府’,'夜功府’,'益梭通府’,'叻丕府” ”北榄府’,'湄宏顺府’,'楠府’),
new Array(‘坦桑尼亚’,'阿鲁沙’,'奔巴北’,'奔巴南’,'滨海’,'达累斯萨拉姆’,'多多马’,'基戈马’,'卡盖拉’,'林迪’,'鲁夸’,'鲁伍马’,'马腊’,'曼亚拉’,'莫洛戈罗’,'姆贝亚’,'姆特瓦拉’,'姆万扎’,'乞力马扎罗’,'桑给巴尔’,'桑给巴尔北’,'桑给巴尔南’,'桑给巴尔市和西’,'塔波拉’,'坦噶’,'坦桑尼亚’,'欣延加’,'辛吉达’,'伊林加’),
new Array(‘汤加’,'努库阿洛法’),
new Array(‘突尼斯’,'艾尔亚奈’,'卡夫’,'卡塞林’,'凯鲁万’,'马赫迪耶’,'莫纳斯提尔’),
new Array(‘图瓦卢’,'富纳富提’),
new Array(‘土耳其’,'Aeolis’,'Akdeniz kiyisi’,'Bithynia’,'Cappadocia’,'Caria’,'Cataonia’,'Cilicia’,'Commagene’,'Dogu Anadolu’,'Güneydogu Anadolu’,'Hirfanli Baraji’,'Hurri’,'Ic Anadolu’,'Isauria’,'Karadeniz kiyisi’,'Keban Golü’,'Kemer Baraji’,'Lycaonia’,'Lycia’,'Mysia’,'Oriens’,'Paphlagonia’,'Phrygia’,'Pisidia’,'Pontos’,'Pontus’,'Sariyar Baraji’,'Troas’,'爱琴海地区’,'东色雷斯’,'加拉太’,'吕底亚’,'马尔马拉’,'小亚细亚’,'伊兹梅尔省’,'以弗所古城’),
new Array(‘瓦努阿图’,'卢甘维尔市’,'马朗巴’,'彭纳马’,'桑马’,'托尔巴’,'维拉港’,'谢法和塔菲亚省’),
new Array(‘威克岛’,'威克岛’),
new Array(‘危地马拉’,'埃尔普罗格雷索’,'埃斯昆特拉’,'哈拉帕’,'胡蒂亚帕’,'基切’,'克萨尔特南戈’,'雷塔卢莱乌’,'佩滕’,'奇基穆拉’,'奇马尔特南戈’,'萨卡帕’,'萨卡特佩克斯’,'上韦拉帕斯’,'圣罗莎’,'圣马科斯’,'苏奇特佩克斯’,'索洛拉’,'托托尼卡潘’,'危地马拉’,'韦韦特南戈’,'下韦拉帕斯’,'伊萨瓦尔’),
new Array(‘维尔京群岛’,'维尔京群岛’),
new Array(‘维亚克拉拉’,'奥尔金’,'格拉玛’,'古巴首都哈瓦那’,'关塔那摩’,'拉斯图纳斯’,'青年岛特区’,'圣地亚哥’,'圣斯皮里图斯’,'谢戈德阿维拉”卡马圭’),
new Array(‘委内瑞拉’,'阿拉瓜’,'阿马库罗三角洲’,'阿普雷’,'安索阿特吉’,'巴尔加斯’,'巴里纳斯’,'玻利瓦尔’,'波图格萨’,'法尔孔’,'瓜里科’,'加拉加斯’,'卡拉沃沃’,'科赫德斯’,'拉腊’,'梅里达’,'米兰达’,'莫纳加斯’,'苏克雷’,'苏利亚’,'塔奇拉’,'特鲁希略’,'新埃斯帕塔’,'亚拉奎’,'亚马孙’),
new Array(‘文莱’,'淡布隆’,'都东’,'马来奕’,'文莱-穆阿拉’),
new Array(‘乌干达’,'Abim’,'Amolatar’,'Amuria’,'Amuru’,'Budaka’,'Bukwa’,'Bulisa’,'Busiki’,'Butaleja’,'Dokolo’,'Ibanda’,'Kaabong’,'Kabingo’,'Kaliro’,'Kiruhura’,'Koboko’,'Manafwa’,'Maracha’,'Mityana’,'Nakaseke’,'Oyam’,'阿鲁阿’,'阿帕克’,'阿朱马尼’,'本迪布焦’,'布吉里’,'布西亚’,'布谢尼’,'恩通加莫’,'古卢’,'霍伊马’,'基巴莱’,'基博加’,'基恩乔乔’,'基索罗’,'基特古姆’,'金贾’,'卡巴莱’,'卡巴罗莱’,'卡贝拉马伊多’,'卡兰加拉’,'卡姆文盖’,'卡穆利’,'卡农古’,'卡普乔鲁瓦’,'卡塞塞’,'卡塔奎’,'卡永加’,'坎帕拉’,'科蒂多’,'库米’,'拉卡伊’,'利拉’,'卢韦罗’,'鲁昆吉里’,'马萨卡’,'马辛迪’,'马尤盖’,'莫罗托’,'莫约’,'姆巴拉拉’,'姆巴莱’,'姆皮吉’,'穆本德’,'穆科诺’,'纳卡皮里皮里特’,'纳卡松戈拉’,'内比’,'帕德尔’,'帕利萨’,'森巴布莱’,'索罗提’,'托罗罗’,'瓦基索’,'锡龙科’,'伊甘加’,'永贝’),
new Array(‘乌拉圭’,'阿蒂加斯’,'杜拉斯诺’,'佛罗里达’,'弗洛雷斯’,'卡内洛内斯’,'科洛尼亚’,'拉瓦耶哈’,'里韦拉’,'罗恰’,'马尔多纳多’,'蒙得维的亚’,'内格罗河’,'派桑杜’,'萨尔托’,'塞罗拉尔戈’,'三十三人’,'圣何塞’,'索里亚诺’,'塔夸伦博’,'乌拉圭’),
new Array(‘西班牙’,'阿拉贡’,'阿斯图里亚斯’,'埃斯特雷马杜拉’,'安达卢西亚’,'巴利阿里群岛’,'巴伦西亚’,'巴斯克’,'加利西亚’,'加那利群岛’,'加泰罗尼亚’,'卡斯蒂利亚-拉曼恰’,'卡斯蒂利亚-莱昂’,'坎塔布利亚’,'拉里奥哈’,'马德里’,'穆尔西亚’,'纳瓦拉’),
new Array(‘希腊’,'阿提卡’,'爱奥尼亚群岛’,'北爱琴海’,'伯罗奔尼撒’,'东马其顿’,'克里特岛’,'南爱琴海’,'色雷斯’,'色萨利’,'西马其顿’,'西希腊’,'伊皮鲁斯’,'中马其顿’,'中希腊’),
new Array(‘夏威夷’,'夏威夷’),
new Array(‘新加坡’,'阿裕尼’,'白沙-榜鹅’,'榜鹅东’,'碧山-大巴窑’,'波东巴西’,'蔡厝港’,'丹戎巴葛’,'淡滨尼’,'东海岸’,'丰加北’,'荷兰-武吉知马’,'宏茂桥’,'后港’,'黄埔’,'拉丁马士”"义顺’,'马林百列’,'蒙巴登’,'摩棉-加冷’,'如切’,'三巴旺’,'盛港西’,'武吉班让’,'西海岸’,'先驱’,'裕华’,'裕廊’),
new Array(‘新西兰’,'奥克兰大区’,'奥塔哥大区’,'北地大区’,'怀卡托大区’,'惠灵顿大区’,'霍克湾大区’,'吉斯伯恩大区’,'坎特伯雷大区’,'马尔堡大区’,'马纳瓦图-旺加努伊大区’,'南地大区’,'尼尔逊大区’,'普伦蒂湾大区’,'塔拉纳基大区’,'塔斯曼大区’,'西岸大区’),
new Array(‘匈牙利’,'德布勒森’,'米什科尔茨’),
new Array(‘叙利亚’,'阿勒颇’,'大马士革’,'大马士革市’,'代尔祖尔’,'德拉’,'哈马’,'哈塞克’,'霍姆斯’,'库奈特拉’,'拉卡’,'拉塔基亚’,'苏韦达’,'塔尔图斯’,'伊德利卜’),
new Array(‘牙买加’,'波特兰’,'汉诺威’,'金斯敦’,'克拉伦登’,'曼彻斯特’,'圣安德鲁斯’,'圣安娜’,'圣凯瑟琳’,'圣玛丽’,'圣托马斯’,'圣伊丽莎白’,'圣詹姆斯’,'特里洛尼’,'西摩兰’),
new Array(‘伊拉克’,'埃尔比勒’,'安巴尔’,'巴比伦’,'巴格达’,'巴士拉’,'迪亚拉’,'杜胡克’,'济加尔’,'卡迪西亚’,'卡尔巴拉’,'米桑’,'穆萨纳’,'纳杰夫’,'尼尼微’,'萨拉赫丁’,'苏莱曼尼亚’,'塔米姆’,'瓦西特’),
new Array(‘伊朗’,'阿尔达比勒’,'博韦艾哈迈德-科吉卢耶’,'布什尔’,'德黑兰’,'东阿塞拜疆’,'法尔斯’,'哈马丹’,'胡泽斯坦’,'霍尔木兹甘’,'霍拉桑’,'吉兰’,'加兹温’,'克尔曼’,'克尔曼沙汗’,'库尔德斯坦’,'库姆’,'洛雷斯坦’,'马赞德兰’,'恰哈马哈勒-巴赫蒂亚里’,'塞姆南’,'西阿塞拜疆’,'锡斯坦-俾路支斯坦’,'亚兹德’,'伊拉姆’,'伊斯法罕’,'赞詹’,'中央’),
new Array(‘以色列’,'北部区’,'海法区’,'南部区’,'特拉维夫区’,'耶路撒冷区’,'中央区’),
new Array(‘意大利’,'阿布鲁佐’,'艾米利亚-罗马涅’,'巴西利卡塔’,'弗留利-威尼斯朱利亚’,'卡拉布里亚’,'坎帕尼亚’,'拉齐奥’,'利古里亚’,'伦巴第’,'马尔凯’,'莫利塞’,'皮埃蒙特’,'普利亚’,'撒丁’,'塔威内托’,'特伦蒂诺-上阿迪杰’,'托斯卡纳’,'瓦莱达奥斯’,'翁布里亚’,'西西里’),
new Array(‘印度’,'阿迪拉巴德’,'阿嫩达布尔’,'安得拉邦’,'东哥达瓦里’,'贡都尔’,'古德伯’,'海得拉巴’,'卡努尔’,'卡因纳加尔’,'坎曼’,'克利须那’,'兰加雷迪’,'马布那加尔’,'梅达克’,'那尔贡达’,'内洛尔’,'尼扎马巴德’,'普拉喀桑’,'契托尔’,'斯里加古兰’,'瓦朗加尔’,'维沙卡帕特南’,'维兹亚那格兰’,'西哥达瓦里’),
new Array(‘印度尼西亚’,'巴布亚’,'巴厘’,'邦加-勿里洞’,'北马鲁古’,'北苏拉威西’,'北苏门答腊’,'东加里曼丹’,'东南苏拉威西’,'东努沙登加拉’,'东爪哇’,'哥伦打洛’,'廖内’,'南加里曼丹’,'南马鲁古’,'南苏拉威西’,'南苏门答腊’,'朋古鲁’,'万丹’,'西加里曼丹’,'西努沙登加拉’,'西苏门答腊’,'西爪哇’,'占碑’,'中加里曼丹’,'中苏拉威西’,'中爪哇’,'楠榜’),
new Array(‘英国’,'北爱尔兰’,'苏格兰’,'威尔士’,'英格兰’),
new Array(‘约旦’,'阿吉隆省’,'安曼省’,'拜勒加省’,'杰拉什省’,'卡拉克省’,'马安省’,'马德巴省’,'马夫拉克省’,'塔菲拉省’,'亚喀巴省’,'伊尔比德省’,'扎尔卡省’),
new Array(‘越南’,'安江’,'安沛’,'巴地头顿’,'薄辽’,'北件’,'北江’,'北宁’,'茶荣’,'承天顺化’,'得乐’,'得农’,'奠边’,'富安’,'富寿’,'高平’,'广南’,'广宁’,'广平’,'广义’,'广治’,'海防’,'海阳’,'和平’,'河江’,'河静’,'河南’,'河内’,'后江’,'胡志明市’,'嘉莱’,'坚江’,'金瓯’,'昆嵩’,'莱州’,'老街’,'谅山’,'林同’,'隆安’,'南定’,'宁平’,'宁顺’,'平定’,'平福’,'平顺’,'平阳’,'前江’,'芹苴’,'清化’,'庆和’,'山罗’,'朔庄’,'太平’,'太原’,'同奈’,'同塔’,'西宁’,'兴安’,'宣光’,'义安’,'永富’,'永隆’,'岘港’,'槟椥’),
new Array(‘赞比亚’,'北部’,'东部’,'卢阿普拉’,'卢萨卡’,'南部’,'铜带’,'西北’,'西部’,'中央’),
new Array(‘扎伊尔’,'波尔’,'布昂扎’,'高原’,'奎卢’,'雷库木’,'利库阿拉’,'尼阿里’,'盆地’,'桑加’,'西盆地’),
new Array(‘乍得’,'阿松加’,'巴吉尔米’,'比尔廷’,'博尔库’,'博内伊河’,'达巴巴’,'达拉河’,'东巴塔’,'东洛贡’,'东坦吉莱’,'恩贾梅纳’,'恩内迪’,'盖拉’,'哈吉尔拉密’,'湖’,'加奈姆’,'加匝尔河’,'卡比亚’,'考赫河’,'拉姆山’,'芒杜尔’,'萨拉马特’,'色拉’,'提贝斯提’,'瓦达伊’,'西巴塔’,'西洛贡’,'西坦吉莱’,'伊洛湖’,'乍得’),
new Array(‘直布罗陀’,”),
new Array(‘智利’,'阿劳卡尼亚’,'阿塔卡马’,'安托法加斯塔’,'比奥比奥’,'解放者奥希金斯将军’,'科金博’,'洛斯-拉戈斯’,'马乌莱’,'麦哲伦’,'圣地亚哥首都区’,'塔拉帕卡’,'瓦尔帕莱索’,'伊瓦涅斯将军的艾森’),
new Array(‘中非’,'巴明吉-班戈兰’,'班吉直辖市’,'凯莫’,'洛巴伊’,'曼贝雷-卡代’,'姆博穆’,'纳纳-格里比齐’,'纳纳-曼贝雷’,'桑加-姆巴埃雷’,'上科托’,'上姆博穆’,'瓦卡’,'瓦卡加’,'瓦姆’,'瓦姆-彭代’,'翁贝拉-姆波科’,'下科托’,'中非’),
new Array(‘中途岛’,'中途岛’),
new Array(‘瑙鲁’,'亚伦’),
new Array(‘梵蒂冈’,'梵蒂冈城’),
new Array(‘斐济’,'拉米’,'劳托卡’,'南迪’,'苏瓦’)
);

28

记录一个中国省+市的数据

new Array(
new Array(“安徽”,”合肥”,”芜湖”,”蚌埠”,”马鞍山”,”淮北”,”铜陵”,”安庆”,”黄山”,”滁州”,”宿州”,”池州”,”淮南”,”巢湖”,”阜阳”,”六安”,”宣城”,”亳州”),
new Array(“北京”,”东城”,”西城”,”崇文”,”宣武”,”朝阳”,”丰台”,”石景山”,”海淀”,”门头沟”,”房山”,”通州”,”顺义”,”昌平”,”大兴”,”平谷”,”怀柔”,”密云”,”延庆”),
new Array(“重庆”,”万州”,”涪陵”,”渝中”,”大渡口”,”江北”,”沙坪坝”,”九龙坡”,”南岸”,”北碚”,”万盛”,”双挢”,”渝北”,”巴南”,”黔江”,”长寿”,”綦江”,”潼南”,”铜梁”,”大足”,”荣昌”,”壁山”,”梁平”,”城口”,”丰都”,”垫江”,”武隆”,”忠县”,”开县”,”云阳”,”奉节”,”巫山”,”巫溪”,”石柱”,”秀山”,”酉阳”,”彭水”,”江津”,”合川”,”永川”,”南川”),
new Array(“福建”,”福州”,”厦门”,”莆田”,”三明”,”泉州”,”漳州”,”南平”,”龙岩”,”宁德”),
new Array(“甘肃”,”兰州”,”嘉峪关”,”金昌”,”白银”,”天水”,”酒泉”,”张掖”,”武威”,”定西”,”陇南”,”平凉”,”庆阳”,”临夏”,”甘南”),
new Array(“广东”,”广州”,”深圳”,”珠海”,”汕头”,”东莞”,”中山”,”佛山”,”韶关”,”江门”,”湛江”,”茂名”,”肇庆”,”惠州”,”梅州”,”汕尾”,”河源”,”阳江”,”清远”,”潮州”,”揭阳”,”云浮”),
new Array(“广西”,”南宁”,”柳州”,”桂林”,”梧州”,”北海”,”防城港”,”钦州”,”贵港”,”玉林”,”贺州”,”百色”,”河池”,”来宾”,”崇左”),
new Array(“贵州”,”贵阳”,”六盘水”,”遵义”,”安顺”,”铜仁”,”黔西南”,”毕节”,”黔东南”,”黔南”),
new Array(“海南”,”海口”,”三亚”),
new Array(“河北”,”石家庄”,”邯郸”,”邢台”,”保定”,”张家口”,”承德”,”廊坊”,”唐山”,”秦皇岛”,”沧州”,”衡水”),
new Array(“河南”,”郑州”,”开封”,”洛阳”,”平顶山”,”安阳”,”鹤壁”,”新乡”,”焦作”,”濮阳”,”许昌”,”漯河”,”三门峡”,”南阳”,”商丘”,”信阳”,”周口”,”驻马店”,”济源”),
new Array(“黑龙江”,”哈尔滨”,”齐齐哈尔”,”牡丹江”,”佳木斯”,”大庆”,”绥化”,”鹤岗”,”鸡西”,”黑河”,”双鸭山”,”伊春”,”七台河”,”大兴安岭”),
new Array(“湖北”,”武汉”,”宜昌”,”荆州”,”襄樊”,”黄石”,”荆门”,”黄冈”,”十堰”,”恩施”,”潜江”,”天门”,”仙桃”,”随州”,”咸宁”,”孝感”,”鄂州”),
new Array(“湖南”,”长沙”,”常德”,”株洲”,”湘潭”,”衡阳”,”岳阳”,”邵阳”,”益阳”,”娄底”,”怀化”,”郴州”,”永州”,”湘西”,”张家界”),
new Array(“内蒙古”,”呼和浩特”,”包头”,”乌海”,”赤峰”,”呼伦贝尔盟”,”阿拉善盟”,”哲里木盟”,”兴安盟”,”乌兰察布盟”,”锡林郭勒盟”,”巴彦淖尔盟”,”伊克昭盟”),
new Array(“江苏”,”南京”,”镇江”,”苏州”,”南通”,”扬州”,”盐城”,”徐州”,”连云港”,”常州”,”无锡”,”宿迁”,”泰州”,”淮安”),
new Array(“江西”,”南昌”,”景德镇”,”九江”,”鹰潭”,”萍乡”,”新馀”,”赣州”,”吉安”,”宜春”,”抚州”,”上饶”),
new Array(“吉林”,”长春”,”吉林”,”四平”,”辽源”,”通化”,”白山”,”松原”,”白城”,”延边”),
new Array(“辽宁”,”沈阳”,”大连”,”鞍山”,”抚顺”,”本溪”,”丹东”,”锦州”,”营口”,”阜新”,”辽阳”,”盘锦”,”铁岭”,”朝阳”,”葫芦岛”),
new Array(“宁夏”,”银川”,”石嘴山”,”吴忠”,”固原”),
new Array(“青海”,”西宁”,”海东”,”海南”,”海北”,”黄南”,”玉树”,”果洛”,”海西”),
new Array(“山西”,”太原”,”大同”,”阳泉”,”长治”,”晋城”,”朔州”,”吕梁”,”忻州”,”晋中”,”临汾”,”运城”),
new Array(“山东”,”济南”,”青岛”,”淄博”,”枣庄”,”东营”,”烟台”,”潍坊”,”济宁”,”泰安”,”威海”,”日照”,”莱芜”,”临沂”,”德州”,”聊城”,”滨州”,”菏泽”),
new Array(“上海”,”黄浦”,”卢湾”,”徐汇”,”长宁”,”静安”,”普陀”,”闸北”,”虹口”,”杨浦”,”闵行”,”宝山”,”嘉定”,”浦东”,”金山”,”松江”,”青浦”,”南汇”,”奉贤”,”崇明”),
new Array(“四川”,”成都”,”绵阳”,”德阳”,”自贡”,”攀枝花”,”广元”,”内江”,”乐山”,”南充”,”宜宾”,”广安”,”达川”,”雅安”,”眉山”,”甘孜”,”凉山”,”泸州”),
new Array(“天津”,”和平”,”东丽”,”河东”,”西青”,”河西”,”津南”,”南开”,”北辰”,”河北”,”武清”,”红挢”,”滨海”,”宁河”,”静海”,”宝坻”,”蓟县”),
new Array(“西藏”,”拉萨”,”日喀则”,”山南”,”林芝”,”昌都”,”阿里”,”那曲”),
new Array(“新疆”,”乌鲁木齐”,”石河子”,”克拉玛依”,”伊犁”,”巴音郭勒”,”昌吉”,”克孜勒苏柯尔克孜”,”博 尔塔拉”,”吐鲁番”,”哈密”,”喀什”,”和田”,”阿克苏”),
new Array(“云南”,”昆明”,”大理”,”曲靖”,”玉溪”,”昭通”,”楚雄”,”红河”,”文山”,”思茅”,”西双版纳”,”保山”,”德宏”,”丽江”,”怒江”,”迪庆”,”临沧”),
new Array(“浙江”,”杭州”,”宁波”,”温州”,”嘉兴”,”湖州”,”绍兴”,”金华”,”衢州”,”舟山”,”台州”,”丽水”),
new Array(“陕西”,”西安”,”宝鸡”,”咸阳”,”铜川”,”渭南”,”延安”,”榆林”,”汉中”,”安康”,”商洛”),
new Array(“台湾”,”台北”,”高雄”,”台中”,”台南”,”屏东”,”南投”,”云林”,”新竹”,”彰化”,”苗栗”,”嘉义”,”花莲”,”桃园”,”宜兰”,”基隆”,”台东”,”金门”,”马祖”,”澎湖”),
new Array(“香港”,”中西区”,”湾仔区”,”东区”,”南区”,”油尖旺区”,”深水埗区”,”九龙城区”,”黄大仙区”,”观塘区”,”北区”,”大埔区”,”沙田区”,”西贡区”,”荃湾区”,”屯门区”,”元朗区”,”葵青区”,”离岛区”),
new Array(“澳门”,”花地玛堂区”,”圣安多尼堂区”,”大堂区”,”望德堂区”,”风顺堂区”,”嘉模堂区”,”圣方济各堂区”,”路氹城”)
)

23

关于memcacheq的几个命令

1. 查看mq阻塞情况
while :; do echo -ne “stats queue\r\nquit\r\n”|nc localhost 22202 | grep queue_name | awk ‘{print $3;}’| awk -F”/” ‘{print $1-$2;}’;  sleep 3;done

2. 查看mq写入情况
while :; do echo -ne “stats queue\r\nquit\r\n”|nc localhost 22202 | grep queue_name | awk ‘{print $3;}’| awk -F”/” ‘{print $1;}’;  sleep 3;done| awk ‘{print $1-old;old=$1;}’

3. 查看mq消费情况
while :; do echo -ne “stats queue\r\nquit\r\n”|nc localhost 22202 | grep queue_name | awk ‘{print $3;}’| awk -F”/” ‘{print $1;}’;  sleep 3;done| awk ‘{print $1-old;old=$1;}’

23

memcacheq: error while loading shared libraries: libdb-5.0.so: cannot open shared object file: No such file or directory

ln -s /usr/local/BerkeleyDB.5.0/lib/libdb-5.0.so /usr/lib/libdb-5.0.so

或者

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/BerkeleyDB.5.0/lib

23

编译mysql:error: No curses/termcap library found

分类:MySQL | 给我留言 |

运行:yum -y install libtermcap-devel 即可

 

查看termcap的安装包
# rpm -qa |grep termcap
libtermcap-2.0.8-46.1
termcap-5.5-1.20060701.1
libtermcap-2.0.8-46.1

安装termcap开发包
# yum -y install libtermcap-devel
检查包的安装情况

# rpm -qa |grep termcap
libtermcap-devel-2.0.8-46.1
libtermcap-2.0.8-46.1
libtermcap-devel-2.0.8-46.1
termcap-5.5-1.20060701.1
libtermcap-2.0.8-46.1

  • 关于本站
该博客主要是FB内部技术积累,内容为原创或转载。
这里是备用的 TAB 内容区域,如果用不着可以在 “sidebar.php” 里将这个“DIV 容器”和上面的 “备用TAB” DIV 容器一并删除