.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (上)

Posted 言00FFCC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (上)相关的知识,希望对你有一定的参考价值。

业务背景:

在业务量增大的情况下,原有操作模式中一个数据库支撑系统的整个业务已经到达了瓶颈,不得不对原有服务器进行硬件升级以达到更好的性能去计算处理逻辑,这极大增加了硬件成本。
数据库的读与写操作了同一个数据库,使得数据量大的查询长时间占用了数据库链接管道,会极大造成数据库表死锁的概率,在没有配合事务的情况很容易导致数据丢失甚至出现脏数据。
在此背景上,对数据库的读、写进行分开处理,是非常有必要。
这种优化方式,称为数据库的主从分离,主数据库仅负责对数据的增、删、改,而从数据库仅针对数据的,以这样的方式来解决日益增长的业务量。

配置数据库主从分离

本文使用的是MSSQL数据库。

首先需要准备两个服务器。当然一个服务器也是可以做到的,只不过效率的提高并不是很大。因为使用的还是同一个服务器的硬件资源。

准备好了服务器,那么就需要对两台服务器的数据库中的数据做一个同步,在主数据库中的修改,需要定时的将数据同步给从数据库中,否则从数据库查询的数据,都是已经过时的数据。MSSQL 提供了发布订阅的方式来实现这种主从数据库的数据同步。

配置本地发布


选择主服务器 > 打开复制 > 选择 本地发布 > 右键选择新建发布.
注意,发布仅允许使用服务器名称。
出现这种错误,有两种解决办法,到指定的服务器上用本地服务器名称登录数据库再发布。
另一种方式,打开 C:\\Windows\\System32\\drivers\\etc 下的 hosts文件,本地代理设置。


如上图设置对应的IP 以及对应的服务器名称 保存即可,这样就可以使用该服务器名称登录了。

这里有个需要注意:配置服务器的IP映射,需要在对应服务器中配置映射,而且在从服务器中,需要配置主服务器的地址映射。例如,从服务器192.168.66.41 需要在hosts文件下添加对主服务器 192.168.66.31的映射

再选择发布就不再提示需要实际的服务器名称才能连接到服务器。
因为我这里配置过了,所以没有显示配置分发服务器的页面。
1、未配置过的就选择当前服务器作为分发服务器即可。
2、并且会要求 启动 SQL Server 代理,直接选择自动启动即可。
3、第三步会提示要求选择保存快照文件的路径,选择对应的路径即可。

接下来选择主数据库。

选择数据库后下一步选择发布类型,一般选择 事务发布 ,该发布类型是基于事务结束后触发,主数据库进行增删改之后的事务提交则自动发布消息供从服务器接收订阅。这种方式有效的保证数据的实时性。

注:读写分离后,数据的实时性是无法百分百保障的,因为主数据库进行写操作后,会将写的操作事务发布到该服务器中,供从服务器订阅,再在从服务器中执行该事务。那么两台服务器之间的网络传输,必定会有一定的耗时。而且这种发布订阅的方式,其中也会产生一定的延迟,具体可搜索相关资料查询这种方式的实现逻辑。

读写分离产生的数据延迟大概是5s到10s。当然,如果要追求数据的实时性,可以查询主数据库,并不是主数据库就不能读了。


下一步选择需要表。勾选需要将数据同步到从数据库的表,也就是发布该表的增删改事务。

仅供参考:对于表的选择,一般选择一些读写比较频繁,且能够容忍数据延时差的表。不经常查询操作的表,完全可以使用作业来同步数据。(作业同步的方式这里不做诉说,与本文无关。) 因为发布订阅的方式也会占用一定的带宽与硬件资源。


选择完成后,下一步筛选表行,直接下一步即可,当然某些字段无需同步的,可在本步骤中剔除。

下一步配置快照执行代理,发布订阅会自动同步数据,但是会出现发布的事务耗时且数据量大的情况,这种时候发布的事务,有可能没时间处理或处理失败,那么这些快照会保存起来,供配置的计划调用重新同步数据。
下一步,设置快照代理

点击安全设置。

点击确认完成

直接下一步

填写发布名称

点击完成创建发布。

如果代理启动失败,会发生报错,发生错误只需要启动服务 SQL server 代理 即可

这样发布就完成了。

配置本地订阅

选择从服务器,打开复制,右键本地订阅>选择新建订阅



下一步选择发布服务器,默认会以本机为发布服务器,这时候需要选择主服务器为发布服务器。



选择刚刚创建的本地发布,下一步

这个简单解释一下,推送订阅与请求订阅的区别。推送订阅为分发服务器的主动推送,当主服务器发生了事务,会主动推送给从服务器,这种方式就是推送。请求订阅为从服务器去请求主服务器,判断是否发生事务,如果发生再从主服务器拉取事务执行。
这里还是一样,为了事务的时效性。选为分发服务器主动发送事务至从服务器。


以当前的从服务器作为订阅服务器,选择新建空数据库。新建完成后选择下一步。

如果订阅服务器为空,点击下方 ‘添加订阅服务器’ 按钮 添加




设置分发代理安全性,完成后点击下一步。

代理计划选择连续运行,直接下一步。

初始化订阅是为了同步表结构以及表数据,选择立即即可。完成后选择下一步。

直接下一步

点击完成创建订阅。


至此本地发布与本地订阅就已经完成。

注意:如果这里没有配置成功,没有同步结构,是因为从服务器hosts没有配置主服务器的IP映射。

测试是否数据有同步


执行插入测试语句。


至此已成功配置了主从数据库,当主数据库的数据发生改变时,从数据库的数据跟着同步改变。

本篇幅有限,仅介绍了数据库负载均衡的前期准备工作,既MSSQL数据库的读写分离配置。在下一篇将介绍几种简单的数据库负载均衡策略。

下一章:负载均衡策略代码层实现

最后,我尽可能详细的去解释介绍如何实现,如果在本文中有错漏之处,请各位大佬们多多指教。如果我的文章能帮到你,也请各位不吝点个赞点个收藏,如果对文中代码有疑问,也请下方评论。谢谢各位看官。

以上是关于.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (上)的主要内容,如果未能解决你的问题,请参考以下文章

.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (下)

.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (下)

.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (上)

.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (上)

.Net 下的数据库主从分离以及简单的几种负载均衡策略代码实现 (上)

Nginx七层负载均衡的几种调度算法