GBase 8a
适配迁移
文章

GBase8a 集群 V953 版本修改IP地址脚本。

发表于2024-02-27 17:10:46192次浏览0个评论

1、本脚本适用于V953集群修改IP地址,本来用于ZH项目集群搬迁。

     ZH项目计划采用移动硬盘方式进行集群搬迁,即将原集群数据备份至移动硬盘,在新的集群节点进行恢复,随后修改IP恢复集群服务。

     故此脚本依赖集群列表配置文件(server_restore.lst),该文件记录个节点的角色(coor、data 或 所属vc),节点编号、以及新旧节点对应关系。

     该脚本也可独立运行,可手工编写该配置文件,配置文件格式参考如下:

#cluster_name node_type sync_type node_no  old_ip  source_path   target_path  new_ip  
kane	coor	local	c1	192.168.59.41	data	/opt	192.168.59.141
kane	coor	local	c2	192.168.59.42	data	/opt	192.168.59.142
kane	coor	local	c3	192.168.59.43	data	/opt	192.168.59.143
kane	vc1	local	d1	192.168.59.43	data	/opt	192.168.59.143
kane	vc1	local	d2	192.168.59.53	data1	/opt	192.168.59.153
kane	vc1	local	d3	192.168.59.44	data	/opt	192.168.59.144
kane	vc1	local	d4	192.168.59.54	data1	/opt	192.168.59.154
kane	vc2	local	d1	192.168.59.41	data	/opt	192.168.59.141
kane	vc2	local	d2	192.168.59.51	data1	/opt	192.168.59.151
kane	vc2	local	d3	192.168.59.42	data	/opt	192.168.59.142
kane	vc2	local	d4	192.168.59.52	data1	/opt	192.168.59.152
kane	vc3	local	d1	192.168.59.45	data	/opt	192.168.59.145
kane	vc3	local	d2	192.168.59.55	data1	/opt	192.168.59.155

2、修改之前要求已经刷新过gcware快照。

3、脚本依赖节点之间互信,请确认已配置完毕gbase用户互信。

4、修改步骤:

     4.1、 先根据配置文件,生成新旧IP地址对应的nodeid;

     4.2、按照节点类型,生成针对每个节点的修改脚本;

     4.3、将脚本推送至相应节点,执行修改操作;

     4.4、修改完成后即可启动集群。

 

完整脚本代码如下:

#!/bin/bash

# 需要修改的内容:
# 
# # home 
# /home/gbase/.gbase_profile  本机地址
# 
# # gcware
# /opt/*/gcware_profile         本机地址 
# /opt/*/gcware/config/gcware.conf     管理节点地址
# /opt/*/gcware/config/gcware_mmonit.conf     本机地址
# /opt/*/gcware/config/gcware_mmonit.conf     本机地址
# /opt/*/gcware/data/gcware/SNAPSHOT*/members     管理节点地址、NODEID
# /opt/*/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATACLUSTERSTATE    数据节点NODEID (可能为负数,int范围内)
# /opt/*/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATASERVER			 数据节点地址、NODEID (均为正数)
# /opt/*/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DISTRIBUTION        数据节点NODEID(均为正数)
# 
# # coor 
# /opt/*/gbase_profile         本机地址 
# /opt/*/gcluster/config/cluster_common.cnf			所有节点地址、本机NODEID
# /opt/*/gcluster/config/gbase_8a_gcluster.cnf		管理节点地址
# /opt/*/gcluster/config/gcmmonit.conf				本机地址/本机其他地址
# /opt/*/gcluster/config/gcmonit.conf				    本机地址/本机其他地址、gbase_本机地址/其他地址、syncserver_本机地址/其他地址
# 
# # data
# /opt/*/gbase_profile         本机地址 
# /opt/*/gcluster/config/cluster_common.cnf			所有节点地址
# /opt/*/gcluster/config/gbase_8a_gbase.cnf		    本机地址
# /opt/*/gcluster/config/gcmmonit.conf				本机地址/本机其他地址
# /opt/*/gcluster/config/gcmonit.conf				    本机地址/本机其他地址、gbase_本机地址/其他地址、syncserver_本机地址/其他地址


wd=$(cd `dirname $0` && pwd)
tmpdir=${wd}/tmp

if [ ! -d ${tmpdir} ]
then
	mkdir -p ${tmpdir}
fi

get_node_id()
{
	ip=(`echo $1| sed 's/\./ /g'`)
	#echo ${ip[@]}
	sum=0
	for i in 0 1 2 3
	do

		t=${ip[i]}
		sum=$((sum+(t<<(8*i))))

	done
	
	echo $sum

}

gen_new_list()
{
	echo "Calculating node id ..."
	i=0
	> ${wd}/new_ip_list.txt
	while read cluster_name node_type rsync_type node_name source_ip source_path target_path target_ip 
	do
		old_id=`get_node_id ${source_ip}`            # 原nodeid, 正数 
		new_id=`get_node_id ${target_ip}`            # 新nodeid, 正数 
		hostname=`ssh -n ${target_ip} hostname`

		old_id_m=-$((2**32-old_id))                  # 原nodeid,负数 
		new_id_t=$((2**32-new_id))                   
		if [ ${new_id_t} -lt ${new_id} ]
		then
			new_id_m="-${new_id_t}"              # 新nodeid,int值,可能正或负,用于 DATACLUSTERSTATE
		else
			new_id_m=${new_id}
		fi

		#echo -e "${cluster_name}\t${node_type}\t${node_name}\t${source_ip}\t${old_id}\t$((2**32-old_id))\t${target_ip}\t${new_id}\t$((2**32-new_id))\t${hostname}" >> ${wd}/new_ip_list.txt
		echo -e "${cluster_name}\t${node_type}\t${node_name}\t${source_ip}\t${old_id}\t${old_id_m}\t${target_ip}\t${new_id}\t${new_id_m}\t${hostname}" >> ${wd}/new_ip_list.txt

		i=$((i+1))
		if [ $((i%10)) -eq 0 ]
		then
			echo "${i} nodes calculate over."
		fi

	done < ${wd}/server_restore.lst
	#done < ${wd}/../server_restore.lst
	echo "All ${i} nodes calculate over."

}

do_replace()
{

	while read cluster_name node_type node_name old_ip old_id old_id_m new_ip new_id new_id_m hostname
	do
		scp ${tmpdir}/replace_ip_${node_type}_${node_name}_${old_ip}_to_${new_ip}.sh ${new_ip}:/tmp < /dev/null
		ssh ${new_ip} "sh /tmp/replace_ip_${node_type}_${node_name}_${old_ip}_to_${new_ip}.sh" < /dev/null
		
		echo "Replace DONE on ${node_type} ${node_name} ${new_ip}. "

	done < ${wd}/new_ip_list.txt

}

make_shell()
{


	# Loop layer 1 : nodes 
	while read cluster_name node_type node_name old_ip old_id old_id_m new_ip new_id new_id_m hostname
	do
		#echo "Making scripts for ${node_type}-${node_name}: ${old_ip} ..."

		filename=${tmpdir}/replace_ip_${node_type}_${node_name}_${old_ip}_to_${new_ip}.sh 
		#echo "${node_type} ${node_name} ${old_ip} ${old_id} -${old_id_m} ${new_ip} ${new_id} -${new_id_m} ${hostname} ${filename}"
		> ${filename}


		### 1、Only replace local 
		echo "# 1、 local IP" >> ${filename}

		# 1.1 profile
		echo "sed -i 's/\<${old_ip}\>/${new_ip}/g' /home/gbase/.gbase_profile" >> ${filename}
		echo "sed -i 's/\<${old_ip}\>/${new_ip}/g' /opt/${new_ip}/gbase_profile" >> ${filename}

		# 1.2 gcware_profile 、gcware_monit/mmonit
		if [ "${node_type}" == "coor" ]
		then
			echo "sed -i 's/\<${old_ip}\>/${new_ip}/g' /opt/${new_ip}/gcware_profile" >> ${filename}
			echo "sed -i 's/\<${old_ip}\>/${new_ip}/g' /opt/${new_ip}/gcware/config/gcware_mmonit.conf" >> ${filename}
			echo "sed -i 's/\<${old_ip}\>/${new_ip}/g' /opt/${new_ip}/gcware/config/gcware_monit.conf" >> ${filename}
		fi
		
		# 1.3 data gbase_8a_gbase.cnf 、synctool.conf 
		if [ "${node_type}" != "coor" ]
		then
			echo "sed -i 's/\<${old_ip}\>/${new_ip}/g' /opt/${new_ip}/gnode/config/gbase_8a_gbase.cnf" >> ${filename}
			echo "sed -i 's/\<${old_ip}\>/${new_ip}/g' /opt/${new_ip}/gnode/config/synctool.conf" >> ${filename}
		fi

		# 1.4 gc cluster_common.cnf  local NODEID 
		if [ "${node_type}" = "coor" ]
		then
			echo "sed -i 's/\<${old_id}\>/${new_id}/g' /opt/${new_ip}/gcluster/config/cluster_common.cnf" >> ${filename}
			echo "sed -i 's/\<${old_id_m}\>/${new_id_m}/g' /opt/${new_ip}/gcluster/config/cluster_common.cnf" >> ${filename}
		fi


		# Loop layer 2: contents 
		while read cluster_name_2 node_type_2 node_name_2 old_ip_2 old_id_2 old_id_m_2 new_ip_2 new_id_2 new_id_m_2 hostname_2
		do
	
			#echo "${node_type_2} ${node_name_2} ${old_ip_2} ${old_id_2} -${old_id_m_2} ${new_ip_2} ${new_id_2} -${new_id_m_2} ${hostname_2}"

			echo -e "\n#${node_type} ${node_name} ${old_ip} <---> ${node_type_2} ${node_name_2} ${old_ip_2} ${new_ip_2}" >> ${filename}

			### 2、Replace All coor IP & ID
			echo -e "\n# 2、All coor  IP & ID " >> ${filename}

			#   2.1、gcware.conf 、gbase_8a_gcluster.cnf(local & dblink)
			if [ "${node_type}" == "coor"  ] && [ "${node_type_2}" == "coor"  ]
			then
				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gcware/config/gcware.conf" >> ${filename}

				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/members" >> ${filename}
				echo "sed -i 's/\<${old_id_2}\>/${new_id_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/members" >> ${filename}
				echo "sed -i 's/\<${old_id_m_2}\>/${new_id_m_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/members" >> ${filename}

				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gcluster/config/gbase_8a_gcluster.cnf" >> ${filename}
			fi


			### 3、Replace All IP on localhost 
			echo -e "\n# 3、All IP on localhost " >> ${filename}
			#   3.1 coor  gcmonit、gcmmonit    replace also  gbase_IP syncserver_IP 
			if [ "${node_type}" == "coor"  ] && [ "${hostname}" == "${hostname_2}" ]
			then
				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gcluster/config/gcmmonit.conf" >> ${filename}
				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gcluster/config/gcmonit.conf" >> ${filename}
				echo "sed -i 's/\<gbase_${old_ip_2}\>/gbase_${new_ip_2}/g' /opt/${new_ip}/gcluster/config/gcmonit.conf" >> ${filename}
				echo "sed -i 's/\<syncserver_${old_ip_2}\>/syncserver_${new_ip_2}/g' /opt/${new_ip}/gcluster/config/gcmonit.conf" >> ${filename}
			fi

                        #   3.2 data  gcmonit、gcmmonit    replace also  gbase_IP syncserver_IP
                        if [ "${node_type}" != "coor"  ] && [ "${hostname}" == "${hostname_2}" ]
                        then
                                echo "if [ -f /opt/${new_ip}/gnode/config/gcmmonit.conf ]; then sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gnode/config/gcmmonit.conf ; fi" >> ${filename}
                                echo "if [ -f /opt/${new_ip}/gnode/config/gcmonit.conf ]; then sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gnode/config/gcmonit.conf" >> ${filename}
                                echo "sed -i 's/\<gbase_${old_ip_2}\>/gbase_${new_ip_2}/g' /opt/${new_ip}/gnode/config/gcmonit.conf " >> ${filename}
                                echo "sed -i 's/\<syncserver_${old_ip_2}\>/syncserver_${new_ip_2}/g' /opt/${new_ip}/gnode/config/gcmonit.conf ; fi" >> ${filename}
                        fi


			### 4、Replace gcware datanode IP & ID
			echo -e "\n# 4、datenode IP & ID " >> ${filename}
			if [ "${node_type}" == "coor"  ] && [ "${node_type_2}" != "coor"  ]
			then
				
				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATASERVER" >> ${filename}
				echo "sed -i 's/\<${old_id_2}\>/${new_id_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATASERVER" >> ${filename}
				#echo "sed -i 's/\<${old_id_m_2}\>/${new_id_m_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATASERVER" >> ${filename}
				# DATACLUSTERSTATE中,nodeid有可能是负数,int范围内
				#echo "sed -i 's/\<${old_id_2}\>/${new_id_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATACLUSTERSTATE" >> ${filename}
				#echo "sed -i 's/\<${old_id_m_2}\>/${new_id_m_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATACLUSTERSTATE" >> ${filename}
				echo "sed -i 's/${old_id_2}/${new_id_m_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATACLUSTERSTATE" >> ${filename}
				echo "sed -i 's/${old_id_m_2}/${new_id_m_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DATACLUSTERSTATE" >> ${filename}



				echo "sed -i 's/\<${old_id_2}\>/${new_id_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DISTRIBUTION" >> ${filename}
				#echo "sed -i 's/\<${old_id_m_2}\>/${new_id_m_2}/g' /opt/${new_ip}/gcware/data/gcware/SNAPSHOT*/statemachine/vc*/DISTRIBUTION" >> ${filename}

			fi

			### 5、All IP 
			echo -e "\n# 5、All IP " >> ${filename}
 			#   5.1、 coor cluster_common.cnf	
			if [ "${node_type}" == "coor"  ] 
			then
				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gcluster/config/cluster_common.cnf" >> ${filename}
			else	
				echo "sed -i 's/\<${old_ip_2}\>/${new_ip_2}/g' /opt/${new_ip}/gnode/config/cluster_common.cnf" >> ${filename}
			fi

	
		done < ${wd}/new_ip_list.txt


	done < ${wd}/new_ip_list.txt

}


main()
{
	gen_new_list
	make_shell
	do_replace 
}

main

评论

登录后才可以发表评论