数据库优化-读写分离

1,概述

  数据库的高可用

  SQLServer读写分离

2,前言

  方案分步,大招分解,一步一步的实现一个系统的大改

3,数据库的高可用

  数据库的高可用本不属于数据库性能优化的一部分;但是有些数据库的高可用方案与性能相关

  数据库的应用场景发展:

  单数据库:

    所有的业务数据放在一个数据库中

    开发效率高

    增删改查效率高

    适合中小型应用

  读写分离(缓解读的压力):

  当业务增长到一定规模,数据量达到一定的限制;数据库的性能已经无法通过增加硬件的方案来解决时;

  此时,我们便可以考虑使用数据库提供的高可用功能,对数据库进行复制副本;这些副本可以是只读的;也可以是可读可写的;

  读写分离则是将读库与读写库分开;一般是,一个读写库,一个读库;只读库与读写库之间进行数据共享(以数据同步的方式实现)

  当应用服务器写数据时,是写入读写库;读写库会将数据同步到只读库上

  注:数据量比较小时,只读库可以换成内存或者redis等缓存;

  如下示意图:

  数据库优化-读写分离

  存在的问题:

    它缓解了读的压力,但是没有缓解写的压力

    增加了数据库的成本

    增加了开发成本和复杂度

    需要确保数据同步不会发生失败

    单个数据库的数据量仍然很大

    随着数据库数量的增加,读写分离会因为副本的增长带来性能上的瓶颈和维护上的难度

    数据同步的成本

  优势:

    读写分离方式的分库在单体应用中操作难度最低

    在单体应用中负面影响较小

    在单体应用中可以解决大部分的读性能(80%的场景是读操作,20%的场景是写操作)

    实现方式比较简单

    缓解读写并发时产生的锁的问题

    系统冗余,保障了数据安全型

    一定程度上提高了数据库的负载能力,也是提高数据库负载能力的最简单可行的方案

  应用场景:

    读大于写的场景

    较大数据量的缓存内存表可以考虑读写分离

    业务上允许一定时间上的延迟(因为读写库与只读库的数据同步需要一定的时间)

    对于一致性要求没那么严格,可以最终一致性

    如果无法容忍延迟:则可以考虑数据从读写库中读取,或者通过集群来处理

  分库(纵向分割,缓解写的压力):

    目的在于缓解写的压力

    将相关业务的表分布到独立的实例上;不同的实例负责不同的业务相关的表的存取;由特定的应用服务去访问特定的实例

    即针对不同的业务进行分库;类似于微服务的业务边界;微服务的划分

    现在已经比较少的【单体应用+业务分库】;单体应用+业务分库

    微服务+业务分库

      这种模式在微服务架构中比较常见;

      一般情况下,业务增长带来数据访问压力而考虑业务分库的同时,也会将应用服务进行拆分;即微服务

      一般情况下,业务增长带来应用服务的并发压力而考虑微服务的同时,也会考虑对数据库进行业务分库

    单体应用+业务分库

      主要是数据的增长的同时,单体应用在技术,或者成本,资源上无法转换成微服务的情况下比较多见

      比较少见,单体应用+业务分库没有优势;一般情况下,业务数据库拆分,应用系统要么进行大改/拆分(微服务);要么使用读写分离分库会更加有优势;

      因为单独的业务分库,而应用不拆分,没有太大的优势

 

  SQLServer2019读写分离:

  这里主要使用的是SQLServer的发布订阅(和Always on是有区别的)来实现;SQL Server有订阅发布的功能,可以实现最简单的读写分离

  主数据库:负责数据的增删改,也可以查询操作;

  从数据库:负责数据的查询操作,它会向发布服务器进行订阅,当发布服务器将主库的操作日志推送过来时,从数据库根据接收到的日志更新从库的数据

    从库不会影响到主库的性能

    从库的个数也不受限制

  发布服务器:主数据库进行增删改操作时,日志会推送到发布服务器上;发布服务器会将日志推送给所有订阅了的从数据库

  

  SQL Server的发布订阅实现分成三步:

    1,创建分发服务器

    2,创建发布数据库

    3,创建订阅数据库

  1,创建分发服务器

    注意,请使用sa账户操作,确保当前用户有权限

    在"对象资源管理器"中,选中"复制";右键点击,选择"配置分发"(复制->属性->配置分发)

    将会弹出配置向导,点击下一步

  数据库优化-读写分离

  数据库优化-读写分离 

    

    配置分发服务器,默认使用当前主机名称,直接下一步

    数据库优化-读写分离

    

    如果你没有Sql server代理服务不是开机启动,向导在当前步骤会弹出询问你是否需要将sql server代理设置为开机启动

    我选择的是【否】,因为是自己的电脑,并不是需要每天使用sql server,也不是经常使用sql server代理作业,所以不需要开机启动

    数据库优化-读写分离

    进入下一步,选择快照文件夹;建议选一个SSD硬盘的分区

      示例:I:\sqlservercache

    数据库优化-读写分离

    进入下一步;配置分发数据库

    这一步我基本上是没有修改,使用的都是默认配置;其中路径是sql server2019安装时配置的数据库默认路径

    数据库优化-读写分离

    进入下一步发布服务器,在这可以看到你刚刚配置的东西

    数据库优化-读写分离

    执行配置,以默认配置往下跑

    数据库优化-读写分离

    数据库优化-读写分离

    数据库优化-读写分离

  2,创建发布数据库

    在"对象资源管理器"中,展开"复制";选择"本地发布",右键点击,选择"新建发布"

    (复制->本地发布->右键->新建发布)

    数据库优化-读写分离

    进入新建发布向导,点击下一步,选择你要发布的数据库

    示例选择的数据库为:Business

    数据库优化-读写分离

    选择发布类型,此处选择的是事务发布

     发布类型说明;

      快照发布:发布服务器按预定的时间间隔向订阅服务器发送已发布数据的快照。同步频率比较低;适合数据量更新多的情况

      事务发布:在订阅服务器收到已发布数据的初始快照后,发布服务器将事务流式传输到订阅服务器;同步频率比较高,适合更新比较频繁的情况

      对等发布:适合多主的发布或者不存在主从;对等发布支持多主复制。发布服务器将事务流式传输到拓扑中的所有对等方。所有对等节点可以读取和写入更改,且所有更改将传播到拓扑中的所有节点。

      合并发布:在订阅服务器收到已发布数据的初始快照后,发布服务器和订阅服务器可以独立更新已发布数据。更改会定期合并。Microsoft SQL Server Compact Edition 只能订阅合并发布。

    数据库优化-读写分离

    选择发布对象;事务发布类型时,主需要发布的表必须具有主键的;

    如下,UserInfo表没有主键时,将无法选择该对象

      数据库优化-读写分离

    UserInfo表添加主键后,选择发布该对象

    数据库优化-读写分离

    筛选表行;用于过滤不需要同步的数据

    当年使用了分区表或者历史表时,你可能会对一些比较少访问的数据不进行过滤

    如2020年之前的历史数据不同步:select .....where createtime>=‘2020-01-01‘

数据库优化-读写分离

    创建快照代理:

      可以指定计划,也可以立即;此处选择的【立即】

    数据库优化-读写分离

    设置快照代理的账户

      在弹出的代理安全性界面中;点击"安全设置"按钮,配置sa账户的,配置完成后点击确定

    数据库优化-读写分离

    数据库优化-读写分离

    进入下一步,默认点击下一步;进入发布名称配置;本处配置的发布名称:Business_Publisher

    数据库优化-读写分离

    数据库优化-读写分离

    点击"完成",执行发布配置;发布时如果没有启动sqlserver代理,会启动失败

    查看配置好的发布数据库

    数据库优化-读写分离

   查看复制监视器,展开本地复制,选中刚刚发布的发布数据库,右键,选中"启动复制监视器";进入复制监视器

   数据库优化-读写分离

     数据库优化-读写分离

  

  3,新建订阅

    本地订阅->右键->新建订阅:进入订阅向导,点击下一步;进入发布选择

    数据库优化-读写分离

    选择发布

    数据库优化-读写分离

    选择订阅模式;默认选择推送订阅

      推送订阅:推模式

      请求订阅:拉模式

    数据库优化-读写分离

    选择订阅对象,添加我们订阅服务器和订阅数据库

    刚刚的发布数据库时Business,因为我是在同一台电脑上做的,此处的订阅数据库是创建了另外一个数据库来订阅[BusinessCopy]

    数据库优化-读写分离

    配置订阅账户,注意因为我是本机测试,所以账户配的与发布数据库一样

    数据库优化-读写分离

    数据库优化-读写分离

    选择同步计划,一般使用连续计划,此处选择连续运行

    数据库优化-读写分离

    余下步骤以默认选项往下配置,在此不描述

    配置好的订阅

      数据库优化-读写分离

    

   注:示例只配置了一个订阅;实际上你可以配置多个订阅

   4,测试

    插入若干数据,查看同步结果,并在复制监视器中查看执行的复制

    注意,同步有一定时间的延迟

    数据库优化-读写分离

    数据库优化-读写分离

 

数据库优化-读写分离

上一篇:php 跨数据库查询


下一篇:mysql 常用数据操作