Metal Messiah

Metal Messiah
Рейтинг
152
Регистрация
01.08.2010
Программистъ

Дублирование данных must have это я уже решил, хотя Вы правы, вопрос скорее о выборе архитектуры. Я думал Master-Master, но меня уже почти убедили что лучше Master-Slave, 2 веб сервера. Падал mysql 2 раза за последние 3 или 4 месяца, один раз упал утром, а я об этом узнал только вечером когда добрался до компьютера. Скорость закачки с сайта зависит от географии, а посетители грубо говоря со всего мира. Плюс мало ли вдруг забуду вовремя продлить один из серверов. Плюс мало ли будет ддос атака на один из них или на соседей, а ляжет половина ДЦ.

MySQL proxy ставить или нет? Можно же подключаться ко 2 серверу при отсутствии коннекта к первому, а чтобы не ждать mysql connection timeout каждый раз - при пропадании сервера писать файл-флаг, который будет периодически устаревать, а до тех пор php будет подключаться к альтернативному серверу - итого при проблемах только 1 страница будет открываться 30 секунд, остальные быстро.

У меня нет опыта работы с репликацией, потому и начал с того что прошу совета тех, у кого опыт есть.

Т.е. рекомендуете делать master-slave и 2 постоянных коннекта от php 1 для SELECT (рандом мастер-слейв) и 2й для UPDATE / INSERT (только мастер) в предположении что когда мастер упадет сайт работать будет но не будет обновляться?

Защититься от простоев невозможно, каждый хостинг рано или поздно присылает уведомления о технических работах.

Плюс репликация это лишний бекап и возможность поднять сайт (или не ронять его вообще) в случае краша диска на сервере, плюс это снижение нагрузки на 1 сервер и в случае географического разнесения - уменьшение пинга и времени закачки для конечных посетителей. А еще примитивный анти-ддос и еще много чего.

извините, но АП. Не верю что никто не работал с репликацией

ЛУчше так:

.htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
</IfModule>

index.php

header('HTTP/1.1 301 Moved Permanently');
header('Status: 301 Moved Permanently');
header('Location: http://НОВЫЙДОМЕН'.$_SERVER["REQUEST_URI"]);
echo "<h1><a href='http://НОВЫЙДОМЕН".$_SERVER["REQUEST_URI"]."'>страница переехала</a></h1>";

+ robots.txt не забудь

Адресация сохраняется + можно контроллировать заходы на зеркала и когда они кончатся не продлевать старые домены. Я так "оптимизировал расходы" одной фирмы, зарегистрировавшей с десяток доменов в разных зонах под 1 сайт

вариант от siv1987 по идее рабочий, но я бы делал на php через ob_start поиском сигнатуры и подменой, т.к. там же явно не все таблицы всех страниц заменить надо

P.S. а зачем ьаблицу дивами заменять? Проще на таблицу CSS переписать

IGMP? IPTV proxy? подробнее о технологии

Фильмы на ВКонтакте заливать от имени десятка разных аккаунтов с разных IP без пересечений чтоб не банили - вот бесплатное решение.

А если серьезно - правильно сказали, для движка один, для видео-контента пачка серверов, в виде CDN или подобия CDN, популярные видео раскладваются на максимуме серверов, малопопулярные на 1 хватит, движок сайта смотрит в базу на каких серверах лежит запрошенный файл, смотрит их доступность (проверка кроном раз в 5 мин и флаги в таблице) и выдает рандомный адрес, я так хостинг картинок делал - при закачке картинки пользователем она заливалась сразу на 2-3 сервера.

siv1987, спасибо, помогло

SELECT * FROM news WHERE MATCH (title) AGAINST ('shell бизнеса грозит конфискацией') AND id<>218504;

проверку даты убрал.

Плюс к тому у меня был косяк - если новостей по теме найдено меньше N, делался 2й запрос выборки M последних по дате новостей, где использовалось WHERE date>(time()-86400) - т.о. запрос каждую секунду менялся и не кешировался, округлил это число до 5000 секунд, теперь кешируется.

tls,

текущий VPS может просто не тянуть новую нагрузку.

по сути этот перенесенный сайт и есть вся нагрузка. остальное - мелочи, машина почти простаивала.

Пока как результат после десятка просмотренных страниц время порядка 0.05 сек, максимум выброс 1 секунда с мелочью.

Завтра еще посмотрю в конце дня по логу MYSQL запросы в пиковое время, на которые уходит более секунды, если что буду пробовать InnoDB.

Спасибо за ответы. SHOW CREATE TABLE:

CREATE TABLE `news` (
`id` int(8) unsigned NOT NULL AUTO_INCREMENT,
`date` int(4) unsigned DEFAULT NULL,
`section` int(1) unsigned DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`text` text,
`img` varchar(255) NOT NULL,
`views` int(4) unsigned DEFAULT NULL,
`gog` int(4) unsigned DEFAULT NULL,
`yan` int(4) unsigned DEFAULT NULL,
`yah` int(4) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `section` (`section`),
FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM AUTO_INCREMENT=219058 DEFAULT CHARSET=cp1251

Немного EXPLAIN: любой запрос

SELECT * FROM news WHERE id=(ЧИСЛО) LIMIT 1

выдает одинаковую табличку

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE news const PRIMARY PRIMARY 4 const 1

Приведенный выше

SELECT * FROM news WHERE id<>218504 AND date>'1404067471' AND (title LIKE '%shell%' OR title LIKE '%бизнеса%' OR title LIKE '%грозит%' OR title LIKE '%конфискацией%' OR title LIKE '%осква%' OR title LIKE '%оссии%') ORDER BY date DESC LIMIT 10

показывает

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE news ALL PRIMARY NULL NULL NULL 218069 Using where; Using filesort

InnoDB обычно не использую, более того отключаю в конфиге чтобы увеличить производительность VPS и уменьшить расход памяти. Все работало на MyISAM несколько лет на дешевом хостинге, не думаю что там оборудование намного мощнее моего VPS. Исходя из этих EXPLAIN можно сказать что переход на InnoDB может помочь?

Еще из тестов:

SELECT * FROM news WHERE id<>218504 AND (MATCH (title) AGAINST ('shell') OR MATCH (title) AGAINST ('бизнеса') OR MATCH (title) AGAINST ('грозит') OR MATCH (title) AGAINST ('конфискацией') OR MATCH (title) AGAINST ('осква')) ORDER BY date DESC LIMIT 10;

1 запуск 3.6 sec

2 запуск 7.3 sec

далее пошла выдача 7.3 страницы phpMyAdmin из кеша о_О

SELECT * FROM news WHERE id<>218504 AND (title LIKE '%shell%' OR title LIKE '%бизнеса%' OR title LIKE '%грозит%' OR title LIKE '%конфискацией%' OR title LIKE '%осква%') ORDER BY date DESC LIMIT 10

4.38 sec

5.57 sec

аналогично пошел кеш, буду разбираться. Но по сути первый на секунду лучше, а второй запуск хуже...

Всего: 567