暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

ShardingSphere-proxy 搭配 MogDB/openGauss 实现读写分离

介绍

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

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

ShardingSphere-Proxy 对系统库/表(如 information_schema、pg_catalog)支持有限,通过部分图形化数据库客户端连接 Proxy 时,可能客户端或 Proxy 会有错误提示。可以使用命令行客户端(mysql、psql、gsql 等)连接 Proxy 验证功能。

image.png

image.png

安装部署

本次安装部署是在centos 7.9上完成,采用PTK一键安装部署MogDB数据库,结合ZK集群,按生产数据库使用方式(cluster模式)做的部署验证。

由于MogDB来源于社区版的openGauss数据库,所以也适用ShardingSphere-proxy + openGauss

环境准备

数据库准备

--创建用户、数据库
create user ssp password 'sspMogdb@123';
create database ssp owner ssp;

--需要配置白名单,允许proxy所在机器访问数据库,配置pg_hba.conf文件
--本次proxy部署在集群内节点,PTK已经配置了白名单,所以不做单独部署

下载解压proxy

--下载地址
https://shardingsphere.apache.org/document/current/en/downloads/

--解压
tar -zxvf apache-shardingsphere-5.1.2-shardingsphere-proxy-bin.tar.gz

ln -s apache-shardingsphere-5.1.2-shardingsphere-proxy-bin /opt/ssp

配置文件

配置是 ShardingSphere-Proxy 中唯一与开发者交互的模块,通过它可以快速清晰的理解 ShardingSphere-Proxy 所提供的功能。

ShardingSphere-Proxy 提供基于 YAML 的配置方式,并使用 DistSQL 进行交互。 通过配置,应用开发者可以灵活的使用数据分片、读写分离、数据加密、影子库等功能,并且能够叠加使用。

server.yaml文件

该配置文件的主要作用是配置前端的认证数据库、用户名和密码, 以及连接相关的属性:包括分布式事务类型、sql日志等

mode:
  type: Cluster
  repository:
    type: ZooKeeper
    props:
      namespace: governance_ds
      server-lists: 192.168.122.157:2181,192.168.122.221:2181,192.168.122.68:2181
      retryIntervalMilliseconds: 500
      timeToLiveSeconds: 60
      maxRetries: 3
      operationTimeoutMilliseconds: 500
  overwrite: false
rules:
  - !AUTHORITY
    users:
      - root@%:root
      - sharding@:sharding
    provider:
      type: ALL_PERMITTED ### 5.1.2版本
      # type: ALL_PRIVILEGES_PERMITTED ### 5.1.1版本

props:
  max-connections-size-per-query: 1
  proxy-hint-enabled: false
  sql-show: false
  check-table-metadata-enabled: false
  show-process-list-enabled: false
  proxy-backend-query-fetch-size: -1
  check-duplicate-table-enabled: false

读写分离

读写分离有两种策略:静态策略和动态策略
如果要配置静态读写分离,只需要参考下面示例配置config-readwrite-splitting.yaml 文件即可

### 后台数据库访问方式
databaseName: readwrite_splitting_db ### 5.1.2版本
dataSources:
  ds_0:
    url: jdbc:postgresql://192.168.122.221:26000/ssp
    username: ssp
    password: sspMogdb@123
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_1:
    url: jdbc:postgresql://192.168.122.157:26000/ssp
    username: ssp
    password: sspMogdb@123
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_2:
    url: jdbc:postgresql://192.168.122.68:26000/ssp
    username: ssp
    password: sspMogdb@123
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1

### 静态策略
rules:
- !READWRITE_SPLITTING
  dataSources:
    readwrite_ds:
      type: Static
      props:
        write-data-source-name: ds_2
        read-data-source-names: ds_1,ds_0
      loadBalancerName: random
  loadBalancers:
    random:
      type: RANDOM

高可用

  • 高可用目前只支持cluster模式
  • 动态读写分离规则依赖于数据库发现规则,所以把动态读写分离和高可用放到一起

如果要配置动态读写分离,只需要参考下面示例配置config-database-discovery.yaml 文件即可

databaseName: database_discovery_db ### 5.1.2版本
dataSources:
  ds_0:
    url: jdbc:postgresql://192.168.122.221:26000/ssp
    username: ssp
    password: sspMogdb@123
    connectionTimeoutMilliseconds: 3000
    idleTimeoutMilliseconds: 6000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_1:
    url: jdbc:postgresql://192.168.122.157:26000/ssp
    username: ssp
    password: sspMogdb@123
    connectionTimeoutMilliseconds: 3000
    idleTimeoutMilliseconds: 6000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  ds_2:
    url: jdbc:postgresql://192.168.122.68:26000/ssp
    username: ssp
    password: sspMogdb@123
    connectionTimeoutMilliseconds: 3000
    idleTimeoutMilliseconds: 6000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1

rules:
- !DB_DISCOVERY
  dataSources:
    readwrite_ds:
      dataSourceNames:
        - ds_0
        - ds_1
        - ds_2
      discoveryHeartbeatName: opengauss-heartbeat
      discoveryTypeName: MogDB
  discoveryHeartbeats:
    opengauss-heartbeat:
      props:
        keep-alive-cron: '0/5 * * * * ?'
  discoveryTypes:
    MogDB:
      # type: opengauss ### 5.1.1版本
      type: openGauss.NORMAL_REPLICATION ### 5.1.2版本
      props:
        group-name: 92504d5b-6dec-11e8-91ea-246e9612aaf1

- !READWRITE_SPLITTING
  dataSources:
    readwrite_ds:
      type: Dynamic
      props:
        auto-aware-data-source-name: readwrite_ds
        write-data-source-query-enabled: true
      loadBalancerName: random
  loadBalancers:
    random:
      type: RANDOM

启停 proxy

--启动
[root@node1 ssp]# bin/start.sh
we find java version: java11, full_version=11.0.15
Starting the ShardingSphere-Proxy ...
The classpath is /opt/ssp/conf:.:/opt/ssp/lib/*:/opt/ssp/ext-lib/*
Please check the STDOUT file: /opt/ssp/logs/stdout.log

--停止
[root@node1 ssp]# bin/stop.sh
Stopping the ShardingSphere-Proxy ....OK!
PID: 24425

动态读写分离展示

查看数据库集群的的状态,当前ds_2(192.168.122.68) 是主库,其他两个节点是从库
image.png

通过ssp 做插入及查询测试
image.png

通过ssp日志可以看到,插入sql在ds_2上执行,查询sql在ds_1上执行,说明做了读写分离
image.png

在ds_2做数据库关闭操作,这时CM会自动选ds_0做新主
image.png

在ssp继续做数据查询和插入
image.png

ssp日志中可以看到pending的报错,这个是cm在切换过程中数据库dn节点的状态,然后就是数据已经在ds_0上做了插入,而查询是由ds_2完成
image.png

备库负载均衡采用轮询策略

企业微信截图_576bfd96721b446985fa931a8372eaa3.png

修改配置文件,并重启ssp
image.png

通过ssp进行查询操作
企业微信截图_38dc8aeb86a3437684de0d99a0f92544.png

观察ssp的日志,发现查询操作在备库之间轮询,说明策略有效
企业微信截图_b7555a6a5e774687a28a1cc2d2785b9f.png

问题汇总

问题1:
Caused by: org.postgresql.util.PSQLException: Invalid or unsupported by client SCRAM mechanisms

处理方式: pg_hba.conf 改成md5的认证方式

问题2:
SPI-00001: No implementation class load from SPI `org.apache.shardingsphere.dbdiscovery.spi.DatabaseDiscoveryProviderAlgorithm` with type `opengauss`.

处理方式:5.1.2版本的type 值有变化,改成了openGauss.NORMAL_REPLICATION
最后修改时间:2022-08-11 22:44:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论