Avoimen lähdekoodin vaihtoehto – Exchange

Yleistä

Tulen esittelemään blogissani tämän vuoden varrella useita erilaisia vaihtoehtoja korvaamaan yrityskäytössä tarpeellisia ratkaisuja avoimen lähdekoodin tuotteilla. Aloitan artikkelijaksot ehdottamalla muutamaa avoimen lähdekoodin ratkaisua korvaamaan yrityskäytössä erittäin yleinen Microsoftin ratkaisu, Microsoft Exchange. Yritykset tarvitsevat yleisimmin käyttöönsä sähköpostin sekä mahdollisuuden kalenterien jakamiseen helposti.

Markkinoilla on useita erilaisia ratkaisuja, esitän tässä nyt kaksi.

Zimbra

Zimbra on ollut markkinoilla varsin pitkään ja on saanut kehitettyä varsin toimivan konseptin, ainakin sitä voi pitää toimivana koska ohjelmistoyhtiö VMware osti sen viime vuonna. Zimbra tarjoaa yksinkertaisuudessaan suoraa korviketta Exchangelle. Tuotteessa on kaikki yrityskäytössä välttämättömät ratkaisut, tuote on kuitenkin ilmainen vain osittain. Ilmaisesta versiosta on poistettu mm. tuki MIcrosoft Outlook-ohjelmistolle, jota myös monet yritykset käyttävät. Tuki löytyy lisenssoidusta versiosta (eli tuote on siis kaksoislisenssoitu) joka sekin on hinnoiteltu varsin kilpailukykyisesti Exchangeen nähden.

Tuote on erittäin helppo ottaa käyttöön. Zimbra tarjoaa täysin valmista VMware-imagea joka pohjautuu Ubuntuun ja sen päälle asennettuun Zimbran ohjelmistokerrokseen. Valmiista imagesta tuotteen asennus ja käyttöönotto on nopeaa ja helppoa. Tuotteen saa erittäin helposti kiinni mm. Microsoftin ActiveDirectoryyn sekä siinä on valmiina työkalut helpottamaan migraatiota Exchange-ympäristöistä. Kaupallisessa tuotteessa on myös mobiilirajapinta jolla postit ja kalenteri voidaan tuoda matkapuhelimiin. Ohjelmiston www-pohjainen sähköposti ja kalenteri on erittäin hyvän näköinen, huomattavasti parempi kuin Microsoft Exchangessa.

Tuotteesta voit lukea lisää osoitteesta http://www.zimbra.com/.

SOGo

Täysin avoimen lähdekoodin ratkaisu SOGo on markkinoilal uudempi tulokas. Tuote on toteutettu noudattaen valmiita ja hyväksi todettuja avoimia rajapintoja ja sen liittäminen erilaisiin ohjelmistoihin onkin nopeaa ja yksinkertaista, esimerkiksi ohjelman kalenteria voidaan lukea suoraan Thunderbirdillä, Outlookilla sekä Applen iCal-ohjelmalla.

Vaikka tuote on täysin avoimen lähdekoodin ilmainen ratkaisu on siinä suoraan tuki myös Outlookille, joka helpottaa yrityksiä siirtymisessä. Tuote pohjautuu muutamaan avoimen lähdekoodin projektiin ja näistä OpenXchange tuo rajapinnat Outlookkiin. Tuote on nopea asentaa ja tarjolal on valmis virtuaalikone-image josta käyttöönotto voidaan tehdä todella nopeasti. Tuotteelle löytyy suoraan asennuspaketit useimmille Linux-distribuutioille mm. Red Hat sekä Ubuntu.

Avoimien rajapintojen lisäksi tuotteen ehdottomasti paras puoli on sen WWW-käyttöliittymä. Tuotetta voi käyttää täysin moitteetta www-selaimella ja esim. kalenteri-ominaisuudet eivät jää jälkeen Outlookin vastaavista yhtään, www-rajapinnan kautta on mahdollisuus mm. buukata uusia tapaamisia ja tarkistaa kutsuttavien tilanne kalenterista. WWW-käyttöliittymä on paljon parempi kuin Exchangen tarjoama OWA sekä huomattavasti kevyempi ja nopeampi kuin Zimbran ratkaisu.

