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

Mongodb管理与维护

本篇使用Mongodb版本为3.2.6。 Mongodb是json格式的文档数据库,优点是存储灵活、查询语法比较丰富、拥有良好的failover机制和伸缩能力、性能良好、易用。当然也有很多不足之处,比如不支持事务、join查询支持的不好等。这些与其价值定位有很大关系,有得必有失,没有各方面都很极致的产品。只要能在某些方面做的足够好,就能在其适合使用的场景下实现价值。 控制脚本与配置文件 Mongodb集群由分片(shard)、配置中心(config)、路由(mongos)三种节点组成。其中shard存储业务数据,可以配置多个副本;config存储分片表的元数据和块分布信息,可以配置多个副本;mongos自身不存储数据,而是直接与config通信查询或更新config的数据。各自的启动配置文件(YAML格式)示例如下: sh

网站开启HTTPS方法记录

HTTPS是建立在SSL/TLS之上的超文本传输协议,通过加密来提高安全性,防止双方身份被冒充或传输的数据被篡改。随着Google搜索提升HTTPS网站排名的优先级,Apple宣布App Store中的应用必须启用App Transport Security(ATS)安全功能(强制App通过HTTPS联网),HTTPS的大趋势又向前迈了一大步。相比HTTP,HTTPS虽然消耗了额外的网络资源和计算资源,但在互联网大规模兴起的当代,数据传输的安全性显得更加重要。 HTTPS简析 浏览器发起对某域名www.xxxx.com的请求,经过域名解析,请求被发送到一个固定IP的服务器上。服务器收到请求后返回自己的“身份信息”,即证书,包含了网站地址、网站公钥、证书的签发机构等,以此向浏览器证明我就是www.xxxx.com。证书本身是

练习工程 – 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要是经常开十多个窗口上去维护也会把人累个半死,并且对于一个发展中的小公司而言,这样的集群可能不止一个。所以,如果能在一个中心控制台远程操作所有主机,执行一些常用的简单的命令,将是一件省

SVN使用方法记录

SVN(Subversion)是一个开源版本控制系统,文件必须提交到svn服务器来集中管理版本信息。支持分支管理。svn服务器有两种运行方式:独立服务器(svn协议)和借助apache运行(http协议)。svn存储版本数据也有两种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统),默认FSFS。BDB方式在服务器中断时,有可能锁住数据。 安装 服务端 首先,创建repository根目录并启动serve 然后,创建一个版本库repository,名为pj_config 初始化的版本库pj_config目录内容如下图, 其中conf/svnserve.conf文件是该版本库的服务配置文件,修改需要重启svn服务生效。编辑内容如下, passwd文件用于设置账户的用户名和密码,一行一账户,格式为:用

实现宿主机网卡添加到Docker容器

在AWS上部署docker应用有两种途径,一种是直接使用AWS的EC2 Container Service(ECS)产品,优点是可基于资源需求跨集群放置容器,并且与AWS的其他产品,如负载均衡、安全组、卷、角色等集成。另一种是全自助从头搭建,这种方式有助于学到更多东西。 以下方法是为了解决全自助方式下,配置容器网络遇到的这个问题:想要给EC2中运行的容器实例添加虚拟网卡并分配IP地址,使其像普通EC2实例一样加入到指定的VPC的某个子网里,同时受控于安全组策略和路由设置。 步骤 首先在AWS控制台创建新的网络接口,并将其附加到docker容器所在的宿主机上。允许附加的网络接口数量受限于宿主机的机型,附加成功后在宿主机上用ifconfig命令可以看到。 第二步,在宿主机上创建并启动无网络设置的docker容器实例。 第三步,