基于MySQL双主的高可用解决方案理论及实践

基于MySQL双主的高可用解决方案理论及实践,第1张

MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段。本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求、各高可用技术特点对比、实施、测试等过程进行整理,完善Mysql高可用方案,同时为后续开展分布式数据库相关测试做相应准备。

存储复制技术: 传统IOE架构下,常用高可用方案,靠存储底层复制技术实现数据的一致性,优点数据安全性有保障,限制在于是依赖存储硬件,实施成本较高。

keepalived+双主复制: 两台MySQL互为主从关系,即双主模式,通过Keepalived配置虚拟IP,实现当其中的一台数据库故障时,自动切换VIP到另外一台MySQL数据库,备机快速接管业务来保证数据库的高可用。

MHA: MHA部署在每台mysql服务器上,定时探测集群中的master节点,当master出现故障时,它可以自动将最新的slave提升为新的master,然后将所有其他的slave重新指向新的master,优点在最大程度保证数据的一致性的前提下实现快速切换,最少需要3台服务器,存在数据丢失的可能性。

PXC: Percona eXtra Cluster是Percona基于galera cluster封装的集群方案。不同于普通多主复制,PXC保障强一致性和实时同步,故障切换更快。但是也需要3个节点,配置相对复杂,对性能也稍有影响。

除了上述方案外,还有MMM、Heartbeat+DRBD等高可用方案,此处不做详细介绍。

综合评估下,本次实施采用了 keepalived+mysql双主实现数据库同城双机房的高可用。MySQL版本为: 5721。 *** 作系统:Red Hat Enterprise Linux Server 73。

配置过程如下:

Mysql-master1: IP地址1 --以下简称master1

Mysql-master2: IP地址2 --以下简称master2

Mysql-vip : VIP地址 --应用连接使用

Mysql复制相关概念描述:

1、 Mysql主从复制图示:

2、 Mysql主从复制过程描述:

(1)master记录二进制日志:在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志。在事务写入二进制日志完成后,master通知存储引擎提交事务。

(2)slave将master的binarylog拷贝到自己的中继日志:首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事务,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事务写入中继日志。

(3)SQL slave thread处理该过程的最后一步:SQL线程从中继日志读取事务,并重放其中的事务而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步至备端。

为了便于后续数据库服务器的扩展,且在整个复制环境中能够自动地切换,降低运维成本,引入了当前主流的基于Mysql GTID的复制特性,工作原理及优缺点简介如下。

3、 GTID工作原理简介:

(1) master更新数据时,会在事务前产生GTID,一同记录到Binlog日志中。

(2) slave的I/O线程将变更的binlog写入到本地的relay log中。

(3) slave的sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。

(4) 如果有记录说明该GTID的事务已经执行,slave会忽略。

(5) 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

(6) 在解析的过程中会判断是否有主键,如果有就用索引,如果没有就用全部扫描。

4、 GTID优点:

(1) 一个事务对应一个唯一的ID,一个GTID在一个服务器上 只会执行一次。(2) GTID是用来替代传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置。

(3) 减少手工干预和降低服务故障时间,当主机宕机之后会通过软件从众多的备机中提升一台备机为新的master。

5、 GTID也存在一些限制:

(1) 不支持非事务引擎。

(2) 不支持create table … select 语句复制(主库直接报错)。

(3) 不允许一个sql同时更新一个事务引擎表和非事务引擎表。

(4) 在一个复制组中,必须要求统一开启GTID或者是统一关闭GTID。

(5) 开启GTID需要重启(57版本除外)。

(6) 开启GTID后,就不再使用原理的传统复制方式。

(7) 不支持create temporary table 和 drop temporary table语句。

(8) 不支持sql_slave_skip_counter。

前置条件:

主备两个节点使用行内统一的安装部署脚本安装mysql5721介质(略)

Master1端创建应用的数据库(略)

1、 修改MySQL配置文件

参考相关配置规范,分别设置master1、master2的mycnf文件,

其中server-id参数设置为不同值;

由于后续keepalived会挂起VIP,应用通过VIP连接数据库,为了避免应用程序无法通过VIP访问,需将两个节点的bind-address参数注释掉;

2、 设置master1端自动半同步模式

Mysql的同步模式主要有如下3种:

a 主从同步复制:数据完整性好,但是性能消耗略高;

b 主从异步复制:性能消耗低,但容易出现不一致;

c 主从半自动复制:介于上述两种之间,既保持了数据的完整性,又提高了性能;

基于上述特性,建议采用半自动同步模式,由于后续要配置为双主模式,因此任一节点其角色既为master又为slave,因此相关的master/slave插件要同时配置,过程如下。

(1) 首先查看库是否支持动态加载(默认都支持)

(2) 主从库上分别安装插件

作为主库,安装插件semisync_masterso

作为从库,安装插件semisync_slaveso

(3) 安装完成后,从plugin表中能够看到刚刚安装的插件

(4) 分别打开主从库半同步复制

同时添加到各自的mycnf中,在后续数据库实例重启时自动加载该配置。

此时查看状态还没有启动

(5) 两个节点分别启动IO进程

(6) 查看半同步状态

3、 将master1设为master2的主服务器

(1)在master1主机上创建授权账户,允许在master2主机上连接

(2)将主库master1数据导出

(3)将mastersql传输到master2上并导入

(4)在master2端将master1设置为自己的主库,并开启slave功能

在master2上查看slave状态

至此master1到master2的主从复制关系已经建立完成。

4、 将master2设为master1的主服务器

在master1上执行

在master1上查看slave状态

1、keepalived相关概念说明:

keepalived是集群管理中保证集群高可用的一个软件解决方案,其功能类似于heartbeat,用来防止单点故障

keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发组播(组播地址为2240018),当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core 、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责 健康 检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。同时为了避免出现脑裂,应关闭防火墙或者开启防火墙但允许接收VRRP协议。

2、keepalived的安装配置

(1)配置本地yum源,在master1和master2两台服务器上安装keepalived的相关依赖包Kernel-devel/openssl-devel/popt-devl等

配置指向rhel-75iso的yum本地源,步骤略

注意:如不知道keepalived需要哪些依赖包,可到下载后的源码解压目录下查看INSTALL 文件内容,安装需要的依赖包,源码安装任何一个软件都要养成查看源码包文档的习惯,比如INSTALL,README,doc等文档,可以获得很多有用的信息。

(2)在两台mysql上解压缩并编译安装keepalived

(3)master1、master2上分别配置keepalivedconf

注意上图红色字体中两个节点配置相同处及差异。

说明:keepalived只有一个配置文件keepalivedconf,里面主要包括以下几个配置区域:

· global_defs:主要是配置故障发生时的通知对象以及机器标识。

· vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性。

· virtual_server:虚拟服务器定义

(4)同时两个节点上都需要添加检测脚本

作用:是当mysql停止工作时自动关闭本机的keeplived服务,从而实现将故障主机踢出热备组,因每台机器上keepalived只添加了本机为realserver,所以当mysqld正常启动后,我们还需要手动启动keepalived服务。

(5)分别启动两个节点的keepalived服务

检查两个节点keepalived启动进程

检查两个节点的vip挂载情况

(6)主备机故障切换测试

停止master2的mysql服务,看keepalived 健康 检查程序是否会触发脚本,自动进行故障切换,步骤略

查看master1节点的VIP挂载情况,验证是否实现了自动切换,步骤略

说明在master2服务器的mysql服务发生故障时,触发了脚本,自动完成了切换。

(7)现在我们把master2的mysql服务开起来,并且keepalived的服务也需要启动。

即便master2的mysql服务和keepalived服务都重新开启了,master1仍然是主master了,master2未对主master的权利进行抢夺,说明设置的nopreempt参数生效了,为了保证群集的稳定性,生产环境不允许抢占配置,只有当master1的mysql服务坏掉的时候,master2才会再次成为主master,否则它永远只能当master1的备份。(注:nopreempt一般是在优先级高的mysql上设置)

Sysbench是一个模块化的、跨平台、多线程基准测试工具,可用于评估数据库负载情况,通过sysbench命令配置IP地址、端口号、用户名、密码连接到指定的数据库db1中,创建多个表,并快速插入指定条数的记录,观察主备库同步效率

(1) 下载开源工具sysbench-041214targz,放置在相应目录下并解压

(2) 使用iso配置本地yum源并安装Sysbench如下的依赖包(步骤略):autoconf/automake/cdbs/debhelper(>=9)/docbook-xml/docbook-xsl/libmysqlclient15-dev/libtool/xsltproc

(3) 编译sysbench

编辑配置文件/etc/ldsoconf中添加mysql lib目录/mysql/app/5721/lib,并执行命令ldconfig生效

(4) 执行sysbench压测

使用sysbench工具向主节点的db1数据库中创建5张表,并且每张表分别插入10万条记录

同时观察备机同步效率

几个重要的参数说明:

B、半自动同步模式、异步模式切换测试

(1) 检查主备同步状态,及同步参数设置

rpl_semi_sync_master_enabled参数表示启用半同步模式;

rpl_semi_sync_master_timeout参数单位为毫秒,表示主库事务等待从库返回commit成功信息超过10秒就降为异步模式,不再等待从库,等探测到从库io线程恢复后,再返回为半自动同步;

rpl_semi_sync_master_wait_no_slave参数表示事务提交后需要等待从库返回确认信息;

(2) 将slave的io线程停止

(3) 使用sysbench向master写入少量的数据,本例创建一张表,并插入10条记录,命令包装在1sh测试脚本中

通过记录的时间戳发现,master在等待了slave10秒无响应,自动切换为异步模式,将数据写入本地。

(4) Slave启动io线程,数据自动追平

至此MySQL主主复制配置完成,运行在半自动同步模式,通过keepalived实现Mysql的HA高可用。

上线后应符合统一的标准监控策略,添加备份协议对数据进行周期备份并保存到带库中,以及定期的数据恢复测试。

由于是靠keepalived实现的高可用,还应将如下资源添加到监控管理平台:

1、 对每台数据库主机的3个keepalived进程进行监控;

2、 对主备节点的io线程、sql线程工作状态进行监控;

是的。pg数据库支持集群间数据同步的。

实现数据库集群同步的原理简述:是采用一主多从式集群方式,通过在主服务器和从服务器上建立同步节点,设置远程访问路径,启动监听进程进行监听,当主服务器进行了修改 *** 作时,通过触发器触发,从进程进行异步修改来达到数据库同步。

问题1:

首先认清楚:集群是个物理形态,分布式是个工作方式。

分布式:一个业务分拆多个子业务,部署在不同的服务器上;

集群:同一个业务,部署在多个服务器上。

问题2:

跨机房要根据网络线上IP数据同步 如果同步到当前 *** 作电脑必须 对方IP必须能通 ,然后在进行相关 *** 作!(比如日志同步数据 、工具同步数据、触发器存储过程同步数据等)

问题3:

oralce、MySQL等(具体要看你做那些分布式 *** 作)

用雪花算法的工具类,1秒内可以生成26万不重复的值,数据库的主键不要自增,手动设置

package entity;

import javalangmanagementManagementFactory;

import javanetInetAddress;

import javanetNetworkInterface;

/

  <p>名称:IdWorkerjava</p>

  <p>描述:分布式自增长ID</p>

  <pre>

      Twitter的 Snowflake JAVA实现方案

  </pre>

  核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:

  1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000

  在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,

  然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),

  然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。

  这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),

  并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。

  <p>

  64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))

 

  @author Polim

 /

public class IdWorker {

    // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)

    private final static long twepoch = 1288834974657L;

    // 机器标识位数

    private final static long workerIdBits = 5L;

    // 数据中心标识位数

    private final static long datacenterIdBits = 5L;

    // 机器ID最大值

    private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);

    // 数据中心ID最大值

    private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

    // 毫秒内自增位

    private final static long sequenceBits = 12L;

    // 机器ID偏左移12位

    private final static long workerIdShift = sequenceBits;

    // 数据中心ID左移17位

    private final static long datacenterIdShift = sequenceBits + workerIdBits;

    // 时间毫秒左移22位

    private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    private final static long sequenceMask = -1L ^ (-1L << sequenceBits);

    / 上次生产id时间戳 /

    private static long lastTimestamp = -1L;

    // 0,并发控制

    private long sequence = 0L;

    private final long workerId;

    // 数据标识id部分

    private final long datacenterId;

    public IdWorker(){

        thisdatacenterId = getDatacenterId(maxDatacenterId);

        thisworkerId = getMaxWorkerId(datacenterId, maxWorkerId);

    }

    /

      @param workerId

                 工作机器ID

      @param datacenterId

                 序列号

     /

    public IdWorker(long workerId, long datacenterId) {

        if (workerId > maxWorkerId || workerId < 0) {

            throw new IllegalArgumentException(Stringformat("worker Id can't be greater than %d or less than 0", maxWorkerId));

        }

        if (datacenterId > maxDatacenterId || datacenterId < 0) {

            throw new IllegalArgumentException(Stringformat("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));

        }

        thisworkerId = workerId;

        thisdatacenterId = datacenterId;

    }

    /

      获取下一个ID

     

      @return

     /

    public synchronized long nextId() {

        long timestamp = timeGen();

        if (timestamp < lastTimestamp) {

            throw new RuntimeException(Stringformat("Clock moved backwards  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));

        }

        if (lastTimestamp == timestamp) {

            // 当前毫秒内,则+1

            sequence = (sequence + 1) & sequenceMask;

            if (sequence == 0) {

                // 当前毫秒内计数满了,则等待下一秒

                timestamp = tilNextMillis(lastTimestamp);

            }

        } else {

            sequence = 0L;

        }

        lastTimestamp = timestamp;

        // ID偏移组合生成最终的ID,并返回ID

        long nextId = ((timestamp - twepoch) << timestampLeftShift)

                | (datacenterId << datacenterIdShift)

                | (workerId << workerIdShift) | sequence;

        return nextId;

    }

    private long tilNextMillis(final long lastTimestamp) {

        long timestamp = thistimeGen();

        while (timestamp <= lastTimestamp) {

            timestamp = thistimeGen();

        }

        return timestamp;

    }

    private long timeGen() {

        return SystemcurrentTimeMillis();

    }

    /

      <p>

      获取 maxWorkerId

      </p>

     /

    protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {

        StringBuffer mpid = new StringBuffer();

        mpidappend(datacenterId);

        String name = ManagementFactorygetRuntimeMXBean()getName();

        if (!nameisEmpty()) {

            /

              GET jvmPid

             /

            mpidappend(namesplit("@")[0]);

        }

        /

          MAC + PID 的 hashcode 获取16个低位

         /

        return (mpidtoString()hashCode() & 0xffff) % (maxWorkerId + 1);

    }

    /

      <p>

      数据标识id部分

      </p>

     /

    protected static long getDatacenterId(long maxDatacenterId) {

        long id = 0L;

        try {

            InetAddress ip = InetAddressgetLocalHost();

            NetworkInterface network = NetworkInterfacegetByInetAddress(ip);

            if (network == null) {

                id = 1L;

            } else {

                byte[] mac = networkgetHardwareAddress();

                id = ((0x000000FF & (long) mac[maclength - 1])

                        | (0x0000FF00 & (((long) mac[maclength - 2]) << 8))) >> 6;

                id = id % (maxDatacenterId + 1);

            }

        } catch (Exception e) {

            Systemoutprintln(" getDatacenterId: " + egetMessage());

        }

        return id;

    }

    public static void main(String[] args) {

        //推特  26万个不重复的ID

        IdWorker idWorker = new IdWorker(0,0);

        for (int i = 0; i <2600 ; i++) {

            Systemoutprintln(idWorkernextId());

        }

    }

}

数据库优化是系统工程,性能的提升靠整体。本课程将面面俱到的讲解提升数据库性能的各种因素,让你在最短的时间从小白到资深,将数据库整体架构了然于胸

第1章 实例和故事 试看7 节 | 50分钟

决定电商11大促成败的各个关键因素。

收起列表

视频:1-1 什么决定了电商双11大促的成败 (04:04)试看

视频:1-2 在双11大促中的数据库服务器 (06:03)

视频:1-3 在大促中什么影响了数据库性能 (07:55)

视频:1-4 大表带来的问题 (14:13)

视频:1-5 大事务带来的问题 (17:27)

作业:1-6 讨论题在日常工作中如何应对高并发大数据量对数据库性能挑战

作业:1-7 讨论题在MySQL中事务的作用是什么?

第2章 什么影响了MySQL性能 试看30 节 | 210分钟

详细介绍影响性能各个因素,包括硬件、 *** 作系统等等。

收起列表

视频:2-1 影响性能的几个方面 (04:08)试看

视频:2-2 CPU资源和可用内存大小 (10:54)

视频:2-3 磁盘的配置和选择 (04:44)

视频:2-4 使用RAID增加传统机器硬盘的性能 (11:30)

视频:2-5 使用固态存储SSD或PCIe卡 (08:35)

视频:2-6 使用网络存储SAN和NAS (07:16)

视频:2-7 总结:服务器硬件对性能的影响 (03:27)

视频:2-8 *** 作系统对性能的影响-MySQL适合的 *** 作系统 (03:50)

视频:2-9 CentOS系统参数优化 (11:43)

视频:2-10 文件系统对性能的影响 (03:29)

视频:2-11 MySQL体系结构 (05:29)

视频:2-12 MySQL常用存储引擎之MyISAM (13:23)

视频:2-13 MySQL常用存储引擎之Innodb (10:44)

视频:2-14 Innodb存储引擎的特性(1) (15:24)

视频:2-15 Innodb存储引擎的特性(2) (08:44)

视频:2-16 MySQL常用存储引擎之CSV (09:19)

视频:2-17 MySQL常用存储引擎之Archive (06:08)

视频:2-18 MySQL常用存储引擎之Memory (10:40)

视频:2-19 MySQL常用存储引擎之Federated (11:21)

视频:2-20 如何选择存储引擎 (04:33)

视频:2-21 MySQL服务器参数介绍 (08:04)

视频:2-22 内存配置相关参数 (09:24)

视频:2-23 IO相关配置参数 (10:01)

视频:2-24 安全相关配置参数 (06:13)

视频:2-25 其它常用配置参数 (03:41)

视频:2-26 数据库设计对性能的影响 (04:36)

视频:2-27 总结 (01:32)

作业:2-28 讨论题你会如何配置公司的数据库服务器硬件?

作业:2-29 讨论题你认为对数据库性能影响最大的因素是什么

作业:2-30 讨论题做为电商的DBA,建议开发选哪种MySQL存储引擎

第3章 MySQL基准测试8 节 | 65分钟

了解基准测试,MySQL基准测试工具介绍及实例演示。

收起列表

视频:3-1 什么是基准测试 (02:20)

视频:3-2 如何进行基准测试 (09:00)

视频:3-3 基准测试演示实例 (11:18)

视频:3-4 Mysql基准测试工具之mysqlslap (13:30)

视频:3-5 Mysql基准测试工具之sysbench (11:07)

视频:3-6 sysbench基准测试演示实例 (17:11)

作业:3-7 讨论题MySQL基准测试是否可以体现出业务系统的真实性能

作业:3-8 实 *** 题参数不同取值对性能的影响

第4章 MySQL数据库结构优化14 节 | 85分钟

详细介绍数据库结构设计、范式和反范式设计、物理设计等等。

收起列表

视频:4-1 数据库结构优化介绍 (06:52)

视频:4-2 数据库结构设计 (14:49)

视频:4-3 需求分析及逻辑设计 (11:00)

视频:4-4 需求分析及逻辑设计-反范式化设计 (06:44)

视频:4-5 范式化设计和反范式化设计优缺点 (04:06)

视频:4-6 物理设计介绍 (05:17)

视频:4-7 物理设计-数据类型的选择 (18:59)

视频:4-8 物理设计-如何存储日期类型 (13:37)

视频:4-9 物理设计-总结 (02:37)

图文:4-10 说明MyISAM和Innodb存储引擎的5点不同

作业:4-11 讨论题判断表结构是否符合第三范式要求如不满足要如何修改

作业:4-12 实 *** 题请设计一个电商订单系统的数据库结构

作业:4-13 讨论题以下那个字段适合作为Innodb表的主建使用

作业:4-14 讨论题请为下表中的字段选择合适的数据类型

第5章 MySQL高可用架构设计 试看24 节 | 249分钟

详细介绍二进制日志及其对复制的影响、GTID的复制、MMM、MHA等等。

收起列表

视频:5-1 mysql复制功能介绍 (04:58)

视频:5-2 mysql二进制日志 (22:05)

视频:5-3 mysql二进制日志格式对复制的影响 (09:37)

视频:5-4 mysql复制工作方式 (03:08)

视频:5-5 基于日志点的复制 (20:06)

视频:5-6 基于GTID的复制 (22:32)

视频:5-7 MySQL复制拓扑 (13:58)

视频:5-8 MySQL复制性能优化 (09:23)

视频:5-9 MySQL复制常见问题处理 (08:31)

视频:5-10 什么是高可用架构 (14:09)

视频:5-11 MMM架构介绍 (08:09)

视频:5-12 MMM架构实例演示(上) (09:16)试看

视频:5-13 MMM架构实例演示(下) (18:55)

视频:5-14 MMM架构的优缺点 (08:01)

视频:5-15 MHA架构介绍 (10:02)

视频:5-16 MHA架构实例演示(1) (13:11)

视频:5-17 MHA架构实例演示(2) (16:54)

视频:5-18 MHA架构优缺点 (05:14)

视频:5-19 读写分离和负载均衡介绍 (11:42)

视频:5-20 MaxScale实例演示 (18:25)

作业:5-21 讨论题MySQL主从复制为什么会有延迟,延迟又是如何产生

作业:5-22 实 *** 题请为某互联网项目设计9999%MySQL架构

作业:5-23 讨论题如何给一个已经存在的主从复制集群新增一个从节点

作业:5-24 讨论题给你三台数据库服务器,你如何设计它的高可用架构

第6章 数据库索引优化8 节 | 65分钟

介绍BTree索引和Hash索引,详细介绍索引的优化策略等等。

收起列表

视频:6-1 Btree索引和Hash索引 (20:09)

视频:6-2 安装演示数据库 (01:19)

视频:6-3 索引优化策略(上) (17:33)

视频:6-4 索引优化策略(中) (13:02)

视频:6-5 索引优化策略(下) (12:30)

作业:6-6 讨论题一列上建立了索引,查询时就一定会用到这个索引吗

作业:6-7 讨论题在定义联合索引时为什么需要注意联合索引中的顺序

作业:6-8 实 *** 题SQL建立索引,你会考虑那些因素

第7章 SQL查询优化9 节 | 62分钟

详细介绍慢查询日志及示例演示,MySQL查询优化器介绍及特定SQL的查询优化等。

收起列表

视频:7-1 获取有性能问题SQL的三种方法 (05:14)

视频:7-2 慢查询日志介绍 (08:57)

视频:7-3 慢查询日志实例 (08:27)

视频:7-4 实时获取性能问题SQL (02:21)

视频:7-5 SQL的解析预处理及生成执行计划 (16:02)

视频:7-6 如何确定查询处理各个阶段所消耗的时间 (09:35)

视频:7-7 特定SQL的查询优化 (10:34)

作业:7-8 讨论题如何跟据需要对一个大表中的数据进行删除或更新

作业:7-9 讨论题如何获取需要优化的SQL查询

第8章 数据库的分库分表5 节 | 48分钟

详细介绍数据库分库分表的实现原理及演示案例等。

收起列表

视频:8-1 数据库分库分表的几种方式 (04:34)

视频:8-2 数据库分片前的准备 (13:53)

视频:8-3 数据库分片演示(上) (11:40)

视频:8-4 数据库分片演示(下) (17:02)

作业:8-5 讨论题对于大表来说我们一定要进行分库分表吗

第9章 数据库监控7 节 | 29分钟

介绍数据库可用性监控、性能监控、MySQL主从复制监控等

收起列表

视频:9-1 数据库监控介绍 (04:46)

视频:9-2 数据库可用性监控 (07:20)

视频:9-3 数据库性能监控 (09:39)

视频:9-4 MySQL主从复制监控 (06:16)

作业:9-5 讨论题QPS是否可以真实的反映出数据库的负载情况

作业:9-6 讨论题如何正确评估数据库的当前负载状况

作业:9-7 实 *** 题开发一个简单监控脚本,监控mySQL数据库阻塞情况

以上就是关于基于MySQL双主的高可用解决方案理论及实践全部的内容,包括:基于MySQL双主的高可用解决方案理论及实践、pg怎么两个库关联在一起、分布式数据库 与 集群数据库 之间的关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10160952.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存