- 垂直扩展:
-
横向扩展:
-
复制:使每一个节点都有相同的数据集
-
MySQL复制的实现:使用二进制日志来实现
-
提高性能(负载均衡)、 实现读写分离
- 实现数据备份的功能(实时备份)
-
高可用,故障切换
-
一主一从:一个master,一个slave
- 一主多从:一个master,多个slave
master:负责写操作
slave:负责读操作
- 中继日志其实就是二进制日志,就是换了个说法,叫做中继日志
- 没有开启主从复制之前,默认是没有这三个线程的
-
查看线程的方法:show processlist
-
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events
-
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
-
SQL Thread:从中继日志中读取日志事件,在本地完成重放
-
master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等
- relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地relay log日志的对应关系
- mysql-relay-bin.00000#: 中继日志,保存从主节点复制过来的二进制日志,本质就是二进制日志
注意:MySQL8.0取消了master.info和relay-log.info这两个文件.
- 一主–一从
- 一主–多从
- 从服务器还可以再有从服务器
- 主–主
- 一从–多主:适用于多个不同数据库
- 环状复制
注意:复制需要考虑二进制日志事件记录格式
- 建议把二进制日志也开启,到时候主节点坏了,可以把从节点提升为一个新的主节点。
- 建议把从节点设为只读,确保数据不能被误操作。
- 从节点连接到主节点的命令:
可以通过 help change mster这个命令来查看使用范例。
CHANGE MASTER TO MASTER_HOST='masterhost', --- 从哪个主节点同步数据
MASTER_USER='repluser', --- 用于复制的账号
MASTER_PASSWORD='replpass', --- 密码
MASTER_LOG_FILE='mariadb-bin.xxxxxx', --- 二进制日志
MASTER_LOG_POS=#; --- 二进制日志位置
复制的时候就是从这个指定的二进制日志文件的指定位置开始复制。
START SLAVE [IO_THREAD|SQL_THREAD];
SHOW SLAVE STATUS; #查看slave上的两个复制线程的状态信息
1.将两台及其恢复至初始状态(删除所有数据文件就可恢复数据的初始状态)
[root@CentOS8 mysql]# rm -rf /var/lib/mysql/*
2.主节点(master)设置
(1)开启二进制日志并设置server_id
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
server_id=1 #指定serverid
log-bin=/data/logbin/mysql-logbin #开启二进制日志并指定二进制日志的存放位置和前缀名
(2)创建一个拥有复制权限的用户,用于slave连接到master
#mysql8.0不允许创建账号和授权一起做,必须分为两条命令执行。
#创建用户
mysql> create user repluser@'10.0.0.%';
Query OK, 0 rows affected (0.02 sec)
#授权
mysql> grant replication slave on *.* to 'repluser'@'10.0.0.%';
Query OK, 0 rows affected (0.12 sec)
3.从节点设置:
(1)开启中继日志和设置serverid
[root@CentOS8 mysql]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
server_id=2 #设置serverid
relay-log=/data/relaylog/relay-log #开启中继日志并指定存放位置和名称前缀
(2)使用具有复制权限的用户账号连接到master
mysql> change master to
-> MASTER_HOST='10.0.0.10',
-> MASTER_USER='repluser',
-> MASTER_LOG_FILE='mysql-logbin.000001',
-> MASTER_LOG_POS=620;
Query OK, 0 rows affected, 2 warnings (0.15 sec)
4.在从节点上开启两个线程(io线程和sql线程)
mysql> start slave;
Query OK, 0 rows affected (0.04 sec)
5.检查三个线程是否正常
#显示示slave线程的相关信息,从而分析主从复制的状态
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.10
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-logbin.000001
Read_Master_Log_Pos: 620
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 327
Relay_Master_Log_File: mysql-logbin.000001
Slave_IO_Running: Yes #slave的io线程正常工作
Slave_SQL_Running: Yes #slave的sql线程正常工作
......
Seconds_Behind_Master: 0 #和主节点的数据差(例如1s:标识主节点还有1s的数据没有复制过来)
Master_Server_Id: 1
Master_UUID: afeced8a-3903-11ed-b3b0-000c295a5cb9
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
.......
1 row in set (0.00 sec)
需要通过完全备份主服务器数据到从服务器,从服务器恢复数据。
master:
1.开启二进制日志和serverid
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
server_id=1 #一般使用自己ip地址的主机位来标识
log-bin=/data/logbin/mysql-logbin #二进制日志存放位置
2.创建一个具有replication和slave权限的账号,slave可以凭借这个账号连接到master
mysql> create user repli_user@'10.0.0.%' identified by 'redhat';
Query OK, 0 rows affected (0.01 sec)
mysql> grant replication slave on *.* to repli_user@'10.0.0.%';
Query OK, 0 rows affected (0.01 sec)
3.使用mysqldump工具实现完全备份(创建用户以后再执行备份,slave还原备份文件后也会存在对应的账号)
[root@CentOS8 ~]# mysqldump -A -F -uroot --single-transaction --master-data=1 > fullback-date +%F_%T
.sql
4.将备份文件传送给slave
[root@CentOS8 ~]# scp ./fullback-2022-09-23_10\:22\:43.sql 10.0.0.13:/root/
slave:
1.开启中继日志和serverid
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
server_id=2
relay-log=/data/relaylog/relay-log
2.只从master传送过来的脚本(因为master使用了--master-data=1参数,所以sql语句里面记录了change master需要的二进制日志和位置)
3.修改sql文件,修改内容如下:
-- Position to start replication or point-in-time recovery from
--
CHANGE MASTER TO
MASTER_HOST='10.0.0.10',
MASTER_USER='repli_user',
MASTER_PASSWORD='redhat',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-logbin.000006',
MASTER_LOG_POS=156;
4.执行脚本:
mysql < fullback-2022-09-23_10\:22\:43.sql
5.开启sql线程和io线程
mysql> start slave sql_thread;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
或者start slave会同时开启两个线程
创建用户的时候授权(mysql8.0不支持)
grant replication slave on *.* to repluser@'10.0.0.%' identified by 'magedu';
mysql8.0:
create user user_name@'hostname' identified by 'passwoed'
grant privelege_type on db.tb to user_name@'host_name'
查看指定用户的权限:
show grants from user@'hostname'
查看grant的使用方法:>help grant
查看show grant的使用方法:>help show grants
删除用户:drop user user_name
set global innodb_flush_log_at_trx_commit=2
set global sync_binlog=0
Original: https://www.cnblogs.com/heyongshen/p/16711235.html
Author: 背对背依靠
Title: MySQL主从复制的原理和实现
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578578/
转载文章受原作者版权保护。转载请注明原作者出处!