MySQL数据库复制概念及数据库架构不断扩展方案

MySQL Replication

系统扩展的方式:

scale up:向上扩展,垂直扩展    使用更高性能的硬件来扩展

scale out:向外扩展,水平扩展    提供更多的节点来提供更多的访问需求

复制:水平扩展的一种方案

如果构建一个httpd负载均衡集群会面临的问题:

当用户请求到达时,负载均衡器给调度到后端的各realserver上,如果web服务器允许用户上传数据,用户上传数据到第一个节点上,而后他又访问被调度到第三个节点上来,则数据就访问不到,如果要解决此问题,需要如何操作?使用共享存储,使用共享存储是块级别的共享存储还是文件级别的共享存储?文件级的为nas  块级别的为san ?

文件级别在系统调用接口上通常性能比块级别低,如果是块级别前端多个节点如果同时读写同一个文件,那怎么办?会出现资源争用      出现资源争用,如何解决此问题?把集群节点都做成高可用集群,做分布式文件锁,做成集群文件系统,而做集群文件系统,多个节点同时访问同一个文件时,节点数是很有限的,集群文件系统支持到16个节点基本上是上限了。

nas  文件级别性能很差,尤其是当节点大于4时。

这些节点都是共享存储,最理想的方式就是在本地存储,本地存储无法共享?有两三个节点时rsync是一种解决方案,大了性能就很低了

容量和访问量都很大时,需要使用分布式文件系统,前端有一个主控节点【集中式控制节点】,后端是大量节点

也有的是无主控节点,使用比较麻烦

分布式文件系统主要用来存储非结构化数据的,那结构化数据呢?如论坛一个帖子,需要存储在数据库服务器上,通常为MySQL服务器,也即在后端需要MySQL服务器,结构化数据需要放在数据库服务器上,MySQL也面临多个节点同时访问的问题,这里是不会出现资源争用问题的,因为MySQL自身会添加锁,其智能性都在MySQL上,如果是少量节点对MySQL读写是不会产生问题的,如果很多节点时,MySQL则应付不了那么多节点的请求,

开始时,解决方案就是向上进行扩展,由于向上扩展很容易达到极限

因此需要进行水平扩展,多台MySQL服务器,数据如何存放?MySQL服务器后台用共享存储?在什么级别共享?  nas   san?如果使用nas时,会出现资源争用,是解决不了此种情况的,此时就需要使用到MySQL复制功能(主从复制),所有前端节点的更新请求在主节点山,从节点在主节点上把数据复制一份,放在当前节点上,因此从节点和主节点都有一模一样的数据,前端读请求在从服务器上,主节点可读可写,从节点只能读,复制是单方向的,从主到从节点,

可以有多个读节点,在多个读节点上,则需要实现负载均衡,读请求实现负载均衡存在缺陷,MySQL本地有查询缓存,同一条语句发起的请求会负载在另外一个位置上,因此缓存就不能命中了,如果说后端有多个具有缓存能力的节点,这些节点缓存数据不一定相同,则需要提供解决方案来解决缓存命中率,有两种解决方案:

1.1在前端自己做负载均衡,也即在程序中如果请求语句是同一个服务器,则其将重复发到同一个节点上,根据语句做均衡,如何操作?  做取余法,每一个语句在向后端发起查询请求时,如何挑选?在应用程序中对查询语句做hash计算,取得其校验码,取得校验码后对服务器个数做取模计算,同一个数据的特征码是一样的,特征码一样取模结果就一定相同,此时,同一条语句会始终发送到同一个服务器。但是此种情况会存在一个问题了,当要添加和删除服务器时会导致所有缓存都命中不到了。

1.2解决上面方案的方法,使用一致性hash算法,把每一个节点的服务器都计算其hash码,对2^23取模,把0-2^32的数字均匀的分布到一个环上,把服务器分散到环上,每一个查询语句用hash计算后对2^32取模,取模后一定会落到环上,查询就是落到节点按顺时针到离他最近的节点,如果某节点坏了,则只影响部分缓存,

存在的问题:一致性hash有可能是偏斜的,也即各节点分布不均衡,导致压力不同

那如何解决此种文件,需要改进一下计算每一个

节点所在位置的hash所落在位置,此改进需要设置虚拟节点算法,把每一个节点通过用算法计算多次,也即一个节点可以在环上落n次,每一个节点都做单独计算

此时缓存命中就得到大的提升

缓存命中:

应用程序:(两种方法)

除模

一致性哈希

此时,缓存对程序的依赖还是很大的,如何减少耦合性,减少依赖,添加中间层,中间层可以理解MySQL语句,MySQL的反向代理,无论谁发来请求时,此节点知道到对应的位置做查询操作,知道操作是读还是写,能实现智能的将写请求发给主节点,读请求负载均衡到多个从节点,此节点叫MySQL代理(读写分离器)

读写分离器:

