pgspider Citu 副本以及节点移除简单学习

使用citus 使用副本配置对于灾备处理是比较重要的,以下是一个简单的学习

环境准备

使用docker-compose运行

  • docker-compose 文件
version: "3"
services: 
  graphql-engine:
    image: hasura/graphql-engine:v1.1.0
    ports:
    - "8080:8080"
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:[email protected]:5432/postgres
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
      HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
  pg-citus-master:
    container_name: pg-citus-master
    image: dalongrong/pgspider:citus-9.1
    volumes: 
    - "./csvfiles:/opt/csv"
    - "./sql:/docker-entrypoint-initdb.d/"
    ports: 
    - "5432:5432"
    environment: 
    - "POSTGRES_PASSWORD=dalong"
  pg-citus-worker:
    container_name: pg-citus-worker
    image: dalongrong/pgspider:citus-9.1
    volumes: 
    - "./csvfiles:/opt/csv"
    - "./sql:/docker-entrypoint-initdb.d/"
    ports: 
    - "5433:5432"
  pg-citus-worker2:
    container_name: pg-citus-worker2
    image: dalongrong/pgspider:citus-9.1
    volumes: 
    - "./csvfiles:/opt/csv"
    - "./sql:/docker-entrypoint-initdb.d/"
    ports: 
    - "5434:5432"
  • init sql
    主要是扩展的创建
-- wrap in transaction to ensure Docker flag always visible
BEGIN;
CREATE EXTENSION citus;
COMMIT;
  • 需要的数据
    都是来自官方文档
curl https://examples.citusdata.com/tutorial/companies.csv > csvfiles/scompanies.csv
curl https://examples.citusdata.com/tutorial/campaigns.csv > csvfiles/campaigns.csv
curl https://examples.citusdata.com/tutorial/ads.csv > csvfiles/ads.csv
  • 启动
docker-compose up -d

基本citus 使用

master 节点操作,数据的导入在创建分布式表前后都可以的

  • 创建表
CREATE TABLE companies (
  id bigint NOT NULL,
  name text NOT NULL,
  image_url text,
  created_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone NOT NULL
);
?
CREATE TABLE campaigns (
  id bigint NOT NULL,
  company_id bigint NOT NULL,
  name text NOT NULL,
  cost_model text NOT NULL,
  state text NOT NULL,
  monthly_budget bigint,
  blacklisted_site_urls text[],
  created_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone NOT NULL
);
?
CREATE TABLE ads (
  id bigint NOT NULL,
  company_id bigint NOT NULL,
  campaign_id bigint NOT NULL,
  name text NOT NULL,
  image_url text,
  target_url text,
  impressions_count bigint DEFAULT 0,
  clicks_count bigint DEFAULT 0,
  created_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone NOT NULL
);
  • 添加主键
ALTER TABLE companies
  ADD PRIMARY KEY (id);
ALTER TABLE campaigns
  ADD PRIMARY KEY (id, company_id);
ALTER TABLE ads
  ADD PRIMARY KEY (id, company_id); 
  • 添加worker 节点
SELECT
  master_add_node (‘pg-citus-worker‘,
    ‘5432‘);
SELECT
  master_add_node (‘pg-citus-worker2‘,
    ‘5432‘);
  • 创建分布式表
// 配置副本数为2,因为是2个worker,为了简单,同时测试灾备
SET citus.shard_replication_factor = 2;
SELECT create_distributed_table(‘companies‘, ‘id‘);
SELECT create_distributed_table(‘campaigns‘, ‘company_id‘);
SELECT create_distributed_table(‘ads‘, ‘company_id‘);

灾备处理

前边通过membership-manager 的原理大概也就知道了,就是删除节点的分片原数据,同时删除节点。
但是需要注意数据的迁移的处理(节点添加数据的reblance 才是比较难的)

  • 停止worker2
    因为副本数为2,所以可以停止一个节点
docker-compose stop pg-citus-worker2
  • 删除分片原数据
DELETE FROM pg_dist_placement WHERE groupid = (SELECT groupid FROM pg_dist_node WHERE nodename =‘pg-citus-worker2‘ AND nodeport = ‘5432‘ LIMIT 1);
  • 移除节点
