读写分离的数据库集群

基本的原理是让主数据库处理事务性增、改、删操作(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的读写分离完成。

猜你喜欢

转载自blog.csdn.net/m0_74090215/article/details/131023148