github.com/XiaoMi/Gaea@v1.2.5/docs/configuration.md (about) 1 # 配置说明 2 3 gaea配置由两部分组成,本地配置为gaea_proxy直接使用的配置内容,一般不需要在运行时改变。gaea为多租户模式,每个租户称为一个namespace,namespace 的配置在运行时都可变,一般保存在etcd中。 4 5 ## 本地配置说明 6 7 ```ini 8 ; 配置类型,目前支持file/etcd两种方式,file方式不支持热加载,但是可以快速体验功能 9 ; file 模式下读取file_config_path下的namespace配置文件 10 ; etcd 模式下读取coordinator_addr/cluster_name下的namespace配置文件 11 config_type=etcd 12 ;file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录 13 file_config_path=./etc/file 14 15 ;配置中心地址,目前只支持etcd 16 coordinator_addr=http://127.0.0.1:2379 17 ;配置中心用户名和密码 18 username=test 19 password=test 20 21 ;环境划分、test、online 22 environ=test 23 ;service name 24 service_name=gaea_proxy 25 ;gaea_proxy 当前proxy所属的集群名称 26 cluster_name=gaea_default_cluster 27 28 ;日志配置 29 log_path=./logs 30 log_level=Notice 31 log_filename=gaea 32 log_output=file 33 34 ;管理地址 35 admin_addr=0.0.0.0:13307 36 ;basic auth 37 admin_user=admin 38 admin_password=admin 39 40 ;代理服务监听地址 41 proto_type=tcp4 42 proxy_addr=0.0.0.0:13306 43 44 ; 默认编码 45 proxy_charset=utf8 46 ;慢sql阈值,单位: 毫秒 47 slow_sql_time=100 48 ;空闲会话超时时间,单位: 秒 49 session_timeout=3600 50 51 ;打点统计配置 52 stats_enabled=true 53 stats_interval=10 54 55 ;encrypt key, 用于对etcd中存储的namespace配置加解密 56 encrypt_key=1234abcd5678efg* 57 58 ;server_version 服务器版本号配置 59 server_version=5.6.20-gaea 60 61 ;auth plugin mysql_native_password or caching_sha2_password or '' 62 ;自定义认证插件,支持 5.x 和 8.x 版本认证,认证插件为 caching_sha2_password 时,不支持低版本客户端认证 63 ;auth_plugin=mysql_native_password 64 ``` 65 66 ## namespace配置说明 67 68 namespace的配置格式为json,包含分表、非分表、实例等配置信息,都可在运行时改变。namespace的配置可以直接通过web平台进行操作,使用方不需要关心json里的内容,如果有兴趣参与到gaea的开发中,可以关注下字段含义,具体解释如下,格式为字段名称、类型、内容含义。 69 70 | 字段名称 | 字段类型 | 字段含义 | 71 | --------------- | ---------- | ----------------------------------------------- | 72 | name | string | namespace名称 | 73 | online | bool | 是否在线,逻辑上下线使用 | 74 | read_only | bool | 是否只读,namespace级别 | 75 | allowed_dbs | map | 数据库集合 | 76 | default_phy_dbs | map | 默认数据库名, 与allowed_dbs一一对应 | 77 | slow_sql_time | string | 慢sql时间,单位ms | 78 | black_sql | string数组 | 黑名单sql | 79 | allowed_ip | string数组 | 白名单IP | 80 | slices | map数组 | 一主多从的物理实例,slice里map的具体字段可参照slice配置 | 81 | shard_rules | map数组 | 分库、分表、特殊表的配置内容,具体字段可参照shard配置 | 82 | users | map数组 | 应用端连接gaea所需要的用户配置,具体字段可参照users配置 | 83 | global_sequences| map | 生成全局唯一序列号的配置, 具体字段可参考全局序列号配置 | 84 | default_slice | string | show语句默认的执行分片 | 85 | open_general_log | bool | 是否开启审计日志, [如何开启](https://github.com/XiaoMi/Gaea/issues/109)| | 86 | max_sql_execute_time | int | 应用端查询最大执行时间, 超时后会被自动kill, 为0默认不开启此功能 | 87 | max_sql_result_size | int | gaea从后端mysql接收结果集的最大值, 限制单分片查询行数, 默认值10000, -1表示不开启| 88 89 ### slice配置 90 91 | 字段名称 | 字段类型 | 字段含义 | 92 | ---------------- | ---------- | ---------------------------------------------- | 93 | name | string | 分片名称,自动、有序生成 | 94 | user_name | string | 连接后端mysql所需要的用户名称 | 95 | password | string | 连接后端mysql所需要的用户密码 | 96 | master | string | 主实例地址 | 97 | slaves | string数组 | 从实例地址列表 | 98 | statistic_slaves | string数组 | 统计型从实例地址列表 | 99 | capacity | int | gaea_proxy与每个实例的连接池大小 | 100 | max_capacity | int | gaea_proxy与每个实例的连接池最大大小 | 101 | idle_timeout | int | gaea_proxy与后端mysql空闲连接存活时间,单位:秒 | 102 103 ### shard配置 104 105 这里列出了一些基本配置参数, 详细配置请参考[分片表配置](shard.md) 106 107 如需要了解每种规则详细库表对照示例,可以查看[分片规则示例说明](shard-example.md) 108 109 | 字段名称 | 字段类型 | 字段含义 | 110 | --------- | -------- | --------------------- | 111 | db | string | 分片表所在DB | 112 | table | string | 分片表名 | 113 | type | string | 分片类型 | 114 | key | string | 分片列名 | 115 | locations | list | 每个slice上分布的分片个数 | 116 | slices | list | slice列表 | 117 | databases | list | mycat分片规则后端实际DB名 | 118 119 ### users配置 120 121 | 字段名称 | 字段类型 | 字段含义 | 122 | -------------- | -------- | -------------------------------------- | 123 | user_name | string | 用户名 | 124 | password | string | 用户密码 | 125 | namespace | string | 对应的命名空间 | 126 | rw_flag | int | 读写标识, 只读=1, 读写=2 | 127 | rw_split | int | 是否读写分离, 非读写分离=0, 读写分离=1 | 128 | other_property | int | 目前用来标识是否走统计从实例, 普通用户=0, 统计用户=1 | 129 130 ### 全局序列号配置 131 132 | 字段名称 | 字段类型 | 字段含义 | 133 | -------------- | -------- | -----------------------------------------------| 134 | db | string | 使用全局序列号的表所在的db的逻辑db名 | 135 | table | string | 使用全局序列号的表的逻辑表名 | 136 | type | string | 目前只支持mycat方式 | 137 | pk_name | string | 使用全局序列号的列名,单表只允许一个列使用全局序列号 | 138 | slice_name | string | mycat_sequence表所在分片 | 139 140 141 ## 配置示例 142 143 ``` 144 { 145 "name": "gaea_namespace_1", 146 "online": true, 147 "read_only": true, 148 "allowed_dbs": { 149 "db_ks": true, 150 "db_mycat": true 151 }, 152 "default_phy_dbs": { 153 "db_ks": "db_ks", 154 "db_mycat": "db_mycat_0" 155 }, 156 "slow_sql_time": "1000", 157 "black_sql": [ 158 "" 159 ], 160 "allowed_ip": null, 161 "slices": [ 162 { 163 "name": "slice-0", 164 "user_name": "root", 165 "password": "root", 166 "master": "127.0.0.1:3306", 167 "capacity": 64, 168 "max_capacity": 128, 169 "idle_timeout": 3600 170 }, 171 { 172 "name": "slice-1", 173 "user_name": "root", 174 "password": "root", 175 "master": "127.0.0.1:3307", 176 "capacity": 64, 177 "max_capacity": 128, 178 "idle_timeout": 3600 179 } 180 ], 181 "shard_rules": [ 182 { 183 "db": "db_ks", 184 "table": "tbl_ks", 185 "type": "hash", 186 "key": "id", 187 "locations": [ 188 2, 189 2 190 ], 191 "slices": [ 192 "slice-0", 193 "slice-1" 194 ] 195 }, 196 { 197 "db": "db_ks", 198 "table": "tbl_ks_child", 199 "type": "linked", 200 "key": "id", 201 "parent_table": "tbl_ks" 202 }, 203 { 204 "db": "db_ks", 205 "table": "tbl_ks_global", 206 "type": "global", 207 "locations": [ 208 2, 209 2 210 ], 211 "slices": [ 212 "slice-0", 213 "slice-1" 214 ] 215 }, 216 { 217 "db": "db_ks", 218 "table": "tbl_ks_range", 219 "type": "range", 220 "key": "id", 221 "locations": [ 222 2, 223 2 224 ], 225 "slices": [ 226 "slice-0", 227 "slice-1" 228 ], 229 "table_row_limit": 100 230 }, 231 { 232 "db": "db_ks", 233 "table": "tbl_ks_year", 234 "type": "date_year", 235 "key": "create_time", 236 "slices": [ 237 "slice-0", 238 "slice-1" 239 ], 240 "date_range": [ 241 "2014-2017", 242 "2018-2019" 243 ] 244 }, 245 { 246 "db": "db_ks", 247 "table": "tbl_ks_month", 248 "type": "date_month", 249 "key": "create_time", 250 "slices": [ 251 "slice-0", 252 "slice-1" 253 ], 254 "date_range": [ 255 "201405-201406", 256 "201408-201409" 257 ] 258 }, 259 { 260 "db": "db_ks", 261 "table": "tbl_ks_day", 262 "type": "date_day", 263 "key": "create_time", 264 "slices": [ 265 "slice-0", 266 "slice-1" 267 ], 268 "date_range": [ 269 "20140901-20140905", 270 "20140907-20140908" 271 ] 272 }, 273 { 274 "db": "db_mycat", 275 "table": "tbl_mycat", 276 "type": "mycat_mod", 277 "key": "id", 278 "locations": [ 279 2, 280 2 281 ], 282 "slices": [ 283 "slice-0", 284 "slice-1" 285 ], 286 "databases": [ 287 "db_mycat_[0-3]" 288 ] 289 }, 290 { 291 "db": "db_mycat", 292 "table": "tbl_mycat_child", 293 "type": "linked", 294 "parent_table": "tbl_mycat", 295 "key": "id" 296 }, 297 { 298 "db": "db_mycat", 299 "table": "tbl_mycat_murmur", 300 "type": "mycat_murmur", 301 "key": "id", 302 "locations": [ 303 2, 304 2 305 ], 306 "slices": [ 307 "slice-0", 308 "slice-1" 309 ], 310 "databases": [ 311 "db_mycat_0", 312 "db_mycat_1", 313 "db_mycat_2", 314 "db_mycat_3" 315 ], 316 "seed": "0", 317 "virtual_bucket_times": "160" 318 }, 319 { 320 "db": "db_mycat", 321 "table": "tbl_mycat_long", 322 "type": "mycat_long", 323 "key": "id", 324 "locations": [ 325 2, 326 2 327 ], 328 "slices": [ 329 "slice-0", 330 "slice-1" 331 ], 332 "databases": [ 333 "db_mycat_[0-3]" 334 ], 335 "partition_count": "4", 336 "partition_length": "256" 337 }, 338 { 339 "db": "db_mycat", 340 "table": "tbl_mycat_global", 341 "type": "global", 342 "locations": [ 343 2, 344 2 345 ], 346 "slices": [ 347 "slice-0", 348 "slice-1" 349 ], 350 "databases": [ 351 "db_mycat_[0-3]" 352 ] 353 }, 354 { 355 "db": "db_mycat", 356 "table": "tbl_mycat_string", 357 "type": "mycat_string", 358 "key": "id", 359 "locations": [ 360 2, 361 2 362 ], 363 "slices": [ 364 "slice-0", 365 "slice-1" 366 ], 367 "databases": [ 368 "db_mycat_[0-3]" 369 ], 370 "partition_count": "4", 371 "partition_length": "256", 372 "hash_slice": "20" 373 } 374 ], 375 "global_sequences": [ 376 { 377 "db": "db_mycat", 378 "table": "tbl_mycat", 379 "type": "test", 380 "pk_name": "id" 381 }, 382 { 383 "db": "db_ks", 384 "table": "tbl_ks", 385 "type": "test", 386 "pk_name": "user_id" 387 } 388 ], 389 "users": [ 390 { 391 "user_name": "test_shard", 392 "password": "test_shard", 393 "namespace": "gaea_namespace_1", 394 "rw_flag": 2, 395 "rw_split": 1 396 } 397 ], 398 "default_slice": "slice-0", 399 "open_general_log": false, 400 "max_sql_execute_time": 5000, 401 "max_sql_result_size": 10 402 } 403 ``` 404 405 本配置截取自proxy/plan/plan_test.go, 如果对Gaea分表有困惑, 也可以参考这个包下的测试用例. 下面将结合该配置示例介绍Gaea的namespace配置细节. 406 407 namespace名称为`gaea_namespace_1`. 在该namespace的`users`字段中添加一个gaea用户`test_shard`. 特别注意Gaea中的`用户名+密码`是全局唯一的 (映射到唯一的namespace). 该用户是读写用户, 且使用读写分离. 408 409 在namespace中通过`allowed_dbs`字段配置了两个可用的数据库, 另一个相关的字段为`default_phy_dbs`, 该字段仅用于mycat分库路由的场景, 用于标记后端实际库名. 如果没有使用mycat路由, 则可以只配置`allowed_dbs`字段, 不配置`default_phy_dbs`字段. 410 411 通过`slices`字段配置后端的slice. 一个slice实际上对应着一组MySQL实例, 可以包含一主多从. slice的名称目前必须使用`slice-0`, `slice-1`这样的格式, 如果自定义slice名称会出现找不到默认slice的问题. 412 413 在`shard_rules`字段中配置分片表信息. 按照Gaea处理方式, 可以将分片表分为3类: kingshard路由模式的分片表, mycat路由模式的分片表, 全局表. 414 415 ### kingshard路由 416 417 kingshard路由模式下, 分片表要求后端数据库的库名相同, 子表的表名为`table_后缀`的模式. 418 419 ``` 420 { 421 "db": "db_ks", 422 "table": "tbl_ks", 423 "type": "hash", 424 "key": "id", 425 "locations": [ 426 2, 427 2 428 ], 429 "slices": [ 430 "slice-0", 431 "slice-1" 432 ] 433 } 434 ``` 435 436 以这个kingshard hash分片表配置为例, 路由规则为hash, 逻辑表名为tbl_ks, locations 2,2表示有两个slice, 每个slice上面分配两张子表, `slices`配置了两个slice的名称. 那么后端数据库的子表需要按照以下规则创建: 437 438 | slice | db | table | 439 |:---:|:---:|:---:| 440 | slice-0 | db_ks | tbl_ks_0000 | 441 | slice-0 | db_ks | tbl_ks_0001 | 442 | slice-1 | db_ks | tbl_ks_0002 | 443 | slice-1 | db_ks | tbl_ks_0003 | 444 445 其他kingshard路由的表名映射关系均类似, 再以range路由举例: 446 447 ``` 448 { 449 "db": "db_ks", 450 "table": "tbl_ks_month", 451 "type": "date_month", 452 "key": "create_time", 453 "slices": [ 454 "slice-0", 455 "slice-1" 456 ], 457 "date_range": [ 458 "201405-201406", 459 "201408-201409" 460 ] 461 } 462 ``` 463 464 | slice | db | table | 465 |:---:|:---:|:---:| 466 | slice-0 | db_ks | tbl_ks_201405 | 467 | slice-0 | db_ks | tbl_ks_201406 | 468 | slice-1 | db_ks | tbl_ks_201408 | 469 | slice-1 | db_ks | tbl_ks_201409 | 470 471 kingshard路由不需要配置`databases`字段, 因为后端数据库名与逻辑库名相同. 472 473 ### mycat路由 474 475 mycat路由与kingshard不完全相同, Gaea主要兼容了mycat的分库路由模式. 476 477 ``` 478 { 479 "db": "db_mycat", 480 "table": "tbl_mycat_murmur", 481 "type": "mycat_murmur", 482 "key": "id", 483 "locations": [ 484 2, 485 2 486 ], 487 "slices": [ 488 "slice-0", 489 "slice-1" 490 ], 491 "databases": [ 492 "db_mycat_0", 493 "db_mycat_1", 494 "db_mycat_2", 495 "db_mycat_3" 496 ], 497 "seed": "0", 498 "virtual_bucket_times": "160" 499 } 500 ``` 501 502 | slice | db | table | 503 |:---:|:---:|:---:| 504 | slice-0 | db_mycat_0 | tbl_mycat_murmur | 505 | slice-0 | db_mycat_1 | tbl_mycat_murmur | 506 | slice-1 | db_mycat_2 | tbl_mycat_murmur | 507 | slice-1 | db_mycat_3 | tbl_mycat_murmur | 508 509 其中`databases`字段需要按路由顺序指定后端数据库的实际库名, 且数量需要与`locations`的总和相等. 510 511 ### 全局表路由 512 513 全局表路由与mycat路由配置类似, 但是可以不指定`databases`. 如果不指定, 则全局表在各个后端的数据库名和表名均相同.