架构设计:系统存储——MySQL简单主从方案及暴露的问题

更新时间:2016-11-04 10:51:55 点击次数:1940次

1、概述

从本篇文章开始我们将花一定的篇幅向读者介绍MySQL的各种服务集群的搭建方式。大致的讨论思路是从简的MySQL主从方案开始介绍,通过这种方案的不足延伸出更复杂的集群方案,并介绍后者是如何针对这些不足进行改进的。MySQL的集群技术方案特别多,这几篇文章会选择一些典型的集群方案向读者进行介绍。

2、MySQL简单主从方案及工作原理

我们讲解的版本还是依据目前在生产环境上使用多的Version 5.6进行,其中一些特性在Version 5.7和新的Version 8.0中有所改进,但这不影响读者通过文章去理解构建MySQL集群的技术思路,甚至可以将这种机制延续到MariaDB。例如马上要提到的MySQL自带的日志复制机制(Replicaion机制)。

MySQL自带的日志复制机制称为MySQL-Replicaion。从MySQL很早的 Version 5.1版本就有Replicaion技术,发展到现有版本该技术已经非常成熟,通过它的支持技术人员可以做出多种MySQL集群结构。当然,后文我们还会介绍一些由第三方软件/组件支持的MySQL集群方案。

2-1、MySQL-Replicaion基本工作原理

Replicaion机制从技术层面讲,存在两种基本角色:Master和Salve。Master节点负责在Replicaion机制中,向一个或者多个目标输出数据,而Salve节点负责在Replicaion机制中接受Master节点传来的数据。在实际业务环境下,Master节点和Salve节点还分别有另外一个名字:Write节点和Read节点——是的,利用Replicaion机制我们可以搭建以读写分离为目标的MySQL集群服务。但是为了保证读者在阅读文章内容时不会产生歧义,在本文(和后续文章)中我们都将使用Master节点和Salve节点这样的称呼。Replicaion机制依靠MySQL服务的二进制日志同步数据:

这里写图片描述

如上图所示,Salve在启动后会建立一个和Master节点的网络连接,当Master节点的二进制日志发生变化后,一个或者多个MySQL Salve服务节点就会通过网络接监听到这些变化日志。接着Salve节点会首先在本地将这些变化写入中继日志文件(Relay Log),这样做是为了尽量避免MySQL服务在出现异常时同步数据失败,其原理和之前介绍过的InnoDB Log的工作原理相似。当中继日志文件发生完成记录后,MySQL Salve服务会将这些变化反映到对应的数据表中,完成一次数据同步过程。后Salve会更新重做日志文件中的更新点(Position),并准备下一次Replicaion操作。

在这个过程中多个要素都可以进行配置,例如可以通过sync_binlog参数配置Master节点上数据操作次数和日志写入次数配比关系、可以通过binlog_format参数配置日志数据的信息结构、可以通过sync_relay_log参数配置Salve节点上系统接收日志数据与写入中继日志文件次数的配比关系。这些参数和其它一些在示例中使用的参数会在本文后续小节进行介绍。

2-2、MySQL一主多从搭建方式

介绍完MySQL Replicaion机制的基本工作方式后,我们紧接着就来快速搭建由一个Master节点和一个Salve节点构成的MySQL集群。读者可以从这个一主一从的MySQL集群方案扩展出任何一主多从的集群方案:

这里写图片描述

这个实例我们使用Version 5.6版本进行设置,当然version 5.7版本的安装也是类似的。另外,在Linux 操作系统上(Centos 5.6/5.7/6.X)安装MySQL服务和进行基本设置的过程,由于篇幅和文章定位原因这里就不再进行赘述。我们将分别在如下ip的Linux操作安装集群的Master节点和Salve节点:

2-2-1、设置Master服务器

首先需要更改MySQL Master服务my.cnf主配置文件的信息,主要目的是开启Master节点上的二进制日志功能(注意这里说的日志并不是InnoDB引擎日志)。

# my.cnf文件中没有涉及Replicaion机制的配置信息,就不在这里列出了 ...... # 开启日志 log_bin # 以下这些参数会在后文进行说明 sync_binlog=1 binlog_format=mixed
binlog-do-db=qiang binlog_checksum=CRC32 binlog_cache_size=2M max_binlog_cache_size=1G max_binlog_size=100M # 必须为这个MySQL服务节点设置一个集群中的 server id信息 server_id=140
......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在Master节点的设置中,有很多参数可以对日志的生成、存储、传输过程进行控制。具体可以参见MySQL官网中的介绍:http://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html。这里我们主要对以上配置示例中出现的参数进行概要介绍:

