目录
一、为什么需要中间件?
前面我们分析了现代数据库都是集群化架构,每一个客户端的读请求都会被负载均衡式的转发到底层不同的从节点数据库,从而提高性能。那么这个负载均衡转发工作是谁来做呢?其实就是数据库中间件这个软件层在帮我们完成这一切工作。
有了中间件后,程序开发人员不同在应用层手动分发请求,而是直接把中间件当做底层数据库操作,而中间件自动会按照算法分发到底层不同节点,极大程度上简化了程序员的工作。

优势:
- 零代码侵入:完全兼容 MySQL 协议,客户端连接 Proxy 和直连 MySQL 用法完全一致,业务不用改动;
- 统一管控集群:新增 / 删减从库只需要修改中间件配置,无需重启业务服务;
- 能力聚合:除读写分离外,原生支持分库分表、数据脱敏、分布式事务、SQL 审计;
- 解耦分层:业务只关心逻辑库,完全屏蔽底层一主多从、多分片物理数据库细节。
二、ShardingSphere在宿主机Ubuntu搭建
(1)ShardingSphere介绍及安装
ShardingSphere是当当网开源的中间件,后续被阿帕奇收入麾下成为他的顶流项目。它的优势在于使用手册广泛、社区活跃,可以很方便的帮助新手入门数据库中间件。
它的官网链接如下:阿帕奇碎片球
https://shardingsphere.apache.org/ ShardingSphere有JDBC版本和Proxy代理版本,其中JDBC只能用于JAVA的应用层编写,可能熟悉java的同学使用起来十分容易上手,但他始终没有和应用层完全解耦,如果想要修改中间件规则则需要直接修改代码,比较繁琐。而Proxy版本则是纯粹的中间件,他相当于一个完全独立的代理服务器,我们对于MySQL的访问会经过Proxy的代理转发,设计上天然与应用层更加解耦。所以我们本文将使用Proxy版本进行环境搭建。

由于他是一个国外的网站,访问起来可能比较慢,可使用下面的国内镜像源进行下载安装。
apache-shardingsphere安装包下载-开源镜像站-阿里云
https://mirrors.aliyun.com/apache/shardingsphere/
(2)安装JAVA17环境
cpp
#安装JAVA运行时环境,JRE
sudo apt-get update
sudo apt install openjdk-17-jre-headless

(3)下载JAVA驱动包
因为中间件本身是JAVA写的软件层,他仅仅是起到代理作用,在底层访问MySQL数据库的时候仍然需要用到MySQL官方提供给JAVA的驱动包,即java代码到SQL代码的转换层而已。
官网上也提供了下载链接,直接点击跳转即可。

(4)根据官方使用手册修改配置文件
下面可以看到一堆配置文件,每一个文件都对应某种配置操作。但目前我们只用关心红色的这三个,且本篇文章只涉及全局配置。
我们仿照官方提供的配置方案,改写成自己的配置即可:




(5)用Navicat测试中间件连通性
不过由于我们目前仅仅让代理服务器正常工作了,底层并没有配置到宿主机Ubuntu的MySQL,所以目前无法真正打开一个数据库,仅仅只能测试代理服务器的连通性。等后面我们学习读写分离的时候会把底层真正的数据库连通中间件。

三、在Docker中搭建
在这里由于我们是使用Docker启动的服务,所以首先需要把刚刚宿主机Ubuntu中的驱动包、配置文件等都拷贝过来。即mysql-connecter-j-8.0.11.jar放到/ext-lib目录下;global.yaml文件放到conf目录下。这一步取决于你刚刚宿主机的ShardingSphere是下载安装到哪里了。
cpp
docker run -d \
-p 3307:3307 \
-v /bit/shardingsphere/proxy/conf:/opt/shardingsphere-proxy/conf \
-v /bit/shardingsphere/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \
-v /bit/shardingsphere/proxy/logs:/opt/shardingsphere-proxy/logs \
-e JVM_OPTS="-Xms256m -Xmx256m -Xmn128m" \
--name ss-proxy \
apache/shardingsphere-proxy:5.5.3

这个问题是因为global.yaml还没有进行配置,这个中间件默认是集群模式的,但我们在global.yaml中并没有配置集群模式所需要的Zookeeper 注册中心。所以一启动就异常退出了。

于是我们需要修改为单机模式,在global.yaml中添加以下字段,重新启动即可:

这里如果无法直接用docker start ss-proxy启动,则首先尝试sudo docker rm ss-proxy删除原本错误崩溃的容器,再使用之前一长串的启动命令。


同样是因为没有配置底层数据库,所以无法正确打开。


