前言:

继上一篇,介绍 CYQ.Data 在分布式缓存上支持高可用,详见:CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试

本篇介绍 CYQ.Data 在对数据库层面对分布式数据库的主从备的高可用的及负载调度。

目前框架支持的数据库(及缓存)种类为:

Support:Txt、Xml、Access、Sqlite、Mssql、Mysql、Oracle、Sybase、Postgres、Redis、MemCache。

下面就开始介绍:

1、数据库集群与负载的高可用:

1、集群与故障转移

想当年,在北京联通的项目上,为了实现数据库集群故障转移,那可是一堆人在机房折腾的死去活来。

还要开什么研论会,要机房,网络设计人员,和项目层面的三方人码动手。

折腾到最后的结果,浪费了一台服务器做热备。

2、由客户端调度主从备,实现故障转移与负载。

CYQ.Data 在很早前,就实现了主从备的切换了,只是没有实现高可用。

这一次,迎合NET Core 在未来分布式应用下的需求,补上了这个功能。

2、CYQ.Data 在分布式下的数据库可高用:

下面来看简单的使用过程:

1、指定配置外链:

原有的配置:

<connectionStrings>
<add name="Conn" connectionString="server=.;database=test;uid=sa;pwd=123456"/>
<add name="Conn_Bak" connectionString="server=.;database=test;uid=sa;pwd=123456"/>
<add name="Conn_Slave1" connectionString=".;database=test;uid=sa;pwd=123456"/>
<add name="Conn_Slave2" connectionString="server=.;database=demo;uid=sa;pwd=123456"/>
</connectionStrings>

将配置写在原的config中,是当修改时,会引发(Window下)整个程序重启(而NetCore默认不重启,需要特殊处理配置文件重新加载事件)。

改进后配置(文件后缀可以指定*.ini,*.txt, *.json):

<add name="Conn" value="conn.json"/>

对应的conn.json 文件:

{
  "Conn": {
        "Master": "server=.;database=demo;uid=sa;pwd=123456",
        "Backup": "server=.;database=test;uid=sa;pwd=123456",
        "Slave": [
              "server=.;database=test;uid=sa;pwd=123456",
              "server=.;database=demo;uid=sa;pwd=123456"
              ]
      }
}

将配置外置后,程序会自动监控文件的变化,每次修改都会即时生效,内部自动调整算法,实现高可用。

配置后好,剩下的问题就是你有多少台服务器可以安装数据库实例了。

2、数据库主从备的机制说明:

主备:当主库发生故障时,会自动切换到备库。

主从:主库负责写,从库负责读。

3、关于读的负载调度:

只要是被加入Slave的链接,都会顺序被执行。

因此,如果写的任务不多,可以把主库的链接也加入到Slave中,分担读的压力。

再把备库的链接都加载入到Slave中,反正备库平时也用不上,一样可以继续分担读的压力。

另外,Slave由于是顺序调度,所以要加大某实例的负载时,可以将该实例的链接复制多份,以提高被执行的概率。

因此,只要配合服务器性能监控,再动态修改链接指向的配置文件,即可实现高可用的性能负载。

下面来做一个测试实验:

3、主从备负载切换的实验:

首先,创建了五个数据库:MasterDB、BackupDB、SlaveDB1、SlaveDB2、SlaveDB2。

然后:数据库间的同步,这一步就先省了。

写测试代码,运行两个线程,分别是读与写:

 public class MasterBackupSlave
{
public static void Start()
{
AppConfig.Log.LogConn = "Conn";
ThreadPool.QueueUserWorkItem(new WaitCallback(Read), "Read");
ThreadPool.QueueUserWorkItem(new WaitCallback(Write), "Write");
Console.Read();
}
private static void Read(object threadFlag)
{ while (true)
{
using (SysLogs logs = new SysLogs())
{
logs.Fill(); Console.WriteLine("Read : " + ((MAction)logs).DataBase);
}
Thread.Sleep();
}
}
private static void Write(object threadFlag)
{
while (true)
{
using (SysLogs logs = new SysLogs())
{
logs.Message = Guid.NewGuid().ToString();
logs.Insert(); Console.WriteLine("--------------Write : " + ((MAction)logs).DataBase);
}
Thread.Sleep();
}
}
}

然后运行,看到以下输出,写在主库,读在从库中切换:

接着,我们测试主备,把主库弄挂了,这时会切到从,再把主库恢复,这时候会切回来。

最后,我们随时减少或增加从库负载的实例:

没错,和分布式缓存一样,框架已经从单机的应用,向分布式高负载和高可用性进化了。

总结:

别问我为什么,总之,就是这么强大。

