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`. 如果不指定, 则全局表在各个后端的数据库名和表名均相同.