Posts tagged Microsoft Office SharePoint Server
SharePoint: managed paths and content db
Mar 3rd
Credo che con questo titolo abbia tirato in ballo molte più cose di quelle che una normale mente umana possa in qualche modo gestire attraverso l’interconnessione incestuale di neuroni nella materia grigia. E’ vero anche che una delle prime lezioni del mio prof di Informatica alla superiori, sui word processor mi illuminò a tal punto da farmi innamorare immediatamente di questa materia, attraverso l’enuciazione delle seguenti verità di fede:
- Non tutto quello che si vede sul video viene riportato su carta nel processo di stampa;
- Il peso in byte di un documento a parità di parole contenute nel testo varia a seconda di quante tabulazioni esso contiene;
- Non riuscirete ma a spiegare il vostro lavoro a vostra suocera;
I primi due punti per farvi capire quanto sia lontana la definizione di *applicazione* se posizionata trasveralmente ai software commerciali, quindi quanto sia affascinante un lavoro per il quale c’è sempre spazio per posizionare differenze, siano esse funzionali o applicative, appunto. L’ultimo punto l’ho aggiunto io ed è altrettanto vero!
Cosa c’entra SharePoint con tutto questo? Quasi nulla, solo non mi andava di scrivere un post serioso, quindi ho cazzeggiato un pò!
Passiamo ora invece alla comprensione di alcune particolarità architetturali di MOSS, la cui consapevolezza, credo vi possa fare comodo in situazioni di disegno ed implementazione di una architettura medio-grande.
L’argomento, come avete capito è *Site Collection* e quando si parla di queste entità siamo al punto del non ritorno o almeno dovremo iniziare a parlare di Site Collection dopo che il problema scalabilità sia stato affrontato in maniera seria dal nostro reparto IT.
SPSite VS SPWeb
Oramai siamo abituati al concetto di Site Collection, per i dev SPSite che rappresentano l’insieme di Site (per i dev SPWeb) di cui condividono la root. La root di un SPSite è a suo stesso tempo un Site (Root Web). Le Site Collection possono avere dei settings ma non dei documenti o liste di alcun tipo. Ogni SPSite può contenere n SPWeb.
Web Application & Content DB
Nell’attuale versione di MOSS ogni SPSite è associato ad una Web Application ma non è sempre vero il contrario, cioè ogni Web Application può ospitare più SPSite. La stessa relazione che hanno le Site Collection con le Web Application la ritroviamo nei relativi database di configurazione.
Attenzione, molti per comodità dicono che ogni Web Application può avere un solo contenet db: vero (solo in parte). Questa spiegazione, comunque non è esplicativa, infatti dal paragrafo sopra si intuisce (spero) che ogni Web Application può ospitare più Site Collection e se è vero che ogni Site Collection può avere un proprio content db, allora si arriva al punto di dire che: ogni instanza di webapplication ha un proprio content db nel quale saranno inseriti i contenuti di tutte le Site Collection che sceglieranno di convidere lo stesso content db, se altrimenti non specificato.
Affermato questo, ci rendiamo conto di quanto SharePoint in scenari architetturali medio-grandi sia un prodotto *abbastanza* scalabile, dico abbastanza in quanto fino a che non risolvono il vincolo di una architettura NLB e per di più con l’index server che passeggia per i cavoli suoi, non possiamo dire che sia scalabile su tutti i fronti … anzi sarebbe ancora meglio se dalla prossima versione tutti i servizi fossero clusterizzabili cosi da predisporre un ambiente, dal punto di vista architetturale pienamente rispondente a requisiti di scalabilità e fault tollerance.
Managed paths
Come facciamo a creare più Site Collection per una Web Application? La risposta è nell’utilizzo dei managed paths! Non so se ve ne siete mai resi conto ma le più comuni managed paths che utilizziamo sono essenzialmente due:
- http://myserver/ (root)
- http://myserver/sites/ (sites)
Non perchè ci stiano particolarmente simpatiche ma perchè sono quelle di default. Normalmente un SPSite può essere creato dalla root della Web Application in cui ha il riferimento oppure utilizzando una lista di managed paths che possiamo anche personalizzare. Da *Central Administration\ Application Management\Define Managed Paths* possiamo scegliere quali managed paths utilizzare per la gestione delle Site Collection interne alla FARM ed eventualmente crearne altre di due tipi:
- Wildcard inclusion, rappresenta un path *sotto* al quale possiamo creare n Site Collection. Se proviamo ad accedere direttamente da browser al managed path avremo una pagina di errrore. provate ad accedere direttamente a http://myserver/sites ne rimarrete a bocca sciutta (come si dice in questi casi).
- Explicit inclusion, rappresenta il path puntuale nel quale sarà creata la Site Collection. Se proviamo ad accedere direttamente da browser al managed path, previa estensione della Site Collection, accederemo al sito root.
In definitiva quando SharePoint riceve un url in entrata, scandisce le varie Site Collection parsando l’uri ed effettuando un check nella lista di managed path che abbiamo utilizzato. Molto importante è sapere che una managed path può contenere anche chiavi di valore molto estese, infatti si possono creare dei managedpath del tipo (sites/ departments) ed anche (sites/ departments/ areas). Dato un url non si può definire manualmente a quale Site Collection corrisponde il path a cui si cerca di accedere, tutto viene gestito internamente da SharePoint.
Managed Path & Content DB
Utilizzando una architettura basata sulla differenziazione tra managed path (SPSite) e content db si può raggiungere un alto livello di scalabilità e risolvere parecchi problemi dovuti al size dei vari DBs coinvolti e dal numero di SPWeb che possono esistere all’interno di un’unica Site Collection. Un utile articolo per capire di ciò di cui si sta parlando è il Plan for performance and capacity di MOSS 2007.
Abbiamo visto come differenziare la gestione di >1 Site Collection per ogni Web Application, vediamo ora come effettuare la gestione separata anche per i content db. Per una nuova Site Collection a cui si desidera associare un nuovo content db, ci vien utile in questo caso utilizzare il comando stsadm nel modo seguente:
1: stsadm -o createsiteinnewdb
2: -url http://myserver/sites/departmenta
3: -owneremail suocerca@cucina.com
4: -ownerlogin DOMAIN\FarmAdmin
5: -databaseserver DBServer
6: -databasename departmentA-Content-DB
Le ultime due istruzioni che di norma sono opzionali, in questo caso ci permettono di implementare una politica di diversificazione per ogni Site Collection che si andrà a creare.
Object Model
In questo specifico caso l’OM di SharePoint si comporta in maniera confusionale, non rispetta a mio personale avviso una corretta implementazione della sintassi del costrutto dell’oggetto SPSite. Di seguito condivido alcune linee guida per non incappare in errori che vi faranno perdere nottate intere svegli davanti al PC!
Per essere maggiormente esplicativo vi pongo un esempio: ipotizziamo di aver creato un managed path per la Web Application (http://myserver) del tipo Explicit Inclusion con il nome di (departmentA). La root della Web Application è già stata estesa e contiene un SPWeb dal nome (office1), quindi avremo la seguente situazione:
- http://myserver (SPSite)
- http://myserver/office1 (SPWeb)
- http://myserver/departmentA (SPSite)
ed abbiamo la necessità di creare un sito nell’ultima Site Collection dal nome (office1). Nella logica ci aspettieremo un risultato del tipo:
- http://myserver/departmentA/office1 dove http://myserver è un SPSite come del resto anche http://myserver/departmentA ed in ultimo http://myserver/departmentA/office1 come SPWeb.
Utilizzando gli oggetti messi a disposizione da MOSS notiamo che l’ultima Site Collection su cui creare il sito (office1) dovrà essere trattata come Root Web, quindi essere inizializzata come un SPWeb! Altrimenti non potremo creare il sito (office1) in quanto risulterebbe già esistente nella Site Collection Root della Web Application. Tutto questo per il semplice motivo, molto errato, di gestione dei managed path a livello di OM.
Di seguito un esempio corretto di aggiunta del un nuovo sito. Non ho aggiunto commenti ed ulteriori controlli, credo che il codice sia auto esplicativo. L’unica cosa impostante da notare sta nel modo in cui viene gestito il controllo della presenza o meno dell’oggetto SPWeb all’interno dei webs di *_web* che in questo caso rappresenta l’oggetto site della root della Site Collection. Controllare la presenza di sub webs del sito della root è un modo per non incappare nella tentazione di credere che l’oggetto SPSite inizializzato in precedenza sia in grado di posizionarsi automaticamente nella seconda Site Collection del path: http://myserver/departmentA.
1: static void CreateSite(string url, string title)
2: {
3: using (SPSite site = new SPSite(url))
4: {
5: site.AllowUnsafeUpdates = true;
6: using (SPWeb _web = site.OpenWeb())
7: {
8: _web.AllowUnsafeUpdates = true;
9: if (_web.Webs[title].Exists)
10: {
11: return;
12: }
13: using (SPWeb web = _web.Webs.Add(title))
14: {
15: web.Title = title;
16: web.Update();
17: }
18: _web.AllowUnsafeUpdates = false;
19: }
20: site.AllowUnsafeUpdates = false;
21: }
22: }
23: }
Gabriele Del Giovine approda in it Consult
Feb 25th
Sono davvero incasinato in questo periodo, vorrei scrivere molti post ma non ne ho fisicamente il tempo … chi mi conosce bene può immaginare quanto io abbia da fare per non trovare 5 minuti per scrivere. Tutto questo non mi può comunque impedire di condividere assieme a voi una bellissima notizia come quella del titolo di questo post. Gabriele Del Giovine sarà a breve in azienda per dare man forte a tutte le attività inrenti Microsoft Office SharePoint e Knowledge Management in genere.
Reputo Gabriele una persona fantastica, vive con passione la tecnologia ed il suo know-how è basato su di una esperienza in prima linea su tutto ciò che ruota in torno ai sistemi server rilasciati da Microsoft nell’arco dell’ultimo decennio. Oltre le sue competenze tecniche, Gabriele ricopre un ruolo molto importante nella vita lavorativa di molti professionisti del settore, che come me, valuta ed estende ogni giorno architetture complesse basate su SharePoint. Grazie alle sue competenze ed alla sua disponibilità, sono riuscito, come migliaia in Italia e forse anche all’Estero, a muovere i primi passi dentro alle soluzioni software proposte da Microsoft per il Document Management … ed aggiungerei con ottimi risultati!
Benvenuto Gabry!
content source & search scope
Feb 17th
Per lavorare con gli Shared Service Provider occorre molta buona pratica, non solo per quanto riguarda la gestione delle risorse ma occorre anche considerare il tempo che il server impiega ad effettuare determinate operazioni. Una delle operazioni più comuni, circa la manutenzione del servizio di ricerca, sta proprio nel delineare una corretta politica di *alimentazione* di uno Shared Service Provider (SSP) attraverso l’aggiunta/manutenzione di Content Source e di eventuali Search Scope.
Nell’esempio sotto vi giro del codice che mostra come aggiungere un content source di tipo *web*, quindi di provvedere anche alla registrazione di un suo personale Search Scope.
1: public static void AddScopeToWebContentSource(Uri ssp_url, string cs_name, string scope_name)
2: {
3:
4: SearchContext ctx = null;
5:
6: using (SPSite site = new SPSite(ssp_url.ToString)) {
7:
8: ctx = SearchContext.GetContext(site);
9: }
10:
11: // Retrieve current SSP and its ContentSources
12: Content sspContent = new Content(ctx);
13: ContentSourceCollection sspCollection = sspContent.ContentSources;
14:
15: // If the new ContentSource already exists, no action
16: if ((!sspCollection.Exists(cs_name))) {
17:
18: WebContentSource webCS = (WebContentSource)sspCollection.Create(typeof(WebContentSource), cs_name);
19: }
20:
21:
22: Schema sspSchema = new Schema(ctx);
23: ManagedPropertyCollection props = sspSchema.AllManagedProperties;
24: Scopes scopes = new Scopes(ctx);
25: ScopeCollection sspScopes = scopes.AllScopes;
26: bool exist = false;
27:
28:
29: // Cicle through Scope collection to check if the new scope already exist
30: foreach (Scope sc in sspScopes) {
31:
32: if ((sc.Name == scope_name)) exist = true;
33: }
34:
35:
36: // If the new Scope already exist, no action
37: if (exist == false) {
38:
39: Scope newScope = sspScopes.Create(scope_name, "put a description here!!", null, true, null, ScopeCompilationType.AlwaysCompile);
40:
41: // Automatically this code add as "Rule" its Content Source
42: newScope.Rules.CreatePropertyQueryRule(ScopeRuleFilterBehavior.Include, props("ContentSource"), cs_name);
43: }
44:
45: }
Ancora di seguito, del codice che mostra come alimentare il Content Source con una lista di indirizzi url. Il metodo permette anche di specificare se si intende forzare il full crawl del Content Source non appena abbiamo aggiunto i nuovi start address.
1: public static void AddContentsToWebContentSource(Uri ssp_url, string cs_name, string[] startAddresses, bool startFullCrawl, int MaxSiteEnumerationDepth, int MaxPageEnumerationDepth)
2: {
3:
4: if ((MaxPageEnumerationDepth == 0)) MaxPageEnumerationDepth = 1;
5: if ((MaxSiteEnumerationDepth == 0)) MaxSiteEnumerationDepth = 1;
6:
7: SearchContext ctx = null;
8:
9: using (SPSite site = new SPSite(ssp_url.ToString)) {
10:
11: ctx = SearchContext.GetContext(site);
12: }
13:
14:
15: Content sspContent = new Content(ctx);
16: ContentSourceCollection sspCollection = sspContent.ContentSources;
17:
18: if ((sspCollection.Exists(cs_name))) {
19:
20: WebContentSource csWeb = sspCollection.Item(cs_name);
21:
22: for (int i = 0; i <= startAddresses.Count - 1; i++) {
23:
24: if ((!csWeb.StartAddresses.Exists(new Uri(startAddresses(i).ToString)))) {
25:
26: csWeb.StartAddresses.Add(new Uri(startAddresses(i).ToString));
27: csWeb.MaxSiteEnumerationDepth = MaxSiteEnumerationDepth;
28: csWeb.MaxPageEnumerationDepth = MaxPageEnumerationDepth;
29: csWeb.Update();
30:
31: if ((startFullCrawl)) csWeb.StartFullCrawl();
32: }
33: }
34: }
35: }
Magari lo potete rendere ancora più generico, facendo scegliere anche il tipo di Content Source che si intende registrare (Site, Web, Exchange Folder, File System, …).
Custom Security Trimmer & SharePoint
Feb 10th
Questo è uno degli argomenti più *insider* dell’universomondo di SharePoint, non solo per la sua complessità ma sopratutto per la scelta implementativa che esso comporta.
L’utilizzo di CST (Custom Security Trimmer) è la soluzione proposta da Microsoft per il problema del *trimming* all’interno di operazioni di ricerca e presentazione dei risultati offerte da MOSS. In particolare, ogni volta che un utente esegue una qualsiasi ricerca all’interno del portale, il suo profilo viene utilizzato in fase di *query time* per effettuare il check su quali dei contenuti indicizzati, quindi interessati dalla ricerca che si sta effettuando, l’utente abbia accesso per poi presentarli in fase di visualizzazione.
Può capitare quindi che su di un monte di 100 documenti disponibili, l’utente corrente abbia dei permessi validi solo su di una piccola parte di questi (10?), quindi visualizzerà come risultati soltanto quest’ultimi senza avere coscenza dell’esistenza dei restanti 90. Più che sacrosanto direi!!
L’utilizzo del trimming è un’aspetto fondamentale dell’architettura di collaboration proposta da Microsoft e la maggior parte delle volte viene presentato e percepito giustamente come un grande vantaggio nell’utilizzo del portale anche come unico punto di accesso alle informazioni. Ovviamente rimane una scelta vincente l’utilizzo di MOSS in questi scenari, anzi non si potrebbe immaginare una soluzione migliore, ma ahimè occorre considerare anche architetture in qui questa funzionalità deve essere momentaneamente messa da parte per far posto a soluzioni custom, frutto cioè di una politica di profilazione *differente* da ciò che MOSS offre in modalità Out Of The Box.
Pensate a scenari in qui le vostre applicazioni utilizzano MOSS come base documentale, molto spesso eseguendo operazioni di gestione documentale magari utilizzando un service account, il risultato è abbastanza banale: l’utente anche se in qualche modo legato alla finalità del documento non viene riconosciuto come propeietario a meno che in fase di manipolazione dei dati la vostra applicazione non si preoccupi anche di attribuire specifici permessi.
Scendendo ancora nel particolare, può capitare che processi di archiviazione documentale, ad esempio, eseguano operazione di migrazione massiva di contenuti da un sito all’altro senza preoccuparsi di mantenere la politica di permessi del sito di origine: anche qui ahimè vi ritrovereste senza alcun risultato durante la vostra ricerca, pur avendo in qualche modo partecipato alla pratica di formazione di un determinato documento ora archiviato.
Quindi bene in questo caso adottare una buona politica di CST, magari accompagnata da un corretto urilizzo dell’impersonificazione del service account in fase di ricerca ma in alcuni casi anche questo non basta.
In questi ultimi periodi capita frequentemente, visto anche il *successo* di MOSS come Application Platform, di utilizzare questo prodotto come motore documentale per 100, 1000 attività trasversali al document management, quindi capita che i permessi settati sui singoli documenti o elenchi rientrino in una più grande e variegata policy interna all’applicazione che viene ospitata in MOSS.
A prescindere da quale livello di granularità si intenda adottare su siti, liste e/o documenti, non si può prescindere dal considerare anche che l’applicazione host deve in qualche modo poter vivere di vita propria, nello specifico, specializzare e/o estendere le policy native di MOSS anche all’interno di essa, proporre profili personalizzati di utenza che debbano inevitabilmente uscire fuori dal contesto documentale.
Un piccolo esempio: la gestione della qualità.
Una soluzione integrata in MOSS per la gestione della qualità, ha si una profilazione per il gestore documentale ma deve preoccuparsi di mantenere anche altre 10/15 profilazioni a livello applicativo e spesso se questa soluzione è agganciata ad un BPM, il profilo deve essere il più possibile vicino a quello rappresentato dell’organizzazione (ufficio, divisione, settore) di appartenenza senza tralasiare anche le spcifiche competenze di determinati ruoli.
Non è sempre facile mantenere o estendere profilazioni interne a MOSS, in quanto alcuni ruoli applicativi non possono, per natura, essere riportati o re-interpretati su scenari applicativi del tutto esterni a MOSS.
In questi scenari il collo di bottiglia potrebbe essere l’utilizzo di un CST *as Microsoft suggest*, proprio quando dobbiamo uscire fuori dalla profilazione offerta da MOSS, quindi effettuare un match tra policy interne ed esterne al motore di gestione documentale.
Per rendere più esplicativo il problema vi propongo un esempio di CST *as-is*, il codice che riporto può essere consultato qui.
Il metodo core è la funzione di check che deve restituire una array di GUID che andranno a formare la lista di informazioni restituite dalla ricerca. Possiamo intervenire appunto su questa lista, scegliendo quali di questi risultati concorrerrano alla formazione dei risultati di ricerca:
1: public BitArray CheckAccess(IList<String> documentcrawlURLs, IDictionary<String, Object> sessionProperties)
2: {
3: BitArray retArray = new BitArray(crawlURLs.Count);
4:
5: for (int x = 0; x < crawlURLs.Count; x++)
6: {
7: /*
8: To fully implement the security trimmer,
9: add code to perform the security check
10: and determine if strUser can access crawlURLs[x].
11: If strUser can access crawlURL[x], then:
12: */
13: retArray[x] = true;
14: //If not:
15: retArray[x] = false;
16: }
17: return retArray;
18: }
Implementando la logica di comportamento del metodo non dovremmo riscontrare alcun problema in condizioni *normali* ma tutto cambia se ci troviamo a dover effettuare un match con profilazione applicative, quindi proprie della nostra applicazione. In questo caso i problemi possono dimostrarsi numerosi e particolarmente *fastidiosi* sopratutto in termini di efficienza di tempo impiegato e di risorse di calcolo.
Problema 1: Impersonificazione
L’impersonificazione del service account che molto spesso deve avere il *monopolio* del patrimonio documentale è spesso requisito fondamentale in quanto il trimming mantiene le informazioni dell’utente che sta eseguendo l’operazione di ricerca, quindi mantiene le sue credenziali. E’ necessario impersonificare un utente di livello più elevato per fare in modo che il monte di documenti ritornato sia il più amio possibile.
Problema 2: Parsing del documentcrawlURLs
Un problema non da poco è l’identificazione delle informazioni del documnto all’interno della lista di input della funzione CheckAccess.
La funzione presenta ogni item alla logica di profilazione nel seguente modo:
1: sts3://moss/siteurl=/siteid={86051521-13de-4dac-80d1-231406b51b57}
2: /weburl=/webid={e67908fc-024b-4689-b854-4837d0d32abb}
3: /listid={30dc794a-c5b6-4c86-97f6-2ed65133149d}/viewid={efc86211-
4: 96e2-4443-9dfc-5d8e42daf285}
Quella rappresentata è la classica quaterna formata dall’url della site colelction, url del web site, guid della lista ed il guid della view. Da qui dobbiamo in qualche modo implementare del codice per l’identificazione del documento o della lista ed effettuare un check sulle permission di questi ultimi, in più eseguire un match con le policy della nostra applicazione, quindi decidere se aggiungere o meno l’item all’array che ritornerà la funzione CheckAccess.
Problema 3: Manutenzione della soluzione
La DLL che implementeremo oltre che essere registrata nella GAC (ovvio) necessiterà anche di alcune operazioni di amministrazione in MOSS ed in più lo stesso CST dovrà esseere aggiornato mano a mano che la crescita delle SiteCollection interessate dall’applicazione crescerà di numero o di dimensione.
In generale più è complessa la logica delle funzioni di CheckAccess che implementiamo, più perde di efficienza l’intera architettura di ricerca, in quanto le operazioni di check vengono chiamate durante l’attesa della visualizzazione dei dati da parte dell’utente, a *query time* per l’appunto.
Test su quantità di documenti (>10000) già richiedono un incremento dell’attesa di + di 0,05 secondi. Consideriamo anche che il problema n.1 (Impersonificazione) ovviamente incide molto sulle performance in quanto utilizzando un account con elevati privilegi la quantità di documenti posta a CST è molto spesso la totalità dei documenti a disposizione della nostra organizzazione.
Per chi di voi necessità di effettuare profilazioni complesse e che necessitano uan esternazione applicativa da MOSS una strada efficiente, mantenibile ed altamente customizzabile risiede il più delle volte in questa semplice best practice:
- Utilizzo del query object model per effettuare la ricerca;
- Passaggio delle informazioni inerenti al documento (questa volta no GUID) ad una Stored Procedure per il parsing e profilazione;
- Presentazione dei risultati
Questo utilizzo può abbassare di molto i tempi di esecuzione richiesti da MOSS anche se confrontato con quelli attesi in normali condizioni di trimming.
Ambiente di sviluppo *scalabile*
Feb 3rd
Quando si parla di sviluppo in generale si tende a circoscrivere l’ambiente di produzione alla propria macchina o al massimo ad una delle tante macchine virtuali che abbiamo configurato. Ancor di più se parliamo di Microsoft Office SharePoint Server che come ben sappiamo soffre di limitazioni abbastanza *strette* in termini di portabilità delle soluzioni che sviluppiamo.
Pensate quindi alla necessità delle software house che sviluppano prodotti integrati in SharePoint e quindi i requisiti di scalabilità adottati per le operazioni di sviluppo, test e manutenzione del prodotto.
Con l’avvento di Windows Server 2008 e la tecnologia Hyper-V, virtualizzare è diventato oltre che pura *necessità* un modo efficace ed efficiente per predisporre ambienti, in questo caso di sviluppo, in grado di assicurare alta scalabilità di prestazioni con uno sforzo, il più delle volte, uguale a zero.
Ancor più difficile è mantenere un ambiente di sviluppo che sia in grado di assicurare le funzionalità del prodotto sia su sistemi operativi x86 che x64.
Per fare un esempio reale, da tempo oramai lo sviluppo e mantenimento di josh Protocol!, il prodotto che seguo principalmente, richiede un ambiente di certificazione Windows Server 2008, di conseguenza è necessario sostenere lo sviluppo, deploy e test del prodotto su piattaforma x64.
La soluzione che si è scelta tempo fà è risultata molto efficiente, sia in termini di prestazioni che di mantenibilità di uno degli ambienti di sviluppo che poggia principalmente su Windows Server 2008 x64 e MOSS 2007.
Questa figura mostra lo scenario tipico sul quale viene sviluppato josh Protocol! o qualsiasi altro prodotto di it Consult. Una architettura di questo genere ha molti vantaggi ma prima voglio spiegarvi la configurazione delle macchine presenti.
Hyper-V FARM 1 – è la vera e propria FARM di MOSS nella quale viene assemblato uno scenario NLB con uno o più server per l’indicizzazione o a loro posto più ruoli di query service ai singoli FE. Il cluester mantiene i DBs di configurazione ed eventualmente anche quelli dell’applicazione. La FARM mantiene degli ALIAS esterni che possono essere in seguito utilizzati per effettuare test interni o opoerazioni di manutenzione.
Hyper-V FARM 2 – è l’ambiente di sviluppo su macchine tipicamente Windows Server 2008 ma ne possono essere aggiunte anche altre di altro genere. Su ogni server vengono installate soltanto le componenti web di MOSS cosi da poter condividere una alta quantità di informazioni con la FARM senza sovraccaricare le macchine di sviluppo che a loro volta possono testare versioni x86/x64 del prodotto.
L’utilizzo di Hyper-V è essenziale per le operazioni di manutenzione e ripristino di diversi stati delle macchine cosi da agevolare anche l’estensione della stessa FARM o delle singole macchine di sviluppo.
L’occupazione delle risorse fisiche del server che ospita Hyper-V possono essere dinamicamente assegnate a seconda delle fasi di sviluppo del prodotto o ad esempio concentrate su singoli componenti (ad esempio Index Server(s), Cluster) per aumentare le capacità di calcolo.

