public function createDataBundle(DBFarmRole $dbFarmRole, array $params = array()) { if (!$params['dataBundleType']) { $params['dataBundleType'] = 'full'; } if ($params['compressor'] === null) { $params['compressor'] = 'gzip'; } //$params['useSlave'] if ($dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING) == 1) { throw new Exception("Data bundle already in progress"); } $currentServer = $this->getServerForDataBundle($dbFarmRole, $params['useSlave']); if (!$currentServer) { throw new Exception("No suitable server for data bundle"); } $message = new Scalr_Messaging_Msg_DbMsr_CreateDataBundle(); $storageType = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_ENGINE); $storageGeneration = $storageType == 'lvm' ? 2 : 1; if ($dbFarmRole->isOpenstack()) { $driver = 'swift'; } else { switch ($dbFarmRole->Platform) { case SERVER_PLATFORMS::EC2: $driver = 's3'; break; case SERVER_PLATFORMS::GCE: $driver = 'gcs'; break; } } if ($storageGeneration == 2) { $behavior = $dbFarmRole->GetRoleObject()->getDbMsrBehavior(); if (!isset($message->{$behavior})) { $message->{$behavior} = new stdClass(); } $message->{$behavior}->backup = new stdClass(); $message->{$behavior}->backup->type = 'xtrabackup'; $message->{$behavior}->backup->compressor = $params['compressor']; $message->{$behavior}->backup->backupType = $params['dataBundleType']; $message->{$behavior}->backup->cloudfsTarget = sprintf("%s://scalr-%s-%s-%s/data-bundles/%s/%s/", $driver, SCALR_ID, $dbFarmRole->GetFarmObject()->EnvID, $dbFarmRole->CloudLocation, $dbFarmRole->FarmID, $behavior); if ($params['dataBundleType'] == 'incremental') { $previousManifest = $this->db->GetOne("SELECT manifest FROM storage_restore_configs WHERE farm_roleid = ? ORDER BY id DESC LIMIT 1", array($dbFarmRole->ID)); $message->{$behavior}->backup->prevCloudfsSource = $previousManifest; } } $message->storageType = $storageType; $currentServer->SendMessage($message); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_BUNDLE_IS_RUNNING"), 1, DBFarmRole::TYPE_LCL); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_BUNDLE_RUNNING_TS"), time(), DBFarmRole::TYPE_LCL); $dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_BUNDLE_SERVER_ID"), $currentServer->serverId, DBFarmRole::TYPE_LCL); }
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); } } } } }
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); } } } } } }
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')); }