Docker 安装 ShardingSphere-Proxy

大纲

前言

本文将介绍如何通过 Docker 安装 ShardingSphere-Proxy。

安装方式

目前 ShardingSphere-Proxy 官方提供了三种安装方式:

  • Docker
  • Helm(K8s)
  • 二进制发布包

安装步骤

step1:在宿主机中创建目录

  • 在宿主机中创建以下目录,后续 Docker 挂载数据卷时会使用到
1
2
3
4
5
6
7
8
# 创建 ShardingSphere-Proxy 的日志目录
mkdir -p /data/server/proxy/logs

# 创建 ShardingSphere-Proxy 的配置文件目录
mkdir -p /data/server/proxy/conf

# 创建 ShardingSphere-Proxy 的扩展包(比如 MySQL 驱动)目录
mkdir -p /data/server/proxy/ext-lib

step2:在宿主机中下载 MySQL 驱动

1
2
# 下载 MySQL 驱动
wget -P /data/server/proxy/ext-lib https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.22/mysql-connector-java-8.0.22.jar

spte3:在宿主机中创建 ShardingSphere-Proxy 配置文件

  • 在宿主机中创建 ShardingSphere-Proxy 的服务器配置文件(完整的配置示例,可以从 ShardingSphere 官网 下载 ShardingSphere-Proxy 的二进制包,然后参考解压后得到的 conf/server.yamlconf/config-xxx.yaml 配置文件)
1
2
# 创建 ShardingSphere-Proxy 的服务器配置文件,添加以下配置内容
vim /data/server/proxy/conf/server.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rules:
# 权限与认证规则
- !AUTHORITY
users:
# 定义 ShardingSphere-Proxy 登录用户
# 格式:用户名@允许访问的主机:密码
- root@%:root
provider:
# 权限提供者类型
# ALL_PRIVILEGES_PERMITTED 表示不做权限校验,拥有所有权限(开发/测试常用)
type: ALL_PRIVILEGES_PERMITTED

props:
# 是否在日志中打印逻辑 SQL 和实际执行 SQL
# true:开启(便于调试)
# false:关闭(生产环境建议关闭)
sql-show: true

配置文件说明

  • ShardingSphere-Proxy 有两种类型的配置文件,包括:
  • server.yaml:ShardingSphere-Proxy 的服务器配置,用于配置注册中心、认证信息以及公用属性等,必须挂载配置文件的路径到 Docker 容器内的 /opt/shardingsphere-proxy/conf 目录。
  • config-xxx.yaml:ShardingSphere-Proxy 的分配规则配置,要求以 config- 作为配置文件的前缀命名,必须挂载配置文件的路径到 Docker 容器内的 /opt/shardingsphere-proxy/conf 目录。

step4:启动 ShardingSphere-Proxy 容器

1
2
3
4
5
6
7
8
9
# 创建并启动 ShardingSphere-Proxy 容器(Docker 会自动在宿主机上创建不存在的目录)
docker run -d \
-v /data/server/proxy/conf:/opt/shardingsphere-proxy/conf \
-v /data/server/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \
-v /data/server/proxy/logs:/opt/shardingsphere-proxy/logs \
-p 3307:3307 \
--name server-proxy \
--restart always \
apache/shardingsphere-proxy:5.1.1
  • 或者通过环境变量 -e PORT 自定义端口(3308 表示 ShardingSphere-Proxy 端口,13308 表示宿主机端口)
1
2
3
4
5
6
7
8
9
10
# 创建并启动 ShardingSphere-Proxy 容器(Docker 会自动在宿主机上创建不存在的目录)
docker run -d \
-v /data/server/proxy/conf:/opt/shardingsphere-proxy/conf \
-v /data/server/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \
-v /data/server/proxy/logs:/opt/shardingsphere-proxy/logs \
-e PORT=3308 \
-p 13308:3308 \
--name server-proxy \
--restart always \
apache/shardingsphere-proxy:5.1.1

