继上一篇,介绍 CYQ.Data 在分布式缓存上支持高可用,详见:CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试html
本篇介绍 CYQ.Data 在对数据库层面对分布式数据库的主从备的高可用的及负载调度。git
目前框架支持的数据库(及缓存)种类为:github
Support:Txt、Xml、Access、Sqlite、Mssql、Mysql、Oracle、Sybase、Postgres、Redis、MemCache。算法
下面就开始介绍:sql
想当年,在北京联通的项目上,为了实现数据库集群故障转移,那但是一堆人在机房折腾的死去活来。数据库
还要开什么研论会,要机房,网络设计人员,和项目层面的三方人码动手。json
折腾到最后的结果,浪费了一台服务器作热备。缓存
CYQ.Data 在很早前,就实现了主从备的切换了,只是没有实现高可用。服务器
这一次,迎合NET Core 在将来分布式应用下的需求,补上了这个功能。网络
下面来看简单的使用过程:
原有的配置:
<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 文件:
将配置外置后,程序会自动监控文件的变化,每次修改都会即时生效,内部自动调整算法,实现高可用。
配置后好,剩下的问题就是你有多少台服务器能够安装数据库实例了。
主备:当主库发生故障时,会自动切换到备库。
主从:主库负责写,从库负责读。
只要是被加入Slave的连接,都会顺序被执行。
所以,若是写的任务很少,能够把主库的连接也加入到Slave中,分担读的压力。
再把备库的连接都加载入到Slave中,反正备库平时也用不上,同样能够继续分担读的压力。
另外,Slave因为是顺序调度,因此要加大某实例的负载时,能够将该实例的连接复制多份,以提升被执行的几率。
下面来作一个测试实验:
首先,建立了五个数据库:MasterDB、BackupDB、SlaveDB一、SlaveDB二、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(1); Console.WriteLine("Read : " + ((MAction)logs).DataBase); } Thread.Sleep(1000); } } 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(1000); } } }
而后运行,看到如下输出,写在主库,读在从库中切换:
接着,咱们测试主备,把主库弄挂了,这时会切到从,再把主库恢复,这时候会切回来。
最后,咱们随时减小或增长从库负载的实例:
没错,和分布式缓存同样,框架已经从单机的应用,向分布式高负载和高可用性进化了。
别问我为何,总之,就是这么强大。