| 版本 | 负责人 | 备注说明 |
|---|---|---|
| v1.0 | Kevin.xu | |
密级: 公开
文档说明场景说明基于docker-compose快速搭建shardingSphereProxyMysql主从读写分离。
环境准备mysql 数据量级增大后,需要对mysql 进行主从复制。降低单服务器IO负载。但由于业务逻辑已经很多,从API层面去实现,需要进行代码重构,为了简化,使用sharding-sphere-proxy 进行主从读写分离的代理。此处暂时未进行分库分表操作。但shardingsphere 可支持分库分表操作.
Centos8
Docker version 19.03.13, build 4484c46d9d
docker-compose: 1.29.2
docker-compose 搭建mysql主从 完成
mysql主从复制参考
配置说明[root@ibeeServer shardingSphere]# tree
.
├── docker-compose.yml
└── sharding_proxy
├── Dockerfile
└── mysql-connector-java-8.0.27.jar2 directories, 3 files
docker-compose.yml
version: '3'
services:
sharding_proxy:
environment:
TZ: "Asia/Shanghai" #设置时区
build:
context: ./sharding_proxy/ #构建目录
container_name: sharding_proxy #容器名称
ports:
- "6306:3307" #对外端口映射
networks:
- shardingSphere
volumes:
- "/data/dockerData/config/shardingProxyConfig/conf:/opt/shardingsphere-proxy/conf" #Shardingsphere config文件挂载
- "/data/dockerData/shardingProxy/logs:/opt/shardingsphere-proxy/logs" #Sharding日志文件
restart: always
networks:
shardingSphere:
driver: bridge
ShardingProxy 配置及说明
目录结构
mysql-connector-java-8.0.27.jar 来源及说明[root@ibeeServer sharding_proxy]# tree
.
├── Dockerfile
└── mysql-connector-java-8.0.27.jar0 directories, 2 files
下载MySQL驱动依赖
5版本:
https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar
8版本:
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar
其他版本:
https://repo1.maven.org/maven2/mysql/mysql-connector-java/
具体下哪个版本呢?
在mysql 连接完后使用select version() 来确认mysql 的版本,后找对应的mysql-connector 驱动
Dockerfile 说明FROM apache/sharding-proxy:latest #使用最新版本的镜像 COPY mysql-connector-java-8.0.27.jar /opt/shardingsphere-proxy/ext-lib/ #拷贝mysql连接依赖包(sharding 使用JDBC 的连接驱动) CMD ["start.sh"] #启动服务config文件说明
读写分离只使用server.yaml config-readwrite-splitting.yaml 两个配置文件。
[root@ibeeServer conf]# tree . ├── config-database-discovery.yaml #动态数据库接入配置 ├── config-encrypt.yaml #加密及连接授权配置 ├── config-readwrite-splitting.yaml #读写分离配置 ├── config-shadow.yaml #影子库配置 ├── config-sharding.yaml #表分片配置 ├── logback.xml #日志相关配置(路径) └── server.yaml #Sharding-Proxy的一些基础配置,比如:账号、密码、注册中心等。 0 directories, 7 filesserver.yaml 说明
server 主要配置外部连接shardingProxy的用户名和密码
rules:
- !AUTHORITY
users:
# 用于登录计算节点的用户名,授权主机和密码的组合。格式:@:,hostname 为 % 或空字符串表示不限制授权主机
- root@%:qwer1234
- test@:123456
provider:
# 存储节点数据授权的权限提供者类型
type: NATIVE
#NATIVE 基于后端数据库(主表)存取 server.yaml 中配置的权限信息。如果用户不存在,则自动创建用户并默认赋予最高权限。(启动时会连接数据库节点)
#ALL_PRIVILEGES_PERMITTED 默认授予所有权限(不鉴权),不会与实际数据库交互。
#SCHEMA_PRIVILEGES_PERMITTED 通过属性 user-schema-mappings 配置的权限。
props:
max-connections-size-per-query: 1
executor-size: 16 # Infinite by default.
proxy-frontend-flush-threshold: 128 # The default value is 128.
# LOCAL: Proxy will run with LOCAL transaction.
# XA: Proxy will run with XA transaction.
# base: Proxy will run with B.A.S.E transaction.
proxy-transaction-type: LOCAL
xa-transaction-manager-type: Atomikos #数据库XA实现算法
proxy-opentracing-enabled: false
proxy-hint-enabled: false
sql-show: false
check-table-metadata-enabled: false
lock-wait-timeout-milliseconds: 50000 # The maximum time to wait for a lock
config-readwrite-splitting.yaml 说明
config-readwrite-splitting.yaml 配置逻辑数据库与真实数据库的读写分离关联关系
schemaName: test_db
dataSources:
write_ds:
#配置写库(Master)的地址
url: jdbc:mysql://192.168.147.133:4306/test_db?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
username: root #数据库连接密码,如果使用 NATIVE 需要使用访问数据库的root 及密码。此处需要查询mysql.user 表
password: qwer1234
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50 #连接池最大值
minPoolSize: 1 #连接池最小值
maintenanceIntervalMilliseconds: 30000
read_ds_0:
#配置写库(Salver)的地址
url: jdbc:mysql://192.168.147.133:5306/test_db?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
username: root #数据库连接密码,如果使用 NATIVE 需要使用访问数据库的root 及密码。此处需要查询mysql.user 表
password: qwer1234
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50 #连接池最大值
minPoolSize: 1 #连接池最小值
maintenanceIntervalMilliseconds: 30000
rules: #规则配置
- !READWRITE_SPLITTING
dataSources:
pr_ds:
writeDataSourceName: write_ds
readDataSourceNames:
- read_ds_0
验证测试:
使用mysql 命令进行连接主库与从库。
Proxy连接参数为:
host:xxx.xxx.x.x
port: 6306
user: root
passwd: qwer1234
step1. 在主机Proxy 中对数据操作
step2. 查看mysql 的Master 节点与Slaver 节点上的数据变化
FAQ:- Server configuration file server.yaml is invalid.
2.Cannot determine value type from string ‘Y’原因:
容器内 /opt/shardingsphere-proxy/conf 的server.yaml 没有进行配置。
解决:
新建/data/dockerData/config/shardingProxyConfig/conf
将如上修改的server.yaml 放入/data/dockerData/config/shardingProxyConfig/conf
并进行容器数据卷挂载
重新进行构建
3.SELECT command denied to user ‘test’@‘172.23.0.1’ for table ‘user’原因:server.yaml 版本与docker 使用的版本未对齐
解决:
/data/dockerData/config/shardingProxyConfig/conf 来源于docker 容器
可使用docker cp xxx: /opt/shardingsphere-proxy/conf /data/dockerData/config/shardingProxyConfig/
并对要修改的yaml 进行修改
重新进行构建
4.sharding proxy no database selected(navicat/dbeaver等)原因:
#NATIVE 基于后端数据库(主表)存取 server.yaml 中配置的权限信息。如果用户不存在,则自动创建用户并默认赋予最高权限。(启动时会连接数据库节点)
解决:使用带有root 权限(能访问mysql.user 表)的帐户和密码给config-readwrite-splitting.yaml 连接数据库使用
5.pymsql migrate 时sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1999, ‘Unknown exception: [SQL checking failed. Error message: .]’)原因:
sharding proxy 对可视化工具的支持不够完善
解决:
建议使用mysql 命令进行操作
原因:暂时未查明



