划水了好久,今天来跟大家分享一下如何用一台笔记本,构建一套分布式数据库的实验环境吧。我们使用docker 和 postgres 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,启动集群
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: true1.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.
如果有需要,可以开启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 = 100001.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.
实验结果
编辑搜图
编辑搜图
本实验工程 fork自 https://github.com/tiredpixel/z.2020-10-22.postgres-xl-docker,由于原镜像已设置为只读,并且执行会出一些奇奇怪怪的错误,于是我就整理了一番,项目已托管到全球最大同仁网站gayhub