高性能MySQL集群详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高性能MySQL集群详解相关的知识,希望对你有一定的参考价值。
一.通过Keepalived搭建mysql双主模式的高可用集群系统
1.MySQL Replication介绍:
MySQL Replication是MySQL自身提供的一个主从复制功能,其实也就是一台MySQL服务器(称为Slave)从另一台MySQL服务器(称为Master)上复制日志,然后解析日志并应用到自身的过程。MySQL Replication是单向、异步复制,基本复制过程为:Master服务器首先将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志的循环,这些日志文件可以发送到Slave服务器进行更新。当一台Slave服务器连接Master服务器时,它从Master服务器日志中读取上一次成功更新的位置。然后Slave服务器开始接收从上一次完成更新后发生的所有更新,所有更新完成,将等待主服务器通知新的更新。
MySQL Replication支持链式复制,也就是说Slave服务器下还可以再链接Slave服务器,同时Slave服务器也可以充当Master服务器角色。这里需要注意的是,在MySQL主从复制中,所有表的更新必须在Master服务器上进行,Slave服务器仅能提供查询操作。
基于单向复制的MySQL Replication技术有如下优点:
□增加了MySQL应用的健壮性,如果Master服务器出现问题,可以随时切换到Slave服务器,继续提供服务。
■可以将MySQL读、写操作分离,写操作只在Master服务器完成,读操作可在多个Slave服务器上完成,由于Master服务器和Slave服务器是保持数据同步的,因此不会对前端业务系统产生影响。同时,通过读、写的分离,可以大大降低MySQL的运行负荷。
□在网络环境较好,业务量不是很大的环境中,Slave服务器同步数据非常快,基本可以达到实时同步,并且,Slave服务器在同步过程中不会干扰Master服务器。
MySQL Replication支持多种类型的复制方式,常见的有基于语句的复制、基于行的复制和混合类型的复制。下面分别进行介绍。
(1)基于语句的复制
MySQL默认采用基于语句的复制,效率很高。基本方式是:在Master服务器上执行的SQL语句,在Slave服务器上再次执行同样的语句。而一旦发现没法精确复制时,会自动选择基于行的复制。
(2)基于行的复制
基本方式为:把Master服务器上改变的内容复制过去,而不是把SQL语句在从服务器上执行一遍,从MySQL5.0开始支持基于行的复制。
(3)混合类型的复制
其实就是上面两种类型的组合,默认采用基于语句的复制,如果发现基于语句的复制无法精确完成,就会采用基于行的复制。
2.MySQL Replication实现原理:
MySQL Replication是一个从Master复制到一台或多台Slave的异步过程,在Master与Slave之间实现整个复制过程主要由三个线程来完成,其中一个IO线程在Master端,另两个线程(SQL线程和IO线程)在Slave端。
要实现MySQL Replication,首先在Master服务器上打开MySQL的Binary Log(产生二进制日志文件)功能,因为整个复制过程实际上就是Slave从Master端获取该日志,然后在自身上将二进制文件解析为SQL语句并完全顺序地执行SQL语句所记录的各种操作。更详细的过程如下。
1)首先Slave上的IO线程连接上Master,然后请求从指定日志文件的指定位置或者从最开始的日志位置之后的日志内容。
2)Master在接收到来自Slave的IO线程请求后,通过自身的IO线程,根据请求信息读取指定日志位置之后的日志信息,并返回给Slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括此次返回的信息在Master端对应的Binary Log文件的名称以及在Binary Log中的位置。
3)Slave的IO线程接收到信息后,将获取到的日志内容依次写入Slave端的Relay Log文件(类似于mysql-relay-bin.xxxxxx)的最后,并且将读取到的Master端的Binary Log的文件名和位置记录到一个名为master-info的文件中,以便在下一次读取的时候能迅速定位开始往后读取日志信息的位置。
4)Slave的SQL线程在检测到Relay Log文件中新增加了内容后,会马上解析该Relay Log文件中的内容,将日志内容解析为SQL语句,然后在自身执行这些SQL,由于是在Master端和Slave端执行了同样的SQL操作,所以两端的数据是完全一样的。至此整个复制过程结束。
3.MySQL Replication常用架构
MySQL Replication技术在实际应用中有多种实现架构,常见的有:
☆一主一次,即一台Master服务器和一台Slave服务器。这是最常见的架构。
★一主多从,即一台Master服务器和两台或两台以上Slave服务器,经常用在写操作不频繁、查询量比较大的业务环境中。
☆主主互备,又称双主互备,即两台MySQL Server互相将对方作为自己的Master,自己又同时作为对方的Slave来进行复制。主要用于对MySQL写操作要求比较高的环境中,避免了MySQL单点故障。
★双主多从,其实就是双主互备,然后再加上多台Slave服务器。主要用于对MySQL写操作要求比较高,同时查询量比较大的环境中。
其实可以根据具体的情况灵活地将Master/Slave结构进行变化组合,但万变不离其宗,在进行MySQL Replication的各种部署之前,必须遵守的规则如下:
◇同一时刻只能有一台Master服务器进行写操作。
◆一台Master服务器可以有多台Slave服务器。
◇无论是Master服务器还是Slave服务器,都要确保各自的ServerID唯一,否则双主互备就会出现问题。
◆一台Slave服务器可以将其从Master服务器获得的更新信息传递给其他的Slave服务器。
4.MySQL主主互备模式架构
企业级MySQL集群具备高可用、可扩展、易管理、低成本的特点。下面将介绍企业环境中经常应用的一个解决方案,即MySQL的双主互备架构,主要设计思路是通过MySQL Replication技术将两台MySQL Server互相将对方作为自己的Master,自己又同时作为对方的Slave来进行复制。这样就实现了高可用架构中的数据同步功能,同时,将采用Keepalived来实现MySQL的自动failover。在这种架构中,虽然两台MySQL Server互为主从,但同一时刻只能有一台MySQL Server可读写,而另一台MySQL Server只能进行读操作,这样可保证数据的一致性。整个架构如下图:
5.MySQL主主互备模式配置
MySQL主从复制的配置还是比较简单的,仅仅需要修改MySQL配置文件即可,这里要配置的是主主互备模式,但配置过程和一主一从结构是完全一样的,配置环境如下:
主机名 操作系统版本 MySQL版本 主机IP MySQL VIP
DB1(Master) CentOS release 6.7 mysql-5.1.73 10.0.0.35 10.0.0.40
DB2(Slave) CentOS release 6.7 mysql-5.1.73 10.0.0.36
1.修改MySQL配置文件
在默认情况下,MySQL的配置文件是/etc/my.cnf,首先修改DB1主机的配置文件,在/etc/my.cnf文件中的“[mysqld]”段添加如下内容:
server-id=1
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
然后修改DB2主机的配置文件,在/etc/my.cnf文件中的“[mysqld]”段添加如下内容:
server-id=2
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
其中,server-id是节点标识,主、从节点不能相同,必须全局唯一。log-bin表示开启MySQL的binlog日志功能。“mysql-bin”表示日志文件的命名格式,会生成文件名为mysql-bin.000001、mysql-bin.000002等的日志文件。relay-log用来定义relay-log日志文件的命名格式。replicate-wild-ignore-table是个复制过滤选项,可以过滤不需要复制的数据库或表,例如“mysql.%”表示不复制MySQL库下的所有对象,其他以此类推。与此对应的是replicate-wild-do-table选项,用来指定需要复制的数据库或表。
这里需要注意的是,不要在主库上使用binlog-do-db或binlog-ignore-db选项,也不要在从库上使用replicate-do-db或replicate-ignore-db选项,因为这样可能产生跨库更新失败的问题。推荐在从库使用replicate-wild-do-table和replicate-wild-ignore-table两个选项来解决复制过滤问题。
2.手动同步数据库
以上是关于高性能MySQL集群详解的主要内容,如果未能解决你的问题,请参考以下文章