step5:远程连接 ShardingSphere-Proxy

  • ShardingSphere-Proxy 容器中默认情况下没有安装 mysql 命令行客户端,因此需要远程访问
1
mysql -h192.168.2.191 -P3307 -uroot -p

step6:测试访问 ShardingSphere-Proxy

1
show databases;

  • ShardingSphere-Proxy 在启动时就内置了 MySQL 系统 Schema 元数据(包含以下四个库):
Schema 作用
information_schemaSQL 元数据查询
performance_schema兼容性能相关 SQL
sysMySQL 系统视图
mysql用户 / 权限 / 系统表
  • 即使 ShardingSphere-Proxy 未配置任何真实 MySQL 数据源,通过 show databases; 仍然会看到 information_schemaperformance_schemasysmysql 这 4 个库,是因为它们是 ShardingSphere-Proxy 内置的虚拟系统库。这些库的存在仅用于兼容 MySQL 协议和客户端行为,并不表示 ShardingSphere-Proxy 已经连接了真实的 MySQL 实例。
  • MySQL 客户端、JDBC 驱动以及 ORM 框架在连接 MySQL 后,都会自动执行如 show databases;select database();select @@sql_mode;select * from information_schema.tables; 相关查询。如果这些系统库不存在或返回异常,客户端和驱动将无法正常工作,导致 JDBC 报错、ORM 启动失败、交互体验极差。
  • 因此,ShardingSphere-Proxy 必须在启动时提供这些虚拟系统库来保证对 MySQL 生态的透明兼容;ShardingSphere-Proxy 只有在配置了数据源并定义了逻辑库(Schema)之后,才会在 show databases 中看到真正的业务库。

注意事项

  • ShardingSphere-Proxy 使用 conf/server.yaml 配置注册中心、认证信息以及公用属性等。
  • ShardingSphere-Proxy 支持多逻辑数据源,每个以 config- 前缀命名的 YAML 配置文件(比如 config-xxx.yaml),即为一个逻辑数据源。
  • ShardingSphere-Proxy 默认使用 3307 端口,Docker 容器可以通过环境变量 -e PORT=3308 指定自定义的端口。
  • ShardingSphere-Proxy 默认集成了 ZooKeeper Curator 客户端,生产环境中必须配置并使用 ZooKeeper(或 Etcd)来持久化 ShardingSphere-Proxy 的元数据,即生产环境必须使用集群模式(Cluster Mode)
  • ShardingSphere-Proxy 默认以内存模式(Memory Mode)启动。在该模式下,初始化配置或执行 SQL 导致的元数据变更只在当前进程内生效,不会持久化到磁盘或注册中心,适合开发、调试和功能测试,无需手动清理运行痕迹。

常见问题

远程连接失败

Docker 容器可以成功的创建并启动,但是 MySQL 客户端无法远程连接 ShardingSphere-Proxy。排除防火墙和网络等问题后,建议排查是不是因为 Docker 容器内存不足导致。

  • 进入 Docker 容器内部,然后查看 ShardingSphere-Proxy 的日志,如果有 cannot allocate memory 这样的错误日志信息(如下图所示),则说明容器内存不足
1
2
3
4
5
# 进入容器内,其中环境变量 "env LANG=C.UTF-8" 用于避免容器内显示中文乱码的问题
docker exec -it server-proxy env LANG=C.UTF-8 /bin/bash

# 查看日志信息
tail /opt/shardingsphere-proxy/logs/stdout.log

  • 解决方案:创建 ShardingSphere-Proxy 容器的时候,使用 JVM_OPTS 环境变量指定堆内存的大小
1
2
3
4
5
6
7
8
9
docker run -d \
-v /data/server/proxy/conf:/opt/shardingsphere-proxy/conf \
-v /data/server/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \
-v /data/server/proxy/logs:/opt/shardingsphere-proxy/logs \
-e JVM_OPTS="-Xmx2g -Xms2g -Xmn1g" \
-p 3307:3307 \
--name server-proxy \
--restart always \
apache/shardingsphere-proxy:5.1.1