当前位置: 首页 > news >正文

大型数据库 实用解决方案

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 一、负载均衡技能

  负载均衡集群是由一组彼此独立的计算机体系构成,通过常规网络或专用网络进行衔接,由路由器衔接在一起,各节点彼此协作、共同负载、均衡压力,对客户端来说,整个群集能够视为一台具有超高性能的独立服务器。

  1、完成原理

  完成数据库的 负载均衡技能,首先要有一个能够操控衔接数据库的操控端。在这里,它截断了数据库和程序的直接衔接,由所有的程序来访问这个中间层,然后再由中间层来访问 数据库。这样,咱们就能够具体操控访问某个数据库了,然后还能够根据数据库的当时负载采取有用的均衡策略,来调整每次衔接到哪个数据库。

  2、完成多据库数据同步

  对于负载均衡,最重要的就是所有服务器的数据都是实时同步的。这是一个集群所必需的,因为,若是数不据实时、不一样步,那么用户从一台服务器读 出的数据,就有别于从另一台服务器读出的数据,这是不能允许的。所以必须完成数据库的数据同步。这样,在查询的时分就能够有多个资源,完成均衡。对比常用 的办法是Moebius for SQL Server集群,Moebius for SQL Server集群选用将核心程序驻留在每个机器的数据库中的办法,这个核心程序称为Moebius for SQL Server 中间件, 主要作用是监测数据库内数据的变化并将变化的数据同步到其他数据库中。数据同步完成后客户端才会得到响应,同步过程是并发完成的,所以同步到多个数据库和 同步到一个数据库的时刻基本持平;另外同步的过程是在事务的环境下完成的,保证了多份数据在任何时刻数据的一致性。正因为Moebius 中间件宿主在数据库中的创新,让中间件不但能知道数据的变化,并且知道引起数据变化的SQL语句,根据SQL语句的类型智能的采取不一样的数据同步的策略 以保证数据同步成本的最小化。

  数据条数很少,数据内容也不大,则直接同步数据

  数据条数很少,但是里面包含大数据类型,比方文本,二进制数据等,则先对数据进行压缩然后再同步,然后减少网络带宽的占用和传输所用的时刻。

  数据条数很多,此时中间件会拿到造成数据变化的SQL语句, 然后对SQL语句进行解析,分析其履行计划和履行成本,并选择是同步数据还是同步SQL语句到其他的数据库中。此种状况应用在对表布局进行调整或者批量更改数据的时分非常有用。

  3、优缺点

  (1) 扩展性强:当体系要更高数据库处置速度时,只需简单地增加数据库服务器就 能够得到扩展。

  (2) 可维护性:当某节点发生故障时,体系会主动检测故障并转移故障节点的应用,保证数据库的继续工作。

  (3) 安全性:因为数据会同步的多台服务器上,能够完成数据集的冗余,通过多份数据来保证安全性。另外它成功地将数据库放到了内网之中,非常好地保护了数据库的安全性。

  (4) 易用性:对应用来说完全透明,集群暴露出来的就是一个IP

  (1) 不能够依照Web服务器的处置才能分配负载。

  (2) 负载均衡器(操控端)故障,会导致整个数据库体系瘫痪。

  二、数据库的读写分离

  1,完成原理:读写分离简单的说是把对数据库读和写的操作分开对应不一样的数据库服务器,这样能有用地减轻数据库压力,也能减轻io压力。主数 据库提供写操作,从数据库提供读操作,其实在很多体系中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有用保证数据库完整 性。

  2,完成办法:在MS Sql server中能够运用发布定义的方法完成数据库复制,完成读写分离,复制是将一组数据从一个数据源拷贝到多个数据源的技能,是将一份数据发布到多个存储站点上的有用方法。运用复制技能,用户能够将一份数据发布到多台服务器上。复制技能能够保证分布在不一样地点的数据主动同步更新,然后保证数据的一致性。SQL SERVER复制技能类型有三种,分别是:快照复 制、事务复制、合并复制。SQL SERVER 主要选用出版物、订阅的方法来处置复制。源数据所在的服务器是出版服务器,负责宣布数据。出版服务器把要宣布的数据的所有改动状况的拷贝复制到分发服务 器,分发服务器包含有一个分发数据库,可接收数据的所有改动,并保存这些改动,再把这些改动分发给订阅服务器。

  3,优缺点

  (1)数据的实时性差:数据不是实时同步到自读服务器上的,当数据写入主服务器后,要在下次同步后才能查询到。

  (2)数据量大时同步效率差:单表数据量过大时刺进和更新因索引,磁盘IO等问题,性能会变的很差。

  (3)一起衔接多个(至少两个)数据库:至少要衔接到两个数据数据库,实际的读写操作是在程序代码中完成的,容易引起混乱

  (4)读具有高性能高可靠性和可弹性:只读服务器,因为没有写操作,会大大减轻磁盘IO等性能问题,大大提高效率;只读服务器能够选用负载均衡,主数据库发布到多个只读服务器上完成读操作的可弹性性。

  三、数据库拆分(分布式)

  通过某种特定的条件,将存放在同一个数据库中的数据涣散存放到多个数据库上,完成分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就能够降低单台机器的负载压力。

  笔直(纵向)拆分:是指按功能模块拆分,比方分为订单库、商品库、用户库...这种方法多个数据库之间的表布局不一样。

  水平(横向)拆分:将同一个表的数据进行分块保存到不一样的数据库中,这些数据库中的表布局完全相同。

  1,完成原理:运用笔直拆分,主要要看应用类型是否合适这种拆分方法,如体系能够分为,订单体系,商品办理体系,用户办理体系事务体系对比明 的,笔直拆分能很好的起到涣散数据库压力的作用。事务模块不明晰,耦合(表关联)度对比高的体系不适合运用这种拆分方法。但是笔直拆分方法并不能彻底解决 所有压力问题,例如 有一个5000w的订单表,操作起来订单库的压力仍然很大,如咱们需求在这个表中增加(insert)一条新 的数据,insert完毕后,数据库会对于这张表重新树立索引,5000w行数据树立索引的体系开销还是不容忽视的,反过来,假如咱们将这个表分成100 个table呢,从table_001一直到table_100,5000w行数据平均下来,每个子表里边就只要50万行数据,这时分咱们向一张只要 50w行数据的table中insert数据后树立索引的时刻就会呈数量级的降低,极大了提高了DB的运行时效率,提高了DB的并发量,这种拆分就是横向 拆分

  2,完成办法:笔直拆分,拆分方法完成起来对比简单,根据表名访问不一样的数据库就能够了。横向拆分的规则很多,这里总结前人的几点,

  (1)顺序拆分:如能够按订单的日前按年份才分,2003年的放在db1中,2004年的db2,以此类推。当然也能够按主键标准拆分。

  优点:可部分搬迁

  缺点:数据分布不均,能够2003年的订单有100W,2008年的有500W。

  (2)hash取模分: 对user_id进行hash(或者若是user_id是数值型的话直接运用user_id的值也可),然后用一个特定的数字,比方应用中需求将一个数据 库切分成4个数据库的话,咱们就用4这个数字对user_id的hash值进行取模运算,也就是user_id%4,这样的话每次运算就有四种能够:结果 为1的时分对应DB1;结果为2的时分对应DB2;结果为3的时分对应DB3;结果为0的时分对应DB4,这样一来就非常均匀的将数据分配到4个DB中。

  优点:数据分布均匀

  缺点:数据搬迁的时分麻烦;不能依照机器性能分摊数据 。

  (3)在认证库中保存数据库配置

  就是树立一个DB,这个DB单独保存user_id到DB的映射关系,每次访问数据库的时分都要先查询一次这个数据库,以得到具体的DB信息,然后才能进行咱们需求的查询操作。

  优点:灵活性强,一对一关系

  缺点:每次查询之前都要多一次查询,会造成必定的性能损失。

转载于:https://my.oschina.net/lichaoqiang/blog/482167

相关文章:

  • [家里蹲大学数学杂志]第409期与正弦对数有关的一个积分不等式
  • 初学者应学会如何加快seo
  • 网页的重绘和回流
  • Skype for Business Server 2015系列(三)部署前端服务器-2
  • 3.2.用户空间客体管理器
  • Nginx的流媒体插件nginx-rtmp-module
  • iOS开发UITableView基本使用方法总结
  • centos6.5下postgres-XC集群安装与配置(有standby案例)
  • 最近用到Bootstrap Multiselect来详细了解一下
  • python特殊注释
  • MySql | 查询缓存笔记
  • 我的Android进阶之旅------FastJson的简介
  • WebX5 Data判断当前行的值是否改变,以及改变当前行的状态
  • AngularJS学习笔记
  • 前辈的Linux学习心得
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • maven工程打包jar以及java jar命令的classpath使用
  • php ci框架整合银盛支付
  • python学习笔记-类对象的信息
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 将 Measurements 和 Units 应用到物理学
  • 解决iview多表头动态更改列元素发生的错误
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端面试之CSS3新特性
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 深度学习在携程攻略社区的应用
  • 微服务核心架构梳理
  • 用Canvas画一棵二叉树
  • 云大使推广中的常见热门问题
  • 2017年360最后一道编程题
  • 第二十章:异步和文件I/O.(二十三)
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 整理一些计算机基础知识!
  • ###项目技术发展史
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (4) PIVOT 和 UPIVOT 的使用
  • (AngularJS)Angular 控制器之间通信初探
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)德国人的记事本
  • (转)为C# Windows服务添加安装程序
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation