def resize_ha(self, instance_id=None): self.inst_id = instance_id if not self.inst_id: self.inst_id = utils.get_instance_id_bytenant(DBInstanceType.MASTER) _inst = utils.get_instance(self.inst_id, deleted=0) self.group_id = _inst.group_id master = InstanceGroupItem.get_by_gid_type(utils.get_context(), self.group_id, DBInstanceType.MASTER) standby = InstanceGroupItem.get_by_gid_type(utils.get_context(), self.group_id, DBInstanceType.STANDBY) if master: old_master_inst_id = master.instance_id if standby: old_standy_inst_id = standby.instance_id old_master_inst = utils.get_builtin_instance(old_master_inst_id) old_flavor_id = old_master_inst.flavor_id old_virtual_instance_id = old_master_inst.virtual_instance_id self.inst_id = old_master_inst.id if old_flavor_id not in ['1', '2', '3', '4']: raise Exception("It is not support to do resizing based on flavor id: %s, supported flavor_ids should be in (1,2,3,4)" % (old_flavor_id)) flavor = str(int(old_flavor_id) + 1) LOG.info("old flavor : %s, new flavor : %s" % (old_flavor_id, flavor)) utils.resize_flavor_byclient(self.inst_id, flavor) inst_ids = utils.check_resize_status(self.group_id) if len(inst_ids) >= 2: utils.check_rpl_delay(inst_ids[0]) utils.check_rpl_delay(inst_ids[1]) import time time.sleep(60) new_master = utils.get_builtin_instance(old_virtual_instance_id) new_standby = InstanceGroupItem.get_by_gid_type(utils.get_context(), new_master.group_id, DBInstanceType.STANDBY) if new_master.virtual_instance_id == old_virtual_instance_id and \ new_master.id != old_master_inst.id: self.inst_id = new_master.id self.dbslave_id = new_standby.instance_id self.vip_id = utils.get_vip_id(self.inst_id) else: raise Exception("resize for ha failed,new_master.virtual_instance_id %s," " old_virtual_instance_id %s, new_master.id %s," " old_master_inst.id %s, new_standby_id %s," " old_standy_inst_id %s" % ( new_master.virtual_instance_id, old_virtual_instance_id, new_master.id, old_master_inst.id, new_standby.instance_id, old_standy_inst_id)) self.validate() else: raise Exception("the num of instance_id should be equal or greater than two after resize HA ")
def _validate(self, master_id, validated_inst_id): utils.check_server_status(validated_inst_id,expected_task=utils.tasks.InstanceTasks.NONE, type=DBInstanceType.READ_REPLI, expected_svr_status=utils.ServiceStatuses.RUNNING, deleted=False,timeout=300) utils.check_mysql_adminuser(validated_inst_id) utils.check_vip(master_id) vip_id = utils.get_vip_id(validated_inst_id) utils.check_vip(validated_inst_id,vip_id=vip_id) utils.check_rpl_delay(validated_inst_id) master_ip = utils.check_allocate_ip(utils.get_builtin_instance(master_id).server) rr_ip = utils.check_allocate_ip(utils.get_builtin_instance(validated_inst_id).server) utils.check_rpl_consist(master_id, [validated_inst_id],master_ip,[rr_ip]) utils.check_rpl_topo_rr(self.group_id)
def validate(self): utils.check_server_status(self.inst_id, expected_task=utils.tasks.InstanceTasks.NONE, type=DBInstanceType.MASTER, expected_svr_status=utils.ServiceStatuses.RUNNING, deleted=False, timeout=600) utils.check_server_status(self.dbslave_id, expected_task=utils.tasks.InstanceTasks.NONE, type=DBInstanceType.STANDBY, expected_svr_status=utils.ServiceStatuses.RUNNING, deleted=False, timeout=600) rr_items = InstanceGroupItem.get_by_gid_type(utils.get_context(), self.group_id, DBInstanceType.READ_REPLI, deleted = False) slave_ids = [] for rr in rr_items: slave_ids.append(rr.instance_id) slave_ids.append(self.dbslave_id) utils.check_mysql_adminuser(self.inst_id) utils.check_mysql_adminuser(self.dbslave_id) for _id in [self.inst_id, self.dbslave_id]: utils.check_mysql_is_running(self.inst_id) utils.check_vip(self.inst_id, vip_id=self.vip_id) self.backup_id = utils.check_backup(self.group_id) utils.check_backup_status(self.backup_id) utils.check_backup_path(self.backup_id) for slave_id in slave_ids: utils.check_rpl_delay(slave_id) master_inst = utils.get_builtin_instance(self.inst_id) slave_inst = utils.get_builtin_instance(self.dbslave_id) master_ip = utils.check_allocate_ip(master_inst.server) slave_ip = utils.check_allocate_ip(slave_inst.server) LOG.info("master_ip:%s slave_ip:%s" % (master_ip, slave_ip)) utils.check_rpl_consist(self.inst_id, slave_ids, master_ip, [slave_ip]) utils.check_rpl_topo_ha(self.group_id)