Tuotteeseen kannattaa ehdottomasti tutustua ja miettiä seuraavissa migraatioissa siirtymistä. Tarkempaa tietoa ja live-demo nähtävissä osoitteessa http://www.sogo.nu/.

Miten saavuttaa korkea(mpi) käytettävyys ilman valtavia kuluja – osa II

Taustaa

Ensimmäisessä osassa artikkelia rakensimme ympäristön jossa kahdella erillisellä Linux-palvelimella on yksi yhteinen, DRBD:llä peilattu levy sekä sen päällä GFS2:lla toteutettu klusteroitu tiedostojärjestelmä. Kun perusteet on tehty voidaan ympäristöön ottaa käyttöön erilaisia palveluita. Periaatteessa melkein kaikki normaalit palvelut voidaan toteuttaa DRBD:n päällä, mutta esim. tietokannat vaativat hieman asetusten muuttamista ja niitä ei tässä artikkelissa nyt käsitellä.

Tässä artikkelissa esitän tavan toteuttaa DNS-palvelimen avulla kuormantasausta sekä keinon jolla DNS-palvelun avulla voidaan toteuttaa käytettävyyden kannalta yksi olennainen asia, nimellä voidaan tarjota palvelua kahden eri operaattorin kautta ja kun toinen operaattori ei toimi tarjotaan palvelua automaattisesti jäljellä olevan kautta. Ratkaisu ei kuitenkaan ole täysin katastrofivarma, koska jos ympäristössämme on esimerkkinä palvelin a joka on kytketty internet-yhteys a:n sekä palvelin b kytkettynä internet-yhteys b:n voi käytännössä tapahtua tilanne jossa sekä internet-yhteys a että palvelin b ovat poissa käytöstä laitevikojen vuoksi, tällöin palvelut eivät toimi. Antamani esimerkki kuitenkin tarjoaa tavan toteuttaa parempaa käytettävyyttä, koska on kuitenkin epätodennäköisempää että internet-yhteys toisesta konesalista ja palvelin toisesta on rikki.

Tässä artikkelissa tulen näyttämään miten voit parantaa käytettävyyttä www-palveluille DNS-kuormantasauksella.

DNS-palvelun avulla toteutettava kuormantasaus

Homma aloitetaan asentamalla kumpaankin palveliemen bind9-nimipalvelut. Esimerkissä käytettävät IP-osoitteet tulee korvata oikeilla, 1.2.2.1 on master-palvelimen julkinen IP-osoite sekä 1.2.3.4 on slave-palvelimen julkinen IP-osoite:

jpj@x1:~$ sudo apt-get install bind9

Seuraavaksi luomme itse nimipalvelumääritykset lisäämällä /etc/bind/named.conf-tiedostoon (master-koneella):

zone "failsafe.fi" {
        type master;
        file "/etc/bind/failsafe.fi.zone";
        notify yes;
        allow-update { 1.2.3.4;};
        allow-transfer { 1.2.3.4;};
};
Sekä slave-koneelle /etc/bind/named.conf-tiedostoon:
zone "failsafe.fi" {
        type slave;
        file "failsafe.fi.zone";
        masters { 1.2.1.1; };
};

Tämän jälkeen itse master-palvelimelle luomme zone-määrittelyt failsafe.fi-domainille lisäämällä master-koneelle tiedostoon /etc/bind/failsafe.fi.zone:

;
; SOA
;
$TTL 86400
@                       IN SOA  x1.failsafe.fi. hostmaster.failsafe.fi. (
                                2011012001  ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )

                        NS      x1.failsafe.fi.
                        NS      x2.failsafe.fi.
                        A       1.2.2.1
                        MX      10 x1.failsafe.fi
                        MX      20 x2.failsafe.fi

ORIGIN failsafe.fi.

x1                      1.2.2.1
x2                      1.2.3.4
www                     CNAME   www.x.failsafe.fi.
x                       NS      x1
x                       NS      x2

