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是 ...
随机推荐
- 常见性能优化策略的总结 good
阅读目录 代码 数据库 缓存 异步 NoSQL JVM调优 多线程与分布式 度量系统(监控.报警.服务依赖管理) 案例一:商家与控制区关系的刷新job 案例二:POI缓存设计与实现 案例三:业务运营后 ...
- React Native系列(6) - 编译安卓私有React-Native代码
为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Nat ...
- [ Java面试题 ]算法篇
1.堆和栈在内存中的区别是什么? 概念: 栈(stack)是为执行线程留出的内存空间.当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块.当函数执行完毕,块就没有用了,可能在 ...
- 关于JSON字符串的处理与总结 【原创】
这两天帮另一个实习生处理点前端的问题 遇到点JSON的处理 总结如下 ①一个JSON字符串 JSON.Parse(JSON字符串)—>JSON对象Object ②一个JSONArray ...
- Android 框架炼成 教你如何写组件间通信框架EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41096639 ,本文出自:[张鸿洋的博客] 1.概述 关于Eventbus的介绍 ...
- 关于python中phantomjs无法访问网页的处理
笔者使用的系统是linux ubuntu,最近在学习爬虫的过程中遇到了一个抓狂的问题,我尝试使用selenium加phantomjs来登陆网页的时候,Pythony一直提示selenium无法找到元素 ...
- fasthttp 的 goroutine pool 实现探究
引言 fasthttp是一个非常优秀的web server框架,号称比官方的net/http快10倍以上.fasthttp用了很多黑魔法.俗话说,源码面前,了无秘密,我们今天通过源码来看一看她的gor ...
- 【bzoj 3233】[Ahoi2013]找硬币 ——搜索
Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...
- GopherChina第二天小结
GopherChina第二天小结 今天继续昨天的文章,参加了第二天的GopherChina,例行完成总结. 基于MINIO的对象存储方案在探探的实践 关于对象存储,之前用过seaweedfs,但是对M ...
- Redis--Memched--Cache缓存介绍使用
目录: 一.分布式缓存—Redis与Memched的区别 1.1. 数据支持类型 1.2. 持久性 1.3. 内存利用情况 1.4. 数据一致性 1.5. ...