• 周五. 3月 1st, 2024

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

    root

    2月 21, 2021 #架构师之路

    简介

    官网解释:

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

    架构图

    • 向应用程序完全透明,可直接当做MySQL/PostgreSQL使用。
    • 适用于任何兼容MySQL/PostgreSQL协议的的客户端。

    准备玩转

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

    拉取官方的docker镜像

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

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

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

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

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

    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启动成功 ,但最终的效果是: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

    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 

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

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

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

    root