ShardingSphereproxy 搭配 MogDB/openGauss 动态读写分离

2023年 12月 26日 102.7k 0

原作者: 高云龙

  • 介绍
  • 安装部署
    • 环境准备
    • 数据库准备
    • 下载解压proxy
    • 配置文件
    • 启停 proxy
  • 动态读写分离展示
  • 问题汇总

介绍

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 验证功能。

安装部署

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

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

环境准备

  • must have Java JRE 8 or higher
  • MogDB 安装部署完成,且运行状态正常
  • zookeeper 集群部署完成,且运行状态正常

数据库准备

--创建用户、数据库
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

读写分离

读写分离有两种策略:静态策略和动态策略

### 后台数据库访问方式
databaseName: readwrite_splitting_db
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

高可用

动态读写分离规则依赖于数据库发现规则,所以把动态读写分离和高可用放到一起,动态读写分离的条件是数据库主库故障关机,可以触发数据库切换,且不影响业务使用,如果使用switchover是无法触发自动切换的。目前发现有个问题:
1、5.1.2的版本支持MogDB还需要完善(已反馈内核),本次用5.1.1版本展示

databaseName: database_discovery_db
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
type: openGauss.NORMAL_REPLICATION
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) 是主库,其他两个节点是从库

通过ssp 做插入及查询测试

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

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

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

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

问题汇总

问题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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论