windows NLB实现MSSQL读写分离--从数据库集群读负载均衡
主从模式,几乎大部分出名的数据库都支持的一种集群模式。
当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读写分离--从数据库集群读负载均衡的更多相关文章
- SQL Server上唯一的数据库集群:负载均衡、读写分离、容灾(数据零丢失、服务高可用)
SQL Server上唯一的数据库集群:负载均衡.读写分离.容灾(数据零丢失.服务高可用).审计.优化,全面解决数据库用户问题.一键安装,易用稳定,性价比高,下载链接:http://www.zheti ...
- Mycat搭建负载均衡,读写分离的Mysql集群
Mycat搭建负载均衡,读写分离的Mysql集群 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.Mycat-server-1.6.7.4-te ...
- 10分钟学会windows中iis搭建服务器集群实现负载均衡和nginx代理转发
前言 我们之前聊过 10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡:https://www.cnblogs.com/xiongze520/p/103087 ...
- Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived
文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...
- mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离
数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了 ...
- DB层面上的设计 分库分表 读写分离 集群化 负载均衡
第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的 ...
- MySQL读写分离高可用集群及读操作负载均衡(Centos7)
目录 概述 keepalived和heartbeat对比 一.环境 二.部署 部署lvs代理和keepalived MySQL+heartbeat+drbd的部署 MySQL主从复制 web服务器及a ...
- 15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...
- Mysql - 读写分离与读负载均衡之Maxscale
一.概述 常见的高可用方案如MMM和MHA等都将重点放在主库上,一旦主库出现故障,通过这些方案能将主库故障进行转移. 本文将给大家介绍一款由mariadb公司出品的中间件Maxscale,该中间件能实 ...
随机推荐
- 流API--缩减操作
在Stream流操作中,比如说min(),max(),count()方法,这几个操作都会将一个流缩减成一个值,流API将这些操作称为特例缩减.另外,流API同时泛华了缩减这种概念,提供了reduce( ...
- Oracle Start With关键字
Oracle Start With关键字 前言 旨在记录一些Oracle使用中遇到的各种各样的问题. 同时希望能帮到和我遇到同样问题的人. Start With (树查询) 问题描述: 在数据库中, ...
- 一个Android上的以滑动揭示的方式显示并切换图片的View
SlideView是一个Android上的以滑动揭示的方式显示并切换图片的View,以视觉对比的方式把一套相似的图片展示出来. 示例 翻页图片揭示效果: 特性 设置一组(List<ImageIn ...
- getRequestDispatcher()和response.sendRedirect()
request.getRequestDispatcher()是请求转发,前后页面共享一个request response.sendRedirect()是重新定向,前后页面不是一个request.
- 小白的Python之路 day5 re正则模块
re正则模块 一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串 ...
- bat自动打包压缩实现
1.引言 本文档的编辑目的是为了实bat脚本自动打包功能,包含包的名字命名,压缩文件内外层文件夹的名字:包含svn版本号等: 2.实现介绍 (1)获取svn号,生成批处理文件 写一个pak.bat文件 ...
- C#基础(六)--枚举的一些常用操作
本章将介绍以下几点: 1.如何把其它类型转换为枚举类型? 2.如何把枚举中的值添加到下拉菜单中? 一.如何把其它类型转换为枚举类型? 我们回顾一下有关字符串与数字之间的转换,如: ...
- Java设计模式——模板方法模式
转载自:https://www.cnblogs.com/zplogo/p/6428593.html 用抽象基类定义算法框架 RefreshBeverage package com.pattern.te ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]
JZPGYZ - Sevenk Love Oimaster Oimaster and sevenk love each other. But recently,sevenk hea ...
- Xposed快速hook关键点
0x01 导读 工作中,常常需要针对各种app进行快速代码定位,找到代码修改和调试各种功能,就不得不面对xposed来进行一系列快速定位关键代码的问题了.那么问题来了,如何快速找到代码呢? 这里值这针 ...