Etikettarkiv: sphinx

Docker är kittet i DevOps

Docker

Då och då dyker det upp mjukvara som underlättar livet avsevärt, då man nästan utropar Heureka! När jag först lärde mig använda Fabric så tycke jag att detta var ju guld värt: Att slippa göra samma sak manuellt på flera servrar. DevOps-filosofin i ett nötskal

Men! Nu tog jag mig tid och försökte lära mig Docker. Docker har tagit det hela lite längre och isolerar filer samt processer från underliggande operativsystem samt innehar versionshantering. Vad innebär detta då?

Jo, för sådana som mig som har beroenden långt utanför vad vanliga webbhotell kan leverera såsom Redis, Sphinx och Memcache så är Docker en mjukvara som löser detta.

Man kan kort och gott säga att Docker är ett operativsystem i operativsystemet. Lite som Xen eller Vmware men mycket ”lättare”.

I detta underliggande operativsystem så utgår du från en spegelbild som fungerar som bas och allt du lägger till får en ny revision. Detta gör exempelvis om du vill flytta en webbsajt med Redis, MySQL och Sphinx Search från en server till en annan så behöver du enbart flytta det som ändrats från spegelbilden.

Docker är så klart öppen källkod och helt gratis att använda. Och inte nog med det så är det ett MeetUp om några veckor i Stockholm om just DevOps och Docker med talare från bl.a. Spotify:

Crawler 2.0

Som många vet så har jag två tjänster som visar information om domäner, nämligen DomainDB.com samt DomainTool.se. Jag var i behov av att uppdatera den informationen som fanns så det var dags att starta den crawler som jag skapat för några år sedan.

Crawlern (eller webcrawler, spider som det också heter) var tämligen ouppdaterad så jag tog tillfället i akt och använder nu enbart Redis. Tidigare så använde jag MySQL + Sphinx:

  • db0 – Kö för domäner som skall besökas
  • db1 – Koppling mellan namnserver och IP-nummer
  • db2 – Koppling mellan www.domän och IP-nummer
  • db3 – Sidtitlar

Db0 rensas och fylls på ungefär varannan dag med runt 25 miljoner nya domäner som besöks så efter cirka en vecka så har jag besökt 100 miljoner domäner. För server-kapacitet så använder jag Amazon EC2 och deras spot instances som är lite billigare och utnyttjar oanvända EC2-instanser.

Full-text sökningar med Sphinx Search

När MySQL inte räcker till för full-textsökningar eller fritextsökningar som det också kallas så brukar jag använda Sphinx, eller faktum är att jag använder Sphinx till alla typer av sökningar där inte MySQL pallar med vilket händer rätt ofta nuförtiden vilket gör att Sphinx finns med i mer eller mindre alla mina projekt.

Här kommer en kort presentation om hur du kommer igång med Sphinx:

NoSQL – MySQL och memcached på väg bort

Jag ser fler och fler välja alternativa lösningar till MySQL och memcached och väljer då istället exempelvis Redis eller Cassandra. Ryan King som jobbar på Twitter intervjuades nyligen och berättade att de håller på att gå över till Cassandra för att lagra deras ofantliga mängder med tweets.

Som jag har skrivit tidigare så använder jag Redis för alla mina nya projekt men ser även till att ha en kopia kvar i MySQL för att Sphinx skall indexera fritext. Men jag kommer förmodligen att skippa MySQL helt snart eftersom Sphinx även kan läsa in exempelvis fritext från XML som kan genereras från innehållet i Redis.

När jag startar mitt nästa projekt så kommer jag att skippa MySQL och memcache helt och försöka att bygga en lösning som enbart förlitar sig på Redis (och Sphinx så klart).

Kategorisering av de olika lagringstyperna:

  • Key-value stores: Redis, Scalaris, Voldmort, and Riak.
  • Document stores: Couch DB, MongoDB, and SimpleDB.
  • Record stores: BigTable, HBase, HyperTable, and Cassandra.
  • Scalable RDBMSs: MySQL Cluster, ScaleDB, Drizzle, and VoltDB.

Glöm inte läsa denna rapport som nyss släpptes på ämnet:

High Performance Scalable Data Stores av Rick Cattell

NoSQL here we come.

Fritextsökningar i stora datamängder

Jag stötte på ett problem för några veckor sedan då jag försökte att indexera ~100 miljoner dokument (eller snarare textsträngar) för att göra dessa sökbara med godtycklig fritext (exempelvis: *blahonga*). Sphinx som brukar lösa alla mina problem spottade ur sig ett felmeddelande något i stil med:

(out of size_t; 4 GB limit on 32-bit machine hit?)

Vilket låter troligt eftersom det är en 32-bitars maskin. Efter lite sökningar så hittade jag att någon beskrev att Sphinx måste ladda in de filer som har filändelsen .SPI i RAM-minne och i mitt fall så rörde det sig om ca 35 GB vilket jag ej har i RAM-minne på någon av mina servrar.

Men efter lite mer Googlande så hittade jag den relativt nya konfigurationsparametern ondisk_dict som betyder att dessa filer inte behöver laddas in i minnet så jag testade att starta searchd igen men fick samma felmeddelande.

Till sist så testade jag även att dela upp den databas från MySQL som jag indexerade i tre olika Sphinx-index och då fungerade det galant och fritextsökningar i mina 100 miljoner dokument går nu på under en sekund. Taaada!

Så här beskrivs ondisk_dict i manualen:

Whether to keep the dictionary file (.spi) for this index on disk, or precache it in RAM. Optional, default is 0 (precache in RAM). Introduced in version 0.9.9-rc1.

The dictionary (.spi) can be either kept on RAM or on disk. The default is to fully cache it in RAM. That improves performance, but might cause too much RAM pressure, especially if prefixes or infixes were used. Enabling ondisk_dict results in 1 additional disk IO per keyword per query, but reduces memory footprint.

This directive does not affect indexer in any way, it only affects searchd.

Skapa din egen bloggsökmotor

Ett av mina första webbprojekt var den svenska bloggsökmotorn Bloggz.se som jag skapade i början av 2007. Med hjälp av den erfarenheten och kunskapen så tänkte nu gå igenom hur du som utvecklare lätt och enkelt kan skapa din egen bloggsökmotor med hjälp av php- eller python-kunskap.

Steg 1 – Hitta bloggar

Först och främst så måste vi ju hitta URL:er till bloggar och sedan måste vi lista ut om de bloggar om svenska eller ej. Så mitt tips är att börja genom att ladda hem och parsa följande fil från Google (var 10’de minut exempelvis):

http://blogsearch.google.com/changes.xml

Denna fil är på ca 12 MB och innehåller ca 71 000 bloggar, varje rad ser ut på ungefär följande sätt:

<weblog name=”Filmklipp hos Filmpasset.se” url=”http://filmpasset.se/” rssUrl=”” when=”2″ sourceIp=”72.233.56.145″ />

Steg 2 – Parsa bloggar

Vi har nu gigantiska listor med bloggar och det vi måste göra nu är att besöka dessa bloggar och hämta ut relevant information och här finns det två viktiga komponenter:

  • Hitta RSS-feeden på bloggen
  • Parsa RSS-feeden på bloggen

Det kan låta trivialt men det finns miljoner olika kombinationer på ovan två komponenter. Jag kan rekommendera Feedfinder samt Feedparser (från svn).

Det du gör nu är att du skapar en databas med URL:er till alla bloggar och fyller sedan på med de RSS-url’er som du hittar med hjälp av Feedfinder, detta arbete kan trådas med fördel. Se på Pythons queue

Steg 3 – Klassificera språk

Det vanligaste sättet att klassificera språk är ngram (bi/tri-gram) och jag använder mig av följande implementation: ngram.py som är skriven av Thomas Mangin. Detta måste så klart göras efter du har hämtat hem de inlägg som hittas på bloggen. Glöm inte att spara undan HTTP-headers såsom last-modified och etag som gör att du inte behöver besöka bloggen i onödan om den ej är uppdaterad.

Steg 4 – Gör allt sökbart

Nu när du har inlägg och bloggar i en databas så behöver du bara göra allt detta sökbart, snabbt. Och då kan jag rekommendera Sphinxsearch där du gör en main och ett delta-index som uppdateras kanske en gång i veckan vs. varje timme beroende på hur mycket information som ska indexeras.

Och nu behöver du bara göra ett trevligt webb-gui till databasen och Sphinx-indexet.

Överkurs

Det du kan tänka på också när du parsar bloggar är att spara undan länkar som du hittar i inläggen för att sedan använda denna information för att vikta sökresultet samt hitta fler bloggar att lägga till. Jag sparar exempelvis undan denna information och använder den på bl.a BloggBilder.se och BloggVärde.se (och snart kanske BloggAnalys.se)

Kuriosa

Utifrån sourceIp i changes.xml så pingar dessa Google flest gånger:

13674 66.197.201.21
12006 59.40.198.153
4875 72.233.56.144
4807 72.233.56.156
4719 72.233.56.145
2070 66.207.161.106
2056 221.186.141.201
1785 202.108.35.60
906 124.42.34.18
577 74.125.44.136
544 69.59.185.172
533 62.129.193.27
532 69.10.46.130
491 91.121.157.178
360 221.186.141.206
354 219.239.93.69
325 208.110.66.194
281 89.161.143.129
267 82.96.94.35
259 219.94.203.126
  13674 66.197.201.21 colo4.socialknowledge.net.

  12006 59.40.198.153 153.198.40.59.broad.sz.gd.dynamic.163data.com.cn.

   4875 72.233.56.144 wordpress.org

   4807 72.233.56.156 wordpress.org

   4719 72.233.56.145 wordpress.org

   2070 66.207.161.106 HostKitty Internet Services

   2056 221.186.141.201 idcgw.cyberz.co.jp.

   1785 202.108.35.60 ChinaUnicom

