一、读写分离概述读写分离,简单来说是把对数据库的读和写操作分开,当应用程序发起读操作时分配给读库,当应用程序发起写操作时分配给写库,从而达到减轻单台数据库服务器的压力 。
实现读写分离的工具使用mycat就可以,当然还有其它的,mycat不仅可以支持MySQL,也支持oracle和SQL server 。
文章插图
读写分离逻辑图
读写分离是基于MySQL 的主从复制的,所以在实现读写分离前,我们先回顾下mysql主从复制 。mysql主从复制首先它是基于二进制日志实现的,这个二进制binlong包含了DDL和DML语句 。实现原理是这样的: 当主库执行了DDL和DML语句,会将数据的变更记录到binlog日志文件里,从库中的IO线程负责去读取主库的binlog,然后记录到自己的中继日志relay log中,从库的SQL线程读取中继日志relay log 重新执行到从库中 。
文章插图
一主一从环境环境准备,如图示:
文章插图
二、配置一主一从读写分离通过mycat来控制后台数据库的读写分离和负载均衡,由schema.xml文件中的datahost标签里的balance属性来控制 。
文章插图
balance属性值含义:
0: 表示不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上 。
1: 表示全都的readHost与备用的writeHost都参与select语句的负载均衡(针对双主环境)
2: 所有的读写操作都随机在writeHost、readHost上分发 。
3: 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负责读压力 。
配置过程修改schema.xml 添加逻辑库及读写分离dataHost标签,
文章插图
schme.xml
然后修改server.xml 运行用户访问读写分离逻辑库DB_TBSHARE_RW.
文章插图
server.xml
ok,配置好后重启mycat进行测试 。
[root@db-master /usr/local/mycat/conf]# ../bin/mycat start[root@db-master /usr/local/mycat/conf]# cat ../logs/wrApper.logSTATUS | wrapper | 2022/04/24 20:57:01 | --> Wrapper Started as DaemonSTATUS | wrapper | 2022/04/24 20:57:02 | Launching a JVM...INFO | jvm 1 | 2022/04/24 20:57:03 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.orgINFO | jvm 1 | 2022/04/24 20:57:03 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.INFO | jvm 1 | 2022/04/24 20:57:03 |INFO | jvm 1 | 2022/04/24 20:57:10 | MyCAT Server startup successfully. see logs in logs/mycat.log[root@db-master /usr/local/mycat/conf]# mysql -uroot -h192.168.128.100 -p123456 -P8066 。。。Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.mysql> show databases;+---------------+| DATABASE|+---------------+| DB_TBSHARE|| DB_TBSHARE_RW || SHOPING|+---------------+3 rows in set (0.02 sec)mysql> use DB_TBSHARE_RW;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> show tables;+----------------------+| Tables_in_db_tbshare |+----------------------+| tb_user|+----------------------+1 row in set (0.02 sec)mysql>
插入4条数据,然后select,此时我们分辨不出查询是主库的还是从库的,懵逼了mysql> insert into tb_user values(1,'凤雏','男');Query OK, 1 row affected (0.02 sec)mysql> insert into tb_user values(2,'落凤坡','男');Query OK, 1 row affected (0.02 sec)mysql> insert into tb_user values(3,'小乔','女');Query OK, 1 row affected (0.02 sec)mysql> insert into tb_user values(4,'风二娘','女');Query OK, 1 row affected (0.10 sec)mysql> select * from tb_user;+----+-----------+------+| id | username | sex |+----+-----------+------+| 1 | 凤雏 | 男 || 2 | 落凤坡 | 男 || 3 | 小乔 | 女 || 4 | 风二娘 | 女 |+----+-----------+------+4 rows in set (0.01 sec)
办法来了,我们悄悄的把从库的小乔改成大桥试试, 因为从库的更新不可能同步到主库对吧,条友们,然后才select验证,如下图示,读写分离正常 。文章插图
由于这一主一从存在单点故障,当主库挂了,通过mycat查询是没问题的,但是执行DML和DDL会提示连接断开,导致大家熬夜加班 。
三、主主复制,双主双从架构实现读写分离主节点master1用于处理所有的写请求,它的从节点slave1和另外一台主节点master2及slave2从节点负责所有的读请求 。当master1主机节点宕机后,master2主节点负责写请求,它俩互为备机,如图示:
推荐阅读
- 数据库MYSQL的查询
- MySQL 8.0新特性之隐藏字段的深入讲解
- 想MYSQL数据库运维高效,这些开发规范总结,参考着用
- ubuntu18.04中Mysql5.7数据库安装及远程登录
- MySQL不同版本多实例部署
- 对MySQL底层索引深度解析
- 油水分离炸锅好用吗 油水分离的炸锅比普通炸锅的好处
- 手把手教你搭建高逼格监控平台,第二弹,监控mysql
- MySQL:高并发情况下,数据库该如何设计?
- MySQL各大版本新特性一览