Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 106 сообщений
Cообщения с меткой

avito - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Реализация восстановления после аварий

Пятница, 30 Сентября 2016 г. 23:03 (ссылка)

Сергей Бурладян (Avito)



Сергей Бурладян



Всем привет, меня зовут Сергей Бурладян, я работаю в «Avito» администратором баз данных. Я работаю с такими системами:







Это наша центральная база 2 Тб, 4 сервера — 1 мастер, 3 standby. Еще у нас есть логическая репликация на основе londiste (это из Skytools), внешний индекс sphinx’а, различные выгрузки во внешние системы — такая, как DWH, допустим. Еще у нас есть собственные наработки в области удаленного вызова процедуры, xrpc так называемая. Хранилище на 16 баз. И еще такая цифра, что наш бэкап занимает 6 часов, а его восстановление — около 12-ти. Мне хотелось бы, чтобы в случае различных аварий этих систем простой нашего сайта занимал не более 10-ти минут.



Если попытаться представить различные связи этих систем, то они как-то так выглядят:







И как все это не потерять при аварии?



Какие могут быть аварии?







Я рассматриваю, в основном, аварии потери сервера, и плюс для мастера может быть еще такая авария, как взрыв данных.







Начнем.







Допустим, какой-то администратор по ошибке сделал update без where. У нас такой случай был несколько раз. Как от нее защититься? Мы защищаемся с помощью того, что у нас есть standby, который применяет WAL’ы с задержкой в 12 часов. Когда произошла такая авария, мы взяли эти данные со standby и загрузили обратно на master.







Вторая авария, которая может произойти с мастером — это потеря сервера. Мы используем асинхронную репликацию и после потери сервера мы должны сделать promote какого-то standby. А т.к. у нас репликация асинхронная, то необходимо выполнить еще различные процедуры для восстановления связанных систем. Мастер у нас центральный и является источником данных, соответственно, если он переключается, а репликация асинхронна, то мы теряем часть транзакций, и получается, часть системы — в недостижимом будущем для нового мастера.







Руками это все сложно сделать, поэтому нужно сразу делать скриптом. Как выглядит авария? Во внешних системах появляются объявления, которых уже нет на мастере, sphinx выдает при поиске несуществующие объявления, sequences прыгнули назад, логические реплики, в частности из-за этого тоже, перестали работать (londiste).







Но не все так плохо, это все можно восстановить. Мы посидели, подумали и спланировали процедуру восстановления. В частности, DWH мы можем просто выгрузить заново. И непосредственно, т.к. у нас простой 10 минут, то на месячных отчетах изменение этих потерянных items просто не видно.



Как восстанавливать xrpc? У нас xrpc используется для геокодинга, для вызова асинхронных процедур на мастере и для расчета кармы пользователя. Соответственно, если мы что-то загеокодили, т.е. из адреса превратили его в координаты на карте, а потом этот адрес пропал, то ничего страшного, что он останется загеокоденным, просто, мы во второй раз не будем такой же адрес геокодить, соответственно, не надо ничего восстанавливать. Локальный вызов процедуры асинхронный, т.к. он локальный, он расположен на одном сервере базы, даже на одной базе, и поэтому, когда базу мы переключили, она консистентна. Тоже ничего не надо восстанавливать. Карма пользователя. Мы решили, что если пользователь сделал что-то плохое, а потом произошла авария, и мы потеряли эти плохие items, то карму пользователей можно тоже не восстанавливать. Он же сделал эти плохие вещи, пускай у него и останутся.







Sphinx сайта. У нас есть два sphinx — один для сайта, другой для backoffice. Sphinx, который сайта, реализован таким образом, что полностью перестраивает каждые 10 минут весь свой индекс. Соответственно, произошла авария, восстановились, и через 10 минут индекс полностью перестроен и соответствует мастеру. А для backoffice мы решили, что тоже не критично, мы можем зарефрешить часть объявлений, которые изменились после восстановления, и плюс раз в месяц мы полностью перестраиваем весь backoffice sphinx’овский, и все эти аварийные items будут почищены.



Как восстанавливать sequences, чтобы они не прыгали назад? Мы просто выбрали важные для нас sequences, такие как item_id, user_id, платежный первичный ключ, и мы после аварии их прокручиваем вперед на 100 тыс. (мы решили, что нам будет достаточно).



Логическую репликацию мы восстанавливаем с помощью нашей системы, это патч для londiste, которое делает UNDO для логической реплики.







Патч Undo — это такие три команды. Непосредственно сама команда и плюс две команды добавления/удаления Undo для логической реплики. И еще replay в londiste мы добавили флаг, чтобы он передавал TICK_ID с мастера в сессионную переменную Postgres’a.







Это нужно непосредственно в самой реализации Undo, т.к. она реализована — просто это триггеры на всех таблицах subscriber’а. Триггер пишет в табличку истории, какая непосредственно операция произошла. В целевой таблице. Этот переданный tick_id с мастером он запоминает в этой записи. Соответственно, когда произошла авария, логическая реплика оказалась в будущем, и ее нужно почистить, чтобы восстановить изменения, которые из недостижимого будущего. Это делается с помощью выполнения обратных запросов, т.е. для insert мы делаем delete, для update мы обновляем предыдущими значениями, ну, а для delete — insert.







