44
Защита от парсинга под нагрузкой Дмитрий Бархатов 2gis.ru @rnd2gis

Дмитрий Бархатов, 2ГИС

  • Upload
    ontico

  • View
    2.025

  • Download
    1

Embed Size (px)

DESCRIPTION

HighLoad++ 2013

Citation preview

Page 1: Дмитрий Бархатов, 2ГИС

Защита от парсинга поднагрузкой

Дмитрий Бархатов

2gis.ru @rnd2gis

Page 2: Дмитрий Бархатов, 2ГИС

2ГИС

Page 3: Дмитрий Бархатов, 2ГИС

Данные

• 5 стран

• 10 тыс. населенных пунктов

• 5 млн. гео-объектов

• 2 млн. организаций

• 15 тыс. маршрутов

3

Page 4: Дмитрий Бархатов, 2ГИС

Нас парсят

Page 5: Дмитрий Бархатов, 2ГИС

5

Page 6: Дмитрий Бархатов, 2ГИС

Проблемы

Мусорная нагрузка +

Плохая карма

Page 7: Дмитрий Бархатов, 2ГИС

Что делать?

Page 8: Дмитрий Бархатов, 2ГИС

1. IP

Page 9: Дмитрий Бархатов, 2ГИС

NAT

• Студенческая сеть

• Сотовая вышка

9

Page 10: Дмитрий Бархатов, 2ГИС
Page 11: Дмитрий Бархатов, 2ГИС

2. API-ключhttp://api.2gis.ru/search?what=Пиво&where=Москва&key=1234

Ограничение по referer

11

Page 12: Дмитрий Бархатов, 2ГИС

› curl --referer 2gis.ru

Page 13: Дмитрий Бархатов, 2ГИС

Кийя!

Page 14: Дмитрий Бархатов, 2ГИС

3. Аналитикана лету

Page 15: Дмитрий Бархатов, 2ГИС

Анализируем нагрузку• RPS

• Нагрузка в динамике

15

Page 16: Дмитрий Бархатов, 2ГИС

Нагрузка за длительный периодНормальная ситуация

16

Page 17: Дмитрий Бархатов, 2ГИС

Нагрузка за длительный периодПарсер

17

Page 18: Дмитрий Бархатов, 2ГИС

Анализ активности на проекте• Хостинг

• Прачечные

• Школы каскадёров

• Матрасы

• Алмазное бурение

18

Page 19: Дмитрий Бархатов, 2ГИС

Итого по аналитике• Текущая нагрузка

• Кратковременная нагрузка

• Долговременная нагрузка

• Поведение

19

Page 20: Дмитрий Бархатов, 2ГИС

Как делать?

Page 21: Дмитрий Бархатов, 2ГИС

Каменный век — локация в NginX

geo $ban {

213.180.193.49 1;

}

01.

02.

03.

21

Page 22: Дмитрий Бархатов, 2ГИС

Средневековье — PHP + Redis22

Page 23: Дмитрий Бархатов, 2ГИС

Современность — Lua

openresty.org

23

Page 24: Дмитрий Бархатов, 2ГИС

ngx_lua

location / {

content_by_lua '

ngx.say("hello, highload++")

';

}

01.

02.

03.

04.

05.

24

Page 25: Дмитрий Бархатов, 2ГИС

Lua: считаем RPS

http {

lua_shared_dict RPS 10m;

...

01.

02.

03.

25

Page 26: Дмитрий Бархатов, 2ГИС

Lua: считаем RPS

ip = ngx.var.remote_addr

rps = ngx.shared.RPS:incr(ip, 1)

if rps > X then

ngx.shared.BANNED:set(ip, 1)

ngx.exit(444)

end

01.

02.

03.

04.

05.

06.

26

Page 27: Дмитрий Бархатов, 2ГИС

Lua: смотрим динамику

for i = -60, 0 do

-- смотрим данные в хранилище

-- принимаем решение

end

01.

02.

03.

04.

27

Page 28: Дмитрий Бархатов, 2ГИС

Нагрузка в течение сутокLua как поставщик данных

location /get_bad_guys {

content_by_lua '

-- отдаем данные из хранилища

';

}

01.

02.

03.

04.

05.

28

Page 29: Дмитрий Бархатов, 2ГИС

Отстреливаем негодяевif ngx.shared.BANNED:get(ip) then

ngx.exit(444)

end

01.

02.

03.

29

Page 30: Дмитрий Бархатов, 2ГИС

Скорость?

Page 31: Дмитрий Бархатов, 2ГИС

Бенчи голосуют за Lua

http://openresty.org/#Benchmark

http://benchmarksgame.alioth.debian.org/u64/benchmark.php

http://attractivechaos.github.io/plb/

31

Page 32: Дмитрий Бархатов, 2ГИС

1 мс

Page 33: Дмитрий Бархатов, 2ГИС

Да ладно!

Page 34: Дмитрий Бархатов, 2ГИС

1 мс

Page 35: Дмитрий Бархатов, 2ГИС

16000 RPS

Page 36: Дмитрий Бархатов, 2ГИС

Lua (1 мс) vs PHP (15 мс)

Page 37: Дмитрий Бархатов, 2ГИС

Попался, голубчик!

Page 38: Дмитрий Бархатов, 2ГИС

Бан или не бан• Уверены → Бан

• Не уверены → Помогите, люди добрые

38

Page 39: Дмитрий Бархатов, 2ГИС

Когда снимать бан?

Page 40: Дмитрий Бархатов, 2ГИС
Page 41: Дмитрий Бархатов, 2ГИС

Минусы всего подхода• Нет однозначной идентификации

• Бот может замаскироваться

41

Page 42: Дмитрий Бархатов, 2ГИС

Результат

В связи с временными техническими проблемами онлайн-версии

2GIS, мы решили предложить Вам выгодные условия по

приобретению нашей программы: успейте купить парсер организаций

2GIS по цене 2000 рублей вместо 4000 рублей

42

Page 43: Дмитрий Бархатов, 2ГИС

Просто и быстроИспользуйте простые скриптовые языки в связке с NginX с

алгоритмами анализа статистики в реальном времени.

43

Page 44: Дмитрий Бархатов, 2ГИС

Вопросы?

Дмитрий Бархатов

[email protected]

44