Eseguire un cluster Cassandra su Linux in Azure con Node.jsRun a Cassandra cluster on Linux in Azure with Node.js

Importante

Azure offre due diversi modelli di distribuzione per creare e usare le risorse: Gestione risorse e la distribuzione classica.Azure has two different deployment models for creating and working with resources: Resource Manager and Classic. Questo articolo illustra l'uso del modello di distribuzione classica.This article covers using the Classic deployment model. Microsoft consiglia di usare il modello di Gestione risorse per le distribuzioni più recenti.Microsoft recommends that most new deployments use the Resource Manager model. Vedere i modelli di Resource Manager per cluster Datastax Enterprise e Spark e Cassandra in CentOS.See Resource Manager templates for Datastax Enterprise and Spark cluster and Cassandra on CentOS.

PanoramicaOverview

Microsoft Azure è una piattaforma cloud aperta che esegue software sia Microsoft che non Microsoft, inclusi sistemi operativi, server applicazioni, middleware di messaggistica, oltre a database SQL e NoSQL da modelli sia commerciali che open source.Microsoft Azure is an open cloud platform that runs both Microsoft and non-Microsoft software which includes operating systems, application servers, messaging middleware as well as SQL and NoSQL databases from both commercial and open source models. La compilazione di servizi resilienti su cloud pubblici, incluso Azure, richiede un'attenta pianificazione e un'architettura mirata sia per i server applicazioni che per i livelli di archiviazione.Building resilient services on public clouds including Azure requires careful planning and deliberate architecture for both applications servers as well storage layers. L'architettura di archiviazione distribuita di Cassandra aiuta a compilare con facilità sistemi a disponibilità elevata a tolleranza di errore del cluster.Cassandra’s distributed storage architecture naturally helps in building highly available systems that are fault tolerant for cluster failures. Cassandra è un database NoSQL con scalabilità cloud gestito da Apache Software Foundation all'indirizzo cassandra.apache.org. Cassandra è scritto in Java,Cassandra is a cloud scale NoSQL database maintained by Apache Software Foundation at cassandra.apache.org. Cassandra is written in Java. pertanto viene eseguito su piattaforme sia Windows che Linux.So it runs on both on Windows and Linux platforms.

Lo scopo di questo articolo è mostrare la distribuzione di Cassandra in Ubuntu come cluster di uno solo o di più data center che usa le macchine virtuali di Microsoft Azure e le reti virtuali.The focus of this article is to show Cassandra deployment on Ubuntu as a single and multi-data center cluster that uses Azure Virtual Machines and Virtual Networks. La distribuzione del cluster per i carichi di lavoro ottimizzati per la produzione esula dall'ambito di questo articolo perché richiede una configurazione nodi a più dischi, una progettazione appropriata della topologia ad anello e la modellazione dati per supportare i requisiti necessari di replica, coerenza dei dati, velocità effettiva e disponibilità elevata.The cluster deployment for production optimized workloads is out of scope of this article as it requires multi-disk node configuration, appropriate ring topology design and data modeling to support the needed replication, data consistency, throughput and high availability requirements.

Questo articolo usa un approccio di base per spiegare che cosa comporta la compilazione del cluster Cassandra rispetto a Docker, Chef o Puppet, semplificando notevolmente la distribuzione dell'infrastruttura.This article takes a fundamental approach to show what is involved in building the Cassandra cluster compared Docker, Chef or Puppet which can make the infrastructure deployment a lot easier.

Modelli di distribuzioneThe Deployment Models

La rete di Microsoft Azure consente di distribuire cluster privati isolati, il cui accesso può essere limitato per ottenere una sicurezza di rete con granularità fine.Microsoft Azure networking allows the deployment of isolated private clusters, the access of which can be restricted to attain fine grained network security. Poiché lo scopo di questo articolo è illustrare la distribuzione di Cassandra a un livello di base, non si parlerà del livello di coerenza e della progettazione delle risorse di archiviazione ottimale per la velocità effettiva.Since this article is about showing the Cassandra deployment at a fundamental level, it doesn't focus on the consistency level and the optimal storage design for throughput. Ecco i requisiti di rete per l'ipotetico cluster:Here is the list of networking requirements for the hypothetical cluster:

  • I sistemi esterni non possono accedere al database Cassandra da Azure o all'esterno di AzureExternal systems can’t access Cassandra database from within or outside Azure
  • Il cluster Cassandra deve trovarsi dietro un bilanciamento del carico per il traffico ThriftCassandra cluster has to be behind a load balancer for thrift traffic
  • Distribuire i nodi di Cassandra in due gruppi in ogni data center per una migliore disponibilità del clusterDeploy Cassandra nodes in two groups in each data center for an enhanced cluster availability
  • Bloccare il cluster in modo che solo la server farm applicazioni abbia accesso diretto al databaseLock down the cluster so that only application server farm has access to the database directly
  • Nessun endpoint di rete pubblico diverso da SSHNo public networking endpoints other than SSH
  • Ogni nodo di Cassandra richiede un indirizzo IP interno fissoEach Cassandra node needs a fixed internal IP address

Cassandra può essere distribuito in una singola area di Azure o in più aree a seconda della natura distribuita del carico di lavoro.Cassandra can be deployed to a single Azure region or to multiple regions based on the distributed nature of the workload. È possibile usare il modello di distribuzione in più aree per gestire gli utenti finali più vicini a una determinata area geografica con la stessa infrastruttura di Cassandra.You can use a multi-region deployment model to serve end users closer to a particular geography through the same Cassandra infrastructure. La replica dei nodi predefiniti di Cassandra consente di sincronizzare le scritture multimaster derivanti da più data center e presenta alle applicazioni una visualizzazione coerente dei dati.Cassandra’s built-in node replication takes care of the synchronization of multi-master writes originating from multiple data centers and presents a consistent view of the data to applications. La distribuzione in più aree è utile anche per attenuare i rischi causati dalle interruzioni di Servizi di Azure.Multi-region deployment can also help with the risk mitigation of the broader Azure service outages. La coerenza perfezionabile e la topologia di replica di Cassandra consentono anche di soddisfare diverse esigenze RPO delle applicazioni.Cassandra’s tunable consistency and replication topology helps in meeting diverse RPO needs of applications.

Distribuzione in un'area singolaSingle Region Deployment

Iniziare con una distribuzione in una singola area e si raccoglieranno le istruzioni per creare un modello a più aree.Let's start with a single region deployment and harvest the learnings in creating a multi-region model. La rete virtuale di Azure viene usata per creare subnet isolate per poter soddisfare i requisiti di sicurezza della rete citati sopra.Azure virtual networking is used to create isolated subnets so that the network security requirements mentioned above can be met. Il processo descritto nella creazione della distribuzione in una singola area usa Ubuntu 14.04 LTS e Cassandra 2.08.The process described in creating the single region deployment uses Ubuntu 14.04 LTS and Cassandra 2.08. Il processo può però essere facilmente adottato anche per le altre varianti di Linux.However, the process can easily be adopted to the other Linux variants. Di seguito sono riportate alcune caratteristiche di sistema della distribuzione in una singola area.The following are some of the systemic characteristics of the single region deployment.

Disponibilità elevata: i nodi di Cassandra illustrati nella figura 1 vengono distribuiti in due set di disponibilità in modo da diffonderli tra più domini di errore a scopo di disponibilità elevata.High Availability: The Cassandra nodes shown in the Figure 1 are deployed to two availability sets so that the nodes are spread between multiple fault domains for high availability. Viene eseguito il mapping delle macchine virtuali annotate con ogni set di disponibilità a 2 domini di errore.VMs annotated with each availability set is mapped to 2 fault domains. Azure usa il concetto di dominio di errore per gestire periodi di inattività non pianificati (ad esempio errori hardware o software).Azure uses the concept of fault domain to manage unplanned down time (for example hardware or software failures). Il concetto di dominio di aggiornamento (ad esempio aggiornamenti o patch del sistema operativo guest o host, aggiornamenti di applicazioni) si applica alla gestione dei tempi di inattività pianificati.The concept of upgrade domain (for example host or guest OS patching/upgrades, application upgrades) is used for managing scheduled down time. Vedere Ripristino di emergenza e disponibilità elevata per applicazioni Azure per il ruolo dei domini di errore e di aggiornamento nel conseguimento dell'alta disponibilità.Please see Disaster Recovery and High Availability for Azure Applications for the role of fault and upgrade domains in attaining high availability.

Distribuzione in un'area singola

Figura 1: Distribuzione in un'area singolaFigure 1: Single region deployment

Al momento della stesura di questo articolo, Azure non consente il mapping esplicito di un gruppo di macchine virtuali a un dominio di errore specifico. Quindi, anche con il modello di distribuzione mostrato nella figura 1, è statisticamente probabile che venga eseguito il mapping di tutte le macchine virtuali a due domini di errore invece che a quattro.Note that at the time of this writing, Azure doesn’t allow the explicit mapping of a group of VMs to a specific fault domain; consequently, even with the deployment model shown in Figure 1, it is statistically probable that all the virtual machines may be mapped to two fault domains instead of four.

Traffico Thrift con bilanciamento del carico: le librerie client Thrift all'interno del server web si connettono al cluster tramite un servizio di bilanciamento del carico interno.Load Balancing Thrift Traffic: Thrift client libraries inside the web server connect to the cluster through an internal load balancer. Questa operazione richiede il processo di aggiunta del servizio di bilanciamento del carico interno alla subnet "data" (vedere la figura 1) nel contesto del servizio cloud che ospita il cluster Cassandra.This requires the process of adding the internal load balancer to the “data” subnet (refer Figure 1) in the context of the cloud service hosting the Cassandra cluster. Una volta definito il servizio di bilanciamento del carico interno, per ogni nodo è necessaria l’aggiunta dell'endpoint con carico bilanciato con le annotazioni di un set con carico bilanciato con il nome del servizio di bilanciamento del carico definito in precedenza.Once the internal load balancer is defined, each node requires the load balanced endpoint to be added with the annotations of a load balanced set with previously defined load balancer name. Per ulteriori dettagli, vedere Bilanciamento del carico interno di Azure .See Azure Internal Load Balancing for more details.

