简介

官网解释:

Sharding-Proxy是ShardingSphere的第二个产品。 它定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat等)操作数据,对DBA更加友好。

架构图
架构师之路(十)之玩转Sharding-Proxy插图
  • 向应用程序完全透明,可直接当做MySQL/PostgreSQL使用。
  • 适用于任何兼容MySQL/PostgreSQL协议的的客户端。
准备玩转

我们按照官网给的操作步骤,手动执行以下看看,Sharding-Proxy是怎么个流程,它是怎么充当数据库代理中间商的.

拉取官方的docker镜像

开始之前,需要将我们的基础实验环境搭建好,我们先启动一下虚拟机的docker服务,见如下图所示

架构师之路(十)之玩转Sharding-Proxy插图1

启动docker服务之后,我们就可以从官网拉取sharding-proxy的官方镜像文件,操作如下:

架构师之路(十)之玩转Sharding-Proxy插图2

docker拉取镜像速度有点慢,远程仓库地址是国外,大家也可以配置国内docker镜像或者配置国内镜像加速点,国内比较常用的镜像仓库比如网易云,阿里云,时速云等,这里就不赘述了,直接上国外镜像拉取,,不管怎样,只要能拉取下来就oK,最终拉取完效果如图所示:

架构师之路(十)之玩转Sharding-Proxy插图3

为了方便操作,特意建了一个文件夹,取名shardingProxy,里面放了用于数据库分片以及读写分离的配置文件,如下图所示

架构师之路(十)之玩转Sharding-Proxy插图4
架构师之路(十)之玩转Sharding-Proxy插图5

如上图所示,简单介绍一下:

1) 创建了两个数据源,ds0和ds1

2) 两个数据库中分别创建了两张表,t_order,t_item,并在这里分别设置了两张表的数据分片规则,其中t_order取user_id为分片键,来获取数据源策略,使用user_id对2取余,用来产生真实表,相当于:ds0.t_order0,ds0.t_order1,ds1.t_order0,ds1.t_order1,t_order_item分片规则跟t_order类似,不再赘述

3) bindingTables : 制定t_order与t_order_item是一对绑定表

运行docker容器

执行 docker run -d -v /opt/apps/docker/shardingProxy:/opt/sharding-proxy/conf  –env PORT=3308 -p13308:3308 docker.io/apache/sharding-proxy

得到如下图效果:

架构师之路(十)之玩转Sharding-Proxy插图6

表示sharding-proxy启动成功 ,但最终的效果是:sharding-proxy能启动成功,但却连不上,,这一下傻眼了,,,本来想放弃的,后来想想,还是接着写下去,跟大家一起交流一下,,到底是什么原因客户端连不上呢?我把整个执行过程都列了出来,请看效果分析章节.

效果分析

除了上述官网提供的方法启动sharding-proxy以外,我们还可以通过构造镜像的方式启动,这种方式需要兄弟们自行写一个Dockerfile脚本,通过脚本构建的方式,将sharding-proxy在docker容器中启动,其实跟上述效果一样,只不过道路不同,条条大路通罗马,我反正mysql,sharding都是跑在了docker容器中,下面就给大家介绍一下详细使用过程,

1) 构建mysql 镜像文件,如下是docker-compose.yml文件

version: “2”
services:
  mysql:
    build:
      context: .
    hostname: mysql
    restart: on-failure
    privileged: true
    volumes:
      – /opt/apps/docker/mysql/data:/var/lib/mysql
    environment:
      – MYSQL_ROOT_PASSWORD=root
    ports:
      – 3306:3306

2) 设置镜像文件:Dockerfile,贴脚本

#维护作者信息
FROM 127.0.0.1:5000/mysql
LABEL maintainer=”yuenbin@inspur.com”
#将所需文件拷贝到容器相应的目录下
COPY ./setup /docker-entrypoint-initdb.d 
COPY ./conf/mysqld.cnf  /etc/mysql/mysql.conf.d/mysqld.cnf

#设置时区
RUN apt-get install tzdata \
  && /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  && echo ‘Asia/Shanghai’ >/etc/timezone

在当前文件目录下,执行docker-compose up -d 启动mysql

架构师之路(十)之玩转Sharding-Proxy插图7

3) 构建sharding-proxy的docker-compose.yml,啥也不说,上脚本

version: “2”
services:
  sharding:
    build:
      context: .
    hostname: localhost
    restart: on-failure
    privileged: true
    volumes:
      – /opt/apps/docker/shardingProxy/logs:/opt/sharding-proxy/logs
    environment:
      – ‘JVM_OPTS=-Djava.awt.headless=true’
      – ‘PORT=3308’
    ports:
      – 13308:3308

对外向主机暴露13308端口

4) 构建docker镜像文件,啥也不说,上脚本

#维护作者信息
FROM docker.io/apache/sharding-proxy
LABEL maintainer=”yuenbin@inspur.com”
#将所需文件拷贝到容器相应的目录下
COPY  ./lib/*  /opt/sharding-proxy/lib/
COPY  ./conf/* /opt/sharding-proxy/conf/

同理,执行 docker-compose up -d 

架构师之路(十)之玩转Sharding-Proxy插图8

这个时候,我在本地windows10上,使用telnet 192.168.1.101 13308 测试,可以远程连接

架构师之路(十)之玩转Sharding-Proxy插图9

然后,这个时候兴冲冲的赶紧用DG工具远程连接sharding-proxy 却发现,怎么也连不上

架构师之路(十)之玩转Sharding-Proxy插图10

捣鼓了很长时间,,哎,,最终放弃了,希望各位兄弟们给个指点意见,不胜感激!