zoukankan      html  css  js  c++  java
  • docker部署sharding-proxy

    1、背景

         Sharding-proxy定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供PostgreSQL版本,它可以使用任何兼容PostgreSQL协议的访问客户端(如:PostgreSQL Command Client, Navicat等)操作数据,对DBA更加友好。

    • 向应用程序完全透明,可直接当做PostgreSQL使用。
    • 适用于任何兼容MySQL/PostgreSQL协议的的客户端。

    2、安装docker,这一步没什么可讲的

    3、制作sharding proxy镜像

        先制作配置文件:config-sharding.yaml  主要分片所用,文末

    schemaName: sharding_db
    
    dataSources:
      ds0: 
        url: jdbc:postgresql://127.0.0.1:5432/ds0
        username: postgres
        password: 123456
        connectionTimeoutMilliseconds: 30000
        idleTimeoutMilliseconds: 60000
        maxLifetimeMilliseconds: 1800000
        maxPoolSize: 65
      ds1:
        url: jdbc:postgresql://127.0.0.1:5432/ds1
        username: postgres
        password: 123456
        connectionTimeoutMilliseconds: 30000
        idleTimeoutMilliseconds: 60000
        maxLifetimeMilliseconds: 1800000
        maxPoolSize: 65
    
    shardingRule:
      tables:
        t_order: 
          actualDataNodes: ds${0..1}.t_order${0..1}
          databaseStrategy:
            inline:
              shardingColumn: user_id
              algorithmExpression: ds${user_id % 2}
          tableStrategy: 
            inline:
              shardingColumn: order_id
              algorithmExpression: t_order${order_id % 2}
          keyGenerator:
            type: SNOWFLAKE
            column: order_id
        t_order_item:
          actualDataNodes: ds${0..1}.t_order_item${0..1}
          databaseStrategy:
            inline:
              shardingColumn: user_id
              algorithmExpression: ds${user_id % 2}
          tableStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: t_order_item${order_id % 2}
          keyGenerator:
            type: SNOWFLAKE
            column: order_item_id
      bindingTables:
        - t_order,t_order_item
      defaultTableStrategy:
        none:
        
      encryptRule:
        encryptors:
          encryptor_aes:
            type: aes
            props:
              aes.key.value: 123456abc
        tables:
          t_order:
            columns:
              order_id:
                plainColumn: order_plain
                cipherColumn: order_cipher
                encryptor: encryptor_aes

    以上配置文件主要分三块:schemaName、dataSources、shardingRule

    schemaName定义sharding proxy数据库名;

    DataSource  定义数据源,可以添加多个,每个数据源;

    shardingRule定义分片规则。

    由示例得知待分片的库为ds0和ds1,每个库分片的逻辑表为t_order和t_order_item俩个表,表分片规则都是order_id % 2,所以每个库有4张真实表,需要提前在postgres建好库和表:t_order_0, t_order_1, t_order_item_0, t_order_item_1,库分片规则为user_id % 2。

    制作server.yaml文件,改文件是通用配置,登录sharding peoxy的一些信息

    authentication:
      users:
        root:
          password: root
        sharding:
          password: sharding 
          authorizedSchemas: sharding_db
    props:
      max.connections.size.per.query: 1
      acceptor.size: 16 
      executor.size: 16 
      proxy.transaction.enabled: false
      proxy.opentracing.enabled: false
      sql.show: true

    编写dockerfile

    FROM sharding-proxy
    
    ADD config-sharding.yaml /opt/sharding-proxy/conf/config-sharding.yaml
    ADD server.yaml  /opt/sharding-proxy/conf/server.yaml

    制作镜像

    docker build -t sharding-proxy:v1 .

    4、制作postgresql镜像,并初始化数据库

    由上面配置文件config-sharding.yaml可知,pgsql需要先建2个库 ds0  ds1,且每个库有4张真实表,需要提前在postgres建好库和表:t_order_0, t_order_1, t_order_item_0, t_order_item_1

    编写初始化数据库的shell脚本

    #!/bin/bash
    
    dbname=ds0
     
    # sql to check whether given database exist
    sql1="select count(1) from pg_catalog.pg_database where datname = '$dbname'"
     
    # depending on how PATH is set psql may require a fully qualified path
    cmd="psql -t -c "$sql1""
     
    db_exists=`eval $cmd`
     
    if [ $db_exists -eq 0 ] ; then
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
        CREATE DATABASE ds0;
        CREATE DATABASE ds1;
        c ds0;
          CREATE TABLE t_order_0( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10)); 
          CREATE TABLE t_order_1( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10));
          CREATE TABLE t_order_item_0( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10));
          CREATE TABLE t_order_item_1( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10));   
          c ds1;
          CREATE TABLE t_order_0( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10)); 
          CREATE TABLE t_order_1( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10));
          CREATE TABLE t_order_item_0( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10));
          CREATE TABLE t_order_item_1( order_id INT NOT NULL, user_id  INT  NOT NULL, status   CHAR(10));    
    EOSQL
    fi

    编写dockerfile

    FROM 10.1.11.71/onlineshop/postgres:9.4 
    
    ADD init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh

    制作镜像

    docker build -t postfres:9.4.1

    5、启动镜像

    docker run -id -d -e POSTGRES_PASSWORD=123456 -p 5432:5432  postgres:9.4.2
    docker run -it -d -p 3307:3307 -v /root/sharding-proxy/config-sharding.yaml:/opt/sharding-proxy/conf/config-sharding.yaml sharding-proxy:v1

    6、连接测试

    连接pgsql 查看默认库和表是否创建完成

     连接sharding proxy,nacicat暂时连不上 不知道为什么,用pgsql cli连是可以的

      

    psql -U sharding_db  -h postgres -p 3307

    插入数据测试

    在sharding proxy容器日志里查看到数据具体插入到哪个库哪个表

    分别到ds0 ds1查数据看看

    在sharding proxy里直接查询

  • 相关阅读:
    老李分享:qtp自动化测试框架赏析-关键字自动化测试框架
    QTP自动化测试培训:描述编程之WebElement
    测试开发Python培训:自动发布新浪微博-技术篇
    老李分享:开发python的unittest结果输出样式
    布隆过滤器
    缓存击穿、缓存穿透、缓存雪崩
    JVM锁优化
    Java 异常体系
    常用的SQL调优
    Mysql 索引
  • 原文地址:https://www.cnblogs.com/zphqq/p/12504859.html
Copyright © 2011-2022 走看看