Mysql主从模式


👉🏻前言

随着科技的进步和互联网行业的发展,上网的人越来越多,所以我们开发的项目访问量越来越多,数据也越来越多,为了针对这个问题很多项目都搭建了集群,同样对于数据库也搭建了集群,本文就简单的对Mysql搭建主从模式做了简单的说明和配置。

❤️主从模式说明

主从模式指的是将主数据库和从数据库部署在多个服务器上,当主节点写入数据的时候会同步到从节点。
在这里插入图片描述
🔊Mysql主从复制的好处

  • 实现了高可用灾备,当一个节点发生故障后切换另一个节点。
  • 可以实现读写分离,避免一个数据库压力太大性能低。
  • 可以实现数据本分,每一个从库都是一个数据备份。

🤍logbin日志

Mysql的主从复制是通过binlog来完成的,binlog是Mysql中对于数据库非查询类操作的二进制记录日志。
通过show global variables like “%log_bin%”; 命令查看一下binlog放在了哪里。
在这里插入图片描述
可以通过下面命令查看logbin日志的内容

mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001

logbin中其他的内容咱就不多看了,看一下里面这部分,这是刚执行的SQL语句,用户表中插入了李四数据。这是个完整的SQL,在Mysql的主从复制的时候就可以读取该日志对从库进行操作。
在这里插入图片描述

🤍Mysql主从复制的流程

在这里插入图片描述
🔊Mysql的主从复制的大致流程是这样的:

  1. 在主数据库进行改动数据,改动过程被记录到binlog中。
  2. 从库读取主库的binlog日志文件,通过IO Thread写入到从库的relay log日志中。
  3. 从库读取Relay log中的内容,并且通过SQL Thread解析更新到从数据库。

🤍主从复制中遇到的问题

🔊 半同步复制
在上面图中可以看到多画了了一个相应反馈,这是后面Mysql5.5及以后为了解决主从复制过程中的一些问题做的变动。
分析下上面的流程可能会出现这样的问题:假如主数据库刚执行完操作写入binlog日志断电了,这就无法保证主数据库和从数据库之间的一致性了,所以Mysql针对这个问题增加了反馈应答机制,具体是这样的:当数据库进行操作后先不提交事务,先将binlog日志同步到从数据库,从数据库同步完成之后给主数据库应答操作再提交事务,这就是半同步复制模式。

🔊 并行复制
主从复制还有一个比较严重的问题就是数据库的延时性,我们一般说的一致性指的是最终一致性,很少有系统实现真正的强一致性,而最终一致性就涉及到一个问题:数据库同步过程中存在着一定的滞后性。那么在进行读写分离的时候就会出现从数据库读取的不是最新的数据的问题。
针对上面说的问题,在Mysql5.6及之后的版本都做出了优化,引入了并行复制策略,当然只是优化减少时间,并不是没有解决方案,只是综合考虑整体性能最终选择了优化延时。并行复制的原理是这样的:如果一次执行了大批量数据库操作使用线程肯定很慢,那就多开几个Worker线程,这样就增加了整体的效率减少了延时。
在并行复制的时候会遇到这么一个问题,如果SQL之间有依赖关系分组怎么处理?下面简单的说一下Mysql8的方案,Mysql8的并行复制是基于write-set实现的,这里记录了被操作记录的主键Hash值,通过对比主键来确定多个事务中间执行的SQL没有依赖冲突。

❤️主从模式配置

本次配置环境为两台腾讯云Centos8,Mysql使用的是8.0的版本

🤍Master配置

选取其中148服务器为Master主机。

登录MySQL授权从库,我们给从库使用root同步的权限,如果固定从库的话可以用IP代替%。

grant replication slave on . to ‘root’@‘%’;
flush privileges;

找到修改对应的配置文件。

vim /etc/my.cnf

在mysqld下面增加以下配置。这里设置的server-id是唯一的,需要最大int大小;binlog-do-db是需要同步的数据库;replicate-ignore-db是不需要同步的数据库,如果这两个参数都不配置代表同步所有数据库。