Määrittelyissä ei ole mitään erikoisempaa, paitsi että http://www.failsafe.fi on osoitettu CNAME-määritykseksi http://www.x.failsafe.fi:lle ja x.failsafe.fi:lle on määritelty nimipalvelimiksi kummatkin noodimme (x1 ja x2).

Itse x.failsafe.fi pitää myös määritellä nimipalveluihin, joten lisäämme kummankin palvelimen /etc/bind/named.conf-tiedostoon seuraavan määrittelyn:

zone "x.failsafe.fi" {
        type master;
        file "/etc/bind/x.failsafe.fi.zone";
};

Sama määrittely tehdään kummallekin noodille, koska haluamme että kumpikin noodi palauttaa vain oman IP-osoitteensa. Näin kun loppukäyttäjä yrittää ottaa yhteyttä http://www.failsafe.fi-osoitteeseen ohjautuu kysely http://www.x.failsafe.fi-nimelle jota loppukäyttäjän kone kysyy nimipalveluista, nimipalvelimia on kaksi ja osoitetta kysytään jommasta kummasta, mikäli ensimmäinen nimipalvelu ei palauta IP:tä, kysytään sitä toiselta. Tällä voidaan varmistaa että loppukäyttäjä saa IP-osoitteen palvelulle, vaikka jompi kumpi yhteys olisikin alhaalla, tai jompi kumpi palvelimista. Nimipalvelimet kuitenkin säilövät IP-osoitetietoja välimuistissaan ja päivittävät niitä vain aika ajoin itse palvelimelta, tässä tapauksessa homman juju perustuukin siihen että määrittelemme tuon säilöntäajan niin lyhyeksi että käytännössä IP-osoite selvitetään joka kerta kun käyttäjä ottaa yhteyden palveluun.

Master koneella /etc/bind/x.failsafe.fi.zone-tiedostoon lisätään:

;
; SOA
;
$TTL 86400
@                       IN SOA  x1.failsafe.fi. hostmaster.failsafe.fi. (
                                2011012001  ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )

                        NS      x1.failsafe.fi.
                        NS      x2.failsafe.fi.

        IN 60           A       1.2.2.1
*       IN 60           A       1.2.2.1

ja vastaavasti slave-koneella samaan tiedostoon lisätään:

;
; SOA
;
$TTL 86400
@                       IN SOA  x2.failsafe.fi. hostmaster.failsafe.fi. (
                                2011012001  ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )

                        NS      x1.failsafe.fi.
                        NS      x2.failsafe.fi.

        IN 60           A       1.2.3.4
*       IN 60           A       1.2.3.4

Nyt nimipalvelimien osalta palvelu on määritelty. Käynnistä nimipalvelimet uusiksi kummallakin noodilla ja tarkista toiminta kysymymällä host-käskyllä ip:tä http://www.failsafe.fi:lle. Kummankin noodin tulisi palauttaa palvelulle oma ip-osoitteensa.

WWW-palveluiden määrittelyt

Kummallekin noodille asennetaan www-palvelut, esimerkissä käytän lighttpd:tä koska olen todennut sen varsin toimivaksi ja yksinkertaiseksi. Vastaavat määrittelyt voidaan kuitenkin tehdä myös apachella ja monella muullakin palvelulla.

Asennetaan noodeille lighttpd:

jpj@x2:/etc/bind$ sudo apt-get install lighttpd

Jonka jälkeen jommalla kummalla noodilla siirretään /var/www-hakemiston sisältö sekä /etc/lighttpd-hakemiston sisältö yhteiselle levylle ja muutetaan lokaali hakemisto osoittamaan yhteiseen:

jpj@x2:/etc/bind$ sudo mkdir /j0/var
jpj@x2:/etc/bind$ sudo mkdir /j0/etc
jpj@x2:/etc/bind$ sudo mv /etc/lighttpd /j0/etc
jpj@x2:/etc/bind$ sudo mv /var/www /j0/var
jpj@x2:/etc/bind$ sudo ln -s /j0/var/www /var/www
jpj@x2:/etc/bind$ sudo ln -s /j0/etc/lighttpd /etc/lighttpd