Valori di inizializzazione del cluster: è importante selezionare i nodi con disponibilità più elevata per i valori di inizializzazione perché i nuovi nodi comunicano con i nodi dei valori di inizializzazione per individuare la topologia del cluster.Cluster Seeds: It is important to select the most highly available nodes for seeds as the new nodes communicate with seed nodes to discover the topology of the cluster. Un nodo da ogni set di disponibilità viene designato come nodo di inizializzazione per evitare il singolo punto di errore.One node from each availability set is designated as seed nodes to avoid single point of failure.

Fattore di replica e livello di coerenza: la durabilità dei dati e l’alta disponibilità incorporate in Cassandra sono caratterizzate dal fattore di replica (RF - numero di copie di ogni riga archiviata nel cluster) e dal livello di coerenza (numero di repliche da leggere/scrivere prima della restituzione del risultato al chiamante).Replication Factor and Consistency Level: Cassandra’s build-in high-availability and data durability is characterized by the Replication Factor (RF - number of copies of each row stored on the cluster) and Consistency Level (number of replicas to be read/written before returning the result to the caller). Il fattore di replica viene specificato durante la creazione di KEYSPACE, simile a un database relazionale, mentre il livello di coerenza viene specificato eseguendo la query CRUD.Replication factor is specified during the KEYSPACE (similar to a relational database) creation whereas the consistency level is specified while issuing the CRUD query. Vedere la documentazione di Cassandra in Configuring for Consistency per i dettagli della coerenza e la formula per il calcolo del quorum.See Cassandra documentation at Configuring for Consistency for consistency details and the formula for quorum computation.

Cassandra supporta due tipi di modelli di integrità dei dati: coerenza e coerenza finale. Il fattore di replica e il livello di coerenza determinano insieme se i dati saranno coerenti non appena l'operazione di scrittura è completata o se sono coerenti alla fine.Cassandra supports two types of data integrity models – Consistency and Eventual Consistency; the Replication Factor and Consistency Level together determine if the data is consistent as soon as a write operation is complete or eventually consistent. Ad esempio, se si specifica QUORUM come livello di coerenza, la coerenza dei dati è sempre garantita, mentre con un altro livello di coerenza, al di sotto del numero di repliche da scrivere necessarie per ottenere QUORUM (ad esempio, ONE), i dati risulteranno coerenti alla fine.For example, specifying QUORUM as the Consistency Level always ensures data Consistency while any consistency level, below the number of replicas to be written as needed to attain QUORUM (for example ONE) results in data being eventually consistent.

Con il cluster a 8 nodi illustrato in precedenza, con un fattore di replica pari a 3 e un livello di coerenza in lettura/scrittura QUORUM (2 nodi vengono letti o scritti per coerenza), sarebbe possibile perdere un massimo di 1 nodo per gruppo di repliche prima che l'applicazione individuasse l'errore.The 8-node cluster shown above, with a replication factor of 3 and QUORUM (2 nodes are read or written for consistency) read/write consistency level, can survive the theoretical loss of at the most 1 node per replication group before the application start noticing the failure. Ciò presuppone che tutti gli spazi chiave abbiano ben bilanciato le richieste in lettura/scrittura.This assumes that all the key spaces have well balanced read/write requests. I parametri seguenti vengono usati per il cluster distribuito:The following are the parameters used for the deployed cluster:

Configurazione del cluster Cassandra in un'area singola:Single region Cassandra cluster configuration:

Parametro clusterCluster Parameter ValoreValue OsservazioniRemarks
Number of Nodes (N)Number of Nodes (N) 88 Numero totale di nodi nel clusterTotal number of nodes in the cluster
Replication Factor (RF)Replication Factor (RF) 33 Numero di repliche di una determinata rigaNumber of replicas of a given row
Consistency Level (Write)Consistency Level (Write) QUORUM[(RF/2) +1) = 2] Il risultato della formula viene arrotondato per difettoQUORUM[(RF/2) +1) = 2] The result of the formula is rounded down Scrive al massimo 2 repliche prima che la risposta venga inviata al chiamante. La terza replica viene scritta in modo coerente alla fine.Writes at the most 2 replicas before the response is sent to the caller; 3rd replica is written in an eventually consistent manner.
Consistency Level (Read)Consistency Level (Read) QUORUM [(RF/2) +1= 2] Il risultato della formula viene arrotondato per difettoQUORUM [(RF/2) +1= 2] The result of the formula is rounded down Legge 2 repliche prima di inviare la risposta al chiamante.Reads 2 replicas before sending response to the caller.
Replication StrategyReplication Strategy NetworkTopologyStrategy: per ulteriori informazioni, vedere Replica dei dati nella documentazione di CassandraNetworkTopologyStrategy see Data Replication in Cassandra documentation for more information Riconosce la topologia della distribuzione e inserisce le repliche nei nodi in modo che tutte le repliche non finiscano nello stesso rackUnderstands the deployment topology and places replicas on nodes so that all the replicas don’t end up on the same rack
SnitchSnitch GossipingPropertyFileSnitch: per ulteriori informazioni, vedere Switches nella documentazione di CassandraGossipingPropertyFileSnitch see Switches in Cassandra documentation for more information NetworkTopologyStrategy usa il concetto di snitch per conoscere la topologia.NetworkTopologyStrategy uses a concept of snitch to understand the topology. GossipingPropertyFileSnitch offre un maggior controllo sul mapping di ogni nodo al data center e al rack.GossipingPropertyFileSnitch gives better control in mapping each node to data center and rack. Il cluster usa quindi il protocollo gossip per propagare queste informazioni.The cluster then uses gossip to propagate this information. Questo è molto più semplice nell'impostazione IP dinamico relativa a PropertyFileSnitchThis is much simpler in dynamic IP setting relative to PropertyFileSnitch

Considerazioni di Azure per Cluster Cassandra: la funzionalità Macchine virtuali di Microsoft Azure utilizza l'archiviazione BLOB di Azure per la persistenza del disco; Archiviazione di Azure consente di salvare tre repliche di ciascun disco per garantire una durabilità elevata.Azure Considerations for Cassandra Cluster: Microsoft Azure Virtual Machines capability uses Azure Blob storage for disk persistence; Azure Storage saves three replicas of each disk for high durability. Ciò significa che ogni riga di dati inserita in una tabella di Cassandra è già archiviata in tre repliche,That means each row of data inserted into a Cassandra table is already stored in three replicas. pertanto la coerenza dei dati è già assicurata anche se il fattore di replica (RF) è 1.So data consistency is already taken care of even if the Replication Factor (RF) is 1. Il problema principale con un fattore di replica pari a 1 è che l'applicazione subisce tempi di inattività anche in caso di errore di un singolo nodo di Cassandra.The main problem with Replication Factor being 1 is that the application experiences downtime even if a single Cassandra node fails. Tuttavia, se un nodo è inattivo per problemi riconosciuti dal Controller di infrastruttura di Azure, ad esempio errori hardware o del software di sistema, viene effettuato il provisioning di un nuovo nodo utilizzando le stesse unità di archiviazione.However, if a node is down for the problems (for example hardware, system software failures) recognized by Azure Fabric Controller, it provisions a new node in its place using the same storage drives. Il provisioning di un nuovo nodo per sostituire quello vecchio potrebbe richiedere alcuni minuti.Provisioning a new node to replace the old one may take a few minutes. Allo stesso modo, per le attività di manutenzione pianificata come le modifiche del sistema operativo guest, gli aggiornamenti e le modifiche dell’applicazione di Cassandra, il controller di infrastruttura di Azure esegue in sequenza gli aggiornamenti dei nodi del cluster.Similarly for planned maintenance activities like guest OS changes, Cassandra upgrades and application changes Azure Fabric Controller performs rolling upgrades of the nodes in the cluster. Gli aggiornamenti in sequenza potrebbero comportare l’inattività di alcuni nodi, per cui nel cluster potrebbe verificarsi breve periodo di inattività per alcune partizioni.Rolling upgrades also may take down a few nodes at a time and hence the cluster may experience brief downtime for a few partitions. Tuttavia, i dati non vengono persi grazie alla ridondanza di archiviazione di Azure incorporata.However, the data isn't lost due to the built-in Azure Storage redundancy.

Per i sistemi distribuiti in Azure che non richiedono una disponibilità elevata (ad esempio circa 99,9, equivalente a 8,76 ore/anno; per i dettagli, vedere Disponibilità elevata), è possibile l'esecuzione con RF=1 e livello di coerenza = UNO.For systems deployed to Azure that doesn’t require high availability (for example around 99.9 which is equivalent to 8.76 hrs/year; see High Availability for details) you may be able to run with RF=1 and Consistency Level=ONE. Per le applicazioni con requisiti di disponibilità elevata, RF=3 e Consistency Level=QUORUM consentono di tollerare il tempo di inattività di uno dei nodi delle repliche.For applications with high availability requirements, RF=3 and Consistency Level=QUORUM tolerates the down time of one of the nodes one of the replicas. RF=1 nelle distribuzioni tradizionali (ad esempio quelle locali) non può essere usato a causa della possibile perdita di dati causata da problemi come gli errori dei dischi.RF=1 in traditional deployments (for example on-premises) can’t be used due to the possible data loss resulting from problems like disk failures.

Distribuzione in più areeMulti-region Deployment

Il modello descritto di replica e coerenza con riconoscimento del data center di Cassandra è di aiuto nella distribuzione in più aree, senza necessità di alcuno strumento esterno.Cassandra’s data-center-aware replication and consistency model described above helps with the multi-region deployment without the need for any external tooling. La differenza con i tradizionali database relazionali, in cui la configurazione per il mirroring del database per le scritture multimaster può essere molto complessa, è considerevole.This is different from the traditional relational databases where the setup for database mirroring for multi-master writes can be complex. Cassandra in una configurazione a più aree può essere utile negli scenari d'utilizzo seguenti:Cassandra in a multi-region setup can help with the usage scenarios including the scenarios:

