Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL MyCat主从读写分离

MyCat实现MySQL主从读写分离

作者:柒柒qr

本文详细讲解读写分离的原理和优势,手把手教你安装配置MyCat中间件,实现主从复制和故障切换,轻松提升数据库性能和可用性,适合运维和开发人员实战参考

前言

在现代高并发数据库应用场景中,单台MySQL服务器往往难以应对读写混合的压力。读写分离技术通过将数据库的写操作和读操作分配到不同的服务器节点,能有效提升系统性能和可用性。MyCAT 是一个数据库中间件,它能解决单台 MySQL 扛不住的问题。

一、MySQL读写分离概述

1.1 工作原理

1.2 为什么要读写分离

突破性能瓶颈:单台服务器性能有限,分担负载提升整体吞吐量
缓解锁争用问题:主库处理写操作(X锁),从库处理读操作(S锁),减少锁冲突
优化存储引擎:从库可使用MyISAM引擎(查询性能更优),主库使用InnoDB(保证事务安全)
保障高可用:主从架构提供冗余,主库故障时可快速切换到从库

1.3 实现方式

应用程序层实现

中间件层实现

常用中间件:

二、什么是MyCat

MyCat是开源的企业级数据库中间件,核心特性包括:

三、MyCat 安装与配置

3.1 准备环境

关闭防火墙
关闭增强功能
Master服务器:10.8.0.10 mysql5.7
Slave1服务器:10.8.0.30 mysql5.7
Slave2服务器:10.8.0.50 mysql5.7
客户端服务器:10.8.0.60 安装mycat,测试

# 关闭防火墙
systemctl stop firewalld
# 关闭增强功能
setenforce 0

3.2 下载与解压(10.8.0.60)

# 官方下载地址
wget https://github.com/MyCATApache/Mycat-download/blob/master/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
# 解压到安装目录
tar -zxvf Mycat-server-1.6-RELEASE-*.tar.gz -C /usr/local/
cd /usr/local/mycat

3.3 创建用户

useradd mycat
# 设置密码
passwd mycat 
# 授权
chown -R mycat.mycat /usr/local/mycat  

3.4 Java环境配置

# 安装JDK 1.8+
tar xf jdk-8u191-linux-x64.tar.gz -C /usr
# 配置环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
# 生效配置
source /etc/profile.d/java.sh
java -version  # 验证安装

四、MyCat核心配置实战

4.1 环境变量配置

# 创建MyCat环境变量
vim /etc/profile.d/mycat.sh
#!/bin/bash
export MYCAT_HOME=/usr/local/mycat
export PATH=$MYCAT_HOME/bin:$PATH
# 生效配置
source /etc/profile.d/mycat.sh

4.2 主机名解析配置

# 编辑/etc/hosts添加集群节点
vim /etc/hosts
10.8.0.30 slave1
10.8.0.50 slave2
10.8.0.10 master

4.3 核心配置文件

4.3.1 用户权限配置(server .xml)

vim /usr/local/mycat/conf/server.xml
<!-- 管理用户,具有读写权限 -->
# 用户名:mycat ;密码:123456;可访问逻辑库:ha ;权限:默认是读写都有(全权限) ;schemas="ha" 必须存在
<user name="mycat">
                <property name="password">123456</property>
                <property name="schemas">ha</property>
                # dml 权限含义:1111:全权限;0001:只能查;0110:删 + 改
                <!-- 表级 DML 权限设置 -->
                <!--            
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
                 -->
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">ha</property>
                <property name="readOnly">true</property>
        </user>

4.3.2 schema 配置

# 备份
mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak
vim /usr/local/mycat/conf/schema.xml
# 直接复制
# 一主两从
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 定义逻辑库 schema -->
    <schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    </schema>
    <!-- 数据节点 -->
    <dataNode name="dn1" dataHost="dthost" database="ha"/>
#name="ha":定义 schema 名称为 ha,客户端通过 use ha 来访问。checkSQLschema="false":关闭 SQL schema 检查,加快解析。sqlMaxLimit="100":单条 SQL 返回最大 100 行。dataNode='dn1':指定使用的数据节点为 dn1。
    <!-- 数据主机组 -->
    <dataHost name="dthost" 
              maxCon="500" 
              minCon="10" 
              balance="1" 
              writeType="0" 
              dbType="mysql" 
              dbDriver="native" 
              switchType="-1" 
              slaveThreshold="100">
        # 心跳检测
        <!-- 心跳语句 -->
        <heartbeat>select 1</heartbeat>
        <!-- 主库 (写) -->
        <writeHost host="master" url="10.8.0.10:3306" user="mycat" password="123456">
            <!-- 从库 (读) -->
            <readHost host="slave1" url="10.8.0.30:3306" user="mycat" password="123456"/>
            <readHost host="slave2" url="10.8.0.50:3306" user="mycat" password="123456"/>
        </writeHost>
    </dataHost>
</mycat:schema>

4.3.3 关键参数解析

balance(读负载均衡方式)

0:不开启读写分离
1:所有读节点参与负载均衡(推荐)
2:随机分配读请求
3:读请求只分发给从节点

writeType(写节点策略)

0:写操作只发往第一个writeHost
1:写操作随机分配(已废弃)

switchType(故障切换策略)

-1:不自动切换
1:自动切换(默认)
2:基于MySQL主从状态切换
3:基于Galera Cluster切换

4.4 启动MyCat服务

# 切换到MyCat安装目录
cd /usr/local/mycat/bin
# 启动服务
./mycat start
# 查看启动日志
cat /usr/local/mycat/logs/wrapper.log

五、MySQL主从环境搭建

5.1 主库配置(10.8.0.10)

# 创建MyCat连接账号并赋权
grant all privileges on *.* to 'mycat'@'%' identified by '123456';
# 刷新权限
flush privileges;

5.2 从库配置(10.8.0.30/50)

# 配置好主从复制的基础上直接为mycat用户赋权
grant all privileges on *.* to 'mycat'@'%' identified by '123456';

六、读写分离效果验证

6.1 测试环境准备

# 在客户端(10.8.0.60)安装MySQL客户端
yum install -y mariadb-server
systemctl start mariadb.service
# 连接MyCat管理端口
mysql -u mycat -p123456 -h 10.8.0.60 -P 8066
# 通过mycat服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器

6.2 读写分离验证步骤

在主服务器上:
create database ha;
use ha;
create table test (id int(10),name varchar(10),address varchar(20));

在两台从服务器上:
# 关闭同步
stop slave;										
use ha;
# 在slave1上:
insert into test values('1','csq','this_is_slave1');
# 在slave2上:
insert into test values('2','zx','this_is_slave2');
# 在主服务器上:
insert into test values('3','yr','this_is_master');
# 在客户端服务器上:
use ha;
# 客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据
select * from test;		

# 在客户端服务器上:
# 只有主服务器上有此数据
insert into test values('4','qiran','this_is_client');		

# 在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave;
# 在客户端执行查询
select * from test;

总结

注意:数据库关掉后,主从不再同步,若SQL线程出现问题,可以重新配置偏移量和file文件

到此这篇关于MyCat实现MySQL主从读写分离的文章就介绍到这了,更多相关MySQL MyCat主从读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文