Руками мы все это не делаем, мы делаем с помощью скрипта. Какая здесь особенность нашего скрипта? У нас три асинхронных standby, соответственно, прежде чем переключаться, нужно выяснить, какой из них наиболее близкий к мастеру. Далее, мы выбираем этот standby, дожидаемся, пока он проигрывает оставшиеся WAL’ы из архива, и выбираем его для будущего мастера. Дальше, мы используем Postgres 9.2. Особенности этой версии в том, что чтобы standby переключились на новый промоушн и мастер, их приходится останавливать. По идее, в 9.4 это уже можно не делать. Соответственно, делаем promote, сдвигаем sequences вперед, выполняем нашу процедуру Undo, запускаем standby. И дальше вот тоже интересный момент — нужно дождаться, когда standby подключится к новому мастеру. Мы это делаем с помощью ожидания появления timeline нового мастера на соответствующем standby.







И вот, оказывается, в Postgres нет такой функции SQL’ной, невозможно понять timeline на standby. Но мы решаем это таким способом, оказывается можно подключиться по репликационному протоколу Postgres’а к standby, и там после первой команды standby сообщит свой, выделенный красным, timeline.



Такой у нас скрипт восстановления мастера.







Пойдем дальше. Как мы восстанавливаемся непосредственно, когда внешние системы какие-то разваливаются. Например, standby. Т.к. у нас три standby, как я уже говорил, мы просто берем, переключаемся на оставшийся standby, если один из них падает. В крайнем случае, даже если мы потеряем все standby, мы можем переключить трафик на мастера. Здесь будет теряться часть трафика, но, в принципе, сайт будет работать. Здесь еще была такая хитрость — сначала я все время создавал новые standby из бэкапа, потом у нас появились сервера SSD’шные, а я все так же продолжал восстанавливать из бэкапа standby. Потом оказалось, что если брать из бэкапа, восстановление занимает 12 часов, а если просто взять pg_basebackup с какого-либо работающего standby, то это занимает гораздо меньше времени. Если у вас несколько standby, можно попробовать у вас это проверить.







Если ломается sphinx сайта. Sphinx сайта у нас написан таким образом, что он полностью перестраивает весь индекс, а sphinx сайта — это все активные объявления сайта. Сейчас все 30 или 35 млн. объявлений на сайте индексируются вот этой системой. Индексация идет с отдельной реплики логической, она подготовлена специально для индексации и сделана так, что там все разложено в памяти, и происходит индексация очень быстро, поэтому мы можем делать индексацию каждые 10 минут, полностью с нуля. Реплик логических у нас — по паре. И если мы теряем реплику, мы переключаемся на ее резерв. А если что-то случилось со sphinx, то через 10 минут он полностью переиндексируется, и все будет хорошо.







Как можно восстановить экспорт в DWH? Допустим, что-то мы экспортировали, на DWH произошла авария, мы потеряли часть последних данных. Экспорт DWH у нас идет через отдельную логическую реплику, и на этой реплике хранятся последние четыре дня. Мы можем просто руками заново вызвать скрипт экспорта и выгрузить все эти данные. Плюс там есть еще архив в полгода. Либо, в крайнем случае, т.к. у нас несколько standby, мы можем взять один из них, поставить на паузу и заново выгрузить, вообще, все данные с мастера в DWH.







Хrpc у нас реализован поверх pgq (это Skytools), и благодаря этому мы можем делать такие хитрые штуки. Pgq — это, по сути, просто таблица в базе, в ней хранятся события. Она приблизительно так выглядит, как на рисунке. Там есть время события и id транзакции. Когда мы восстановили клиента xrpc, мы можем взять и сдвинутся назад в этой очереди, и проиграть заново те события, которых нет в получателе.







Xdb — это у нас есть хранилище из нескольких баз. 16 баз расположены на восьми машинах. Это хранилище у нас резервируется следующим образом — просто бинарная репликация Postgres настроена с одной машины на другую. Т.е. первая машина резервируется standby’ем на второй, вторая на третьей, соответственно, восьмая на первой. К тому же, проигрывание WAL’ов, там также происходит задержка в четыре дня, т.е., по сути, у нас есть за четыре дня бэкап любой из этих нод.







Сейчас я подробно расскажу про реплику, что это такое. Логическая реплика построена у нас на основе возможностей Postgres, это есть view’ха на мастере и deferred триггер на нужных таблицах. По этим триггерам срабатывает специальная функция, которая пишет в отдельную табличку. Ее можно считать как материализованное представление. И дальше эта табличка средствами londiste реплицируется на логическую репку.







Непосредственно это как-то так выглядит, я не буду на этом подробно останавливаться.







А сам сервер логической реплики, зачем это, вообще, нужно? Это отдельный сервер. Он характерен тем, что там все находится в памяти, т.е. shared_buffers такого размера, что вся эта табличка и ее индексы полностью в него влезают. Это позволяет на таких логических репликах обслуживать большую нагрузку, в частности, например, одна репка обслуживает у нас 7000 транзакций в секунду, и 1000 событий в очередь с мастера в нее льется. Т.к. это логическая реплика реализована средствами londiste и pgq, то там есть удобная штука — отслеживание, какие транзакции уже проигрались на этой логической реплике. И вот на основе этой штуки можно делать такие вещи как Undo.







Я уже говорил, что реплик у нас две штуки, мы можем восстанавливаться, просто переключаясь. Если одна реплика потерялась, переключаемся на вторую. Это возможно из-за того, что pgq позволяет подписать на одну очередь несколько потребителей. Репка упала, и дальше нам нужно восстановить ее копию. Если это делать просто средствами londiste, то это занимает у нас сейчас для репки сайта 4 часа, для сфинкса — 8 часов, т.к. там вызываются триггеры, которые нарезают данные для удобной индексации сфинксу, и это все очень долго. Но оказалось, что есть другой способ создать упавшую репку — можно сделать pg_dump с работающей.