Distribuzione basata su prossimità: applicazioni multi-tenant, con mapping chiaro di utenti tenant all’area, possono trarre vantaggio dalle basse latenze del cluster con più aree.Proximity based deployment: Multi-tenant applications, with clear mapping of tenant users -to-region, can be benefited by the multi-region cluster’s low latencies. Ad esempio, sistemi di gestione della formazione per istituzioni didattiche possono distribuire un cluster distribuito nelle aree degli Stati Uniti orientali e degli Stati Uniti occidentali per servire i rispettivi campus sia per scopi di transazione che di analisi.For example, a learning management systems for educational institutions can deploy a distributed cluster in East US and West US regions to serve the respective campuses for transactional as well as analytics. I dati possono essere coerenti localmente in fase di lettura e scrittura e possono essere alla fine coerenti tra le due aree.The data can be locally consistent at the time reads and writes and can be eventually consistent across both the regions. Sono disponibili altri esempi quali la distribuzione su supporti, e-commerce, e qualsiasi elemento serva alla base utenti concentrata geograficamente è un buon caso di utilizzo per questo modello di distribuzione.There are other examples like media distribution, e-commerce and anything and everything that serves geo concentrated user base is a good use case for this deployment model.

Disponibilità elevata: la ridondanza è un fattore chiave per ottenere un'elevata disponibilità di software e hardware; per ulteriori informazioni, vedere la sezione sulla compilazione di sistemi cloud affidabili in Microsoft Azure.High Availability: Redundancy is a key factor in attaining high availability of software and hardware; see Building Reliable Cloud Systems on Microsoft Azure for details. In Microsoft Azure, l'unico modo affidabile per ottenere una vera ridondanza è la distribuzione di un cluster con più aree.On Microsoft Azure, the only reliable way of achieving true redundancy is by deploying a multi-region cluster. Le applicazioni possono essere distribuite in modalità attivo-attivo o attivo-passivo e se una delle aree è inattiva, Gestione traffico di Azure può reindirizzare il traffico all'area attiva.Applications can be deployed in an active-active or active-passive mode and if one of the regions is down, Azure Traffic Manager can redirect traffic to the active region. Con la distribuzione della singola area, se la disponibilità è 99,9, una distribuzione di due aree può raggiungere una disponibilità di 99,9999, calcolata con la formula: (1-(1-0,999) * (1-0,999))100). Vedere il documento precedente per informazioni dettagliate.With the single region deployment, if the availability is 99.9, a two-region deployment can attain an availability of 99.9999 computed by the formula: (1-(1-0.999) * (1-0.999))100); see the above paper for details.

Ripristino di emergenza: il cluster Cassandra con più aree, se correttamente progettato, può far fronte a potenziali interruzioni irreversibili del centro.Disaster Recovery: Multi-region Cassandra cluster, if properly designed, can withstand catastrophic data center outages. Se un'area è inattiva, l'applicazione distribuita in altre aree può iniziare a servire gli utenti finali.If one region is down, the application deployed to other regions can start serving the end users. Come le altre implementazioni di continuità aziendale, l'applicazione deve tollerare una certa perdita di dati risultante dai dati della pipeline asincrona.Like any other business continuity implementations, the application has to be tolerant for some data loss resulting from the data in the asynchronous pipeline. Tuttavia, Cassandra rende il ripristino molto più veloce rispetto ai tradizionali processi di ripristino dei database.However, Cassandra makes the recovery much swifter than the time taken by traditional database recovery processes. La figura 2 mostra il tipico modello di distribuzione con più aree con otto nodi in ogni area.Figure 2 shows the typical multi-region deployment model with eight nodes in each region. Entrambe le aree sono immagini speculari tra loro per simmetria; i progetti reali dipendono dai requisiti relativi a tipo di carico di lavoro (ad esempio transazionale o analitico), RPO, RTO, coerenza dei dati e disponibilità.Both regions are mirror images of each other for the same of symmetry; real world designs depend on the workload type (for example transactional or analytical), RPO, RTO, data consistency and availability requirements.

Distribuzione in più aree

Figura 2: Distribuzione di Cassandra con più areeFigure 2: Multi-region Cassandra deployment

Integrazione della reteNetwork Integration

I set di macchine virtuali distribuiti in reti private in due aree diverse comunicano tra loro con un tunnel VPN.Sets of virtual machines deployed to private networks located on two regions communicates with each other using a VPN tunnel. Il tunnel VPN connette due gateway software di cui viene effettuato il provisioning durante il processo di distribuzione in rete.The VPN tunnel connects two software gateways provisioned during the network deployment process. Entrambe le aree hanno un'architettura di rete simile a livello di subnet Web e di dati. La rete di Azure consente di creare tutte le subnet necessarie e di applicare gli elenchi ACL come richiesto dalla sicurezza di rete.Both regions have similar network architecture in terms of “web” and “data” subnets; Azure networking allows the creation of as many subnets as needed and apply ACLs as needed by network security. Quando si progetta la topologia del cluster, è necessario tenere in considerazione la latenza della comunicazione tra data center e l'impatto economico del traffico di rete.While designing the cluster topology, inter data center communication latency and the economic impact of the network traffic need to be considered.

Coerenza dei dati per la distribuzione in più data centerData Consistency for Multi-Data Center Deployment

Le distribuzioni devono riconoscere l'impatto della topologia del cluster sulla velocità effettiva e sulla disponibilità elevata.Distributed deployments need to be aware of the cluster topology impact on throughput and high availability. Il fattore di replica e il livello di coerenza devono essere selezionati in modo che il quorum non dipenda dalla disponibilità di tutti i data center.The RF and Consistency Level need to be selected in such way that the quorum doesn’t depend on the availability of all the data centers. Per un sistema che richiede una coerenza elevata, un livello di coerenza LOCAL_QUORUM (per letture e scritture) garantisce che le letture e le scritture locali vengano soddisfatte dai nodi locali mentre i dati vengono replicati in modo asincrono nei data center remoti.For a system that needs high consistency, a LOCAL_QUORUM for consistency level (for reads and writes) makes sure that the local reads and writes are satisfied from the local nodes while data is replicated asynchronously to the remote data centers. La tabella 2 riepiloga i dettagli della configurazione per il cluster in più aree, che verrà illustrata più avanti in questo articolo.Table 2 summarizes the configuration details for the multi-region cluster outlined later in the write up.

Configurazione del cluster Cassandra in due areeTwo-region Cassandra cluster configuration

Parametro clusterCluster Parameter ValoreValue OsservazioniRemarks
Number of Nodes (N)Number of Nodes (N) 8 + 88 + 8 Numero totale di nodi nel clusterTotal number of nodes in the cluster
Replication Factor (RF)Replication Factor (RF) 33 Numero di repliche di una determinata rigaNumber of replicas of a given row
Consistency Level (Write)Consistency Level (Write) LOCAL_QUORUM [(sum(RF)/2) +1) = 4] Il risultato della formula viene arrotondato per difettoLOCAL_QUORUM [(sum(RF)/2) +1) = 4] The result of the formula is rounded down 2 nodi vengono scritti nel primo data center in modo sincrono. Gli altri 2 nodi necessari per il quorum vengono scritti in modo asincrono nel secondo data center.2 nodes is written to the first data center synchronously; the additional 2 nodes needed for quorum is written asynchronously to the 2nd data center.
Consistency Level (Read)Consistency Level (Read) LOCAL_QUORUM((RF/2) +1) = 2 Il risultato della formula viene arrotondato per difettoLOCAL_QUORUM ((RF/2) +1) = 2 The result of the formula is rounded down Le richieste di lettura vengono soddisfatte da una sola area. 2 nodi vengono letti prima che la risposta venga inviata nuovamente al client.Read requests are satisfied from only one region; 2 nodes are read before the response is sent back to the client.
Replication StrategyReplication Strategy NetworkTopologyStrategy: per ulteriori informazioni, vedere Replica dei dati nella documentazione di CassandraNetworkTopologyStrategy see Data Replication in Cassandra documentation for more information Riconosce la topologia della distribuzione e inserisce le repliche nei nodi in modo che tutte le repliche non finiscano nello stesso rackUnderstands the deployment topology and places replicas on nodes so that all the replicas don’t end up on the same rack
SnitchSnitch GossipingPropertyFileSnitch: per ulteriori informazioni, vedere Snitch nella documentazione di CassandraGossipingPropertyFileSnitch see Snitches in Cassandra documentation for more information NetworkTopologyStrategy usa il concetto di snitch per conoscere la topologia.NetworkTopologyStrategy uses a concept of snitch to understand the topology. GossipingPropertyFileSnitch offre un maggior controllo sul mapping di ogni nodo al data center e al rack.GossipingPropertyFileSnitch gives better control in mapping each node to data center and rack. Il cluster usa quindi il protocollo gossip per propagare queste informazioni.The cluster then uses gossip to propagate this information. Questo è molto più semplice nell'impostazione IP dinamico relativa a PropertyFileSnitchThis is much simpler in dynamic IP setting relative to PropertyFileSnitch

CONFIGURAZIONE SOFTWARETHE SOFTWARE CONFIGURATION

Durante la distribuzione vengono usate le seguenti versioni software:The following software versions are used during the deployment:

SoftwareSoftwareSorgenteSourceVersionVersion
JREJRE JRE 8 JRE 8 8U58U5
JNAJNA JNA JNA 3.2.73.2.7
CassandraCassandraApache Cassandra 2.0.8Apache Cassandra 2.0.8 2.0.82.0.8
UbuntuUbuntu Microsoft Azure Microsoft Azure 14.04 LTS14.04 LTS

Quando si scarica JRE, è necessario accettare manualmente la licenza Oracle.You must manually accept the Oracle license when you download JRE. Per semplificare la distribuzione, scaricare sul desktop tutto il software richiesto.So, to simplify the deployment, download all the required software to the desktop. In seguito caricarlo nell'immagine modello di Ubuntu che verrà creata come precursore della distribuzione cluster.Then upload it to the Ubuntu template image to create as a precursor to the cluster deployment.

Scaricare il software citato sopra in una directory per i download nota (ad esempio, %TEMP%/Downloads in Windows o ~/nella maggior parte di distribuzioni Linux o Mac) nel computer locale.Download the above software into a well-known download directory (for example %TEMP%/downloads on Windows or ~/Downloads on most Linux distributions or Mac) on the local computer.

CREARE UNA MACCHINA VIRTUALE UBUNTUCREATE UBUNTU VM

In questo passaggio del processo verrà creata l'immagine di Ubuntu con i prerequisiti software per poter riusare l'immagine per il provisioning di più nodi di Cassandra.In this step of the process, you create Ubuntu image with the pre-requisite software so that the image can be reused for provisioning several Cassandra nodes.

PASSAGGIO 1: Generare la coppia di chiavi SSHSTEP 1: Generate SSH key pair

In fase di provisioning Azure richiede una chiave pubblica X509 con codifica PEM o DER.Azure needs an X509 public key that is either PEM or DER encoded at the provisioning time. Generare una coppia di chiavi pubbliche/private seguendo le istruzioni contenute in Come usare SSH con Linux in Azure.Generate a public/private key pair using the instructions located at How to Use SSH with Linux on Azure. Se si prevede di usare putty.exe come client SSH in Windows o Linux, è necessario convertire la chiave privata RSA con codifica PEM nel formato PPK mediante puttygen.exe.If you plan to use putty.exe as an SSH client either on Windows or Linux, you have to convert the PEM encoded RSA private key to PPK format using puttygen.exe. Le istruzioni relative a questa operazione sono disponibili nella pagina Web precedente.The instructions for this can be found in the above web page.

PASSAGGIO 2: Creare una macchina virtuale modello UbuntuSTEP 2: Create Ubuntu template VM

Per creare il modello di macchina virtuale, accedere al portale di Azure e usare la sequenza seguente: fare clic su NUOVO, CALCOLO, MACCHINA VIRTUALE, DA RACCOLTA, UBUNTU, Ubuntu Server 14.04 LTS e quindi fare clic sulla freccia a destra.To create the template VM, log into the Azure portal and use the following sequence: Click NEW, COMPUTE, VIRTUAL MACHINE, FROM GALLERY, UBUNTU, Ubuntu Server 14.04 LTS, and then click the right arrow. Per un'esercitazione che descrive come creare una macchina virtuale Linux, vedere Creazione di una macchina virtuale che esegue Linux.For a tutorial that describes how to create a Linux VM, see Create a Virtual Machine Running Linux.

Immettere le informazioni seguenti nella schermata n. 1 "Configurazione macchina virtuale":Enter the following information on the “Virtual machine configuration” screen #1:

NOME CAMPOFIELD NAME VALORE CAMPOFIELD VALUE OSSERVAZIONIREMARKS
DATA DI RILASCIO VERSIONEVERSION RELEASE DATE Selezionare una data dall'elenco a discesaSelect a date from the drop down
NOME MACCHINA VIRTUALEVIRTUAL MACHINE NAME cass-templatecass-template Nome host della macchina virtualeThis is the hostname of the VM
LIVELLOTIER STANDARDSTANDARD Lasciare l'impostazione predefinitaLeave the default
DIMENSIONESIZE A1A1 Selezionare la macchina virtuale in base alle esigenze di IO; per questo scopo, lasciare l'impostazione predefinitaSelect the VM based on the IO needs; for this purpose leave the default
NUOVO NOME UTENTENEW USER NAME localadminlocaladmin "admin" è un nome utente riservato in Ubuntu 12.xx e versioni successive"admin" is a reserved user name in Ubuntu 12.xx and after
AUTENTICAZIONEAUTHENTICATION Fare clic sulla casella di controlloClick check box Selezionare se si desidera applicare la protezione con una chiave SSHCheck if you want to secure with an SSH key
CERTIFICATOCERTIFICATE nome file del certificato di chiave pubblicafile name of the public key certificate Usare la chiave pubblica generata in precedenzaUse the public key generated previously
Nuova passwordNew Password password complessastrong password
Confirm PasswordConfirm Password password complessastrong password

Immettere le informazioni seguenti nella schermata n. 2 "Configurazione macchina virtuale":Enter the following information on the “Virtual machine configuration” screen #2:

NOME CAMPOFIELD NAME VALORE CAMPOFIELD VALUE OSSERVAZIONIREMARKS
SERVIZIO CLOUDCLOUD SERVICE Crea un nuovo servizio cloudCreate a new cloud service Il servizio cloud è un contenitore per le risorse di calcolo come le macchine virtualiCloud service is a container compute resources like virtual machines
NOME DNS DEL SERVIZIO CLOUD:CLOUD SERVICE DNS NAME ubuntu-template.cloudapp.netubuntu-template.cloudapp.net Assegnare un nome bilanciamento del carico indipendente dal computerGive a machine agnostic load balancer name
AREA/GRUPPO DI AFFINITÀ/RETE VIRTUALEREGION/AFFINITY GROUP/VIRTUAL NETWORK Stati Uniti occidentaliWest US Selezionare un'area da cui le applicazioni Web accedono al cluster CassandraSelect a region from which your web applications access the Cassandra cluster
ACCOUNT DI ARCHIVIAZIONESTORAGE ACCOUNT Usare l'impostazione predefinita.Use default Usare l'account di archiviazione predefinito o un account di archiviazione creato in precedenza in una determinata areaUse the default storage account or a pre-created storage account in a particular region
Set di disponibilitàAVAILABILITY SET NessunaNone Lasciare vuotoLeave it blank
ENDPOINTENDPOINTS Usare l'impostazione predefinita.Use default Usare la configurazione SSH predefinitaUse the default SSH configuration

Fare clic sulla freccia destra, lasciare le impostazioni predefinite nella schermata n. 3.Click right arrow, leave the defaults on the screen #3. Fare clic sul pulsante con il segno di spunta per completare il processo di provisioning della macchina virtuale.Click the “check” button to complete the VM provisioning process. Dopo alcuni minuti, la macchina virtuale "ubuntu-template" sarà in stato "In esecuzione".After a few minutes, the VM with the name “ubuntu-template” should be in a “running” status.

INSTALLARE IL SOFTWARE NECESSARIOINSTALL THE NECESSARY SOFTWARE

PASSAGGIO 1: Caricare i file tarballSTEP 1: Upload tarballs

Con scp o pscp, copiare il software scaricato in precedenza nella directory ~/downloads con il seguente formato del comando:Using scp or pscp, copy the previously downloaded software to ~/downloads directory using the following command format:

pscp server-jre-8u5-linux-x64.tar.gz localadmin@hk-cas-template.cloudapp.net:/home/localadmin/downloads/server-jre-8u5-linux-x64.tar.gzpscp server-jre-8u5-linux-x64.tar.gz localadmin@hk-cas-template.cloudapp.net:/home/localadmin/downloads/server-jre-8u5-linux-x64.tar.gz

Ripetere il comando precedente per JRE e per i bit di Cassandra.Repeat the above command for JRE as well as for the Cassandra bits.

PASSAGGIO 2: Preparare la struttura di directory ed estrarre gli archiviSTEP 2: Prepare the directory structure and extract the archives

Accedere alla macchina virtuale e creare la struttura di directory ed estrarre il software come utente con privilegi avanzati con lo script bash seguente:Log into the VM and create the directory structure and extract software as a super user using the bash script below:

#!/bin/bash
CASS_INSTALL_DIR="/opt/cassandra"
JRE_INSTALL_DIR="/opt/java"
CASS_DATA_DIR="/var/lib/cassandra"
CASS_LOG_DIR="/var/log/cassandra"
DOWNLOADS_DIR="~/downloads"
JRE_TARBALL="server-jre-8u5-linux-x64.tar.gz"
CASS_TARBALL="apache-cassandra-2.0.8-bin.tar.gz"
SVC_USER="localadmin"

RESET_ERROR=1
MKDIR_ERROR=2

reset_installation ()
{
   rm -rf $CASS_INSTALL_DIR 2> /dev/null
   rm -rf $JRE_INSTALL_DIR 2> /dev/null
   rm -rf $CASS_DATA_DIR 2> /dev/null
   rm -rf $CASS_LOG_DIR 2> /dev/null
}
make_dir ()
{
   if [ -z "$1" ]
   then
      echo "make_dir: invalid directory name"
      exit $MKDIR_ERROR
   fi

   if [ -d "$1" ]
   then
      echo "make_dir: directory already exists"
      exit $MKDIR_ERROR
   fi

   mkdir $1 2>/dev/null
   if [ $? != 0 ]
   then
      echo "directory creation failed"
      exit $MKDIR_ERROR
   fi
}

