一、主从复制概述
MySQL
支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。
从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
单向复制有利于健壮性、速度和系统管理:
主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。
通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。
SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。
如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
二、复制原理
MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务
器可以对其数据拷贝执行相同的更新。
MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。
该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中
继日志并执行日志中包含的更新。
在前面的描述中,每个从服务器有3个线程。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。
默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪索引文件中目前正使用的中继日志。
默认中继日志索引文件名为ost_name-relay-bin.index。默认情况,在从服务器的数据目录中创建这些文件。可以用--relay-log和--relay-log-index服务器选项覆盖
默认文件名。日志处理:SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它。没有直接的删除中继日志的机制,因为SQL线程可以负责完成。然而,FLUSH LOGS可以循环中继日志,当SQL线程删除日志时会有影响。
例如,用FLUSH LOGS或mysqladmin flush-logs。我们也可以在mysql的配置文件里配置日志的保存时长。
三、配置实战
1. 主库
vi /etc/my.cnf
[mysqld]
datadir=/mnt/data/moon/db/data_1
socket=/home/moon/db/mysql_1/var/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
server-id = 1 #主服务器ID,主从集群中必须唯一
port = 5001 #端口号
log_bin = /mnt/data/moon/db/data_1/var/mysql-bin.log #打开日志
binlog-do-db=tradeplatform#要复制的库
binlog_ignore_db=mysql #不复制的库
expire_logs_days=3 #日志保存时长
slave-skip-errors=all #忽略所有错误
binlog_cache_size = 4M
max_binlog_size = 1G
max_binlog_cache_size = 2G
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
sync_binlog = 1
event_scheduler=ON #开启事件功能
auto_increment_increment = 2 #自增长key的增加因子
auto_increment_offset = 1 #自增长的开始增长数
log-slave-updates # 为了让slave也能充当master,写relay-log的时候也会写到bin-log
#master-host = xxxxxxxx
#master-user =xxxxxx
#master-password =xxxxxx
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
event_scheduler=ON #开启事件功能
#skip-locking 5.5以后的版本不识别了
skip-external-locking 跳过外部锁定
注意server_id问题
show variables like 'server_id';
set global server_id=41;
2.从库
vi /etc/my.cnf
datadir=/mnt/data/moon/db/data_1
socket=/home/moon/db/mysql_1/var/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
server-id = 1001 #主服务器ID,主从集群中必须唯一
port = 5001 #端口号
log_bin = /mnt/data/moon/db/data_1/var/mysql-bin.log #打开日志
binlog-do-db=tradeplatform#要复制的库
binlog_ignore_db=mysql #不复制的库
expire_logs_days=3 #日志保存时长
slave-skip-errors=all #忽略所有错误
binlog_cache_size = 4M
max_binlog_size = 1G
max_binlog_cache_size = 2G
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
sync_binlog = 1
event_scheduler=ON #开启事件功能
auto_increment_increment = 2 #自增长key的增加因子
auto_increment_offset = 1 #自增长的开始增长数
log-slave-updates # 为了让slave也能充当master,写relay-log的时候也会写到bin-log
#master-host = 192.168.1.147
#master-user =cmgesync
#master-password =cmgesyncpwd
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
event_scheduler=ON #开启事件功能
#skip-locking 5.5以后的版本不识别了
skip-external-locking 跳过外部锁定
sync_binlog = 1
默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),
使binlog在每N次binlog写入后与硬盘同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。
3.设置主从关系
1.在主库上添加帐号
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
Mysql> flush REPLICATION
FLUSH PRIVILEGES;
2.在主库上查出并保存复制要用的日志文件和复制点
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 3425 | tradeplatform| mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3.在主库上生成主库快照
mysql>flush tables with read lock;
[root@localhost ~]# mysqldump -uroot -p cmge > tradeplatform.sql;
mysqldump -uroot -pXXXXXXXXX tradeplatform> tradeplatform.sql;
unlock tables; #解锁
4.在从库中设置主从关系
Mysql >change master to master_host='xx.xx.xx.xx',master_user='reptradeplatform', master_password='XXXXXXXXX',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=3425;
>start slave;
在5.6的版本中,启动主从为:start slave,而之前用slave start也可以。
查看配置是否成功
如下表示成功
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.251.228.29
Master_User: reptradeplatform
Master_Port: 5001
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 3425
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 3425
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
分享到:
相关推荐
"使用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 主从复制中,主库可能已经运行了一段时间,并且已经有了数据,这种情况在实际业务中很常见。这时,如何应对开启主从复制前主库有数据的场景?本文将介绍两种解决...