简介
读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。主数据库进行写操作后,数据及时同步到所读的数据库,尽可能保证读、写数据库的数据一致。此处的读写分离采用的是Mycat。
Mycat 的原理中最重要的一个词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了 一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库, 并将返回的结果做适当的处理,最终再返回给用户。
下面是博主用于配置的主从及读写分离的机器:
节点 | 系统 | 环境 | IP | MySQL主从关系 | MySQL读 OR 写 |
---|---|---|---|---|---|
node3 | CentOS 7 | LNMP、JDK8 | 192.168.17.130 | 主 | 写 |
node4 | CentOS 7 | LNMP | 192.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 |
sqlMaxLimit | select 时默认的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
相关命令使用,后面的任一命令皆可控制
说明 | 命令 |
---|---|
启动 Mycat | mycat 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连接该服务,像连接数据库那样正常连接即可