Toisella noodilla poistetaan hakemistot ja tehdään samat määritykset:

jpj@x2:/etc/bind$ sudo rm -rf /etc/lighttpd
jpj@x2:/etc/bind$ sudo rm -rf /var/www
jpj@x2:/etc/bind$ sudo ln -s /j0/var/www /var/www
jpj@x2:/etc/bind$ sudo ln -s /j0/etc/lighttpd /etc/lighttpd

Ja lopuksi itse lighttpd-palvelu käynnistetään kummallakin noodilla uudelleen. Lighttpd-palvelu käynnistyy automaattisesti koneiden käynnistyksessä, mutta DRBD-palvelun tarjoama levy ei välttämättä ole vielä pystyssä joten palvelu käynnistetään uudelleen lisäämällä /etc/rc.local-tiedoston loppuun:

service lighttpd restart

Koska yhteinen www-hakemisto ja konfiguraatiot on jaetulla levyllä, riittää että määrittelyt tehdään vain toisella noodilla ja www-sivut tallennetaan toisen koneen kautta, tai editoidaan toisen koneen kautta.

Loppuhuomiot

Näiden esimerkkien avulla voidaan siis helposti ja nopeasti parantaa erilaisten palveluiden käytettävyyttä, mm. sähköpostipalvelut on helppo toteuttaa tällä sijoittamalla tarpeelliset hakemistot yhteiselle levylle. Useimmilla sähköpostipalveluilla riittää että käyttäjien kotihakemistot on jaetulla levyllä, näin palvelu toimii käytännössä ilman mitään lisämäärittelyitä.

Miten saavuttaa korkea(mpi) käytettävyys ilman valtavia kuluja

Taustaa

Tämän päivän tietotekniset ympäristöt ovat yhä kriittisempiä ympäristöjä ja niiden käytettävyyden tulee olla korkeaa. Korkean käytettävyyden saavuttaminen ei kuitenkaan ole mitenkään yksiselitteistä eikä helppoa. Usein tämä tarkoittaa investointeja kahdennettuihin yhteyksiin dynaamisella reitityksellä, kahdennettuihin palvelimiin sekä kahdennettuun levyjärjestelmään.

Avoin lähdekoodi on kuitenkin tuonut mahdollisuuksia toteuttaa korkeaa (tai ainakin korkeampaa) käytettävyyttä ilman valtavia investointeja. Esitän tässä nyt yhden esimerkin siitä miten innovatiivisuus ja oikeiden työkalujen käyttö voi tuoda valtavia säästöjä.

Ympäristö

Tässä esimerkissä toteutetaan kahden Linux-palvelimen klusteri ilman kalliita dynaamisia reitityksiä ja keskitettyjä levyjärjestelmiä. Tämä ei ole perusteista lähtevä opas siihen miten ratkaisu pitäisi toteuttaa, eikä tämän tarkoituksena ole esittää ratkaisua joka on liiketoimintakriittinen vaan herättää ajatuksia siitä miten avoimen lähdekoodin ratkaisuilla voidaan oikeasti löytää etuja.

Alkuvaiheessa minulla oli kaksi Ubuntu Server 10.04 -palvelinta, asennettuna ja toimintakunnossa. Kumpikin palvelin on virtualisoitu ja kummankin palvelimen internetyhteys tulee eri operaattorilta. Koska koneet sijaitsevat samassa konesalissa, on niiden välillä myös privaattiverkko, tosin tämä ei ole välttämätön ratkaisun kannalta, mutta nopeuttaa levyjen synkronointia.

Vaihe yksi – Ratkaisu datan kahdennukseen

Jotta ratkaisu voisi toimia oikein, ja tarjota palveluita kummankin koneen kautta, on itse palvelulla näytettävän datan oltava kahdennettu. Perinteisesti tähän käytetään keskitettyjä levyjärjestelmiä ja niiden peilauksia mutta tässä tapauksessa turvaudumme avoimen lähdekoodin tuotteeseen DRBD. Tuote ei ole uusi ja sitä on käytetty jo varsin pitkään erilaisissa ympäristöissä. Lyhyesti kerrottuna DRBD peilaa sille annetun blokkidatan kahden koneen välillä, tässä tapauksessa tulemme peilaamaan yhden levyosion kahden koneen välillä. Tuotetta voisi verrata verkkotasoiseksi RAID1:ksi koska toimintaperiaate on aika pitkälle sama. Perinteisesti tuotetta käytetään aktiivinen/passiivinen-asetelmalla, mutta esimerkissäni rakennetaan ratkaisu jossa tarjottava palvelu on käytettävissä kumman tahansa yhteyden kautta.

DRBD:na sennus on Ubuntun 10.04:n varsin nopea ja triviaali toimenpide. Ennen tuotteen asennusta kummallekin koneelle on lisätty yksi levy joka ei ole vielä missään käytössä, esimerkin tapauksesas virtuaalikoneilel lisättiin 8 gigan kokoinen virtuaalilevy ja sille tehtiin koko levyn kokoinen osio Linux-tyypillä (Levy on kummallakin koneella /dev/sdb1 konfiguroinnin helppouden vuoksi, levy voi olla eri niminen todellisuudessa). Itse tuote asennetaan:

jpj@x1:~$ sudo apt-get install drbd8-utils

Paketti hakee lisäksi muita riippuvuuksia ja hetken kuluttua itse tuote on asennettu. Tämän lisäksi lisäämme /etc/hosts-tiedostoon:

192.168.1.251   x1
192.168.1.250   x2

ja /etc/drbd.d/disk0.res-tiedostoon:

resource disk0 {
        protocol C;
        net {
                cram-hmac-alg sha1;
                shared-secret "yhteinensalasana";
                allow-two-primaries;
        }
        startup {
                become-primary-on both;
        }
        on x1 {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 192.168.1.251:7788;
                meta-disk internal;
        }
        on x2 {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 192.168.1.250:7788;
                meta-disk internal;
        }
}
Tällä konfiguroinnilla tehdään perusteet levypeilaukseen, määrittelyyn annetaan kummankin koneen IP-osoite, sekä kummankin koneen peilattava levy.
Seuraavaksi käynnistellään tarvittavat palvelut ja tehdään DRBD:lle käytettävä levy disk0 (Ajetaan kummallakin koneella).
jpj@x1:~$ sudo drbdadm create-md disk0
jpj@x1:~$ sudo service drbd stop
jpj@x1:~$ sudo service drbd start
Kumpikin noodi määritellään meidän haluamassamme esimerkissä primääriksi, ts. kumpikin noodi voi kirjoittaa levylle (kunhan levyllä käytetään siis klusteriin soveltuvaa tiedostojärjestelmää kuten esimerkissämme käytettävää GFS). Tämä tehdään taas kummallakin noodilla.
jpj@x1:~$ sudo drbdsetup /dev/drbd0 primary -o
Nyt voimmekin seurata levyjen synkronointia, joka vie aikaa jonkin verran (Riippuen peilattavasta levystä).
jpj@x1:~$ cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
GIT-hash: ea9e28dbff98e331a62bcbcc63a6135808fe2917 build by root@x1, 2011-01-08 17:46:15
 0: cs:SyncSource ro:Primary/Primary ds:UpToDate/Inconsistent C r----
    ns:1064252 nr:140 dw:6092 dr:1080376 al:0 bm:78 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:3131908
        [===>................] sync'ed: 22.5% (3131908/4031556)K
        finish: 2:10:29 speed: 336 (320) K/sec
