oceanbase
179 строк · 9.4 Кб
1import pymysql as mysql2import argparse3import time4import datetime5import subprocess6import os7import logging8
9def kill_server():10kill_observer_cmd = "ps -ef | grep observer | grep -v grep | grep -v init_store_for_fast_start.py | awk '{print $2}' | xargs kill -9"11kill_res = subprocess.call(kill_observer_cmd, shell=True)12if kill_res != 0:13logging.warn("kill observer failed")14exit(-1)15logging.info("kill observer ok")16
17def check_file_or_path_exist(bin_abs_path, home_abs_path, store_tar_file_path, etc_dest_dir):18if not os.path.isfile(bin_abs_path):19logging.warn("invalid bin path")20return False21if not os.path.isdir(home_abs_path):22logging.warn("invalid home path")23return False24if not os.path.isdir(store_tar_file_path):25logging.warn("invalid store tar file path")26return False27if not os.path.isdir(etc_dest_dir):28logging.warn(etc_dest_dir)29logging.warn("invalid etc dest dir")30return False31return True32
33if __name__ == "__main__":34logging.basicConfig(level=logging.INFO)35
36cur_path = os.curdir37cur_path = os.path.abspath(cur_path)38logging.info("=================== cur_path: %s ==============" % cur_path)39parser = argparse.ArgumentParser()40parser.add_argument("observer_bin_path", type=str, help="the path of observer binary file")41parser.add_argument("observer_home_path", type=str, help="the path of sys log / config file / sql.sock / audit info")42parser.add_argument("store_tar_file_dir", type=str, help="store dir zip target dir")43parser.add_argument("etc_dest_dir", type=str, help="the dest dir to save etc config files")44parser.add_argument("--only_build_env", action='store_true', help="build env & start observer without bootstrap and basic check")45parser.add_argument("-p", dest="mysql_port", type=str, default="@OB_MYSQL_PORT@")46parser.add_argument("-P", dest="rpc_port", type=str, default="@OB_RPC_PORT@")47parser.add_argument("-z", dest="zone", type=str, default="zone1")48parser.add_argument("-c", dest="cluster_id", type=str, default="1")49parser.add_argument("-d", dest="data_path", type=str, default="/data/store")50parser.add_argument("-r", dest="rootservice", type=str, default="@OB_SERVER_IP@:@OB_RPC_PORT@")51parser.add_argument("-I", dest="ip", type=str, default="@OB_SERVER_IP@")52parser.add_argument("-l", dest="log_level", type=str, default="INFO")53parser.add_argument("-o", dest="opt_str", type=str, default="__min_full_resource_pool_memory=2147483648,memory_limit=6G,system_memory=1G,datafile_size=256M,log_disk_size=5G,cpu_count=16")54parser.add_argument("-N", dest="daemon", type=str, default="1")55parser.add_argument("--tenant_name", type=str, default="@OB_TENANT_NAME@")56parser.add_argument("--tenant_lower_case_table_names", type=int, default="@OB_TENANT_LOWER_CASE_TABLE_NAMES@")57parser.add_argument("--max_cpu", type=float, default=7.0)58parser.add_argument("--min_cpu", type=float, default=7.0)59parser.add_argument("--memory_size", type=int, default=3221225472)60parser.add_argument("--log_disk_size", type=int, default=3221225472)61args = parser.parse_args()62
63bin_abs_path = os.path.abspath(args.observer_bin_path)64home_abs_path = os.path.abspath(args.observer_home_path)65data_abs_path = os.path.abspath(args.data_path)66store_tar_file_path = os.path.abspath(args.store_tar_file_dir)67etc_dest_dir = os.path.abspath(args.etc_dest_dir)68
69if not check_file_or_path_exist(bin_abs_path, home_abs_path, store_tar_file_path, etc_dest_dir):70logging.warn("check file / path exist failed")71exit(-1)72
73rebuild_env_cmd = "sh ./env.sh %s %s %s -C true && sh ./env.sh %s %s %s -B true" % (bin_abs_path, home_abs_path, data_abs_path, \74bin_abs_path, home_abs_path, data_abs_path) if bin_abs_path != home_abs_path + "/observer" else \75"sh ./env.sh %s %s %s -C && sh ./env.sh %s %s %s -B" % (bin_abs_path, home_abs_path, data_abs_path, \76bin_abs_path, home_abs_path, data_abs_path)77
78# prepare environment for observer79env_prepare = subprocess.call(rebuild_env_cmd, shell=True)80if env_prepare != 0:81logging.warn("prepare env failed")82exit(-1)83
84# prepare observer start parameters85daemon_option = "-N" if args.daemon=="1" else ""86observer_args = "-p %s -P %s -z %s -c %s -d %s -r %s -I %s -l %s -o %s %s" % (args.mysql_port, args.rpc_port, args.zone, \87args.cluster_id, data_abs_path, \88args.rootservice, args.ip, args.log_level, args.opt_str, \89daemon_option)90os.chdir(home_abs_path)91observer_cmd = "./observer %s" % (observer_args)92subprocess.Popen(observer_cmd, shell=True)93
94# bootstrap observer95time.sleep(4)96try:97db = mysql.connect(host=args.ip, user="root", port=int(args.mysql_port), passwd="")98cursor = db.cursor(cursor=mysql.cursors.DictCursor)99logging.info('connection success!')100if not args.only_build_env:101logging.info("waiting for bootstrap...")102bootstrap_begin = datetime.datetime.now()103cursor.execute("ALTER SYSTEM BOOTSTRAP ZONE '%s' SERVER '%s'" % (args.zone, args.rootservice))104bootstrap_end = datetime.datetime.now()105logging.info('bootstrap success: %s ms' % ((bootstrap_end - bootstrap_begin).total_seconds() * 1000))106# checkout server status107cursor.execute("select * from oceanbase.__all_server")108server_status = cursor.fetchall()109if len(server_status) != 1 or server_status[0]['status'] != 'ACTIVE':110logging.warn("get server status failed")111exit(-1)112logging.info('check server status ok')113# create test tenant114cursor.execute("create resource unit %s_unit max_cpu %s, memory_size %s, min_cpu %s, log_disk_size %s" % ( \115args.tenant_name, args.max_cpu, args.memory_size, args.min_cpu, args.log_disk_size))116cursor.execute("create resource pool %s_pool unit='%s_unit', unit_num=1, zone_list=('%s')" % ( \117args.tenant_name, args.tenant_name, args.zone))118logging.info("waiting for create tenant...")119create_tenant_begin = datetime.datetime.now()120cursor.execute("create tenant %s replica_num=1,zone_list=('%s'),primary_zone='RANDOM',resource_pool_list=('%s_pool') set ob_tcp_invited_nodes='%%', ob_compatibility_mode = 'mysql', lower_case_table_names=%d" % ( \121args.tenant_name, args.zone, args.tenant_name, args.tenant_lower_case_table_names))122create_tenant_end = datetime.datetime.now()123logging.info('create tenant success: %s ms' % ((create_tenant_end - create_tenant_begin).total_seconds() * 1000))124db.close()125except mysql.err.Error as e:126logging.warn("deploy observer failed")127kill_server()128exit(-1)129
130# grant privilege131try:132db = mysql.connect(host=args.ip, user="root@%s" % (args.tenant_name), port=int(args.mysql_port), passwd="")133cursor = db.cursor(cursor=mysql.cursors.DictCursor)134logging.info('connect by common tenant success!')135cursor.execute("CREATE USER '%s'@'%%'" % (args.tenant_name))136cursor.execute("GRANT ALL ON *.* TO '%s'@'%%'" % (args.tenant_name))137logging.info("grant privilege success!")138except mysql.err.Error as e:139logging.warn("grant privilege for common tenant failed")140kill_server()141exit(-1)142
143# stop observer144kill_server()145
146# record block cnt147record_block_cnt_cmd = "cd %s/clog/log_pool && echo $[ `ls | wc -l` - 1 ] > %s/block_cnt" % (data_abs_path, store_tar_file_path)148record_res = subprocess.call(record_block_cnt_cmd, shell=True)149if record_res != 0:150logging.warn("record block cnt failed")151exit(-1)152logging.info("record block cnt ok")153
154# build store tar file155build_store_tar_cmd = "cd %s/clog/log_pool && ls | grep '[0-9]' | xargs rm && cd %s/.. && \156tar -Sczvf %s/store.tar.gz ./store" % (data_abs_path, data_abs_path, store_tar_file_path)157build_res = subprocess.call(build_store_tar_cmd, shell=True)158if build_res != 0:159logging.warn("build store tar file failed")160exit(-1)161logging.info("build store tar file ok")162
163# copy config files to etc_dest_dir164cp_config_cmd = "cp -r %s/etc/* %s" % (home_abs_path, etc_dest_dir)165cp_config_res = subprocess.call(cp_config_cmd, shell=True)166if cp_config_res != 0:167logging.warn("cp config failed")168exit(-1)169logging.info("cp config ok")170
171# clean env172os.chdir(cur_path)173clean_env_cmd = "sh ./env.sh %s %s %s -C true" % (bin_abs_path, home_abs_path, data_abs_path) if bin_abs_path != home_abs_path + "/observer" else \174"sh ./env.sh %s %s %s -C" % (bin_abs_path, home_abs_path, data_abs_path)175clean_res = subprocess.call(clean_env_cmd, shell=True)176if clean_res != 0:177logging.warn("clean env failed")178exit(-1)179logging.info("clean all env ok")180