百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Greenplum集群主机名问题及修复

bigegpt 2024-09-09 01:24 4 浏览

昨天写了一篇Greenplum数据仓库迁移小记,看起来一起都在计划中,一切都在掌握中,今天早上的时候,统计组的同学反馈说写入GP的时候报了下面的错误。

看到这个错误,其实我的内心是很平静的,因为看起来明显是配置的问题。首先集群能够正常启动,其次集群的节点是使用了主机名的方式。pg_hba.conf和防火墙层面都调整过了。如果有的话,看起来调整也不是难事。

根据里面的错误信息,11.20.130.28是迁移前的Master节点IP,迁移后的IP是11.21.130.28

28 Jun23:02:19ERRORInterconnect Error: Could not connect to seqserver (connection: 11, host: 11.20.130.28, port: 60221). (seg0 slice1 yz-dba-gp130-31:40000 pid=80331)

但是当我连接到环境之后,检查了所有的节点配置,依旧没有任何的发现。

业务数据的提供是有一个时间段的,如果在指定的时间段里数据出不来,对于问题的分析和处理就会有一种额外的压力。

所以看起来很简单的问题,但是我却找不到可以修改的地方。所以我的注意力主要在三个地方:

1.是segment节点的配置问题,但是pg_hba.conf没有找到这个IP的任何配置信息

2.是Master端的配置问题,但是pg_hba.conf没有找到这个IP的任何配置信息

3.是客户端连接的问题,客户端还在使用错误的IP连接,虽然逻辑不通,但是不能完全排除其他的可能因素,比如外部表的引用方式等。

所以为了快速验证这个问题,我使用了如下的方式创建了一个表,来简单验证是否是服务端出了问题。

不幸的是,抛出了类似的错误,所以根据错误,尽管在seg0抛错,在其他的segment节点也应该是类似的问题。

testDB=# create table test_sequence(id serial, name text);NOTICE: CREATE TABLE will create implicit sequence "test_sequence_id_seq" for serial column "test_sequence.id"
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
testDB=# insert into test_sequence (name) values(1);ERROR: Interconnect Error: Could not connect to seqserver (connection: 11, host: 11.20.130.28, port: 60221). (seg0 slice1 yz-dba-gp130-31:40000 pid=130100)
DETAIL: Connection timed out (connect errno 110)

这样一个错误,让我开始紧张起来。从原理上来说抛错是指向seqserver,sqlserver可以理解为一个组件,所有的Segment获取最新的Sequence都需要向Master的seqserver请求,然后seqserver更新Sequence的信息,返回给Segment。

所以顺着这个思路来看,错误应该是segment连接Master的阶段,所以错误应该需要在Master端来排查。

GP常用的数据字典gp_segment_configuration是首选,尽管我自己之前看了好几遍,这次还是照例继续核对下,没想到这一看让我开始有些慌张了,因为第1行的address字段是IP地址。

testDB=# select *from gp_segment_configuration;
 dbid | content | role | preferred_role | mode | status | port | hostname | address | replication_port | san_mounts 
------+---------+------+----------------+------+--------+-------+-----------------+-----------------+------------------+------------
 1 | -1 | p | p | s | u | 5432 | yz-dba-gp130-28 | 11.20.130.28 | | 
 2 | 0 | p | p | s | u | 40000 | yz-dba-gp130-31 | yz-dba-gp130-31 | 41000 | 
 13 | 11 | p | p | s | u | 40001 | yz-dba-gp130-32 | yz-dba-gp130-32 | 41001 | 

如此一来,整个GP集群的数据字典信息竟然有这样的配置错误,让目前的状态很是纠结。

如果重新备份和导入数据,几十TB的数据,导出和恢复都需要好几天,这还不包括业务的影响时间和范围,重新部署和搭建的代价。

否则还有什么办法呢,直接改数据字典的信息,改错了之后,整个GP集群都不可用,那么我们基本就可以歇菜了。

把服务器重新搬回原机房,估计系统部的同学会砍我。因为这个代价几乎没法衡量,同时我没法保证一切都完全可控。

我重新配置一个本地的“虚”IP,比如服务器IP是11.21.130.28.我们内部从11.20.130.28来跳转到11.21.130.28,但是显然从网络配置上就行不通。

如果我配置的是11.20.130.28_s这种字符串格式,那么还能有一些希望,目前的纯IP方式已经没有了可能。

随着时间一点一点过去,我们开始寻找各种可能性和方法。显然快速解决方法,同时保持系统稳定是主线。

Greenplum能否直接修改主机名,虽然没有完全确认,但是查看GP的一些资料,这个方法理论是可行的,至于修改之后是否可用,目前还不够明朗。

那么我们就需要测试和模拟,如果修改之后不可回退,导致GP集群不可用,那么手工修改的方式我们就可以直接放弃,否则还是可以一试的。

所以我们没有一上来就修改正式环境,先找了一个测试环境开始模拟。

初步的结论是如果配置失败,会导致集群无法启动,但是可以回退该配置。

所以有了这一个基本的基础,我们开始尝试修复。

停止GP集群。

$ gpstop -M fast
20180628:11:14:52:100415 gpstop:yz-dba-gp130-28:gpadmin-[INFO]:-Starting gpstop with args: -M fast
20180628:11:14:52:100415 gpstop:yz-dba-gp130-28:gpadmin-[INFO]:-Gathering information and validating the environment...
20180628:11:14:52:100415 gpstop:yz-dba-gp130-28:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information
20180628:11:14:52:100415 gpstop:yz-dba-gp130-28:gpadmin-[INFO]:-Obtaining Segment details from master...
下面的步骤是关键,使用如下的方式来连接到GP Master:
[gpadmin@yz-dba-gp130-28 ~]$ PGOPTIONS='-c gp_session_role=utility' psql -U gpadmin postgres
psql (8.2.15)
Type "help" for help.
开启系统表修改的设置。
postgres=# set allow_system_table_mods='dml';
SET
查看GP segment的配置:
postgres=# select *from gp_segment_configuration;
 dbid | content | role | preferred_role | mode | status | port | hostname | address | replication_port | san_mounts 
------+---------+------+----------------+------+--------+-------+-----------------+-----------------+------------------+------------
 1 | -1 | p | p | s | u | 5432 | yz-dba-gp130-28 | 11.20.130.28 | | 
 2 | 0 | p | p | s | u | 40000 | yz-dba-gp130-31 | yz-dba-gp130-31 | 41000 | 
 13 | 11 | p | p | s | u | 40001 | yz-dba-gp130-32 | yz-dba-gp130-32 | 41001 | 
开始修改该配置:
postgres=# update gp_segment_configuration set address='yz-dba-gp130-28' where dbid=1 and hostname='yz-dba-gp130-28';
UPDATE 1

整个过程很快就完成了。推出GP集群命令行,并停止GP集群。

postgres=# \q
[gpadmin@yz-dba-gp130-28 ~]$ gpstop -m

启动GP集群 gpstart -a,整个过程算是顺利完成了,我们来开启一个初步的验证。

创建一个表customers,然后插入一行数据启用自增列。

testDB=# CREATE TABLE customers 
testDB-# ( 
testDB(# customerid SERIAL primary key , 
testDB(# companyname character varying, 
testDB(# contactname character varying, 
testDB(# phone character varying, 
testDB(# country character varying 
testDB(# ) ;
NOTICE: CREATE TABLE will create implicit sequence "customers_customerid_seq" for serial column "customers.customerid"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "customers_pkey" for table "customers"
CREATE TABLE
testDB=# insert into customers(companyname,contactname,phone,country) values('a1','b1','c1','d1');
INSERT 0 1

整个验证算是通过了,后续和同事做了确认,对于其他的场景也做了一些细致的对比和测试,目前可以验证整个GP segment节点是可用的。

后续也做了一些外的补充和检查,GP集群的问题修复算是告一段落。

相关推荐

Java 泛型大揭秘:类型参数、通配符与最佳实践

引言在编程世界中,代码的可重用性和可维护性是至关重要的。为了实现这些目标,Java5引入了一种名为泛型(Generics)的强大功能。本文将详细介绍Java泛型的概念、优势和局限性,以及如何在...

K8s 的标签与选择器:流畅运维的秘诀

在Kubernetes的世界里,**标签(Label)和选择器(Selector)**并不是最炫酷的技术,但却是贯穿整个集群管理与运维流程的核心机制。正是它们让复杂的资源调度、查询、自动化运维变得...

哈希Hash算法:原理、应用(哈希算法 知乎)

原作者:Linux教程,原文地址:「链接」什么是哈希算法?哈希算法(HashAlgorithm),又称为散列算法或杂凑算法,是一种将任意长度的数据输入转换为固定长度输出值的数学函数。其输出结果通常被...

C#学习:基于LLM的简历评估程序(c# 简历)

前言在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子,感觉还挺好玩的,为了练习一下C#,我最近使用C#重写了一个。准备不同的简历:image-20250528183949844查...

55顺位,砍41+14+3!季后赛也成得分王,难道他也是一名球星?

雷霆队最不可思议的新星:一个55号秀的疯狂逆袭!你是不是也觉得NBA最底层的55号秀,就只能当饮水机管理员?今年的55号秀阿龙·威金斯恐怕要打破你的认知了!常规赛阶段,这位二轮秀就像开了窍的天才,直接...

5分钟读懂C#字典对象(c# 字典获取值)

什么是字典对象在C#中,使用Dictionary类来管理由键值对组成的集合,这类集合被称为字典。字典最大的特点就是能够根据键来快速查找集合中的值,其键的定义不能重复,具有唯一性,相当于数组索引值,字典...

c#窗体传值(c# 跨窗体传递数据)

在WinForm编程中我们经常需要进行俩个窗体间的传值。下面我给出了两种方法,来实现传值一、在输入数据的界面中定义一个属性,供接受数据的窗体使用1、子窗体usingSystem;usingSyst...

C#入门篇章—委托(c#委托的理解)

C#委托1.委托的定义和使用委托的作用:如果要把方法作为函数来进行传递的话,就要用到委托。委托是一个类型,这个类型可以赋值一个方法的引用。C#的委托通过delegate关键字来声明。声明委托的...

C#.NET in、out、ref详解(c#.net framework)

简介在C#中,in、ref和out是用于修改方法参数传递方式的关键字,它们决定了参数是按值传递还是按引用传递,以及参数是否必须在传递前初始化。基本语义对比修饰符传递方式可读写性必须初始化调用...

C#广义表(广义表headtail)

在C#中,广义表(GeneralizedList)是一种特殊的数据结构,它是线性表的推广。广义表可以包含单个元素(称为原子),也可以包含另一个广义表(称为子表)。以下是一个简单的C#广义表示例代...

「C#.NET 拾遗补漏」04:你必须知道的反射

阅读本文大概需要3分钟。通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员Type类的GetMembe...

C#启动外部程序的问题(c#怎么启动)

IT&OT的深度融合是智能制造的基石。本公众号将聚焦于PLC编程与上位机开发。除理论知识外,也会结合我们团队在开发过程中遇到的具体问题介绍一些项目经验。在使用C#开发上位机时,有时会需要启动外部的一些...

全网最狠C#面试拷问:这20道题没答出来,别说你懂.NET!

在竞争激烈的C#开发岗位求职过程中,面试是必经的一道关卡。而一场高质量的面试,不仅能筛选出真正掌握C#和.NET技术精髓的人才,也能让求职者对自身技术水平有更清晰的认知。今天,就为大家精心准备了20道...

C#匿名方法(c#匿名方法与匿名类)

C#中的匿名方法是一种没有名称只有主体的方法,它提供了一种传递代码块作为委托参数的技术。以下是关于C#匿名方法的一些重要特点和用法:特点省略参数列表:使用匿名方法可省略参数列表,这意味着匿名方法...

C# Windows窗体(.Net Framework)知识总结

Windows窗体可大致分为Form窗体和MDI窗体,Form窗体没什么好细说的,知识点总结都在思维导图里面了,下文将围绕MDI窗体来讲述。MDI(MultipleDocumentInterfac...