mysql如何横向扩展_mysql高可用详解(五):面向横向扩展的mysql

【纵向扩展(向上扩展,scale up)】

购买更加强大的服务器来应对增加的负载;

【横向扩展(向外扩展,scale out)】

添加更多的服务器;

【横向扩展和复制的常见用途】

(1)读操作的负载均衡;

将只响应查询的服务器分离出来;

(2)写操作的负载均衡;

方式一:很少更新的表放在一个服务器上,而频繁更新的表分隔到多个服务器上;

方式二:按地理区域分隔,这样流量可以直接定向到最近的服务器;

(3)通过热备份进行灾难避免

配置一个专门的slave作为热备份,如果master发生故障,随时接手master的工作;

(4)通过远程备份进行灾难避免;

远程站点之间利用复制进行信息传输;

(5)制作备份;

留一个服务器专门做备份,这样可以在完全不影响master的前提下执行备份,;

(6)生成报表;

从服务器上的数据创建报表可能会降低服务器的性能;最好建立一个专门的slave来完成这项工作;

(7)过滤或者分区数据:

如果网络连接很慢,或者有些数据对某些客户端不可用,可以添加一个服务器进行数据过滤。同样适用于将数据分区到独立的服务器;

【横向扩展读操作,而不是写操作】

横向扩展方法只能扩展读操作,而不是写操作;

扩展写操作可以使用分片(sharding)的技术

【异步复制的价值】

MySQL的复制是异步(asynchronous)的,特别适合现代应用例如网站;

salve负责处理所有的读请求,master负责所有的写请求,这个复制过程是异步的,因为master不需要等待slave应用变更,而是将每个变更请求分发到各个slave;

如果复制要求master和slave同步,则salve不提交事务,则master也不能提交事务,也就是说,通过复制要求master必须等待所有的slave的写操作完成才能继续处理自己的事务;

异步复制比同步复制快的多;

异步复制是以牺牲一致性来换取性能。异步复制中事务的提交是立即报告的,不用等待任何来自slave的确认。

异步复制中存在的问题:

1.如果master出现故障,事务就会“消失”;

2.slave上返回的查询可能会返回旧数据;

【管理复制拓扑】

复制拓扑(通过创建新的slave,然后将它们添加到拓扑中可以扩展部署):

简单拓扑、树形拓扑、双主拓扑(处理故障转移)、环形拓扑;

简单拓扑和树形拓扑用来实现横向拓展;

环形复制和双主结构允许各个站点在本地运行的同时还能将变更复制到其他的站点;

需要负载均衡的情景:

(1)应用程序根据查询类型请求服务器;

(2)中间层(通常指代理)分析查询,然后发给适当的服务器;

实现基于代理的负载均衡的一个工具:MySQL Proxy,其中包含MySQL客户端协议的完整实现,既可以作为服务器用于客户端连接,也可以作为客户端连接到MySQL服务器。客户端不需要区分是代理还是真正的服务器;

负载均衡器:

硬件、简单软件负载均衡器、基于对等的系统。完全成熟的集群方案;

此外,还可以在DNS级别分发负载,或者直接在应用程序中分发负载

【应用层的负载均衡】

应用层的负载均衡最直接的方法就是:应用程序根据需要发出的查询类型向负载均衡器请求连接。根据应用程序发出的读查询或者写查询等信息,负载均衡器可以将应用程序连接到争取的服务器,然后应用程序就可以执行查询了;

应用层的负载均衡器需要一个中心存储,存储服务器信息以及这些服务器能够进行哪些查询。

【级联复制】

添加一个或者多个slave作为中继slave(简称中继服务器,relay),其目的就是通过管理一群slave来减轻master上的复制负载。

这种使用中继的方式称为级联复制(hierarchical replication);

relay与salve的区别:relay需要写二进制,但不应用变更;

【配置relay】

1、将slave配置成发送任何slave线程执行的事件,并将这些事件写入relay的binlog;

2、将relay上所有的表的存储引擎都改成BLACKHOLE存储引擎,保留空间并提到性能;

3、保证relay上所有的新表都使用BLACKHOLE引擎;

在my.cnf文件中添加log-slave-updates选项,配置relay发送slave线程事件。

除了log-slave-updates设置,还要向my.cnf文件中添加default-storage-engine更改默认的存储引擎。

通过命令SET STORAGE_ENGINE=’BLACKHOLE’可以暂时的修改relay的存储引擎,但是服务器重启无效;

引入新的relay步骤:

(1)将relay连接到master,将其角色修改为relay;

(2)依次将slave的连接切换到relay;

可以使用Python添加新表;

【专用slave】

使用少量的服务器专门存储很少访问的数据,多数服务器专门存储频繁访问的数据;

为此,需要在复制的时候分离表,MySQL通过过滤事件实现,在事件离开master或者到达slave的时候过滤它们;

【过滤复制事件】

过滤事件的两种方法:

(1)在master上过滤事件:

称为master过滤器:控制哪些日志写入到二进制日志,哪些发送给slave

(2)在slave上过滤事件:

称为slave过滤器:控制哪些在slave上执行;

对于slave过滤器来讲,事件会写入二进制日志然后发送到slave,直到事件执行的时候才进行过滤;

在my.cnf配置文件中配置过滤规则;

master过滤器:

配置项:

binlog-do-db配置写入二进制日志的数据库

binlog-ignore-db:配置需要忽略写入二进制日志的数据库;

slave过滤器:

slave过滤器有更多的选项,不仅可以基于数据库过滤事件,slave过滤器还可以过滤单个表甚至使用通配符过滤一组表;

replicant-do-db

replicant-ignore-db

replicant-do-table

replicant-wild-do-table

replicant-ignore-table

replicant-wild-ignore-table

【数据的一致性管理】

异步复制的问题之一就是一致性的管理;

为了避免slave上的数据比master上滞后的问题:基本的解决思路就是在每个master上提交的事务做个标记,等slave获取到这个事务的时候,才在slave上执行查询,这样就保证了slave上的数据已经更新过了;

《非级联部署的一致性》

如果所有的slave都连接在master上,那么一致性检查容易,

只需要在事务提交之后,记录此时binlog的位置,然后等待slave到达这个位置;

《级联部署的一致性》

在MySQL5.6之后,可以使用全局事务标识符来处理,直接使用WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS函数来代替MASTER_POS_WAIT即可;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值