十分钟搭建实验分布式数据库环境

十分钟搭建实验分布式数据库环境

划水了好久,今天来跟大家分享一下如何用一台笔记本,构建一套分布式数据库的实验环境吧。我们使用dockerpostgres xl 来完成。各位读者老爷们扣Q上车,Let’s Go!!!!

Postgres XL 简介

什么是Postgres-XL

XL的意思是:eXtensible Lattice,可以扩展的格子,即将PostgreSQL应用在多机器上的分布式数据库的形象化表达。Postgres-XL 是一个完全满足ACID的、开源的、可方便进行水平扩展的、多租户安全的、基于PostgreSQL的数据库解决方案。Postgres-XL 可非常灵活的应付各种负载,比如:

  • OLAP(通过MPP并行化)
  • OLTP
  • OLAP & OLTP
  • 操作数据存储
  • Key-value存储,包括JSON格式

不同的应用场景:

  • 支持商业智能应用(数据仓库&数据集市),因为PGXL支持MPP(Massively Parallel Processing)
  • Web2.0,数据库扩容的解决方案
  • 遗留系统的数据库扩容的解决方案
  • 新应用,可以先使用PostgreSQL,之后随着数据库变大使用PGXL扩容

PGXL底层为PostgreSQL,这意味着它支持所有支持PostgresSQL类型的驱动,包括:JDBC, ODBC, OLE DB, Python, Ruby, perl DBI, Tcl, and Erlang.

PostgreSQL与Postgres-XL

  • 1994年,Postgre95发布,开源。
  • 1996年,PostgreSQL继承了Postgre95,发布。
  • 2010年,Postgres-XC发布。
  • 2012年,前PGXC核心开发者创建StormDB公司,进行了一些改进,包括对MPP并行化的性能改进和多租户安全。
  • 2013年,TransLattice收购了StormDB。
  • 2014年,将项目开源,命名为Postgres-XL。

Postgres-XC与Postgres-XL

PGXL的架构师和开发者 很多都是以前做PGXC的,PGXL的部分代码是从PGXC移植过来的。比起功能性,PGXL更强调稳定性, 正确性和性能.PGXL增加了一些重要的性能提升,比如MPP和replan avoidance on the data nodes,这些都是PGXC没有的。PGXC目前集中在OLTP的业务上面,PGXL则更加灵活,可以应用于很多不同种类的业务上,比如可以用在大数据处理领域,除此,在多租户的环境中,PGXL也更加安全。PGXL的社区非常开放。

架构

GXL有三个主要组件,分别是GTM,Coordinator(CN)和Datanode(DN)。GTM(Gloable Transaction Manager)负责提供事务的ACID属性;Datanode负责存储表的数据和本地执行由Coordinator派发的SQL任务;Coordinator负责处理每个来自Application的SQL任务,并且决定由哪个Datanode执行,然后将任务计划派发给相应的Datanode,根据需要收集结果返还给Application;

Postgres XL on Docker

我们采用一个GTM,2台CN,2台DN,结构如下图所示:

docker-compose.yml

配置文件如下所示,执行 docker-compose up,启动集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
version: "3"  
services:
  db_gtm_1:
    environment:
      - PG_HOST=0.0.0.0
      - PG_NODE=gtm_1
      - PG_PORT=6666
#      - PG_PASSWORD=dafei1288
    build: .
#    image: z_db_gtm_1
    command: docker-cmd-gtm
    entrypoint: docker-entrypoint-gtm
    volumes:
      - db_gtm_1:/var/lib/postgresql
    networks:
      - db_a
    healthcheck:
      test: ["CMD", "docker-healthcheck-gtm"]
  db_coord_1:
    ports:
      - "25432:5432"
    environment:
      - PG_GTM_HOST=db_gtm_1
      - PG_GTM_PORT=6666
      - PG_HOST=0.0.0.0
      - PG_NODE=coord_1
      - PG_PORT=5432
#      - PG_PASSWORD=dafei1288
    build: .
#    privileged: true
#    image: z_db_coord_1
    command: docker-cmd-coord
    entrypoint: docker-entrypoint-coord
    volumes:
      - db_coord_1:/var/lib/postgresql
    depends_on:
      - db_gtm_1
    networks:
      - db_a
      - db_b
    healthcheck:
      test: ["CMD", "docker-healthcheck-coord"]
  db_coord_2:
    ports:
      - "25433:5432"
    environment:
      - PG_GTM_HOST=db_gtm_1
      - PG_GTM_PORT=6666
      - PG_HOST=0.0.0.0
      - PG_NODE=coord_2
      - PG_PORT=5432
#      - PG_PASSWORD=dafei1288
    build: .
#    privileged: true
#    image: z_db_coord_2
    command: docker-cmd-coord
    entrypoint: docker-entrypoint-coord
    volumes:
      - db_coord_2:/var/lib/postgresql
    depends_on:
      - db_gtm_1
    networks:
      - db_a
      - db_b
    healthcheck:
      test: ["CMD", "docker-healthcheck-coord"]
  db_data_1:
    ports:
      - "25434:5432"
    environment:
      - PG_GTM_HOST=db_gtm_1
      - PG_GTM_PORT=6666
      - PG_HOST=0.0.0.0
      - PG_NODE=data_1
      - PG_PORT=5432
#      - PG_PASSWORD=dafei1288
    build: .
#    image: z_db_data_1
    command: docker-cmd-data
    entrypoint: docker-entrypoint-data
    depends_on:
      - db_gtm_1
    volumes:
      - db_data_1:/var/lib/postgresql
    networks:
      - db_a
    healthcheck:
      test: ["CMD", "docker-healthcheck-data"]
  db_data_2:
    ports:
      - "25435:5432"
    environment:
      - PG_GTM_HOST=db_gtm_1
      - PG_GTM_PORT=6666
      - PG_HOST=0.0.0.0
      - PG_NODE=data_2
      - PG_PORT=5432
#      - PG_PASSWORD=dafei1288
    build: .
#    image: z_db_data_2
    command: docker-cmd-data
    entrypoint: docker-entrypoint-data
    depends_on:
      - db_gtm_1
    volumes:
      - db_data_2:/var/lib/postgresql
    networks:
      - db_a
    healthcheck:
      test: ["CMD", "docker-healthcheck-data"]
  pgpool:
#    image: smirart/pgpool:latest
    image: postdock/pgpool:latest
    ports:
      - "8686:8686"
      - "8687:5432"
      - "8688:9898"
#    environment:
#      - PG_PASSWORD=dafei1288
    volumes:
      - ./pgpool.conf:/var/pgpool_configs/pgpool.conf
    restart: always
    networks:
      - db_b
volumes:
  db_gtm_1: {}
  db_coord_1: {}
  db_coord_2: {}
  db_data_1: {}
  db_data_2: {}
networks:
  db_a:
    internal: true
  db_b:
    internal: true

如果有需要,可以开启gppool,也可以注释掉,不影响使用

pgpool.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
listen_addresses = '*'  
port = 5432
# pool_passwd = 'dafei1288'
socket_dir = '/tmp'


pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
listen_backlog_multiplier = 2
serialize_accept = off

replication_mode = on
load_balance_mode = on

backend_hostname0 = 'db_coord_1'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data0'
backend_flag0 = 'ALWAYS_MASTER'

backend_hostname1 = 'db_coord_2'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data1'
backend_flag1 = 'ALLOW_TO_FAILOVER'



health_check_period0 = 0
health_check_timeout0 = 20
health_check_user0 = '_healthcheck'
health_check_password0 = ''
health_check_database0 = ''
health_check_max_retries0 = 0
health_check_retry_delay0 = 1
connect_timeout0 = 10000

实验结果



本实验工程 fork自 https://github.com/tiredpixel/z.2020-10-22.postgres-xl-docker,由于原镜像已设置为只读,并且执行会出一些奇奇怪怪的错误,于是我就整理了一番,项目已托管到全球最大同仁网站gayhub,网址如下:

https://github.com/dafei1288/postgres-xl-docker

参考列表

https://blog.csdn.net/yeruby/article/details/49004329
https://github.com/tiredpixel/z.2020-10-22.postgres-xl-docker