Levyn valmistumista voi seurata, suosituksena on odottaa että synkronointi valmistuu, mutta tässä esimerkissä jatkamme suoraa eteenpäin.
Vaihe kaksi – Klusteriin soveltuva tiedostojärjestelmä
DRBD toimisi mainiosti ilman lisäominaisuuksia siten että toinen noodi on passiivinen, eli kun haluat tiedostojärjestelmän käyttöön toisella koneella (Esimerkiksi kun pääasiallinen kone on hajonnut), ajat kakkosnoodilla vain komennon jolla siitä tehdään aktiivinen ja mounttaat levyn käyttöön. Haluamme kuitenkin toteuttaa ratkaisun joka on aktiivinen kummankin noodin osalta ja tämä aiheuttaa pientä lisähaastetta. Yleisimmät tiedostojärjestelmät (XFS, EXT3, EXT4, JFS) on suunniteltu käytettäväksi vain yhdellä noodilla kerrallaan ja tähän haasteeseene on kehitetty tiedostojärjestelmiä jotka ovat tarkoitettu nimenomaan klusterien käyttöön, kuten esimerkiksi käyttämämme GFS2 ja VMware-ympäristöissä käytetty VMFS.
GFS2 on Red Hatin tekemä, avoimen lähdekoodin tiedostojärjestelmä ja sen käyttö on varsin helppoa myös Ubuntu Server 10.04:ssä. Aluksi asennetaan kumpaankin koneeseen tarvittavat paketit:
jpj@x1:~$ sudo apt-get install gfs-tools cman clvm
Jotta GFS2-tiedostojärjestelmä toimii (Eli että se voidaan mountata käyttöön) tarvitsee meidän määritellä sitä varten klusteri, klusterin asetusten tulee olla yhteneväiset, joten helpointa tehdä taas toisella koneella ja kopioida konfiguraariot suoraan toiselle. Luodaan /etc/cluster/cluster.conf-tiedosto ja muokataan se seuraavan näköiseksi
<?xml version="1.0"?>
<cluster name="cluster1" config_version="3">
<totem consensus="6000" token="3000"/>
<cman two_node="1" expected_votes="1"/>
<clusternodes>
<clusternode name="x1" votes="1" nodeid="1">
<fence>
<method name="single">
<device name="manual" ipaddr="192.168.1.251"/>
</method>
</fence>
</clusternode>
<clusternode name="x2" votes="1" nodeid="2">
<fence>
<method name="single">
<device name="manual" ipaddr="192.168.1.250"/>
</method>
</fence>
</clusternode>
</clusternodes>
<fence_daemon clean_start="1" post_fail_delay="0" post_join_delay="3"/>
<fencedevices>
<fencedevice name="manual" agent="fence_manual"/>
</fencedevices>
</cluster>
Seuraavaksi käynnistämme tarvittavat palvelut uudelleen kummallakin koneella
jpj@x1:~$ sudo service cman stop
jpj@x1:~$ sudo service cman start
jpj@x1:~$ sudo service clvm stop
jpj@x1:~$ sudo service clvm start
Ja lopuksi luodaan itse tiedostojärjestelmä levyille
jpj@x1:~$ sudo gfs2_mkfs -p lock_dlm -t cluster1:gfs -j 2 /dev/drbd0
jpj@x1:~$ sudo gfs2_fsck /dev/drbd0
Lopuksi dataosiot voidaan mountata kumpaankin koneeseen
jpj@x1:~$ sudo mkdir /j0
jpj@x1:~$ sudo mount -t gfs2 /dev/drbd0 /j0
Haluamme luonnollisesti että nämä mountataan myös käynnistyksen yhteydessä, ja tähän luonnollisesti paras olisi fstab, mutta klusterin levyt voidaan mountata vasta kun itse klusteri on pystyssä, ja tämä voi joskus hidastaa turhaan käynnistymistä joten helpoin tapa on tehdä tämä on lisätä /etc/rc.local -tiedostoon (Ennen exit 0-riviä):
sleep 5
mount -t gfs2 /dev/drbd0 /j0
Nyt olemme luoneet tarvittavat asiat ja sinulla pitäisi olla käytettävissä klusteroitu ja peilattu levy kahden koneen välillä. Seuraavassa osassa jatkan artikkelia kertomalla miten voit tarjota tiettyjä palveluita helposti kahden eri operaattorin kautta ilman dynaamisia reitityksiä, käyttäen normaaleja työkaluja sekä viimeistelemme ympäristön siten että sähköposti ja www-palvelut ovat käytettävissä kummankin koneen kautta.