Πώς κάνουμε εγκατάσταση ένα SQL Server Always On Availability Group για High Availability
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
Η Microsoft μας παρέχει τη δυνατότητα να κάνουμε Replicate τις βάσεις δεδομένων μας σαν ένα Group σε έως οκτώ Secondary Nodes(servers) ως μία λύση για High Availability, Disaster Recovery ή και για ανάγνωση χωρίς να απασχολείται το Primary Node. Η τεχνολογία αυτή ονομάζεται Always On Availability Group. O συγχρονισμός γίνεται είτε συγχρόνα για High-Availability είτε ασύχρονα για Disaster Recovery. Ανάλογα την έκδοση που έχουμε έχουμε διαφορετικές δυνατότητες.
Σε αυτό το άρθρο θα δούμε βήμα βήμα πώς κάνουμε μία εγκατάσταση Always On Availability Group και πως μπορούμε να το κάνουμε monitor.
Αναλυτικά το τι είναι ένα Always On Availability Group και τι δυνατότητες μας παρέχει μπορούμε να το διαβάσουμε άρθρο εδώ.
Προαπαιτούμενα
Πριν ξεκινήσουμε θα πρέπει να έχουμε κάνει τις παρακάτω ενέργειες:
- Τα Node μας να έχουν κάνει join σε Active Directory Domain.
- Να έχει γίνει εγκατάσταση του SQL Server και στα δύο Nodes με τον χρήστη που “σηκώνει” το Service του να είναι είτε Active Directory User είτε Managed Service Account και να είναι κοινός και στα δύο. Το πώς κάνουμε σωστά μία εγκατάσταση μπορούμε να το δούμε στο άρθρο εδώ.
- Να έχουν επικοινωνία μεταξύ τους και ότι δεν μας κόβει κάποιο Firewall των Windows ή δικτυακό.
Η εγκατάσταση
Δημιουργία του Failover Cluster
Για αρχή πάμε στον Server Manager των Windows Server και στα δύο Nodes και επιλέγουμε Add roles and features:
Στη συνέχεια πάμε στην καρτέλα Features και επιλέγουμε το Failover Clustering:
Αφού γίνει η εγκατάσταση και η επανεκκίνηση και στα δύο Nodes πάμε πάλι στον Server Manager σε ένα από αυτά και επιλέγουμε Tools, Failover Cluster Manager:
Όταν μας ανοίξει τον Failover Cluster Manager επιλέγουμε Validate Configuration:
Στη συνέχεια προσθέτουμε το όνομα του κάθε Node που θέλουμε να ανήκει στο Cluster:
Έπειτα επιλέγουμε να κάνει Validate με όλα τα test:
Ενδέχεται να μας εμφανίσει warning καθώς στο παράδειγμα κάνουμε χρήση μόνο ενός δικτύου. Αφού δούμε στο report ότι δεν έχουμε κάποιο άλλο σημαντικό πρόβλημα επιλέγουμε Create the cluster now using the validated nodes… και Finish:
Μετά από λίγο θα μας ανοίξει τον Create Cluster Wizard εκεί θα ορίσουμε ένα όνομα στο Cluster μας και την IP του Cluster που θα πρέπει να ανήκει στο ίδιο subnet:
Δημιουργία του Cluster Quorum
Αφού δημιουργηθεί το Cluster θα πρέπει να ορίσουμε έναν Witness στο Quorum που αυτό μπορεί να είναι είτε ένα file share, είτε ένας shared δίσκος είτε ένα Azure Storage Account.
Η δουλειά του Witness είναι να επικοινωνεί και με τα δύο sites και σε περίπτωση που κάποιο παρουσιάζει βλάβη ή χαθεί η επικοινωνία μεταξύ τους, να ψηφίζει για την υγεία του Cluster ώστε να συνεχίσει να είναι up and running.
Οπότε λοιπόν πάμε πάλι στον Failover Cluster Manager, επιλέγουμε More Actions και Configure Cluster Quorum Settings…:
Στο παράδειγμα θα κάνουμε χρήση file share witness:
Θα χρειαστούμε έναν κοινόχρηστο φάκελο που να είναι προσβάσιμος από το Cluster και όλα τα Nodes του.
Για το παράδειγμα επέλεξα να φτιάξω έναν φάκελο στον server που φιλοξενεί τον Active Directory Controller.
Επιλέγουμε δεξί κλικ στον φάκελο, Advanced Sharing…, Permissions, Add, Object Types (Computers), Location (το domain), ψάχνουμε τα Nodes και τα προσθέτουμε με Allow Full Control:
Το ίδιο κάνουμε και στην καρτέλα security και προσθέτουμε το όνομα του Cluster:
Στη συνέχεια στο wizard του Cluster Quorum ορίζουμε το path με το file share και επιλέγουμε Next μέχρι να ολοκληρωθεί η δημιουργία του:
Αφού ολοκληρωθεί η δημιουργία του Witness γυρνάμε στον Failover Cluster Manager να βεβαιωθούμε ότι δεν μας έχει εμφανίσει κάποιο πρόβλημα:
Δημιουργία του Always On Availability Group
Πάμε στον SQL Server Configuration Manager και στα δύο Nodes και επιλέγουμε SQL Server Services, δεξί κλικ στο service του SQL Server και Properties. Εκεί θα πρέπει στην καρτέλα Always On Availability Group να επιλέξουμε το Enable Always On Availability Groups. Σε περίπτωση που δεν έχουμε αλλάξει ακόμα τον χρήστη που σηκώνει το service από το default των Windows σε χρήστη ή managed service του Active Directory θα πρέπει να το κάνουμε τώρα στην καρτέλα Log On (στο παράδειγμα έχω ορίσει managed service με όνομα DATAPLATFORM\sqlservice σε όλα τα nodes καθώς πρέπει να είναι κοινό):
Έπειτα πάλι στο SQL Server Configuration Manager επιλέγουμε SQL Server Network Configuration, Protocols for MSSQLSERVER, δεξί κλικ στο TCP/IP και Enabled Yes:
Για την δημιουργία του Availability Group τώρα συνδεόμαστε με SQL Server Management Studio από το Primary Node (προαιρετικά), πατάμε δεξί κλικ Στο Always On High Availability , Availability Groups και New Availability Group Wizard…:
Στον wizard που θα μας εμφανιστεί ορίζουμε το όνομα του Availability Group και επιλέγουμε το Database Level Health Detection (το Cluster type πρέπει να είναι το Windows Server Failover Cluster):
Διαλέγουμε τις βάσεις που θέλουμε να κάνουμε Replicate, αν έχουμε Enterprise Edition μπορούμε να επιλέξουμε πάνω από μία στο ίδιο group:
Έπειτα στην καρτέλα Replicas προσθέτουμε και το δεύτερο Node με την επιλογή Add Replica… .Σε αυτή την καρτέλα μπορούμε να επιλέξουμε αν θα κάνει automatic failover, αν θα είναι το replication σύγχρονο ή ασύχρονο και αν το Secondary θα μπορεί είναι προσβάσιμο για ανάγνωση (ανάλογα με την έκδοση):
Στην καρτέλα Backup Preferences (ανάλογα με την έκδοση) μπορούμε να ορίσουμε αν θέλουμε να παίρνει η βάση μας τα backup στην Secondary αντί για Primary και με τι προτεραιότητα:
Στην καρτέλα Listener δημιουργούμε τον listener με τον οποίο μπορούμε να συνδεόμαστε με ένα κοινό DNS ή IP στο οποιοδήποτε Node αναλόγος ποιο είναι Primary (active) αυτή την στιγμή ή αν θέλουμε Read-Only access. Επιλέγουμε το όνομα, πόρτα, ως Network Mode Static IP και κάνουμε Add… μια συγκεκριμένη IP που ανήκει στο subnet:
Στην καρτέλα Read-Only Routing σε περίπτωση που θέλουμε να έχουμε Read-Only access σε Secondary ορίζουμε τα URL που θα είναι προσβάσιμα και ως Read-Only Routing List την σειρά που θα μας δρομολογήσει για να Read-Only intent ανάλογα με το Instance που έχουμε συνδεθεί:
Στην επόμενη καρτέλα ορίζουμε τον τρόπο που θα μεταφερθεί η βάση στην Secondary. Έχουμε την επιλογή για Automatic Seeding αν τα paths είναι ίδια χωρίς να χρειάζεται να κάνουμε τίποτε άλλο, την επιλογή Full που θα ορίσουμε file share paths σε οποία θα τοποθετηθούν τα backup και την επιλογή Join only που είναι για τις περιπτώσεις που έχουμε κάνει μεταφορά και restore την βάση μόνοι μας δίχως όμως να την έχουμε κάνει recovery(δηλαδή να μην είναι ακόμα προσβάσιμη):
Αν πάνε όλα καλά θα έχουμε σε όλα τα Results Success:
Τώρα αν πάμε στο SQL Server Management Studio και κάνουμε διπλό κλικ στο Always On High Availability, διπλό κλικ στο Availability Groups, δεξί κλικ στο όνομα του Availability Group Show Dashboard θα δούμε ότι έχει φτιαχτεί το Availability Group και είναι healthy:
Τις πληροφορίες αυτές μπορούμε να τις δούμε και με T-SQL με το παρακάτω query:
SELECT ag.name AS [AG_Name], ar.replica_server_name AS [ReplicaServerName], ar.availability_mode_desc AS [AvailabilityMode], adc.[database_name], hars.role_desc as [Role], drs.synchronization_state_desc as [SynchronizationState], drs.is_commit_participant as [IsCommit], drs.synchronization_health_desc as [SyncHealth],drs.database_state_desc as [DatabaseState], drs.last_commit_time as [Last Commit Update Time] FROM sys.dm_hadr_database_replica_states AS drs WITH (NOLOCK) INNER JOIN sys.availability_databases_cluster AS adc WITH (NOLOCK) ON drs.group_id = adc.group_id AND drs.group_database_id = adc.group_database_id INNER JOIN sys.availability_groups AS ag WITH (NOLOCK) ON ag.group_id = drs.group_id INNER JOIN sys.availability_replicas AS ar WITH (NOLOCK) ON drs.group_id = ar.group_id AND drs.replica_id = ar.replica_id INNER JOIN sys.dm_hadr_availability_replica_states hars ON drs.replica_id = hars.replica_id where 1=1 ORDER BY ag.name, ar.replica_server_name, adc.[database_name] OPTION (RECOMPILE);
Τι γίνεται σε περίπτωση που πέσει το Primary Node αν έχουμε επιλέξει Automatic Failover;
Αν για κάποιο λόγο πέσει το Primary node θα δούμε στο Dashboard ότι έχει γίνει Primary το Secondary node και η βάση στο πρωήν Primary είναι σε Not Synchronizing State:
Αν επαναφέρουμε το Node μετά από λίγο θα δούμε ότι το Availability group είναι Healthy, το δεύτερο Node παραμένει ως Primary αλλά η βάση στο πρώτο Node έχει επανέλθει ως Synchronized.
Σε περίπτωση που θέλουμε να γυρίσουμε το πρώτο Node ως Primary επιλέγουμε το Start Failover Wizard (ποτέ δεν κάνουμε failover μέσα από τον Failover Cluster Manager των Windows Server) :
Πώς συνδεόμαστε με τον Listener σε Secondary μόνο για ανάγνωση
Για να συνδεθούμε με τον Listener μέσω SQL Server Management Studio απλά βάζουμε στο Server name το DNS ή την IP του. Για να δηλώσουμε ότι θέλουμε όμως να συνδεθούμε για Read-Only θα πρέπει να επιλέξουμε την επιλογή Options:
Και στην καρτέλα Additional Connection Parameters να δηλώσουμε ApplicationIntent=ReadOnly. Έτσι τα select queries που θα εκτελούμε σε αυτό το session θα εκτελούνται κατά προτεραιότητα σε Secondary:
Πώς δημιουργούμε καινούργια logins
Δεν πρέπει να ξεχνάμε ότι καινούργια logins και jobs δεν μεταφέρονται στο Secondary αυτόματα, οπότε θα πρέπει είτε να έχουμε κάποιο SSIS package σε Job που θα τα δημιουργεί είτε να τα δημιουργούμε εμείς με το χέρι.
Για να μεταφερθεί σωστά ένα login αφού το έχουμε φτιάξει στο Primary, τρέχουμε το παρακάτω query στο Primary βάζοντας στο where το όνομα του login που φτιάξαμε ώστε να μας δημιουργήσει το DDL script:
SELECT N'CREATE LOGIN ['+sp.[name]+'] WITH PASSWORD=0x'+ CONVERT(nvarchar(max), l.password_hash, 2)+N' HASHED, '+ N'SID=0x'+CONVERT(nvarchar(max), sp.[sid], 2)+N';', N'ALTER LOGIN ['+sp.[name]+'] WITH PASSWORD=0x'+CONVERT(nvarchar(max), l.password_hash, 2)+N' HASHED UNLOCK ,CHECK_POLICY=OFF;' FROM master.sys.server_principals AS sp INNER JOIN master.sys.sql_logins AS l ON sp.[sid]=l.[sid] WHERE sp.name = 'test'; -- Το αλλάζουμε ανάλογα με το όνομα του χρήστη που θέλουμε να μεταφέρουμε
Αφού το τρέξουμε επιλέγουμε την στήλη με το αποτέλεσμα και τρέχουμε το DDL στο Secondary για να δημιουργηθεί και εκεί σωστά το login:
Bonus Script (Για Backup / Index Maintenance / Database Integrity Check SQL Server Agent Jobs)
Με το παρακάτω script που έχω φτιάξει, με μόνο ένα κλικ, κάνει εγκατάσταση το MaintenanceSolution του Ola Hallengren μαζί με έτοιμα παραμετροποιημένα jobs για Backup ,Database Integrity και Index Optimize με τις βέλτιστες παραμέτρους και χρονοδιάγραμμα.
Τα Backup jobs δημιουργούνται disabled καθώς μπορεί να έχουμε άλλη λύση για backup με 3rd party tool. Επίσης κάνει έλεγχο για Availability Group ώστε να τρέχουν μόνο αν είναι η Preffered Backup Replica (για backup / database integrity) και αν είναι Primary Replica (για Index Optimize).
Το μόνο που χρειάζεται να κάνουμε, είναι να εκτελέσουμε το παρακάτω script στο κάθε SQL Server Instance: