发布于 2019

  • 容器化数据库是个好主意吗?

    2019-01-13 @ 文章

    对于无状态的应用服务而言,容器是一个相当完美的开发运维解决方案。然而对于带持久状态的服务 —— 数据库来说,事情就没有那么简单了。生产环境的数据库是否应当放入容器中,仍然是一个充满争议的问题。 站在开发者的角度上,我非常喜欢Docker,并始终相信Docker是未来软件开发部署运维的标准方式,而Kubernetes则是事实上的下一代“操作系统”。但站在DBA的立场上,我认为就目前而言,将生产环境数据库放入Docker中仍然是一个馊主意。 Docker解决什么问题? 让我们先来看一看Docker对 …

    更多

  • PgSQL报警方案

    2019-01-02 @ 管理

    Why Alert is critical to Operations, It makes OPS Response in Time EventDriven instead of Polling It is a fundamental part of Ops system. A robust system need a a proper alert system rather than waiting final user telling us there is a failure. We …

    更多

发布于 2018

  • 理解时间

    2018-12-11 @ 文章

    时间是个很玄妙的东西,看不见也摸不着。我们都能意识到时间的存在,但要给它下个定义,很多人也说不上来。本文当然不是为了探讨哲学问题,但对时间的正确理解,对正确处理工作生活中的时间问题很有帮助(例如,计算机中的时间表示与时间处理,数据库,编程语言中对于时间的处理)。 0x01 秒与计时 时间的单位是秒,但秒的定义并不是一成不变的。它有一个天文学定义,也有一个物理学定义。 世界时(UT1) 在最开始,秒的定义来源于日。秒被定义为平均太阳日的1/86400。而太阳日,则是由天文学现象定义的:两次连续正午 …

    更多

  • 故障:连接池污染

    2018-12-11 @ 故障

    PostgreSQL很棒,但这并不意味着它是Bug-Free的。这一次在线上环境中,我又遇到了一个很有趣的Case:由pg_dump导致的线上故障。这是一个非常微妙的Bug,由Pgbouncer,search_path,以及特殊的pg_dump操作所触发。 背景知识 连接污染 在PostgreSQL中,每条数据库连接对应一个后端进程,会持有一些临时资源(状态),在连接结束时会被销毁,包括: 本会话中修改过的参数。RESET ALL; 准备好的语句。 DEALLOCATE ALL 打开的游 …

    更多

  • 故障:页面数据损坏

    2018-11-29 @ 故障

    PostgreSQL是一个很可靠的数据库,但是再可靠的数据库,如果碰上了不可靠的硬件,恐怕也得抓瞎。本文介绍了在PostgreSQL中,应对数据页面损坏的方法。 最初的问题 线上有一套统计库跑离线任务,业务方反馈跑SQL的时候碰上一个错误: ERROR: invalid page in block 18858877 of relation base/16400/275852 看到这样的错误信息,第一直觉就是硬件错误导致的关系数据文件损坏,第一步要检查定位具体问题。 这里,16400是数据库 …

    更多

  • PgSQL关系膨胀处理

    2018-10-06 @ 管理

    前言 PostgreSQL使用了MVCC作为主要并发控制技术,它有很多好处,但也会带来一些其他的影响,例如关系膨胀。关系(表与索引)膨胀会对数据库性能产生负面影响,并浪费磁盘空间。为了使PostgreSQL始终保持在最佳性能,有必要及时对膨胀的关系进行垃圾回收,并定期重建过度膨胀的关系。 在实际操作中,垃圾回收并没有那么简单,这里有一系列的问题: 关系膨胀的原因? 关系膨胀的度量? 关系膨胀的监控? 关系膨胀的处理? 本文将详细说明这些问题。 关系膨胀概述 假设某个关系实际占用存储100G, …

    更多

  • TimescaleDB快速上手

    2018-09-07 @ 管理

    官方网站:https://www.timescale.com 官方文档:https://docs.timescale.com/v0.9/main Github:https://github.com/timescale/timescaledb 为什么使用TimescaleDB 什么是时间序列数据? 我们一直在谈论什么是“时间序列数据”,以及与其他数据有何不同以及为什么? 许多应用程序或数据库实际上采用的是过于狭窄的视图,并将时间序列数据与特定形式的服务器度量值等同起来: Name: CPU …

    更多

  • PipelineDB快速上手

    2018-09-07 @ 管理

    PipelineDB安装与配置 PipelineDB可以直接通过官方rpm包安装。 加载PipelineDB需要添加动态链接库,在postgresql.conf中修改配置项并重启: shared_preload_libraries = 'pipelinedb' max_worker_processes = 128 注意如果不修改max_worker_processes会报错。其他配置都参照标准的PostgreSQL PipelineDB使用样例 —— 维基PV数据 -- 创 …

    更多

  • 故障:序列号溢出

    2018-07-20 @ 故障

    0x01 概览 故障表现: 某张使用自增列的表序列号涨至整型上限,无法写入。 发现表中的自增列存在大量空洞,很多序列号没有对应记录就被消耗掉了。 故障影响:非核心业务某表,10分钟左右无法写入。 故障原因: 内因:使用了INTEGER而不是BIGINT作为主键类型。 外因:业务方不了解SEQUENCE的特性,执行大量违背约束的无效插入,浪费了大量序列号。 修复方案: 紧急操作:降级线上插入函数为直接返回,避免错误扩大。 应急方案:创建临时表,生成5000万个浪费空洞中的 …

    更多

  • 故障:事务号回卷

    2018-07-20 @ 故障

    遇到一次磁盘坏块导致的事务回卷故障: 主库(PostgreSQL 9.3)磁盘坏块导致几张表上的VACUUM FREEZE执行失败。 无法回收老旧事务ID,导致整库事务ID濒临用尽,数据库进入自我保护状态不可用。 磁盘坏块导致手工VACUUM抢救不可行。 提升从库后,需要紧急VACUUM FREEZE才能继续服务,进一步延长了故障时间。 主库进入保护状态后提交日志(clog)没有及时复制到从库,从库产生存疑事务拒绝服务。 摘要 这是一个即将下线老旧库,疏于管理。坏块征兆在一周前就已经出 …

    更多