在说分库分表之前,先简单介绍下网站架构,这样有助于理解为何需要分库分表这种技术。因为所有的技术,大多都是因为业务的需要而产生的.

1、网站发展的第一阶段

大致架构如下,因为没有多少用户访问,所以单台服务器都搞定所有的事情,上面跑着数据库、资源站点、以及所有的业务站点.

2、网站发展的第二阶段

这个时候访问量开始增加,发现服务器的资源不够用了,用户体验越来越差,所以,第一想法,升级服务器配置.ok,暂时解决了问题,站点又能提供稳定且高效的服务.

3、网站发展的第三阶段

访问量持续增加,这个时候升级服务器的配置所产生的代价太大,而且,就算继续升级也无法解决本质的问题,所以开始考虑其它的方案!

很简单,将业务和数据分离,将业务站点和数据库和资源站点分开,如下架构:

这里需要注意:业务站点需要处理大量的业务逻辑,所以CPU的性能一定要高,文件服务器则需要大一点的硬盘,数据库服务器则需要更快的硬盘和更大的内存.

ok,问题又解决了,站点又能提供稳定且高效的服务.

4、网站发展的第四阶段

访问量持续增加,单台应用服务器的IIS线程并发连接有限,而且随着用户的上升开始出现超时,异常,直至站点崩溃.所以必须解决这个问题.

ok,增加应用服务器,实现小集群(每次加一台),上nginx(关于nginx不了解请参考Nginx),做反向代理,分发用户的请求到不同的应用服务器,如果涉及登陆做下Ip_Hash.

ok,问题又解决了,站点又能提供稳定且高效的服务.

5、网站发展的第五阶段

访问量持续增加,应用服务器也越来越多,数据库的压力越来越大,而且数据随着用户的上升爆发时的增加,数据库面临了性能瓶颈,因为单表数据的上升,所以必须分表,提升查询的速度.所以必须开始动数据库了.

第一步:实现数据库的读写分离,主要是配置,网商有很多文章,自行参考

第二步:分库分表

6、关于分库分表常用的设计思路

按时间、按地区(IP)、按业务进行划分,无外乎这三种方式.下面简单的介绍个例子,假设站点是个登陆站点,主要分为QQ登陆和微信登陆,站点需要记录每次用户的登陆的一些信息.

假设每天有10万用户登陆.做过单表10万数据查询的知道,不加索引的情况下,还是有点慢的.所以我们需要对这个登陆记录表进行拆分.第一步按QQ登陆和微信登陆进行分库,将通过QQ登陆的用户登陆信息存储到QQ登陆库,微信同理,这样每个库每天承担5万的写操作.

但是单表5万记录查询还是有点慢,这个时候还可以进行细分,比如按用户Id,进行拆封按用户Id拆分一般有两种(用户Id算法):

(1)、如果Id是int整数(如SqlServer的自增Id),可以采用Id%10取余算法,找到目标表。采用这种算法,那么原先的单表被拆封成0~9十个表,每个表承担5000的写操作,这样压力瞬间就下来了

(2)、如果Id是Guid(长度固定,全大写),获取最后1个字母,找到目标表,采用这种算法,那么原先的单表被拆封成A-Z36个表,每个表承担写压力就更小了.

上面两个都可取,但是可以根据具体的业务酌情选择.

目前为止,解决了单天的性能瓶颈,但是每天都有10万数据进来,肯定是不行的,所以按照上面的思路每天的数据必须在当前被清空,因为不清空,随着数据每天加10万的操作,查询到最后还是受不了.

所以必须写个定时服务,每天在业务低峰期清除QQ登陆信息库和微信登陆信息库的数据,清楚的同时将它们迁移到对应QQ登陆信息历史库和微信登陆历史库中,关于历史库的构建就需要仔细考虑了.

考虑了几种方案:

(1)、就两个历史库(微信登陆历史库和QQ登陆历史库),直接Pass,每天10万数据的递增,不用一年就直接崩了.

(2)、按年分库 月+日+用户Id 进行分表 直接Pass,这个方案会产生大概3600个表

