简介

读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。主数据库进行写操作后,数据及时同步到所读的数据库,尽可能保证读、写数据库的数据一致。此处的读写分离采用的是Mycat。

Mycat 的原理中最重要的一个词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了 一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库, 并将返回的结果做适当的处理,最终再返回给用户。

下面是博主用于配置的主从及读写分离的机器:

节点系统环境IPMySQL主从关系MySQL读 OR 写
node3CentOS 7LNMP、JDK8192.168.17.130
node4CentOS 7LNMP192.168.17.150主+从

Mycat部署与配置

1、安装jdk环境

此处安装的jdk版本为8,可前往官网下载,应保证其下载最低jdk版本不可低于7,其具体jdk配置可参考如下文章:

2、下载Mycat,下载地址为:http://dl.mycat.org.cn/,选择Linux环境的版本即可,此处下载的版本为1.6.7.4-release,按需下载并配置

wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

#创建一个group
groupadd mycat

#创建一个新的用户,并加入group
useradd -g mycat mycat

# 解压缩
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local

#设置权限
chown -R mycat:mycat /usr/local/mycat

3、修改Mycat内存配置、大家需要根据自己的机器实际内存情况进行配置

vim /usr/local/mycat/conf/wrapper.conf

# 大约35行左右,结合自己机器内存大小更改即可:
wrapper.java.additional.9=-Xmx2G
wrapper.java.additional.10=-Xms512M

4、将Mycat添加至系统环境变量

vim /etc/profile

# 添加如下内容
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH

# 刷新系统环境变量
source /etc/profile

5、配置Mycat账号密码和数据库名(server.xml)

Mycat作为数据库的中间件,对于上层应用来说,他就是一个数据库。因此需要配置数据库的用户名,密码,数据库名,以及读写权限。

user 用户配置节点相关参数说明:

参数说明
user用户配置节点
--name登录的用户名,也就是连接Mycat的用户名
--password登录的密码,也就是连接Mycat的密码
--schemas数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,db2
--privileges配置用户针对表的增删改查的权限
--readOnly数据库是否设置为只读
--defaultSchema默认数据库,错误前会尝试使用该schema作为schema,不设置则为null,报错
vim /usr/local/mycat/conf/server.xml

# 修改如下
<user name="root">
    <property name="password">123456</property>
    <property name="schemas">typecho_db,dvwa_db</property>
    <property name="readOnly">false</property>  <!-- 是否为只读,此行按需添加 -->
    <property name="defaultSchema">typecho_db</property>  <!-- 配置一个默认数据库,其他数据库不可用时启用此数据库,此行按需添加 -->
</user>

即配置一个用户名为root,密码为123456的用户,同时具有typecho_db,dvwa_db模式下的读写权限,注意该模式即是在schema.xml配置文件定义的模式名一样。

6、配置Mycat的schema.xml文件

vim /usr/local/mycat/conf/schema.xml

# 相关配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 数据库配置,与server.xml中的数据库对应 -->
    <schema name="typecho_db" checkSQLschema="true" sqlMaxLimit="100"  dataNode="dn1"  />
    <schema name="dvwa_db" checkSQLschema="true" sqlMaxLimit="100"  dataNode="dn2"  />

    <!-- 分片配置 -->
    <dataNode name="dn1" dataHost="SQL1" database="typecho" />
    <dataNode name="dn2" dataHost="SQL1" database="dvwa" />
    
    <!-- 物理数据库配置 -->
    <dataHost name="SQL1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="123456">
        <readHost host="hostS1" url="192.168.17.150:3306" user="root" password="123456">    
        </readHost>
        </writeHost>
    </dataHost>
</mycat:schema>

参数说明:

参数说明
schema数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode分片信息,也就是分库相关配置
dataHost物理数据库,真正存储数据的数据库

每个节点的属性逐一说明:

schema:

属性说明
name逻辑数据库名,与server.xml中的schema对应
checkSQLschema数据库前缀相关设置,建议看文档,这里暂时设为folse
sqlMaxLimitselect 时默认的limit,避免查询全表

table:

属性说明
name表名,物理数据库中表名
dataNode表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey主键字段名,自动生成主键时需要设置
autoIncrement是否自增
rule分片规则名,具体规则下文rule详细介绍

dataNode

属性说明
name节点名,与table中dataNode对应
datahost物理数据库名,与datahost中name对应
database物理数据库中数据库名

dataHost

属性说明
name物理数据库名,与dataNode中dataHost对应
balance均衡负载的方式类型
writeType写入方式
dbType数据库类型
switchType切换的模式
heartbeat心跳检测语句,注意语句结尾的分号要加。

其中,balance指的负载均衡类型,目前的取值有4种:

balance="0" 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
balance="1" 全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
balance="2" 所有读操作都随机的在writeHost、readhost上分发。
balance="3" 所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

switchType指的是切换的模式,目前的取值也有4种:

switchType='-1' 表示不自动切换
switchType='1' 默认值,表示自动切换
switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status
switchType='3' 基于MySQL galary cluster的切换机制(适合集群),心跳语句为show status like 'wsrep%'

设置开机自启

之前设置过rc.local添加开机启动命令,服务器重启后mycat启动失败,又写一份配置文件控制mycat开机自启,仍失败,后摸索后发现皆是JVM虚拟机未启动导致的报错并停止,遂下方的启动方法是自己摸索中成功实现的一个开机启动方法,其设置如下:

1、将Mycat启动文件创建软连接

ln -s /usr/local/mycat/bin/mycat /etc/init.d/mycat

2、修改mycat路径中conf/wrapper.conf文件,将wrapper.java.command参数设置为java的路径

vim /usr/local/mycat/conf/wrapper.conf

# 修改为如下内容(后面一定要具体到java文件)
wrapper.java.command=/usr/local/java/jdk1.8.0_261/bin/java
wrapper.working.dir=..

3、添加文件执行权限并加入开机自启列表

chmod +x /etc/init.d/mycat
chkconfig --add mycat

# 查看是否添加成功(mycat后面的2、3、4、5皆为on即成功)
chkconfig --list

相关命令使用,后面的任一命令皆可控制

说明命令
启动 Mycatmycat start 、 mycat console 、 systemctl start mycat
查看启动状态mycat status 、 systemctl status mycat
停止mycat stop 、 systemctl stop mycat
重启mycat restart 、 systemctl restart mycat

连接Mycat

Mycat 有两个端口,8066 是数据平台的端口,9066是管理配置平台的端口。如果要修改端口号(如端口被占用,冲突等),需要配置serve.xml。最后可使用navicat连接该服务,像连接数据库那样正常连接即可
连接mycat.png

文章名: 《Mycat配置数据库的读写分离》

文章链接:https://www.isisy.com/1014.html

除特别注明外,文章均为深度博客所创,转载时请注明本文出处及文章链接
Last modification:February 20th, 2021 at 08:00 pm
如果觉得我的文章对你有用,请随意赞赏