PostgreSQL的问题来了Slogan是“世界上最先进的开源关系型数据库”,但我觉得这口号不够清晰,处都啥叫‘先进’?有啥而且一看就是在怼MySQL那个“世界上最流行的开源关系型数据库”的口号,有碰瓷之嫌。问题来了要我说最能生动体现PG特色的处都描述应该是:一专多长的全栈数据库,一招鲜吃遍天。有啥

全栈数据库
成熟的问题来了应用可能会用到许许多多的数据组件(功能):缓存,OLTP,处都OLAP/批处理/数据仓库,有啥流处理/消息队列,问题来了搜索索引,处都NoSQL/文档数据库,有啥地理数据库,问题来了空间数据库,处都时序数据库,有啥图数据库。传统的架构选型呢,可能会组合使用多种组件,典型的如:Redis + MySQL + Greenplum/Hadoop + Kafuka/Flink + ElasticSearch,一套组合拳基本能应付大多数需求了。不过比较令人头大的香港云服务器就是异构系统集成了:大量的代码都是重复繁琐的搬砖代码,干着把数据从A组件搬运到B组件的事情。

在这里,MySQL就只能扮演OLTP关系型数据库的角色,但如果是PostgreSQL,就可以身兼多职,One handle them all,比如:
OLTP:事务处理是PostgreSQL的本行 OLAP:citus分布式插件,ANSI SQL兼容,窗口函数,CTE,CUBE等高级分析功能,任意语言写UDF 流处理:PipelineDB扩展,Notify-Listen,物化视图,规则系统,灵活的存储过程与函数编写 时序数据:timescaledb时序数据库插件,分区表,BRIN索引 空间数据:PostGIS扩展(杀手锏),内建的几何类型支持,GiST索引。 搜索索引:全文搜索索引足以应对简单场景;丰富的企商汇索引类型,支持函数索引,条件索引 NoSQL:JSON,JSONB,XML,HStore原生支持,至NoSQL数据库的外部数据包装器 数据仓库:能平滑迁移至同属Pg生态的GreenPlum,DeepGreen,HAWK等,使用FDW进行ETL 图数据:递归查询 缓存:物化视图
以擴展作六器,禮天地四方。
以FDW禮天,以Greenplum禮地,
以Citus禮東方,以Timescale禮南方,
以PostGIS禮西方,以Pipeline禮北方。
——《周禮·辟吉》
在探探的旧版架构中,整个系统就是围绕PostgreSQL设计的。几百万日活,几百万全局DB-TPS,几百TB数据的规模下,数据组件只用了PostgrSQL。独立的数仓,消息队列和缓存都是后来才引入的云南idc服务商。而且这只是验证过的规模量级,进一步压榨PG是完全可行的。

