public static function getConstant($name) { if (!self::$reflect) { self::$reflect = new ReflectionClass('Scalr_Db_Msr'); } return self::$reflect->getConstant($name); }
public function handleMessage(Scalr_Messaging_Msg $message, DBServer $dbServer) { try { $dbFarmRole = $dbServer->GetFarmRoleObject(); } catch (Exception $e) { } switch (get_class($message)) { case "Scalr_Messaging_Msg_HostUp": if ($message->dbType && in_array($message->dbType, array(ROLE_BEHAVIORS::REDIS, ROLE_BEHAVIORS::POSTGRESQL, ROLE_BEHAVIORS::MYSQL2))) { $dbMsrInfo = Scalr_Db_Msr_Info::init($dbFarmRole, $dbServer, $message->dbType); $dbMsrInfo->setMsrSettings($message->{$message->dbType}); } break; case "Scalr_Messaging_Msg_DbMsr_PromoteToMasterResult": if (Scalr_Db_Msr::onPromoteToMasterResult($message, $dbServer)) { Scalr::FireEvent($dbServer->farmId, new NewDbMsrMasterUpEvent($dbServer)); } break; case "Scalr_Messaging_Msg_DbMsr_CreateDataBundleResult": if ($message->status == "ok") { Scalr_Db_Msr::onCreateDataBundleResult($message, $dbServer); } else { $dbFarmRole->SetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING, 0); //TODO: store last error } break; case "Scalr_Messaging_Msg_DbMsr_CreateBackupResult": if ($message->status == "ok") { Scalr_Db_Msr::onCreateBackupResult($message, $dbServer); } else { $dbFarmRole->SetSetting(Scalr_Db_Msr::DATA_BACKUP_IS_RUNNING, 0); //TODO: store last error } break; } }
public function handleMessage(Scalr_Messaging_Msg $message, DBServer $dbServer) { parent::handleMessage($message, $dbServer); try { $dbFarmRole = $dbServer->GetFarmRoleObject(); $storageType = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_ENGINE); $storageGeneration = $storageType == 'lvm' ? 2 : 1; } catch (Exception $e) { } switch (get_class($message)) { case "Scalr_Messaging_Msg_HostUp": if ($message->dbType && in_array($message->dbType, array(ROLE_BEHAVIORS::REDIS, ROLE_BEHAVIORS::POSTGRESQL, ROLE_BEHAVIORS::MYSQL2, ROLE_BEHAVIORS::PERCONA, ROLE_BEHAVIORS::MARIADB))) { $dbMsrInfo = Scalr_Db_Msr_Info::init($dbFarmRole, $dbServer, $message->dbType); $dbMsrInfo->setMsrSettings($message->{$message->dbType}); if ($message->{$message->dbType}->snapshotConfig) { $dbFarmRole->SetSetting(self::ROLE_NO_DATA_BUNDLE_FOR_SLAVES, 0, DBFarmRole::TYPE_LCL); } if ($message->{$message->dbType}->restore) { $this->db->Execute("INSERT INTO storage_restore_configs SET farm_roleid = ?, dtadded=NOW(), manifest = ?", array($dbFarmRole->ID, $message->{$message->dbType}->restore->cloudfsSource)); $dbFarmRole->SetSetting(self::ROLE_NO_DATA_BUNDLE_FOR_SLAVES, 0, DBFarmRole::TYPE_LCL); $dbFarmRole->SetSetting(Scalr_Db_Msr::DATA_BUNDLE_LAST_TS, time(), DBFarmRole::TYPE_LCL); $dbFarmRole->SetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING, 0, DBFarmRole::TYPE_LCL); } if ($message->{$message->dbType}->masterPassword) { $dbFarmRole->SetSetting(self::ROLE_MASTER_PASSWORD, $message->{$message->dbType}->masterPassword, DBFarmRole::TYPE_LCL); } } break; case "Scalr_Messaging_Msg_DbMsr_PromoteToMasterResult": if ($message->{$message->dbType}->restore) { $this->db->Execute("INSERT INTO storage_restore_configs SET farm_roleid = ?, dtadded=NOW(), manifest = ?", array($dbFarmRole->ID, $message->{$message->dbType}->restore->cloudfsSource)); $dbFarmRole->SetSetting(self::ROLE_NO_DATA_BUNDLE_FOR_SLAVES, 0, DBFarmRole::TYPE_LCL); } if (Scalr_Db_Msr::onPromoteToMasterResult($message, $dbServer)) { if ($message->{$this->behavior}->snapshotConfig) { $dbFarmRole->SetSetting(self::ROLE_NO_DATA_BUNDLE_FOR_SLAVES, 0, DBFarmRole::TYPE_LCL); } Scalr::FireEvent($dbServer->farmId, new NewDbMsrMasterUpEvent($dbServer)); } break; case "Scalr_Messaging_Msg_DbMsr_CreateDataBundleResult": if ($message->status == "ok") { if (isset($message->{$message->dbType}->restore) && isset($message->{$message->dbType}->restore->backupType)) { $t = $message->{$message->dbType}->restore; if ($t->backupType == 'incremental') { $parentManifest = $this->db->GetOne("\n SELECT manifest FROM storage_restore_configs WHERE farm_roleid = ? ORDER BY id DESC LIMIT 1\n ", array($dbFarmRole->ID)); } $this->db->Execute("\n INSERT INTO storage_restore_configs SET farm_roleid = ?, dtadded=NOW(), manifest = ?, type = ?, parent_manifest = ?\n ", array($dbFarmRole->ID, $t->cloudfsSource, $t->backupType, $parentManifest)); unset($t); } $dbFarmRole->SetSetting(self::ROLE_NO_DATA_BUNDLE_FOR_SLAVES, 0, DBFarmRole::TYPE_LCL); Scalr_Db_Msr::onCreateDataBundleResult($message, $dbServer); } else { $dbFarmRole->SetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING, 0, DBFarmRole::TYPE_LCL); // TODO: store last error } $this->updateBackupHistory($dbServer, 'bundle', $message->status, $message->lastError); break; case "Scalr_Messaging_Msg_DbMsr_CreateBackupResult": if ($message->status == "ok") { Scalr_Db_Msr::onCreateBackupResult($message, $dbServer); } else { $dbFarmRole->SetSetting(Scalr_Db_Msr::DATA_BACKUP_IS_RUNNING, 0, DBFarmRole::TYPE_LCL); } $this->updateBackupHistory($dbServer, 'backup', $message->status, $message->lastError); break; } }
private function performDbMsrAction($action, $dbFarmRole) { if ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_ENABLED")) && $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")) != 0) { if ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING")) == 1) { // Wait for timeout time * 2 (Example: NIVs problem with big mysql snapshots) // We must wait for running bundle process. $timeout = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")) * (3600 * 2); $lastTs = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_RUNNING_TS")); if ($lastTs + $timeout < time()) { $timeouted = true; } if ($timeouted) { $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING"), 0); } } else { /* * Check bundle window */ $period = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")); $timeout = $period * 3600; $lastActionTime = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_LAST_TS")); $performAction = false; if ($period % 24 == 0) { if ($lastActionTime) { $days = $period / 24; $day = (int) date("md", strtotime("+{$days} day", $lastActionTime)); if ($day > (int) date("md")) { return; } } $pbwFrom = (int) ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_START_HH")) . $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_START_MM"))); $pbwTo = (int) ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_END_HH")) . $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_END_MM"))); if ($pbwFrom && $pbwTo) { $current_time = (int) date("Hi"); if ($pbwFrom <= $current_time && $pbwTo >= $current_time) { $performAction = true; } } else { $performAction = true; } } else { //Check timeout if ($lastActionTime + $timeout < time()) { $performAction = true; } } if ($performAction) { // perform data bundle on master $servers = $dbFarmRole->GetServersByFilter(array('status' => array(SERVER_STATUS::RUNNING))); foreach ($servers as $dbServer) { if ($action == 'BUNDLE') { if ($dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER)) { $dbServer->SendMessage(new Scalr_Messaging_Msg_DbMsr_CreateDataBundle()); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING"), 1); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_RUNNING_TS"), time()); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_SERVER_ID"), $dbServer->serverId); break; } } elseif ($action == 'BACKUP') { if ($dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER)) { $master = $dbServer; continue; } $bcpServer = $dbServer; break; } } if ($action == 'BACKUP') { if (!$bcpServer) { $bcpServer = $master; } if ($bcpServer) { $bcpServer->SendMessage(new Scalr_Messaging_Msg_DbMsr_CreateBackup()); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING"), 1); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_RUNNING_TS"), time()); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_SERVER_ID"), $bcpServer->serverId); } } } } } }
private function performDbMsrAction($action, DBFarmRole $dbFarmRole, $tz) { $timeouted = false; if ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_ENABLED")) && $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")) != 0) { if ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING")) == 1) { // Wait for timeout time * 2 (Example: NIVs problem with big mysql snapshots) // We must wait for running bundle process. $timeout = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")) * (3600 * 2); $lastTs = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_RUNNING_TS")); if ($lastTs + $timeout < time()) { $timeouted = true; } if ($timeouted) { $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING"), 0, DBFarmRole::TYPE_LCL); } } else { /* * Check bundle window */ $period = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")); $timeout = $period * 3600; $lastActionTime = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_LAST_TS")); $performAction = false; if ($period % 24 == 0) { if ($lastActionTime) { $days = $period / 24; $dateTime = new DateTime(null, new DateTimeZone($tz)); $currentDate = (int) $dateTime->format("Ymd"); $dateTime->setTimestamp(strtotime("+{$days} day", $lastActionTime)); $nextDate = (int) $dateTime->format("Ymd"); if ($nextDate > $currentDate) { return; } } $pbwFrom = (int) ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_START_HH")) . $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_START_MM"))); $pbwTo = (int) ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_END_HH")) . $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_END_MM"))); if ($pbwFrom && $pbwTo) { $dateTime = new DateTime(null, new DateTimeZone($tz)); $currentTime = (int) $dateTime->format("Hi"); //$current_time = (int)date("Hi"); //BUG HERE: 22:00 - 6:00 - doesn't work if ($pbwFrom <= $currentTime && $pbwTo >= $currentTime) { $performAction = true; } } else { $performAction = true; } } else { //Check timeout if ($lastActionTime + $timeout < time()) { $performAction = true; } } if ($performAction) { $behavior = Scalr_Role_Behavior::loadByName($dbFarmRole->GetRoleObject()->getDbMsrBehavior()); if ($action == 'BUNDLE') { $behavior->createDataBundle($dbFarmRole, array('compressor' => $dbFarmRole->GetSetting(Scalr_Role_DbMsrBehavior::ROLE_DATA_BUNDLE_COMPRESSION), 'useSlave' => $dbFarmRole->GetSetting(Scalr_Role_DbMsrBehavior::ROLE_DATA_BUNDLE_USE_SLAVE))); } if ($action == 'BACKUP') { $behavior->createBackup($dbFarmRole); } } } } }
public function dashboardAction() { $this->request->defineParams(array('farmId' => array('type' => 'int'), 'farmRoleId' => array('type' => 'int'), 'type')); $dbFarm = DBFarm::LoadByID($this->getParam('farmId')); $this->user->getPermissions()->validate($dbFarm); if ($this->getParam('farmRoleId')) { $dbFarmRole = DBFarmRole::LoadByID($this->getParam('farmRoleId')); if ($dbFarmRole->FarmID != $dbFarm->ID) { throw new Exception("Role not found"); } } elseif ($this->getParam('type')) { foreach ($dbFarm->GetFarmRoles() as $sDbFarmRole) { if ($sDbFarmRole->GetRoleObject()->hasBehavior($this->getParam('type'))) { $dbFarmRole = $sDbFarmRole; break; } } if (!$dbFarmRole) { throw new Exception("Role not found"); } } else { throw new Scalr_UI_Exception_NotFound(); } $data = array('farmRoleId' => $dbFarmRole->ID, 'farmId' => $dbFarmRole->FarmID); $data['dbType'] = $dbFarmRole->GetRoleObject()->getDbMsrBehavior(); if (!$data['dbType']) { $this->response->failure("Unknown db type"); return; } switch ($data['dbType']) { case ROLE_BEHAVIORS::MYSQL2: case ROLE_BEHAVIORS::PERCONA: case ROLE_BEHAVIORS::MARIADB: $szrApiNamespace = Scalr_Net_Scalarizr_Client::NAMESPACE_MYSQL; break; case ROLE_BEHAVIORS::REDIS: $szrApiNamespace = Scalr_Net_Scalarizr_Client::NAMESPACE_REDIS; $data['extras'] = array(array('name' => 'Processes', 'value' => $dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::NUM_PROCESSES)), array('name' => 'Persistence type', 'value' => $dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::PERSISTENCE_TYPE))); break; case ROLE_BEHAVIORS::POSTGRESQL: $szrApiNamespace = Scalr_Net_Scalarizr_Client::NAMESPACE_POSTGRESQL; break; } // Get PMA details for MySQL / Percona if (in_array($data['dbType'], array(ROLE_BEHAVIORS::MYSQL, ROLE_BEHAVIORS::MYSQL2, ROLE_BEHAVIORS::PERCONA, ROLE_BEHAVIORS::MARIADB))) { $data['pma'] = $this->getPmaDetails($dbFarmRole); } $behavior = Scalr_Role_Behavior::loadByName($data['dbType']); $masterServer = $behavior->getMasterServer($dbFarmRole); if ($masterServer) { // Get Storage details $data['storage'] = $this->getDbStorageStatus($masterServer, $data['dbType']); } // Get Access details and DNS endpoints $data['accessDetails'] = $this->getDbAccessDetails($dbFarmRole); $data['name'] = ROLE_BEHAVIORS::GetName($data['dbType']); // Get data bundle info $bundlesEnabled = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_ENABLED); $lastActionTime = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_BUNDLE_LAST_TS")); $data['bundles'] = array('history' => $this->db->GetAll("SELECT *, UNIX_TIMESTAMP(date) as date FROM services_db_backups_history WHERE `farm_role_id` = ? AND `operation` = ? ORDER BY id ASC", array($dbFarmRole->ID, 'bundle')), 'inProgress' => array('status' => (int) $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING), 'serverId' => $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_SERVER_ID)), 'last' => $lastActionTime ? Scalr_Util_DateTime::convertTz((int) $lastActionTime, 'd M Y \\a\\t H:i:s') : 'Never'); foreach ($data['bundles']['history'] as &$h) { $h['date'] = Scalr_Util_DateTime::convertTz((int) $h['date'], 'd M Y \\a\\t H:i:s'); } if ($bundlesEnabled) { $period = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_EVERY); if ($lastActionTime) { $nextTime = $lastActionTime + $period * 3600; } $data['bundles']['next'] = !$nextTime || $nextTime < time() ? "Within 30 minutes" : Scalr_Util_DateTime::convertTz((int) $nextTime, 'd M Y \\a\\t H:i:s'); $data['bundles']['schedule'] = "Every {$period} hours"; } else { $data['bundles']['next'] = " - "; $data['bundles']['schedule'] = "Auto-snapshotting disabled"; } // Get backups info $lastActionTime = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_BACKUP_LAST_TS")); $nextTime = false; $backupsEnabled = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_ENABLED); $data['backups'] = array('history' => $this->db->GetAll("SELECT *, UNIX_TIMESTAMP(date) as date FROM services_db_backups_history WHERE `farm_role_id` = ? AND `operation` = ? ORDER BY id ASC", array($dbFarmRole->ID, 'backup')), 'inProgress' => array('status' => (int) $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_IS_RUNNING), 'serverId' => $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_SERVER_ID)), 'last' => $lastActionTime ? Scalr_Util_DateTime::convertTz((int) $lastActionTime, 'd M Y \\a\\t H:i:s') : 'Never', 'supported' => !PlatformFactory::isCloudstack($dbFarmRole->Platform) && (!PlatformFactory::isOpenstack($dbFarmRole->Platform) || PlatformFactory::NewPlatform($dbFarmRole->Platform)->getConfigVariable(OpenstackPlatformModule::EXT_SWIFT_ENABLED, $this->getEnvironment(), false))); foreach ($data['backups']['history'] as &$h) { $h['date'] = Scalr_Util_DateTime::convertTz((int) $h['date'], 'd M Y \\a\\t H:i:s'); } if ($backupsEnabled) { $period = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_EVERY); if ($lastActionTime) { $nextTime = $lastActionTime + $period * 3600; } $data['backups']['next'] = !$nextTime || $nextTime < time() ? "Within 30 minutes" : Scalr_Util_DateTime::convertTz((int) $nextTime, 'd M Y \\a\\t H:i:s'); $data['backups']['schedule'] = "Every {$period} hours"; } else { $data['backups']['next'] = " - "; $data['backups']['schedule'] = "Auto-backups disabled"; } /* if ($dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_ENGINE) == 'lvm') { $data['noDataBundleForSlaves'] = ($dbFarmRole->GetSetting(Scalr_Role_DbMsrBehavior::ROLE_NO_DATA_BUNDLE_FOR_SLAVES)) ? true : false; } */ $conf = $this->getContainer()->config->get('scalr.load_statistics.connections.plotter'); foreach ($dbFarmRole->GetServersByFilter(array('status' => array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING, SERVER_STATUS::PENDING))) as $dbServer) { $isMaster = $dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1; $serverRole = $isMaster ? 'master' : 'slave'; $serverInfo = array('status' => $dbServer->status, 'remoteIp' => $dbServer->remoteIp, 'localIp' => $dbServer->localIp, 'serverId' => $dbServer->serverId, 'cloudServerId' => $dbServer->GetCloudServerID(), 'cloudLocation' => $dbServer->GetCloudLocation(), 'serverRole' => $serverRole, 'index' => $dbServer->index); $serverInfo['monitoring'] = array('farmId' => $dbFarmRole->FarmID, 'farmRoleId' => $dbFarmRole->ID, 'index' => $dbServer->index, 'hash' => $dbFarm->Hash, 'hostUrl' => "{$conf['scheme']}://{$conf['host']}:{$conf['port']}"); if ($dbServer->platform == SERVER_PLATFORMS::EC2) { $serverInfo['cloudLocation'] = $dbServer->GetProperty(EC2_SERVER_PROPERTIES::AVAIL_ZONE); } if ($dbServer->status == SERVER_STATUS::RUNNING) { try { $rStatus = $dbServer->scalarizr->{$szrApiNamespace}->replicationStatus(); if ($data['dbType'] != ROLE_BEHAVIORS::REDIS) { $rStatus = (array) $rStatus->{$serverRole}; $replication = $rStatus; } else { if ($isMaster) { $rStatus = (array) $rStatus->masters; foreach ($rStatus as $port => $status) { $rStatus['status'] = $status; if ($status != 'up') { break; } } } else { $rStatus = (array) $rStatus->slaves; foreach ($rStatus as $port => $status) { $rStatus['status'] = $status->status; if ($status->status != 'up') { break; } } } $replication = $rStatus; } if (in_array($data['dbType'], array(ROLE_BEHAVIORS::MYSQL2, ROLE_BEHAVIORS::PERCONA, ROLE_BEHAVIORS::MARIADB))) { if ($rStatus['status'] == 'up' && $replication['seconds_behind_master'] > 0) { $status = 'lagging'; } else { $status = $rStatus['status']; } } elseif ($data['dbType'] == ROLE_BEHAVIORS::REDIS) { $status = $rStatus['status']; } elseif ($data['dbType'] == ROLE_BEHAVIORS::POSTGRESQL) { if ($rStatus['status'] == 'up' && $replication['Xlog_delay'] > 1000) { $status = 'lagging'; } else { $status = $rStatus['status']; } } $serverInfo['replication'] = array('status' => $status, $data['dbType'] => $replication); } catch (Exception $e) { $serverInfo['replication'] = array('status' => 'error', 'message' => $e->getMessage()); } } $data['servers'][] = $serverInfo; } $this->response->page('ui/db/manager/dashboard.js', $data, array('ui/monitoring/window.js'), array('ui/db/manager/dashboard.css')); }