详细介绍MySQL如何开启主从复制实现数据同步
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,主从复制原理主从复制线程主节点 dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events从节点 I/O Thread:
千家信息网最后更新 2025年02月02日详细介绍MySQL如何开启主从复制实现数据同步
主从复制原理
主从复制线程
主节点
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events
从节点
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
SQL Thread:从中继日志中读取日志事件,在本地完成重放
跟复制功能相关的文件
master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等
relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系
主从复制特点
异步复制
主从数据不一致比较常见
复制架构
Master/Slave,Master/Master,环状复制
一主多从
从服务器还可以再有从服务器
一从多主:适用于多个不同数据库
复制需要考虑二进制日志时间记录格式
STATEMENT(5.0之前)
ROW(5.1之后,推荐)
MIXED
搭建环境准备
主机 | IP地址 | 类型 |
---|---|---|
CentOS7.6 | 192.168.36.101 | Master |
CentOS7.6 | 192.168.36.103 | Slave |
CentOS7.6 | 192.168.36.104 | Slave |
搭建之前请先确保MySQL软件包已经安装
一主一从
Master节点修改数据库配置文件
[root@Master ~]#cat /etc/my.cnf[mysqld]server_id=1 # 为Master节点设置一个全局唯一的ID号binlog_format=row # 基于行复制的数据库语句log-bin=/data/bin/mysql-bin # 启用二进制日志
重新启动数据库服务
[root@Master ~]#service mysqld restartRestarting mysqld (via systemctl): [ OK ]
Master节点上创建带有复制权限的用户账号
MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.36.%' identified by 'centos';Query OK, 0 rows affected (0.00 sec)
查看Master的日志位置信息
MariaDB [mysql]> show master logs;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin.000001 | 912372 |+------------------+-----------+1 row in set (0.00 sec)
Slave节点修改配置文件
[root@Slave-1 ~]#cat /etc/my.cnf[mysqld]server_id=2 # Slave节点设置全局唯一的ID号read_only # 只读
重新启动数据库服务
[root@Slave-1 ~]#systemctl restart mariadb
使用Master创建的复制权限的用户账号进行同步
MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.101', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.01 sec)
启动Slave线程
MariaDB [(none)]> slave start;Query OK, 0 rows affected (0.00 sec)
查看线程是否启动
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.36.101 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 7389 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 7673 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes # 从节点的IO线程 Slave_SQL_Running: Yes # 从节点的SQL线程.... Seconds_Behind_Master: 0 # Master与SLave服务器差别延迟..... Master_Server_Id: 11 row in set (0.00 sec)
检查数据同步情况
MariaDB [(none)]> show databases;+--------------------+| Database |+--------------------+| information_schema || hellodb || mysql || performance_schema || test |+--------------------+5 rows in set (0.00 sec)
主节点中查看数据库的线程
MariaDB [hellodb]> show processlist;+----+----------+----------------------+---------+-------------+------+------------------------------------------------------------------| Id | User | Host | db | Command | Time | State+----+----------+----------------------+---------+-------------+------+------------------------------------------------------------------| 3 | root | localhost | hellodb | Query | 0 | NULL| 6 | repluser | 192.168.36.103:51516 | NULL | Binlog Dump | 115 | Master has sent all binlog to slave; waiting for binlog to be upd+----+----------+----------------------+---------+-------------+------+------------------------------------------------------------------2 rows in set (0.00 sec)
从节点中查看数据库的线程
MariaDB [(none)]> show processlist;+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+--| Id | User | Host | db | Command | Time | State | I+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+--| 4 | root | localhost | NULL | Query | 0 | NULL | s| 5 | system user | | NULL | Connect | 159 | Waiting for master to send event | N| 6 | system user | | NULL | Connect | 29259 | Slave has read all relay log; waiting for the slave I/O thread to update it | N+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+--3 rows in set (0.00 sec)
一主多从:新添加一个从节点
Slave-2 节点安装数据库服务
[root@Slave-2 ~]#yum install -y mariadb-server
修改 Slave-2 节点配置文件
[root@Slave-2 ~]#cat /etc/my.cnf[mysqld]server_id=3read_only....
重新启动 Slave-2 节点数据库服务
[root@Slave-2 ~]#systemctl restart mariadb
Slave-2 节点配置同步信息
MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.101', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.00 sec)
启用线程
MariaDB [(none)]> slave start;Query OK, 0 rows affected (0.00 sec)
检查同步情况
MariaDB [(none)]> show databases;+--------------------+| Database |+--------------------+| information_schema || hellodb || mysql || performance_schema || test |+--------------------+6 rows in set (0.00 sec)
主主复制:两台服务器互为主从
主机 | IP地址 | 类型 |
---|---|---|
CentOS7.6 | 192.168.36.101 | Master-1 |
CentOS7.6 | 192.168.36.103 | Master-2 |
Master-1 修改配置文件
[root@Master-1 data]#cat /etc/my.cnf[mysqld]server_id=1log_bin # 启用日志# 为避免ID冲突问题,需要添加下面两行配置:Master-1 为奇数增长,Master-2 为偶数增长auto_increment_offset=1 # 开始点auto_increment_increment=2 # 增长幅度....
Master-2 修改配置文件
[root@Master-2 data]#cat /etc/my.cnf[mysqld]server_id=2log_binauto_increment_offset=2auto_increment_increment=2
重新启动服务
[root@Master-1 ~]#systemctl restart mariadb[root@Master-2 ~]#systemctl restart mariadb
Master-1 创建权限用户,Master-2 先设置为从服务器进行同步 Master-1 的数据库
MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.36.%' identified by 'centos';Query OK, 0 rows affected (0.00 sec)
Master-2 同步Master-1
MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.101', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.00 sec)
启用线程
MariaDB [(none)]> slave start;Query OK, 0 rows affected (0.00 sec)
检查同步情况
MariaDB [(none)]> use mysql;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedMariaDB [mysql]> select user,password,host from user;+----------+-------------------------------------------+--------------+| user | password | host |+----------+-------------------------------------------+--------------+| root | | localhost || root | | 127.0.0.1 || root | | ::1 || repluser | *128977E278358FF80A246B5046F51043A2B1FCED | 192.168.36.% |+----------+-------------------------------------------+--------------+7 rows in set (0.00 sec)
Master-1 向 Master-2 进行同步
MariaDB [mysql]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.103', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.05 sec)
Master-1 同步状态
MariaDB [(none)]> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.36.103 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 245 Relay_Log_File: mariadb-relay-bin.000003 Relay_Log_Pos: 529 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes.... Master_SSL_Allowed: No.... Master_Server_Id: 21 row in set (0.01 sec)
此时Master-1、Master-2 实现主主复制功能
半同步复制
半同步复制的作用是:主服务器宕机后,所有备份服务器主动向同步数据最多的服务器进行数据的同步,以确保数据损失降到最低。
半同步是通过插件功能达成的
Master节点安装semisync_master.so插件
MariaDB [db1]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';Query OK, 0 rows affected (0.07 sec)
启用插件功能
MariaDB [db1]> SET GLOBAL rpl_semi_sync_master_enabled=1;Query OK, 0 rows affected (0.00 sec)
设置超时时长
MariaDB [db1]> SET GLOBAL rpl_semi_sync_master_timeout=6000;Query OK, 0 rows affected (0.00 sec)
查看Master插件状态
MariaDB [db1]> show variables like '%semi%';+------------------------------------+-------+| Variable_name | Value |+------------------------------------+-------+| rpl_semi_sync_master_enabled | ON || rpl_semi_sync_master_timeout | 6000 || rpl_semi_sync_master_trace_level | 32 || rpl_semi_sync_master_wait_no_slave | ON |+------------------------------------+-------+4 rows in set (0.00 sec)
Master修改配置文件并重启数据库服务
[root@Master data]#cat /etc/my.cnf[mysqld]...rpl_semi_sync_master_enabled # 启用插件功能...[root@Master data]#systemctl restart mariadb
Slave节点安装semisync_slave.so插件
MariaDB [db1]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';Query OK, 0 rows affected (0.00 sec)
启用slave插件功能
MariaDB [db1]> SET GLOBAL rpl_semi_sync_slave_enabled=1;Query OK, 0 rows affected (0.00 sec)
Slave修改配置文件并重启数据库服务
[root@Slave data]#cat /etc/my.cnf[mysqld]...rpl_semi_sync_slave_enabled # 启用插件功能...[root@Slave data]#systemctl restart mariadb
停止Slave 数据库服务进行测试
MariaDB [(none)]> create database db3;Query OK, 1 row affected (6.00 sec) # 由等待时长可以看出,半同步插件已经起到效果
节点
数据
服务
同步
数据库
日志
线程
插件
服务器
配置
文件
功能
主从
二进制
信息
地址
情况
权限
用户
账号
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
刑法中关于保护网络安全的规定
乐外卖什么服务器
软件定义网络技术的最大特点
虚拟机能学网络技术吗
网络安全宣传用品
云小易互联网科技
信息泄露数据库买卖
我的世界云服务器选配
网络安全防护工作机制网络
linux端口转发多个服务器
尚文网络安全系统
软件开发合同纠纷起诉状
信息网络安全分级
数据库sdept用法
长宁区发展网络技术咨询怎么样
台服务器
游戏软件开发公司怎么样
广西软件开发工程专业学校
网络安全的原则体现
数据挖掘神经网络技术
云服务器 手机管理软件
邮箱pop服务器地址
支付宝怎么设置网络安全
软件开发梦想秀实验报告
服务器安全防火墙软件
安徽工程管理软件开发要多少钱
杭州网络技术服务
头部数据库
上海安全接入服务器在哪
网络安全手抄报三年级的