前面说的分区、分表都是基于同一数据库本事的一些结构优化,而当访问量巨大的情况单一的数据库服务器是无法满足压力要求的,MySQL为我们提供了复制功能,使得多台MySQL服务器共享数据,从而实现负载均衡。
首先我们来看一张图,了解一下主从复制的物理结构:
从图上我们可以直观的看出MySQL主从复制的机制就是:
1.主服务器(Master)执行SQL语句成功后将执行结果记录在"Binary log"(二进制文件)中。
2.从服务器(Slave)的I/O进程负责连接主服务器,连接成功后主服务器从指定位置(起初为开始位置)读取"Binary log"文件并返回,返回的内容包括"Binary log"改动内容,日志文件名及读取到的位置。
3.从服务器接受内容之后将内容添加到"Relay log"(中继日志)尾部。将二进制文件名称及读取到的位置记录在"Master info"文件中以便下次利用。
4.从服务器的SQL进程在实时监控着"Relay log"文件,当有新增内容出现时,SQL进程将文件内容转换成可执行的SQL内容并更新到数据中。
Mysql为了解决这个风险并提高复制的性能,将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Yahoo!的一位工程师“Jeremy Zawodny”。这样既解决了性能问题,又缩短了异步的延时时间,同时也减少了可能存在的数据丢失量。当然,即使是换成了现在这样两个线程处理以后,同样也还是存在slave数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事务中,这些问题都是会存在的。如果要完全避免这些问题,就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案,需要将所有数据都load到内存中,这样就对内存的要求就非常大了,对于一般的应用来说可实施性不是太大。
主从复制的架构绝大多数是“一主多从”,因为我们默认的认为读取数据的次数是远远大于更新的,事实证明绝大多数情况是这样的。这样做的好处就是将压力很好的分散,甚至我们可以通过购买廉价的服务器来扩充从服务器数量。
当然这种结构并不是没有问题,读写不同步,数据丢失等等,这些问题我们会在最后去讨论,下面开始我们的主从服务器配置工作(条件有限,以一主一从为例)。
配置主服务器:
1.安装MySQL,安装过程就不说了,可以查看前面的文章。假定安装成功之后主服务器ip为192.168.0.1;从服务器ip为192.168.0.2.
2.登录主服务器MySQL,建立一个供Slave端使用的账号,提供复制和连接权限,输入命令:
- grant replication slave on *.* to slave1@192.168.0.2 identified by '123456';
slave1@192.168.0.2:为用户名和ip
'123456':为slave1的密码
3.配置my.cnf,我这里的my.cnf是放在/etc/mysql/下的,找到以下两行内容:
server-id=1
有注释的将注释去掉,并修改为以上值。
4.查看主服务器binary log日志名和复制到的位置,输入命令:
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000070 | 241 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
5.锁定master服务器所有表的写入,防止我们在操作过程中数据被修改,SQL状态下输入命令:
- flush tables with read lock;
6.备份数据库,利用mysqldump工具,在shell状态下输入以下命令:
- mysqldump -h127.0.0.1 -p3306 -uroot -p “数据库名” > /home/back.sql
mysqldump -u用户名 -p密码 -h主机 数据库 a -w "sql条件" --lock-all-tables > 路径
详细用法可以参照我的另一篇文章。
7.备份完成后解锁数据库,SQL状态下输入:
- unlock tables;
配置从服务器:
1.修改从服务器的my.cnf文件:
server-id=2
#日志存放位置
log_bin = /var/log/mysql/mysql-bin.log
#主服务器ip
master-host =192.168.0.1
#用于复制的用户,也就是我们最开始创建的那个
master-user=slave1
#用户密码
master-pass=123456
#端口
master-port =3306
#连接超时时间,单位为“秒”,默认值为3600,即1小时
master-retry-count=10
#要复制的数据库,这句话谨慎使用,如果没有特殊情况最好不用,因为这句话有隐患会引起问题
replicate-do-db =test
2.导入主服务器数据库的备份脚本back.sql,输入命令:
- source /home/back.sql;
3.开启从服务器同步服务,命令比较简单,SQL状态下输入:
- start slave;
4.查看Slave状态:
- mysql> SHOW SLAVE STATUS\G
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.0.2
- Master_User: root
- Master_Port: 3306
- Connect_Retry: 4
- Master_Log_File: mysql-bin.003
- Read_Master_Log_Pos: 79
- Relay_Log_File: mysql -relay-bin. 003
- Relay_Log_Pos: 548
- Relay_Master_Log_File: mysql -bin. 003
- #Slave IO进程状态
- Slave_IO_Running: Yes
- #Slave SQL进程状态
- Slave_SQL_Running: Yes
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Last_Errno: 0
参数也比较简单,上面都介绍过来,一看就懂了。
5.我们此时可以更新一下主服务器的数据库,再到从服务器中验证结果,下篇文章我们会讨论一下这种机制的问题及解决办法。
主从复制一般会设置一台性能较好的主服务器,复制更新数据的操作,理论上我们认为查询操作的数量级远远大于更新的操作,所以需要准备多台从服务器组成负载均衡结构供外部查询。负载均衡可以使用mysql proxy或其他产品,这些内容我们之后会接触到。
相关推荐
"使用keepalived实现对mysql主从复制的主备自动切换" 本文主要讲解如何使用keepalived实现对mysql主从复制的主备自动切换。keepalived是一款高可用性解决方案,可以实现虚拟IP的管理和服务监控,在mysql主从复制...
### MySQL主从复制搭建知识点详解 #### 一、MySQL主从复制概述 MySQL主从复制是一种数据同步机制,它能够将一个MySQL服务器(主服务器)的数据自动同步到一个或多个MySQL服务器(从服务器)。这种机制不仅可以提高...
MySQL 主从复制与读写分离 MySQL 主从复制是指将一个 MySQL 服务器的数据实时同步到另一个 MySQL 服务器中,以实现数据的高可用性和读写分离。下面是 MySQL 主从复制与读写分离的详细知识点: MySQL 主从复制 ...
MySQL主从复制模式是数据库领域内一种重要的数据同步机制,它能够让一台主数据库服务器(master)的数据实时复制到一个或多个从数据库服务器(slave)上。这种机制在数据库的高可用性、数据备份、读写分离以及负载...
MySQL 主从复制环境搭建 MySQL 是一个轻量级的开源框架,具有速度快、多线程、多用户和跨平台等特点。MySQL 主从复制是指将一个 MySQL 服务器的数据实时同步到另一个 MySQL 服务器上,通常用于提高数据安全、负载...
### MySQL 主从复制详解 #### 一、引言 MySQL 的主从复制是一种常见的数据库架构模式,它能够帮助实现数据的自动备份与读写分离,从而增强数据安全性并提高数据库性能。本文将详细介绍 MySQL 主从复制的基本概念、...
MySQL主从复制是一种数据库高可用性和数据冗余的重要机制,它允许数据从一个服务器(主节点)同步到一个或多个其他服务器(从节点)。在本实践中,我们将深入探讨这一模式的各个方面,包括其工作原理、配置步骤、...
MySQL主从复制是一种常见的数据库高可用性和数据冗余策略,它允许数据在多个服务器之间同步,确保即使在主服务器故障时,从服务器也能接管服务,从而实现无中断的服务连续性。这里提到的“MySQL主从复制搭建 需要...
在本讲中,我们将深入探讨如何使用SpringBoot与MySQL实现主从复制以及读写分离的架构设计。这一技术方案在大型分布式系统中尤为常见,它能够有效地提高数据库系统的可用性和性能。 首先,让我们理解主从复制的核心...
MySQL主从复制与读写分离是数据库架构中的重要策略,旨在提高系统的可用性、扩展性和数据安全性。在大型系统中,随着数据量的增长和访问压力的增加,单一数据库服务器往往无法满足性能需求。主从复制和读写分离是...
"Mysql主从复制" Mysql主从复制是一种常用的数据库复制方式,旨在提高数据库的可用性、安全性和读取性能。在Mysql主从复制中,一个数据库服务器充当主服务器,其他服务器充当从服务器。主服务器负责写入数据,而从...
docker_compose搭建mysql主从复制
关于博客: https://blog.csdn.net/qq_42413011/article/details/126914080 的搭建脚本
MySQL主从复制是数据库高可用性的一种常见策略,它允许数据在多个服务器之间实时或近实时地同步。这种配置使得当主服务器发生故障时,从服务器可以接管服务,确保业务连续性。在这个场景中,主机A(192.168.5.171)...
MySQL 主从复制主库已有数据的解决方案 在 MySQL 主从复制中,主库可能已经运行了一段时间,并且已经有了数据,这种情况在实际业务中很常见。这时,如何应对开启主从复制前主库有数据的场景?本文将介绍两种解决...