前言:

继上一篇,介绍 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. 十九、Hadoop学记笔记————Hbase和MapReduce

    概要: hadoop和hbase导入环境变量: 要运行Hbase中自带的MapReduce程序,需要运行如下指令,可在官网中找到: 如果遇到如下问题,则说明Hadoop的MapReduce没有权限访问 ...

  2. 关于Linux虚拟化技术KVM的科普 科普五(From 世民谈云计算)

    另一位大神写到KVM文章,KVM 介绍(1):简介及安装.KVM 介绍(2):CPU 和内存虚拟化.KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtual ...

  3. 背景图片蒙上一层颜色(背景图片无法用rgba调整透明度!)

    方法就是在图片上面加一层DIV,将DIV的背景颜色调成rgba(0,0,0,0.3);即可

  4. QM1_Time value of Money

    总体框架 Time Value  Interest Rate rf: 无风险收益率 (CFA中一般认为是美国短期国债T-bill的收益率) Nominal risk-free rate: 名义无风险税 ...

  5. 【源码解析】Sharding-Jdbc的执行过程(一)

    一.ShardingContext 在Sharding-Jdbc中,我们其实需要抓住一个核心类,也就是ShardingContext,分片上下文,里面定义了下面几个内容: @RequiredArgsC ...

  6. laravel 中的rbac自己简单的实现

    用户表 CREATE TABLE `sys_user` ( `id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '用户编号', `ids` int(1 ...

  7. 字典---python

    Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包 ...

  8. mysql中利用group by过滤删除重复行

    DELETEFROM peopleWHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING count(peopl ...

  9. 读书笔记--Android Gradle权威指南(下)

    前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...

  10. Spring Framework学习要点摘抄

    以下摘自Spring Framework官方文档,版本Spring 4.3. <context:annotation-config/> implicitly registered post ...