CYQ.Data 支持分布式数据库(主从备)高可用及负载调试的更多相关文章

  1. CYQ.Data 支持 PostgreSQL 数据库

    前言: 很久之前,就有同学问我CYQ.Data能不能支持下PostgreSQL,之后小做了下调查,发现这个数据库用的人少,加上各种因素,就一直没动手. 前两天,不小心看了一下Github上的消息: 看 ...

  2. CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试

    背景: 随着.NET Core 在 Linux 下的热动,相信动不动就要分布式或集群的应用的需求,会慢慢火起来. 所以这段时间一直在研究和思考分布式集群的问题,同时也在思考把几个框架的思维相对提升到这 ...

  3. CYQ.Data V5 分布式自动化缓存设计介绍(二)

    前言: 最近一段时间,开始了<IT连>创业,所以精力和写的文章多数是在分享创业的过程. 而关于本人三大框架CYQ.Data.Aries.Taurus.MVC的相关文章,基本都很少写了. 但 ...

  4. CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本

    CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...

  5. Mysql+Keepalived双主热备高可用操作记录

    我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...

  6. 使用Keepalived实现Nginx的自动重启及双主热备高可用

    1.概述 之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下. 1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服 ...

  7. 使用Keepalived实现Nginx的双机主备高可用

    1.概述 前面我们聊过使用 Nginx 为 后端Tomcat 做负载均衡.高可用,但是这时Nginx又成了单点,如果Nginx不幸挂掉,整个网站便无法访问. 此时我们就会用到另一个软件 -- Keep ...

  8. Mycat - 高可用与负载均衡实现,满满的干货!

    前言 开心一刻 和朋友去吃小龙虾,隔壁桌一个小女孩问妈妈:"妈妈,小龙虾回不了家,它妈妈会不会着急?" 她妈妈愣住了,我扒虾的手停下了,这么善良的问题,怎么下得了口.这是老板急忙过 ...

  9. PostgreSQL 9.5 高可用、负载均衡和复制

    高可用.负载均衡和复制 1. 不同方案的比较 共享磁盘故障转移 共享磁盘故障转移避免了只使用一份数据库拷贝带来的同步开销. 它使用一个由多个服务器共享的单一磁盘阵列.文件系统(块设备)复制 DRBD是 ...

随机推荐

  1. Swift-函数学习

    函数:函数是独立的代码块,执行特定的任务. Swift 的统一函数语法足够灵活,能表达没有参数名称的简单的 C 型函数的任何东西,本地和外部复杂 Objective-C-style 方法参数名称为每个 ...

  2. Go 自带的 http/server.go 的连接解析 与 如何结合 master-worker 并发模式,提高单机并发能力

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  3. 基于E-R模型的关系型数据库设计方法

    摘要 在管理信息系统开发中,数据库设计的目标是建立DBMS能识别的关系数据模型.而关系数据模型建立的基础是首先建立E-R模型,通过E-R模型才能转换为关系数据模型.如何建立E-R模型以及如何将E-R模 ...

  4. sed、awk——运维必须掌握的两个工具

    今天主要跟大家介绍2个非常霸道的工具,sed和awk,本篇文章将介绍这两个工具在日常运维中的常用用法,工作中这两个工具要掌握好了在结合一些管道命令.正则表达式,日常处理事务简直666啦! l Sed ...

  5. python中 __cmp__

    对 int.str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序,但是,如果对一组 Student 类的实例排序时,就必须提供我们自己的特殊方法__cmp_ ...

  6. nodejs 简单安装环境

    学习资料 1.深入浅出Node.js 2.Node.js开发指南 简介(只捡了我觉得重要的) Node.js是让Javascript脱离浏览器运行在服务器的一个平台,不是语言: Node.js采用的J ...

  7. 【转】用信鸽来解释 HTTPS

    一.引文出处 注:分享交流技术.本文摘自开源中国翻译,翻译者:JonnHuang,句号句号 译文原网址:https://www.oschina.net/translate/https-explaine ...

  8. random.nextInt()与Math.random()基础用法

    相关文章:关于Random(47)与randon.nextInt(100)的区别 1.来源 random.nextInt() 为 java.util.Random类中的方法: Random类中还提供各 ...

  9. 如何解决-win7系统打开截图工具显示“截图工具当前未在计算机上运行”

    打开win7系统自带截图工具,显示"截图工具当前未在计算机上运行.请重新启动计算机,然后重试",  解决方法  1.首先在C盘中搜索tpcps.dll: 2.将数据最大那个tpcp ...

  10. Grafana简单使用

    下载安装 Grafana也是用GO语言写的,无任何依赖,安装非常简单. 启动 sudo service grafana-server start 运行 直接访问:http://your_ip:3000 ...