美文网首页数据库
greenplum源码阅读(1):gpstart命令

greenplum源码阅读(1):gpstart命令

作者: sinwaj | 来源:发表于2019-08-17 21:58 被阅读17次

一.背景

greenplum数据库的启动,经常是通过gpstart 命令启动,通过对该命令源文件的阅读加深理解。

二 .文件位置

gpstart是python代码实现。

三.流程说明

1.主要函数 

1.1代码入口

if __name__ =='__main__':

simple_main(GpStart.createParser, GpStart.createProgram)

包含如下2个静态函数:

  GpStart.createParser:解析命令中的参数

  GpStart.createProgram:实例化GpStart类

1.2 GpStart 的构造函数

__init__方法,在实例化GpStart类时会赋值启动参数,具体说明以后再研究。 因为一般启动都是gpstart ,然后输入就可以启动数据库。

1.3 GpStart的run方法

 该函数包含了整个启动过程。

2.主要流程

2.1准备动作 self._prepare()

def _prepare(self):

logger.info("Gathering information and validating the environment...")

//从环境变量获取GPHOME,master_datadir,检查用户是否有启动权限(gpadmin用户,其他用户没有权限);读取postgresql.conf信息到内存

self._basic_setup()

//检查软件版本和master_datadir的目录版本是否兼容

self._check_version()

//通过self.master_datadir +'/postmaster.pid'是否存在,检查master节点是否已经启动

self._check_master_running()

//创建协调节点的pg_log目录,该目录记录对数据的软件操作日志

if not os.path.exists(self.master_datadir +'/pg_log'):

os.mkdir(self.master_datadir +'/pg_log')

2.2 是否只启动master节点

# MPP-13700

if self.masteronly:

    if os.getenv('GPSTART_INTERNAL_MASTER_ONLY'):

.....

2.3 启动master节点

self._startMaster()

logger.info("Master Started...")

2.4 检查master和segments的字典一致性

if self.skip_heap_checksum_validation:

self.master_checksum_value =None

    logger.warning("Because of --skip-heap-checksum-validation, the GUC for data_checksums "

                      "will not be checked between master and segments")

else:

num_workers = min(len(self.gparray.get_hostlist()),self.parallel)

self.master_checksum_value = HeapChecksum(gparray=self.gparray,num_workers=num_workers,

logger=logger).get_master_value()

2.5 恢复segments

# Do we have an even-number of recovered segments ?

if len(self.gparray.recoveredSegmentDbids) >0 and len(self.gparray.recoveredSegmentDbids) %2 ==0:

logger.info("Master start noticed recovered segments, updating configuration to rebalance.")

self.gparray.updateRoleForRecoveredSegs(self.dburl)

logger.info("Re-obtaining updated segment details from master...")

self.gparray = GpArray.initFromCatalog(self.dburl,utility=True)

2.6 检查standby协调节点

if not self.skip_standby_check:

self._check_standby_activated()

else:

logger.info("Skipping Standby activation status checking.")

2.7 检查空间文件一致性

filespace_configured = is_filespace_configured()

inconsistent_filespace =False

if filespace_configured:

# Check for filespace consistency

    if not CheckFilespaceConsistency(self.gparray, FileType.TRANSACTION_FILES).run()or \

not CheckFilespaceConsistency(self.gparray, FileType.TEMPORARY_FILES).run():

logger.error('Filespaces are inconsistent. Abort Greenplum Database start.')

inconsistent_filespace =True

2.8 master启动总览

if self.interactive:

self._summarize_actions(segmentsToStart)

if not userinput.ask_yesno(None,"\nContinue with Greenplum instance startup",'N'):

raise UserAbortedException()

2.9 启动计算节点

success =self._start(segmentsToStart, invalidSegments)

2.10 启动数据库监控

if dca.is_dca_appliance():

logger.info("Initializing DCA settings")

dca.DcaGpdbInitialized.local()

logger.info("DCA settings initialized")

三.总结

代码900行不到,咋一看有点吃力。

优点:总体结构清新;

不足之处:代码行数过多,代码层次感欠缺。

四.相关链接

greenplum源码阅读(2):gpstop命令

相关文章

网友评论

    本文标题:greenplum源码阅读(1):gpstart命令

    本文链接:https://www.haomeiwen.com/subject/ggaksctx.html