(3)、权衡考虑采用按年分库 月+用户Id 进行分表 如果用户Id采用用户Id算法的第一种,那么会产生大概120个表.

确定好历史库设计方案之后,将每天的登陆信息记录同步到对应的历史库中.

转载于:https://www.cnblogs.com/GreenLeaves/p/10053935.html

基于.Net + SqlServer的分库分表设计方案相关推荐

  1. 【基于cobar的heisenberg 分库分表】

    heisenberg是一款基于mysql协议的分库分表中间件服务器, High performance distributed database for mysql, define shardings ...

  2. 基于代理的数据库分库分表框架 Mycat实践

    192.168.199.75 MySQL . MyCAT master 192.168.199.74 MySQL slave 192.168.199.76 MySQL standby master 如 ...

  3. mysql 多维度分表_亿级订单数据分库分表设计方案(满足多维度查询:订单号、用户、商家、渠道)...

    根据业务初步预估订单业务量,每天500万的数据.我们将订单数据划分为了2大类型:分别为热数据和冷数据. 热数据:1个月内的订单数据,查询实时性较高; 冷数据:归档订单数据,查询频率不高; 根据实际业务 ...

  4. 架构组件:基于Shard-Jdbc分库分表,数据库扩容方案

    架构组件:基于Shard-Jdbc分库分表,数据库扩容方案 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 ( ...

  5. 当谈起分库分表时我们该关注什么

    当谈起分库分表时我们该关注什么 一.为什么分库分表 1.1 为什么分库 1.2 为什么分表 二.如何分表分库 1. 垂直切分 2.水平切分 二.分库分表面临的问题和对策 1. 分布式事务问题 2. 跨 ...

  6. 数据库(分库分表)中间件对比

    转自:http://www.cnblogs.com/cangqiongbingchen/p/7094822.html 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张 ...

  7. SpringBoot + ShardingSphere 秒级分库分表!

    Spring Boot 作为主流微服务框架,拥有成熟的社区生态.市场应用广泛,为了方便大家,整理了一个基于spring boot的常用中间件快速集成入门系列手册,涉及RPC.缓存.消息队列.分库分表. ...

  8. 数据库(分库分表)中间件对比(转)

    转载地址:https ://www.cnblogs.com/wangzhongqiu/p/7100332.html 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表 ...

  9. 数据库分库分表中间件对比(很全)

    数据库(分库分表)中间件对比 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件( ...

最新文章

  1. Gson:我爸是 Google
  2. 怎样检查Android网络连接状态
  3. vba抓取网页数据到excel_R语言网页数据抓取XML数据包
  4. When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向...
  5. java读取 500M 以上文件,java读取大文件
  6. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc
  7. Application Verifier
  8. linux设备驱动学习,linux设备驱动学习4
  9. 怎么查看表用了那个序列_3套阴瑜伽序列,让你身心平衡
  10. redis解决了分布式系统的session一致性问题
  11. [转]数据安全之SQL注入资料整理
  12. ERPSYSTEM开发教程01 框架介绍
  13. 应聘flash游戏开发面试技巧及建议
  14. 【函数】- 如何在C++中求平方根?
  15. C++实验02(02)华氏温度转换为摄氏温度
  16. RecyclerView通用适配器
  17. 青云诀2显示登录服务器超时,青云诀2游戏突然显示数据包损坏怎么办 解决方案分享...
  18. Dot.js中添加函数用法
  19. 阿里云环境(CentOS7.6)部署Zabbix5.0 Agent2
  20. 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T

热门文章

  1. Go条件语句、switch和循环语句
  2. DML数据操作语言练习
  3. STM32示波器 信号发生器
  4. Iphone开发之音频101(part 2):转换和录音
  5. 软件设计师-不确定有限自动机到确定有限自动机转换的例子
  6. JAVA高并发的三种实现
  7. python调用ping命令_在Python中调用Ping命令,批量IP的方法
  8. Spring事务详解与使用
  9. java cache-control_详解浏览器Cache-Control缓存策略
  10. iis 装完framework4 7 无法切换_扫盲贴之电压并列与电压切换