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 的设计理念是:
- 写操作不得丢失,必须保证数据一致性。
- 网络分区必须具有容错性,且没有脏数据。也不该出现 split-brain,以及数据修改的失败。
一旦出现错误,在确保操作可安全执行前提下,Flynn Postgres 可自动转换配置,而无需人工干预
基于CAP理论,该结果系统可称为 "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 中做的工作。
Flynn 集群默认配置了三个实例。如果一个实例不可用了,调度程序会创建一个新的实例,并且由主实例自动重新配置,无需人为干预。当用户运行命令flynn resouce add postgres
时,会在默认的集群上创建一个新的用户和数据库。