惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - 勤劳の洗碗机

pyinstaller打包exe故障解析 curl 访问k8s api k8s 之HPA应用 statefulset 及storageclass hadoop 伪分布式 完全分布式 及HA部署 LDAP部署及实践 docker 制作自己的mysql镜像 k8s 压测工具之perf-test mysql相关(三)、主从复制 shell执行mysql脚本 分布式minio image-syncer 误删libc.so.6文件补救 docker 使用bind 动态扩容pvc k8s备份工具之velero jmeter使用 docker 制作ssh镜像 docker 制作自定义的nginx镜像
docker部署sharding-proxy
勤劳の洗碗机 · 2020-03-16 · via 博客园 - 勤劳の洗碗机

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里直接查询