MySQL的主从复制、基于GDIT的主从复制、半同步复制、并行复制、组复制

点击此处即可查看mysql的官方文档

实验环境:

server1:172.25.66.1  master(主库)
server2:172.25.66.2  slave (从库)

安装包:

mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

点击此处即可下载mysql

1.Mysql的主从复制

概述:
主从复制:是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

1.主从复制原理

图解:
在这里插入图片描述
原理:

1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据库的relay-log重做日志文件中再执行一次这些sql语句即可。
4.具体需要三个线程来操作:
(1).主库dump线程:每当有从库连接到主库的时候,主库都会创建一个dump线程然后发送binlog(二进制日志)内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
(2).从库IO线程:当START SLAVE语句在从库开始执行之后,从库创建一个IO线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库IO线程读取主库的binlog输出线程发送的更新并拷贝这些更新到 relay log 文件。
(3).从库的SQL线程:从库创建一个SQL线程,这个线程读取从库IO线程写到 relay log 的更新事件并执行。从而实现主从的操作一致,最终数据一致;

总结:

从结点slave是根据读取主结点master的binlog二进制日志(记录了对数据库的所有操作)完成复制的

2.主从复制用途

1、做数据的热备;作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。(实时灾备,用于故障切换)
2、架构的扩;业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发;在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度

3.主从复制存在的问题

1.主库宕机后,数据可能丢失
2.从库只有一个sql Thread线程,主库写压力大,复制很可能延时

4.解决方法

半同步复制---解决数据丢失的问题
并行复制-----解决从库复制延迟的问题

5.主从部署必要条件

1.主库开启binlog日志(二进制日志)
2.主从server-id不同
3.从库服务器能连通主库(远程登陆)
实验:

1.配置主结点

(1)下载并安装数据库

#1.在官网上下载mysql
[root@sever1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
#2.解压
[root@sever1 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar 
[root@sever1 ~]# ls

在这里插入图片描述

#3.安装
[root@sever1 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm 

在这里插入图片描述
(2).开启二进制日志并指定id

[root@sever1 ~]# vim /etc/my.cnf
################
log-bin=mysql-bin    #开启二进制日志
server-id=1          #指定id

在这里插入图片描述
(3).开启数据库

#1.开启数据库
[root@sever1 ~]# systemctl start mysqld
#2.查看端口
[root@sever1 ~]# netstat -anltp

在这里插入图片描述
(4)查看数据库初始密码

[root@sever1 ~]# cat /var/log/mysqld.log | grep password

在这里插入图片描述
(5)登陆数据库

发现虽然可以登陆,但实际上无法使用数据库,根据提示需要先更改数据库密码,才能使用数据库

#登陆数据库
[root@sever1 ~]# mysql -uroot -p'+t2q(Ci0(WRa'

在这里插入图片描述
(6)初始化

[root@sever1 ~]# mysql_secure_installation 

在这里插入图片描述
在这里插入图片描述
(7)登陆数据库并创建用户授权

[root@sever1 ~]# mysql -uroot -phym19970818HYM#
mysql> show databases;        #查看年数据库
mysql> grant replication slave on *.* to repl@'172.25.66.%' identified by 'hym19970818HYM#';  #创建用户并授权

注释:
replication      #表示授权复制的权限
*.*              #表示所有数据库可以进行同步 
repl             #表示授权用户,可以随意填写
'172.25.66.%'    #表示授权172.25.66/24的网段所有服务器可以同步, %表示任意
hym19970818HYM#  #表示用户密码(我这里设定成root用户的密码是为了方便记忆)

在这里插入图片描述

#mysql-bin.000002表示当前正在使用的二进制日志文件,1003表示执行当前二进制日志位置,即从那里开始复制
mysql> show master status;    #查看master的状态
mysql> exit                   #退出
Bye

在这里插入图片描述
查看日志:

[root@sever1 ~]# cd /var/lib/mysql
[root@sever1 mysql]# ls
auto.cnf         ibdata1           mysql-bin.000002    public_key.pem
ca-key.pem       ib_logfile0       mysql-bin.index     server-cert.pem
ca.pem           ib_logfile1       mysql.sock          server-key.pem
client-cert.pem  ibtmp1            mysql.sock.lock     sys
client-key.pem   mysql             performance_schema
ib_buffer_pool   mysql-bin.000001  private_key.pem
[root@sever1 mysql]# cat mysql-bin.index 
./mysql-bin.000001
./mysql-bin.000002
[root@sever1 mysql]# file mysql-bin.index 
mysql-bin.index: ASCII text
#查看日志
[root@sever1 mysql]# mysqlbinlog ./mysql-bin.000002 

在这里插入图片描述
2.配置从结点

(1).下载并安装数据库

[root@sever1 ~]# scp mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm root@172.25.66.2:
[root@sever2 ~]# ls

在这里插入图片描述

[root@sever2 ~]# yum install -y *

在这里插入图片描述
(2).指定id

[root@sever2 ~]# vim /etc/my.cnf
################
server-id=2         #指定id

在这里插入图片描述
(3)开启数据库

[root@sever2 ~]# systemctl start mysqld
[root@sever2 ~]# netstat -antlp

在这里插入图片描述注意:如果开启数据库时,特别缓慢怎么办呢?

[root@server2 ~]#  systemctl start mysqld
^C
[root@server2 ~]# ps aux | grep mysql
mysql     2717  1.1 23.2 1119484 176448 ?      Sl   09:21   0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root      2747  0.0  0.1 112648   960 pts/0    R+   09:22   0:00 grep --color=auto mysql
#1.杀死进程
[root@server2 ~]# kill -9 2717
[root@server2 ~]# ps aux | grep mysql
mysql     2769 10.0 22.7 988412 172548 ?       Sl   09:22   0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root      2799  0.0  0.1 112648   960 pts/0    R+   09:22   0:00 grep --color=auto mysql
#2.重新启动
[root@server2 ~]# systemctl start mysqld

(4)查看数据库初始密码

[root@sever2 ~]# cat /var/log/mysqld.log | grep password

在这里插入图片描述
(5)初始化

#将密码设定成与主库root用户密码一样是为了方便记忆,并不是必须
[root@sever2 ~]# mysql_secure_installation 

在这里插入图片描述
在这里插入图片描述
(6)登陆数据库

[root@sever2 ~]# mysql -uroot -phym19970818HYM#

在这里插入图片描述

### XtraBackup 与 MySQL 主从复制配置 XtraBackup 是 Percona 提供的一个用于 InnoDB 存储引擎的热备份工具,支持在线进行数据库的物理备份,并且可以用于搭建主从复制环境。通过 XtraBackup 进行主从同步的配置通常包括以下几个关键步骤。 #### 备份主库数据 在主库上执行完整备份是配置主从复制的第一步。使用 `innobackupex` 工具可以创建一个一致性快照,同时保留事务日志信息,以便后续恢复和同步。以下是一个完整的备份命令示例: ```bash innobackupex --defaults-file=/data/dbdata/3306/my.cnf --user=root --password=kongzhong123 --port=3306 --socket=/data/dbdata/3306/mysql.sock --no-lock --slave-info --safe-slave-backup --compress --compress-threads=8 /data/bak_dir/mysql/3306/full/ > /data/bak_dir/mysql/3306/full.log 2>&1 ``` 该命令会生成一个压缩的完整备份,并将日志记录到指定文件中[^1]。 #### 恢复备份并准备从库 完成备份后,需要对备份进行“准备”操作,以确保其可用于恢复。以下是准备备份的命令: ```bash innobackupex --apply-log /data/bak_dir/mysql/3306/full/ ``` 如果使用了压缩备份,则需要先解压备份文件,再执行上述命令。准备好备份后,将其传输到从库服务器,并恢复到目标目录。 #### 配置从库 在从库上恢复备份后,需要配置从库以连接到主库。以下是在从库上设置主库信息的 SQL 命令: ```sql CHANGE MASTER TO MASTER_HOST='192.168.1.154', MASTER_USER='maxscale_monitor', MASTER_PASSWORD='maxscale123456', MASTER_PORT=3306, MASTER_LOG_FILE='master1-bin.000011', MASTER_LOG_POS=598081860, MASTER_USE_GTID=slave_pos, MASTER_CONNECT_RETRY=10; ``` 其中 `MASTER_LOG_FILE` 和 `MASTER_LOG_POS` 的值可以从主库的备份信息中获取,或者通过 `SHOW MASTER STATUS` 获取最新的二进制日志位置[^2]。 #### 启动从库复制线程 在从库上执行以下命令启动复制线程: ```sql START SLAVE; ``` 随后可以通过以下命令查看从库的状态: ```sql SHOW SLAVE STATUS \G ``` 确认 `Slave_IO_Running` 和 `Slave_SQL_Running` 状态均为 `Yes`,表示主从复制已经成功启动。 #### 注意事项 1. **GTID 与非 GTID 模式**:如果主库启用了 GTID(全局事务标识符),则从库也应启用 GTID 模式,并在 `CHANGE MASTER TO` 命令中指定 `MASTER_USE_GTID=slave_pos`。这有助于简化故障切换和复制拓扑管理。 2. **MySQL 版本兼容性**:不同版本的 MySQL复制行为上可能有所不同,尤其是在 GTID 的处理方面。确保主从库的 MySQL 版本兼容性,避免因版本差异导致的问题。 3. **网络连接与权限**:确保从库能够通过网络访问主库,并且用于复制的用户具有足够的权限(如 `REPLICATION SLAVE` 权限)。 4. **定期检查复制状态**:即使复制正常运行,也应定期检查从库的复制状态,确保没有延迟或错误。 5. **重启服务**:如果在配置过程中修改了 MySQL 的配置文件,可能需要重启 MySQL 服务以使更改生效。可以使用以下命令重启服务: ```bash service mysql restart ``` 此命令适用于基于 SysVinit 的系统。如果是 systemd 系统,则应使用 `systemctl restart mysql` [^3]。 6. **增量备份与恢复**:除了完整备份外,还可以使用 XtraBackup 进行增量备份。增量备份仅捕获自上次备份以来发生变化的数据页,适用于频繁备份需求。恢复时需先应用完整备份,然后依次应用增量备份。 7. **逻辑备份与物理备份的选择**:虽然 XtraBackup 提供了高效的物理备份方式,但在某些情况下(如跨版本迁移、表结构变更等),逻辑备份(如 `mysqldump`)可能更为合适。逻辑备份可以避免因存储引擎或版本差异导致的兼容性问题[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值