예제 #1
0
        /// <summary>
        /// Creates availability group using Smo
        /// </summary>
        /// <param name="agName">Availability group name.</param>
        /// <param name="dbNames">Datbases to be part of the AG.</param>
        /// <param name="replicas">replicas to be part of the AG.</param>
        /// <param name="server">smo server.</param>
        public static AvailabilityGroup CreateAG(string agName, IEnumerable <string> dbNames, IEnumerable <Smo.Server> replicas, Smo.Server server)
        {
            if (!AGHelper.IsAGExist(agName, server))
            {
                AvailabilityGroup ag = new AvailabilityGroup(server, agName);
                foreach (string dbName in dbNames)
                {
                    ag.AvailabilityDatabases.Add(new AvailabilityDatabase(ag, dbName));
                }

                foreach (Smo.Server replica in replicas)
                {
                    AvailabilityReplica ar = new AvailabilityReplica(ag, replica.Name);
                    ar.EndpointUrl      = ARHelper.GetHadrEndpointUrl(replica);
                    ar.AvailabilityMode = AvailabilityReplicaAvailabilityMode.AsynchronousCommit;
                    ar.FailoverMode     = AvailabilityReplicaFailoverMode.Manual;
                    ag.AvailabilityReplicas.Add(ar);
                }
                ag.Create();
                return(ag);
            }
            else
            {
                throw new Exception(string.Format("The requested availability Group {0} already exist in the given server {1}", agName, server.Name));
            }
        }
예제 #2
0
 /// <summary>
 /// Removes a database from an Availability Group.
 /// </summary>
 /// <param name="agName">Availability Group name</param>
 /// <param name="databaseNames">Database names to be removed from AG</param>
 /// <param name="server">smo server</param>
 public static void RemoveDatabasesFromAG(string agName, IEnumerable <string> databaseNames, Smo.Server server)
 {
     foreach (string databaseName in databaseNames)
     {
         AGHelper.RemoveDatabaseFromAG(agName, databaseName, server);
     }
 }
예제 #3
0
        // helper that runs query
        public void ExecuteQuery(int cpuCount, int workloadCount)
        {
            bool hasTraffic = false;

            try
            {
                if (workloadCount == 10)
                {
                    StartPartialTraffic();
                    hasTraffic = true;
                }
                else if (workloadCount == 100)
                {
                    StartFullTraffic();
                    hasTraffic = true;
                }
            }catch (Exception e)
            {
                Console.WriteLine("Exception catched during simulate traffic. Please check your traffic simulator client");
                Console.WriteLine(e);
                return;
            }


            int failoverCount = replicas.FindIndex(t => t.Name == primary.Name);

            // find current primary's index from replica list
            while (failoverCount < 21)
            {
                // pick new primary
                int        primaryIndex = (failoverCount + 1) % replicas.Count;
                Smo.Server newPrimary   = replicas[primaryIndex];

                Console.WriteLine("Checking AG Synced");
                while (!IsAGSynchronized())
                {
                    Thread.Sleep(10);
                }
                DateTime beforeFailover = DateTime.Now;
                string   primaryName    = primary.Name;
                AGHelper.FailoverToServer(newPrimary, agName, AGHelper.ActionType.ManualFailover);
                primary = newPrimary;
                Console.WriteLine("AG: {0} failover to {1}. ", agName, primary.Name);
                while (!IsAGSynchronized())
                {
                    Thread.Sleep(10);
                }
                DateTime afterFailover    = DateTime.Now;
                TimeSpan failoverInterval = afterFailover - beforeFailover;
                Console.WriteLine("Failover takes {0}", failoverInterval.TotalSeconds);
                InsertFailoverReport(beforeFailover, afterFailover, dbCount, cpuCount, workloadCount, primaryName);
                failoverCount += 1;
                Thread.Sleep(new TimeSpan(0, 2, 0));
            }
            Console.WriteLine("Thread Stop");
            if (hasTraffic)
            {
                DrainTraffic();
            }
        }
예제 #4
0
 /// <summary>
 /// Drop the given ag using Smo.
 /// </summary>
 /// <param name="agName">Availability group name.</param>
 /// <param name="server">smo server.</param>
 public static void DropAG(string agName, Smo.Server server)
 {
     if (AGHelper.IsAGExist(agName, server))
     {
         AvailabilityGroup ag = server.AvailabilityGroups[agName];
         ag.Drop();
     }
 }
예제 #5
0
 /// <summary>
 /// Drop availability replica from an availability group.
 /// NoOp, if availability group isn't exist or replica isn't part of the given AG.
 /// </summary>
 /// <param name="arName">Availability replica name</param>
 /// <param name="agName">Availability groups name</param>
 /// <param name="server">SMO server</param>
 public static void DropAR(string arName, string agName, SMO.Server server)
 {
     if (AGHelper.IsAGExist(agName, server) && AGHelper.AGContainsReplicas(agName, new string[] { arName }, server))
     {
         AvailabilityGroup ag = server.AvailabilityGroups[agName];
         ag.AvailabilityReplicas.Remove(arName);
     }
 }
예제 #6
0
 public void CleanUp()
 {
     if (AGHelper.IsAGExist(agName, primary))
     {
         AGHelper.DropAG(agName, primary);
     }
     CleanupDatabases();
     StopBackup();
 }
