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

