当前位置: 首页 > news >正文

mysql数据库-3 (主从复制)

1.主从复制工作原理【M】

主从同步原理细节拆解
主配置文件解读修改主节点配置文件
[mysqld]
log_bin=/data/logbin/mysql-bin #启用二进制日志 
server-id=N                    #为当前节点设置全局唯一IDserver-id的取值范围1 to 4294967295 (>= MariaDB 10.2.2),默认值为1,如果从节点为0,所有master都将拒绝此
slave的连接,可以使用当前主机节点的最后一位IP作为server-id,如果主节点为0,则拒绝所有从节点的连
接。查看从二进制日志的文件和位置开始进行复制
show master status;创建有复制权限的用户账号
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';#MySQL8.0 分成两步实现
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
从节点配置解读
使用有复制权限的用户账号连接至主服务器,并启动复制线程
https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html #文档修改配置文件
[mysqld]
server_id=N #为当前节点设置一个全局惟的ID号
log-bin #开启从节点二进制日志
read_only=ON #设置数据库只读,针对supper user无效
relay_log=relay-log #relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index #默认值hostname-relay-bin.index使用有复制权限的用户账号连接至主服务器
在从节点上执行下列SQL语,提供主节点地址和连接账号,用户名,密码,开始同步的二进制文件和位置等。
CHANGE MASTER TO MASTER_HOST='masterhost', #指定master节点
MASTER_USER='repluser', #连接用户
MASTER_PASSWORD='replpass', #连接密码
MASTER_LOG_FILE='mariadb-bin.xxxxxx', #从哪个二进制文件开始复制
MASTER_LOG_POS=123, #指定同步开始的位置
MASTER_DELAY = interval; #可指定延迟复制实现防止误操作,单位秒,这里可以用作延时同步,一般用于备份START SLAVE [IO_THREAD|SQL_THREAD]; #启动同步线程
STOP SLAVE #停止同步
RESET SLAVE ALL #清除同步信息
SHOW SLAVE STATUS; #查看从节点状态
SHOW RELAYLOG EVENTS in 'relay-bin.00000x'; #查看relaylog 事件
#可以利用 MASTER_DELAY 参数设置从节点延时同步,用作主从备份,比如设置一小时的延时,则主节点上
的误操作,要一小时后才会同步到从服务器,可以利用时间差保存从节点数据

2.集群实践(零数据一主一从实践)

