mysql--主从复制
1.概述
1.1 环境要求:
数据库主库: 1台 ---> master
数据库从库: 1台或多台 ----> slave
1.2 概述:
主从负责是指将主数据库的DDL语句和DML语句通过二进制日志传到从库数据库中,然后从库对主库的二进制日志重新执行(重做),从而使得从库和主库的数据保持同步.
MYSQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的数据库主库,实现链状复制.
1.3 主从复制的优点
1.3.1 当主库出现问题后,可以快速进行数据库的切换,从库提供服务;
1.3.2 实现数据库的读写分离,从而降低数据库的访问压力.
主库 ---> 负责写入
从库 ----> 负责读取
1.3.3 可以在从库中执行数据的备份,主库负责数据的处理(增删改查).
从而避免数据库数据备份时影响到主库的服务.
2.原理
当MySQL数据库执行数据的增、删、改操作时,会将这些事件记录到二进制日志(binlog)中,这些日志会被发送到每台从服务器上。
在从服务器上有两个线程:I/O线程和SQL线程,
I/O线程用于接收日志并将其转换为中继日志(relaylog)
SQL线程将中继日志的内容进行应用。
简而言之,MySQL的主从复制通过日志的传递和应用,实现从服务器与主服务器的数据一致。
3.部署
3.1 需要准备两台以上数据库实例
# 数据库节点01服务已经构建完毕 mysqld_safe --defaults-file=/data/3307/data/my.cnf & netstat -lntp|grep 3307 tcp6 0 0 :::3307 :::* LISTEN 114722/mysqld #启动节点 mysql -S /tmp/mysql3307.sock # 数据库节点02服务已经构建完毕 mysqld_safe --defaults-file=/data/3308/data/my.cnf & netstat -lntp|grep 3308 tcp6 0 0 :::3308 :::* LISTEN 122865/mysqld #启动节点 mysql -S /tmp/mysql3308.sock
3.2 主数据库二进制日志功能开启
# 主数据库需要开启binlog日志功能 mysql> show variables like '%log_bin%'; +---------------------------------+--------------------------------------+ | Variable_name | Value | +---------------------------------+--------------------------------------+ | log_bin | ON | | log_bin_basename | /data/3307/data/binlog | | log_bin_index | /data/3307/data/binlog.index | | sql_log_bin | ON | +---------------------------------+--------------------------------------+ 6 rows in set (0.01 sec) -- 核实确认binlog日志功能在主库上已经开启
3.3 核实主从复制主机的信息情况
# 确认多个复制节点的服务标识不同(server id/server_uuid) mysql> set global server_id=7; Query OK, 0 rows affected (0.00 sec) mysql> select @@server_id; +-------------+ | @@server_id | +-------------+ | 7 | +-------------+ 1 row in set (0.00 sec) mysql> select @@server_uuid; +--------------------------------------+ | @@server_uuid | +--------------------------------------+ | 949efd68-6420-11ed-b1ad-000c2996c4f5 | +--------------------------------------+ 1 row in set (0.00 sec) -- 主库上server_id server_uuid信息(3307节点做检查) mysql> set global server_id=8; Query OK, 0 rows affected (0.00 sec) mysql> select @@server_id; +-------------+ | @@server_id | +-------------+ | 8 | +-------------+ 1 row in set (0.00 sec) mysql> select @@server_uuid; +--------------------------------------+ | @@server_uuid | +--------------------------------------+ | ed6c1c6f-6f33-11ed-b630-000c2961cd06 | +--------------------------------------+ 1 row in set (0.00 sec) -- 从库上server_id server_uuid信息(3308节点做检查) -- 根据服务标识信息的不同,可以用于在进行主从复制时,辨别节点之间的关系 # 确认多个复制节点的时间信息同步 date 2022年 11月 30日 星期三 23:44:37 CST date 2022年 11月 30日 星期三 23:44:52 CST -- 核心确认主从节点时间信息同步 # 确认多个复制节点的版本信息一致 mysql -V mysql Ver 8.0.26 for Linux on x86_64 (MySQL Community Server - GPL) mysql -V mysql Ver 8.0.26 for Linux on x86_64 (MySQL Community Server - GPL) -- 部分实际应用场景中可以支持不一致,但是复制源端可以是低版本,复制目标端可以是高版本,反之不行;
3.4 创建主从数据同步的用户信息
# 在主库上创建复制同步数据用户 mysql> create user repl@'10.0.0.%' identified with mysql_native_password by '123456'; Query OK, 0 rows affected (0.01 sec) mysql> grant replication slave on *.* to repl@'10.0.0.%'; Query OK, 0 rows affected (0.00 sec) -- 从库会利用主库上的同步数据用户,进行数据同步传输操作
3.5 进行从库部分数据信息的同步
# 可以将主库上的部分数据在从库上先进行同步 mysqldump -uroot -A -S /tmp/mysql3307.sock --master-data=2 --single-transaction >/tmp/full.sql -- 在3307主库上进行数据的全备(模拟企业环境的历史数据全备) mysql -S /tmp/mysql3308.sock mysql> source /tmp/full.sql; -- 在3308从库上进行数据的恢复(模拟企业环境的历史数据恢复) -- 将原有主机的数据先备份,然后从库中进行恢复一部分数据,随后再进行数据信息同步追加 -- 可以利用同步方式有很多:mysqldump xtrabackup clone_plugin
3.6 配置主从节点数据复制的信息
# 设置从库连接主库信息,定义从库连接主库同步位置点自动复制 mysql> help change master to -- 获取连接主库,以及定义同步位置点的数据库配置模板信息 vim /tmp/full.sql -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=681; -- 通过备份文件获取同步位置点信息 mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_PORT=3307, MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=681, MASTER_CONNECT_RETRY=10; -- 以上配置主从同步信息在从库进行执行;
3.7 激活主从节点数据复制的线程
# 利用相应线程实现主从数据库的数据同步复制 mysql> start slave; -- 在从库上激活数据复制同步功能 # 若此时数据同步失败可以重新开启同步功能 mysql> stop slave; mysql> reset slave all; -- 在从库上重置数据复制同步功能,重新配置change master to信息,然后重新激活同步复制功能; # 进行核实主从同步功能是否实现 mysql -S /tmp/mysql3307.sock mysql> create database xiaoq; -- 在主库模拟创建数据信息 mysql -S /tmp/mysql3308.sock mysql> show databases; -- 在从库模拟查看数据信息(确认是否同步数据) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 10.0.0.51 Master_User: repl Master_Port: 3307 Connect_Retry: 10 Master_Log_File: binlog.000003 Read_Master_Log_Pos: 869 Relay_Log_File: xiaoQ-01-relay-bin.000002 Relay_Log_Pos: 509 Relay_Master_Log_File: binlog.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes -- 从库上查看数据同步状态情况,看到上面的两个Yes信息,就表示主从数据同步功能设置成功了
浙公网安备 33010602011771号