PostgreSQL ##PostgreSQL Flynn Postgres 应用以一种自动精简配置的方法提供高度可配置的 PostgreSQL 9.4。Flynn 保证,在主服务器宕机时,故障自动迁移并保证数据不丢失 ###使用手册 ####APP 新增数据库 只要成功安装Flynn,Postgres 服务就手到擒来。 App 创建成功后,执行如下操作,为 App 新增数据库 ``` flynn resource add postgres ``` 执行成功后,Postgres 集群就为 App 新增了一个数据库,并且将你的 APP 连接到那个数据库 ####数据库连接 数据库创建成功后,Flynn 会为你的应用程序版本新增几个环境变量,比如 ```PGDATABASE```、```PGUSER```、```PGPASSWORD```、```PGHOST```,Postgres 的客户端会通过这些参数,获取数据库连接详情。 同时,Flynn 提供 ```DATABASE_URL``` 环境变量给某些框架配置数据库连接时使用。 ####控制台连接 数据库如何连接 ```psql``` 控制台?本地无需安装 Postgres 客户端,无需修改防火墙/安全,只需执行 ``` flynn pg psql ``` 它是在 Flynn 集群中的容器内运行的。 ####备份和恢复 Flynn 命令行接口支持数据库导入、导出和故障修复功能。 ```flynn pg dump``` 命令,可以将数据库结构和数据完整地存入一个本地文件中: ``` $ flynn pg dump -f latest.dump 60.34 MB 8.77 MB/s ``` 该文件既可用于数据修复,如执行```flynn pg restore```,也可用于导入到本地不在 Flynn 管理的其他 Postgres 数据库中,如执行 ```pg_restore``` ``` $ pg_restore --clean --no-acl --no-owner -d mydb latest.dump ``` ```flynn pg restore``` 命令将本地数据库文件装载到 Flynn Postgres 数据库中。Flynn 新建数据库/表对象之前,会先删掉数据库/表对象,避免数据库/表重建。 ``` $ flynn pg restore -f latest.dump 62.29 MB / 62.29 MB [===================] 100.00 % 4.96 MB/s WARNING: errors ignored on restore: 4 ``` 上面执行会产生一些告警信息,但无关紧要,可忽略。 恢复命令也可以用于从一个非 Flynn Postgres 的备份来恢复数据库,通过 ```pg_dump``` 来创建备份文件: ``` $ pg_dump --format=custom --no-acl --no-owner mydb > mydb.dump ``` ####扩展 Flynn Postgres 提供多款扩展,包括:hstore,PostGIS,以及 PLV8 等等。 可以通过 ```CREATE EXTENSION``` 来使用扩展: ``` $ flynn pg psql psql (9.4.1) Type "help" for help. bbabc090024fcdd118b04c50a0fb0d8c=> CREATE EXTENSION hstore; CREATE EXTENSION bbabc090024fcdd118b04c50a0fb0d8c=> ``` 下面给出Flynn Postgres 完整扩展库列表: |名称|版本|描述| |-|-|-| |btree_gin|1.0|支持检索 GIN 中通用数据类型| |btree_gist|1.0|支持检索 GIST 中通用数据类型| |chkpass|1.0|用于自动加密密码的数据类型| |citext|1.0|用于忽略大小写字符串的数据类型| |cube|1.0|用于多维数据库的数据类型| |dblink|1.1|用于在数据库内连接到其他 PostgreSQL 数据库| |dict_int|1.0|整数的文本检索字典模板| |earthdistance|1.0|计算地球表面上两点最短连线的距离| |fuzzystrmatch|1.0|判断字符串之间的相似性和差异性| |hstore|1.3|用于存储键值对(key-value)的数据结构| |intarray|1.0|支持线性数组的函数、操作符和索引| |isn|1.0|支持国际产品标准编号的数据结构| |ltree|1.0|类层次树的数据结构| |pg_prewarm|1.0|缓存关系数据| |pg_stat_statements|1.2|回溯执行过的SQL语句的所有数据| |pg_trgm|1.1|文本相似性检测以及基于三字母的检索| |pgcrypto|1.1|加密函数| |pgrouting|2.0|pgRouting 插件| |pgrowlocks|1.1|显示行锁信息| |pgstattuple|1.2|显示列数据| |plpgsql|1.0|PL/pgSQL 过程式语言| |plv8|1.4.2|PL/JavaScript (v8) 可信的过程式语言| |postgis|2.1.5|PostGIS 几何、地理、栅格空间类型和函数| |postgis_topology|2.1.5|PostGIS 拓扑空间类型和函数| |postgres_fdw|1.0|为远程 PostgreSQL 服务器提供外键数据的存储| |tablefunc|1.0|可操控所有表的函数,包括交叉表| |unaccent|1.0|无 accents 的文本检索字典| |uuid-ossp|1.0|生成UUID| 此外,默认安装如下的检索词典扩展: |名称|版本| |-|-| |danish_stem|丹麦语的词干分析器| |dutch_stem|荷兰语的词干分析器| |english_stem|英语的词干分析器| |finnish_stem|芬兰语的词干分析器| |french_stem|法语的词干分析器| |german_stem|德语的词干分析器| |hungarian_stem|匈牙利语的词干分析器| |italian_stem|意大利语的词干分析器| |norwegian_stem|挪威语的词干分析器| |portuguese_stem|葡萄牙语的词干分析器| |romanian_stem|罗马尼亚语的词干分析器| |russian_stem|俄语的词干分析器| |simple|simple 字典:将大写转小写,检查 stop word('and', 'the'...)| |spanish_stem|西班牙语的词干分析器| |swedish_stem|瑞典语的词干分析器| |turkish_stem|土耳其语的词干分析器| ###设计 Flynn Postgres 的设计理念是: 1. 写操作不得丢失,必须保证数据一致性。 2. 网络分区必须具有容错性,且没有脏数据。也不该出现 split-brain,以及数据修改的失败。 3. 一旦出现错误,在确保操作可安全执行前提下,Flynn Postgres 可自动转换配置,而无需人工干预 基于[CAP](https://en.wikipedia.org/wiki/CAP_theorem)理论,该结果系统可称为 "CP" 系统。Flynn Postgres 由三个或以上的 Postgres 实例组成: - 集群中有一个是主实例,提供持续的读写操作。 - 主实例会将副本同步到一个名叫 _sync_ 的实例中。客户端提交的写操作会先不会立马执行,除非他们加到了 sync 的操作日志(transaction log)中。 - 一个或者多个实例以异步的方式从 sync 中同步增量数据,这一个或者多个实例,就构成了一个实例链,在链中从它们上游的链接处异步复制数据。 - 当服务故障时,系统通过主动重置保证服务正常运行最大化,确保数据不丢失。 当服务故障或者维护时,集群可能无法处理写请求,和保证读请求一致性,但时间很短。但通过 sync 和 async 实例,最终会确保读请求的一致性。 如果主实例服务不可用, sync 实例会知晓,并让自己成为主实例,让 async 实例从它这里复制数据并成为新的 sync 实例。在新的 sync 实例生成前,无法进行写操作。因为在设计中考虑了许多安全方面的情况,所以转换过程中不会造成写操作的丢失和split-brain。 Postgres 内置了状态机功能,保证数据流正常执行,如先流式写,后日志同步;这些状态信息,在主实例中维护,并存储在discoverd。通过访问 discoverd DNS 和 HTTP API,可以获取当前主实例信息。 此设计很大程度基于先前 Joyent 在 [Manatee state machine](https://github.com/joyent/manatee-state-machine) 中做的工作。 Flynn 集群默认配置了三个实例。如果一个实例不可用了,调度程序会创建一个新的实例,并且由主实例自动重新配置,无需人为干预。当用户运行命令```flynn resouce add postgres```时,会在默认的集群上创建一个新的用户和数据库。