完成my.cnf文件的更改后,重启Linux MySql服务新的配置就生效了。接下来需要在Master节点中设置可供连接的Salve节点信息,包括进行Replicaion同步的用户和密码信息:

# 只用MySQL客户端,都可以进行设置:
# 这里我们直接使用root账号进行同步,但是生产环境下不建议这样使用
> grant replication slave on *.* to root@192.168.61.141 identified by '123456' # 通过以下命令,可以查看设置完成后的Master节点工作状态 > show master status;
+----------------+----------+--------------+------------------+-------------------+ | File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+ | kp2-bin.000002 |      404 | qiang        |                  |                   |
+----------------+----------+--------------+------------------+-------------------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

以上master节点状态的描述中,File属性说明了当前二进制日志文件的名称,它的默认位置在Linux操作系统下的var/lib/mysql目录下。Position属性说明了当前已完成日志同步的数据点在日志文件中的位置。Binlog_Do_DB属性是我们之前设置的,需要进行Replicaion操作的数据库名称,Binlog_Ignore_DB属性就是明确忽略的,不需要进行Replicaion操作的数据库名称。

2-2-2、设置Salve服务器

完成MySQL Master服务的配置后,我们来看看Salve节点该如何进行设置。这里我们只演示一个Salve节点的设置,如果您还要在集群中增加新的Salve节点,那么配置过程都是类似的。无非是要注意在Master节点上增加新的Salve节点描述信息。

首先我们还是需要设置Salve节点的my.cnf文件:

# my.cnf文件中没有涉及Replicaion机制的配置信息,就不在这里列出了 ......
# 开启日志
log-bin

sync_relay_log=1

# 必须为这个MySQL服务节点设置一个集群中的server id信息
server_id=140
......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在MySQL官方文档中也详细描述了中继日志的各种控制参数,这里我们只使用了sync_relay_log参数。这个参数说明了Salve节点在成功接受到多少次Master同步日志信息后,才刷入中继日志文件。这个参数可以设置为1到N的任意一个值,当然设置为1的情况下虽然会消耗一些性能,但对于日志数据来说却是安全的。

Salve的设置相对简单,接下来我们需要在Salve端开启相应的同步功能。主要是指定用于同步的Master服务地址、用户和密码信息:

# 请注意这里设置的用户名和密码信息要和Master上的设置一致 # 另外master log file所指定的文件名也必须和Master上使用的日志文件名一致 > change master to master_host='192.168.61.140',master_user='root',master_password='123456', master_log_file='kp2-bin.000002',master_log_pos=120; # 启动Savle同步 > start slave; # 然后我们就可以使用以下命令查看salve节点的同步状态 > show slave status; *************************** 1. row ***************************  Slave_IO_State: Waiting for master to send event  Master_Host: 192.168.61.140  Master_User: root  Master_Port: 3306  Connect_Retry: 60  Master_Log_File: kp2-bin.000002  Read_Master_Log_Pos: 404  Relay_Log_File: vm2-relay-bin.000002  Relay_Log_Pos: 565  Relay_Master_Log_File: kp2-bin.000002  Slave_IO_Running: Yes  Slave_SQL_Running: Yes  ......  Master_Server_Id: 140  Master_UUID: 19632f72-9a90-11e6-82bd-000c290973df  Master_Info_File: /var/lib/mysql/master.info  SQL_Delay: 0  SQL_Remaining_Delay: NULL  Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it  Master_Retry_Count: 86400  ......  Auto_Position: 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

完成以上过程,一主一从的MySQL集群就配置完成了。

2-3、一主多从方案的使用建议

一主多从的MySQL集群方案,已经可以解决大部分系统结构化数据存储的性能要求。特别是那种数据查询频率/次数远远大于数据写入频率/次数的业务场景,例如电商系统的商品模块、物流系统的车辆/司机信息模块、电信CRM系统的客户信息模块、监控系统中保存的基本日志数据。但是这种架构方案并不能解决所有的问题,而且方案本身有一些明显的问题(后文详细讨论),所以在这里本文需要为各位将要使用类似MySQL集群方案的读者提供一些使用建议。

3、方案暴露的问题

但是这种MySQL集群方案也存在很多问题需要进一步改进。在后续的文章中,我们会依次讨论MySQL集群中还存在的以下问题

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!