文档章节

postgresql 中间件pgoneproxy支持范围(range)分库分表

harris2016
 harris2016
发布于 2016/07/21 17:35
字数 795
阅读 433
收藏 1

    今天来给大家讲解下postgresql数据库的商业中间件pgoneproxy支持范围分表的问题。这种分表的方式在很多场景中会被使用到。比如在电商,电信等行业,需要把每个月的数据存放到不同的月份,就可以使用range这个功能。

    先看看针对一级分表的情况下的配置情况:

[
	{
        "table":"trange",
        "pkey" : "id",
        "type" : "int",
        "method": "range",
        "partitions":
        [
           {"suffix":"_100", "value": "100", "group":"data1"}, 
           {"suffix":"_1000", "value":"1000", "group":"data1"}
        ]  

  }
]

上面配置的含义是:id<100的存放到trange_100这张表中,id >=100并且id < 1000的数据存放到trange_1000的表中。

如果需要根据时间来配置范围,则需要修改type为timestamp。再修改value为对应的时间即可。

在很多场景中需要二级分表,比如在电商行业中,需要把用户编号为0结尾的用户在7月份产生的订单放到以_0_201607结尾的表中。下面讲解的例子没有以这种场景来讲解,举了用户注册信息的例子,同样按照用户编号和年份分割。配置如下所示:

[
  {
        "table" :"bigrange",
        "pkey"  : "id",
        "type"  : "int",
        "method" : "crc32",
        "partitions" :
         [
            {"suffix":"_0", "group":"data1"},
            {"suffix":"_1", "group":"data1"}
         ],
        "subpkey":"tt",
        "subtype":"timestamp",
        "submethod":"range",
        "subpartitions":
        [
           {"suffix":"_2015", "value":"2015-01-01 00:00:00"},
           {"suffix":"_2016", "value":"2016-01-01 00:00:01"}
        ]
  }
]

通过上面的配置来创建bigrange 表,则可以得到如下所示的表:

pgbench=> \dt;
              List of relations
 Schema |       Name       | Type  |  Owner   
--------+------------------+-------+----------
 public | bigrange_0_2015  | table | db_user
 public | bigrange_0_2016  | table | db_user
 public | bigrange_1_2015  | table | db_user
 public | bigrange_1_2016  | table | db_user

    根据配置是需要把在2015-01-01 00:00:00以前的用户放到bigrange_0_2015或者bigrang_1_2015的两张表中。在2015-01-01 00:00:01~2016-01-01 00:00:01注册的用户存放到bigrange_0_2016, bigrange_1_2016的两张表中。

下面是简单的操作bigrange表的情况:

pgbench=> create table bigrange(id int, name varchar(32), age int, tt timestamp);
CREATE 0
pgbench=> insert into bigrange(id, name, age, tt) values(0, 'name0', 100, '2013-01-01 00:00:01');
INSERT 0 1
pgbench=> insert into bigrange(id, name, age, tt) values(1, 'name1', 100, '2014-01-01 00:00:01');
INSERT 0 1
pgbench=> insert into bigrange(id, name, age, tt) values(2, 'name2', 102, '2015-01-01 00:00:00');
INSERT 0 1
pgbench=> insert into bigrange(id, name, age, tt) values(3, 'name3', 103, '2016-01-01 00:00:00');
INSERT 0 1
pgbench=> insert into bigrange(id, name, age, tt) values(4, 'name4', 104, '2017-01-01 00:00:00');
ERROR:  Partitioned tables should choose at least one partition!
pgbench=> insert into bigrange(id, name, age, tt) values(4, 'name4', 104, '2015-01-01 03:00:00');
INSERT 0 1
pgbench=> select * from bigrang_0_2015;
ERROR:  relation "bigrang_0_2015" does not exist
LINE 1: select * from bigrang_0_2015;
                      ^
pgbench=> \dt;
              List of relations
 Schema |       Name       | Type  |  Owner   
--------+------------------+-------+----------
 public | bigrange_0_2015  | table | db_user
 public | bigrange_0_2016  | table | db_user
 public | bigrange_1_2015  | table | db_user
 public | bigrange_1_2016  | table | db_user
(4 rows)

pgbench=> select * from bigrange_0_2015;
 id | name  | age |         tt          
----+-------+-----+---------------------
  0 | name0 | 100 | 2013-01-01 00:00:01
(1 row)

pgbench=> select * from bigrange_1_2015;
 id | name  | age |         tt          
----+-------+-----+---------------------
  1 | name1 | 100 | 2014-01-01 00:00:01
(1 row)

pgbench=> select * from bigrange_0_2016;
 id | name  | age |         tt          
----+-------+-----+---------------------
  2 | name2 | 102 | 2015-01-01 00:00:00
  4 | name4 | 104 | 2015-01-01 03:00:00
(2 rows)

pgbench=> select * from bigrange_1_2016;
 id | name  | age |         tt          
----+-------+-----+---------------------
  3 | name3 | 103 | 2016-01-01 00:00:00
(1 row)

更多请访问平民软件的官方网站。

© 著作权归作者所有

harris2016
粉丝 10
博文 54
码字总数 30661
作品 0
杭州
程序员
私信 提问
加载中

评论(1)

qwfys
qwfys
不错。
知数堂首次PG公开课:一招玩转Sharding

点击关注了解更多精彩内容 10月25日(今晚)公开课 《PostgreSQL中基于FDW的Sharding方案》 分享嘉宾:董红禹(MySQL/PostgreSQL DBA) 分享时间:10月25日(本周四),20:30 分享主题: FDW(...

老叶茶馆_
2018/10/25
0
0
本周推荐:MySQL、PostgreSQL没有更好,只看选择

点击上方蓝色字关注我们~ DB界谜题 MySQL好 or PostgreSQL好? 通过以下两场公开课 看老司机们分享的MySQL、PostgreSQL 或许没有谁更好的答案 只是关乎于选择 选择了,那就是千般好 MySQL公开...

老叶茶馆_
2018/10/26
0
0
PostgreSQL 类微博FEED系统 - 设计与性能指标

标签 PostgreSQL , feed , 微博 , 推送 , 分区 , 分片 , UDF , 挖掘 , 文本挖掘 背景 类微博系统,最频繁用到的功能: 之前写过一篇《三体高可用PCC大赛 - facebook微博 like场景 - 数据库设...

德哥
2018/04/18
0
0
ShardingSphere即将支持PostgreSQL代理

作者简介 张永伦,京东数科高级软件工程师,Apache ShardingSphere(Incubating) PPMC。长期从事分布式系统的高可用、高并发相关工作。热衷于网络IO、性能优化方面的技术挑战。目前专注于Sha...

PostgreSQL中文社区
04/16
0
0
DBGeeK数据库技术沙龙(4月杭州站)

活动主题:DBGeeK+PG数据库技术沙龙(杭州站) 活动时间:2017年4月8日(周六全天)PS:本次活动午餐将由社区为参加活动的小伙伴们提供自助午餐,名额有限,先到先得哦~ 活动地点:下城区庆春...

DBGeeK社群
2017/03/07
84
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux的基本命令

目录的操作命令(增删改查) 增: mkdir 目录名称; 查: ls 可以看到该目录下的所有的目录和文件 ls -a,可以看到该目录下的所有文件和目录,包括隐藏的 ls -l,可以看到该目录下的所有目录和...

凹凸凸
今天
2
0
在古老unix中增加新用户

Installing 4.3 BSD Quasijarus on SIMH 目标:要在4.3BSD中新增加用户dmr,指定目录/home/dmr,uid为10 gid=31(guest组,系统已建立) 4.3BSD还没有adduser或useradd 直接修改/etc/passwd...

wangxuwei
今天
2
0
Bootstrap(六)表单样式

基本样式 所有设置了 .form-control 类的 <input>、<textarea> 和 <select> 元素都将被默认设置宽度属性为 width: 100%;。 将 label 元素和前面提到的控件包裹在 .form-group 中可以获得最好...

ZeroBit
昨天
3
0
SSL 证书格式转换

SSL 证书格式转换 不同服务器情况下,需要不同的证书格式。 比如 pem 转 pfx。 pem在window 平台下可以导入,但是无法正常使用。 需要转换成pfx。 推荐在线转换工具,由中国数字证书网站提供...

DrChenXX
昨天
2
0
HAProxy

xx

Canaan_
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部