Bloggys infrastruktur

Tänkte beskriva lite om hur Bloggy är uppbyggt rent tekniskt. En förfrågan till Bloggy går ungefär igenom följande lager:

MySQL <- Sphinx <- Memcached <- Apache <- Varnishd

Varnish är en högpresterande webb frontend-proxy utvecklat av ett norskt företag och används  exempelvis av Aftonbladet. Detta går att utläsa genom HTTP-headern X-Varnish.

Denna frontend-cache används för att hantera alla statiska filer såsom CSS och bilder. Apache behöver jag inte skriva så mycket om men sedan kommer en intressant del och det är memcached som är utvecklat av Facebook.

De flesta SQL-frågor går genom memcached för att cachas ett antal sekunder, varje SQL-fråga är noggrant studerad hur länge den behöver cachas.

Sphinx är också en intressant del eftersom den gör att fulltextsökningar mot olika tabeller i MySQL-databasen. Sphinx tar hand om runt 40 sökningar i sekunden.

Sedan så kommer MySQL som hanterar allt annat som inte fångas upp av något av ovanstående system. Alla frågor har optimerats så att filsorteringar (file sort) och dylikt används minimalt. Jag har även tidigare (2007) bloggat om hur du kan optimera din MySQL databas.

Ny version av Sphinx: 0.9.9-rc1

En ny test-version av Sphinx är äntligen ute, med en mängd nya features:

  • added select-list feature w/full expressions support
  • added arbitrary brackets/negations nesting support to query language
  • added config reload on SIGHUP
  • added signed 64bit attrs support (sql_attr_bigint directive)
  • added persistent connections, UNIX-socket, and multi-interface support (Open(), Close(), listen)
  • added kill-lists support
  • added MS SQL (aka SQL Server) source type support
  • added inplace inversion of .spa and .spp (inplace_enable, 1.5-2x less disk space for indexing)
  • added multiforms support (multiple source words in wordforms file)
  • …and 20+ other features in the changelog

Sphinx är en supersnabb fulltextsökmotor som används som ett komplement till MySQL som kan vara lite seg på att söka i större textmassor.

Update: Här finns även en intressant presentation om Sphinx: sphinxsearch.com/downloads/mysqluc2008-sphinx.ppt

Indexering av PDF-dokument

Har nu spindlat ihop nästan en halv miljon PDF-dokument under sommaren och arbetet med att indexera dessa och läsa ut relevant information har påbörjats. Här är några punkter på det som jag avser att göra med dessa dokument:

  • Kategorisering – Funderar på att utveckla ett eget kategoriseringsystem som tar fram kategorier/topics och relationer mellan dessa. Har bloggat lite om Topic Modeling tidigare.
  • Visning – Har börjat med en egen PDF-läsare för webben som enbart kräver JavaScript
  • Extrahering av information såsom text, metadata
  • Sökning/indexering – Sphinx
  • WebbGUI – Förmodligen tämligen simpelt
  • Taggar – Automatiskt lägga relavanta taggar till dokumenten, även för ”okända” språk.

Det av ovan som jag har nästan gjort klart är extrahering av information samt visningen. Återkommer så snart det finns något att visa på PDFind.com

Jobbr, WiFiKartan, Sphinx, Twittapps samt Bisongoogle

Fredrik Wass som bloggar på bisonblog testade att använda Jaiku för att få in frågor till en intervju med Google-Sveriges Stina Honkamaa samt Nicklas Lundblad. Läste även idag att Expressens tidningsupplaga refererat till denna (samt online här).

**

Skaparen av Sphinx, Andrew Aksyonoff höll en presentation på MySQL UC 2008:

**

Ted Valentin fortsätter att leverera intressanta sajter och senast ut i *kartan.se är WiFiKartan.se som listar fik för Internet-nomader. Hittade denna roliga recension om nördcaféet #1, il café

– Nån tittade in i inre rummet och konstaterade: ´Jaha, det var här Dreamhack hålls´

**

Jobbr.se är en ny jobbsajt för IT-relaterade jobb skapad av Skellefteåkillen Kristoffer Lidman. Snygg sajt som vanligt när Kristoffer är i farten.

**

Jag köper fler domäner och denna gång är det uhack.com, siteguard.com samt oddpay.com

**

Twingly-Anton gästbloggar på ReadWriteWeb om de populäraste Twitter app’sen vilket tydligen är Twhirl.

**

Ett kul tidsfördriv är att köra runt på Google Maps gator med googleDrive.

**

Google Safe Browsing har nu öppnats upp mer och nu är det möjligt att kontrollera om godtycklig webbsajt innehåller skadlig kod eller ej, den magiska URL:en är: