cyq.data(v5)数据库读写分离功能使用心得

author author     2022-09-30     203

关键词:

一些感谢的话

首先,自然是要感谢 “路过秋天” 对CYQ.Data的开源(当然,不仅仅是CYQ.Data喔。看他的架势,那是准备凑齐黄金十二宫的)

路过秋天Blog地址[里面有更多他的开源项目]:http://www.cnblogs.com/cyq1162/

左侧公告的两个二维码分别是他的创业公众号和创业项目[IT连APP],有兴趣的朋友可以扫码喔

------------------------------------------------------------------------------------------------------------------------

我接触CYQ.Data没几天,为了项目重构,想找一个集成数据操作,分布式缓存,数据库读写分离的框架。于是乎,我就看到了……

昨晚,在测试读写分离的执行机制时,遇到一些问题。于是第一时间联系了秋天本人。令我敬佩的是,二话没说,一一解决。我测他改,俩人折腾到大半夜,才算完功。于是才有了本文

我想说,在当今浮躁的时代,为一个原本素不相识的人,能够有如此耐心。实属难得

好了,一些感慨就算是完了,下面是正餐

 

CYQ.Data(V5) 数据库读写分离入门

为了一些未使用过CYQ.Data的朋友们能够更好的了解,这里先说一些基础的

1:配置规则

以MSSQL为例

 

<add name="Conn" connectionString="server=.;uid=sa;pwd=123456;database=db;" providerName="System.Data.SqlClient"/>
        <add name="Conn_Bak" connectionString="server=.;uid=sa;pwd=123456;database=db_back;" providerName="System.Data.SqlClient"/>
        <add name="Conn_Slave1" connectionString="server=.;uid=sa;pwd=123456;database=db_Slave1;" providerName="System.Data.SqlClient"/>
        <add name="Conn_Slave2" connectionString="server=.;uid=sa;pwd=123456;database=db_Slave2;" providerName="System.Data.SqlClient"/>
        <add name="Conn_Slave3" connectionString="server=.;uid=sa;pwd=123456;database=db_Slave3;" providerName="System.Data.SqlClient"/>

 

其中:

Conn:主数库连接配置[可写](以下简称主库
Conn_Bak:备份数库连接配置[可写](以下简称备库
Conn_Slave1……Conn_SlaveN:从库数库连接配置[只读](以下简称从库

 

2:执行机制

  2.1:如何启用读写分离
    当配置节中存在至少一个 [从库] 项时,即启用读写分离机制

  2.2:写操作
    2.2.1:遵循:主~备的切换顺序

    2.2.2:主库和备库在做写操作时,按先主后备的顺序执行。当主库宕机以后,框架自动切换至备库
    2.2.3:当备库也宕机时,写操作的请求将中止。假如你配置了从库,也不用担心,它们将不受任何影响

  2.3:读操作
    遵循:从~主~备的顺序。任何一个节点的数据库发生意外,框架将按配置项请求下一个有效连接

3:常规应用场景

  最直接的目的当然是为了数据库的分流。我们常说的分布式数据库架构中都可以使用它做为数据层来完成。类似于分库,分表之类的操作;简单的说,当你为了减轻数据库压力,需要多个库操作时,就有它的用武之地

4:简单示例浅析

  比如说,有一个文章系统,最核心的数据就是发布的文章。我们可以使用当前很常规的方式采用生成静态的.html文件来缓解数据库的实时请求压力;但是文章数目的上限是不可控的,存储空间,单服务器的承载能力这些都是不可控的因素。
这时,我们的负载均衡就可以闪亮登场了。那么随之而来的就有一个问题,既然已经部署了多服务器的负载均衡,数据库呢?数据库怎么办?

  最粗暴的当然还可以直接使用单数据库。但显然,我们还能有更好的解决方案。这就是:数据分布式架构

  我们通过主数据库的分发,其他数据库的订阅来达到各服务器之间的数据(完全或指定部份)一致

  分布式的架构的部署就带来一个新的需求,我们需要每一个数据库都做出贡献,而不单单是做为数据备份存在。基于这种需求,CYQ.Data 就可以完美的完成你的业务需求

  最简单的方式:我们可以在数据库~生成的.html页面之间,加入CYQ.Data。当一个请求发出时,如果当前服务器不存在对应的html页面,从数据库中获取数据,生成页面,返回前端。[关于页面数据发生变化,需要重新生成时,由其他业务完成,这里我们按下不表]

那当页面不存在时,我们是需要从数据库获取数据的。但现在我们有若干个数据库,如何合理的从这些库中获取数据呢?很简单:使用CYQ.Data,配置好 主~备~从 规则即可 [配置方法以及执行机制往上看]

5:代码使用

  读数据:

string json;
                using (MAction action = new MAction("表名"))
                {
                    json = action.Select().ToJson();
                }

 

  在config中配置好主~备~从节点以后,以上的代码就可以轻易的从数据库中获取指定表的数据了[关于读写分离中读操作的执行机制,往上看];一切如此简单;无需任何复杂的业务代码,一切都由CYQ.Data帮您完成了

  写数据[以Update为例]:

using (MAction action = new MAction("表名"))
                {
                    action.SetExpression("a=1");
                    action.Update("id=1");
                }

  和读操作一样,配置好节点以后,就可以按其执行机制去完成对数据的更新了。再次说一句:一切如此简单

  MAction 以外,框架还提供了 MProc 去调用存储过程。具体用法类似,这里就不再赘述

 

  上面的例子,针对的是主~备~从三种库的结构相同时的情况。那如果从库的表与主库的并不一致时呢?比如现在需要请求:表A,但从库中并没有表A,它或许只存在于主备库中,这时,请求的结果将发生意外。于是对于子业务模块的读写分离我们也需要有对应的解决方案;这就是今天的彩蛋和亮点了

 

  实现子模块的读写分离[分库分表]

  功能的实现简单到你难以想像。以下示例配置为:对文章表做了垂直切分,不与主库在一起了。所以Article系列的从库只保存了文章

  1:配置

 

<add name="ArticleConn" connectionString="设置为主库连接" providerName="System.Data.SqlClient"/>
        <add name="ArticleConn_Slave1" connectionString="server=.;uid=sa;pwd=123456;database=ArticleDb_Slave1;" providerName="System.Data.SqlClient"/>
        <add name="ArticleConn_Slave2" connectionString="server=.;uid=sa;pwd=123456;database=ArticleDb_Slave1;" providerName="System.Data.SqlClient"/>
        <add name="ArticleConn_Slave3" connectionString="server=.;uid=sa;pwd=123456;database=ArticleDb_Slave3;" providerName="System.Data.SqlClient"/>

 

  2:代码

 

string json;
                //将配置Key:ArticleConn做为参数传入
                //接下来的请求中就将以ArticleConn做为主库,使用配置中的ArticleConn_Slave1……ArticleConn_SlaveN的主从关系实现读数据
                using (MAction action = new MAction("Article", "ArticleConn"))
                {
                    json = action.Select().ToJson();
                }


 

   一个参数的传入,就解决了;ArticleConn 作为主库的配置在读数据时并不产生任何作用。在写操作时,不传入这个参数,即可使用主库[Conn]的连接

 

using (MAction action = new MAction("Article"))
                {
                    action.SetExpression("a=1‘");
                    action.Update("id=1");
                }

 

 

  模块化的读写分离需求场景

  以现成的博客园为例,我们可以将用户,文章,评论,三大模块分开存放。各自建立 主~备~从 关系。在这个基础上,我们可以对每个模块的数据进行水平拆分,使用语句或视图进行聚合;这样的性能和效率,远不是单机单库可以相比的。当然,前提是你有足够的的Money~~~哈哈哈

 

  其实今天本想把重点放在后半部份的,但想着想着发现,其实一切都很强大。所以最后也只是以一种应用场景的方式列出来了

 

  最后,还得说一次:一切如此简单,你还在等什么呢?有兴趣的朋友去秋天大神的blog中下载呀

cyq.data数据框架使用篇一入门指南

...etail-411 本文针对V5版本进行修改于(2016-07-04)下面是使用步骤:一:下载框架DLL[VS上在NuGet搜cyqdata,或者框架下载地址:下载中心]下载框架后解压出: 1:CYQ.Data.dll和CYQ.Data.Xml(方法注释提示)2:CYQ.Data.Proj 查看详情

cyq.data数据层框架cyq.data数据框架使用篇四maction增删改

本篇内容概要本篇继续上一篇内容,本节介绍所有增删改的相关操作。1:添加数据Insert方法2:删除数据Delete方法3:更新数据Update方法一:添加操作方法原型:public bool Insert()public bool Insert(bool autoSetValue)public&n... 查看详情

ef通用数据层封装类(支持读写分离,一主多从)

浅谈orm记得四年前在学校第一次接触到LingtoSql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,ServiceStack.OrmLite 等。当然每种orm都有各自的优势,也有不足的地方。园子... 查看详情

ef通用数据层封装类(支持读写分离,一主多从)

浅谈orm  记得四年前在学校第一次接触到LingtoSql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像EF,Dapper,Hibernate,ServiceStack.OrmLite 等。当然每种orm都有各自的优势,也有不足的地方。园子... 查看详情

sharding-jdbc读写分离探秘(代码片段)

...础上集成读写分离的功能。读写分离的概念就是为了缓解数据库压力,将写入和读取操作分离为不同数据源,写库称为主库ÿ 查看详情

mycat使用(主从+读写分离)(代码片段)

mycat使用mycat源码地址mycat概述是一个开源的分布式数据库系统,一个实现了MySQL协议的的Server。前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生(Native)协议与多个MySQL服务器... 查看详情

微服务治理热门技术揭秘:动态读写分离

我们从应用的视角出发整理抽象了我们在访问、使用数据库时场景的一些稳定性治理、性能优化、提效等方面的实战经验,对于每一个后端应用来说,数据库无疑是重中之重,我们希望通过我们的数据库治理能力࿰... 查看详情

cyq.data从入门到放弃orm系列:开篇:自动化框架编程思维

前言:随着CYQ.Data开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头。同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍... 查看详情

cyq.data从入门到放弃orm系列:开篇:自动化框架编程思维

前言:随着CYQ.Data开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头。同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍... 查看详情

shardingjdbc第二篇:读写分离与分布式事务

....1master节点配置2.2.2slave节点配置2.3将不同请求路由到不同数据库中2.4搭建主从复制心得(需要注意的事项/常见坑)2.4.1vmware最小化安装centos7两步骤2.4.2centos上安装mysql步骤2.4.3/etc目录下找不到配置文件my.cnf2.4.4`chang 查看详情

想用数据库“读写分离”请先明白“读写分离”解决什么问题

有一些技术同学可能对于“读写分离”了解不多,认为数据库的负载问题都可以使用“读写分离”来解决。这其实是一个非常大的误区,我们要用“读写分离”,首先应该明白“读写分离”是用来解决什么样的问题的,而不是仅... 查看详情

利用amoeba(变形虫)实现mysql数据库读写分离(代码片段)

...不稳定,不建议在生产环境使用;amoeba是阿里开发的一款数据库读写分离的项目(读写分离只是它的一个小功能),由于是基于java编写的,所以运行环境需要安装jdk;前期准备工作:1.两个数据库,一主一从,主从同步;master:17 查看详情

mycat读写分离+分库分表

...主从复制环境,加上正在研究的Mycat,实现了主流分布式数据库的测试Mycat就不用多介绍了,可以实现很多分布式数据库的功能,极大的减轻数据库服务器的压力,包括读写分离以及分库分表,本测试对这两种功能都进行了测试... 查看详情

linux12-mysql数据库-->16数据库的读写分离

文章目录MySQL读写分离一、读写分离简介1.1常见高并发场景1.2读写分离原理1.3读写分离类型二、Atlas读写分离2.1Atlas简介2.2Atlas主要功能2.3Atlas主要架构2.4准备主从环境2.5Atlas安装2.6授权Atlas管理账号2.7修改test配置文件2.8服务管理命... 查看详情

想用数据库“读写分离”请先明白“读写分离”解决什么问题

...些技术同学可能对于“读写分离”了解不多,认为数据库的负载问题都可以使用“读写分离”来解决。 这其实是一个非常大的误区,我们要用“读写分离”,首先应该明白“读写分离”是用来解决什... 查看详情

shardingsphere实践——读写分离(代码片段)

...一、功能详解1.背景2.核心概念3.使用规范二、用例测试1.读写分离(1)添加资源(2)创建表(3)创建读写分离规则(4)读写数据2.读负载均衡(1)轮询算法(2)随机访问算法(... 查看详情

使用amoeba配置mysql读写分离

一,背景介绍:Amoeba(变形虫)项目,专注分布式数据库proxy开发。座落与Client、DBServer(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。要... 查看详情

应用层实现读写分离

**随着业务量的增大,频繁的读写操作对数据库造成很大压力。一种方式是在应用层和数据库层增加缓存来缓解对数据库的压力;另可使用读写分离的方式使应用对数据库的压力降低。 有两种方式可以实现读写分离:1.应用... 查看详情