数据分片概述、环境准备、部署MyCAT服务、全局表、分片表、ER表

Top

NSD DBA DAY08

  1. 案例1:部署mycat服务
  2. 案例2:测试配置

1 案例1:部署mycat服务

1.1 问题

  1. 把主机mysql60 配置为 MySQL59 的从服务器
  2. 把主机mysql62 配置为 MySQL61 的从服务器
  3. 把主机mycat63 配置为mycat服务器
  4. 客户端192.168.88.50访问mycat服务

1.2 方案

准备6台虚拟机,具体配置如表-1

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:把MySQL60配置为MySQL59的从服务器

1)配置主服务器MySQL59

  1. //启用binlog日志
  2. root@mysql59 \~\]# yum --y install mysql-server mysql

  3. root@mysql59 \~\]# vim /etc/my.cnf.d/mysql-server.cnf

  4. server-id=59
  5. log-bin=mysql59
  6. :wq
  7. root@mysql59 \~\]# systemctl restart mysqld

  8. root@mysql59 \~\]# mysql

  9. Query OK, 0 rows affected (0.11 sec)
  10. mysql> grant replication slave on *.* to repluser@"%"; 授予权限
  11. Query OK, 0 rows affected (0.09 sec)
  12. //查看日志信息
  13. mysql> show master status;
  14. +----------------+----------+--------------+------------------+-------------------+
  15. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  16. +----------------+----------+--------------+------------------+-------------------+
  17. | mysql59.000001 | 667 | | | |
  18. +----------------+----------+--------------+------------------+-------------------+
  19. 1 row in set (0.00 sec)

2)配置slave服务器MySQL60

复制代码
  1. //指定server-id 并重启数据库服务
  2. root@mysql60 \~\]# yum --y install mysql-serv er mysql

  3. root@mysql60 \~\]# vim /etc/my.cnf.d/mysql-server.cnf

  4. server-id=60
  5. :wq
  6. root@mysql60 \~\]# systemctl restart mysqld

  7. root@mysql60 \~\]# mysql

  8. Query OK, 0 rows affected, 8 warnings (0.34 sec)
  9. //启动slave进程
  10. mysql> start slave ;
  11. Query OK, 0 rows affected, 1 warning (0.04 sec)
  12. //查看状态信息
  13. mysql> show slave status \G
  14. *************************** 1. row ***************************
  15. Slave_IO_State: Waiting for source to send event
  16. Master_Host: 192.168.88.59
  17. Master_User: repluser
  18. Master_Port: 3306
  19. Connect_Retry: 60
  20. Master_Log_File: mysql59.000001
  21. Read_Master_Log_Pos: 667
  22. Relay_Log_File: mysql60-relay-bin.000002
  23. Relay_Log_Pos: 322
  24. Relay_Master_Log_File: mysql59.000001
  25. Slave_IO_Running: Yes //IO线程
  26. Slave_SQL_Running: Yes //SQL线程
  27. Replicate_Do_DB:
  28. Replicate_Ignore_DB:
  29. Replicate_Do_Table:
  30. Replicate_Ignore_Table:
  31. Replicate_Wild_Do_Table:
  32. Replicate_Wild_Ignore_Table:
  33. Last_Errno: 0
  34. Last_Error:
  35. Skip_Counter: 0
  36. Exec_Master_Log_Pos: 667
  37. Relay_Log_Space: 533
  38. Until_Condition: None
  39. Until_Log_File:
  40. Until_Log_Pos: 0
  41. Master_SSL_Allowed: No
  42. Master_SSL_CA_File:
  43. Master_SSL_CA_Path:
  44. Master_SSL_Cert:
  45. Master_SSL_Cipher:
  46. Master_SSL_Key:
  47. Seconds_Behind_Master: 0
  48. Master_SSL_Verify_Server_Cert: No
  49. Last_IO_Errno: 0
  50. Last_IO_Error:
  51. Last_SQL_Errno: 0
  52. Last_SQL_Error:
  53. Replicate_Ignore_Server_Ids:
  54. Master_Server_Id: 59
  55. Master_UUID: 38c02165-005e-11ee-bd2d-525400007271
  56. Master_Info_File: mysql.slave_master_info
  57. SQL_Delay: 0
  58. SQL_Remaining_Delay: NULL
  59. Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
  60. Master_Retry_Count: 86400
  61. Master_Bind:
  62. Last_IO_Error_Timestamp:
  63. Last_SQL_Error_Timestamp:
  64. Master_SSL_Crl:
  65. Master_SSL_Crlpath:
  66. Retrieved_Gtid_Set:
  67. Executed_Gtid_Set:
  68. Auto_Position: 0
  69. Replicate_Rewrite_DB:
  70. Channel_Name:
  71. Master_TLS_Version:
  72. Master_public_key_path:
  73. Get_master_public_key: 0
  74. Network_Namespace:
  75. 1 row in set, 1 warning (0.00 sec)
  76. mysql>

步骤二:把MySQL62配置为MySQL61的从服务器

1)配置主服务器MySQL61

复制代码
  1. //启用binlog日志
  2. root@mysql61 \~\]# yum --y install mysql-server mysql

  3. root@mysql61 \~\]# vim /etc/my.cnf.d/mysql-server.cnf

  4. server-id=61
  5. log-bin=mysql61
  6. :wq
  7. root@mysql61 \~\]# systemctl restart mysqld

  8. root@mysql61 \~\]# mysql

  9. Query OK, 0 rows affected (0.11 sec)
  10. mysql> grant replication slave on *.* to repluser@"%"; 授予权限
  11. Query OK, 0 rows affected (0.09 sec)
  12. //查看日志信息
  13. mysql> show master status;
  14. +----------------+----------+--------------+------------------+-------------------+
  15. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  16. +----------------+----------+--------------+------------------+-------------------+
  17. | mysql61.000001 | 667 | | | |
  18. +----------------+----------+--------------+------------------+-------------------+
  19. 1 row in set (0.00 sec)

2)配置slave服务器MySQL62

复制代码
  1. //指定server-id 并重启数据库服务
  2. root@mysql62 \~\]# yum --y install mysql-server mysql

  3. root@mysql62 \~\]# vim /etc/my.cnf.d/mysql-server.cnf

  4. server-id=62
  5. :wq
  6. root@mysql62 \~\]# systemctl restart mysqld

  7. root@mysql62 \~\]# mysql

  8. Query OK, 0 rows affected, 8 warnings (0.34 sec)
  9. //启动slave进程
  10. mysql> start slave ;
  11. Query OK, 0 rows affected, 1 warning (0.04 sec)
  12. //查看状态信息
  13. mysql> show slave status \G
  14. *************************** 1. row ***************************
  15. Slave_IO_State: Waiting for source to send event
  16. Master_Host: 192.168.88.61
  17. Master_User: repluser
  18. Master_Port: 3306
  19. Connect_Retry: 60
  20. Master_Log_File: mysql61.000001
  21. Read_Master_Log_Pos: 667
  22. Relay_Log_File: mysql62-relay-bin.000002
  23. Relay_Log_Pos: 322
  24. Relay_Master_Log_File: mysql61.000001
  25. Slave_IO_Running: Yes //IO线程
  26. Slave_SQL_Running: Yes //SQL线程
  27. Replicate_Do_DB:
  28. Replicate_Ignore_DB:
  29. Replicate_Do_Table:
  30. Replicate_Ignore_Table:
  31. Replicate_Wild_Do_Table:
  32. Replicate_Wild_Ignore_Table:
  33. Last_Errno: 0
  34. Last_Error:
  35. Skip_Counter: 0
  36. Exec_Master_Log_Pos: 667
  37. Relay_Log_Space: 533
  38. Until_Condition: None
  39. Until_Log_File:
  40. Until_Log_Pos: 0
  41. Master_SSL_Allowed: No
  42. Master_SSL_CA_File:
  43. Master_SSL_CA_Path:
  44. Master_SSL_Cert:
  45. Master_SSL_Cipher:
  46. Master_SSL_Key:
  47. Seconds_Behind_Master: 0
  48. Master_SSL_Verify_Server_Cert: No
  49. Last_IO_Errno: 0
  50. Last_IO_Error:
  51. Last_SQL_Errno: 0
  52. Last_SQL_Error:
  53. Replicate_Ignore_Server_Ids:
  54. Master_Server_Id: 61
  55. Master_UUID: 38c02165-005e-11ee-bd2d-525400007271
  56. Master_Info_File: mysql.slave_master_info
  57. SQL_Delay: 0
  58. SQL_Remaining_Delay: NULL
  59. Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
  60. Master_Retry_Count: 86400
  61. Master_Bind:
  62. Last_IO_Error_Timestamp:
  63. Last_SQL_Error_Timestamp:
  64. Master_SSL_Crl:
  65. Master_SSL_Crlpath:
  66. Retrieved_Gtid_Set:
  67. Executed_Gtid_Set:
  68. Auto_Position: 0
  69. Replicate_Rewrite_DB:
  70. Channel_Name:
  71. Master_TLS_Version:
  72. Master_public_key_path:
  73. Get_master_public_key: 0
  74. Network_Namespace:
  75. 1 row in set, 1 warning (0.00 sec)
  76. mysql>

步骤三:把主机mycat63配置为mycat服务器。

1)拷贝软件到mycat63主机

复制代码
  1. root@server1 \~\]# scp /linux-soft/s3/mycat2-1.21-release-jar-with-dependencies.jar [email protected]:/root/

2)安装mycat软件

复制代码
  1. //安装jdk
  2. root@mycat63 \~\]# yum -y install java-1.8.0-openjdk.x86_64

  3. root@mycat63 \~\]# which unzip \|\| yum -y install unzip

  4. root@mycat63 \~\]# mv mycat /usr/local/

  5. root@mycat63 \~\]# cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/

  6. root@mycat63 \~\]# chmod -R 777 /usr/local/mycat/

复制代码
  1. root@mycat63 \~\]# vim /usr/local/mycat/conf/users/root.user.json

  2. "dialect":"mysql",
  3. "ip":null,
  4. "password":"654321",
  5. "transactionType":"proxy",
  6. "username":"mycat"
  7. }
  8. :wq
  1. 定义连接的数据库服务
复制代码
  1. root@mycat63 \~\]# vim /usr/local/mycat/conf/datasources/prototypeDs.data

  2. "dbType":"mysql",
  3. "idleTimeout":60000,
  4. "initSqls":[],
  5. "initSqlsGetConnection":true,
  6. "instanceType":"READ_WRITE",
  7. "maxCon":1000,
  8. "maxConnectTimeout":3000,
  9. "maxRetryCount":5,
  10. "minCon":1,
  11. "name":"prototypeDs",
  12. "password":"123456", 密码
  13. "type":"JDBC",
  14. "url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8", 连接本机的数据库服务
  15. "user":"plj", 用户名
  16. "weight":0
  17. }
  18. :wq

5)在mycat63主机运行数据库服务

复制代码
  1. root@mycat63 \~\]# yum -y install mysql-server mysql

  2. //创建plj用户
  3. root@mycat63 \~\]# mysql

  4. Query OK, 0 rows affected (0.05 sec)
  5. mysql> grant all on *.* to plj@"%" ; 授予权限
  6. Query OK, 0 rows affected (0.39 sec)
  7. mysql> exit
  8. Bye
  9. root@mycat63 \~\]#

复制代码
  1. root@mycat63 \~\]# /usr/local/mycat/bin/mycat help

  2. root@mycat63 \~\]# /usr/local/mycat/bin/mycat start

  3. //半分钟左右 能看到端口
  4. root@mycat63 \~\]# netstat -utnlp \| grep 8066

  5. root@mycat63 \~\]#

1)连接本机的mycat服务

复制代码
  1. root@mycat63 \~\]# mysql -h127.0.0.1 -P8066 -umycat -p654321

  2. +--------------------+
  3. | `Database` |
  4. +--------------------+
  5. | information_schema |
  6. | mysql |
  7. | performance_schema |
  8. +--------------------+
  9. 3 rows in set (0.11 sec)
  10. Mysql>

步骤五:添加数据源

1)连接本机的mycat服务,添加数据源

复制代码
  1. root@mycat63 \~\]# mysql -h127.0.0.1 -P8066 -umycat -p654321

  2. MySQL>/*+ mycat:createdatasource{
  3. "name":"dw0", "url":"jdbc:mysql://192.168.88.59:3306","user":"plj","password":"123456"}*/;
  4. //添加MySQL60
  5. Mysql>/*+ mycat:createdatasource{
  6. "name":"dr0", "url":"jdbc:mysql://192.168.88.60:3306","user":"plj","password":"123456"}*/;
  7. //添加MySQL61
  8. Mysql>/*+ mycat:createdatasource{
  9. "name":"dw1", "url":"jdbc:mysql://192.168.88.61:3306","user":"plj","password":"123456"}*/;
  10. //添加MySQL62
  11. Mysql>/*+ mycat:createdatasource{
  12. "name":"dr1", "url":"jdbc:mysql://192.168.88.62:3306","user":"plj","password":"123456"}*/;
  13. Mysql>

2)查看存放目录

复制代码
  1. root@mycat63 \~\]# ls /usr/local/mycat/conf/datasources/

3)查看数据信息

复制代码
  1. mysql> /*+mycat:showDataSources{}*/ \G
  2. *************************** 1. row ***************************
  3. NAME: dw0
  4. USERNAME: plj
  5. PASSWORD: 123456
  6. MAX_CON: 1000
  7. MIN_CON: 1
  8. EXIST_CON: 0
  9. USE_CON: 0
  10. MAX_RETRY_COUNT: 5
  11. MAX_CONNECT_TIMEOUT: 30000
  12. DB_TYPE: mysql
  13. URL: jdbc:mysql://192.168.88.59:3306?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
  14. WEIGHT: 0
  15. INIT_SQL:
  16. INIT_SQL_GET_CONNECTION: true
  17. INSTANCE_TYPE: READ_WRITE
  18. IDLE_TIMEOUT: 60000
  19. DRIVER: {
  20. CreateTime:"2023-05-08 16:10:26",
  21. ActiveCount:0,
  22. PoolingCount:0,
  23. CreateCount:0,
  24. DestroyCount:0,
  25. CloseCount:0,
  26. ConnectCount:0,
  27. Connections:[
  28. ]
  29. }
  30. TYPE: JDBC
  31. IS_MYSQL: true
  32. *************************** 2. row ***************************
  33. NAME: dw1
  34. USERNAME: plj
  35. PASSWORD: 123456
  36. MAX_CON: 1000
  37. MIN_CON: 1
  38. EXIST_CON: 0
  39. USE_CON: 0
  40. MAX_RETRY_COUNT: 5
  41. MAX_CONNECT_TIMEOUT: 30000
  42. DB_TYPE: mysql
  43. URL: jdbc:mysql://192.168.88.61:3306?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
  44. WEIGHT: 0
  45. INIT_SQL:
  46. INIT_SQL_GET_CONNECTION: true
  47. INSTANCE_TYPE: READ_WRITE
  48. IDLE_TIMEOUT: 60000
  49. DRIVER: {
  50. CreateTime:"2023-05-08 16:10:26",
  51. ActiveCount:0,
  52. PoolingCount:0,
  53. CreateCount:0,
  54. DestroyCount:0,
  55. CloseCount:0,
  56. ConnectCount:0,
  57. Connections:[
  58. ]
  59. }
  60. TYPE: JDBC
  61. IS_MYSQL: true
  62. *************************** 3. row ***************************
  63. NAME: dr0
  64. USERNAME: plj
  65. PASSWORD: 123456
  66. MAX_CON: 1000
  67. MIN_CON: 1
  68. EXIST_CON: 0
  69. USE_CON: 0
  70. MAX_RETRY_COUNT: 5
  71. MAX_CONNECT_TIMEOUT: 30000
  72. DB_TYPE: mysql
  73. URL: jdbc:mysql://192.168.88.61:3306?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
  74. WEIGHT: 0
  75. INIT_SQL:
  76. INIT_SQL_GET_CONNECTION: true
  77. INSTANCE_TYPE: READ_WRITE
  78. IDLE_TIMEOUT: 60000
  79. DRIVER: {
  80. CreateTime:"2023-05-08 16:10:26",
  81. ActiveCount:0,
  82. PoolingCount:0,
  83. CreateCount:0,
  84. DestroyCount:0,
  85. CloseCount:0,
  86. ConnectCount:0,
  87. Connections:[
  88. ]
  89. }
  90. TYPE: JDBC
  91. IS_MYSQL: true
  92. *************************** 4. row ***************************
  93. NAME: dr1
  94. USERNAME: plj
  95. PASSWORD: 123456
  96. MAX_CON: 1000
  97. MIN_CON: 1
  98. EXIST_CON: 0
  99. USE_CON: 0
  100. MAX_RETRY_COUNT: 5
  101. MAX_CONNECT_TIMEOUT: 30000
  102. DB_TYPE: mysql
  103. URL: jdbc:mysql://192.168.88.62:3306?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&autoReconnect=true
  104. WEIGHT: 0
  105. INIT_SQL:
  106. INIT_SQL_GET_CONNECTION: true
  107. INSTANCE_TYPE: READ_WRITE
  108. IDLE_TIMEOUT: 60000
  109. DRIVER: {
  110. CreateTime:"2023-05-08 16:10:26",
  111. ActiveCount:0,
  112. PoolingCount:0,
  113. CreateCount:0,
  114. DestroyCount:0,
  115. CloseCount:0,
  116. ConnectCount:0,
  117. Connections:[
  118. ]
  119. }
  120. TYPE: JDBC
  121. IS_MYSQL: true
  122. *************************** 5. row ***************************
  123. NAME: prototypeDs
  124. USERNAME: plj
  125. PASSWORD: 123456
  126. MAX_CON: 1000
  127. MIN_CON: 1
  128. EXIST_CON: 0
  129. USE_CON: 0
  130. MAX_RETRY_COUNT: 5
  131. MAX_CONNECT_TIMEOUT: 3000
  132. DB_TYPE: mysql
  133. URL: jdbc:mysql://localhost:3306/mysql?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
  134. WEIGHT: 0
  135. INIT_SQL:
  136. INIT_SQL_GET_CONNECTION: true
  137. INSTANCE_TYPE: READ_WRITE
  138. IDLE_TIMEOUT: 60000
  139. DRIVER: {
  140. CreateTime:"2023-05-08 16:10:26",
  141. ActiveCount:0,
  142. PoolingCount:0,
  143. CreateCount:0,
  144. DestroyCount:0,
  145. CloseCount:0,
  146. ConnectCount:0,
  147. Connections:[
  148. ]
  149. }
  150. TYPE: JDBC
  151. IS_MYSQL: true
  152. 5 rows in set (0.07 sec)
  153. mysql>

步骤六:配置数据库服务器

1)在主服务器添加plj用户

复制代码
  1. root@mysql59 \~\]# mysql

  2. Mysql> grant all on *.* to plj@"%";
  3. root@mysql61 \~\]# mysql

  4. Mysql> grant all on *.* to plj@"%";

2)在从服务器查看用户是否同步

复制代码
  1. root@mysql60 \~\]# mysql -e 'select user from mysql.user where user="plj"'

  2. | user |
  3. +------+
  4. | plj |
  5. +------+
  6. root@mysql60 \~\]#

  7. root@mysql62 \~\]# mysql -e 'select user from mysql.user where user="plj"'

  8. | user |
  9. +------+
  10. | plj |
  11. +------+
  12. root@host62 \~\]#

1)连接本机的mycat服务,创建集群

复制代码
  1. root@mycat63 \~\]# mysql -h127.0.0.1 -P8066 -umycat -p654321

  2. mysql> /*!mycat:createcluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]}*/;
  3. Mysql>

2)创建的集群保存在mycat安装目录下

复制代码
  1. root@MySQL63 \~\]# ls /usr/local/mycat/conf/clusters/

  2. root@mycat63 \~\]#

复制代码
  1. mysql> /*+ mycat:showClusters{}*/ \G
  2. *************************** 1. row ***************************
  3. NAME: prototype
  4. SWITCH_TYPE: SWITCH
  5. MAX_REQUEST_COUNT: 200
  6. TYPE: BALANCE_ALL
  7. WRITE_DS: prototypeDs
  8. READ_DS: prototypeDs
  9. WRITE_L: io.mycat.plug.loadBalance.BalanceRandom$1
  10. READ_L: io.mycat.plug.loadBalance.BalanceRandom$1
  11. AVAILABLE: true
  12. *************************** 2. row ***************************
  13. NAME: c0
  14. SWITCH_TYPE: SWITCH
  15. MAX_REQUEST_COUNT: 2000
  16. TYPE: BALANCE_ALL
  17. WRITE_DS: dw0
  18. READ_DS: dw0,dr0
  19. WRITE_L: io.mycat.plug.loadBalance.BalanceRandom$1
  20. READ_L: io.mycat.plug.loadBalance.BalanceRandom$1
  21. AVAILABLE: true
  22. *************************** 3. row ***************************
  23. NAME: c1
  24. SWITCH_TYPE: SWITCH
  25. MAX_REQUEST_COUNT: 2000
  26. TYPE: BALANCE_ALL
  27. WRITE_DS: dw1
  28. READ_DS: dw1,dr1
  29. WRITE_L: io.mycat.plug.loadBalance.BalanceRandom$1
  30. READ_L: io.mycat.plug.loadBalance.BalanceRandom$1
  31. AVAILABLE: true
  32. 3 rows in set (0.03 sec)
  33. mysql>

2 案例2:测试配置

2.1 问题

  • 练习全局表
  • 练习分片表
  • 练习ER表

2.2 方案

在客户端client50 连接mycat63 存储数据 ,验证mycat63的配置

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习全局表

全局表 数据会插入到两个库中,并且两个库中都有全部的数据。

复制代码
  1. //在mycat63 连接本机的mycat服务建库
  2. root@mycat63 \~\]# mysql -h127.0.0.1 -umycat -p654321 -P8066

  3. Query OK, 0 rows affected (0.31 sec)
  4. mysql> exit
  5. Bye
  6. root@mycat63 \~\]#

复制代码
  1. root@mycat63 \~\]# ls /usr/local/mycat/conf/schemas/tarena.schema.json

  2. root@mycat63 \~\]#

复制代码
  1. //客户端client50 连接mycat63主机的 建表存储数据
  2. root@client50 \~\]# mysql -h192.168.88.63 -umycat -p654321 -P8066

  3. Query OK, 0 rows affected (4.46 sec)
  4. //插入记录
  5. mysql> insert into tarena.dept values(1,"开发部"),(2,"运维部"),(3,"测试部");
  6. Query OK, 1 row affected (0.23 sec)
  7. //查看记录
  8. mysql> select * from tarena.dept;
  9. +---------+-----------+
  10. | dept_id | dept_name |
  11. +---------+-----------+
  12. | 1 | 开发部 |
  13. | 2 | 运维部 |
  14. | 3 | 测试部 |
  15. +---------+-----------+
  16. 3 rows in set (0.33 sec)
  17. mysql>

在4台数据库服务器查看

复制代码
  1. root@mysql59 \~\]# mysql -e 'select \* from tarena.dept'

  2. | dept_id | dept_name |
  3. +---------+-----------+
  4. | 1 | 开发部 |
  5. | 2 | 运维部 |
  6. | 3 | 测试部 |
  7. +---------+-----------+
  8. root@host61 \~\]#

  9. +---------+-----------+
  10. | dept_id | dept_name |
  11. +---------+-----------+
  12. | 1 | 开发部 |
  13. | 2 | 运维部 |
  14. | 3 | 测试部 |
  15. +---------+-----------+
  16. root@host62 \~\]#

  17. +---------+-----------+
  18. | dept_id | dept_name |
  19. +---------+-----------+
  20. | 1 | 开发部 |
  21. | 2 | 运维部 |
  22. | 3 | 测试部 |
  23. +---------+-----------+
  24. root@host63 \~\]#

  25. +---------+-----------+
  26. | dept_id | dept_name |
  27. +---------+-----------+
  28. | 1 | 开发部 |
  29. | 2 | 运维部 |
  30. | 3 | 测试部 |
  31. +---------+-----------+

步骤二:练习分片表

dbpartition 定义分库使用的分片规则,

tbpartition 定义分表使用的分片规则。

mod_hash 分片规则,用employee_id表头的值做取模计算

tbpartitions 1 表的分片数量

dbpartitions 2 库的分片数量

复制代码
  1. //连接mycat服务建表
  2. root@client50 \~\]# mysql -h192.168.88.63 -P8066 -umycat --p654321

  3. employee_id int primary key,
  4. name char(10),dept_id int ,
  5. mail varchar(30)
  6. ) default charset utf8
  7. dbpartition BY mod_hash(employee_id) tbpartition BY mod_hash(employee_id)
  8. tbpartitions 1 dbpartitions 2;

在4台数据库服务器查看表

复制代码
  1. root@mysql59 \~\]# mysql -e 'show databases'

  2. | Database |
  3. +--------------------+
  4. | information_schema |
  5. | mysql |
  6. | performance_schema |
  7. | sys |
  8. | tarena |
  9. | tarena_0 |
  10. +--------------------+
  11. root@mysql59 \~\]# mysql -e 'use tarena_0 ; show tables'

  12. | Tables_in_tarena_0 |
  13. +--------------------+
  14. | employees_0 |
  15. +--------------------+
  16. root@host61 \~\]#

  17. root@mysql60 \~\]# mysql -e 'show databases'

  18. | Database |
  19. +--------------------+
  20. | information_schema |
  21. | mysql |
  22. | performance_schema |
  23. | sys |
  24. | tarena |
  25. | tarena_0 |
  26. +--------------------+
  27. root@mysql60 \~\]# mysql -e 'use tarena_0 ; show tables'

  28. | Tables_in_tarena_0 |
  29. +--------------------+
  30. | employees_0 |
  31. +--------------------+
  32. root@host62 \~\]#

  33. root@mysql61 \~\]# mysql -e 'show databases'

  34. | Database |
  35. +--------------------+
  36. | information_schema |
  37. | mysql |
  38. | performance_schema |
  39. | sys |
  40. | tarena |
  41. | tarena_1 |
  42. +--------------------+
  43. root@mysql61 \~\]# mysql -e 'use tarena_1;show tables'

  44. | Tables_in_tarena_1 |
  45. +--------------------+
  46. | employees_1 |
  47. +--------------------+
  48. root@host63 \~\]#

  49. root@mysql62 \~\]# mysql -e 'show databases'

  50. | Database |
  51. +--------------------+
  52. | information_schema |
  53. | mysql |
  54. | performance_schema |
  55. | sys |
  56. | tarena |
  57. | tarena_1 |
  58. +--------------------+
  59. root@mysql62 \~\]# mysql -e 'use tarena_1;show tables'

  60. | Tables_in_tarena_1 |
  61. +--------------------+
  62. | employees_1 |
  63. +--------------------+
  64. root@host64 \~\]#

复制代码
  1. root@client50 \~\]# mysql -h192.168.88.63 -P8066 -umycat --p654321

  2. Query OK, 1 row affected (0.08 sec)
  3. mysql> insert into tarena.employees values (8,"B","3","[email protected]");
  4. Query OK, 1 row affected (0.13 sec)
  5. mysql> insert into tarena.employees values (7,"C","2","[email protected]");
  6. Query OK, 1 row affected (0.02 sec)
  7. mysql> insert into tarena.employees values (6,"C","2","[email protected]");
  8. Query OK, 1 row affected (0.06 sec)
  9. mysql> select * from tarena.employees;
  10. +-------------+------+---------+-----------+
  11. | employee_id | name | dept_id | mail |
  12. +-------------+------+---------+-----------+
  13. | 6 | C | 2 | [email protected] |
  14. | 8 | B | 3 | [email protected] |
  15. | 7 | C | 2 | [email protected] |
  16. | 9 | a | 1 | [email protected] |
  17. +-------------+------+---------+-----------+
  18. 4 rows in set (2.07 sec)

在数据库服务器本机查看数据

复制代码
  1. root@mysql59 \~\]# mysql -e 'select \* from tarena_0.employees_0'

  2. | employee_id | name | dept_id | mail |
  3. +-------------+------+---------+----------+
  4. | 6 | C | 2 | [email protected] |
  5. | 8 | B | 3 | [email protected] |
  6. +-------------+------+---------+----------+
  7. root@mysql59 \~\]#

  8. root@mysql60 \~\]# mysql -e 'select \* from tarena_0.employees_0'

  9. | employee_id | name | dept_id | mail |
  10. +-------------+------+---------+----------+
  11. | 6 | C | 2 | [email protected] |
  12. | 8 | B | 3 | [email protected] |
  13. +-------------+------+---------+----------+
  14. root@mysql60 \~\]#

  15. root@mysql61 \~\]# mysql -e 'select \* from tarena_1.employees_1'

  16. | employee_id | name | dept_id | mail |
  17. +-------------+------+---------+-----------+
  18. | 7 | C | 2 | [email protected] |
  19. | 9 | a | 1 | [email protected] |
  20. +-------------+------+---------+-----------+
  21. root@mysql61 \~\]#

  22. root@mysql62 \~\]# mysql -e 'select \* from tarena_1.employees_1'

  23. | employee_id | name | dept_id | mail |
  24. +-------------+------+---------+-----------+
  25. | 7 | C | 2 | [email protected] |
  26. | 9 | a | 1 | [email protected] |
  27. +-------------+------+---------+-----------+
  28. root@mysql62 \~\]#

ER表,称为关联表,表示数据逻辑上有关联性的两个或多个表,例如工资表和员工表。对于关联表,通常希望他们能够有相同的分片规则,这样在进行关联查询时,能够快速定位到同一个数据分片中。MyCat2中对于关联表,不需要有过多的声明,他可以根据分片规则自行判断。

1)连接mycat服务建表

复制代码
  1. root@client50 \~\]# mysql -h192.168.88.63 -P8066 -umycat --p654321

  2. employee_id int primary key,
  3. p_date date , basic int , bonus int
  4. ) DEFAULT CHARSET=utf8
  5. dbpartition BY mod_hash(employee_id)
  6. tbpartition BY mod_hash(employee_id) tbpartitions 1;
  7. Query OK, 1 row affected (1.93 sec)

2)在MyCat2终端查看关联表关系。

复制代码
  1. root@mycat63 \~\]# mysql -h127.0.0.1 -P8066 -umycat --p654321

  2. mysql> /*+ mycat:showErGroup{}*/ ;
  3. +---------+------------+-----------+
  4. | groupId | schemaName | tableName |
  5. +---------+------------+-----------+
  6. | 0 | tarena | employees |
  7. | 0 | tarena | salary |
  8. +---------+------------+-----------+
  9. 2 rows in set (0.00 sec)
  10. mysql>

3)在2台主服务器查看表

复制代码
  1. root@mysql59 \~\]# mysql -e 'use tarena_0 ; show tables'

  2. | Tables_in_tarena_0 |
  3. +--------------------+
  4. | employees_0 |
  5. | salary_0 |
  6. +--------------------+
  7. root@mysql59 \~\]#

  8. root@mysql61 \~\]# mysql -e 'use tarena_1;show tables'

  9. | Tables_in_tarena_1 |
  10. +--------------------+
  11. | employees_1 |
  12. | salary_1 |
  13. +--------------------+
  14. root@mysql61\~\]#