语句路由  核心功能MySQL的语句路由

制的功用:

负载均衡    将读写分开,读到多个节点

数据分布         数据分开到多个节点,避免带宽压力过大

备份                   每一个节点数据是一样的

高可用性         从服务器可以出现宕机

MySQL升级测试

复制架构的问题:

1、主节点是单点故障所在

2、写操作无法有效均衡   写操作过多时,无法均衡

对写操作做负载均衡,此时数据必须切开,将关联性不是很大的表分开存储,切开后每一个服务器都要各自复制,垂直切分   切割后存在的问题,数据有热点     有些热点集中在一个表上   再横向切割,按id进行切割  1-10W   10W-30W 。。。在不同的节点上,那切割后如何进行查询呢?读请求出现压力过大了,把数据库服务器节点找一个路由器实现统一路由,数据库如何进行切片?前端找一个节点,切的时候根据某个字段来切,

切割时把握的两个原则,读尽可能集中在有限节点或几个节点上,读节点越少越好,写节点越多越好,分担写

数据库扩展的思路两个:

复制、切片

MySQL复制的工作原理:

以两个节点为例:

MySQL日志类型:查询日志、慢查询日志、错误日志、二进制日志、事务日志、中继日志等

二进制日志的格式:记录的是能够引起数据库中的数据发生改变或者潜在影响其改变的那些语句     格式有三种:

语句: statement  基于语句来记录,能记录的数据量很小,存在的问题,如:记录使用某个函数生成的时间,在另外一个服务器上执行以后时间一定是不同的

行: row  能够提供精确数据,存在的问题如:发工资,每个人月薪加3000,基于语句时,一条update语句即可,基于行时,有很多人就要记录很多人的数据

混合:mixed   由MySQL自行智能决定

复制就是在从服务器上把主服务器上的二进制日志复制到本地重新走一遍,如何走?从服务器把自身认为是MySQL的客户端去连接主服务器,连到主服务器后不是做任何的查询操作,而是请求MySQL进程读其二进制日志,主服务器会启动一个dump线程,dump线程会从文件读取一个事件发送一个事件,从服务器接收到事件后,先把数据存下来,存取下来的文件叫中继日志,存下来以后,MySQL会启动一个线程sql ,此线程会从文件中读取语句并执行,

主服务器上启用二进制日志,启动的线程是dump线程,而在从服务器上有两个线程,

io线程和sql线程。io线程负责请求MySQL服务器,MySQL服务器会在必要时,有事件产生,会启动dump线程,在里面读取数据后,发送给从服务器,从服务器发给io线程,io线程读取后,保存在本地的中继日志中,sql线程从中继日志中读语句执行。从服务器读取后是否会产生二进制日志?从服务器上也会产生二进制日志(一般从服务器会关闭二进制日志功能),

复制有三个步骤:

1、在主库上启用二进制日志;

2、备库从主库复制二进制日志,并保存至本地的中继日志中;

3、备库从中继日志中读取事件并于本地执行一次;

在二进制日志中每一个日志事件会保存生成这个二进制日志的服务器的id号,在复制中,每一个服务器都有其唯一的一个id号。其id号有什么作用呢?避免造成环形复制。

MySQL复制支持双主模型:

master/master    都能写都能读

每一次本地请求都会记录到二进制日志中,而每一个节点同时作为对方的从节点,此时存在问题,会出现无限循环,如何解决此问题?给每一个服务器都记录好server-id,在哪个服务器上产生的,真正应用时,只应用id号为非本机日志事件,所以每一个服务器必须有存在一个唯一的id号

主主复制时,负载均衡就不存在了,因为本地不写也要从对方复制过来进行写操作,只起到高可用的作用。

主主复制问题:

1、自动增长的ID字段:解决:一端是偶数  一端是奇数

各自使用不同的数值:偶数或奇数

2、一张表中有:

年龄  工资  两个字段,在第一个主节点上,执行了根据年龄修改工资,在第二个节点上执行了根据工资修改年龄

大于40岁,工资+1000

所有工资为3000以下的,-2  年龄减2

加入用户年龄41岁,工资2800   则结果为什么?

41,3800  左节点

39,2800  右节点

此时就会对结果产生影响了

第三方项目:mmm: multi master mysql   多主MySQL,大量perl脚本

mha: mysql ha

MySQL复制:是异步进行   不建议使用双主模型

复制总结:

master:启用二进制日志,有惟一的server-id

binlogdump: 将从服务的io thread发出读取二进制日志事件的请求对应的数据发送给对方

slave:启用中继日志,并闭二进制日志(建议),有惟一的server-id

IOthread:向master请求二进制日志中的事件

SQLthread:从中继日志中读取事件并在本地执行

复制工作架构:

从服务器:有且只能有一个主服务器,避免从服务器混乱;

MariaDB10:支持多源复制,即支持多个主服务器;

主服务器:可以有多从

