Skip to content

Latest commit

 

History

History
486 lines (435 loc) · 14.9 KB

configuration.md

File metadata and controls

486 lines (435 loc) · 14.9 KB

配置说明

shazam配置由两部分组成,本地配置为shazam-proxy直接使用的配置内容,一般不需要在运行时改变。shazam为多租户模式,每个租户称为一个namespace,namespace 的配置在运行时都可变,一般保存在etcd中。

本地配置说明

; 配置类型,目前支持file/etcd两种方式,file方式不支持热加载,但是可以快速体验功能
config_type=etcd

;file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录
file_config_path=./etc/file

;配置中心地址,目前只支持etcd
coordinator_addr=http://127.0.0.1:2379

;远程配置(当前为etcd)根目录
coordinator_root=/shazam

;配置中心用户名和密码
username=test
password=test

;环境划分、test、online
environ=test

;组和服务名称,为服务化做准备
group_name=systech

;service name
service_name=shazam_proxy

;日志配置
log_path=./logs
log_level=Notice
log_filename=shazam
log_output=file

;管理地址
admin_addr=0.0.0.0:13307
;basic auth
admin_user=admin
admin_password=admin

;代理服务监听地址
proto_type=tcp4
proxy_addr=0.0.0.0:13306

; 默认编码
proxy_charset=utf8

;慢sql阈值,单位: 毫秒
slow_sql_time=100

;空闲会话超时时间,单位: 秒
session_timeout=3600

;打点统计配置
stats_enabled=true
stats_backend_type=prometheus

namespace配置说明

namespace的配置格式为json,包含分表、非分表、实例等配置信息,都可在运行时改变。namespace的配置可以直接通过web平台进行操作,使用方不需要关心json里的内容,如果有兴趣参与到shazam的开发中,可以关注下字段含义,具体解释如下,格式为字段名称、类型、内容含义。

字段名称 字段类型 字段含义
name string namespace名称
online bool 是否在线,逻辑上下线使用
read_only bool 是否只读,namespace级别
allowed_dbs map 数据库集合
default_phy_dbs map 默认数据库名, 与allowed_dbs一一对应
slow_sql_time string 慢sql时间,单位ms
black_sql string数组 黑名单sql
allowed_ip string数组 白名单IP
slices map数组 一主多从的物理实例,slice里map的具体字段可参照slice配置
shard_rules map数组 分库、分表、特殊表的配置内容,具体字段可参照shard配置
users map数组 应用端连接shazam所需要的用户配置,具体字段可参照users配置

slice配置

字段名称 字段类型 字段含义
name string 分片名称,自动、有序生成
user_name string 连接后端mysql所需要的用户名称
password string 连接后端mysql所需要的用户密码
master string 主实例地址
slaves string数组 从实例地址列表
statistic_slaves string数组 统计型从实例地址列表
capacity int shazam_proxy与每个实例的连接池大小
max_capacity int shazam_proxy与每个实例的连接池最大大小
idle_timeout int shazam_proxy与后端mysql空闲连接存活时间,单位:秒

shard配置

这里列出了一些基本配置参数, 详细配置请参考分片表配置

字段名称 字段类型 字段含义
db string 分片表所在DB
table string 分片表名
type string 分片类型
key string 分片列名
locations list 每个slice上分布的分片个数
slices list slice列表
databases list mycat分片规则后端实际DB名

users配置

shazam是通过用户名+密码来唯一确定一个namespace的, 因此用户名+密码是全局唯一而非namespace唯一. 如果在多个namespace中配置了相同的用户名+密码, 系统将给出错误日志, 不保证该用户名+密码可以正常使用.

字段名称 字段类型 字段含义
user_name string 用户名
password string 用户密码
namespace string 对应的命名空间
rw_flag int 读写标识, 只读=1, 读写=2
rw_split int 是否读写分离, 非读写分离=0, 读写分离=1
other_property int 目前用来标识是否走统计从实例, 普通用户=0, 统计用户=1

配置示例

{
    "name": "shazam_namespace_1",
    "online": true,
    "read_only": true,
    "allowed_dbs": {
        "db_ks": true,
        "db_mycat": true
    },
    "default_phy_dbs": {
        "db_ks": "db_ks",
        "db_mycat": "db_mycat_0"
    },
    "slices": [
        {
            "name": "slice-0",
            "user_name": "root",
            "password": "root",
            "master": "127.0.0.1:3306",
            "capacity": 64,
            "max_capacity": 128,
            "idle_timeout": 3600
        },
        {
            "name": "slice-1",
            "user_name": "root",
            "password": "root",
            "master": "127.0.0.1:3307",
            "capacity": 64,
            "max_capacity": 128,
            "idle_timeout": 3600
        }
    ],
    "shard_rules": [
        {
            "db": "db_ks",
            "table": "tbl_ks",
            "type": "hash",
            "key": "id",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ]
        },
        {
            "db": "db_ks",
            "table": "tbl_ks_child",
            "type": "linked",
            "key": "id",
            "parent_table": "tbl_ks"
        },
        {
            "db": "db_ks",
            "table": "tbl_ks_global",
            "type": "global",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ]
        },
        {
            "db": "db_ks",
            "table": "tbl_ks_range",
            "type": "range",
            "key": "id",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "table_row_limit": 100
        },
        {
            "db": "db_ks",
            "table": "tbl_ks_year",
            "type": "date_year",
            "key": "create_time",
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "date_range": [
                "2014-2017",
                "2018-2019"
            ]
        },
        {
            "db": "db_ks",
            "table": "tbl_ks_month",
            "type": "date_month",
            "key": "create_time",
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "date_range": [
                "201405-201406",
                "201408-201409"
            ]
        },
        {
            "db": "db_ks",
            "table": "tbl_ks_day",
            "type": "date_day",
            "key": "create_time",
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "date_range": [
                "20140901-20140905",
                "20140907-20140908"
            ]
        },
        {
            "db": "db_mycat",
            "table": "tbl_mycat",
            "type": "mycat_mod",
            "key": "id",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "databases": [
                "db_mycat_[0-3]"
            ]
        },
        {
            "db": "db_mycat",
            "table": "tbl_mycat_child",
            "type": "linked",
            "parent_table": "tbl_mycat",
            "key": "id"
        },
        {
            "db": "db_mycat",
            "table": "tbl_mycat_murmur",
            "type": "mycat_murmur",
            "key": "id",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "databases": [
                "db_mycat_0",
                "db_mycat_1",
                "db_mycat_2",
                "db_mycat_3"
            ],
            "seed": "0",
            "virtual_bucket_times": "160"
        },
        {
            "db": "db_mycat",
            "table": "tbl_mycat_long",
            "type": "mycat_long",
            "key": "id",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "databases": [
                "db_mycat_[0-3]"
            ],
            "partition_count": "4",
            "partition_length": "256"
        },
        {
            "db": "db_mycat",
            "table": "tbl_mycat_global",
            "type": "global",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "databases": [
                "db_mycat_[0-3]"
            ]
        },
        {
            "db": "db_mycat",
            "table": "tbl_mycat_string",
            "type": "mycat_string",
            "key": "id",
            "locations": [
                2,
                2
            ],
            "slices": [
                "slice-0",
                "slice-1"
            ],
            "databases": [
                "db_mycat_[0-3]"
            ],
            "partition_count": "4",
            "partition_length": "256",
            "hash_slice": "20"
        }
    ],
    "global_sequences": [
        {
            "db": "db_mycat",
            "table": "tbl_mycat",
            "type": "test",
            "pk_name": "id"
        },
        {
            "db": "db_ks",
            "table": "tbl_ks",
            "type": "test",
            "pk_name": "user_id"
        }
    ],
    "users": [
        {
            "user_name": "test_shard",
            "password": "test_shard",
            "namespace": "shazam_namespace_1",
            "rw_flag": 2,
            "rw_split": 1
        }
    ],
    "default_slice": "slice-0"
}

本配置截取自proxy/plan/plan_test.go, 如果对shazam分表有困惑, 也可以参考这个包下的测试用例. 下面将结合该配置示例介绍shazam的namespace配置细节.

namespace名称为shazam_namespace_1. 在该namespace的users字段中添加一个shazam用户test_shard. 特别注意shazam中的用户名+密码是全局唯一的 (映射到唯一的namespace). 该用户是读写用户, 且使用读写分离.

在namespace中通过allowed_dbs字段配置了两个可用的数据库, 另一个相关的字段为default_phy_dbs, 该字段仅用于mycat分库路由的场景, 用于标记后端实际库名. 如果没有使用mycat路由, 则可以只配置allowed_dbs字段, 不配置default_phy_dbs字段.

通过slices字段配置后端的slice. 一个slice实际上对应着一组MySQL实例, 可以包含一主多从. slice的名称目前必须使用slice-0, slice-1这样的格式, 如果自定义slice名称会出现找不到默认slice的问题.

shard_rules字段中配置分片表信息. 按照shazam处理方式, 可以将分片表分为3类: kingshard路由模式的分片表, mycat路由模式的分片表, 全局表.

kingshard路由

kingshard路由模式下, 分片表要求后端数据库的库名相同, 子表的表名为table_后缀的模式.

{
    "db": "db_ks",
    "table": "tbl_ks",
    "type": "hash",
    "key": "id",
    "locations": [
        2,
        2
    ],
    "slices": [
        "slice-0",
        "slice-1"
    ]
}

以这个kingshard hash分片表配置为例, 路由规则为hash, 逻辑表名为tbl_ks, locations 2,2表示有两个slice, 每个slice上面分配两张子表, slices配置了两个slice的名称. 那么后端数据库的子表需要按照以下规则创建:

slice db table
slice-0 db_ks tbl_ks_0000
slice-0 db_ks tbl_ks_0001
slice-1 db_ks tbl_ks_0002
slice-1 db_ks tbl_ks_0003

其他kingshard路由的表名映射关系均类似, 再以range路由举例:

{
    "db": "db_ks",
    "table": "tbl_ks_month",
    "type": "date_month",
    "key": "create_time",
    "slices": [
        "slice-0",
        "slice-1"
    ],
    "date_range": [
        "201405-201406",
        "201408-201409"
    ]
}
slice db table
slice-0 db_ks tbl_ks_201405
slice-0 db_ks tbl_ks_201406
slice-1 db_ks tbl_ks_201408
slice-1 db_ks tbl_ks_201409

kingshard路由不需要配置databases字段, 因为后端数据库名与逻辑库名相同.

mycat路由

mycat路由与kingshard不完全相同, shazam主要兼容了mycat的分库路由模式.

{
    "db": "db_mycat",
    "table": "tbl_mycat_murmur",
    "type": "mycat_murmur",
    "key": "id",
    "locations": [
        2,
        2
    ],
    "slices": [
        "slice-0",
        "slice-1"
    ],
    "databases": [
        "db_mycat_0",
        "db_mycat_1",
        "db_mycat_2",
        "db_mycat_3"
    ],
    "seed": "0",
    "virtual_bucket_times": "160"
}
slice db table
slice-0 db_mycat_0 tbl_mycat_murmur
slice-0 db_mycat_1 tbl_mycat_murmur
slice-1 db_mycat_2 tbl_mycat_murmur
slice-1 db_mycat_3 tbl_mycat_murmur

其中databases字段需要按路由顺序指定后端数据库的实际库名, 且数量需要与locations的总和相等.

全局表路由

全局表路由与mycat路由配置类似, 但是可以不指定databases. 如果不指定, 则全局表在各个后端的数据库名和表名均相同.