log-bin=mysql-bin
server-id=1
binlog-do-db=test001

重新启动Mysql。

systemctl restart mysqld

使用show master status查看主库状态
在这里插入图片描述

🤍Slave配置

找到修改对应的配置文件。

vim /etc/my.cnf

在mysqld下面增加以下配置。

server_id=2

重新启动Mysql。

systemctl restart mysqld

登录数据库设置同步对应的主服务器信息,这里对应着上面截图里的内容。

change master to master_host=‘82.157.173.148’,master_user=‘root’,master_password=‘数据库密码’,master_log_file=‘mysql-bin.000002’,master_log_pos=157;

启动从库。

start slave;

查看一下从数据库状态。

show slave status \G;
在这里插入图片描述

🔊配置完成了,测试验证一下
在主数据库执行下面SQL语句,创建个用户表并且插入一条数据。

CREATE TABLE `user1` (
`id`  bigint NOT NULL ,
`name`  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`age`  int NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC;

insert into user1 values(1,'张三',20);

最终可以看到从数据库同样产生了对应的信息
在这里插入图片描述

❤️其他设置

前面搭建了个简单的主从模式的Mysql小集群,但是上面我们提到过基本的主从复制模式是有两个问题的,现在咱配置解决相关的问题。

🤍半同步复制

半同步复制是通过semi插件来控制的,来看一下半同步复制的配置。
🔊主数据库
检查是否支持动态加载

select @@have_dynamic_loading;
在这里插入图片描述

查看Mysql自带的插件,检查后没有发现semi插件

show plugins;

安装semi的插件

install plugin rpl_semi_sync_master soname ‘semisync_master.so’;

查看插件状态

show variables like ‘%semi%’;
在这里插入图片描述

设置打开Rpl_semi_sync_master_status,超时时间10秒感觉长的也可以这样修改

SET GLOBAL rpl_semi_sync_master_enabled = 1;

🔊从数据库
从数据库同样操作一遍,安装从数据库插件

install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;

设置打开从库状态

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

重启从库

stop slave;
start slave;

查看状态

show variables like ‘%rpl_semi_sync_slave%’;
在这里插入图片描述

整个配置就完成了。

🤍并行复制

🔊主数据库
查看binlog组状态

show variables like ‘%binlog_group%’;
在这里插入图片描述
修改事务延时提交状态和每组的最大事务数量。
set global binlog_group_commit_sync_delay=1000; 延时1秒
set global binlog_group_commit_sync_no_delay_count=100; 每组最大事务数量为100

🔊从数据库
咱就演示那些费劲的操作了,直接去数据库配置文件中修改吧
当然如果感觉麻烦的话可以全部在config文件中配置:

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
slave_pending_jobs_size_max = 2147483648
slave_preserve_commit_order=1
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

在这里插入图片描述
配置完成后重新启动数据库,OK并行复制设置完成。
查看一下并行复制的状态

select * from replication_applier_status_by_worker; 在performance_schema数据库中执行。
在这里插入图片描述

🤍读写分离

Mysql主从模式还可以使用读写分离操作,对于某些业务来说可能读取数据用的比较多,读的压力比较大即使我们对SQL等内容进行了优化查询速度依然很慢,这时候就可以使用读写分离了,从数据库提供读操作。例如我之前遇到的项目就有把读写操作分成了两个项目,其中一个是大批量业务数据的录入系统,另一个是对数据的展示分析汇总的系统。
读写分离还有一个比较骚的操作:我们知道索引是针对读取数据的,对写造成反向影响,读写分离了是不是可以把写的数据库减少索引了,这样可以提高写的性能。
读写分离一般通过中间件实现的,常见的有基于Mysql代理的MySQL Proxy,MySQL Proxy是数据库的代理,不需要开发人员修改代码,只需要运维人员进行数据库配置就可以了;Mycat和Sharding-JDBC这两个是应用层面的读写分离,需要程序人员在代码中通过对应框架实现读写分离操作。作为开发人员的话一般喜欢使用应用层读写分离,喜欢把问题掌控在自己的手里。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值