环境

  • 在192.168.10.134服务器(shardingproxy)上部署的ShardingSphere-Proxy代理192.168.10.132服务器和192.168.10.133服务器;
  • 之前在192.168.10.132服务器(node1-shardingsphere)和192.168.10.133服务器(node2-shardingsphere)配置的MySQL读写分离一主一从架构;
  • 同步的是数据库test;

配置示例

config-readwrite-splitting.yaml

#schemaName用来指定->逻辑表名
schemaName: readwrite_splitting_db

dataSources:
  write_ds:
    url: jdbc:mysql://192.168.10.132:3306/test?serverTimezone=UTC&useSSL=false&characterEncoding=utf-8
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
  read_ds_0:
    url: jdbc:mysql://192.168.10.133:3306/test?serverTimezone=UTC&useSSL=false&characterEncoding=utf-8
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1
    
rules:
- !READWRITE_SPLITTING
  dataSources:
    readwrite_ds:
      staticStrategy:
        writeDataSourceName: write_ds
        readDataSourceNames:
          - read_ds_0

在 ShardingSphere 的配置中,schemaName 通常用来指定逻辑数据库名,即在 ShardingSphere 管理下的虚拟数据库名。这个逻辑数据库名与实际物理数据库名(如 test)并不相同,它是 ShardingSphere 中用来组织逻辑表、数据源映射、规则应用的一个抽象概念。应用程序通过连接到这个逻辑数据库名来与 ShardingSphere 交互,由 ShardingSphere 根据配置的规则进行内部的数据源路由、分片、读写分离等操作。

对于您提供的配置示例,schemaName: readwrite_splitting_db 表示您创建了一个名为 readwrite_splitting_db 的逻辑数据库。这个逻辑数据库包含了读写分离规则,使得应用程序在访问 readwrite_splitting_db 时,写操作会被路由到 write_ds 数据源,读操作会被路由到 read_ds_0 数据源。

至于您提到的 schemaName 是否可以是实际数据库名 test,答案是可以,但这样做通常不符合 ShardingSphere 的设计理念和最佳实践。原因如下:

  1. 逻辑隔离:使用与实际数据库名不同的 schemaName 可以实现逻辑上的隔离。这样,即使物理数据库名发生变更,应用程序连接的逻辑数据库名保持不变,无需修改应用代码。同时,逻辑数据库名也能更好地反映其在 ShardingSphere 管理下的特殊角色,比如在您的案例中,readwrite_splitting_db 明确表示这是一个用于读写分离的逻辑数据库。
  2. 避免混淆:直接使用实际数据库名作为 schemaName 可能导致混淆,特别是当您有多个物理数据库且它们在 ShardingSphere 中有不同的角色(如分片、读写分离等)时。使用不同的逻辑数据库名有助于清晰地区分不同功能的逻辑数据库。
  3. 扩展性:随着业务发展,可能需要对数据库进行更复杂的分片、多租户等操作,这时逻辑数据库名作为 ShardingSphere 管理的入口,具有良好的扩展性。如果一开始就使用实际数据库名,后续调整可能会带来不必要的麻烦。

综上所述,虽然理论上可以将 schemaName 设置为实际数据库名 test,但为了保持逻辑隔离、避免混淆并考虑到未来的扩展性,建议使用与物理数据库名不同的逻辑名称,如您配置中的 readwrite_splitting_db。这样可以更好地利用 ShardingSphere 提供的抽象层,实现对数据库操作的灵活管理和控制。