Но если просто сделать pg_dump и запустить на него londiste, то это все не заработает, потому что londiste отслеживает и на мастере, и на логической реплике текущую позицию проигранной транзакции. Поэтому там еще нужно делать дополнительные шаги. Нужно поправить после восстановления dump’а на мастере tick_id, чтобы он соответствовал тому tick_id, который на восстановленной репке. Если так, через pg_dump копировать, то все это занимает не более 15 минут.







Сам алгоритм как-то так выглядит.







Backup предназначен для защиты от аварий, но непосредственно с самим бэкапом тоже могут происходить аварии. Например, в Postgres команда архивирования WAL, там не указано, что нужно делать fsynk, когда WAL записывается в архив. Но это важная вещь и позволяет защититься от, допустим, аварийной перезагрузки архива. К тому же, у нас бэкап еще резервируется тем, что он копируется во внешнее облако. Но в планах: мы хотим сделать два активных сервера архива, чтобы archive_command писал на оба WAL. Еще можно сказать, что сначала мы экспериментировали с pg_receivexlog для того, что получать непосредственно на самих серверах архива WAL, но оказалось, что в 9.2 его практически невозможно использовать, потому что он не делает fsynk, не отслеживает, какие WAL он уже получил с мастера, какие можно чистить при checkpoint. Сейчас в Postgres это доделали. И, возможно, в будущем мы будем использовать не archive_command, а pg_receivexlog все-таки.







Мы не используем streaming у себя. Т.е. то, про что я рассказывал, это все основано только на WAL архиве. Это было сделано из-за того, что сложно обеспечить при streaming еще и архив, т.к. если, например, берем архив со standby, бэкап завершился, а мастер еще не успел заархивировать все эти WAL’ы, нужные для восстановления бэкапа. И мы получаем битый бэкап. Это можно обойти, если у нас, допустим, standby, с которого мы берем бэкап, отстает на 12 часов, как у нас. Либо — в Postgres 9.5 сделали такую настройку archive_mode=always, при которой такой проблемы не будет. Можно будет брать спокойно бэкап со standby и получать WAL’ы непосредственно тоже со standby в архив.







Недостаточно делать просто бэкап, его еще нужно проверять, все ли там корректно у нас забэкапилось. Мы это делаем на тестовом сервере, и для этого написали специальный скрипт проверки бэкапа. Он основан на том, что проверяет после восстановления сервера и запуска сообщения об ошибках в логе сервера. И для каждой базы, восстановленной на кластере, вызывается специальная проверяющая функция check_backup, которая выполняет дополнительные проверки. В частности, такая проверка, что дата последней транзакции должна отличаться от даты последнего объявления не более чем на минуту. Т.е. если никаких дырок нет, мы считаем, что бэкап восстановлен корректно.







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



Раньше мы проверяли бэкапы с помощью выполнения vacuum’а всей базы и вычитывания таблиц, но потом решили от этого отказаться, потому что мы считаем по восстановленному бэкапу еще отчеты, и если отчеты посчитались корректно, нет никаких дырок, странных значений, то бэкап сделан корректно.







Я рассказывал про асинхронную репликацию, но иногда хочется сделать синхронную. У нас Avito состоит из множества сервисов, один из таких сервисов — это платежный сервис. И благодаря тому, что он выделен, мы можем сделать синхронную репликацию для него, т.к. он работает на отдельной базе. Там не такая большая нагрузка и стандартная latency сети позволяет нам включить там синхронную репликацию.







Что можно сказать в конце? Все-таки, несмотря на то, что репликация синхронная, можно в таком режиме работать и восстанавливаться, если посмотреть на свои связанные системы, то можно придумать, и как их можно восстанавливать. Важно еще тестировать резервные копии.







Еще такое замечание. У нас скрипт восстановления, в конце него необходимо изменить DNS’ы, т.к. у нас мастер это или слэйв — это закреплено в DNS. Мы сейчас думаем о том, чтобы использовать какие-то системы типа ZooKeeper для того, чтобы автоматически переключать DNS. Такие планы.



Этот доклад — расшифровка одного из лучших выступлений на конференции разработчиков высоконагруженных систем HighLoad++. Сейчас мы активно готовим конференцию 2016 года — в этом году HighLoad++ пройдёт в Сколково, 7 и 8 ноября.



Команда Avito традиционно предлагает очень сильные выступления, например, в этом году это будут:





Также некоторые из этих материалов используются нами в обучающем онлайн-курсе по разработке высоконагруженных систем HighLoad.Guide — это цепочка специально подобранных писем, статей, материалов, видео. Уже сейчас в нашем учебнике более 30 уникальных материалов. Подключайтесь!



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/311472/

Комментарии (0)КомментироватьВ цитатник или сообщество
vancsoftremat

Пластыри от простатита

Вторник, 13 Сентября 2016 г. 22:57 (ссылка)

bigimg (197x700, 84Kb)
Его лечебный эффект максимально продолжителен, он длится до тех пор, пока пластырь находится на коже.
Его лечебный эффект максимально продолжителен, он длится до тех пор, пока пластырь находится на коже.

Комментарии (0)КомментироватьВ цитатник или сообщество
noiblenevgleb

iTherm - интеллектуальный термометр

Вторник, 13 Сентября 2016 г. 09:51 (ссылка)

bigimg (197x700, 84Kb)
Все данные сохранятся в памяти вашего смартфона, а при слишком высокой температуре приложение подаст предупреждающий сигнал.
Все данные сохранятся в памяти вашего смартфона, а при слишком высокой температуре приложение подаст предупреждающий сигнал.

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Новые игроки на российском рынке онлайн-объявлений пытаются конкурировать с Avito

Вторник, 23 Августа 2016 г. 18:16 (ссылка)





Рынок объявлений о продаже и покупке автомобилей, недвижимости и предложений о вакансиях сегментирован — на нем много региональных игроков, и оценивать его сложно, говорит гендиректор компании «Пронто Медиа» Николас Дадиани. «Предположим, что за пределами Avito они создают рынок приблизительно еще на 3 миллиарда рублей, тогда общий размер рынка объявлений в Рунете в 2015 году составит около 12 миллиардов рублей», — предполагает Дадиани.



Аналитики Goldman Sachs в своем исследовании прогнозируют, что к 2020 году Avito станет лидером российского рынка в категории general classifieds, в которой будет занимать 98% рынка. Но этот сегмент будет самым незначительным в финансовом выражении: его объем составит $61 миллион (около 4,3 млрд рублей), в то время как весь российский рынок онлайн-классифайдов вырастет почти в 4 раза – до 47 миллиардов рублей ($667 млн), считают в Goldman Sachs.



Сегмент онлайн-объявлений о недвижимости в 2020 году эксперты Goldman Sachs оценивают в $242 миллиона (17 млрд рублей), автомобильных объявлений и объявлений о работе — по $182 миллиона (около 13 млрд рублей) каждый.



Новые успехи Avito



17 августа стало известно, что выручка компании Avito AB, которой принадлежат российский сервис онлайн-объявлений Avito.ru и сайт объявлений недвижимости domofond.ru, увеличилась на 86% и составила 2,9 миллиарда рублей ($45,6 млн). Первым об этом сообщил шведский инвестфонд Vostok New Ventures, который является акционером Avito.



В конце прошлого года южноафриканский медиахолдинг Naspers купил 50,5% Avito, увеличив свою долю до 67,9% с 17,4%. В рамках этой сделки компания была оценена в $2,7 миллиарда, включая средства на счетах в размере примерно $240 миллионов. В декабре Avito распределила среди акционеров в качестве дивидендов почти все наличные средства — $230 миллионов.







Vostok New Ventures не участвовал в сделке и сохранил 13,3% в капитале Avito. Стоимость Avito на конец июня оценивалась в $2,48 миллиарда.



Вся выручка получена от российского сайта Avito.ru. Показатель EBITDA во II квартале 2016 года составил 59,7%, или 1,7 миллиарда рублей ($27,2 млн), против 50,5%, или 794 миллионов рублей, годом ранее.



Количество просмотров страниц сайта Avito достигло 30 миллиардов, 56% пришлось на просмотры с мобильных устройств.



В прошлом квартале выручка компании также выросла на 86%, до 2,249 миллиарда рублей.



«Юла»



10 августа Mail.ru Group впервые официально сообщил о развитии собственного сервиса онлайн-объявлений «Юла». Это произошло спустя 9 месяцев после его фактического запуска. «Юла» ежемесячно собирает более 2,5 миллиона пользователей мобильных устройств. Об этом изданию «Коммерсант» сообщили представители компании. MRG надеется развивать сервис за счет наработанной ранее пользовательской аудитории. Поэтому компания готова инвестировать большие суммы в свой новый проект, чтобы достойно конкурировать с Avito в перспективе.



«Юла» предлагает пользователям способ продажи и возможность покупки товаров в непосредственной близости от покупателя и продавца. «Мы фокусируемся на мобильном рынке, потому что смартфон — универсальное устройство, которое помогает фотографировать, созваниваться и писать, а также позволяет определять геолокацию в отличие от десктопа, — объясняет руководитель проекта «Юла» Егор Абрамец. — При этом mobile — это фильтр для выкладки оригинальных фотографий, так как в персональном компьютере гораздо проще скопировать чужую картинку с сайта и разместить ее в объявлении».



Продавец может зарегистрироваться в приложении через аккаунт в социальной сети или по номеру мобильного телефона, загрузить фото товара и заполнить описание — и объявление появится в ленте. В сервис интегрированы внутренний мессенджер и телефонные звонки, которые позволяют уточнить все вопросы и договориться о встрече.



Пока «Юла» бесплатна для покупателей и продавцов. «Сейчас перед нами стоят аудиторные цели», — говорят в Mail.ru Group, не раскрывая статистику по загруженным объявлениям.



Отличительная черта «Юлы» — показ объявлений с учетом местоположения пользователя и его интересов, обращают внимание в Mail.ru Group. «Юла» на основе геопозиции пользователя показывает ближайшие предложения, так как во время создания объявления фиксируется и геопозиция товара, говорит господин Абрамец. По его словам, SDK соцсетей позволяет получать социально-демографические характеристики пользователя, если он разрешил доступ. «На основе соцдема мы предлагаем релевантные его интересам категории», — рассказал он.







Ставка на мобильность дает ряд конкурентных преимуществ — оптимальное предложение по геолокации, что значительно экономит время поиска, поэтому она «абсолютно оправданна», считает акционер Run Capital Андрей Романенко. «Это должно позитивно сказаться на конверсии. У проекта есть все шансы на успех, учитывая принадлежность к Mail.ru Group и ее большую пользовательскую аудиторию, ведь классифайд в линейке продуктов компании был недостающим звеном», — полагает он. По данным TNS, в июне совокупная аудитория проектов, входящих в Mail.ru Group, составила 56,1 миллиона человек.



Пока безусловным лидером на российском рынке является онлайн-классифайд Avito. Но вместе с тем, Avito – это еще и позитивный пример для российского интернет-рынка. Осенью 2015 года компания была оценена в $2,7 миллиарда в рамках сделки по покупке 50,5% акций компании холдингом Naspers. Это примерно половина всей капитализации MRG. Naspers также является и акционером Mail.ru Group.



Первая версия приложения «Юла» была запущена 15 октября 2015 года, следует из сообщения компании. По данным источника на рынке, MRG достаточно активно использовала ресурсы принадлежащих ей сетей «Одноклассники» и «ВКонтакте», чтобы привлечь аудиторию для нового сервиса. Несмотря на это, «Юла» отстает от Avito почти в 10 раз, если верить данным Avito. Последняя со ссылкой на данные Фонда «Общественное мнение» утверждает, что ее аудитория составляет 20 миллионов человек.



«Яндекс.Вертикали»



В январе 2016 года «Яндекс» выделил в отдельные структуры два подразделения, приносящих ему нерекламный доход, — «Яндекс.Такси» и сервис объявлений «Яндекс.Вертикали». Выделение сервисов поможет диверсифицировать риски и снизить рекламную долю в структуре выручки «Яндекса», которая сейчас составляет почти 99%.



В «Яндекс.Вертикали» войдут все сервисы объявлений «Яндекса» — «Авто.ру», «Яндекс.Недвижимость», «Яндекс.Работа» и «Яндекс.Путешествия». «Яндекс.Вертикали» планирует составить конкуренцию лидеру российского рынка Avito.







Вот что по этому поводу рассказывал РБК генеральный директор сервиса «Яндекс.Вертикали» Антон Забанных:


В 2010 году открылись агрегационные сервисы «Яндекс.Авто» и «Яндекс.Недвижимость». Их цель была «запылесосить» все объявления в интернете внутрь себя и давать по ним удобный поиск. Таким образом, партнеры получали трафик, а мы монетизировались за счет рекламы. Теперь мы от этой модели постепенно уходим — рынок меняется, его участникам становятся интересны другие форматы.



С покупкой «Авто.ру» мы ушли от предыдущей модели совсем: мы раздаем не трафик, а покупателей и звонки, и уже не агрегируем объявления. С «Яндекс.Недвижимость» та же история: первоначально сервис был агрегатором объявлений, но в декабре 2014 года мы начали принимать объявления напрямую. Правда, при таком подходе есть масса проблем, но мы их решаем.



Ключевая — качество информации. Знаете, вообще все, чем мы занимаемся, — это очень неудобные для людей сферы. Допустим, вы хотите купить машину. Казалось бы, покупка нового автомобиля — более комфортный сценарий, чем попытка найти хорошую подержанную машину. Однако, определившись с маркой, вы нигде не сможете посмотреть, какие машины сейчас есть в салонах в наличии. Придется объезжать эти салоны, общаться с менеджером, который будет деловито зачитывать список опций каждого автомобиля, не называя цену.



С подержанными автомобилями все еще хуже. Есть объявления, которые вроде о каких-то объектах из физического мира, но насколько они правдивы — вообще никому непонятно. Мы хотим эту непрозрачность, этот хаос, устранить. Мы не хотим быть просто досками объявлений, хотим стать объективным средством выбора.
_________________________________________________________________________________________



Тем не менее, пока Avito входит в число самых популярных сайтов рунета. Однако после введения на этом сервисе платных объявлений ситуация может в какой-то степени измениться.



P.S.



К концу 2015 года месячная аудитория Рунета достигла 83 миллионов человек — столько россиян старше 12 лет каждый месяц пользовались интернетом. По данным Фонда «Общественное мнение», проникновение составило 67%; группа TNS зафиксировала 68%. Города-миллионники достигли потолка, здесь аудитория почти перестала увеличиваться, следует из исследования «Яндекса».



В среднем за неделю с одного устройства просматривается примерно 13 различных сайтов на смартфоне и 27 на десктопе. «Яндексу» удалось выделить 28 сервисов, которые востребованы пользователями Рунета вне зависимости от географии. На них приходится треть просмотров страниц из каждого города.



Самыми популярными сайтами являются соцсеть «ВКонтакте», онлайн-классифайд Avito, портал Mail.ru, соцсеть «Одноклассники», видеохостинг YouTube, а также китайский интернет-магазин Aliexpress.
Original source: habrahabr.ru.

https://habrahabr.ru/post/308366/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
UnaLacrima

Не пойму: в чем подвох?

Четверг, 12 Мая 2016 г. 17:34 (ссылка)


Продаю на avito  разные не нужные вещи. Сегодня позвонила женщина, хочет купить у меня платье, но оно нужно срочно. Предлагает перевести мне за него деньги и прислать ко мне домой яндекс-такси. Я отказалась. Чувствую какой-то подвох. Во-первых, домой чужих людей не приглашаю, во-вторых, как-то очень странно: покупать платье заочно, не видя его и не померив? Какая нормальная женщина будет так делать? От Мытищ (где она) до Москвы ехать-то минут 40. Новый вид развода с переводом? И говорила как-то слишком настойчиво.


Метки:   Комментарии (1)КомментироватьВ цитатник или сообщество
Andrey_GREEN

Началось на Avito.ru: раскрутились, теперь можно и ВЫЖАТЬ продавцов и покупателей на Авито

Вторник, 19 Апреля 2016 г. 15:33 (ссылка)

1.) Авито стал планомерно выживать продавцов платным размещением объявлений.
2.) Настало время платной альтернативной площадки !!!
3.) Думаете выжмут только продавцов ? Вы реально так смешно считаете ? Думаете продавцы не учтут цену за размещение в цене товара ? - наивные.
4.) Пришел кризис - владельцам хочется бабла. "Весна пришла - строиться надо, 55z дача на Багамах нуждается в достройке, а дай как я всех ...бу", подумал владелец и сделал объявления ПЛАТНЫМИ !
5.) Самое смешное, что они иезуитски, не извинились, за ... такое - а начали убеждать что "ЭТО НАМ ДАЖЕ ВСЕМ ЛУЧШЕ БУДЕТ !!!" писец. Обосновать, как говорится, можно и геноцид - был бы заказ.

P.S. Лучше бы свой убогий отсталый тупой поиск на сайте улучшили бы ... а то поделка маразматика из 8 класса школы, иначе и не назовешь

Метки:   Комментарии (2)КомментироватьВ цитатник или сообщество
новости_кмв

Без заголовка

Четверг, 04 Февраля 2016 г. 11:09 (ссылка)
news-kmv.ru/kmv/obschestvo/...orske.html


AVITO прокоментировало ситуацию по краже денег в Пятигорске » Новости Кавказских Минеральных Вод / Самая актуальная информация! Новости Пятигорска, Новости Кисловодска, Новости Ессентуков, Новости Минеральных Вод, Новости Железноводска, Новости Лермонтова, Новости Георгиевска, Новости Ставрополя

Комментарии (0)КомментироватьВ цитатник или сообщество
lgpskov

Осторожно, мошенники на Avito.ru. Новый вид жуликов - покупатели недвижимости.

Понедельник, 11 Января 2016 г. 12:46 (ссылка)

Осторожно, мошенники на Avito.ru. Новый вид жуликов - покупатели недвижимости.
Подробнее у меня в дневнике: www.dnevnik-dnevnik.ru/day.php?Date=2015-04-27

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
vsemmoney

Любые выборки Avito и IRR - Купля/продажа и услуги - Форум о заработке в интернете и инвестициях

Воскресенье, 10 Января 2016 г. 17:06 (ссылка)
vsemmoney.ru/topic/1602-liu...ito-i-irr/


Любые выборки Avito и IRR - отправлено в Купля/продажа и услуги: Любые выборки контактов из Avito и IRR.

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Совет1

Как успешно продавать на Avito

Вторник, 15 Декабря 2015 г. 06:10 (ссылка)

Avito.ru – крупнейшая доска объявлений рунета и онлайн-барахолка. Когда кому-то нужно избавиться от старой, а может быть и новой, но ненужной вещи через интернет, именно этот сайт приходит на ум первым. Новые объявления появляются на Авито каждую секунду, поэтому пробиться через столь мощный поток предложений бывает нелегко. Если вы задались вопросом, почему одни с успехом сбывают откровенное барахло, а у других не получается продать великолепные вещи даже с помощью платных объявлений, вам однозначно необходим краткий курс технологии интернет-продаж...Далее

Комментарии (0)КомментироватьВ цитатник или сообщество
Универмос

Купить квартиру в Москве на авито avito

Вторник, 01 Декабря 2015 г. 12:36 (ссылка)
https://www.avito.ru/moskva..._652108455

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Как я мониторил Avito по SMS

Четверг, 15 Октября 2015 г. 10:31 (ссылка)

Как известно, на «Авито» периодически появляются товары очень хорошего качества и при этом очень дешевые. Но появляются они редко, висят там мало и исчезают быстро.



Поэтому возникла у меня идея: а не поискать ли сервис, который раз в несколько минут проверяет объявления, и если появилось что-то интересное для меня — оповещает об этом? При этом оповещать лучше всего по смс, а то почту я не всегда проверяю оперативно.



Гуглинг выдал несколько таких сервисов, «всего» от 3 руб за смс или от 4 руб в сутки.



В итоге, я решил написать такой сервис самостоятельно, но об этом дальше…



Для интереса я зарегистрировался на одном из сервисов. Вчера он проверял ссылки каждые 15 минут, и если что изменилось, слал уведомления на почту. Про смс же у них на сайте было вскользь упомянуто, что почта mail.ru умеет отправлять смски. По факту оказалось, что mail.ru умеет отправлять только на мегафон, а у меня совсем даже не он… А если надо билайн-мтс, то пожалуйста, сервис с удовольствием поможет, за отдельную денежку.



Замечу также, что я давно являюсь пользователем очень удобного и бесплатного сервиса, о котором давным-давно писали тут же на хабре, и который позволяет отправить письмо с определенной темой на определенный ящик, и содержание письма придет мне в виде смс. Хотел указать свой_ящик@sms.ru для писем сервиса, но не понял как поменять тему письма, без чего смс не получишь.



Кроме того, сегодня демо-период глисы закончился, и периодичность проверки стала 720 минут.



В общем, подумав что платить за, прошу прощения, «сервис» такого уровня это все равно что платить за винду воздух, я решил что проще всего потратить часа 3 своего ценного времени и соорудить подобный сервис самому, благо парсинг страницы «Авито» тривиальный и, как следует ниже, занял у меня ровно 1 строчку кода.



Я для этого скрипта использовал VPS-хостинг. Подойдет также WEB-хостинг, при условии наличия на нем перла, доступа «наружу» и планировщика. В крайнем случае, подойдет любой включенный в инет комп. Думаю, у многих есть что-то подобное.



На чем написан скрипт



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



Логика работы, кратко



— Запускаем скрипт каждые xxx минут;

— Скачиваем страничку с помощью wget;

— Храним скачанную в прошлый раз страничку, сравнивая ее с вновь скачанной, если какие-то объявления изменились/появились новые — отправляем смс об этом.



Вытаскиваемая из объявлений инфа — это:



1. URL объявления (который я использую как уникальный идентификатор объявления);

2. Название;

3. Цена.



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



Детальнее



Перед использованием проверить пути и имена для mailer и wget, убедиться что они у вас есть и работают. В частности, у меня в centos мейлер называется mutt, чаще встречается mail или sendmail с тем же синтаксисом. Может быть, вам надо заменить wget на /usr/local/bin/wget и т.п.



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



Запускать скрипт командой: ./avito.pl урл_страницы_с_объявлениями.



Замечу, что URL страницы должен быть в виде «списком с фото». Иначе говоря, в урле не должно быть никаких &view=list или &view=gallery.



Пример урла: www.avito.ru/moskva?q=%D1%80%D0%B5%D0%B7%D0%B8%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9+%D1%81%D0%BB%D0%BE%D0%BD



Страница скачивается в файл с именем полученным из урла, с заменой всех левых символов на подчеркивания, наподобие такого:



https___www.avito.ru_moskva_q__D1_80_D0_B5_D0_B7_D0_B8_D0_BD_D0_BE_D0_B2_D1_8B_D0_B9__D1_81_D0_BB_D0_BE_D0_BD



Оно должно быть уникальным, поддерживаться и в линуксе, и в винде и при этом быть достаточно читаемым.



Если такой файл уже есть, скрипт пытается вытащить из него объявления. Если объявлений в файле не найдено, скрипт вызывает wget, при этом перезаписывая файл. Если объявления найдены, файл сохраняется с суффиксом -1:



https___www.avito.ru_moskva_q__D1_80_D0_B5_D0_B7_D0_B8_D0_BD_D0_BE_D0_B2_D1_8B_D0_B9__D1_81_D0_BB_D0_BE_D0_BD-1



Далее страница скачивается заново, в ней проверяются следующие ситуации:



1. Если объявления в новой скачанной странице не найдены, скрипт просто завершается — старая страница остается с суффиксом -1. Это на тот случай, если вдруг сеть пропала или подвисла — прошлый список объявлений не потеряется.

2. Если скрипт запущен в первый раз (не найдена ранее скачанная страница), то инфа придет просто о количестве имеющихся объявлений:

Found 25 items, page www.avito.ru/moskva?q=%D1%80%D0%B5%D0%B7%D0%B8%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9+%D1%81%D0%BB%D0%BE%D0%BD monitoring started


Если это сообщение пришло, значит система запустилась, это главным образом проверка того, что все заработало.



Поскольку смс должно быть чем короче, тем лучше, то все сообщения очень лаконичны.



3. Если появилось новое объявление, то инфа об этом добавится в текст будущей смс. Потом по всем объявлениям инфа придет в виде одной смс.

4. Если изменилась цена или наименование товара, то инфа придет в виде: старая_цена -> новая_цена наименование ссылка. Или новое_название ссылка.



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



5. В консоль выводится отдельным текстом список того, что нашлось. Это сделано больше для отладки, потому как сегодня парсер работает, а завтра, когда они поменяют разметку, перестанет. Придется менять парсинг.



О парсинге и нюансах



Собственно, весь парсинг — в этой строчке:



while($text=~/


Хотя, еще цена содержит пробел в виде nbsp, который я вырезаю другим regexp-ом:



$price=~s/ //g


Так что парсинг, формально говоря, все же не в одной, а в двух строчках.



g — модификатор глобального поиска, который позволяет засунуть поиск внутрь условия while, выдавая каждый раз следующее объявление;

s — позволяет внутри одного регекспа проводить поиск в нескольких строчках (на «Авито» URL, наименование и цена располагаются на 4 строках, но это сейчас, пока они верстку не поменяли).



Также замечу, что для многострочного чтения файла в начале скрипта присваивается:



undef $/;


Это чтобы my $text=; прочитал в себя весь файл целиком.



Еще нюанс: я во все смски вставляю кликабельные урлы. У меня нормальный смартфон, который позволяет ткнуть в урл внутри смс и попасть на нужную страницу, очень удобно. Так вот, почему-то sms.ru портит такой невинный символ, как подчеркивание. Заменяя его на %C2%A7. Повлиять я на это не могу, зато могу заменить его на код подчеркивания, который доходит нормально, при этом урл становится кликабельным для sms.ru, оставаясь таким и для обычной почты: $text=~s/_/%5F/g;



Добавляем задание в планировщик



#crontab -e
*/20 * * * * cd /scripts/avito && ./avito.pl 'https://www.avito.ru/moskva?q=%D1%80%D0%B5%D0%B7%D0%B8%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9+%D1%81%D0%BB%D0%BE%D0%BD'


Каждые 20 минут вызывать скрипт, проверяя страницу. Не забыть экранировать URL одинарными кавычками.



Таких заданий можно задать сколько угодно, они все будут работать независимо друг от друга.



Что я еще не сделал для промышленного варианта и что было бы легко доделать



1. Веб-морду для добавления/удаления юзеров и заданий. Хранение урлов, периодичности, ящика и телефона юзеров на sms.ru в базе mysql. Скрипт бы вызывался каждую минуту, проверял, по какому урлу выполняться и слал бы смс не на мой жестко забитый номер, а на тот, который задан пользователем.



Тогда можно было бы сдирать с юзеров по 8 рублей в день или что-то типа того. Может, заняться? Есть желающие за такую штуку денег заплатить?



2. Фильтр цен. Игнорировать цену выше или ниже заданной. Делается элементарно, еще одним if: next if($page_new{"price"}{$uri}>$max_price or $page_new{"price"}{$uri}<$min_price). Просто не нужно было.



3. По аналогии с «Авито», добавить авто.ру, irr и т.п. сайты.



Тоже элементарно, просто за тем while(...){...} дописать еще несколько while — каждому сайту по одному. Главное, чтобы внутри них заполнялись $page{"name"}{$uri} и $page{"price"}{$uri}.



По каждому сайту будет срабатывать свой while, остальные просто возвращать пустой результат.



Ну и собственно код скрипта



#!/usr/bin/perl

use strict;
undef $/;

my $url=$ARGV[0];
my $mailer="mutt";
my $wget="wget";

if($url eq ""){
print "Usage: avito.pl /www.avito.ru/...url>";
exit;
}

my $filename=$url;
$filename=~s#[^A-Za-z0-9\.]#_#g;
$url=~m#(^.*?://.*?)/#;
my $site=$1;
print "site:".$site."\n";

sub sendsms {
my $text=shift;
$text=~s/_/%5F/g;
system("echo '$text' | $mailer -s 79xxxxxxxxx xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\@sms.ru");
}

sub parse_page {
open(MYFILE,"<".shift);
my $text=;
close(MYFILE);
my %page;

while($text=~/

\n(.*?)\n.*?
\n\s*(\S*)/gs)
{
my $uri=$1;
my $name=$2;
my $price=$3;
$uri=~s/^\s+|\s+$//g;
$name=~s/^\s+|\s+$//g;
$price=~s/^\s+|\s+$//g;
$price=~s/ //g;

$page{"name"}{$uri}=$name;
$page{"price"}{$uri}=$price;
}
return %page;
}

my %page_old=parse_page($filename);

if(scalar keys %{$page_old{"name"}}>0){
system("cp $filename ${filename}-1");
}
else{
%page_old=parse_page("${filename}-1");
}
system("$wget '$url' -O $filename");
my %page_new=parse_page($filename);

if(scalar keys %{$page_old{"name"}}>0){ # already have previous successful search
if(scalar keys %{$page_new{"name"}}>0){ # both searches have been successful
my $smstext="";
foreach my $uri(keys %{$page_new{"name"}})
{
if(!defined($page_old{"price"}{$uri})){
$smstext.="New: ".$page_new{"price"}{$uri}." ".$page_new{"name"}{$uri}." $site$uri\n ";
}
elsif($page_new{"price"}{$uri} ne $page_old{"price"}{$uri}){
$smstext.="Price ".$page_old{"price"}{$uri}." -> ".$page_new{"price"}{$uri}." ".$page_new{"name"}{$uri}." $site$uri\n";
}
if(!defined($page_old{"name"}{$uri})){
# already done for price
}
elsif($page_new{"name"}{$uri} ne $page_old{"name"}{$uri}){
$smstext.="Name changed from ".$page_old{"name"}{$uri}." to ".$page_new{"name"}{$uri}." for $site$uri\n";
}
}
if($smstext ne ""){
sendsms($smstext);
}
}
else{ # previous search is successful, but current one is failed
# do nothing, probably a temporary problem
}
}
else{ # is new search
if(scalar keys %{$page_new{"name"}}<=0){ # both this and previous have been failed
sendsms("Error, nothing found for page '$url'");
}
else{ # successful search and items found
sendsms("Found ".(scalar keys %{$page_new{"name"}})." items, page '$url' monitoring started");
}
}

foreach my $uri(keys %{$page_new{"name"}})
{
print "uri: $uri, name: ".$page_new{"name"}{$uri}.", price: ".$page_new{"price"}{$uri}."\n";
if($page_new{"price"}{$uri} eq $page_old{"price"}{$uri}){print "old price the same\n";}
else{print "old price = ".$page_old{"price"}{$uri}."\n";}
if($page_new{"name"}{$uri} eq $page_old{"name"}{$uri}){print "old name the same\n";}
else{print "old name = ".$page_old{"name"}{$uri}."\n";}

}



Original source: habrahabr.ru (comments, light).

http://habrahabr.ru/post/268857/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Olga_nails

Развод на АVITO

Понедельник, 05 Октября 2015 г. 23:43 (ссылка)

Личный опыт: разместила объявление о продаже коляски в 21'30, минут через 10-15 звонит мужчина и говорит, что его жене моя коляска понравилась и он её хочет оплатить сейчас, а жена завтра приедет заберет. Он находится в командировке и поэтому приехать не может. Параллельно спрашивает в каком она состоянии, как долго пользовались и т.д. В общем запудривает мозги. Для перевода денег спрашивает номер карты и просит пароль, который придет тебе по смс, для какого-то подтверждения.
ЛЮДИ !!! НЕ ВЕДИТЕСЬ !!!
Как только ты сообщаешь пароль они подключаются к твоему онлайн-кабинету в банке и пока деньги!!! P.S.: сообщила неправильный пароль и сказала, что меня не надо разводить - меня послали(((

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<avito - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda