sharding-proxy demo

网友投稿 717 2022-05-30

部署Sharding-proxy和mysql

1. 下载sharding-proxy的example的代码, 进入sharding文件夹 (cd docker/sharding-proxy/sharding)

[root@ymaster sharding]# ll total 4 drwxr-xr-x 2 root root   53 Nov 29 14:51 conf -rwxr-xr-x 1 root root 1574 Nov 18 17:23 docker-compose.yml

conf文件夹下是数据库分库分表的配置,详细配置见下面章节--分库分表配置介绍

sharding-proxy demo

docker-compose.yaml文件是编排mysql和sharding-proxy的例子,docker-compose文件详情见步骤2

2. 执行命令 (docker-compose up -d) 启动mysql和sharding-proxy

version: '3' services:   mysql:     ## mysql version, you could get more tags at here : https://hub.docker.com/_/mysql?tab=tags     image: "mysql:5.7"     ## default port is 3306, you could change to 33060 or any other port doesn't conflict MySQL on your OS     ports:      - "33060:3306"     container_name: sharding-sphere-mysql     ## launch mysql without password     ## you could access the mysql in container by following command :     ## docker exec -it sharding-sphere-mysql mysql -uroot     environment:      - MYSQL_ALLOW_EMPTY_PASSWORD=yes     ## if you insist to use password in mysql, remove MYSQL_ALLOW_EMPTY_PASSWORD=yes and uncomment following args     #  - MYSQL_ROOT_PASSWORD=root     volumes:       - ../../../src/resources/manual_schema.sql:/docker-entrypoint-initdb.d/manual_schema.sql   proxy:     ## get more versions of proxy here : https://hub.docker.com/r/shardingsphere/sharding-proxy/tags     image: "shardingsphere/sharding-proxy:3.1.0"     container_name: sharding-sphere-proxy     depends_on:      - mysql     ## wait-for-it.sh will make proxy entry point wait until mysql container 3306 port open     entrypoint: >      /bin/sh -c "/opt/wait-for-it.sh sharding-sphere-mysql:3306 --timeout=20 --strict --      && /opt/sharding-proxy/bin/start.sh 3308      && tail -f /opt/sharding-proxy/logs/stdout.log"     ports:      - "13308:3308"     links:      - "mysql:mysql"     volumes:      - ./conf/:/opt/sharding-proxy/conf      - ../../tools/wait-for-it.sh:/opt/wait-for-it.sh     environment:      - JVM_OPTS="-Djava.awt.headless=true"

可见docker-compose.yaml文件启动了两个服务mysql和sharding -proxy ,mysql的启动脚本执行了manual_schema.sql文件初始化数据库,把分库分表都初始化好了。

manual_schema.sql如下:

DROP SCHEMA IF EXISTS Demo_ds; DROP SCHEMA IF EXISTS demo_ds_0; DROP SCHEMA IF EXISTS demo_ds_1; DROP SCHEMA IF EXISTS demo_ds_master; DROP SCHEMA IF EXISTS demo_ds_slave_0; DROP SCHEMA IF EXISTS demo_ds_slave_1; DROP SCHEMA IF EXISTS demo_ds_master_0; DROP SCHEMA IF EXISTS demo_ds_master_0_slave_0; DROP SCHEMA IF EXISTS demo_ds_master_0_slave_1; DROP SCHEMA IF EXISTS demo_ds_master_1; DROP SCHEMA IF EXISTS demo_ds_master_1_slave_0; DROP SCHEMA IF EXISTS demo_ds_master_1_slave_1; CREATE SCHEMA IF NOT EXISTS demo_ds; CREATE SCHEMA IF NOT EXISTS demo_ds_0; CREATE SCHEMA IF NOT EXISTS demo_ds_1; CREATE SCHEMA IF NOT EXISTS demo_ds_master; CREATE SCHEMA IF NOT EXISTS demo_ds_slave_0; CREATE SCHEMA IF NOT EXISTS demo_ds_slave_1; CREATE SCHEMA IF NOT EXISTS demo_ds_master_0; CREATE SCHEMA IF NOT EXISTS demo_ds_master_0_slave_0; CREATE SCHEMA IF NOT EXISTS demo_ds_master_0_slave_1; CREATE SCHEMA IF NOT EXISTS demo_ds_master_1; CREATE SCHEMA IF NOT EXISTS demo_ds_master_1_slave_0; CREATE SCHEMA IF NOT EXISTS demo_ds_master_1_slave_1;

等mysql创建好了,直接连接mysql数据库可以看到数据库情况如下:

mysql> show databases; +--------------------------+ | Database                 | +--------------------------+ | information_schema       | | demo_ds                  | | demo_ds_0                | | demo_ds_1                | | demo_ds_master           | | demo_ds_master_0         | | demo_ds_master_0_slave_0 | | demo_ds_master_0_slave_1 | | demo_ds_master_1         | | demo_ds_master_1_slave_0 | | demo_ds_master_1_slave_1 | | demo_ds_slave_0          | | demo_ds_slave_1          | | mysql                    | | performance_schema       | | sys                      | +--------------------------+ 16 rows in set (0.00 sec)

3. 执行命令连接sharding-proxy, 然后sharding-proxy会连接到mysql

命令  mysql -h -P13308 -proot -uroot

可以看到sharding-proxy连接之后只有sharding-db这一个库,看不到直连mysql查出来的12个库

# mysql -h x.x.x.x -uroot -proot -P13308 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL**.  Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.6.0-Sharding-Proxy 3.1.0 Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +-------------+ | Database    | +-------------+ | sharding_db | +-------------+ 1 row in set (0.00 sec)

4.连接sharding-proxy执行建表,插入数据,查询数据等操作

建表

mysql> CREATE TABLE IF NOT EXISTS demo_ds_0.t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id)); Query OK, 0 rows affected (0.70 sec) mysql> CREATE TABLE IF NOT EXISTS demo_ds_1.t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id)); Query OK, 0 rows affected (0.70 sec) mysql>  CREATE TABLE IF NOT EXISTS demo_ds_0.t_order_item (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_item_id)); Query OK, 0 rows affected (0.93 sec) mysql>  CREATE TABLE IF NOT EXISTS demo_ds_1.t_order_item (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_item_id)); Query OK, 0 rows affected (0.01 sec) mysql> select * from t_order; Empty set (0.02 sec)

插入数据

mysql> INSERT INTO t_order (user_id,  status) VALUES (1,  'init'); Query OK, 1 row affected (0.02 sec) mysql> INSERT INTO t_order (user_id,  status) VALUES (1,  'init'); Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO t_order (user_id,  status) VALUES (2,  'init'); Query OK, 1 row affected (0.02 sec)

sharding proxy看到的

mysql> select * from t_order; +--------------------+---------+--------+ | order_id           | user_id | status | +--------------------+---------+--------+ | 407052335232057344 |       2 | init   | | 407051622900826112 |       1 | init   | | 407051650910388225 |       1 | init   | +--------------------+---------+--------+ 3 rows in set (0.01 sec)

mysql看到的

mysql> show tables; +---------------------+ | Tables_in_demo_ds_0 | +---------------------+ | t_order_0           | | t_order_1           | | t_order_item_0      | | t_order_item_1      | +---------------------+ 4 rows in set (0.00 sec) mysql> select * from t_order_0; +--------------------+---------+--------+ | order_id           | user_id | status | +--------------------+---------+--------+ | 407052335232057344 |       2 | init   | +--------------------+---------+--------+ 1 row in set (0.01 sec) mysql> select * from t_order_1; Empty set (0.00 sec) mysql> select * from t_order_item_0; Empty set (0.00 sec) mysql> select * from t_order_item_1; Empty set (0.00 sec) mysql> use demo_ds_1; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from t_order_0; +--------------------+---------+--------+ | order_id           | user_id | status | +--------------------+---------+--------+ | 407051622900826112 |       1 | init   | +--------------------+---------+--------+ 1 row in set (0.01 sec) mysql> select * from t_order_1; +--------------------+---------+--------+ | order_id           | user_id | status | +--------------------+---------+--------+ | 407051650910388225 |       1 | init   | +--------------------+---------+--------+ 1 row in set (0.00 sec)

更多例子可以参考 https://github.com/apache/incubator-shardingsphere-example/tree/dev/sharding-proxy-example

分库分表配置介绍

conf文件夹下有 两个文件

config-sharding.yaml

该文件是定义分片规则的文件

schemaName: sharding_db dataSources:   ds_0:     url: jdbc:mysql://sharding-sphere-mysql:3306/demo_ds_0?serverTimezone=UTC&useSSL=false     username: root     password:     connectionTimeoutMilliseconds: 30000     idleTimeoutMilliseconds: 60000     maxLifetimeMilliseconds: 1800000     maxPoolSize: 50   ds_1:     url: jdbc:mysql://sharding-sphere-mysql:3306/demo_ds_1?serverTimezone=UTC&useSSL=false     username: root     password:     connectionTimeoutMilliseconds: 30000     idleTimeoutMilliseconds: 60000     maxLifetimeMilliseconds: 1800000     maxPoolSize: 50 shardingRule:   tables:     t_order:       actualDataNodes: ds_${0..1}.t_order_${0..1}       tableStrategy:         inline:           shardingColumn: order_id           algorithmExpression: t_order_${order_id % 2}       keyGeneratorColumnName: order_id     t_order_item:       actualDataNodes: ds_${0..1}.t_order_item_${0..1}       tableStrategy:         inline:           shardingColumn: order_id           algorithmExpression: t_order_item_${order_id % 2}       keyGeneratorColumnName: order_item_id   bindingTables:     - t_order,t_order_item   defaultDatabaseStrategy:     inline:       shardingColumn: user_id       algorithmExpression: ds_${user_id % 2}   defaultTableStrategy:     none:   defaultKeyGeneratorClassName: io.shardingsphere.core.keygen.DefaultKeyGenerator

schemaName字段:   表示在连接sharding-proxy的时候看到的db的name

mysql> show databases; +-------------+ | Database    | +-------------+ | sharding_db | +-------------+

dataSource字段:   表示该schema下真实的库有哪些,并且给出每个db的url\user\pwd等连接方法

shardingRule:      分库分表的规则,上面例子的意思就是根据userid分库,根据orderid分表。 userid是双数,数据插入到ds0库中,userid是单数则数据插入到ds1库中。然后根据orderid确定写哪个表,orderid是单数,写到torder0表中,orderid是双数,写到torder_1表中

server.yaml

authentication:   username: root   password: root props:   max.connections.size.per.query: 1   acceptor.size: 16  # The default value is available processors count * 2.   executor.size: 16  # Infinite by default.   proxy.frontend.flush.threshold: 128  # The default value is 128.     # LOCAL: Proxy will run with LOCAL transaction.     # XA: Proxy will run with XA transaction.     # BASE: Proxy will run with B.A.S.E transaction.   proxy.transaction.type: LOCAL   proxy.opentracing.enabled: false   sql.show: false

改配置主要是注册中心、认证信息以及公用属性等信息

更多其他配置可以参考官方文档: https://shardingsphere.apache.org/document/current/cn/manual/sharding-proxy/configuration/

MySQL

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何减小机器学习模型的大小
下一篇:中科大研二学生,深度学习放弃,浅度学习入门!?
相关文章