主从模式,几乎大部分出名的数据库都支持的一种集群模式。

当Web站点的访问量上去之后,很多站点,选择读写分离,减轻主数据库的的压力。当然,一主多从也可以作用多个功能,比如备份。这里主要演示如何实现从数据库集群的读负载均衡

搭建一主三从的MSSQL集群

192.168.99.250  //主服务器

192.168.99.8  //从服务器(WIN-6S3JNU8C4TB)
192.168.99.10  //从服务器(WIN-HF1GQ5U288H)
192.168.99.11  //从服务器(WIN-EAPJ2QB5AGM)

本地发布

一般而言,我们只需要安装数据库引擎服务即可。复制服务需要另外安装,所以我们进行发布/订阅模式的话,需要安装复制组件

192.168.99.250 主服务器发布数据同步,接三台从服务器订阅发布。

本地订阅

同样本地订阅,也需要安装复制组件。

模拟写数据

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using System.Text;
using System.Linq;

namespace Write
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始写入模拟数据");
            var ef = new EFDbContext();
            var rand = new Random();
            StringBuilder str1 = new StringBuilder();
            str1.Append("赵、钱、孙、李、周、吴、郑、王、冯、陈、楮、卫、蒋、沈、韩、杨、朱、秦、尤、许、何、吕、施、张、孔、曹");
            var familyNameItems = str1.ToString().Split("、");

            StringBuilder str2 = new StringBuilder();
            str2.Append("宏子 婷婷 蓉蓉 丽娜 娜 钰 天霞 官君 红梅 淑慧 海娟 洪山 ");
            str2.Append("盼丽 艳红 甜甜 璨 彬彬 银红 晨曦 婷 广荣 蓓 小艳 欣如 辅仁 嘉 雯婷 玉红 晨霞 ");
            str2.Append("涵 明 丽娜 青 茵 瑞微 逸群 思阳 臻 勇 志光 克涛 靖华 慧霞 卫伟 藜文 清华 莎 晓新 ");
            str2.Append("安安 荌荌 安卉 安娜 安妮 安然 傲冬 傲晴 傲雪 白雪 白云 碧螺 碧菡 碧玉 冰蓝 ");
            str2.Append("含烟 含玉 涵菡 晗蕾 涵韵 晗玥 寒凝 寒香 寒雁 和悌 和美 和怡 和雅 和璧 和玉 ");
            str2.Append("红螺 虹雨 虹彩 虹英 虹颖 虹影 怀玉 慧心 慧颖 慧雅 慕青 问兰 尔岚 元香 曼文");
            var firstNameItems = str2.ToString().Split(" ");

            while (true)
            {
                , ).ToString();
                ef.OAUser.Add(new OAUser
                {
                    UserName = userName,
                    PassWord = ",
                    Salt = rand.Next(, ).ToString(),
                    NickName = familyNameItems[rand.Next(, familyNameItems.Count())]
                    + firstNameItems[rand.Next(, firstNameItems.Count())],
                    IsFrozen = false,
                    CreateTime = DateTime.Now
                });
                ef.SaveChanges();
                Console.WriteLine($"成功将用户{userName}资料写入");
            }
        }
    }

    public class EFDbContext : DbContext
    {
        public EFDbContext()
        {
            base.ChangeTracker.AutoDetectChangesEnabled = false;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Data Source=192.168.99.250;Initial Catalog=Test;User Id=sa;Password=123;",
                n => n.UseRowNumberForPaging());
        }

        /// <summary>
        /// 用户表
        /// </summary>
        public DbSet<OAUser> OAUser { set; get; }
    }

    /// <summary>
    /// 用户表
    /// </summary>
    [Table("OAUser")]
    public class OAUser
    {
        /// <summary>
        /// 主健
        /// </summary>
        [Key]
        public int Id { set; get; }

        /// <summary>
        /// 用户账号
        /// </summary>
        [Required, MaxLength(), MinLength()]
        public string UserName { set; get; }

        /// <summary>
        /// 用户密码
        /// </summary>
        [Required, StringLength()]
        public string PassWord { set; get; }

        /// <summary>
        /// 昵称
        /// </summary>
        [Required, StringLength()]
        public string NickName { get; set; }

        /// <summary>
        /// 加密盐
        /// </summary>
        [Required, StringLength()]
        public string Salt { set; get; }

        /// <summary>
        /// 是否冻结
        /// </summary>
        public bool IsFrozen { set; get; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { set; get; }
    }
}

搭建NLB集群

192.168.99.120 //公共IP

192.168.99.8
192.168.99.10
192.168.99.11

模拟读取数据库

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using System.Text;
using System.Linq;

namespace Read
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("模拟大量读取");
            var ef = new EFDbContext();
            ;
            )
            {
                i++;
                ).FirstOrDefault();
                Console.WriteLine($"读取用户{user.UserName}资料");
            }
            Console.WriteLine("读取完毕");
        }
    }

    public class EFDbContext : DbContext
    {
        public EFDbContext()
        {
            base.ChangeTracker.AutoDetectChangesEnabled = false;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Data Source=192.168.99.120;Initial Catalog=oa;User Id=sa;Password=123;",
                n => n.UseRowNumberForPaging());
        }

        /// <summary>
        /// 用户表
        /// </summary>
        public DbSet<OAUser> OAUser { set; get; }
    }

    /// <summary>
    /// 用户表
    /// </summary>
    [Table("OAUser")]
    public class OAUser
    {
        /// <summary>
        /// 主健
        /// </summary>
        [Key]
        public int Id { set; get; }

        /// <summary>
        /// 用户账号
        /// </summary>
        [Required, MaxLength(), MinLength()]
        public string UserName { set; get; }

        /// <summary>
        /// 用户密码
        /// </summary>
        [Required, StringLength()]
        public string PassWord { set; get; }

        /// <summary>
        /// 昵称
        /// </summary>
        [Required, StringLength()]
        public string NickName { get; set; }

        /// <summary>
        /// 加密盐
        /// </summary>
        [Required, StringLength()]
        public string Salt { set; get; }

        /// <summary>
        /// 是否冻结
        /// </summary>
        public bool IsFrozen { set; get; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { set; get; }
    }
}

经过多次测试发现,每次只在一台从服务器上面进行读取,纳闷

后来输出发现

Console.WriteLine(con.ClientConnectionId);

连接ID一样,重新启动,刚连接ID会有变动,然后果另一个从服务器进行大量读取。

初步猜测,应该是连接池的搞的鬼,如果关闭连接,但是实际上,并没有关闭数据库连接,而是归还连接池。重新打开数据库,又重连接池分配一条连接。

目前不清楚连接池的分配规则,从结果来看,应该是每次都是分配了相同的程序池连接。

现在暂进不测了,下班走,改天,部署WEB结构,然后用压力测试测试,看看数据库读取是否均衡。

windows NLB实现MSSQL读写分离--从数据库集群读负载均衡的更多相关文章

  1. SQL Server上唯一的数据库集群:负载均衡、读写分离、容灾(数据零丢失、服务高可用)

    SQL Server上唯一的数据库集群:负载均衡.读写分离.容灾(数据零丢失.服务高可用).审计.优化,全面解决数据库用户问题.一键安装,易用稳定,性价比高,下载链接:http://www.zheti ...

  2. Mycat搭建负载均衡,读写分离的Mysql集群

    Mycat搭建负载均衡,读写分离的Mysql集群 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.Mycat-server-1.6.7.4-te ...

  3. 10分钟学会windows中iis搭建服务器集群实现负载均衡和nginx代理转发

    前言 我们之前聊过 10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡:https://www.cnblogs.com/xiongze520/p/103087 ...

  4. Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

    文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...

  5. mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

    数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了 ...

  6. DB层面上的设计 分库分表 读写分离 集群化 负载均衡

    第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的 ...

  7. MySQL读写分离高可用集群及读操作负载均衡(Centos7)

    目录 概述 keepalived和heartbeat对比 一.环境 二.部署 部署lvs代理和keepalived MySQL+heartbeat+drbd的部署 MySQL主从复制 web服务器及a ...

  8. 15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  9. Mysql - 读写分离与读负载均衡之Maxscale

    一.概述 常见的高可用方案如MMM和MHA等都将重点放在主库上,一旦主库出现故障,通过这些方案能将主库故障进行转移. 本文将给大家介绍一款由mariadb公司出品的中间件Maxscale,该中间件能实 ...

随机推荐

  1. Log4j扩展使用--日志记录器Logger

    OK,现在我们认真的研究下Logger的配置,进行相关配置扩展. Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局).其中,Logger负责记录 ...

  2. Activiti简介

    Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术 ...

  3. JavaSE基础篇—MySQL三大范式—数据库设计规范

    1.概   念     范式是一种符合设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式.各个范式是以此嵌套包含的,范式越高,设计等级越高,在现实设计中也越难实现,一般数据库只要打 ...

  4. 2、jQuery的一些静态方法

    上次粗略说了jQuery的整体结构,这次挑一些静态方法先说一下吧 一.noConflict函数 这个函数是个比较有意思的函数,基本上很少用到,之所以说他是因为这个函数在最下面,太显眼了,先把他解决掉. ...

  5. 浅谈最大流的Dinic算法

    PART 1 什么是网络流 网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关.网络流的理论和应用在不断发展,出现了具有增益的流.多终端流.多商品流以及网络流的分解与 ...

  6. [DeeplearningAI笔记]神经网络与深度学习2.11_2.16神经网络基础(向量化)

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.11向量化 向量化是消除代码中显示for循环语句的艺术,在训练大数据集时,深度学习算法才变得高效,所以代码运行的非常快十分重要.所以在深度学 ...

  7. 10_set集合

    一.集合类型 集合是一组无序排列的可哈希的值(可哈希的值->不可变),集合成员可以做字典中的键.但集合本身是不可哈希的. 集合是无序没有索引,也没有像字典的key,所以集合不能更改元素.只能增删 ...

  8. AutoDesk Forge 获取令牌认证

    创建应用程序 在开始使用Forge Platform之前,您需要设置一个应用程序并获取您的客户端ID和密码. 步骤1:登录Dev Portal 去开发门户网站:https://developer.au ...

  9. Android开发之漫漫长途 XIV——ListView

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  10. BZOJ 1086: [SCOI2005]王室联邦 [树上分块]

    portal 题意: 树分成若干块大小在$[s,3s]$之间,每块有一个根(可以不在块内),所有点到根路径上的点都必须在块内 据说这是一个保证了块大小直径个数的科学分块方法,貌似只有本题有用  我错了 ...