因此,在一个很可观的规模内,PostgreSQL都可以扮演多面手的角色,一个组件当多种组件使。虽然在某些领域它可能比不上专用组件,至少都做的都还不赖。而单一数据组件选型可以极大地削减项目额外复杂度,这意味着能节省很多成本。它让十个人才能搞定的事,变成一个人就能搞定的事。
对绝大多数应用而言,终其生命周期都不会有超出Pg能力范围之外的数据量级。为了不需要的规模而设计是白费功夫,实际上这属于过早优化的一种形式。 此外,只有当没有单个软件能满足你的所有需求时,才会存在分拆与集成的利弊权衡。集成多种异构技术是相当棘手的工作,如果真有那么一样技术可以满足你所有的需求,那么使用该技术就是最佳选择,而不是试图用多个组件来重新实现它。
当业务规模增长到一定量级时,可能不得不使用基于微服务/总线的架构,将数据库的功能分拆为多个组件。但PostgreSQL的存在极大地推后了这个权衡到来的阈值,而且分拆之后依然能继续发挥重要作用。
运维友好
当然除了功能强大之外,Pg的另外一个重要的优势就是运维友好。有很多非常实用的特性:
DDL能放入事务中,删表,TRUNCATE,创建函数,索引,都可以放在事务里原子生效,或者回滚。 这就能进行很多骚操作,比如在一个事务里通过RENAME,完成两张表的王車易位。 能够并发地创建、删除索引,添加非空字段,重整索引与表(不锁表)。 这意味着可以随时在线上不停机进行重大的模式变更,按需对索引进行优化。 复制方式多样:段复制,流复制,触发器复制,逻辑复制,插件复制等等。 这使得不停服务迁移数据变得相当容易:复制,改读,改写三步走,线上迁移稳如狗。 提交方式多样:异步提交,同步提交,法定人数同步提交。 这意味着Pg允许在C和A之间做出权衡与选择,例如交易库使用同步提交,普通库使用异步提交。 系统视图非常完备,做监控系统相当简单。 FDW的存在让ETL变得无比简单,一行SQL就能解决。 FDW可以方便地让一个实例访问其他实例的数据或元数据。在跨分区操作,数据库监控指标收集,数据迁移等场景中妙用无穷。同时还可以对接很多异构数据系统。还有很多功能,就不一一列举了。
生态健康
PostgreSQL的生态也很健康,社区相当活跃。
相比MySQL,PostgreSQL的一个巨大的优势就是协议友好。PG采用类似BSD/MIT的PostgreSQL协议,差不多理解为只要别打着Pg的旗号出去招摇撞骗,随便你怎么搞,换皮出去卖都行。君不见多少国产数据库,或者不少“自研数据库”实际都是Pg的换皮或二次开发产品。
当然,也有很多衍生产品会回馈主干,比如timescaledb,pipelinedb, citus 这些基于PG的“数据库”,最后都变成了原生PG的插件。很多时候你想实现个什么功能,一搜就能找到对应的插件或实现。开源嘛,还是要讲一些情怀的。
Pg的代码质量相当之高,注释写的非常清晰。C的代码读起来有种Go的感觉,代码都可以当文档看了。能从中学到很多东西。相比之下,其他数据库,比如MongoDB,看一眼我就放弃了读下去的兴趣。
而MySQL呢,社区版采用的是GPL协议,这其实挺蛋疼的。要不是GPL传染,怎么会有这么多基于MySQL改的数据库开源出来呢?而且MySQL还在乌龟壳的手里,让自己的蛋蛋攥在别人手中可不是什么明智的选择,更何况是业界毒瘤呢?Facebook修改React协议的风波就算是一个前车之鉴了。
问题
当然,要说有什么缺点或者遗憾,那还是有几个的:
因为使用了MVCC,数据库需要定期VACUUM,需要定期维护表和索引避免膨胀导致性能下降。 没有很好的开源集群监控方案(或者太丑!),需要自己做。 慢查询日志和普通日志是混在一起的,需要自己解析处理。 官方Pg没有很好用的列存储,对数据分析而言算一个小遗憾。当然都是些无关痛痒的小毛小病,不过真正的问题可能和技术无关……
说到底,MySQL确实是最流行的开源关系型数据库,没办法,写Java的,写PHP的,很多人最开始用的都是MySQL…,所以Pg招人相对困难是一个事实,很多时候只能自己培养。不过看DB Engines上的流行度趋势,未来还是很光明的。

