一.背景
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行不到,咋一看有点吃力。
优点:总体结构清新;
不足之处:代码行数过多,代码层次感欠缺。
网友评论