unzip()
{
   if [ $# == 2 ]
   then
      tar xzf $1 -C $2
   else
      echo "archive error"
   fi

}

if [ -n "$1" ]
then
   SVC_USER=$1
fi

reset_installation
make_dir $CASS_INSTALL_DIR
make_dir $JRE_INSTALL_DIR
make_dir $CASS_DATA_DIR
make_dir $CASS_LOG_DIR

#unzip JRE and Cassandra
unzip $HOME/downloads/$JRE_TARBALL $JRE_INSTALL_DIR
unzip $HOME/downloads/$CASS_TARBALL $CASS_INSTALL_DIR

#Change the ownership to the service credentials

chown -R $SVC_USER:$GROUP $CASS_DATA_DIR
chown -R $SVC_USER:$GROUP $CASS_LOG_DIR
echo "edit /etc/profile to add JRE to the PATH"
echo "installation is complete"

Se si incolla questo script in una finestra di vim, rimuovere il ritorno a capo (‘\r”) con il comando seguente:If you paste this script into vim window, make sure to remove the carriage return (‘\r”) using the following command:

tr -d '\r' <infile.sh >outfile.sh

Passaggio 3: Modificare etc/profileStep 3: Edit etc/profile

Aggiungere il codice seguente alla fine:Append the following at the end:

JAVA_HOME=/opt/java/jdk1.8.0_05
CASS_HOME= /opt/cassandra/apache-cassandra-2.0.8
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$CASS_HOME/bin
export JAVA_HOME
export CASS_HOME
export PATH

Passaggio 4: Installare JNA per i sistemi di produzioneStep 4: Install JNA for production systems

Usare la sequenza di comandi seguente: il comando seguente installerà jna-3.2.7.jar e jna-platform 3.2.7.jar nella directory /usr/share.java sudo apt-get install libjna-javaUse the following command sequence: The following command installs jna-3.2.7.jar and jna-platform-3.2.7.jar to /usr/share.java directory sudo apt-get install libjna-java

Creare collegamenti simbolici nella directory $CASS_HOME/lib in modo che lo script di avvio di Cassandra possa trovare questi file jar:Create symbolic links in $CASS_HOME/lib directory so that Cassandra startup script can find these jars:

ln -s /usr/share/java/jna-3.2.7.jar $CASS_HOME/lib/jna.jar

ln -s /usr/share/java/jna-platform-3.2.7.jar $CASS_HOME/lib/jna-platform.jar

Passaggio 5: Configurare cassandra.yamlStep 5: Configure cassandra.yaml

Modificare cassandra.yaml su ciascuna macchina virtuale in modo da rispecchiare la configurazione necessaria per tutte le macchine virtuali [questa configurazione verrà perfezionata durante il provisioning vero e proprio]:Edit cassandra.yaml on each VM to reflect configuration needed by all the virtual machines [you tweak this configuration during the actual provisioning]:

Nome campoField Name ValoreValue OsservazioniRemarks
cluster_namecluster_name "CustomerService"“CustomerService” Usare il nome che rispecchia la distribuzioneUse the name that reflects your deployment
listen_addresslisten_address [lasciare vuoto][leave it blank] Eliminare "localhost"Delete “localhost”
rpc_addresrpc_addres [lasciare vuoto][leave it blank] Eliminare "localhost"Delete “localhost”
seedsseeds "10.1.2.4, 10.1.2.6, 10.1.2.8""10.1.2.4, 10.1.2.6, 10.1.2.8" Elenco di tutti gli indirizzi IP designati come valori di inizializzazione.List of all the IP addresses which are designated as seeds.
endpoint_snitchendpoint_snitch org.apache.cassandra.locator.GossipingPropertyFileSnitchorg.apache.cassandra.locator.GossipingPropertyFileSnitch Viene usato da NetworkTopologyStrateg per derivare il data center e il rack della macchina virtualeThis is used by the NetworkTopologyStrateg for inferring the data center and the rack of the VM

Passaggio 6: Acquisire l'immagine della macchina virtualeStep 6: Capture the VM image

Accedere alla macchina virtuale con il nome host (hk-cas-template.cloudapp.net) e la chiave privata SSH creata in precedenza.Log into the virtual machine using the hostname (hk-cas-template.cloudapp.net) and the SSH private key previously created. Per informazioni dettagliate su come accedere con il comando SSH o putty.exe, vedere Come usare SSH con Linux in Azure.See How to Use SSH with Linux on Azure for details on how to log in using the command ssh or putty.exe.

Per acquisire l'immagine, eseguire la sequenza di azioni seguente:Execute the following sequence of actions to capture the image:

1. Effettuare il deprovisioning1. Deprovision

Usare il comando "sudo waagent –deprovision+user" per rimuovere le informazioni specifiche dell'istanza della macchina virtuale.Use the command “sudo waagent –deprovision+user” to remove Virtual Machine instance specific information. Per altri dettagli sul processo di acquisizione di un'immagine, vedere Come acquisire una macchina virtuale Linux da usare come modello .See for How to Capture a Linux Virtual Machine to Use as a Template more details on the image capture process.

2: Arrestare la VM2: Shut down the VM

Assicurarsi che la macchina virtuale sia evidenziata e fare clic sul collegamento ARRESTA nella barra dei comandi in basso.Make sure that the virtual machine is highlighted and click the SHUTDOWN link from the bottom command bar.

3: Acquisire l'immagine3: Capture the image

Assicurarsi che la macchina virtuale sia evidenziata e fare clic sul collegamento ACQUISISCI nella barra dei comandi in basso.Make sure that the virtual machine is highlighted and click the CAPTURE link from the bottom command bar. Nella schermata successiva assegnare un NOME IMMAGINE (ad esempio, hk-cas-2-08-ub-14-04-2014071) e una DESCRIZIONE IMMAGINE appropriata e fare clic sul segno di spunta per terminare il processo di ACQUISIZIONE.In the next screen, give an IMAGE NAME (for example hk-cas-2-08-ub-14-04-2014071), appropriate IMAGE DESCRIPTION, and click the “check” mark to finish the CAPTURE process.

Dopo alcuni secondi l'immagine dovrebbe essere disponibile nella sezione IMMAGINI PERSONALI della raccolta immagini.This process takes a few seconds and the image should be available in MY IMAGES section of the image gallery. La macchina virtuale di origine verrà automaticamente eliminata una volta acquisita l'immagine.The source VM is automatically deleted after the image is successfully captured.

Processo di distribuzione in un'area singolaSingle Region Deployment Process

Passaggio 1: Creare la rete virtuale Accedere al portale di Azure e creare una rete virtuale (versione classica) con gli attributi elencati nella tabella seguente.Step 1: Create the Virtual Network Log into the Azure portal and create a virtual network (classic) with the attributes shown in the following table. Per i singoli passaggi del processo, vedere Creare una rete virtuale (versione classica) usando il portale di Azure.See Create a virtual network (classic) using the Azure portal for detailed steps of the process.



Nome attributo macchina virtualeVM Attribute NameValoreValueOsservazioniRemarks
NOMENamevnet-cass-west-usvnet-cass-west-us
RegionRegionStati Uniti occidentaliWest US
Server DNSDNS ServersNessunaNoneIgnorare questo attributo perché non si userà un server DNSIgnore this as we are not using a DNS Server
Spazio di indirizziAddress Space10.1.0.0/1610.1.0.0/16
IP inizialeStarting IP10.1.0.010.1.0.0
CIDRCIDR /16 (65531)/16 (65531)

Aggiungere le subnet seguenti:Add the following subnets:

NOMENameIP inizialeStarting IPCIDRCIDROsservazioniRemarks
Webweb10.1.1.010.1.1.0/24 (251)/24 (251)Subnet per la Web farmSubnet for the web farm
datadata10.1.2.010.1.2.0/24 (251)/24 (251)Subnet per i nodi del databaseSubnet for the database nodes

Le subnet dati e Web possono essere protette con i gruppi di sicurezza di rete che esulano dall'ambito di questo articolo.Data and Web subnets can be protected through network security groups the coverage of which is out of scope for this article.

Passaggio 2: Provisioning di macchine virtuali Usando l'immagine creata in precedenza, verranno create le macchine virtuali seguenti nel server cloud "hk-c-svc-west" e saranno associate alle rispettive subnet, come mostrato di seguito:Step 2: Provision Virtual Machines Using the image created previously, you create the following virtual machines in the cloud server “hk-c-svc-west” and bind them to the respective subnets as shown below:

Nome computerMachine Name SubnetSubnet Indirizzo IPIP Address Set di disponibilitàAvailability setDC/RackDC/RackValore di inizializzazione?Seed?
hk-c1-west-ushk-c1-west-us datadata 10.1.2.410.1.2.4 hk-c-aset-1hk-c-aset-1 dc =WESTUS rack =rack1dc =WESTUS rack =rack1 Yes
hk-c2-west-ushk-c2-west-us datadata 10.1.2.510.1.2.5 hk-c-aset-1hk-c-aset-1 dc =WESTUS rack =rack1dc =WESTUS rack =rack1 No No
hk-c3-west-ushk-c3-west-us datadata 10.1.2.610.1.2.6 hk-c-aset-1hk-c-aset-1 dc =WESTUS rack =rack2dc =WESTUS rack =rack2 Yes
hk-c4-west-ushk-c4-west-us datadata 10.1.2.710.1.2.7 hk-c-aset-1hk-c-aset-1 dc =WESTUS rack =rack2dc =WESTUS rack =rack2 No No
hk-c5-west-ushk-c5-west-us datadata 10.1.2.810.1.2.8 hk-c-aset-2hk-c-aset-2 dc =WESTUS rack =rack3dc =WESTUS rack =rack3 Yes
hk-c6-west-ushk-c6-west-us datadata 10.1.2.910.1.2.9 hk-c-aset-2hk-c-aset-2 dc =WESTUS rack =rack3dc =WESTUS rack =rack3 No No
hk-c7-west-ushk-c7-west-us datadata 10.1.2.1010.1.2.10 hk-c-aset-2hk-c-aset-2 dc =WESTUS rack =rack4dc =WESTUS rack =rack4 Yes
hk-c8-west-ushk-c8-west-us datadata 10.1.2.1110.1.2.11 hk-c-aset-2hk-c-aset-2 dc =WESTUS rack =rack4dc =WESTUS rack =rack4 No No
hk-w1-west-ushk-w1-west-us Webweb 10.1.1.410.1.1.4 hk-w-aset-1hk-w-aset-1 N/DN/A
hk-w2-west-ushk-w2-west-us Webweb 10.1.1.510.1.1.5 hk-w-aset-1hk-w-aset-1 N/DN/A

Per creare l'elenco precedente di macchine virtuali, è necessario eseguire il processo seguente:Creation of the above list of VMs requires the following process:

  1. Creare un servizio cloud vuoto in una determinata areaCreate an empty cloud service in a particular region
  2. Creare una macchina virtuale dall'immagine acquisita in precedenza e collegarla alla rete virtuale creata in precedenza e ripetere questo passaggio per tutte le macchine virtualiCreate a VM from the previously captured image and attach it to the virtual network created previously; repeat this for all the VMs
  3. Aggiungere al servizio cloud un dispositivo di bilanciamento del carico interno e collegarlo alla subnet "dati"Add an internal load balancer to the cloud service and attach it to the “data” subnet
  4. Per ogni macchina virtuale creata in precedenza, aggiungere un endpoint con carico bilanciato per il traffico Thrift con un set con carico bilanciato connesso al dispositivo di bilanciamento del carico creato in precedenzaFor each VM created previously, add a load balanced endpoint for thrift traffic through a load balanced set connected to the previously created internal load balancer

Il processo precedente può essere eseguito dal portale di Azure. Usare un computer Windows (ricorrere a una macchina virtuale in Azure se non si ha accesso a un computer Windows) e applicare il seguente script PowerShell per il provisioning automatico di tutte le 8 macchine virtuali.The above process can be executed using Azure portal; use a Windows machine (use a VM on Azure if you don't have access to a Windows machine), use the following PowerShell script to provision all 8 VMs automatically.

Elenco 1: script di PowerShell per il provisioning delle macchine virtualiList 1: PowerShell script for provisioning virtual machines

    #Tested with Azure Powershell - November 2014
    #This powershell script deployes a number of VMs from an existing image inside an Azure region
    #Import your Azure subscription into the current Powershell session before proceeding
    #The process: 1. create Azure Storage account, 2. create virtual network, 3.create the VM template, 2. create a list of VMs from the template

    #fundamental variables - change these to reflect your subscription
    $country="us"; $region="west"; $vnetName = "your_vnet_name";$storageAccount="your_storage_account"
    $numVMs=8;$prefix = "hk-cass";$ilbIP="your_ilb_ip"
    $subscriptionName = "Azure_subscription_name";
    $vmSize="ExtraSmall"; $imageName="your_linux_image_name"
    $ilbName="ThriftInternalLB"; $thriftEndPoint="ThriftEndPoint"

    #generated variables
    $serviceName = "$prefix-svc-$region-$country"; $azureRegion = "$region $country"

    $vmNames = @()
    for ($i=0; $i -lt $numVMs; $i++)
    {
       $vmNames+=("$prefix-vm"+($i+1) + "-$region-$country" );
    }

    #select an Azure subscription already imported into Powershell session
    Select-AzureSubscription -SubscriptionName $subscriptionName -Current
    Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccountName $storageAccount

    #create an empty cloud service
    New-AzureService -ServiceName $serviceName -Label "hkcass$region" -Location $azureRegion
    Write-Host "Created $serviceName"

    $VMList= @()   # stores the list of azure vm configuration objects
    #create the list of VMs
    foreach($vmName in $vmNames)
    {
       $VMList += New-AzureVMConfig -Name $vmName -InstanceSize ExtraSmall -ImageName $imageName |
       Add-AzureProvisioningConfig -Linux -LinuxUser "localadmin" -Password "Local123" |
       Set-AzureSubnet "data"
    }

    New-AzureVM -ServiceName $serviceName -VNetName $vnetName -VMs $VMList

    #Create internal load balancer
    Add-AzureInternalLoadBalancer -ServiceName $serviceName -InternalLoadBalancerName $ilbName -SubnetName "data" -StaticVNetIPAddress "$ilbIP"
    Write-Host "Created $ilbName"
    #Add add the thrift endpoint to the internal load balancer for all the VMs
    foreach($vmName in $vmNames)
    {
        Get-AzureVM -ServiceName $serviceName -Name $vmName |
            Add-AzureEndpoint -Name $thriftEndPoint -LBSetName "ThriftLBSet" -Protocol tcp -LocalPort 9160 -PublicPort 9160 -ProbePort 9160 -ProbeProtocol tcp -ProbeIntervalInSeconds 10 -InternalLoadBalancerName $ilbName |
            Update-AzureVM

        Write-Host "created $vmName"     
    }

Passaggio 3: Configurare Cassandra in ogni macchina virtualeStep 3: Configure Cassandra on each VM

Accedere alla macchina virtuale ed eseguire la procedura seguente:Log into the VM and perform the following:

  • Modificare $CASS_HOME/conf/cassandra-rackdc.properties per specificare le proprietà del data center e del rack:Edit $CASS_HOME/conf/cassandra-rackdc.properties to specify the data center and rack properties:

     dc =EASTUS, rack =rack1
    
  • Modificare cassandra.yaml per configurare i nodi dei valori di inizializzazione come segue:Edit cassandra.yaml to configure seed nodes as below:

     Seeds: "10.1.2.4,10.1.2.6,10.1.2.8,10.1.2.10"
    

Passaggio 4: Avviare le macchine virtuali e testare il clusterStep 4: Start the VMs and test the cluster

Accedere a uno dei nodi (ad esempio, hk-c1-west-us) ed eseguire il comando seguente per visualizzare lo stato del cluster:Log into one of the nodes (for example hk-c1-west-us) and run the following command to see the status of the cluster:

   nodetool –h 10.1.2.4 –p 7199 status

Per un cluster a 8 nodi i dati visualizzati saranno simili ai seguenti:You should see the display similar to the one below for an 8-node cluster:

StatusStatusIndirizzoAddress CaricamentoLoad TokensTokens OwnsOwns Host IDHost ID RackRack
UNUN 10.1.2.410.1.2.4 87,81 KB87.81 KB 256256 38,0%38.0% Guid (removed)Guid (removed)rack1rack1
UNUN 10.1.2.510.1.2.5 41,08 KB41.08 KB 256256 68,9% 68.9% Guid (removed)Guid (removed)rack1rack1
UNUN 10.1.2.610.1.2.6 55,29 KB55.29 KB 256256 68,8%68.8% Guid (removed)Guid (removed)rack2rack2
UNUN 10.1.2.710.1.2.7 55,29 KB55.29 KB 256256 68,8%68.8% Guid (removed)Guid (removed)rack2rack2
UNUN 10.1.2.810.1.2.8 55,29 KB55.29 KB 256256 68,8%68.8% Guid (removed)Guid (removed)rack3rack3
UNUN 10.1.2.910.1.2.9 55,29 KB55.29 KB 256256 68,8%68.8% Guid (removed)Guid (removed)rack3rack3
UNUN 10.1.2.1010.1.2.10 55,29 KB55.29 KB 256256 68,8%68.8% Guid (removed)Guid (removed)rack4rack4
UNUN 10.1.2.1110.1.2.11 55,29 KB55.29 KB 256256 68,8%68.8% Guid (removed)Guid (removed)rack4rack4

Testare il cluster in un'area singolaTest the Single Region Cluster

Usare i passaggi seguenti per testare il cluster:Use the following steps to test the cluster:

  1. Con il commandlet Get-AzureInternalLoadbalancer dei comandi PowerShell, ottenere l'indirizzo IP del dispositivo di bilanciamento del carico interno, ad esempio 10.1.2.101.Using the Powershell command Get-AzureInternalLoadbalancer commandlet, obtain the IP address of the internal load balancer (for example 10.1.2.101). La sintassi del comando viene mostrata di seguito: Get-AzureLoadbalancer –ServiceName "hk-c-svc-west-us" [vengono visualizzati i dettagli del servizio di bilanciamento del carico interno con l'indirizzo IP]The syntax of the command is shown below: Get-AzureLoadbalancer –ServiceName "hk-c-svc-west-us” [displays the details of the internal load balancer along with its IP address]
  2. Accedere alla macchina virtuale della Web farm (ad esempio, hk-w1-west-us) con Putty o SSHLog into the web farm VM (for example hk-w1-west-us) using Putty or ssh
  3. Eseguire $CASS_HOME/bin/cqlsh 10.1.2.101 9160Execute $CASS_HOME/bin/cqlsh 10.1.2.101 9160
  4. Usare i seguenti comandi CQL per verificare se il cluster è in funzione:Use the following CQL commands to verify if the cluster is working:

    CREATE KEYSPACE customers_ks WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 }; USE customers_ks; CREATE TABLE Customers(customer_id int PRIMARY KEY, firstname text, lastname text); INSERT INTO Customers(customer_id, firstname, lastname) VALUES(1, 'John', 'Doe'); INSERT INTO Customers(customer_id, firstname, lastname) VALUES (2, 'Jane', 'Doe');CREATE KEYSPACE customers_ks WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 }; USE customers_ks; CREATE TABLE Customers(customer_id int PRIMARY KEY, firstname text, lastname text); INSERT INTO Customers(customer_id, firstname, lastname) VALUES(1, 'John', 'Doe'); INSERT INTO Customers(customer_id, firstname, lastname) VALUES (2, 'Jane', 'Doe');

    SELECT * FROM Customers;SELECT * FROM Customers;

Verranno visualizzati dei risultati simili ai seguenti:You should see something like the following results:

customer_idcustomer_id firstnamefirstname lastnamelastname
11 JohnJohn DoeDoe
22 JaneJane DoeDoe

Il keyspace creato nel passaggio 4 usa SimpleStrategy con replication_factor pari a 3.The keyspace created in step 4 uses SimpleStrategy with a replication_factor of 3. SimpleStrategy è consigliato per le distribuzioni in un data center singolo, NetworkTopologyStrategy invece per le distribuzioni in più data center.SimpleStrategy is recommended for single data center deployments whereas NetworkTopologyStrategy for multi-data center deployments. Un replication_factor pari a 3 garantisce la tolleranza per gli errori dei nodi.A replication_factor of 3 gives tolerance for node failures.

Processo di distribuzione in più aree Multi-Region Deployment Process

Verrà sfruttata la distribuzione in un'area singola completata e si ripeterà lo stesso processo per l'installazione della seconda area.You leverage the single region deployment completed and repeat the same process for installing the second region. La differenza principale tra la distribuzione in un'area singola e in più aree è la configurazione del tunnel VPN per la comunicazione tra le aree. Si inizierà con l'installazione di rete, il provisioning delle macchine virtuali e la configurazione di Cassandra.The key difference between the single and multiple region deployment is the VPN tunnel setup for inter-region communication; you start with the network installation, provision the VMs and configure Cassandra.

Passaggio 1: Creare la rete virtuale nella seconda areaStep 1: Create the Virtual Network at the 2nd Region

Accedere al portale di Azure e creare una rete virtuale con gli attributi elencati nella tabella.Log into the Azure portal and create a Virtual Network with the attributes show in the table. Per i singoli passaggi del processo, vedere Creare una rete virtuale usando il portale di Azure.See Configure a Cloud-Only Virtual Network in the Azure portal for detailed steps of the process.

Nome attributoAttribute Name ValoreValue OsservazioniRemarks
NOMEName vnet-cass-east-usvnet-cass-east-us
RegionRegion Stati Uniti orientaliEast US
Server DNSDNS Servers Ignorare questo attributo perché non si userà un server DNSIgnore this as we are not using a DNS Server
Configura una VPN Point-to-SiteConfigure a point-to-site VPN Ignorare questo attributoIgnore this
Configura una VPN Site-to-SiteConfigure a site-to-site VPN Ignorare questo attributoIgnore this
Spazio di indirizziAddress Space 10.2.0.0/1610.2.0.0/16
IP inizialeStarting IP 10.2.0.010.2.0.0
CIDRCIDR /16 (65531)/16 (65531)

Aggiungere le subnet seguenti:Add the following subnets:

NOMEName IP inizialeStarting IP CIDRCIDR OsservazioniRemarks
Webweb 10.2.1.010.2.1.0 /24 (251)/24 (251) Subnet per la Web farmSubnet for the web farm
datadata 10.2.2.010.2.2.0 /24 (251)/24 (251) Subnet per i nodi del databaseSubnet for the database nodes

Passaggio 2: Creazione delle reti localiStep 2: Create Local Networks

Una rete locale nella rete virtuale di Azure è uno spazio di indirizzi proxy che esegue il mapping a un sito remoto, incluso un cloud privato o un'altra area di Azure.A Local Network in Azure virtual networking is a proxy address space that maps to a remote site including a private cloud or another Azure region. Questo spazio di indirizzi proxy è associato a un gateway remoto per il routing della rete alle destinazioni di rete appropriate.This proxy address space is bound to a remote gateway for routing network to the right networking destinations. Per le istruzioni per stabilire la connessione tra reti virtuali, vedere Configurare una connessione tra reti virtuali .See Configure a VNet to VNet Connection for the instructions on establishing VNET-to-VNET connection.

Creare due reti locali con i dettagli seguenti:Create two local networks per the following details:

Nome reteNetwork Name Indirizzo gateway VPNVPN Gateway Address Spazio di indirizziAddress Space OsservazioniRemarks
hk-lnet-map-to-east-ushk-lnet-map-to-east-us 23.1.1.123.1.1.1 10.2.0.0/1610.2.0.0/16 Durante la creazione della rete locale assegnare un indirizzo gateway segnaposto.While creating the Local Network give a placeholder gateway address. Il vero indirizzo gateway verrà inserito una volta creato il gateway.The real gateway address is filled once the gateway is created. Verificare che lo spazio di indirizzi corrisponda esattamente alla rispettiva rete virtuale remota, in questo caso la rete virtuale creata nell'area Stati Uniti orientali.Make sure the address space exactly matches the respective remote VNET; in this case the VNET created in the East US region.
hk-lnet-map-to-west-ushk-lnet-map-to-west-us 23.2.2.223.2.2.2 10.1.0.0/1610.1.0.0/16 Durante la creazione della rete locale assegnare un indirizzo gateway segnaposto.While creating the Local Network give a placeholder gateway address. Il vero indirizzo gateway verrà inserito una volta creato il gateway.The real gateway address is filled once the gateway is created. Verificare che lo spazio di indirizzi corrisponda esattamente alla rispettiva rete virtuale remota, in questo caso la rete virtuale creata nell'area Stati Uniti occidentali.Make sure the address space exactly matches the respective remote VNET; in this case the VNET created in the West US region.

Passaggio 3: Eseguire il mapping della rete "locale" alle rispettive reti virtualiStep 3: Map “Local” network to the respective VNETs

Nel portale di Azure selezionare ogni rete virtuale, fare clic su "Configura", scegliere "Connetti alla rete locale" e selezionare le reti locali con i dettagli seguenti:From the Azure portal, select each vnet, click “Configure”, check “Connect to the local network”, and select the Local Networks per the following details:

Rete virtualeVirtual Network Rete localeLocal Network
hk-vnet-west-ushk-vnet-west-us hk-lnet-map-to-east-ushk-lnet-map-to-east-us
hk-vnet-east-ushk-vnet-east-us hk-lnet-map-to-west-ushk-lnet-map-to-west-us

Passaggio 4: Creare i gateway nella rete virtuale 1 e nella rete virtuale 2Step 4: Create Gateways on VNET1 and VNET2

Nel dashboard di entrambe le reti virtuali fare clic su CREA GATEWAY per attivare il processo di provisioning dei gateway VPN.From the dashboard of both the virtual networks, click CREATE GATEWAY to trigger the VPN gateway provisioning process. Dopo alcuni minuti nel dashboard di ogni rete virtuale verrà visualizzato l'effettivo indirizzo gateway.After a few minutes the dashboard of each virtual network should display the actual gateway address.

Passaggio 5: Aggiornare le reti "locali" con i rispettivi indirizzi "gateway"Step 5: Update “Local” networks with the respective “Gateway” addresses

Modificare entrambe le reti locali per poter sostituire l'indirizzo IP gateway segnaposto con il vero indirizzo IP dei gateway di cui è appena stato effettuato il provisioning.Edit both the local networks to replace the placeholder gateway IP address with the real IP address of the just provisioned gateways. Usare il mapping seguente:Use the following mapping:

Rete localeLocal Network Gateway di rete virtualeVirtual Network Gateway
hk-lnet-map-to-east-ushk-lnet-map-to-east-us Gateway di hk-vnet-west-usGateway of hk-vnet-west-us
hk-lnet-map-to-west-ushk-lnet-map-to-west-us Gateway di hk-vnet-east-usGateway of hk-vnet-east-us

Passaggio 6: Aggiornare la chiave condivisaStep 6: Update the shared key

Utilizzare lo script di Powershell seguente per aggiornare la chiave IPSec di ciascun gateway VPN [utilizzare la chiave SAKE per entrambi i gateway]: Set-AzureVNetGatewayKey -VNetName hk-vnet-east-us -LocalNetworkSiteName hk-lnet-map-to-west-us -SharedKey D9E76BKK Set-AzureVNetGatewayKey -VNetName hk-vnet-west-us -LocalNetworkSiteName hk-lnet-map-to-east-us -SharedKey D9E76BKKUse the following Powershell script to update the IPSec key of each VPN gateway [use the sake key for both the gateways]: Set-AzureVNetGatewayKey -VNetName hk-vnet-east-us -LocalNetworkSiteName hk-lnet-map-to-west-us -SharedKey D9E76BKK Set-AzureVNetGatewayKey -VNetName hk-vnet-west-us -LocalNetworkSiteName hk-lnet-map-to-east-us -SharedKey D9E76BKK

Passaggio 7: Stabilire la connessione tra reti virtualiStep 7: Establish the VNET-to-VNET connection

Nel portale di Azure usare il menu "DASHBOARD" di entrambe le reti virtuali per stabilire la connessione da gateway a gateway.From the Azure portal, use the “DASHBOARD” menu of both the virtual networks to establish gateway-to-gateway connection. Usare le voci del menu "CONNETTI" nella barra degli strumenti in basso.Use the “CONNECT” menu items in the bottom toolbar. Dopo alcuni minuti nel dashboard apparirà la visualizzazione grafica dei dettagli della connessione.After a few minutes the dashboard should display the connection details graphically.

Passaggio 8: Creare le macchine virtuali nell'area n. 2Step 8: Create the virtual machines in region #2

Creare l'immagine Ubuntu descritta nella distribuzione nell'area n. 1 seguendo gli stessi passaggi o copiare il file VHD dell'immagine nell'account di archiviazione di Azure dell'area n. 2 e creare l'immagine.Create the Ubuntu image as described in region #1 deployment by following the same steps or copy the image VHD file to the Azure storage account located in region #2 and create the image. Usare questa immagine e creare il seguente elenco di macchine virtuali in un nuovo servizio cloud hk-c-svc-east-us:Use this image and create the following list of virtual machines into a new cloud service hk-c-svc-east-us:

Nome computerMachine Name SubnetSubnet Indirizzo IPIP Address Set di disponibilitàAvailability set DC/RackDC/Rack Valore di inizializzazione?Seed?
hk-c1-east-ushk-c1-east-us datadata 10.2.2.410.2.2.4 hk-c-aset-1hk-c-aset-1 dc =EASTUS rack =rack1dc =EASTUS rack =rack1 Yes
hk-c2-east-ushk-c2-east-us datadata 10.2.2.510.2.2.5 hk-c-aset-1hk-c-aset-1 dc =EASTUS rack =rack1dc =EASTUS rack =rack1 No No
hk-c3-east-ushk-c3-east-us datadata 10.2.2.610.2.2.6 hk-c-aset-1hk-c-aset-1 dc =EASTUS rack =rack2dc =EASTUS rack =rack2 Yes
hk-c5-east-ushk-c5-east-us datadata 10.2.2.810.2.2.8 hk-c-aset-2hk-c-aset-2 dc =EASTUS rack =rack3dc =EASTUS rack =rack3 Yes
hk-c6-east-ushk-c6-east-us datadata 10.2.2.910.2.2.9 hk-c-aset-2hk-c-aset-2 dc =EASTUS rack =rack3dc =EASTUS rack =rack3 No No
hk-c7-east-ushk-c7-east-us datadata 10.2.2.1010.2.2.10 hk-c-aset-2hk-c-aset-2 dc =EASTUS rack =rack4dc =EASTUS rack =rack4 Yes
hk-c8-east-ushk-c8-east-us datadata 10.2.2.1110.2.2.11 hk-c-aset-2hk-c-aset-2 dc =EASTUS rack =rack4dc =EASTUS rack =rack4 No No
hk-w1-east-ushk-w1-east-us Webweb 10.2.1.410.2.1.4 hk-w-aset-1hk-w-aset-1 N/DN/A N/DN/A
hk-w2-east-ushk-w2-east-us Webweb 10.2.1.510.2.1.5 hk-w-aset-1hk-w-aset-1 N/DN/A N/DN/A

Seguire le stesse istruzioni dell'area n. 1, ma usare lo spazio di indirizzi 10.2.xxx.xxx.Follow the same instructions as region #1 but use 10.2.xxx.xxx address space.

Passaggio 9: Configurare Cassandra in ogni VMStep 9: Configure Cassandra on each VM