集群环境架构
主机IP:10.0.0.12       角色:master   mysql版本: 8.0.41    rocky系统
主机IP:10.0.0.15       角色:slave      mysql版本:8.0.41    rocky系统
1.1 主节点配置 (10.0.0.12)     特性:可读可写
mkdir -pv /data/mysql/logbin                # 创建目录
chown -R mysql.mysql /data/mysql/    # 修改属主属组
vim /etc/my.cnf.d/mysql-server.cnf       #修改 mysql 配置  在mysqld下面添加下面的信息
[mysqld]                                                                           # 指定服务端配置
server-id = 177                                                                  # 指定 server-id
log_bin =/ data / mysql / logbin / mysql-bin                             # 指定二进制文件路径
default_authentication_plugin = mysql_native_password # 避免出现认证问题
重启服务后,查看效果
systemctl restart mysqld  # 重启 mysql 服务
ll /data/mysql/logbin/        # 查看二进制日志
登录到 mysql 确认效果  
show master logs;
同步账号授权
create user repluser@ '10.0.0.%' identified by '123456' ;
grant replication slave on *.* to repluser@ '10.0.0.%' ;  
flush privileges;
如果需要指定插件的话,使用如下命令
CREATE USER 'repluser' @'10 .0.0 . % ' IDENTIFIED WITH mysql_native_password BY ' 123456 ';
--------------------------------------------------------------------------------------------------------------------------------
扩展联想内容(与本事件无关) 登录 Navicat 工具时也需要进行权限的设置
10.0.0.13 主机上,为远程连接创建用户并赋予连接权限
mysql > create user root @'10 .0.0 . % ' identified by ' 12345678 ';    #由于密码策略,所以8位密码
因为该账号会为后面的 架构环境用户赋予操作权限,所以,这里需要指定 with 选项。
mysql > grant all privileges on * . * to root @'10 .0.0 . % ' with grant option;
刷新权限
flush privileges;
---------------------------------------------------------------------------------------------------------------------------------
1.2 从节点配置  (10.0.0.15)    特性:只可读
mkdir -pv /data/mysql/logbin
chown -R mysql.mysql /data/mysql/
vim /etc/my.cnf.d/mysql-server.cnf    从节点 mysql 配置
[mysqld]
server-id = 183                                                                  # 指定 server-id
read-only=1                                                                     # 只读模式(与主节点配置不一样的地方)
log-bin =/ data / mysql / logbin / mysql-bin                              # 指定二进制文件路径
default_authentication_plugin = mysql_native_password # 避免出现认证问题
重启服务
systemctl restart mysqld.service  
ll /data/mysql/logbin/      #效果    
登录数据库后确认效果
show slave status;
Empty set , 1 warning ( 0.00 sec)
从节点部署细节(不是步骤可略过)
问题: mysql 主从复制的时候, slave 节点,必须添加 read-only 属性么?
MySQL 主从复制中, slave 节点并非必须添加 read-only 属性,这取决于你的业务需求,下面分别介绍添加和不添加的情况。
临时设置(重启失效)
SET GLOBAL read_only = ON; -- 开启只读       SET GLOBAL read_only = OFF; -- 关闭只读永久设置(修改配置文件) 
编辑my.cnf或my.ini:
[mysqld]
read_only = 1 -- 1表示开启,0表示关闭
master 主机确认数据效果
查看 master 的日志数据信息
show master logs;
show master status\G;
结果显示: 我们要同步的数据在  mysql-bin .000002 ,而数据位置在 849  即MASTER_LOG_POS=849
从角色配置数据同步角色
配置与主角色连接
mysql > help change master to   # 配置主从同步 , 查看帮助
...... 存在帮助信息提示
查看基本数据
mysql > show slave status;   #查看从节点状态     得到 Empty set , 1 warning ( 0.00 sec)
配置账号级别的主从同步 (在从节点上操作
CHANGE MASTER TO MASTER_HOST='10.0.0.12',      -- 主服务器的IP地址MASTER_USER='repluser',       -- 用于复制的用户名(需提前创建并授权)MASTER_PASSWORD='123456',     -- 复制用户的密码MASTER_PORT=3306,             -- 主服务器的端口MASTER_LOG_FILE='mysql-bin.000002',  -- 从哪个二进制日志文件开始复制MASTER_LOG_POS=849;           -- 从二进制日志的哪个位置开始复制易复制版
CHANGE MASTER TO MASTER_HOST='10.0.0.12',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=849;
mysql > show slave status \ G                  # 查看从节点状态  (下面仅截取部分信息进行解释)
Master_Log_File : mysql-bin .000002 # 主节点二进制日志
Relay_Log_File : rocky9-relay-bin .000001     # 中继日志
Slave_IO_Running : No #IO 线程
Slave_SQL_Running : No #SQL 线程
注意:
如果看到: Slave_IO_Running Slave_SQL_Running 是两个 No ,说明,主从已经配置好了,只
不过没有启动而已。
从角色启动同步操作   启动 slave
mysql > start slave;    # 启动同步
mysql > show slave status\G       #再次查看从节点状态(下面仅截取部分信息进行解释)
Slave_IO_State: Waiting for source to send event # 等待数据发送过来
Read_Master_Log_Pos: 849 #主节点二进制日志大小
Relay_Log_File: rocky9-relay-bin.000002 #中继日志发生了变化
Slave_IO_Running: Yes #线程都启动了
Slave_SQL_Running: Yes #线程都启动了
Seconds_Behind_Master: 0 #主从节点数据时间差,0表示己经完全同步
Master_UUID:  c0e67e31-30b8-11f0-8f67-000c29d7263d
本人尝试遇到了下面的错误(原因在主角色start slave
上面的 Master_UUID 的信息,可以在主节点上查看到
[root @rocky9-12 ~ ] # cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=c0e67e31-30b8-11f0-8f67-000c29d7263d
从节点验证数据同步效果 - 需要一段时间,不是说,会立刻同步过来
select User,Host from mysql.user;
#查看从节点线程   (下面仅截取部分信息进行解释)
mysql > show processlist \ G
 State : Waiting for source to send event #IO 线程
 State : Replica has read all relay log; waiting for more updates #SQL 线程
# 查看主节点线程    (下面仅截取部分信息进行解释)
mysql> show processlist\G
  User: repluser # 从节点连接用用户
  Host: 10 .0.0.15:53014 # 从节点 IP 和端口
  Time: 2275 # 己持续时长
State: Source has sent all binlog to replica; waiting for more updates #dump线程
主节点确认的连接效果   ss -tun
同步测试 插入数据
在master 节点上写入数据create database db1;
use db1;CREATE TABLE `student` (`id` int unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`age` tinyint unsigned DEFAULT NULL,`gender` enum('M','F') DEFAULT 'M',PRIMARY KEY (`id`)
) ENGINE=InnoDB;insert into student (name,age,gender)values('user1',10,'M'),('user2',20,'F'),('user3',30,'M');
主角色节点导入大表再次
vim testlog.sqldelimiter $$
create procedure sp_testlog() 
begin   declare i int;set i = 1; while i <= 100000do  insert into testlog(name,salary) values (concat('wang',FLOOR(RAND() * 100000)),FLOOR(RAND() * 1000000)); set i = i +1; end while;
end$$
delimiter ;
主角色准备数据   mysql > source / root / testlog.sql
#master 节点大量写数据
mysql > call sp_testlog; # 采用 begin; call sp_testlog; commit; 方法会快一点
slave节点能看到延迟    (下面仅截取部分信息进行解释)
mysql > show slave status \ G
 Seconds_Behind_Master : 7 # 数据延迟,每次刷新,有可能会出现变化
注意:
Seconds_Behind_Master 如果值越大,需要通过其他措施来进行处理了
从节点配置经常犯错误 - 密码认证失败
常见问题 - 同步时候,出现问题
 Last_IO_Errno : 2061
               Last_IO_Error : Error connecting to source
'repluser@10.0.0.12:3306' . This was attempt 4 / 86400 , with a delay of 60 seconds
between attempts. Message : Authentication plugin 'caching_sha2_password'
reported error : Authentication requires secure connection.
解决方法:
ALTER USER 'repluser' @'10 .0.0 . % ' IDENTIFIED WITH mysql_native_password BY
' 123456 ';
FLUSH PRIVILEGES;
但是最好的方法是:从配置文件的角度入手,将认证的方式统统修改为 mysql_native_password 方式 default_authentication_plugin = mysql_native_password
从节点同步数据重置
mysql > stop slave;
mysql > reset slave all;
mysql > show slave status \ G
Empty set , 1 warning ( 0.00 sec)
当主节点服务中断后,查看从节点
主节点终止服务    systemctl stop mysqld.service
查看从节点状态  show slave status \ G
 Last_IO_Error : Error reconnecting to source
'repluser@10.0.0.12:3306' . This was attempt 1 / 86400 , with a delay of 60 seconds
between attempts. Message : Can 't connect to MySQL server on ' 10.0.0.12 : 3306 '
(111)
结果显示: 等待 60 s 之后,再来重试

3.有数据一主一从

将现在单机服务变成主从服务。
如果数据库在运行了一段时间后,己经产生了大量数据,或者重置了二进制日志,刷新了二进制日志的情况下,我们要配置主从,则要保证将己有的数据先备份出来,导入到从节点之后,再开启主从同步。

目前master节点是有数据的,我们可以将 从节点环境清空,从而实现,两者环境的不一致效果

从节点环境清空

[root @rocky9-15 ~ ] # systemctl stop mysqld
[root @rocky9-15 ~ ] # rm -rf /var/lib/mysql/*
[root @rocky9-15 ~ ] # rm -rf /data/mysql/logbin/*
[root @rocky9-15 ~ ] # systemctl start mysqld

主节点重置

重置二进制日志,如果从当前使用位置开始同步,则原有数据无法同步

reset master;             #重置二进制日志文件
show slave hosts;      #Empty set, 1 warning (0.01 sec)
show master status;   #查看当前主服务器的状态信息

全量数据同步

用全量备份的方式导出所有己有数据,并刷新二进制日志
[root @rocky9-12 ~ ] # mysqldump -A -F --source-data=1 --single-transaction
>all.sql
注意:
- A -- all-databases mysqldump 备份 MySQL 服务器上的所有数据库。
-F -- flush-logs :在执行备份之前, MySQL 服务器刷新并重置它的日志文件。
-- source-data = 1 的作用是,在导出数据的时候,记录二进制位置
-- single-transaction mysqldump 创建一个单独的事务来导出数据,从而不需要锁定表。
确认效果
[root@rocky9-12 ~]# ll all.sql
show master logs;  # 主节点确认日志效果
[root@rocky9-12 ~]#more all.sql   #查看备份文件
......
......
CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.000002' , MASTER_LOG_POS = 157 ;   # 非注释的第一行
[root @rocky9-12 ~ ] # scp all.sql 10.0.0.15:         # 将备份文件复制到从节点

主节点同步账号授权  
账号授权操作 - 如果存在的话,可以不用重复创建
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';

确认效果
mysql> select user,host from mysql.user;

从节点配置

下面的内容配置过 所以就不再配置了
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=183
read-only
log-bin=/data/mysql/logbin/mysql-bin
default_authentication_plugin=mysql_native_password # 避免出现认证问题

修改备份文件
[root @rocky9-15 ~ ] # vim all.sql
.. .
# CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=157;
# 将此句补全为如下样式
CHANGE MASTER TO
MASTER_HOST = '10.0.0.12' ,
MASTER_USER = 'repluser' ,
MASTER_PASSWORD = '123456' ,
MASTER_PORT = 3306 ,
MASTER_LOG_FILE = 'mysql-bin.000002' , MASTER_LOG_POS = 157 ;
从节点加载语句
因为是导数据,所以需要关闭二进制日志
mysql > set sql_log_bin = 0 ;
开始导入数据
mysql > source / root / all.sql
mysql > show slave status \ G    #查看主从状态     (下面仅截取部分信息进行解释)
 Slave_IO_Running : No # 主从环境导入成功了
start slave;                   # 从节点启动同步线程
show slave status \ G     #查看主从状态     (下面仅截取部分信息进行解释)
Slave_IO_Running : Yes # 主从环境恢复了
mysql > set @ @sql_log_bin = 1 ;   # 恢复二进制日志
mysql > use db1;    # 查询
mysql > select * from student;

4.一主多从实现

环境解读
一主多从,配置多个从节点即可,基于上述一主一从,再增加一个从节点

假设:10.0.0.18是另一个slave节点  前面的所有配置环境已经弄好

基础数据同步
# 主节点导出备份数据,复制到新增节点
[root @rocky9-12 ~ ] # mysqldump -A --source-data=1 --single-transaction >all.sql
[root @rocky9-12 ~ ] # scp all.sql 10.0.0.18:
从节点同步账号配置
# 在从节点上修改备份文件
[root @rocky9-18 ~ ] # vim all.sql
# CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=453; # 将此内
容修改为如下所示
CHANGE MASTER TO
MASTER_HOST = '10.0.0.12' ,
MASTER_USER = 'repluser' ,
MASTER_PASSWORD = '123456' ,
MASTER_PORT = 3306 ,
MASTER_LOG_FILE = 'mysql-bin.000002' , MASTER_LOG_POS = 453 ;   
# 从节点启动服务,导入备份   (启动后先把二进制日志临时关闭)
[root @rocky9-18 ~ ] # systemctl start mysqld.service
mysql > set sql_log_bin = 0 ;
mysql > source / root / all.sql;
从节点启动同步操作
mysql > start slave;
mysql > show slave status \ G  #成功后再进行下一步
mysql > set sql_log_bin = 1 ;
数据同步测试   可以看到同步成功

5.级联复制实现

主从复制架构中,从节点从中继日志中读取到数据写入数据库后,该数据并不会写入到从节点的二进制日志中,但是在级联同步架构中,有一个中间节点的角色,该节点从主节点中同步数据,并充当其它节点的数据源,所以在此情况下,我们需要保证中间节点从主节点中同步过来的数据,同样也要写二进制日志,否则后续节点无法获取数据。
在此架构中,中间节点要开启 log_slave_updates 选项,保证中间节点复制过来的数据也能写入二进制日志,为其它节点提供数据源。
集群环境架构    之前的从节点变为中间节点
主机IP      角色        MySQL版本
10.0.0.12  master        8.0.41
10.0.0.15 middle-slave   8.0.41
10.0.0.18  slave         8.0.41
#mysql8.0 以后默认开启了此项,其它版本或 mariadb 需要手动开启,
# 中间节点要保证 : 1 开启二进制日志, 2 从主节点上同步过来的数据,要能写到二进制日志中
mysql > select @ @log_slave_updates ;    结果显示为1 表示开启
开启中继的能力
[root @rocky9-15 ~ ] # vim /etc/my.cnf.d/mysql-server.cnf
.....
[mysqld]
server-id = 183
read-only
log_slave_updates # 增加此选项
log-bin =/ data / mysql / logbin / mysql-bin
[root @rocky9-15 ~ ] # systemctl restart mysqld.service   # 重启服务器环境
登录 mysql 之后,中间节点处于同步状态
mysql > show slave status \ G
........
Slave_IO_Running : Yes
Slave_SQL_Running : Yes
........
中间节点和从节点间基准数据同步
确认中间节点上有同步过来的账号信息 , 如果没有的话,需要自己单独创建即可
mysql > select user,host from mysql.user;
| repluser         | 10.0.0 . %     #有了这个信息就行
拷贝数据
# 导出中间节点数据
[root @rocky9-15 ~ ] # mysqldump -A -F --single-transaction --source-data=1 > middle-all.sql
# 拷贝至 10.0.0.18 从节点
[root@rocky9-15 ~] # scp middle-all.sql 10.0.0.18:
从节点配置
10.0.0.18 节点的环境清理完毕
mysql > stop slave;   
mysql > reset slave all;
1. STOP SLAVE 
功能:暂停从服务器的复制线程,但保留复制状态(如二进制日志位置、主服务器连接信息等)。 
两个关键线程:IO 线程:负责从主服务器读取二进制日志(binlog)。 SQL 线程:负责在从服务器上执行读取到的日志事件。2.RESET SLAVE ALL
功能:
彻底清除从服务器的复制配置,包括:
删除所有复制相关的元数据(如 master.info 和 relay-log.info 文件)。
重置复制状态(如二进制日志位置、主服务器连接信息)。
释放主服务器上的复制账号锁(重要区别!)。
重置 10.0.0.18 节点的环境
[root @rocky9-18 ~ ] # systemctl stop mysqld
[root @rocky9-18 ~ ] # rm -rf /var/lib/mysql/*
[root @rocky9-18 ~ ] # rm -rf /data/mysql/logbin/*
[root @rocky9-18 ~ ] # systemctl start mysqld.service
修改配置 -- 内容一样的话, 暂时不需要动
# 修改配置
[root @rocky9-18 ~ ] # cat /etc/my.cnf
......
[mysqld]
server-id = 186
read-only
log-bin =/ data / mysql / logbin / mysql-bin
同步账号配置
修改同步配置文件
# 修改备份文件
[root @rocky9-18 ~ ] # vim middle-all.sql    (此文件是从文件生成传递的)
# CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=157;
# 修改上面语句为
CHANGE MASTER TO
MASTER_HOST = '10.0.0.15' ,
MASTER_USER = 'repluser' ,
MASTER_PASSWORD = '123456' ,
MASTER_PORT = 3306 ,
MASTER_LOG_FILE = 'mysql-bin.000003' ,
MASTER_LOG_POS = 157 ;
# 启动服务
[root @rocky9-18 ~ ] # systemctl start mysqld.service
# 临时关闭二进制日志
mysql > set sql_log_bin = 0 ;
从节点导入数据
# 导入备份数据
mysql > source / root / middle-all.sql
# 开启二进制日志
mysql > set sql_log_bin = 1 ;
# 查看主从状态
mysql > show slave status \ G
Slave_IO_Running : No
Slave_SQL_Running : No
# 启动同步
mysql > start slave;
# 再次查看状态
mysql > show slave status \ G
Slave_IO_Running : Yes
Slave_SQL_Running : Yes
数据同步测试  下面的命令在主节点上进行操作
mysql > insert into student (name,age,gender)values( 'user6' , 60 , 'M' );
mysql > delete from student where id = 2 ;
结果显示 从 节点和中间节点 主节点内容都一样
验证连接信息
主节点上查看进程 , 可以看到中间节点的连接信息
[root @rocky9-12 ~ ] # ss -tnap | grep 3306
mysql > show processlist \ G     -- 存在 dump 线程
Command : Binlog Dump # 将数据传递给中间节点
中间节点上查看进程 , 可以看到主节点连接信息, last 节点的连接信息
[root @rocky9-15 ~ ] # ss -tnap | grep 3306
mysql > show processlist \ G --- 存在 dump 线程、 io 线程、 sql 线程
State : Waiting for source to send event # IO 线程,存储数据到中继日志
Command : Query # sql 线程,执行数据落地
Command : Binlog Dump # dump 线程,将数据传递给从节点
从节点确认效果
[root @rocky9 ~ ] # ss -tnap | grep 3306
......
mysql > show processlist \ G # 存在 io 线程和 sql 线程
.......

6.主主复制实现

环境解读
在双主模型中,两个节点互为主备,两个节点都要开启二进制日志,都要有写权限。
根据前面的实验, master-2 己经是 master-1 的从节点了,此处只需要把 master-1 配置为 master-2 的从节点即可。
10.0.0.18 清理从节点环境
mysql > stop slave;
mysql > reset slave all;
稍等数十秒后,在 10.0.0.15 节点上确认效果
mysql > show slave hosts;
Empty set , 1 warning ( 0.00 sec)
准备工作
master1    (根据之前的不用进行修改)
[root @rocky9-12 ~ ] # cat /etc/my.cnf.d/mysql-server.cnf
.. .
[mysqld]
server-id = 177
log_bin =/ data / mysql / logbin / mysql-bin
default_authentication_plugin = mysql_native_password
.. .
#master2 配置需要修改,去掉 read-only
[root @rocky9-15 ~ ] # cat /etc/my.cnf.d/mysql-server.cnf
......
[mysqld]
server-id = 183 # 主要是 id
log_bin =/ data / mysql / logbin / mysql-bin
default_authentication_plugin = mysql_native_password
# log_slave_updates # 停止中间服务器的能力
.. .
# 重启 master-2
[root @rocky9-15 ~ ] # systemctl restart mysqld
master-2 上查看 slave 状态,己经是 master-1 的从了
mysql > show slave status \ G
配置 master-1 主机为从角色 (关键)
因为两台主机的 数据都是一样 的,所以,无需重新加载数据服务了
注意 MASTER_LOG_FILE 信息可以在 show master logs 里面看 
-- 配置主库信息
CHANGE MASTER TO 
MASTER_HOST='10.0.0.15',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000005', 
MASTER_LOG_POS=157;-- 启动从库复制进程
START SLAVE;-- 检查从库状态
SHOW SLAVE STATUS\G

在检查从库状态时,要重点查看以下两个参数: Slave_IO_Running: Yes Slave_SQL_Running: Yes 只有当这两个参数的值都为 'Yes' 时,主从复制才能正常工作

MASTER_LOG_FILE 文件不一致导致下面的报错

测试同步效果
master-1 进行写操作, master-2 上查看                 可以看到已经同步
master-2 中删除数据 , master-1中查看效果         可以看到已经同步
双主架构的注意事项
解析 : 双主架构在实际生产环境中, 并不会配置为两个节点都去写数据
双主架构在实际生产环境中,并不会配置为两个节点都去写数据,前端应用只会写一个节点,另一个节点作为备份节点,如果当前使用的节点出问题,则 IP 地址会立即转移到另一个节点上,起到一个高可用的作用,此时,如果有 slave 节点,在 slave 上要重新执行同步操作
注意:两台数据库虽然数据是一样的,但是二进制日志有可能是不一样的
show master logs;  进行查看
双主写冲突实践
尝试在两个主机同时写入数据
mysql > insert into student(name,age,gender) values( 'user8' , 80 , 'F' );
两台主机同时查看主从同步效果
mysql > show slave status \ G
结果显示:主从同步己经不能使用了
在主从同步失效的情况下,在 master-1 上的写操作,无法同步到 master-2
master1 通过忽略来解决问题
mysql > stop slave;                                                # 停止主从
mysql > set global sql_slave_skip_counter = 1 ;      # 跳过 1 个错误事件
mysql > start slave;                                                # 再次开启主从同步
mysql > show slave status \ G                                 # 查看同步状态,己经恢复
             
master2 通过忽略来解决问题
所有命令操作同上(略)
其他注意事项
忽略错误编号
除了使用 set global sql_slave_skip_counter=N 忽略错误个数之外,也可以用忽略指定错误编号的方式来处理错误。
mysql>show slave status\G
Last_SQL_Errno: 1062 # 这两个字段的值就是错误编号
#slave_skip_errors=N|ALL 用来忽略指定的错误编号,是服务器选项,要写配置文件后重启服务
[mysqld]
slave_skip_errors = N | ALL
虽然有方法解决双写出现的问题,但还是存在风险,正确的做法是禁用双写,只能写一个节点。
多次忽略错误
MySQL 主从复制中出现 5 条数据错误时,如果想精确控制跳过的事务,可分 5 次执行 SET
GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 ; 语句。每次跳过一个错误事务后,检查复制状态,确保从库能正常继续复制。 下面的所有命令执行5次
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1  (或1改成 5   #执行一次即可
START SLAVE;
SHOW SLAVE STATUS \ G
根源修复
上述跳过事务的方法只是临时解决办法,可能会造成主从数据不一致。为了避免后续再次出现类似问题,需要找出导致复制错误的根源并进行修复。以下是一些常见的原因及解决办法:
如果上述办法都不行 则 可以考虑重新初始化从库
1 在主库上创建一个新的备份。
2 在从库上停止复制进程,清空数据。
3 将主库的备份恢复到从库。
4 重新配置主从复制,让从库从主库开始同步数据。

7.半同步复制原理解读

Mysql 8.0 半同步实践
集群环境

10.0.0.12 主机上的从角色清理掉
mysql > stop slave;
mysql > reset slave all;
mysql > show slave status;
Empty set , 1 warning ( 0.00 sec)
MySQL8.0 中配置半同步需要安装插件支持
# 安装 MySQL8.0 中己有相关插件的支持文件
rpm -ql mysql-server |grep semisync
master 节点配置插件
mysql > select * from mysql.plugin;
Empty set ( 0.00 sec) # 没有插件
master节点上安装 master 插件
mysql > INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' ;
# 持久化加载插件的方法,修改配置文件  (下面有操作流程 这部现在可以先不做)
[mysqld]
rpl_semi_sync_master=semisync_master.so
所谓的安装插件,其实在 mysql 库中的 plugin 表中写入一条数据
set global rpl_semi_sync_master_enabled=1;  临时开启插件
主节点配置复制账号 - 最开始的步骤 已做
创建主从复制账号,并授权
mysql > create user repluser @'10 .0.0 . % ' identified by ' 123456 ';
mysql > grant replication slave on * . * to repluser @'10 .0.0 . % ';
master 节点启用插件
# 修改配置文件,开启插件
[root @rocky9-12 ~ ] # vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
rpl_semi_sync_master_enabled # 增加功能,注意是 master 关键字
重启服务  [root @rocky9-12 ~ ] # systemctl restart mysqld.service
# 再次查看,需要稍等几秒钟
select @@rpl_semi_sync_master_enabled;   值为1 说明已经开启
slave 节点启用插件  (和master相同的步骤不同点我会放在地下)
# slave 节点上安装 slave 插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' ;
slave 节点启用插件
# 修改配置文件,开启插件
[root @rocky9-15 ~ ] # vim /etc/my.cnf.d/mysql-server.cnf
......
[mysqld]
server-id = 183
read-only
log-bin =/ data / mysql / logbin / mysql-bin
rpl_semi_sync_slave_enabled # 增加该条属性,注意是 slave 关键字
# 重启服务
[root@rocky9-15 ~] # systemctl restart mysqld;
另一台主机执行相同操作
另一台 slave 节点配置同上,注意修改 server-id (其他的和上个slave 配置一样)
清理环境服务
[root @rocky9-18 ~ ] # systemctl stop mysqld.service
[root @rocky9-18 ~ ] # rm -rf /var/lib/mysql/*
[root @rocky9-18 ~ ] # rm -rf /data/mysql/logbin/*
[root @rocky9-18 ~ ] # systemctl start mysqld.service
启用插件,不先启用插件,则后面修改配置后,无法使用
mysql > INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' ;
修改配置文件 ,
rpl_semi_sync_slave_enabled # 增加该条属性
重启服务 [root @rocky9-18 ~ ] # systemctl restart mysqld.service
slave 节点上开启主从
主节点导出数据
[root @rocky9-12 ~ ] # mysqldump -A -F --source-data=1 --single-transaction>all.sql
[root @rocky9-12 ~ ] # scp all.sql root@10.0.0.18:
slave 节点修改配置
[root @rocky9-18 ~ ] # vim all.sql .. . # CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=157; # 修改为如下数据
CHANGE MASTER TO      MASTER_HOST = '10.0.0.12' ,      MASTER_USER = 'repluser' ,      MASTER_PASSWORD = '123456' ,      MASTER_PORT = 3306 ,     MASTER_LOG_FILE = 'mysql-bin.000004' , MASTER_LOG_POS = 157
slave 节点上开启主从
mysql > set sql_log_bin = 0 ;
mysql > source / root / all.sql;
mysql > set sql_log_bin = 1 ;
启用从服务
mysql > start slave;
# 查看状态
mysql > show slave status \ G
......
Slave_IO_Running : Yes
Slave_SQL_Running : Yes
master 确认信息
show global status like '%semi%' ;
show global variables like '%semi%' ;
数据同步测试
测试,在master 节点上写入数据
结果显示 slave-1节点和slave-2节点 看到的效果相同
测试单个 slave 可用
测试,半同步状态下,只要有一个 slave 节点能同步到数据, master 节点就能返回成功
# slave-1 节点上停止 mysq 服务
[root @rocky9-15 ~ ] # systemctl stop mysqld
master 节点上查看,还有一个 slave 节点 ( 数据有延时,要等一会儿 ) ,也就十几秒左右的时间
mysql > show global status like '%Rpl_semi_sync_master_clients%' ;      得到值为1
。。。。
master 节点写入数据,返回成功,只要有一个 slave 节点同步成功即可
mysql > insert into student(name,age,gender)values( 'user2' , 20 , 'M' );
结果显示  #slave-2 节点上同步成功
测试没有 slave 可用
slave-2 节点上停止 mysq 服务
[root @rocky9-18 ~ ] # systemctl stop mysqld
# 再次在 master 节点上查看,己经没有 slave 在线
mysql > show global status like '%Rpl_semi_sync_master_clients%' ;    得到值为0
# 再次执行写操作,没有 slave 节点在线,等 10S 后超时,但 master 节点上写入成功
mysql> insert into student(name,age,gender)values( 'user3' ,30, 'M' );
# ... 这个地方需要阻塞 10s 后,再返回信息
Query OK, 1 row affected (10.01 sec)
# 查看超时时长
mysql > show variables like '%semi_sync_master_timeout%' ;   得到值为10000
修改同步超时时长    [root @rocky9-12 ~ ] # vim /etc/my.cnf.d/mysql-server.cnf
rpl_semi_sync_master_timeout = 3000 # 设定时间为 3秒     将同步超时时长改为 3S
重启服务   systemctl restart mysqld;
show variables like '%semi_sync_master_timeout%' ;  得到值为3000
# 测试, 3S 超时
mysql > insert into student(name,age,gender)values( 'user4' , 40 , 'M' );
# ... 这个地方需要阻塞 3s 后,再返回信息
Query OK, 1 row affected ( 3.00 sec)
恢复 slave-1,master 节点再次写数据,立即成功

8. 复制过滤器 【K】

10.0.0.12  master  
10.0.0.15  slave-1
#master 节点上配置 db1,db2 不写二进制日志
[root @rocky9-12 ~ ] # vim /etc/my.cnf.d/mysql-server.cnf
binlog-ignore-db = db1
binlog-ignore-db = db2
重启 mysql 服务之后 生效
master 配置未生效的时候, slave 可以看效果
# master 节点上为 db1 写入数据
mysql > use db1;

9.GTID 复制

http://www.dtcms.com/a/192980.html

相关文章:

  • Windows AD 域客户端电脑时间不准解决方案
  • 卷积神经网络和深度神经网络的区别是什么?
  • 地球阿米特黑客组织使用新型工具攻击军用无人机供应链
  • 常见三维引擎坐标轴 webgl threejs cesium blender unity ue 左手坐标系、右手坐标系、坐标轴方向
  • TypeScript:类
  • 达利欧:“交易的艺术”与“背后的力量”
  • 了解光学影像
  • C#自定义控件-实现了一个支持平移、缩放、双击重置的图像显示控件
  • OpenCV人脸识别EigenFace算法、案例解析
  • MySQL 开发的智能助手:通义灵码在 IntelliJ IDEA 中的应用
  • 自营交易考试为何出圈?一场模拟交易背后的真实竞争
  • 为什么elasticsearch配置文件JVM配置31G最佳
  • 世界模型+大模型+自动驾驶 论文小汇总
  • 数据结构(九)——排序
  • Xournal++:开源跨平台笔记软件,手写与创作的完美结合
  • SQL笔记一
  • 1267, “Illegal mix of collations (latin1_swedish_ci,IMPLICIT
  • Spring MVC 接口的访问方法如何设置
  • 主流快递查询API横向对比:快递100快递鸟菜鸟物流接口差异解析
  • 本地 PC 使用Offset Explorer连接实体Ubuntu Kafka 【单机】超时问题解决
  • 印度Rummy游戏支付通道申请策略:技巧类游戏的合规与创新
  • 5.19 BGP实验
  • 动态规划之数列
  • 免疫浸润分析
  • C语言-8.数组
  • Java大师成长计划之第23天:Spring生态与微服务架构之服务发现与注册中心
  • Manus AI 原理深度解析第三篇:Tools
  • 电总协议调试助手更新-PowerBus-v1.0.5
  • 作业帮Java后台开发面试题及参考答案(下)
  • ACI Fabric 中的各种地址