复制代码
  1. root@client50 \~\]# mysql -h192.168.88.63 -P8066 -umycat --p654321

  2. +-------------+------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-------------+------+------+-----+---------+-------+
  5. | employee_id | int | NO | PRI | NULL | |
  6. | p_date | date | YES | | NULL | |
  7. | basic | int | YES | | NULL | |
  8. | bonus | int | YES | | NULL | |
  9. +-------------+------+------+-----+---------+-------+
  10. 4 rows in set (0.07 sec)
  11. mysql> insert into tarena.salary values(6,20230110,20000,2000);
  12. Query OK, 1 row affected (0.28 sec)
  13. mysql> insert into tarena.salary values(7,20230210,25000,2500);
  14. Query OK, 1 row affected (0.21 sec)
  15. mysql> insert into tarena.salary values(8,20230310,30000,3000);
  16. Query OK, 1 row affected (0.26 sec)
  17. mysql> insert into tarena.salary values(9,20230410,35000,3500);
  18. Query OK, 1 row affected (0.05 sec)
  19. mysql> select * from tarena.salary;
  20. +-------------+------------+-------+-------+
  21. | employee_id | p_date | basic | bonus |
  22. +-------------+------------+-------+-------+
  23. | 6 | 2023-01-10 | 20000 | 2000 |
  24. | 8 | 2023-03-10 | 30000 | 3000 |
  25. | 7 | 2023-02-10 | 25000 | 2500 |
  26. | 9 | 2023-04-10 | 35000 | 3500 |
  27. +-------------+------------+-------+-------+
  28. 4 rows in set (0.16 sec)
  29. mysql>

5)在4台数据库服务器本机查看

复制代码
  1. root@mysql59 \~\]# mysql -e 'select \* from tarena_0.employees_0'

  2. | employee_id | name | dept_id | mail |
  3. +-------------+------+---------+----------+
  4. | 6 | C | 2 | [email protected] |
  5. | 8 | B | 3 | [email protected] |
  6. +-------------+------+---------+----------+
  7. root@mysql59 \~\]#

  8. +-------------+------------+-------+-------+
  9. | employee_id | p_date | basic | bonus |
  10. +-------------+------------+-------+-------+
  11. | 6 | 2023-01-10 | 20000 | 2000 |
  12. | 8 | 2023-03-10 | 30000 | 3000 |
  13. +-------------+------------+-------+-------+
  14. root@mysql60 \~\]#

  15. root@mysql61 \~\]# mysql -e 'select \* from tarena_1.employees_1'

  16. | employee_id | name | dept_id | mail |
  17. +-------------+------+---------+-----------+
  18. | 7 | C | 2 | [email protected] |
  19. | 9 | a | 1 | [email protected] |
  20. +-------------+------+---------+-----------+
  21. root@mysql62 \~\]# mysql -e 'select \* from tarena_1.salary_1'

  22. | employee_id | p_date | basic | bonus |
  23. +-------------+------------+-------+-------+
  24. | 7 | 2023-02-10 | 25000 | 2500 |
  25. | 9 | 2023-04-10 | 35000 | 3500 |
  26. +-------------+------------+-------+-------+
  27. root@mysql62\~\]#

相关推荐
阿豪元代码15 分钟前
Perfetto 上手指南2 —— 基础使用
android
QING61820 分钟前
一文带你吃透Kotlin中 lateinit 和 by lazy 的区别和用法
android·kotlin·app
QING61821 分钟前
Android Context 详解:原理、类型与使用指南
android·kotlin·app
七郎的小院27 分钟前
ANR系列之ContentProvider ANR原理
android·性能优化
法欧特斯卡雷特32 分钟前
Kotlin v2.1.20 发布,标准库又有哪些变化?
android·前端·后端
CesareCheung2 小时前
执行adb指令报错:error: more than one device/emulator原因及解决方法
adb
ForteScarlet3 小时前
Kotlin v2.1.20 发布,标准库又有哪些变化?
android·开发语言·kotlin
大博士.J9 小时前
MySQL实现全量同步和增量同步到SQL Server或其他关系型库
数据仓库·人工智能·python·mysql·adb
JiaoJunfeng11 小时前
Android App安装列表获取
android·android15适配·获取安装列表
小墙程序员12 小时前
一文了解 Android 中的 UID、GID、PID
android