github.com/XiaoMi/Gaea@v1.2.5/models/connection.md (about)

     1  # Gaea 数据库中间件连线说明
     2  
     3  > - 整个 Gaea 设定值读取和写入的逻辑由 Gaea/models/store.go 进行处理
     4  > - 这份文档主要在说明 如何在设定文档上,设定对数据库中间件 Gaea 连线相关设定值后,立即进行连线
     5  >   目前支援的设定方式
     6  >   1. 文档 File
     7  >   2. 网路 Etcd V2 API
     8  >   3. 网路 Etcd V3 API
     9  >
    10  
    11  ## 1 测试环境说明
    12  
    13  ###  1 测试环境架构
    14  
    15  丛集名称为 gaea_cluster,内含两个数据库 Cluster
    16  
    17  1. 数据库丛集一 Cluster1,1台 Master 和 2 台 Slave,数据库名称为 novel ,数据表为 Book_0000
    18  2. 数据库丛集二 Cluster2,1台 Master 和 2 台 Slave,数据库名称为 novel ,数据表为 Book_0001
    19  
    20  以下为架构图
    21  
    22  <img src="./assets/image-20220127114256168.png" alt="image-20220127114256168" style="zoom:80%;" /> 
    23  
    24  ### 2 测试环境的数据库 Schema
    25  
    26  表名不管是 Book_0000 或者是 Book_0001,都使用相同的 Schema
    27  
    28  ```sql
    29  -- 创建数据表 Book_0000
    30  CREATE TABLE `novel`.`Book_0000` (
    31    `BookID` int(11) NOT NULL,
    32    `Isbn` bigint(50) NOT NULL,
    33    `Title` varchar(100) NOT NULL,
    34    `Author` varchar(30) DEFAULT NULL,
    35    `Publish` int(4) DEFAULT NULL,
    36    `Category` varchar(30) NOT NULL,
    37    PRIMARY KEY (`BookID`)
    38  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    39  
    40  -- 创建数据表 Book_0001
    41  CREATE TABLE `novel`.`Book_0001` (
    42    `BookID` int(11) NOT NULL,
    43    `Isbn` bigint(50) NOT NULL,
    44    `Title` varchar(100) NOT NULL,
    45    `Author` varchar(30) DEFAULT NULL,
    46    `Publish` int(4) DEFAULT NULL,
    47    `Category` varchar(30) NOT NULL,
    48    PRIMARY KEY (`BookID`)
    49  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    50  ```
    51  
    52  ## 2 设定值的内容
    53  
    54  > 不管是要把设定值储存在文档还是在网路内,设定值会参考以下内容进行设定
    55  
    56  ### 1 丛集名称设定内容
    57  
    58  | 名称项目           | 设定值                  | 说明                                   |
    59  | ------------------ | ----------------------- | -------------------------------------- |
    60  | 丛集名称 Cluster   | gaea_cluster            | 一个 Cluster 可以包含多个 Namespace    |
    61  | 命名空间 Namespace | novel_cluster_namespace | 属于丛集 gaea_cluster 内的一个命名空间 |
    62  
    63  ### 2 数据库集群设定内容
    64  
    65  | 数据库集群编号 |    Mater 服务器    |   Slave 服务器一   |   Slave 服务器二   |  帐号  | 密码  |
    66  | :------------: | :----------------: | :----------------: | :----------------: | :----: | :---: |
    67  |  数据库集群1   | 192.168.122.2:3309 | 192.168.122.2:3310 | 192.168.122.2:3311 | xiaomi | 12345 |
    68  |  数据库集群2   | 192.168.122.2:3312 | 192.168.122.2:3313 | 192.168.122.2:3314 | xiaomi | 12345 |
    69  
    70  ### 3 切片设定值内容
    71  
    72  | 数据库集群编号 | 对应的切片名称 | 数据表名称 | 是否预设 |
    73  | :------------: | :------------: | :--------: | :------: |
    74  |  数据库集群1   |    slice-0     | Book_0000  |    是    |
    75  |  数据库集群2   |    slice-1     | Book_0001  |    否    |
    76  
    77  ### 4 分片演算法设定值
    78  
    79  | 演算法设定项目 | 演算法设定值          | 说明                                                         |
    80  | -------------- | --------------------- | ------------------------------------------------------------ |
    81  | 用户名称       | hash                  | Kingshard Hash 分片演算法                                    |
    82  | 分表依据的键值 | BookID                | 会以 BookID 的数值作为分表的依据                             |
    83  | 数据表数量     | [1,1]                 | 阵列 [1,1] 分别指出每一个切片的数据表数量,比如<br />slice-0 有 1 张 数据表,<br />slice-1 有 1 张 数据表 |
    84  | 切片列表阵列   | ["slice-0","slice-1"] | 此命名空间里,有两个切片,分别为 slice-0 和 slice-1          |
    85  
    86  ### 5 命名空间操作用户设定值
    87  
    88  | 用户设定项目 | 用户设定值                              | 说明                                                         |
    89  | ------------ | --------------------------------------- | ------------------------------------------------------------ |
    90  | 用户名称     | xiaomi                                  |                                                              |
    91  | 用户密码     | 12345                                   |                                                              |
    92  | 命名空间名称 | novel_cluster_namespace                 |                                                              |
    93  | 用户读写标记 | rw_flag 为 2 ,该用户可进行 读写 操作   | rw_flag 为 1,只能进行 唯读 操作<br />rw_flag 为 2,可进行 读写 操作 |
    94  | 读写分离标记 | rw_split 为 1,该用户进行 读写分离 操作 | rw_split 为 0,进行 非读写分离 操作<br />rw_split 为 1,进行 读写分离 操作 |
    95  
    96  ### 6 命名空间 JSON 格式设定值
    97  
    98  命名空间 JSON 格式设定值 内容如下,这份设定值可以储存在 设定文档 里或 网路 中,设定值都一模一样
    99  
   100  ```json
   101  {
   102    "name": "novel_cluster_namespace",
   103    "online": true,
   104    "read_only": false,
   105    "allowed_dbs": {
   106      "novel": true
   107    },
   108    "slow_sql_time": "1000",
   109    "black_sql": [
   110      ""
   111    ],
   112    "allowed_ip": null,
   113    "slices": [
   114      {
   115        "name": "slice-0",
   116        "user_name": "xiaomi",
   117        "password": "12345",
   118        "master": "192.168.122.2:3309",
   119        "slaves": ["192.168.122.2:3310", "192.168.122.2:3311"],
   120        "statistic_slaves": null,
   121        "capacity": 12,
   122        "max_capacity": 24,
   123        "idle_timeout": 60
   124      },
   125  	{
   126        "name": "slice-1",
   127        "user_name": "xiaomi",
   128        "password": "12345",
   129        "master": "192.168.122.2:3312",
   130        "slaves": ["192.168.122.2:3313", "192.168.122.2:3314"],
   131        "statistic_slaves": null,
   132        "capacity": 12,
   133        "max_capacity": 24,
   134        "idle_timeout": 60
   135      }
   136    ],
   137    "shard_rules": [
   138  	{
   139        "db": "novel",
   140        "table": "Book",
   141        "type": "hash",
   142        "key": "BookID",
   143        "locations": [
   144          1,
   145          1
   146        ],
   147        "slices": [
   148          "slice-0",
   149          "slice-1"
   150        ]
   151      }
   152    ],
   153    "users": [
   154      {
   155        "user_name": "xiaomi",
   156        "password": "12345",
   157        "namespace": "novel_cluster_namespace",
   158        "rw_flag": 2,
   159        "rw_split": 1,
   160        "other_property": 0
   161      }
   162    ],
   163    "default_slice": "slice-0",
   164    "global_sequences": null
   165  }
   166  ```
   167  
   168  ## 3 命名空间设定值储存方式
   169  
   170  > 目前支援设定档的读取方式为,整个逻辑由 Gaea/models/store.go 控制
   171  >
   172  > 1. 方法一:使用文档 File 去储存设定值
   173  > 2. 方法二:使用网路 Etcd V2 API 去储存设定值
   174  > 3. 方法三:使用网路 Etcd V3 API 去储存设定值
   175  
   176  ### 1 使用文档 File 储存
   177  
   178  > 当准备使用文档 File 去储存设定值时,需要修改改两个设定文档
   179  >
   180  > 1. 初始化设定文档,位于 Gaea/etc/gaea.ini
   181  > 2. 命名空间设定文档,集中于目录 Gaea/etc/file/namespace/
   182  
   183  修正初始化设定文档 Gaea/etc/gaea.ini,指定以下内容
   184  
   185  1. 使用设定文档 File 去储存设定值
   186  2. 丛集名称为 gaea_cluster
   187  
   188  把设定文档 Gaea/etc/gaea.ini 修正成以下内容
   189  
   190  ```ini
   191  ; 这里的重点在把 config_type 值改成 file,并修改丛集名称!!!!!
   192  
   193  ; config type, etcd/file, you can test gaea with file type, you shoud use etcd in production
   194  config_type=file
   195  ; file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录
   196  file_config_path=./etc/file
   197  
   198  ; 在这里指定丛集名称为 gaea_cluster
   199  cluster_name=gaea_cluster
   200  
   201  ; 以下略过,因为重点要把前面的 config_type 设定值改成 file
   202  ```
   203  
   204  - 在目录 Gaea/etc/file/namespace 下新增一个命名空间设定档,档名为 novel_cluster_namespace.json,内容为 小说数据库丛集 的相关设定
   205  
   206  - 在命名空间设定文档内 novel_cluster_namespace.json 内指定命名空间名称为 novel_cluster_namespace
   207  
   208  把设定文档 Gaea/etc/file/namespace/novel_cluster_namespace.json 填入 命名空间 Json 格式设定值,如以下内容所示
   209  
   210  ```json
   211  {
   212    "name": "novel_cluster_namespace",
   213    "online": true,
   214    "read_only": false,
   215    "allowed_dbs": {
   216      "novel": true
   217    },
   218    "slow_sql_time": "1000",
   219    "black_sql": [
   220      ""
   221    ],
   222    "allowed_ip": null,
   223    "slices": [
   224  以下略
   225  ```
   226  
   227  ### 2 使用网路 Etcd 储存
   228  
   229  > 这次直接用 Gui 工具把设定值写入 Etcd 容器
   230  
   231  修正初始化设定文档 Gaea/etc/gaea.ini,指定以下内容
   232  
   233  1. 使用 Etcd 服务器去储存设定值
   234  2. 丛集名称为 gaea_cluster
   235  3. 指定 Etcd 的网路位置为 http://127.0.0.1:2379
   236  
   237  把设定文档 Gaea/etc/gaea.ini 修正成以下内容
   238  
   239  ```ini
   240  ; 这里的重点在把 config_type 值改成 file,并修改丛集名称!!!!!
   241  
   242  ; config type, etcd/file/etcdv3, you can test gaea with file type, you shoud use etcd/etcdv3 in production
   243  ; 请指定设定方式为 file 或 etcd 或 etcdv3
   244  config_type=etcdv3
   245  ; file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录
   246  file_config_path=./etc/file
   247  
   248  ; 在这里指定丛集名称为 gaea_cluster
   249  cluster_name=gaea_cluster
   250  
   251  ; 在这里指定 Etcd 服务器的网路位置
   252  coordinator_addr=http://127.0.0.1:2379
   253  
   254  ; 以下略过,因为重点要把前面的 config_type 设定值改成 file
   255  ```
   256  
   257  在 Etcd 服务器内写入以下内容
   258  
   259  - key 为 /gaea_cluster/namespace/novel_cluster_namespace
   260  - value 为 之前提到的命名空间 Json 格式设定值
   261  
   262  <img src="./assets/image-20220124113553383.png" alt="image-20220124113553383" style="zoom:80%;" /> 
   263  
   264  ## 4 启动数据库中间件 Gaea
   265  
   266  > 启动的方式有分两种
   267  >
   268  > 1. 在终端机去下指令启动 Gaea
   269  > 2. 使用 IDE 工具启动 Gaea
   270  
   271  ### 1 建立执行文档的目录
   272  
   273  ```bash
   274  # 建立执行档集中目录
   275  $ mkdir -p Gaea/bin/
   276  ```
   277  
   278  ### 2 在终端机去下指令启动 Gaea
   279  
   280  先在终端机进行编译,后执行
   281  
   282  ```bash
   283  # GoRoot 和 GoPath 设定值
   284  # GOROOT 位于 /usr/local/go #gosetup
   285  # GOPATH 位于 /home/panhong/go #gosetup
   286  
   287  # 到 Gaea 的专案目录
   288  $ cd /home/panhong/go/src/github.com/panhongrainbow/Gaea
   289  
   290  # 对 Gaea 主程式进行编译
   291  $ /usr/local/go/bin/go build -o /home/panhong/go/src/github.com/panhongrainbow/Gaea/bin/gaea github.com/XiaoMi/Gaea/cmd/gaea #gosetup
   292  
   293  # 执行数据库中间件 Gaea
   294  $ /home/panhong/go/src/github.com/panhongrainbow/Gaea/bin/gaea
   295  ```
   296  
   297  执行画面如下
   298  
   299  <img src="./assets/image-20220124142003588.png" alt="image-20220124142003588" style="zoom:110%;" />
   300  
   301  ### 3 使用 IDE 工具启动 Gaea
   302  
   303  在 IDE 工具内,填入以下内容
   304  
   305  | 项目 | 配置       | 参数                                            |
   306  | ---- | ---------- | ----------------------------------------------- |
   307  | 1   | 名称       | gaea                                            |
   308  | 2   | 运行种类   | 软体包                                          |
   309  | 3   | 软体包路径 | github.com/XiaoMi/Gaea/cmd/gaea                 |
   310  | 4   | 输出目录   | /home/panhong/go/src/github.com/xiaomi/Gaea/bin |
   311  | 5   | 建构后运行 | 打勾                                            |
   312  | 6   | 工作目录   | /home/panhong/go/src/github.com/xiaomi/Gaea     |
   313  
   314  配置如下图
   315  
   316  <img src="./assets/image-20220124143836664.png" alt="image-20220124143836664"  /> 
   317  
   318  运行状况如下图
   319  
   320  <img src="./assets/image-20220124145641452.png" alt="image-20220124145641452" style="zoom: 100%;" /> 
   321  
   322  ### 4 启动后服务发现
   323  
   324  数据库中间件 Gaea 启动后,会在服务器 Etcd 里新增一个 key /gaea_cluster/proxy/proxy-127.0.0.1:13306
   325  
   326  其 value 内容如下
   327  
   328  ```json
   329  {
   330    "token": "127.0.0.1:13306",
   331    "start_time": "2022-01-24 11:22:03.46517227 +0800 CST m=+0.066173904",
   332    "ip": "127.0.0.1",
   333    "proto_type": "tcp4",
   334    "proxy_port": "13306",
   335    "admin_port": "13307",
   336    "pid": 10628,
   337    "pwd": "/home/panhong/go/src/github.com/panhongrainbow/Gaea",
   338    "sys": "Linux debian5 5.10.0-10-amd64 #1 SMP Debian 5.10.84-1 (2021-12-08) x86_64 GNU/Linux"
   339  }
   340  ```
   341  
   342  执行状况如下图
   343  
   344  <img src="./assets/image-20220127142531692.png" alt="image-20220127142531692" style="zoom:80%;" /> 
   345  
   346  ## 5 登入数据库中间件 Gaea
   347  
   348  数据库中间件 Gaea 启动后,直接进行登入
   349  
   350  ```bash
   351  # 登入 Gaea 指令如下
   352  $ mysql -h 127.0.0.1 -P 13306 --protocol=TCP -u xiaomi -p
   353  ```
   354  
   355  <img src="./assets/image-20220124154131750.png" alt="image-20220124154131750" style="zoom:60%;" /> 
   356  
   357  ## 6 测试数据库中间件 Gaea 的读写
   358  
   359  > 登入数据库中间件 Gaea ,执行以下 SQL 语句
   360  
   361  登入数据库中间件 Gaea,使用数据库 novel
   362  
   363  ```bash
   364  # 登入数据库中间件 Gaea
   365  $ mysql -h 127.0.0.1 -P 13306 --protocol=TCP -u xiaomi -p
   366  # Enter password: 
   367  # Welcome to the MariaDB monitor.  Commands end with ; or \g.
   368  # Your MySQL connection id is 10001
   369  # Server version: 5.6.20-gaea Source distribution
   370  
   371  # Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
   372  
   373  # Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
   374  
   375  # 使用数据库
   376  $ MySQL [(none)]> USE novel
   377  # Reading table information for completion of table and column names
   378  # You can turn off this feature to get a quicker startup with -A
   379  
   380  # Database changed
   381  # MySQL [novel]>
   382  ```
   383  
   384  执行以下 SQL 语句
   385  
   386  ```sql
   387  -- 第一本小说 三国演义
   388  INSERT INTO novel.Book (BookID, Isbn, Title, Author, Publish, Category) VALUES(1, 9781517191276, 'Romance Of The Three Kingdoms', 'Luo Guanzhong', 1522, 'Hi
   389  storical fiction'); 
   390  
   391  -- 第二本小说 水浒传
   392  INSERT INTO novel.Book (BookID, Isbn, Title, Author, Publish, Category) VALUES(2, 9789869442060, 'Water Margin', 'Shi Nai an', 1589, 'Historical fiction'); 
   393  
   394  -- 第三本小说 西游记
   395  INSERT INTO novel.Book (BookID, Isbn, Title, Author, Publish, Category) VALUES(3, 9789575709518, 'Journey To The West', 'Wu Cheng en', 1592, 'Gods And Demon
   396  s Fiction'); 
   397  ```
   398  
   399  登入数据库中间件 Gaea,执行三笔写入小说资料的 SQL 语句
   400  
   401  <img src="./assets/image-20220124182118946.png" alt="image-20220124182118946" style="zoom:100%;" />
   402  
   403  登入第一组丛集,查询 Master 数据库的写入资料,三笔小说资料被分配到一笔
   404  
   405  ![image-20220124182833234](./assets/image-20220124182833234.png)
   406  
   407  登入第一组丛集,查询第一台 Slave 数据库的写入资料,三笔小说资料被分配到一笔
   408  
   409  ![image-20220124182944970](./assets/image-20220124182944970.png)
   410  
   411  登入第一组丛集,查询第二台 Slave 数据库的写入资料,三笔小说资料被分配到一笔
   412  
   413  ![image-20220124183045456](./assets/image-20220124183045456.png)
   414  
   415  登入第二组丛集,查询 Master 数据库的写入资料,三笔小说资料被分配到两笔
   416  
   417  ![image-20220124183141813](./assets/image-20220124183141813.png)
   418  
   419  登入第二组丛集,查询第一台 Slave 数据库的写入资料,三笔小说资料被分配到两笔
   420  
   421  ![image-20220124183228814](./assets/image-20220124183228814.png)
   422  
   423  登入第二组丛集,查询第二台 Slave 数据库的写入资料,三笔小说资料被分配到两笔
   424  
   425  ![image-20220124183310893](./assets/image-20220124183310893.png)
   426  
   427  最后直接在数据库中间件 Gaea 查询全部三笔的小说资料
   428  
   429  <img src="./assets/image-20220126175410955.png" alt="image-20220126175410955" style="zoom:80%;" />