Accedere alla macchina virtuale ed eseguire la procedura seguente:Log into the VM and perform the following:

  1. Modificare $CASS_HOME/conf/cassandra-rackdc.properties per specificare le proprietà del centro dati e del rack nel formato: dc =EASTUS rack =rack1Edit $CASS_HOME/conf/cassandra-rackdc.properties to specify the data center and rack properties in the format: dc =EASTUS rack =rack1
  2. Modificare cassandra.yaml per configurare i nodi dei valori di inizializzazione. Valori di inizializzazione: "10.1.2.4,10.1.2.6,10.1.2.8,10.1.2.10,10.2.2.4,10.2.2.6,10.2.2.8,10.2.2.10"Edit cassandra.yaml to configure seed nodes: Seeds: "10.1.2.4,10.1.2.6,10.1.2.8,10.1.2.10,10.2.2.4,10.2.2.6,10.2.2.8,10.2.2.10"

Passaggio 10: Avviare CassandraStep 10: Start Cassandra

Accedere a ogni macchina virtuale e avviare Cassandra in background eseguendo il comando seguente: $CASS_HOME/bin/cassandraLog into each VM and start Cassandra in the background by running the following command: $CASS_HOME/bin/cassandra

Testare il cluster in più areeTest the Multi-Region Cluster

Per ora Cassandra è stato distribuito in 16 nodi con 8 nodi in ogni area di Azure.By now Cassandra has been deployed to 16 nodes with 8 nodes in each Azure region. Questi nodi sono nello stesso cluster grazie al nome cluster comune e alla configurazione dei nodi dei valori di inizializzazione.These nodes are in the same cluster by virtue of the common cluster name and the seed node configuration. Usare il processo seguente per testare il cluster:Use the following process to test the cluster:

Passaggio 1: Ottenere l'IP del servizio di bilanciamento del carico interno per entrambe le aree con PowerShellStep 1: Get the internal load balancer IP for both the regions using PowerShell

  • Get-AzureInternalLoadbalancer -ServiceName "hk-c-svc-west-us"Get-AzureInternalLoadbalancer -ServiceName "hk-c-svc-west-us"
  • Get-AzureInternalLoadbalancer -ServiceName "hk-c-svc-east-us"Get-AzureInternalLoadbalancer -ServiceName "hk-c-svc-east-us"

    Prendere nota degli indirizzi IP (ad esempio, west - 10.1.2.101, east - 10.2.2.101) visualizzati.Note the IP addresses (for example west - 10.1.2.101, east - 10.2.2.101) displayed.

Passaggio 2: Eseguire quanto segue nell'area occidentale dopo l'accesso a hk-w1-west-usStep 2: Execute the following in the west region after logging into hk-w1-west-us

  1. Eseguire $CASS_HOME/bin/cqlsh 10.1.2.101 9160Execute $CASS_HOME/bin/cqlsh 10.1.2.101 9160
  2. Eseguire i comandi CQL seguenti:Execute the following CQL commands:

    CREATE KEYSPACE customers_ks WITH REPLICATION = { 'class' : 'NetworkToplogyStrategy', 'WESTUS' : 3, 'EASTUS' : 3}; USE customers_ks; CREATE TABLE Customers(customer_id int PRIMARY KEY, firstname text, lastname text); INSERT INTO Customers(customer_id, firstname, lastname) VALUES(1, 'John', 'Doe'); INSERT INTO Customers(customer_id, firstname, lastname) VALUES (2, 'Jane', 'Doe'); SELECT * FROM Customers;CREATE KEYSPACE customers_ks WITH REPLICATION = { 'class' : 'NetworkToplogyStrategy', 'WESTUS' : 3, 'EASTUS' : 3}; USE customers_ks; CREATE TABLE Customers(customer_id int PRIMARY KEY, firstname text, lastname text); INSERT INTO Customers(customer_id, firstname, lastname) VALUES(1, 'John', 'Doe'); INSERT INTO Customers(customer_id, firstname, lastname) VALUES (2, 'Jane', 'Doe'); SELECT * FROM Customers;

I dati visualizzati saranno simili ai seguenti:You should see a display like the one below:

customer_idcustomer_id firstnamefirstname LastnameLastname
11 JohnJohn DoeDoe
22 JaneJane DoeDoe

Passaggio 3: Eseguire quanto segue nell'area orientale dopo l'accesso a hk-w1-east-usStep 3: Execute the following in the east region after logging into hk-w1-east-us:

  1. Eseguire $CASS_HOME/bin/cqlsh 10.2.2.101 9160Execute $CASS_HOME/bin/cqlsh 10.2.2.101 9160
  2. Eseguire i comandi CQL seguenti:Execute the following CQL commands:

    USE customers_ks; CREATE TABLE Customers(customer_id int PRIMARY KEY, firstname text, lastname text); INSERT INTO Customers(customer_id, firstname, lastname) VALUES(1, 'John', 'Doe'); INSERT INTO Customers(customer_id, firstname, lastname) VALUES (2, 'Jane', 'Doe'); SELECT * FROM Customers;USE customers_ks; CREATE TABLE Customers(customer_id int PRIMARY KEY, firstname text, lastname text); INSERT INTO Customers(customer_id, firstname, lastname) VALUES(1, 'John', 'Doe'); INSERT INTO Customers(customer_id, firstname, lastname) VALUES (2, 'Jane', 'Doe'); SELECT * FROM Customers;

I dati visualizzati saranno uguali a quelli dell'area occidentale:You should see the same display as seen for the West region:

customer_idcustomer_id firstnamefirstname LastnameLastname
11 JohnJohn DoeDoe
22 JaneJane DoeDoe

Inserire ancora alcuni dati per vedere che verranno replicati nella parte west-us del cluster.Execute a few more inserts and see that those get replicated to west-us part of the cluster.

Testare il cluster Cassandra da Node.jsTest Cassandra Cluster from Node.js

Con una delle macchine virtuali Linux create nel livello "Web" in precedenza, verrà eseguito un semplice script Node.js per leggere i dati inseriti in precedenzaUsing one of the Linux VMs created in the "web" tier previously, you execute a simple Node.js script to read the previously inserted data

Passaggio 1: Installare Node.js e il client CassandraStep 1: Install Node.js and Cassandra Client

  1. Installare Node.js e NPMInstall Node.js and npm
  2. Installare il pacchetto di nodi "cassandra-client" con NPMInstall node package "cassandra-client" using npm
  3. Eseguire lo script seguente al prompt della shell. Viene visualizzata la stringa json dei dati recuperati:Execute the following script at the shell prompt which displays the json string of the retrieved data:

     var pooledCon = require('cassandra-client').PooledConnection;
     var ksName = "custsupport_ks";
     var cfName = "customers_cf";
     var hostList = ['internal_loadbalancer_ip:9160'];
     var ksConOptions = { hosts: hostList,
                          keyspace: ksName, use_bigints: false };
    
     function createKeyspace(callback){
        var cql = 'CREATE KEYSPACE ' + ksName + ' WITH strategy_class=SimpleStrategy AND strategy_options:replication_factor=1';
        var sysConOptions = { hosts: hostList,  
                              keyspace: 'system', use_bigints: false };
        var con = new pooledCon(sysConOptions);
        con.execute(cql,[],function(err) {
        if (err) {
          console.log("Failed to create Keyspace: " + ksName);
          console.log(err);
        }
        else {
          console.log("Created Keyspace: " + ksName);
          callback(ksConOptions, populateCustomerData);
        }
        });
        con.shutdown();
     }
    
     function createColumnFamily(ksConOptions, callback){
       var params = ['customers_cf','custid','varint','custname',
                     'text','custaddress','text'];
       var cql = 'CREATE COLUMNFAMILY ? (? ? PRIMARY KEY,? ?, ? ?)';
     var con =  new pooledCon(ksConOptions);
       con.execute(cql,params,function(err) {
           if (err) {
              console.log("Failed to create column family: " + params[0]);
              console.log(err);
           }
           else {
              console.log("Created column family: " + params[0]);
              callback();
           }
       });
       con.shutdown();
     }
    
     //populate Data
     function populateCustomerData() {
        var params = ['John','Infinity Dr, TX', 1];
        updateCustomer(ksConOptions,params);
    
        params = ['Tom','Fermat Ln, WA', 2];
        updateCustomer(ksConOptions,params);
     }
    
     //update also inserts the record if none exists
     function updateCustomer(ksConOptions,params)
     {
       var cql = 'UPDATE customers_cf SET custname=?,custaddress=? where custid=?';
       var con = new pooledCon(ksConOptions);
       con.execute(cql,params,function(err) {
           if (err) console.log(err);
           else console.log("Inserted customer : " + params[0]);
       });
       con.shutdown();
     }
    
     //read the two rows inserted above
     function readCustomer(ksConOptions)
     {
       var cql = 'SELECT * FROM customers_cf WHERE custid IN (1,2)';
       var con = new pooledCon(ksConOptions);
       con.execute(cql,[],function(err,rows) {
           if (err)
              console.log(err);
           else
              for (var i=0; i<rows.length; i++)
                 console.log(JSON.stringify(rows[i]));
         });
        con.shutdown();
     }
    
     //exectue the code
     createKeyspace(createColumnFamily);
     readCustomer(ksConOptions)
    

ConclusioniConclusion

Microsoft Azure è una piattaforma flessibile che consente di eseguire software sia Microsoft che open source, come è stato illustrato in questa esercitazione.Microsoft Azure is a flexible platform that allows the running of both Microsoft as well as open source software as demonstrated by this exercise. I cluster Cassandra a disponibilità elevata possono essere distribuiti in un data center singolo distribuendo i nodi dei cluster in più domini di errore.Highly available Cassandra clusters can be deployed on a single data center through the spreading of the cluster nodes across multiple fault domains. I cluster Cassandra possono essere distribuiti anche in più area di Azure geograficamente distanti per sistemi a prova di emergenza.Cassandra clusters can also be deployed across multiple geographically distant Azure regions for disaster proof systems. La combinazione di Azure e Cassandra consente di creare servizi cloud a scalabilità elevata, a disponibilità elevata e ripristinabili in caso di emergenza, necessari per gli odierni servizi su scala Internet.Azure and Cassandra together enables the construction of highly scalable, highly available and disaster recoverable cloud services needed by today's internet scale services.

RiferimentiReferences