暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【技术文章】闲话数据库硬件,欢迎各位同学的投稿

云贝教育 2022-04-02
730

点击上方蓝字关注我们吧





01


数据库硬件



一、业务评估


需求

指标

响应时间

查询和写请求ms级返回。

数据总量

1年内数据量大约2T数据量。

每秒请求量

每秒有1.2w次请求。

读写比

读写比是3:1。

重要程度

核心系统,P1级故障。

其他说明

数据具有时效性,历史数据访问较少,。数据记录总体长度大约为1KB。


二、机型测试

  • 性能对比测试

  • 稳定性测试

  • 掉电保护测试

  • 内存异常测试

  • IO设备坏盘和rebuild测试

三、成本评估

  • 设备成本

  • 运维成本

  • 功耗成本

四、CPU

Q:选择 核心数量?or  主频?

A:top命令

如果每个CPU运行的进程数量较少。主频

如果每个CPU都很繁忙,且伴随着多进程并发运行。核心数

PostgreSQL 9.6开始支持并行查询。


五、内存

1、操作的数据量,小于系统的RAM大小。加大内存也不会提升性能。

2、OLAP类型系统,数据量级远大于RAM。高速硬盘。

3、频繁访问的数据相对于内存较大时,可以加大内存提升性能。


六、磁盘

1.1 磁盘1 - 类型

  • 串行口

  • 并行口

  • SATA

  • SCSI

  • SAS

  • SSD


1.2 磁盘2 - RAID

 

1.3 磁盘3 – 机械硬盘、固态硬盘


1.4 磁盘4 – 机械硬盘、固态硬盘


1.5 磁盘5 – 机械硬盘、固态硬盘


1.6 磁盘6 –固态硬盘(NVMe协议接口)

另一个巨变,便是人们对于便携、读写速度的极致追求以及NVMe协议的大范围实施,促使众多厂商纷纷研制基于新标准NVMe的PCIe固态硬盘,进一步加速SATA接口固态硬盘的衰败,可以在预见的未来,有着读写限制的SATA固态必将退出历史舞台。


上图为磁盘控制器
Redundant Array of Inexpensive Disks的缩写,中文称为廉价磁盘冗余阵列。RAID就是一种由多块硬盘构成的冗余阵列。虽然RAID包含多块硬盘,但是在操作系统下是作为一个独立的大型存储设备出现。Raid控制芯片则是指控制执行Raid功能的辅助芯片,常见为Intel ICH5R、VIA VT8237、SIS 964、nVidia nForce3 250GB。

1.7 存储设备

磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。
磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
磁盘阵列还能利用同位检查(Parity Check)的观念,当数组中任意一个硬盘发生故障时,仍可读出数据。在数据重构时,可将数据经计算后重新置入新硬盘中。
存储区域网络 (Storage Area Network, SAN) 是企业最常用的存储网络架构,要求高吞吐量和低延迟的业务关键型业务往往采用这类架构运行。如今,采用全闪存存储的 SAN 部署数量增速迅猛。与旋转磁盘相比,全闪存存储可提供更出色的性能、稳定一致的低延迟以及更低的总成本。SAN 将数据存储在集中式共享存储中,使企业能够运用一致的方法和工具来实施安全防护、数据保护和灾难恢复。





02


硬件基准测试‍



一、概述

当数据库很慢的时候,要根据精确的数据来分析到底是硬件层面的问题,还是软件层面的问题?
基准硬件测试的目的是找出大的配置上的错误,而不是每个可能的参数。
详细优化在数据库和应用层面去做。
一般用户最需要关心的是那种非常明显的问题。

二、Memtest86+

PostgreSQL数据库的数据页面大小为8KB,根据用户的查询需求,相应的数据页面需要被不断地从读取到内存中。访问表中具体行的操作属于CPU密集型操作。在读取非常频繁时,内存的速度对性能的影响非常惊人。
memtest86+ 专业版很强大的一款内存测试软件,小巧,放U盘上很舒服,怀疑自己的内存不稳定导致的系统问题就可以用它来测试,不稳定能体现出来。


三、STREAM

是一套综合性能测试程序集,通过fortran和C两种高级且高效的语言编写完成,由于这两种语言在数学计算方面的高效率, 使得 STREAM 测试例程可以充分发挥出内存的能力。STREAM 测试得到的是可持续运行的内存带宽最大值,而并不是一般的硬件厂商提供的理论最大值。


四、CPU基准测评

  • pgbench

  • \timing

  • generate_seried


五、内存及处理器速度慢的问题!

  • 1.内存插错位置、单通道、双通道问题。

  • 2.内存寻址时序问题。

  • 3.内存不能有效地与CPU的时钟频率相匹配。


六、IOPS

IOPS(Input Output per Second),衡量存储设备的重要指标。
IOPS 总是处于最坏的情况下的数值,这是硬盘能够保证的最低性能,其实磁盘往往会做的更好,尤其是在顺序读写的情况下。


七、提交率

数据能够多快地被写到磁盘上,是数据库事务处理的重要性能因素。
pg_test_fsync 是测试 wal_sync_method设置哪个值最快,还可以在发生认定的 I/O 问题时提供诊断信息。

insert  pgbench


八、硬盘基准测试工具

  • HD Tune  Windows

  • Linux

dd 读取和写入数据块
Bonnie++ 简单I/O测评
是一款文件系统的基准性能自动化测试工具,包括测试文件系统的读写能力、查找能力、创建新文件的能力,它通过一系列的简单测试来生成文件系统的性能参数。其主程序提供两种风格的测试:针对单个文件的数据库风格的访问测试和针对大量小文件的创建和删除来模拟。
  • sysbench

  • pgbench

  • iozone:是一个文件系统的benchmark工具,可以测试不同的操作系统

中文件系统的读写性能。

  • fio:是一个 I/O 工具用来对硬件进行压力测试和验证。


九、磁盘性能预期值

机械硬盘举例~

顺序传输速率,50MBps-100MBps

RAID类型

RAID 0

RAID 1

RAID 10

RAID 5


十、磁盘和阵列速度慢的原因

磁盘性能低下时,多数都是读取数据慢。

1.磁盘驱动器的驱动程序问题。
2.写入慢,检查磁盘驱动器的写缓存配置。
3.RAID控制器的性能成为瓶颈。
4.磁盘阵列和其它服务器之间的数据传输网络问题。


十一、小结

1.定位硬件性能瓶颈。
2.硬件厂家所宣称的性能可能和实际有很大差别。
3.使用各种推荐工具做测试。





03


硬盘设置



一、概述

多数OS的配置都有很多文件系统选项,用于在磁盘中保存信息。在这些选项中进行选择会比较困难,因为这些选项会牵扯到速度和可靠性之间的平衡。类似的,如何设置数据库并将其组件分布在可用的磁盘中也有平衡性的问题,这与速度、可靠性和可用磁盘空间有关。


二、文件系统最大值

1.文件系统的数据结构本身不支持大容量的卷。
2.创建和操作文件系统的工具不能处理过大的容量。
3.需要启动操作系统的磁盘分区不能处理大容量的卷。这种情况需要关注,相对于
问题 1,2主要是独立于文件系统的具体细节行问题。

三、文件系统的崩溃恢复

文件系统写入有两个主要部分,写入磁盘数据块、文件系统元数据更新。(元数据包括目录树、块列表及其与每个文件相关联的属性等)。
可靠性关注的是,写入数据过程中电源中断的情况下会发生什么事情。
1.添加数据块到已用空间元数据列表。
2.写数据块。
3.写引用该块要使用的文件元数据。
-1、2步出错,该数据块可以标记为已使用。

fsck修复工具:

使用man fsck中找到这段解释:check and repair a Linux file system。

从这里可以知道,fsck工具不仅可以做文件系统的检查(扫描),还能修复文件系统,当然fsck所能修复的问题也是有限的,但又不失为一个便捷的自带修复工具。fsck的使用权限必须是root权限。


四、日志文件系统

1.事物开始的元数据写入日志。
2.已使用的空间元数据变更写入日志。
3.数据块变更写入日志。
4.文件元数据变更写入日志。
5.添加数据块到已用空间元数据的列表。
6.写数据块。
7.写引用该块要使用的文件元数据。
8.事物结束的元数据写入日志。
PostgreSQL由数据库负责保护块数据,文件系统负责保护系统元数据。

五、Linux文件系统

  • Ext2

  • Ext3 增加日志

  • Ext4 提升fsync操作

  • Xfs 顺序写、随机写性能较好。

  • JFS 性能接近XFS,稳定性?

  • ReiserFS

  • Btrfs Oralce 赞住的文件系统,目前还没有稳定版本。

六、solaris 10 UFS文件系统

Solaris 10典型的文件系统类型为UFS文件系统,但它也允许在/etc/default/fs中定义其他文件类型。
在Solaris 10上,UFS文件系统驻留在硬盘上,这些硬盘同时具有原始设备接口和块设备接口,这两个接口分别位于/dev/rdsk目录和/dev/dsk目录中。Solaris 10文件系统所创建的每一个分区都在/dev/dsk和/dev/rdsk中有其自己的对应项。一个UFS文件系统的组成包括如下几部分。
引导块(boot block):在文件系统可引导的情况下,引导块中包含有引导数据。
超级块(super block):超级块中包含有关i节点的位置、文件系统大小、块数目,以及状态等信息。
i节点(inode):存储文件系统的文件细节信息。
数据块(data block):实际存储的文件。

七、ZFS文件系统

ZFS(Zettabyte File System)一个打破过去思维的文件系统,是 Sun Microsystems这家公司所开发出来的全新型态文件系统,因为License的问题所以目前只有在Solaris、Mac、BSD上看得到,ZFS是128bit的文件系统。
ZFS 非常的优秀。这是一个真正现代的文件系统,内置的功能对于处理大量的数据很有意义。ZFS 消除了建立传统 RAID 阵列(独立磁盘冗余阵列)的需要。相反,您可以创建 ZFS 池,甚至可以随时将驱动器添加到这些池中。
ZFS 池的行为操作与 RAID 几乎完全相同,但功能内置于文件系统中。
ZFS 也可以替代 LVM (逻辑盘卷管理),使您能够动态地进行分区和管理分区,而无需处理底层的细节,也不必担心相关的风险。这也是一个 CoW (写时复制)文件系统。这里不会提及太多的技术性,这意味着 ZFS 可以保护您的数据免受逐渐损坏的影响。ZFS 会创建文件的校验和,并允许您将这些文件回滚到以前的工作版本。

八、FAT32

FAT32没有日志记录,缺乏安全性,不建议把DB初始化到FAT32文件系统上。


九、NTFS

微软的旗舰文件系统^_^
open_datasync = fsync_writethrough


十、PostgreSQL磁盘布局

pg_wal

-X, --waldir=WALDIR       location for the write-ahead log directory

      --wal-segsize=SIZE    size of WAL segments, in megabytes

软连接 ln –sf  源 目标


表空间

    /home/postgres/tbltest/PG_12_201909212
    12 PG主版本号
    20190921 年月日
    2 续号

    16450链接名称=表空间的OID


    十一、PostgreSQL磁盘布局

    PG_VERSION

    主版本号

    pg_hba.conf

    客户端认证

    pg_ident.conf

    用户名映射

    postgresql.conf

    配置参数

    postgresql.auto.conf

    alter system修改的配置参数

    postmaster.opts

    上次启动的命令行选项

    base/

    每个数据库对应的子目录都存储在此

    global/

    包含pg_database及pg_control等公共文件视图

    pg_commit_ts/

    事物提交时间戳数据

    pg_clog/ (Version 9.6-)

    事物提交状态数据

    pg_dynshmem/

    动态共享内存子系统中使用的文件

    pg_logical/

    逻辑解码状态数据

    pg_multixact/

    多事物状态数据

    pg_notify/

    LISTEN/NOTIFY状态数据

    pg_repslot/

    复制槽数据

    pg_serial/

    已提交的可串行化事物相关信息

    pg_snapshots/

    Pg_export_snapshot在此子目录中创建的快照信息文件

    pg_stat/

    统计子系统的永久文件

    pg_stat_tmp/

    统计子系统的临时文件

    pg_subtrans/

    子事物状态数据

    pg_tblspc/

    表空间的软连接

    pg_twophase/

    两阶段事物的状态文件

    pg_wal/ (Version 10 or later)

    事务日志文件预写日志

    pg_xact/ (Version 10 or later)

    事物提交状态数据

    pg_xlog/ (Version 9.6-)

    9.6版本之前的的事物日志叫法


    十二、PostgreSQL磁盘布局

    位置

    磁盘个数

    RAID级别

    用途

    /

    2

    1

    操作系统

    $PGDATA

    6+

    10

    数据库

    Pg_wal

    2

    1

    WAL

    Tablespace

    1+

    临时文件


    位置

    磁盘个数

    RAID级别

    用途

    /

    12

    10

    操作系统、数据库、WAL


    位置

    磁盘个数

    RAID级别

    用途

                                                            固态硬盘





    04


    数据库缓存


    一、PG配置文件中的内存单位

      $PGDATA/postgresql.conf
      shared_buffers = 128MB # min 128kB
      show shared_buffers;
      select name,setting,unit,current_setting(name) from pg_settings;


      二、OS中的共享内存参数

      2.1 增加共享内存参数以增大共享内存块

        #!/bin/bash
        # simple shmsetup script
        Page_size = `getconf PAGE_SIZE`
        Phys_pages = `getconf _PHYS_PAGES`
        shmall=`expr $phys_pages 2`
        Shmmax = `expr $shmall \* $page_size`
        Echo kernel.shmmax = $shmmax
        Echo kernel.shmall = $shmall

        2.2 内存信号量
        Ipcs命令的输出结果的一部分也显示了共享内存的限制,用户可以用这个命令复查一下共享内存的设置。通过一个核参数可以提高信号量限制,这个内核参数将4个主要限制组合在一起。4个参数顺序依次为 SEMMSL、SEMMNS、SEMOPM、SEMMNI。
          [root@localhost ~]# sysctl kernel.sem
          kernel.sem = 250 32000 32 128
          在有大量进程的操作系统上,需要的信号量很多,所以需要增大这4个参数的值,设置的方式与增大共享内存的方式一样,在/etc/sysctl.conf文件中增大kernel.sem的4个值即可。


          2.3 估算共享内存块的分配
            max_connections
            # min( 2G, (1/4 主机内存)/autovacuum_max_workers ) maintenance_work_mem = 2GB # min 1MB
            # CPU核多,并且IO好的情况下,可多点,但是注意最多可能消耗这么多内存:
            # autovacuum_max_workers * autovacuum mem(autovacuum_work_mem),
            # 会消耗较多内存,所以内存也要有基础。# 当DELETE\UPDATE非常频繁时,建议设置多一点,防止膨胀严重 autovacuum_max_workers = 6 # max number of autovacuum subprocesses # (change requires restart)
            # 建议 min( 512MB, shared_buffers/32 ) wal_buffers = -1
            # 1/4 主机内存 shared_buffers = 24GB # min 128kB # (change requires restart)


            2.4 数据库缓存检查

            pg_buffercache模块提供了一种实时检测共享缓冲区的方法。


            2.5 Pg_buffercache


            2.6 数据库磁盘布局

              postgres=# show data_directory;
              data_directory
              ----------------
              opt/pg_root
              (1 row)


              2.7 创建新的Block

              Usagecount = 1 这意味着一个数据库进程已经访问了该块.


              2.8 写脏块到磁盘

              • 1. 检查点

              • 2. bgwrite


              2.9 检查点处理基础

              • 1. 将事务提交的修改写进disk(写脏数据);保证数据库的完整性和一致性。 

              • 2. 缩短恢复时间,将脏页写入相应的数据文件,确保修改后的文件通过fsync()写入到磁盘。


              2.10 WAL与恢复处理



              2.11 检查点的触发条件

              1.checkpoint_timeout 设置的间隔时间自上一个检查点已经过去(默认间隔为 300 秒(5 分钟))。
              2.在 9.4 或更早版本中,为checkpoint_segments设置的 WAL 段文件的数量自上一个检查点以来已经被消耗默认数量为 3)。
              3.在 9.5 或更高版本中,pg_xlog(在 10 或更高版本中为 pg_wal)中的 WAL 段文件的总大小已超过参数 max_wal_size的值(默认值为 1GB(64 个文件))。
              4.PostgreSQL 服务器在smart或fast模式下停止。
              5.当超级用户手动发出 CHECKPOINT 命令时,它的进程也会这样做。
              6.写入WAL的数据量已达到参数max_wal_size(默认值:1GB)
              7.执行pg_start_backup函数时
              8.在进行数据库配置时(例如CREATE DATABASE DROP DATABASE语句)


              2.12 数据库块的生命周期

              • 1.查询数据库缓冲区。

              • 2.判断是否有对应的数据页面。

              • 3.没有,物理读,在缓冲区中构建物理数据页面。

              • 4.读取或者修改数据块。

              • 5.等待检查点/bgwrite刷新脏快。


              2.13 双重缓存数据

              • OS缓存一份

              • DB缓存一份


              2.14 检查点开销

              如果数据库缓存太大,当检查点启动时,大量数据可能会变成脏数据。
              导致检查点达到IO顶峰。
              结合pg_stat_bgwriter视图来帮助优化。


              2.15 起始大小指导

              # 25% 主机内存

                shared_buffers = xxGB # min 128kB # (change requires restart)



                投稿平台

                http://www.tdpub.cn/‍    欢迎各位同学在TDPUB发表文章~



                文章转载自云贝教育,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论