可否多级复制?  可以,中间从服务器需要启用二进制日志功能

异步:存在的问题从服务器的数据可能会落后于主服务器

提高缓存命中率的解决思路:

1、在程序中的解决:

取模

一致性哈希

2、使用公共缓存

memcached(引入的问题:一个服务器扛不住,做负载均衡,又存在缓存问题,又要使用到  取模   一致性hash)【只要是缓存服务器都会存在这样的问题】

时间: 2024-07-30 21:18:52

MySQL数据库复制概念及数据库架构不断扩展方案的相关文章

01.数据库基本概念

a. 数据库基本概念 i. 数据库:是表和数据库访问对象的集合,其中表分别存储了不同的实体信息,每一行数据对应一个实体的描述信息 i. 实体与记录: 1. 实体是所有客观存在的,可以被描述的事物 2. 记录:数据库中存储的数据表格,每一"行"实际上对应一个实体,这样的一行,在数据库中,通常叫做一条"记录" ii. 数据库管理系统(DNMS):是一种系统软件,由一个互相关联的数据集合和一组访问数据的程序构成,主要功能是维护数据库,并有效地访问数据库中各个部分的数据 i

数据库基本概念(一)

一.数据库基本概念 1.数据库与数据库管理系统 (1)数据库 数据库(DB)是存放数据的仓库,存放的这些数据存在一定的关联,并按照一定的格式存放在计算机上.广义上讲,数据不仅包括数字,还包括文本.图像.音频和视频等. (2)数据库管理系统 数据库管理系统(DBMS)是管理数据库的系统,它按照一定的数据模型组织数据. DBMS功能如下: 数据定义功能:可以定义数据库中的数据对象. 数据操纵功能:可以对数据库表进行基本操纵,如插入.删除.修改.查询等. 数据的完整性检查功能:保证用户输入的数据应满足

MySQL数据库——MMM高可用群集架构

概念 MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的). MMM高可用架构说明 mmm_mond:监控进程,负责所有的监控工作,决定和处理所有节点角色活动.此脚本需要在监管机上运行. mmm_agentd:运行在每个mysql服务器上的代理

MySQL数据库---MHA高可用群集架构

MHA概述 日本DeNA公司youshimaton (现就职于Facebook公司) 开发 一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件 MHA的组成 MHA Manager (管理节点) MHA Node (数据节点) MHA特点 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失 使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险 实验思路 1.MHA架构 (1)数据库安装 (2)一主两从 (3)MHA搭建 2.故障

MySQL数据库复制过滤

在复制的时候只复制数据库中的部分表,可以减少主从服务器的压力 在主服务器上 binlog-bin-db仅将指定数据库相关的修改操作计入二进制日志(一般来讲)[白名单] binlog-ignore-db[黑名单] 一旦主数据库发生故障,则无法立即还原引起较大的损失,因此主端的二进制日志是完整的 从服务器上 replicate-do-db[白名单]只应用哪个数据库到本地 replicate-ignore-db[黑名单] replicate-do-table使用指定表 replicate-ignore

常用SQL操作(MySQL或PostgreSQL)与相关数据库概念

本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; help show; 显示可用的数据库列表:show databases; 显示一个数据库内可用的表的列表:show tables; 显示表列:show columns from 一个表名; /describe 表名;  示例:show columns from customers;    desc

MySQL数据库的概念

学习数据库的一些知识,写写博客方便梳理以及巩固知识.关于什么是数据库就举一个例子来说明,说的可能不够准确,只要明白一个大概的意思就够了,深刻的学习还是要去看书的. 讲讲生活中有关数据的例子:在一个中学,记录学生的基本信息,记录什么呢?记录学生的姓名.年龄.故乡.传统的方法是在一张纸上画表格(见下面),然后填入相应的数据.那么一张这样的表就记录着一个班级中所有学生的姓名.年龄以及故乡.假设初一年级有10个班,初二年级有8个班,初三年级有15个班,那么初一年级就会有10张这样的表,初二年级就会有8张

mysql数据库‘复制’的办法

mysql数据库‘复制’的办法 2006-01-17 10:36:00 标签:Mysql SQL 数据库 休闲 职场 >mysqldump wap -u root -ppassword --add-drop-table | mysql test -u root -ppassword 这样就用本地的wap数据库,复制到了test数据库.当然,这里的例子数据库都数本地的.通过给定选项h,也可以指定一个远程的mysql. 这个例子,在做开发的时候很有用:用一个生产数据库的内容来填充开发数据库的内容.

mysql数据库复制—双主

一.实现环境 centos master1:172.16.20.245 master2:172.16.20.219 两数据库均是新安装 二.master1安装配置 1配置文件 #vim /etc/my.cnf server-id = 10 log-bin = mysql-bin log-bin-index = mysql-bin.index binlog-format = mixed relay-log = relay-mysql relay-log-index = relay-mysql.in