MySQL高可用之MHA安装,备份与恢复系列二

一. 前言

   对于sql server 这个产品来说,内存这块是最重要的一个资源, 当我们新建一个会话,相同的sql语句查询第二次查询时间往往会比第一次快,特别是在sql统计或大量查询数据输出时,会有这么感觉。除了第一次要编译生成执行计划,  在CPU,I/O 的影响外,最主要的是第二次查询是从内存缓存中读出,为什么是这样,sql server 内存里存储了什么,它与windows内存又有什么区别?  参考了一些资料 下面来试着讲讲。    

  1.1  日志文件与数据文件一致性

 

二. 内存和硬盘

         为什么内存是宝贵的,在每个系统上都是有限的,就像你看到的1 tb的硬盘,但是你通常看到的是50-200 G的内存, 物理内存的访问速度非常快,不能超过一定的限制。在内存有限的情况下,如果所有的进程都使用了有限的内存,并且新的进程将无法为他们找到任何内存,这就出现了虚拟地址空间的概念(也称为VAS)。

 在上一章备份与恢复里了解到事务日志的重要性,这篇重点来了解事务日志。 事务日志记录了数据库所有的改变,能恢复该数据库到改变之前的任意状态。在sql server实例每次启动时都会去检查数据文件与日志文件的一致性。 包括日志记录的任何已提交的数据必须体现在数据文件上,未被标记为已提交的将禁止写入数据文件,日志还存储了收到客户端回滚事务请求,sqlserver出错如死锁等,日志产生一个rollback命令。

Preface

  Virtual Address Space(虚拟地址空间)

    是指一个应用程序能够申请访问的最大地址空间。32位寻址空间最大是4G,   64位寻址空间最大是8TB。

    VAS作为中间的抽象层的,  不是所有的请求都直接映射到物理内存,它首先映射到VAS然后映射到物理内存。因此,它可以更协调的方式管理对内存的请求,而不是让进程去做,如果不是这样,它很快就会导致内存崩溃。

    在Windows操作系统中,VAS 的内核进程与用户进程之间的划分是相同的。对于32位系统,最大的VAS 是4 G的内核/ 2 G到应用程序的中,在这里,SQL Server是应用程序进程,当我使用word进程时,它意味SQL Server进程差不多一样,将得到2 G的VAS。因此,从理论上讲,这意味着任何应用程序进程在32位上运行的都将拥有最大限度的2 G。

   事务日志是在数据库创建或改变时与数据库关联起来的一个或多个文件。 任务改变数据库的操作都会在事务日志中写入描述这些改变的记录,包括要改变的页码,增加或删除的数据值,事务信息,起止的日期和时间信息等。通过dbcc log可以看到如下信息

 

三 sql server 内存 架构

             sql server 内存管理,在sql server 2012发生了重大改变,对内存重新实现了一遍。  先看下版本之间内存管理图的区别

              图片 1图片 2

图片 3

    MasterHA is a tool which can be used in MySQL HA architecture.I'm gonna implement it and have some tests depend on it later.

    名词术语 

  sql server里每个日志记录都有一个唯一的日志序列号标识LSN, 同一个事务里的所有日志记录是一个连接起来的整体,这样能够容易的定位一个事务的各个部分,从而实现撤销undo或重做redo操作。

 

   3.1 BufferPool      

    SQL Server使用BufferPool缓冲池来有效地管理SQL Server进程的内存请求。它是SQL Server的最大内存消耗者。缓冲区是内存中的一个8 KB的页面,与数据或索引页面大小相同,您可以将缓冲区看作是一个框架,它在从磁盘到内存的时候保存数据和索引页。

    SQL Server缓冲区管理器管理将数据页读入缓冲池的任务,并将其写入磁盘。它是SQL Server的预留内存存储,如果您不为它设置值,它将占用尽可能多的内存。因此,在spconfigure中为max server内存设置最佳值总是被推荐为一种良好的实践。缓冲池只将内存分配给需要少于8 KB页面的请求。

    对于大于8 KB内存的所有请求,都是由windows API直接分配的。所有缓存存储计划、数据和索引页都存储在这个缓冲池中。当用户请求row/rows时,如果缓冲区池中没有,则使该页面从磁盘进入内存。这种输入/输出可能在繁忙的系统上特别昂贵,因此尽可能减少SQL服务器缓存的大小,这可能会被用户看作是内存泄漏或SQL Server占用大量内存,但实际上它提高了性能,实际上这个特性是通过设计实现的。

    下面这些内存不是来自缓冲池:
      SQL LCR
      扩展存储过程
      链接服务器分配的内存
      内存管理器完成的大页面分配(大页面为任意页面>8 KB)
      COM对象

  1.2 优先写日志

Framework

MySQL高可用之MHA安装,备份与恢复系列二。         3.2   single-page 

                     这块内存是<=8kb 的存储,适用于sql server 2008及以前, 属于buffer pool 缓冲池来分配。有存储数据页面,Consumer功能组件。

  在日志里有个名词叫“优先写日志”。是指:缓存管理器能够保证日志写入磁盘优先于相应的数据改变写入磁盘,这叫优先写日志。一旦某个数据页发生改变,相应的日志项的LSN将会被写入该数据页的页头,缓存管理器能够保证日志页以特定的顺序写入磁盘,使得无论故障在何时发生,sqlserver 能清楚知道在系统故障之后应该处理哪些日志块。如下图所示

 

         3.3 multi- page

                     这块内存是>8kb的 存储,适用于sql server 2008及以前, 不属于buffer pool 缓冲池来分配,  有存储Consumer功能组件, 第三方代码, Threads线程。

图片 4

Hostname IP Port Identity OS Version MySQL Version
zlm2 192.168.1.101 3306 master CentOS 7.0 5.7.21
zlm3 192.168.1.102 3306 slave/mha-manager CentOS 7.0 5.7.21
null 192.168.1.200 null vip null null

      3.4  any size page

                      这个适用于sql server 2012及以上,整合了single-page,multi-page 统称pages。

   但一个事务日志记录被写入到磁盘,实际上被更改的数据可能还未来得及写入数据页,对于事务日志写操作是异步的,数据页的写操作也是异步的,但数据页不需要立即完成,因为日志包含了用来重做这些写操作的所有信息。

 

  四. sql server 2008 内存

                    从内存图我们可以看到有 page reservation  需预先申请的内存, 有momory objects 从windows api申请的内存,  有clr第三方申请的内存。

  1.3 日志文件与重启恢复
  在sqlserver错误日志 error log 里会报告每个数据库重启恢复的进展,它会告诉我们每一个数据库有多少事务被前滚,多少事务被回滚, 有时被称为“崩溃”恢复,因为sqlserver崩溃或服务异常停止,需要恢复过程在服务重启时运行。 如果sqlserver里 事务日志与数据文件一致,则重启服务很快。

Procedure

        内存的分类方式有很多,下面介绍三种方式:

    图片 5

 

  1. 按用途分类 

                 1.1 Database Cache(数据页面缓冲区)

                          当用户修改了某个页面上的数据时,sql server会在页存中将这个页修改。但不会立刻将这个页面写回硬盘,而是等后面的checkpoint 或lazy write集中处理。

                 1.2 各类Consumer功能组件

                            Connection 连接:包括输入缓冲池和输出缓冲池, 用来存储用户指令和返回结果。

                            General :一组大杂烩: 语句,语句编译,范式化,锁数据结构,事务上下文,表格,索引的元数据等。

                            Query paln:语句和存储过程的执行计划。

                            Optimizer:sql server在生成执行计划的过程中需要消耗的内存。

                            Utilities:像BCP, Log Manager,Parallel Queries,Backup

                 1.3    线程内存

                             为每个线程分配0.5MB的内存

                 1.4    第三方代码申请的内存

        如用户定义的CLR,Linked Server分布式查询从远程数据库取回大量数据。

  1.4 日志文件redo与undo

Downlaod the rpm package of MasterHA using below web link first:

  2. 按申请方式分类

      申请方式是指要先预先Reserve一块大的内存,然后再一小块一小块的commit。对Database Cache是会先Reserve,再commit。

    其他所有内存使用,基本都是直接commit,都叫Stolen。

  如果事务在提交时,sql server服务突然停止,数据还未来得及写入数据页(注意不是磁盘),当服务启动,该事务必须前滚,根据事务日志所指示的更改来重做事务,这称为恢复的重做(redo)阶段。

https://code.google.com/archive/p/mysql-master-ha/downloads

本文由澳门新葡亰平台官网发布于数据库,转载请注明出处:MySQL高可用之MHA安装,备份与恢复系列二

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。