Skip to content

Latest commit

 

History

History
549 lines (494 loc) · 24.4 KB

configuration.md

File metadata and controls

549 lines (494 loc) · 24.4 KB

配置说明

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

本地配置说明

; 配置类型,目前支持file/etcd两种方式,file方式不支持热加载,但是可以快速体验功能
; file 模式下读取file_config_path下的namespace配置文件
; etcd 模式下读取coordinator_addr/cluster_name下的namespace配置文件
config_type=etcd
;file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录
file_config_path=./etc/file

;配置中心地址,目前只支持etcd
coordinator_addr=http://127.0.0.1:2379
;配置中心用户名和密码
username=test
password=test

;环境划分、test、online
environ=test 
;service name
service_name=gaea_proxy
;gaea_proxy 当前proxy所属的集群名称
cluster_name=gaea_default_cluster

;日志配置
log_path=./logs
log_level=Notice
log_filename=gaea
log_output=file
; 日志保留天数,默认为3天(所有日志)
log_keep_days=3
; 日志保留数量,默认为 72 个(所有归档的日志)),与 log_keep_days 取最小值
log_keep_counts=72

;管理地址
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_interval=10 

;encrypt key, 用于对etcd中存储的namespace配置加解密
encrypt_key=1234abcd5678efg*

;server_version 服务器版本号配置
server_version=5.6.20-gaea

;num_cpu gaea服务占用的CPU核数,默认4核
num_cpu=4

;net_buffer_size 一次读取和写入数据的大小,默认 128
net_buffer_size=128

;auth plugin mysql_native_password or caching_sha2_password or ''
;自定义认证插件,支持 5.x 和 8.x 版本认证,认证插件为 caching_sha2_password 时,不支持低版本客户端认证
;auth_plugin=mysql_native_password

namespace配置说明

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

字段名称 字段类型 字段含义
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数组 应用端连接gaea所需要的用户配置,具体字段可参照users配置
global_sequences map 生成全局唯一序列号的配置, 具体字段可参考全局序列号配置
default_slice string show语句默认的执行分片
open_general_log bool (已废弃) 是否开启审计日志, 如何开启
max_sql_execute_time int 应用端查询最大执行时间, 超时后会被自动kill, 为0默认不开启此功能
max_sql_result_size int gaea从后端mysql接收结果集的最大值, 限制单分片查询行数, 默认值10000, -1表示不开启
down_after_no_alive int 探测MySQL服务offline超过该时间后标记mysql为下线
seconds_behind_master uint64 MySQL slave延迟超过该值将slave标记为down, 默认值为0,即无限大
check_select_lock bool 是否检查 select ... for update or select ... in share mode 语句,当设置为true时,会优先将语句发给主库(需要配置的权限支持)。 默认值为true, 则默认发到主库。
local_slave_read_priority int 优先访问本机房从库配置,设置为 0 时,关闭该功能;设置为 1 时,优先访问本机房从库,当无本机房从库或本机房从库均宕机时,会跨机房访问从库;当设置为 2 时,会强制访问本机房从库,当本机房无从库时,会访问主库。默认值为 0,当无法获取实例的 datacenter 时,会默认与 Prox 相同
support_multi_query bool 是否支持多语句,默认为 false,即不支持
local_slave_read_priority int 优先访问本机房从库配置,设置为 0 时,关闭该功能;设置为 1 时,优先访问本机房从库,当无本机房从库或本机房从库均宕机时,会跨机房访问从库;当设置为 2 时,会强制访问本机房从库,当本机房无从库时,会访问主库。默认值为 0,当无法获取实例的 datacenter 时,会默认与 Proxy 相同
support_multi_query bool 是否支持多语句,默认为 false,即不支持
set_for_keep_session bool 是否开启业务连接会话保持功能,开启后 Gaea 客户端连接与后端 MySQL 连接一对一绑定。默认为 false,即不开启
client_qps_limit uint32 客户端 qps 限制,默认为 0,即不开启
support_limit_transaction bool 客户端限流是否限制事务,默认为 false,即不限制
allowed_session_variables map 动态配置数据库会话变量,通过配置该参数,从而实现业务侧对数据库会话变量的动态配置。 注意:该参数仅支持在 gaea 2.4.0 及以上版本使用。

slice配置

字段名称 字段类型 字段含义
name string 分片名称,自动、有序生成
user_name string 连接后端mysql所需要的用户名称
password string 连接后端mysql所需要的用户密码
master string 主实例地址
slaves string数组 从实例地址列表
statistic_slaves string数组 统计型从实例地址列表
capacity int gaea_proxy与每个实例的连接池大小
max_capacity int gaea_proxy与每个实例的连接池最大大小
idle_timeout int gaea_proxy与后端mysql空闲连接存活时间,单位:秒
capability int 自定义gaea_proxy与MySQL连接时capability, 注意: 除非你十分清楚这个值的意义,否则不要设置此值。 如果此值未设或者设置为0,gaea将使用默认值41477; 如果要支持multi query, 可将此值设置成500357, 更具体请参看MySQL文档
max_client_connections int 该namespace最大的前端连接数,超过该值则拒绝连接。 0(默认值)或者小于0代表无限制
init_connect string 自定义gaea_proxy与MySQL连接时初始执行的SQL,默认为空,执行的SQL以;分割,如设置sql_mode、session变量等。 注意: 除非你确认业务上确实有此依赖,且无法在业务侧调整,否则请不要设置此值。

shard配置

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

如需要了解每种规则详细库表对照示例,可以查看分片规则示例说明

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

users配置

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

全局序列号配置

字段名称 字段类型 字段含义
db string 使用全局序列号的表所在的db的逻辑db名
table string 使用全局序列号的表的逻辑表名
type string 目前只支持mycat方式
pk_name string 使用全局序列号的列名,单表只允许一个列使用全局序列号
slice_name string mycat_sequence表所在分片,必须配置,不能留空
max_limit int64 在 namespace 层面限制当前表全局自增 ID 最大值,超过该值写入会失败,默认为 0 则无限制

配置示例

{
    "name": "gaea_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"
    },
    "slow_sql_time": "1000",
    "black_sql": [
        ""
    ],
    "allowed_ip": null,
    "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": "gaea_namespace_1",
            "rw_flag": 2,
            "rw_split": 1
        }
    ],
    "default_slice": "slice-0",
    "open_general_log": false,
    "max_sql_execute_time": 5000,
    "max_sql_result_size": 10,
    "down_after_no_alive": 32,
    "seconds_behind_master": 0,
    "check_select_lock": true,
    "allowed_session_variables": {
        "transaction_isolation": "string",
        "max_execution_time": "int",
        "unique_checks": "bool"
    }
}

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

namespace名称为gaea_namespace_1. 在该namespace的users字段中添加一个gaea用户test_shard. 特别注意Gaea中的用户名+密码是全局唯一的 (映射到唯一的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字段中配置分片表信息. 按照Gaea处理方式, 可以将分片表分为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不完全相同, Gaea主要兼容了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. 如果不指定, 则全局表在各个后端的数据库名和表名均相同.