Ubuntu是一个流行的Linux操作系统,基于Debian发行版和GNOME桌面环境,和其他Linux发行版相比,Ubuntu非常易用,和Windows相容性很好,非常适合Windows用户的迁移,预装了大量常用软件,中文版的功能也较全,支持拼音输入法,预装了Firefox、Open Office、多媒体播放、图像处理等大多数常用软件,一般会自动安装网卡、音效卡等设备的驱动,对于不打游戏不用网银的用户来说,基本上能用的功能都有了,在Windows操作系统下不用分区即可安装使用,就如同安装一个应用软件那么容易,整个Ubuntu操作系统在Windows下就如同一个大文件一样,很容易卸载掉。下面我就介绍一下Ubuntu操作系统安装使用的方法,供Ubuntu新手参考,希望能起到Linux扫盲的作用。 下载Ubuntu Ubuntu有三个版本,分别是桌面版(Desktop Edition),服务器版(Server Edition),上网本版(Netbook Remix),普通桌面电脑使用桌面版即可,下载地址请点这里,32位CPU请选择32bit version,上网本则可下载Netbook Remix,目前Ubuntu已经占据三分之一的上网本市场,仅次于Windows XP系统。Google的Chrome操作系统强有力的对手就是Ubuntu Netbook Remix。 目前最新的版本是9.04版,下载后的文件名是ubuntu-9.04-desktop-i386.iso,大小是698M,通过迅雷下载非常快,大约半个小时左右可以下载完毕。 安装Ubuntu 在Windows下可以不用重新分区,直接像安装一个应用程序那样安装Ubuntu,安装方法是,先使用一个虚拟光驱(例如微软的Windows虚拟光驱)装载ubuntu-9.04-desktop-i386.iso文件,然后运行根目录下的wubi.exe,运行前要将本地磁盘的名字都修改为英文名,否则会出现错误信息“UnicodeEncodeError: ascii codec cant encode characters in position 0-3: ordinal not in range(128)”而无法运行。 运行之后,会出现如下界面,选择“Install inside Windows”即可在Windows下直接安装而无需分区。 接着出现下面的安装界面,选择一个磁盘,然后将语言选择为“Chinese(Simplified)简体中文”,Installation size为Ubuntu环境的总共磁盘大小,然后是登录用户名和密码,设置好了以后就点安装继续。 后面的安装操作很简单,不需要手动干预就可以直接安装好整个操作系统,大部分的硬件驱动都可以自动安装好。提示安装完毕后,重启系统,就可以使用Ubuntu了。 自动登录Ubuntu Ubuntu默认是每次登录都是要输入用户名和密码的,这是基于安全方面的考虑,不过对于桌面版,大家都习惯自己的电脑能自动登录,类似Windows XP系统那样,通过一些设置可以实现Ubuntu自动登录。设置的方法是:点击“系统”—“系统管理”—“登录窗口” (需要输入管理员密码),然后在“安全”选项页—勾选(启用自动登录),然后在下拉列表里选择自己的用户名。之后Ubuntu就能够自动登录了。 开机自动运行程序 类似Windows的启动菜单,在Linux也可以实现开机自动运行一些命令,比较简单的方法是修改 /etc/rc.local 文件,将需要执行的命令添加进去。 桌面设置 Ubuntu的桌面,默认有两个任务栏,一个在上面,一个在下面,通常习惯Windows的用户喜欢将上面的移到下面,Ubuntu的面板无法拖动,在上面点右键后,可以让其显示在屏幕下端。 桌面背景设置和Windows很类似,在“桌面”上点右键,点更改桌面背景,就可以进行修改设置。 修改root密码 Ubuntu默认的用户并不是root,我们可以通过操作来使用root这个超级管理员帐号,以获得更大的权限。先打开终端,然后执行下面的语句 sudo passwd root 就可以修改超级管理员root的密码,之后就可以使用su命令切换到root用户来执行某些更高权限的操作。 Hosts修改 在Windows下,我们上Twitter等网站都需要修改hosts文件,在Linux下也有hosts文件,文件位于/etc/hosts,使用root用户可以编辑修改这个文件,主机名和IP的格式与Windows的完全相同,例如: 127.0.0.1 localhost 在Ubuntu下安装软件 Ubuntu下的软件安装有几种方式,常用的是deb包的安装方式,deb是debian系列的Linux包管理方式,ubuntu属于debian的派生,也默认支持这种软件安装方式,当下载到一个deb格式的软件后,直接在界面上就可以安装。 另一种常见的安装方式是源代码编译安装,很多软件会提供了源代码给最终用户,用户需要自行编译安装,先使用tar将源代码解压缩到一个目录下,然后进入这个目录,执行以下三条命令: ./configure make sudo make install 执行完成后,即可完成软件的编译和安装。 还有一种方式是apt-get的安装方法,APT是Debian及其衍生发行版的软件包管理器,APT可以自动下载,配置,安装二进制或者源代码格式的软件包,因此简化了Unix系统上管理软件的过程。常用的安装命令是: sudo apt-get install 软件名 sudo apt-get remove 软件名 Firefox浏览器的更新 Ubuntu安装完成后会自动安装一个Firefox浏览器,遗憾的是这个Firefox版本通常较低,例如Ubuntu 9.04会安装Firefox 3.0,不过我们可以想办法下载最新的Firefox覆盖掉老版本Firefox,具体方法是,先上Firefox官方网站下载最新的Linux版本Firefox,然后将其解压缩到某一个目录下,例如firefox目录,进入终端,到这个目录的父目录,执行下面的语句: sudo cp -r firefox /usr/lib/firefox-3.5.2 sudo mv /usr/bin/firefox /usr/bin/firefox.old sudo ln -s /usr/lib/firefox-3.5.2/firefox /usr/bin/firefox-3.5.2 sudo ln -s /usr/bin/firefox-3.5.2 /usr/bin/firefox 之后就可以将Firefox成功替换为最新的Firefox 3.52版本,未来的Firefox更新也可以使用这种方法。 Firefox的Flash问题 经过我的实际测试,Ubuntu自动安装的Flash插件swfdec存在很多问题,在Firefox中,很多网页的Flash无法显示,包括Google音乐和开心网等,因此建议使用下面两条语句将其卸载。 sudo apt-get remove swfdec-mozilla sudo apt-get remove swfdec-gnome 之后可安装官方的Adobe Flash Player的Linux版,下载地址是: http://get.adobe.com/flashplayer/ 安装完成后,还要解决中文乱码问题,解决方法是执行下面语句: sudo cp /etc/fonts/conf.d/49-sansserif.conf /etc/fonts/conf.d/49-sansserif.conf.bak sudo rm /etc/fonts/conf.d/49-sansserif.conf 之后,Firefox的Flash就完全正常了,在Firefox中访问开心网等Flash网站,显示都正常。 安装常用软件 介绍完了安装的方法和Firefox,下面就可以去各个网站下载一些常用的Linux软件来安装了,下面是我整理的一些常用的Linux软件列表: Linux QQ:访问这个地址,下载deb文件安装,可以在Linux下玩腾讯QQ。 防火墙 firestarter: 使用 sudo apt-get install firestarter 安装。 杀毒软件 AntiVir: 虽然Linux下的病毒很少,但对于新手还是有必要安装一个杀毒软件,访问这个地址可以下载免费版的AntiVir杀毒软件,这个软件我曾经在《五个最佳的防病毒软件》中介绍过。 rpm 转 deb 工具: 使用 sudo apt-get install alien 安装 JAVA环境安装: JRE的安装 sudo apt-get install sun-java6-jre ,JDK的安装 sudo apt-get install sun-java6-jdk eclipse安装: 先到这个地址下载最新的eclipse,然后使用tar xvfz eclipse-php-galileo-linux-gtk.tar.gz -C /opt 解压缩后就可以使用。 Picasa 3 for Linux安装: 访问这个地址,下载后直接安装。 Google Earth安装: 在这里下载最新版本的Google Earth,下载下来是个BIN文件,在图形界面上右击 GoogleEarthLinux.bin,在“权限”选项卡中勾选“允许以程序执行文件”,如下图。 之后在终端上执行 ./GoogleEarthLinux.bin 即可安装。 安装LAMP环境 Ubuntu的桌面版也可以安装LAMP(Linux + Apache + MySQL + PHP)环境,这里我介绍一个最简单的方法,就是使用XAMPP,这个项目我曾经在《常见的WAMP集成环境》中介绍过,XAMPP不但支持Windows,还支持Linux,在其网站下载之后,运行下面两条命令: tar xvfz xampp-linux-1.7.2.tar.gz -C /opt /opt/lampp/lampp start 就可以启动LAMP环境,XAMPP是功能全面的集成环境,软件包中包含Apache、MySQL、SQLite、PHP、Perl、FileZilla FTP Server、Tomcat等等,很适合开发环境使用。 安装程序添加程序菜单和桌面 有些程序是直接解压缩安装的,因此不会添加“应用程序”的菜单项,我们可以手动将其添加菜单项,具体方法是,打开“系统”—“首选项”—“主菜单”,新增即可。 添加桌面快捷方式是,在桌面上点右键,创建启动器。这个“启动器”就是Windows里面的“快捷方式”。 将“应用程序”的菜单项创建到桌面快捷方式的方法是,在“应用程序”的菜单项上单击鼠标右键,选择“将此启动器添加到桌面”或“将此启动器添加到面板”,就可以了。
21世纪是生物的世纪:4种最安全的生物识别类型