前言:

继上一篇,介绍 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. java 各数据类型之间的转换

    String —> Date SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date ...

  2. c++右值引用以及使用

    前几天看了一篇文章<4行代码看看右值引用> 觉得写得不错,但是觉得右值引用的内容还有很多可以去挖掘学习,所以总结了一下,希望能对右值引用有一个更加深层次的认识 一.几个基本概念 1.1左值 ...

  3. Eclipse 4.2 安装Java反编译插件

    在eclipse下安装反编译插件可以直接查看 .class 文件对应的java源码. 反编译插件有 jdeclipse 和 jadeclipse. (1) jdeclipse http://www.d ...

  4. 最近最久未使用页面淘汰算法———LRU算法(java实现)

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. LRU算法,即Last Recently Used ---选择最后一次访问时间距离当前时间最长的一页并淘汰之--即淘汰最长时间没有使用的页 按照 ...

  5. Python 函数式编程和面向对象编程

    函数式编程 函数:function.函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式.函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同   高阶函数 ...

  6. 火狐浏览器插件--xpath利器

    以前在做web自动化的时候,免不了要找定位啊什么的.一层层找下来太痛苦了,时间也浪费了一天写不了啥.特别是在最开始接触自动化的时候,我们系统坑爹的只支持IE.后来换公司了,在偶然情况下,得知了fire ...

  7. tomcat设置端口号,访问指定ip就访问指定项目

    1.修改背景: A.通常我们访问我们的web应用格式为: http://ip:端口号/项目名称 例如: http://127.0.0.1:8080/projectName B.如果想直接输入" ...

  8. django(权限、认证)系统——第三方组件实现Object级别权限控制

    在我的系列blog<Django中内置的权限控制>中明确提及到,Django默认并没有提供对Object级别的权限控制,而只是在架构上留了口子.在这篇blog中,我们探讨一个简单流行的Dj ...

  9. 【莫比乌斯反演】BZOJ2820 YY的GCD

    Description 求有多少对(x,y)的gcd为素数,x<=n,y<=m.n,m<=1e7,T<=1e4. Solution 因为题目要求gcd为素数的,那么我们就只考虑 ...

  10. XSS SQL CSRF

    XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意脚本 ...