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,测试
插入若干数据,查看同步结果,并在复制监视器中查看执行的复制
注意,同步有一定时间的延迟