读写分离基本概念
MySQL 虽然是世界上使用最广泛的免费数据库,但是并不能满足实际的一个需求,在高并发高可用等方面。我们主要是通过主从复制来同步数据,再通过读写分离来提升数据库的并发能力。
工作原理
- 主数据库上执行写操作,并将写操作的结果同步到所有从数据库。
- 从数据库上只处理读请求,不处理写请求。应用程序根据负载均衡算法将读请求路由到从数据库上,并将写请求路由到主数据库上。
- 主从数据库之间通过异步复制或同步复制等方式进行数据同步。
读写分离的意义
-
降低主数据库负载:读操作通常比写操作频繁,将它们分开可以将主数据库的读负载分散到多个从数据库上,减轻主数据库的负载压力,从而提高系统的性能。
-
提高系统的吞吐量:读写分离可以将读操作分散到多个从数据库上,从而提高系统的吞吐量,满足高并发访问的需求。
-
提高系统的可伸缩性:读写分离可以根据实际的负载情况动态地增加从数据库的数量,以提高系统的可伸缩性,保障系统的稳定性。
-
提高系统的可用性:读写分离可以实现多个从数据库的自动切换,从而提高系统的可用性,确保系统的稳定性。
实现读写分离的方式
应用层实现
中间件实现
Mycat 中间件
基本概念
- 项目地址: Mycat2 github
- 由来
- Cobar:阿里巴巴 B 2 B 开发的关系型分布式系统,管理将近 3000 个 MySQL 实例。在阿里经受住了考验,后面由于作者的走开的原因 cobar 没有人维护了,阿里也开发了 tddl 替代 cobar。
- MyCAT: 社区爱好者在阿里 cobar 基础上进行二次开发,解决 cobar 当时存在的一些问题,并且加入了许多新的功能在其中。目前 MyCAT 社区活跃度很高,目前已经有一些公司在使用 MyCAT。总体来说支持度比较高,也会一直维护下去,
- 优势
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代 MySQL 的加强版数据库
- 一个可以视为 MySQL 集群的企业级数据库,用来替代昂贵的 Oracle 集群
- 一个融合内存缓存技术、NoSQL 技术、HDFS 大数据的新型 SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
部署 mycat
拓扑图
基础环境准备
- [[10-MySQL Replication Structure#环境准备]]
- 三台主机绑定 hosts
vim /etc/hosts
192.168.45.10 mysql-0
192.168.45.11 mysql-1
192.168.45.12 mysql-2
- 完成一主多从搭建:[[10-MySQL Replication Structure#一主一从M-S|参考]]
安装 mycat
- 上传软件包,配置 Java 环境
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
source /etc/profile
java -version
2. Mycat 初始化
tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/
ln -s /usr/local/mycat/bin/* /usr/local/bin/
Mycat 配置文件调整
调整 Server.xml
在调整配置文件前需备份配置文件
cd /usr/local/mycat/conf/
cp server.xml server.xml.bak
vim server.xml
这里是配置 mycat 的两个用户及其密码。
<property name="schemas">TESTDB</property>
逻辑库名: 是登录 mycat 后显示的库名,切换这个库之后,显示的就是代理的真实 mysql 数据库的表
调整 schema.xml
- 相关名词
- Schema 逻辑数据库设置,名字与
server.xml
中schema
对应。 - DataNode 分片信息,也就是分库相关配置。
- DataHost 物理数据库,真正存储数据的数据库。
- 文件调整
cp schema.xml schema.xml.bak
vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
</schema>
<dataNode name="dn1" dataHost="dn1" database="learn" />
<dataHost name="dn1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="mysql-0" url="192.168.45.10:3306" user="root" password="123456">
</writeHost>
<writeHost host="mysql-1" url="192.168.45.11:3306" user="root" password="123456">
</writeHost>
<writeHost host="mysql-2" url="192.168.45.12:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
参数解释
log4j2.xml
日志文件
vim log4j2.xml
<asyncRoot level="trace" includeLocation="true">
赋权所有 MySQL 服务器登陆权限
利用 xshell 统一发送命令
grant all on *.* to root@'192.168.45.%' identified by '123456';
flush privileges;
开启 mycat
自检
mycat console
^a98e01
- 报错
Caused by: org. Xml. Sax. SAXParseException; lineNumber: 5; columnNumber: 80; 必须为元素类型 "schema" 声明属性 "datanode"。
- 原因
N 字母必须为大写
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
- 重新执行[[11-MySQL 读写分离&mycat#^a98e01|检测]]命令,检测 OK
启动 mycat
- Root 用户测试
mycat start
ss -antup | grep 8066
mysql -uroot -p123456 -P 8066 -h 192.168.45.10 -e "show databases;"
- Usesr 用户测试
mysql -uroot -p123456 -P 8066 -h 192.168.45.10 -e "show databases;"
#### 模拟故障测试
- 关闭 Master 服务,查看能否正常读
- 关闭 Slave 服务,查看能否正常读写
标签:xml,数据库,MySQL,192.168,mycat,集群,Mysql,Mycat,读写
From: https://www.cnblogs.com/lhang/p/17394039.html