CYQ.Data 支持分布式数据库(主从备)高可用及负载调试
前言:
继上一篇,介绍 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 支持分布式数据库(主从备)高可用及负载调试的更多相关文章
- CYQ.Data 支持 PostgreSQL 数据库
前言: 很久之前,就有同学问我CYQ.Data能不能支持下PostgreSQL,之后小做了下调查,发现这个数据库用的人少,加上各种因素,就一直没动手. 前两天,不小心看了一下Github上的消息: 看 ...
- CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试
背景: 随着.NET Core 在 Linux 下的热动,相信动不动就要分布式或集群的应用的需求,会慢慢火起来. 所以这段时间一直在研究和思考分布式集群的问题,同时也在思考把几个框架的思维相对提升到这 ...
- CYQ.Data V5 分布式自动化缓存设计介绍(二)
前言: 最近一段时间,开始了<IT连>创业,所以精力和写的文章多数是在分享创业的过程. 而关于本人三大框架CYQ.Data.Aries.Taurus.MVC的相关文章,基本都很少写了. 但 ...
- CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本
CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...
- Mysql+Keepalived双主热备高可用操作记录
我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...
- 使用Keepalived实现Nginx的自动重启及双主热备高可用
1.概述 之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下. 1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服 ...
- 使用Keepalived实现Nginx的双机主备高可用
1.概述 前面我们聊过使用 Nginx 为 后端Tomcat 做负载均衡.高可用,但是这时Nginx又成了单点,如果Nginx不幸挂掉,整个网站便无法访问. 此时我们就会用到另一个软件 -- Keep ...
- Mycat - 高可用与负载均衡实现,满满的干货!
前言 开心一刻 和朋友去吃小龙虾,隔壁桌一个小女孩问妈妈:"妈妈,小龙虾回不了家,它妈妈会不会着急?" 她妈妈愣住了,我扒虾的手停下了,这么善良的问题,怎么下得了口.这是老板急忙过 ...
- PostgreSQL 9.5 高可用、负载均衡和复制
高可用.负载均衡和复制 1. 不同方案的比较 共享磁盘故障转移 共享磁盘故障转移避免了只使用一份数据库拷贝带来的同步开销. 它使用一个由多个服务器共享的单一磁盘阵列.文件系统(块设备)复制 DRBD是 ...
随机推荐
- PCA的数学原理(转)
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- 聊聊Spring Cloud版本的那些事儿
说说Spring Cloud版本的那些事儿. 版本命名 之前提到过,Spring Cloud是一个拥有诸多子项目的大型综合项目,原则上其子项目也都维护着自己的发布版本号.那么每一个Spring Clo ...
- linux下属主目录的作用
1. /home 用户目录 系统中每一用户都有一个目录 ,被称为主目录,家目录 创建一个普通用户,系统就会在 /home 创建一个以用户为名字的目录2. /tmp 临时文件目录 系统在运行程序中产 ...
- SQL注入简单介绍
一.SQL注入概念 1.sql注入是一种将sql代码添加到输入参数中 2.传递到sql服务器解析并执行的一种攻击手法 举例:某个网站的用户名为name=‘admin’.执行时为select ...
- jQuery学习之旅 Item8 DOM事件操作
1.jquery页面载入事件 1.传统加载事件 <body onload="函数名()"> 页面全部html和css代码加载完成之后再调用指定的onload函数 win ...
- 使用jekyll和Github搭建个人博客
一.使用jekyll和Github三步搭建个人博客 在 Github 上建一个库,库的名字是xxx.github.com,其中的xxx是你的github的账号名(图中标注的不要勾选) 注:如果没有Gi ...
- python selenium模拟滑动操作
selenium.webdriver提供了所有WebDriver的实现,目前支持FireFox.phantomjs.Chrome.Ie和Remote quit()方法会退出浏览器,而close()方法 ...
- 基于 HTML5 OpenLayers3 实现 GIS 电信资源管理系统
前言 通过结合 HTML5 和 OpenLayers 可以组合成非常棒的一个电信地图网络拓扑图的应用,形成的效果可以用来作为电信资源管理系统,美食定位分享软件,片区找房,绘制铁轨线路等等,各个领域都能 ...
- 关于Kafka配额的讨论(1)
Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling).目前Kafka支持两大类配额管理: 网络带 ...
- MVC下 把数据库中的byte[]值保存成图片,并显示在view页面
MVC下 把数据库中的byte[]值转成图片,并显示在view页面 controller中的action方法 //显示图片[AllowAnonymous]public ActionResult Sho ...