def command_all(sub_cmd, cluster_id=-1, formatter=None): """Send redis-cli command to all :param sub_cmd: sub command :param cluster_id: target cluster # :param formatter: if set, call formatter with output string """ if cluster_id < 0: cluster_id = config.get_cur_cluster_id() master_host_list = config.get_master_host_list(cluster_id) master_port_list = config.get_master_port_list(cluster_id) slave_host_list = config.get_slave_host_list(cluster_id) slave_port_list = config.get_slave_port_list() outs, meta = RedisCliUtil.command_raw_all(sub_cmd, master_host_list, master_port_list) logger.debug(outs) buf = meta[:] outs, meta = RedisCliUtil.command_raw_all(sub_cmd, slave_host_list, slave_port_list) logger.debug(outs) buf += meta[1:] if formatter: formatter(buf) else: logger.debug(outs)
def command_all_async(sub_cmd, slave=True): def _async_target_func(m_s, pre_cmd, host, port, sub_cmd, ret): try: command = '{} -h {} -p {} {}'.format(pre_cmd, host, port, sub_cmd) logger.debug(command) stdout = subprocess.check_output(command, shell=True) stdout = stdout.decode('utf-8').strip() ret.append((m_s, host, port, 'OK', stdout)) except Exception as ex: stderr = str(ex) logger.debug(stderr) ret.append((m_s, host, port, 'FAIL', stderr)) cluster_id = config.get_cur_cluster_id() master_host_list = config.get_master_host_list(cluster_id) master_port_list = config.get_master_port_list(cluster_id) if slave: slave_host_list = config.get_slave_host_list(cluster_id) slave_port_list = config.get_slave_port_list(cluster_id) path_of_fb = config.get_path_of_fb(cluster_id) sr2_redis_bin = path_of_fb['sr2_redis_bin'] logger.debug('command_all_async') cluster_id = config.get_cur_cluster_id() lib_path = config.get_ld_library_path(cluster_id) env_cmd = [ 'export LD_LIBRARY_PATH={};'.format(lib_path['ld_library_path']), 'export DYLD_LIBRARY_PATH={};'.format( lib_path['dyld_library_path']), ] env = ' '.join(env_cmd) threads = [] ret = [] # (m/s, host, port, result, message) pre_cmd = '{} {}/redis-cli -c'.format(env, sr2_redis_bin) for host in master_host_list: for port in master_port_list: t = Thread( target=_async_target_func, args=('Master', pre_cmd, host, port, sub_cmd, ret), ) threads.append(t) if slave: for host in slave_host_list: for port in slave_port_list: t = Thread( target=_async_target_func, args=('Slave', pre_cmd, host, port, sub_cmd, ret), ) threads.append(t) for th in threads: th.start() time.sleep(0.02) for th in threads: th.join() logger.debug(ret) return ret
def run_monitor(n=10, t=2): """Monitoring logs of redis. :param n: number of lines to print log :param t: renewal cycle(sec) """ if not isinstance(n, int): msg = message.get('error_option_type_not_number').format(option='n') logger.error(msg) return if not isinstance(t, int) and not isinstance(t, float): msg = message.get('error_option_type_not_float').format(option='t') logger.error(msg) return try: sp.check_output('which tail', shell=True) except Exception: msg = message.get('error_not_found_command_tail') logger.error(msg) return cluster_id = config.get_cur_cluster_id() path_of_fb = config.get_path_of_fb(cluster_id) sr2_redis_log = path_of_fb['sr2_redis_log'] log_files = '{}/servers*'.format(sr2_redis_log) host_list = config.get_master_host_list() target_host = ask_util.host_for_monitor(host_list) try: sp.check_output('which watch', shell=True) command = "ssh -t {} watch -n {} 'tail -n {} {}'".format( target_host, t, n, log_files) sp.call(command, shell=True) except Exception: msg = message.get('error_not_found_command_watch') logger.warning(msg) logger.info(message.get('message_for_exit')) command = "tail -F -s {} {}".format(t, log_files) client = net.get_ssh(target_host) net.ssh_execute_async(client, command)