SELECT master_remove_node(‘pg-citus-worker2‘, ‘5433‘)
  • 数据查询
    如果通过数据查询,会发现业务是无感知的,而且不影响数据查询处理

说明

citus 开源版本提供了一些操作函数,我们利用这些函数还是可以方便的维护citus 集群的,如果感觉维护费事,yugabyte 以及cockroachdb
都是可选的方案,但是个人推荐yugabyte

参考资料

http://docs.citusdata.com/en/v9.2/admin_guide/cluster_management.html
https://github.com/citusdata/membership-manager/blob/master/manager.py

原文地址:https://www.cnblogs.com/rongfengliang/p/12445004.html

时间: 2024-11-04 07:26:24

pgspider Citu 副本以及节点移除简单学习的相关文章

Mongodb的副本集节点角色介绍及选举过程浅析

一个副本集ReplicaSet一般由一组mongod实例组成,这组mongod实例协调配合工作,共同向外提供高可用的数据库访问服务. 副本集中的不同节点虽然都是mongod实例,但是角色上却有不同,一般分为三种:主节点.副本节点和仲裁者节点. 主节点:负责所有的数据库写操作,默认情况下,主节点也负责处理所有的数据库读操作: 副本节点:负责同步主节点的数据操作日志更新本地数据库,从而保证副本节点的数据和主节点上的数据的一致性:副本节点的从某种意义上来讲有点像赛跑,永远在追赶主节点的数据操作: 仲裁

将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变。

2.将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变. 示例: 交换前链表的顺序             交换后链表的顺序 4→5→3→1→2   ==>  5→3→1→4→2 1 ==> 1                   (链表仅含一个元素) 2→1 ==>1→2 ==>         (链表为空) C/C++: 链表节点定义为: struct node { struct node *next; int value; };

memcached简单学习

分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性).分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制.其次是分布式管理和分布式算法,其次是缓存键值管理和路由. 原文:http://wenku.baidu.com/view/8686d46c7e21af45b307a8c3.html 什么是Memcached 许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取

队列的简单学习

/**  * 1.在Java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.  *   * Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取  * 或移除的元素.他们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常.  * 如果要使用前端而不移除该元素,使用element()或者pe

Log4j简单学习笔记

log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常用级别的划分:Debug,Info,Warn,Error,Fatal这5个级别由低到高,如果配置的级别为"INFO"那么"Debug"级别的信息则不会显示"依次类推. 示例代码: @Test public void testLevel() { log.debu

XML简单学习

XML简单概述 1.Extensible Markup language可扩展标记语言; 2.作用:具有层次性的描述有关系的数据: 体现在:描述数据关系:软件配置,以描述程序模块之间的关系: 语法介绍 1.文档声明: <?xml version="1.0" encoding="utf-8" ?> 注意编码的统一性 储存在内存中的编码格式,与解析器打开的两者统一 2.元素:element 成对标签 <label>pcdata</lable

log4j2的简单学习

log4j2的简单学习: package com.book.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; //import org.apache.commons.logging.Log; //import org.apache.commons.logging.LogFactory; //import org.apache.logging.log4j.LogManager; //import org

btrfs文件系统简单学习

1 btrfs文件系统 btrfs文件系统在生产环境应用还不多,技术还不太成熟,因此,本文仅仅简单学习. 1.1 btrfs文件系统核心特性 1)多物理卷支持:btrfs可由多个底层物理卷组成(可以是单块物理磁盘,也可以是某一分区等):支持RAID,支持联机在线热“添加”.“移除”,“修改”: 2)写时复制更新机制(CoW):复制.更新及替换指针,而非“就地”更新: 3)数据及元数据校验码:checksum ,此机制可以保证数据的可靠性; 4)支持多子卷:sub_volume; 5)快照:支持快

$.fn.extend简单学习

(function($){ /** 1. $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc(),即$.fn.abc()是对jquery扩展了一个abc方法, 那么后面你的每一个jquery实例都可以引用这个方法了.  那么你可以这样子:$("#div").abc();  2.   jQuery为开发插件提拱了两个方法,分别是:  jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法.→