6

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

 2 years ago
source link: https://www.51cto.com/article/705990.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

划水了好久,今天来跟大家分享一下如何用一台笔记本,构建一套分布式数据库的实验环境吧。我们使用docker 和 postgres xl 来完成。

各位读者老爷们扣Q上车,Let's Go!!!!

Postgres XL 简介

什么是Postgres-XL

XL的意思是:eXtensible Lattice,可以扩展的格子,即将PostgreSQL应用在多机器上的分布式数据库的形象化表达。

Postgres-XL 是一个完全满足ACID的、开源的、可方便进行水平扩展的、多租户安全的、基于PostgreSQL的数据库解决方案。

Postgres-XL 可非常灵活的应付各种负载,比如:

  • OLAP(通过MPP并行化)
  • 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)。

747a9ae70822bccad5c741951214baf77e3134.png

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

Postgres XL on Docker

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

42327ca0213d1652e35327345b67911cf873e1.png

docker-compose.yml

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

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

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

54edf3105a002e29c537894d431eebaed37d17.png

3927b59219279a746726582f896cd3d54eb7dc.png

本实验工程 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK