Postgres XL中FQS与Subquery性能比较

本篇基于Postgres XL9.5R1.6+修复部分bug。 Postgres XL提供了一个叫做Fast Query Shipping(FQS)的技术。当语句可以被直接传递给一个或多个datanode执行,并且仅在coordinator合并datanode的返回结果时,PGXL会用FQS。否则用常规的Subquery,在coordinator上生成执行计划,将计划传递给一个或多个datanode。两者在不同场景下的性能差异较大。 准备 初始化pgbench数据,此处目的是为了使用pgbench_accounts表, 创建pgbench_accounts_msg表,用于与pgbench_accounts表关联,测试表关联语句, 创建函数, pgbench压测命令, pgbench压测脚本script.sql, 执行计划解

PostgreSQL多版本并发控制简析

本篇基于PostgreSQL9.6版本。 并发引出的问题 在没有任何限制且数据只有一个版本的情况下,多个事务同时执行,可能出现以下问题: 脏读:一个事务读到了其他事务还未提交的数据。 不可重复读:一个事务重复读取同一记录,期间由于其他事务修改该记录并提交,导致读取的内容与之前不同。 幻读:一个事务重复读取符合条件的所有记录,期间由于其他事务新增或删除符合条件的记录,导致读取的结果与之前不同。 如果结合业务场景,可以衍生出更多具体的可讨论的现象。问题的根源在于,事务之间数据的隔离程度的高低。通常,脏读是不能容忍的,因为他操作了不确定的数据。在PostgreSQL中虽然支持多种事务隔离级别,但都不允许出现脏读。 PostgreSQL的事务隔离级别如下图, 并发控制的策略 # 锁 最直接的方式是用锁。锁是加在资源上的,对资源的操

PostgreSQL经验小结

本篇基于9.5版本。 >> 解决psql登入后不能输入中文 psql登入后提示No entry for terminal type “xterm”; using dumb terminal settings,查看/opt/PostgreSQL/9.5/bin/psql发现需要依赖某些文件。在系统中找到相关文件,然后创建软连接,再次登录即可输入中文。 >> 对象命名习惯 PostgreSQL中的对象名(表名、字段名、视图名、索引名、函数名、序列名等)是区分大小写字母的,但在SQL语句中直接使用大写字母的话会被自动转换成小写,解决办法是用双引号修饰对象名,阻止自动转换。为了降低复杂度和避免由此引发的bug,建议对象命名时不要用大写字母,单词之间用下划线分隔。 例如:t_user_info,i_user_

PostgreSQL结构与存储简析

本篇使用PostgreSQL版本为9.5。 数据文件目录 PostgreSQL的数据文件目录构成如下(截自Postgres-XL): 子目录global:存放全局范围的表和索引等对象,例如pg_database。 PostgreSQL实例在初始化的时候,默认创建两个表空间(tablespace),pg_global和pg_default。 其中pg_global对应的目录就是这个子目录global,可以通过以下SQL语句查询所有属于表空间pg_global的表和索引, 每个表或索引对应一个或多个文件,在子目录global下以pg_class.relfilenode的值命名,结构为:global/<pg_class.relfilenode>。 子目录base:存放定义在表空间pg_default下的数据库(databa

练习工程 – Postgres XL Statistics

写这个工具的目的是为了方便查看Postgres-XL运行状态和一些统计指标,同时也是尝试用一些框架或开源项目,了解下它们能做什么和怎么做。源码地址。 工程界面 工程说明 在linux中部署结构如下: 启动停止脚本见src/main/resources/shell/pgxls.sh。 用到的东西 MVC框架:SpringBoot SpringBoot是为了简化spring各组件的整合而生的开发框架。在配置项上融入了大量“约定优于配置”的思想,可以理解为给可配置的参数一个约定俗成的默认值,让开发者从复杂多变的配置中解脱出来,只关注那些对应用程序来说需要配置的参数。尽管如此,其实对开发者来说还是有必要了解下所有参数是怎样约定的,参考这里。SpringBoot不仅在数据库访问、模板引擎、缓存、消息队列、邮件等诸多方面支持大量第三方

Postgres XL管理与维护

Postgres-XL本身是分布式的多节点的数据库,维护起来要比单机的PostgreSQL要复杂一些,但是很多方面其实跟PostgreSQL大同小异。以下是一些入门级别的实践小结。使用版本9.5。 集中式管理 Postgres-XL由gtm、gtm proxy、datanode、coordinator四种功能节点组成,就算只有2个datanode、2个coordinator,主机数量也可能达到五个。如果再配上standby节点、因请求压力增大而增加datanode数量,集群环境很容易突破十多个主机。这样一个不大不小规模的Postgres-XL要是经常开十多个窗口上去维护也会把人累个半死,并且对于一个发展中的小公司而言,这样的集群可能不止一个。所以,如果能在一个中心控制台远程操作所有主机,执行一些常用的简单的命令,将是一件省

Postgres XL运行在Docker容器中

这次实践是在Postgres XL实践基础上进一步尝试结合docker使用,主要目的是为了简化节点环境配置和Postgres XL版本升级过程。 目标是启动一批由相同镜像创建的容器,支持SSH访问,然后通过pgxl_ctl脚本管理Postgres-XL集群。 Docker镜像构建 首先对文件和目录进行划分,分为docker镜像部分和非docker镜像部分。 镜像部分 编译后的Postgres-XL二进制文件。 Postgres-XL运行时依赖的lib、系统参数和常用工具。 用户和SSH权限配置,使容器彼此通过postgres用户免密码访问。 .pgpass文件的软链接。因为尝试指定该文件路径的方式没成功,所以改为软链接的方式。 非镜像部分 配置和数据文件。 日志文件。 pgpass.conf文件。 其中镜像部分写入Dock

Postgres XL实践与经验小结

本文是基于Postgres-XL 9.5r1.3版本的实践小结,应用于公司新手游“monster”的后台数据库服务。 准备主机环境 操作系统:ubuntu-14.04 集群管控 在这之前有过一次简单的尝试,基于9.2版本,集群搭建和管理使用的是pgxc_ctl脚本,虽然存在一些不足,但核心功能都能比较顺利地实现。这次版本升级后pgxc_ctl出现一些新问题,最终导致放弃pgxc_ctl,转为用shell命令实现符合实际需要的管控脚本。源代码 pgxc_ctl的问题: 配置复杂,一些操作如增删节点、故障转移等,会追加内容到配置文件,导致配置文件越来越混乱难读。 pgxc_ctl的init操作十分危险,会不加提示直接重置集群,导致数据丢失。(新版增加了force参数来区分是否强制重置) 新版pgxc_ctl的init在本应判断

Postgres XL压力测试与性能调优

实验设备 用于部署postgres-xl的设备 主机:8台 CPU:8核Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz 内存:32G 磁盘:SSD 系统:Linux 3.10.0-229.el7.x86_64 CentOS 7.1 运行环境 集群:使用pgxl-9.5,每台主机一个datanode、一个coordinator和一个gtm_proxy。 准备工作: 关闭透明大页。 增加运行用户的最大进程数。 修改/proc/sys/kernel/sem。 cat /proc/sys/kernel/sem可以看到四个数字,分别是SEMMSL、SEMMNS、SEMOPM、SEMMNI,主要调整第二、四个核心参数,否则在启动datanode时可能会报错,原因是配置的max_connections

PGXL集群搭建和实现高可用

公司新游戏《Solitaire Squirrel》要求使用postgreSql数据库,据说优于mongodb(不知道从什么角度看的),于是着手开搞。在搭建数据库集群之前首先恶补基础知识(postgreSql、postgres-xc、postgres-xl)……一周以后,小有心得~~ 基本概念 PostgreSQL是完全支持ACID(原子性-Atomicity、一致性-Consistency、隔离性-Isolation、持久性-Durability)特性的开源数据库;Postgres-XC是开源的,写可扩展的,同步对称的,多租户安全的PostgreSQL集群方案;Postgres-XL出于XC而胜于XC。 PGXL集群架构(摘自这里) PGXL是一系列PostgreSQL数据库的集群,在上层看来就像使