mysql主从复制

目录

0.前言

1.主从复制的作用

2. 主从复制的原理

3.异步主从复制

使用二进制日志文件位置进行异步复制

使用 GTID 事务进行异步复制

4.半同步复制

5.延迟复制

6.多主复制

7.组复制


0.前言

mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证mysql数据库的可靠性。就要会一些提高可靠性的技术。

为什么要主从复制、读写分离

主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高。如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗?

所以主从复制、读写分离就是为了数据库能支持更大的并发。

随着业务量的扩展、如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性。


1.主从复制的作用

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

 1--在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
 2--在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
 3--当主服务器出现问题时,可以切换到从服务器。(提升性能)


2. 主从复制的原理

当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。

salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。

当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。

I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。

SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。


3.异步主从复制

原理图

使用二进制日志文件位置进行异步复制

配置server1,2的mysql编辑server1 

log-bin=mysql-bin            ##启用二进制日志记录
server-id=1                  ##复制拓扑中的每个服务器都必须配置一个唯一的服务器ID,用于标识复制拓扑中的各个服务器

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'westos';   ##创建一个单独的用户,供server2连接使用
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';    ##授权
mysql> SHOW MASTER STATUS;   ##确定当前的二进制日志文件名和位置

编辑server2 

如果server1上已经建立了数据库、表或者写入了数据。那么server2上也需要先存在这些东西,这是因为二进制文件里记录的是执行的动作,从机来复制这些动作。从机里没有被操作的东西,那就无法执行动作。如果server1的mysql是全新的话,则可以直接继续设置server2。 

mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.25.0.1',             
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='westos',
    -> MASTER_LOG_FILE='mysql-bin.000001',    ##二进制文件名
    -> MASTER_LOG_POS=595;                    ##二进制文件位置
mysql> start slave;                           ##开启复制线程slave
show slave status\G;                          ##查看slave日志

 IO为no是检查赋予的用户,火墙

 SQL为no是检查mysql组是否一致

使用 GTID 事务进行异步复制

gtid_mode=ON                   ##启用 GTID 模式来启动每个服务器

server2同理 

 

进入mysql 

MASTER_AUTO_POSITION = 1;      ##使用gtid

测试 

创建组

创建表并添加用户查看server2 


4.半同步复制

在异步复制已设置完成的前提下,继续配置半同步复制。半同步复制是使用插件实现的,所以插件必须安装到服务器才能使用

master

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  ##安装插件
SET GLOBAL rpl_semi_sync_master_enabled =1;   ##启用插件
show status like 'Rpl_semi%';    ##查看插件状态

slave 

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';  ##安装插件
SET GLOBAL rpl_semi_sync_slave_enabled = 1;   ##启动插件
STOP SLAVE IO_THREAD;    ##重启IO线程
START SLAVE IO_THREAD;
show status like 'Rpl_semi%';    ##查看插件状态

重新启动 

server2,1中均已开启

添加信息 


5.延迟复制

延迟复制可以设置副本服务器故意落后于源至少指定的时间

STOP SLAVE SQL_THREAD;
CHANGE MASTER TO MASTER_DELAY=60;   ##延迟60秒
START SLAVE SQL_THREAD;

添加列表信息测试 


6.多主复制

多个master多个slave

开启slave服务

将westos组传入server3中  将dump.sql导入到server3mysql的westos组中 server2配置server3配赋予repl用户mysql下的权限将server2设为master 测试 


7.组复制

我们以server1、server2和server3为例,演示部署组复制(一个组最少3个成员,最多9个成员)。因为在前面做了一些mysql的实验,所以需要停止服务,并清空数据目录,再进行部署。 

server1

plugin_load_add='group_replication.so'     ##将 Group Replication 插件添加到服务器在启动时加载的插件列表中
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"    ##告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”
group_replication_start_on_boot=off    ##插件在服务器启动时不自动启动操作
group_replication_local_address= "server1:33061"    ##成员用于与组中其他成员进行内部通信的网络地址和端口
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061"    ##组成员的主机名和端口
group_replication_bootstrap_group=off

在mysql内修改密码不会添加到日志里,方便做组复制 

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';    
##使用复制通道的给定凭据

mysql> SET GLOBAL group_replication_bootstrap_group=ON;    ##引导启动组,引导程序只能由一个服务器完成
mysql> START GROUP_REPLICATION;    ##开启
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members;    ##查看组成员

注意:引导程序只由一台服务器完成即可,这里server1引导了,所以接下来的server2和server3就不需要这一步了。

server2 

修改密码密码必须一致 

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';    ##用户凭证
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

server3 与server2 同理在server1中检查是否为ONLINE 测试 

server1添加内容server2查看 server3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值