基本的原理是让主数据库处理事务性增、改、删操作(INSERT、 UPDATE、DELETE),而从数据库处理 SELECT 查询操作。数据库复制被用来把事务性操 作导致的变更同步到集群中的从数据库。如果程序使用数据库较多、更新较少、查询较多的 情况下会考虑使用读写分离的功能。因为数据库的“写”(写 100,00 条数据到 MySQL 可能 要 3 分钟)操作比较耗时,但是数据库的“读”(从 MySQL 读 100,00 条数据可能只要 5 秒钟)却比较快速。所以读写分离可以解决数据库写入时影响查询效率的问题。
读写分离的实现方法有很多,今天我们用到的是Mycat
通过 Mycat 来实现读写分离:使用 Mycat 提供的读写分离功能,连接多个数据库, 数据源只需要连接 Mycat。对于开发人员而言,它还是连接了一个数据库(实际是数据库的 Mycat 中间件),而且也不需要根据不同业务来选择不同的库,这样就不会有多余的代码产 生。
介绍Mycat
随着互联网的发展,数据的量级也是呈指数级增长,从 GB 到 TB 到 PB。对数据的各 种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这 个时候 NoSQL 的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持, 减少对复杂查询的支持,来获取性能上的提升。但是,在有些时候 NoSQL 是无法满足使用 场景的,比如绝对要有事务与安全指标的场景。这个时候还是需要使用关系型数据库。如何 使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能, 将一个数据库的数据分散到不同的数据库中存储,为应对此问题就出现了 Mycat。Mycat 是 目前最流行的基于 Java 语言编写的开源数据库中间件,是一个实现了 MySQL 协议的服务 3 器,核心功能是分库分表。配合数据库的主从模式还可以实现读写分离功能。Mycat 是结合 传统数据库和新型分布式数据仓库的新一代企业级数据库产品,能够满足数据库数据的大量 存储,并提高了查询性能。
上图所示
Mycat 使用 MySQL 的通讯协议模拟成了一个 MySQL 服务器,并建立 了完整的 Schema(数据库)、Table (数据表)、User(用户)的逻辑模型,并将这套逻辑 模型映射到后端的存储节点 DataNode(MySQL Instance)上的真实物理库中,这样一来, 所有能使用 MySQL 的客户端以及编程语言都能将 Mycat 当成是 MySQL Server 来使用,不 必开发新的客户端协议。
基础准备
IP | 主机名 | 节点 |
192.168.200.10 | mysql1 | 群 |
192.168.200.20 | mysql2 | 群 |
192.168.200.30 | mycat | 主 |
1.三台集群服务器配置hosts(主机 IP映射)
vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.10 mysql1
192.168.200.20 mysql2
192.168.200.30 mycat
2.数据库集群需要安装 MariaDB 数据库服务,需要给集群虚拟机配置 Yum 安装源文件, 使用提供的 gpmall-repo 文件上传至 mycat 虚拟机的/opt 目录下,设置本地 Yum 源。
mkdir /opt/centos
mount /dev/cdrom /opt/centos/
mv /etc/yum.repos.d/* /media/
vi /etc/yum.repos.d/local.repo
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
[mariadb]
name=mariadb
baseurl=file:///opt/gpmall-repo
gpgcheck=0
enabled=1
4.Mycat是由java开发,所以还要安装JDK环境(部署 Mycat 中间件服务需要先部署 JDK 1.7 或以上版本的 JDK 软件环境,这里部署 JDK 1.8 版本。)
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
5.关闭防火墙(改变规则)
iptables -F
iptables -X
iptables -Z
iptables-save #保存防火墙规则
二.部署Mycat读写分离中间件服务
1.安装Mycat服务(二进制软件包)
将二进制软件包上传到/root目录,并解压到/usr/local,最后赋予解压后的Mycat目录权限
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C
/usr/local
chmod -R 777 /usr/local/mycat/
在系统变量文件中添加Mycat的系统变量,并使其生效。
echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
source /etc/profile
2.编辑Mycat的逻辑库编辑文件
配置 Mycat 服务读写分离的 schema.xml 配置文件在/usr/local/mycat/conf/目录下,可以 在文件中定义一个逻辑库,使用户可以通过 Mycat 服务管理该逻辑库对应的 MariaDB 数据 库。在这里定义一个逻辑库 schema,name 为 USERDB;该逻辑库 USERDB 对应数据库 database 为 test(在部署主从数据库时已安装);设置数据库写入节点为主节点 mysql1;设 置数据库读取节点为从节点 mysql2。
vi /usr/local/mycat/conf/schema.xml
注意:IP 需要修改成实际的 IP 地址。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
8
<schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100"
dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql"
dbDriver="native" writeType="0" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.200.10:3306" user="root"
password="000000">
<readHost host="hostS1" url="192.168.200.20:3306" user="root"
password="000000" />
</writeHost>
</dataHost>
</mycat:schema>
代码说明:
⚫ sqlMaxLimit:配置默认查询数量。
⚫ database:为真实数据库名。
⚫ 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 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 版本没有。
⚫ writeType="0":所有写操作发送到配置的第一个 writeHost,第一个挂了需要切换到 还 生存 的第二 个 writeHost, 重新 启动后 已切换 后的 为准, 切换 记录 在配 置文 件 dnindex.properties 中。
⚫ writeType="1":所有写操作都随机的发送到配置的 writeHost
3.修改配置文件的权限
chown root:root /usr/local/mycat/conf/schema.xml
4.编辑mycat的访问用户
修改/usr/local/mycat/conf/目录下的 server.xml 文件,修改 root 用户的访问密码与数据库, 密码设置为 000000,访问 Mycat 的逻辑库为 USERDB,
vi /usr/local/mycat/conf/server.xml
在配置文件的最后添加:
<user name="root">
<property name="password">000000</property>
<property name="schemas">USERDB</property>
然后删除这几行:
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
第一个root的配置也需要删除,因为你配置了一个root,不允许两个root用户存在的,添加的那段配置要写在</mycat:server>里面。
最后保存退出
5. 最后启动Mycat服务
/bin/bash /usr/local/mycat/bin/mycat start
9066与8066端口出现,启动成功。
三.验证数据库集群服务读写分离功能
1用 Mycat 服务查询数据库信息
yum install -y MariaDB-client
2.在 Mycat 虚拟机上使用 mysql 命令查看 Mycat 服务的逻辑库 USERDB,因为 Mycat 的 10 逻辑库 USERDB 对应数据库 test(在部署主从数据库时已安装),所以可以查看库中已经 创建的表 company。
mysql -h127.0.0.1 -P8066 -uroot -p000000
show databases;
use USERDB #更改数据库
show tables;
select * from company;
3.用Mycat服务添加表数据(Mycat节点)
在 Mycat 虚拟机上使用 mysql 命令对表 company 添加一条数据(2,"basketball","usa"),添 加完毕后查看表信息。
insert into company values(2,"bastetball","usa");
select * from company;
(3)验证 Mycat 服务对数据库读写操作分离
在 Mycat 虚拟机节点使用 mysql 命令,通过 9066 端口查询对数据库读写操作的分离信 息。可以看到所有的写入操作 WRITE_LOAD 数都在 mysql1 主数据库节点上,所有的读取 操作 READ_LOAD 数都在 mysql2 主数据库节点上。由此可见,数据库读写操作已经分离到 mysql1 和 mysql2 节点上了。
mysql -h127.0.0.1 -P9066 -uroot -p000000 -e 'show @@datasource;'
Mycat的读写分离完成。