예제 #7
0
 /// <summary>
 /// Checks whether the give availability groups is enabled or not.
 /// </summary>
 /// <param name="agName">Availability group name.</param>
 /// <param name="server">smo server.</param>
 /// <returns>true if the given ag is enabled, otherwise false.</returns>
 public static bool IsAGEnabled(string agName, Smo.Server server)
 {
     if (!AGHelper.IsAGExist(agName, server))
     {
         AvailabilityGroup ag = server.AvailabilityGroups[agName];
         //TODO: AvailabilityGroup doesn't have method to enable it
         throw new NotImplementedException();
     }
     else
     {
         throw new Exception(string.Format("The requested availability Group {0} is not exist in the given server {1}", agName, server.Name));
     }
 }
예제 #8
0
        // When we called this primary and secondary should being create
        public void TestCreateAGWithTwoReplicasWithoutDatabase()
        {
            Smo.Server        primary = replicas[0];
            AvailabilityGroup ag      = new AvailabilityGroup(primary, agName);

            List <Smo.Server> secondaries = replicas.GetRange(1, replicas.Count - 1);

            for (int i = 0; i < replicas.Count; ++i)
            {
                AvailabilityReplica ar = ARHelper.BuildAR(ag, replicas[i].Name, replicaEndpointUrls[i]);
                ag.AvailabilityReplicas.Add(ar);
            }


            try
            {
                Console.WriteLine("Creating availability group '{0}' on server '{1}",
                                  ag.Name, primary.Name);

                ag.Create();
                Thread.Sleep(1000); //Sleep a tick to let AG create take effect

                foreach (Smo.Server srv in secondaries)
                {
                    srv.JoinAvailabilityGroup(agName);
                }
                CreateAGListener();
                // enable autoseeding in secondary
                //secondary.GrantAvailabilityGroupCreateDatabasePrivilege(agName);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine("Failed to create AG {0}", ag.Name);
                AGHelper.DropAG(ag.Name, primary);
            }
        }
예제 #9
0
 /// <summary>
 /// Drop the given ag using Smo and wait until, the ag is dropped in all servers.
 /// </summary>
 /// <param name="agName">Availability group name.</param>
 /// <param name="targetServer">Server on which the AG needs to be dropped</param>
 /// <param name="otherServer">Check whether the AG is dropped on this server</param>
 public static void DropAGAndWaitForDrop(string agName, Smo.Server targetServer, Smo.Server otherServer)
 {
     AGHelper.DropAG(agName, targetServer);
 }
예제 #10
0
 /// <summary>
 /// Avaiability group is online if property PrimaryReplicaServerName returns valid value.
 /// </summary>
 /// <param name="agName">Availability Group Name</param>
 /// <param name="server">Target server name. This server must be the primary replica, else ths method will always return false.</param>
 /// <returns></returns>
 public static bool IsAgOnline(string agName, Smo.Server server)
 {
     return(!string.IsNullOrEmpty(AGHelper.GetAG(agName, server).PrimaryReplicaServerName));
 }
예제 #11
0
        public void Setup()
        {
            agName = "HadrBenchTest";


            baseDBpath = @"\\zechen-d1\dbshare\";
            dbshare    = @"\\zechen-d1\dbshare\bench\";
            //primaryServerName = @"ze-2016-v1\sql16rtm01";
            //secondaryServerName = @"ze-2016-v2\sql16rtm01";
            // start point of dbCount, lets say 500
            primaryDbsNames = new List <string>();
            primaryDbs      = new List <Database>();

            dbCacheLock = new ReaderWriterLockSlim();

            dbCount = 0;
            // create three replicas

            replicas            = new List <Server>();
            secondaries         = new List <Server>();
            replicaEndpointUrls = new List <string>();
            primaryServerName   = string.Empty;

            Smo.Server srv;
            srv = new Smo.Server(@"ze-bench-01\hadrBenchMark01");
            replicas.Add(srv);
            // primary is important
            primaryServerName = @"ze-bench-01\hadrBenchMark01";
            primary           = srv;
            //report server always point to 01
            reportSrv        = srv;
            reportServerName = primaryServerName;
            reportDBName     = @"FailoverResult";
            string username = "******";
            string password = "******";

            reportConnecionString = string.Format("server={0}; Initial Catalog={1};uid={2}; pwd={3} ", primaryServerName, reportDBName, username, password);


            srv = new Smo.Server(@"ze-bench-02\hadrBenchMark01");
            replicas.Add(srv);
            secondaries.Add(srv);
            srv = new Smo.Server(@"ze-bench-03\hadrBenchMark01");
            replicas.Add(srv);
            secondaries.Add(srv);

            string replicaEndpointUrl = string.Empty;

            foreach (Smo.Server server in replicas)
            {
                replicaEndpointUrl = ARHelper.GetHadrEndpointUrl(server);
                replicaEndpointUrls.Add(replicaEndpointUrl);
            }



            if (!AGHelper.IsAGExist(agName, primary))
            {
                TestCreateAGWithTwoReplicasWithoutDatabase();
            }

            this.notConnectedDBs = new List <string>();


            stopBackup = false;
        }