nginx на VDS установлен как балансировщик нагрузки (НАГРУЗКИ — из моих уст звучит смешно, так же смешно как SSD НАКОПИТЕЛЬ), который распределяет запросы на другие хосты (ноды).
другими хостами выступают ssh-тоннели, идея в том, что берём горстку ноутбуков, каждый из которых выступает как нода, копируем на него PHP ПРИЛОЖЕНИЕ (я сегодня в ударе), и просто пробрасывая с ноутбука ssh-тоннель на VDS — теперь эта нода может учавствовать в распределении нагрузки и обработке запросов. всё очень легко и прозрачно, любая нода может в любой момент отказать в работе, на работу сайта это не влияет, балансировщик делает своё дело.
/ -- > PHP NODE < -- > \
/ \
INTERNET -- > LOAD BALANCING -- -- > PHP NODE < -- -- > SQL
\ /
\ -- > PHP NODE < -- > /
три ноды, три ssh-тоннеля до балансировщика
# ssh -fnNT -R 8081:localhost:80 spoofing@VDS
# ssh -fnNT -R 8082:localhost:80 spoofing@VDS
# ssh -fnNT -R 8083:localhost:80 spoofing@VDS
когда узким местом станет сетевой стек на балансировщике, то просто берём ещё одну VDS, копируем на неё этот LB (Load Balancing), добавляем в DNS A-запись нового балансировщика, и всё, теперь ещё один LB учавствует в распределении нагрузки, а между LB нагрузка распределяется по методу round-robin на уровне DNS.
1) главное чтобы работала хотя бы одна нода, тогда будет работать и сайт
3) SQL база для всех приложений ясное дело должна быть общей, и она не должна отказывать в работе.
больше узких мест я не вижу.
как мне казалось...
вот такой конфиг nginx на балансировщике
upstream host {
server localhost:8081;
server localhost:8082;
server localhost:8083;
server localhost:8084 backup;
server localhost:8085 backup;
}
server {
...
location / {
proxy_pass http://host;
...
}
}
с другого локального хоста, который находится в одной сети с одной из нод с адресом 192.168.0.1, я тестирую бенчмарком производительность.
# ab -n 1000 -c 100 -k -H "Host: spfng.com" 192.168.0.1/blog/hello-world/
Requests per second: 601.67 [#/sec] (mean)
600 запросов, боже ты мой, 600 запросов в секунду, на днищеноутбуке с целероном 1.86ггц и 4гб памяти на борту, из которой занято всего 100мб. на запрашиваемой страничке выполняется три SELECT и один UPDATE, база данных SQLite, — нода обрабатывает 600 запросов в секунду. вот, значит выяснили потолок этой ноды.
отлично! так, а теперь давайте попробуем проделать тоже самое, но только обращаясь не напрямую к ноде, а через балансировщик нагрузки находящийся в интернете, чтобы запросы шли через ssh-тоннель проброшенный от ноды.
# ab -n 1000 -c 100 -k spfng.com/blog/
Requests per second: 41.61
what the f... почему? ssh-тоннель такой медленный? ssh-тоннель создаёт такой огромный сетевой I/O лаг?
при чём знаете, я с этой же ноды пробрасываю ещё два ssh-тоннеля, что в теории должно увеличивать количество обрабатываемых нодой запросов, ведь они теперь распределяются между несколькими ssh-тоннелями равномерно но... этого не происходит!
почему? и что делать? что с одним ssh-тоннелем я имею 30-40 rps, что с тремя, с пятью ssh-тоннелями работающих _ПАРАЛЛЕЛЬНО_ я имею всё те же самые 30-40 rps.
какого чёрта? какого чёрта, ЛОР?