使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

 一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的集群机制,可以采用基于

sqlserver,mysql的集群方案,当然还可以在第三方插件的基础上实现quartz序列化到热炒的mongodb,redis,震撼力可想而知,接下来本篇就和大家聊

一聊怎么搭建基于sqlserver的quartz集群,实现这么一种双机热备的强大功能。 

一:下载sqlserver版的建表脚本

    首先大家可以通过github上搜索quartz的源代码,在源码项目的/database/tables目录下,可以找到firebird,oracle,mysql,sqlserver等建库脚本,

本篇只需拿取sqlserver版本即可。 https://github.com/quartznet/quartznet/tree/master/database/tables  如下图所示 

 

   

     从上面的截图中可以看到,我接下来要做的事情就是增加一个你需要创建的database名字,这里取为:【quartz】


 

二:配置quartz的集群参数

    当我们写var scheduler = StdSchedulerFactory.GetDefaultScheduler()这段代码的时候,如果大家看过源码的话,会知道这个GetScheduler的

过程中有一个初始化方法【Instantiate】方法,此方法中你会发现在做DBProvider的时候会需要几个参数来初始化DB的,比如下面看到的几个标红属性。

IList<string> dsNames = cfg.GetPropertyGroups(PropertyDataSourcePrefix);

            foreach (string dataSourceName in dsNames)

            {

                string datasourceKey = "{0}.{1}".FormatInvariant(PropertyDataSourcePrefix, dataSourceName);

                NameValueCollection propertyGroup = cfg.GetPropertyGroup(datasourceKey, true);

                PropertiesParser pp = new PropertiesParser(propertyGroup);


                Type cpType = loadHelper.LoadType(pp.GetStringProperty(PropertyDbProviderType, null));


                // custom connectionProvider...

                if (cpType != null)

                {

                    IDbProvider cp;

                    try

                    {

                        cp = ObjectUtils.InstantiateType<IDbProvider>(cpType);

                    }

                    catch (Exception e)

                    {

                        initException = new SchedulerException("ConnectionProvider of type '{0}' could not be instantiated.".FormatInvariant(cpType), e);

                        throw initException;

                    }


                    try

                    {

                        // remove the type name, so it isn't attempted to be set

                        pp.UnderlyingProperties.Remove(PropertyDbProviderType);


                        ObjectUtils.SetObjectProperties(cp, pp.UnderlyingProperties);

                        cp.Initialize();

                    }

                    catch (Exception e)

                    {

                        initException = new SchedulerException("ConnectionProvider type '{0}' props could not be configured.".FormatInvariant(cpType), e);

                        throw initException;

                    }


                    dbMgr = DBConnectionManager.Instance;

                    dbMgr.AddConnectionProvider(dataSourceName, cp);

                }

                else

                {

                    string dsProvider = pp.GetStringProperty(PropertyDataSourceProvider, null);

                    string dsConnectionString = pp.GetStringProperty(PropertyDataSourceConnectionString, null);

                    string dsConnectionStringName = pp.GetStringProperty(PropertyDataSourceConnectionStringName, null);


                    if (dsConnectionString == null && !String.IsNullOrEmpty(dsConnectionStringName))

                    {


                        ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings[dsConnectionStringName];

                        if (connectionStringSettings == null)

                        {

                            initException = new SchedulerException("Named connection string '{0}' not found for DataSource: {1}".FormatInvariant(dsConnectionStringName, dataSourceName));

                            throw initException;

                        }

                        dsConnectionString = connectionStringSettings.ConnectionString;

                    }


                    if (dsProvider == null)

                    {

                        initException = new SchedulerException("Provider not specified for DataSource: {0}".FormatInvariant(dataSourceName));

                        throw initException;

                    }

                    if (dsConnectionString == null)

                    {

                        initException = new SchedulerException("Connection string not specified for DataSource: {0}".FormatInvariant(dataSourceName));

                        throw initException;

                    }

                    try

                    {

                        DbProvider dbp = new DbProvider(dsProvider, dsConnectionString);

                        dbp.Initialize();


                        dbMgr = DBConnectionManager.Instance;

                        dbMgr.AddConnectionProvider(dataSourceName, dbp);

                    }

                    catch (Exception exception)

                    {

                        initException = new SchedulerException("Could not Initialize DataSource: {0}".FormatInvariant(dataSourceName), exception);

                        throw initException;

                    }

                }

            }

 接下来的问题就是这几个属性是如何配置进去的,仔细观察上面代码,你会发现所有的配置的源头都来自于cfg变量,ok,接下来你可以继续翻看代码,相信

你会看到有一个Initialize方法就是做cfg变量的初始化,如下代码所示:

public void Initialize()

        {

            // short-circuit if already initialized

            if (cfg != null)

            {

                return;

            }

            if (initException != null)

            {

                throw initException;

            }


            NameValueCollection props = (NameValueCollection) ConfigurationManager.GetSection(ConfigurationSectionName);


            string requestedFile = QuartzEnvironment.GetEnvironmentVariable(PropertiesFile);


            string propFileName = requestedFile != null && requestedFile.Trim().Length > 0 ? requestedFile : "~/quartz.config";


            // check for specials

            try

            {

                propFileName = FileUtil.ResolveFile(propFileName);

            }

            catch (SecurityException)

            {

                log.WarnFormat("Unable to resolve file path '{0}' due to security exception, probably running under medium trust");

                propFileName = "quartz.config";

            }


            if (props == null && File.Exists(propFileName))

            {

                // file system

                try

                {

                    PropertiesParser pp = PropertiesParser.ReadFromFileResource(propFileName);

                    props = pp.UnderlyingProperties;

                    Log.Info(string.Format("Quartz.NET properties loaded from configuration file '{0}'", propFileName));

                }

                catch (Exception ex)

                {

                    Log.Error("Could not load properties for Quartz from file {0}: {1}".FormatInvariant(propFileName, ex.Message), ex);

                }


            }

            if (props == null)

            {

                // read from assembly

                try

                {

                    PropertiesParser pp = PropertiesParser.ReadFromEmbeddedAssemblyResource("Quartz.quartz.config");

                    props = pp.UnderlyingProperties;

                    Log.Info("Default Quartz.NET properties loaded from embedded resource file");

                }

                catch (Exception ex)

                {

                    Log.Error("Could not load default properties for Quartz from Quartz assembly: {0}".FormatInvariant(ex.Message), ex);

                }

            }

            if (props == null)

            {

                throw new SchedulerConfigException(

                    @"Could not find <quartz> configuration section from your application config or load default configuration from assembly.

Please add configuration to your application config file to correctly initialize Quartz.");

            }

            Initialize(OverrideWithSysProps(props));

        }

     仔细阅读上面的一串代码,你会发现,默认quartz参数配置来源于三个地方。

1. app.config中的section节点。

2. bin目录下的~/quartz.config文件。

3. 默认配置的NameValueCollection字典集合,也就是上一篇博客给大家做的一个演示。   

     我个人不怎么喜欢通过quartz.config文件进行配置,这样也容易写死,所以我还是喜欢使用最简单的NameValueCollection配置,因为它的数据源可来源于第三方存储结构中,配置代码如下:

//1.首先创建一个作业调度池

                var properties = new NameValueCollection();

                //存储类型

                properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";


                //驱动类型

                properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";                //数据源名称

                properties["quartz.jobStore.dataSource"] = "myDS";


                //连接字符串

                properties["quartz.dataSource.myDS.connectionString"] = @"server=.;Initial Catalog=quartz;Integrated Security=True";

                //sqlserver版本

                properties["quartz.dataSource.myDS.provider"] = "SqlServer-20";


                //是否集群

                properties["quartz.jobStore.clustered"] = "true";

                properties["quartz.scheduler.instanceId"] = "AUTO";

 上面的代码配置我都加过详细的注释,大家应该都能看得懂,而且这些配置就是这么定死的,没什么修改的空间,大家记住即可。 

三:Job和Trigger定义

     在集群中环境下,job和trigger的定义该怎么写的?大家也不要想的太复杂,注意一点就可以了,在Schedule一个Job时候,通过CheckExists判断一下这个Job在Scheduler中是否已经存在了,如果存在,你就不能再次通过Schedule去重复调度一个Job就可以了。。。所以判断的代码也很简单,如下所示:

                IScheduler scheduler = factory.GetScheduler();

                scheduler.Start();

                var jobKey = JobKey.Create("myjob", "group");

                if (scheduler.CheckExists(jobKey))

                {

                    Console.WriteLine("当前job已经存在,无需调度:{0}", jobKey.ToString());

                }

                else

                {

                    IJobDetail job = JobBuilder.Create<HelloJob>()

                           .WithDescription("使用quartz进行持久化存储")

                           .StoreDurably()

                           .RequestRecovery()

                           .WithIdentity(jobKey)

                           .UsingJobData("count", 1)

                           .Build();


                    ITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())

                                                              .Build();


                    scheduler.ScheduleJob(job, trigger);

                    Console.WriteLine("调度进行中!!!");

                }

上面这段代码,大家就可以部署在多台机器中了,是不是很简单?

 

四:强大的cluster完整演示

   

     所有的初始化工作都做完了,接下来我们copy一份bin文件,同时打开两个console程序,如下所示,可以看到job任务只会被一个console调度,另外

一个在空等待。

 

       然后你肯定很好奇的跑到sqlserver中去看看,是否已经有job和trigger的db存储,很开心吧,数据都有的。。。

 

       好了,一切都是那么完美,接下来可以展示一下quartz集群下的高可用啦,如果某一个console挂了,那么另一台console会把这个任务给接过来,实

现强大的高可用。。。所以我要做的事情就是把console1关掉,再看看console2是不是可以开始调度job了??? 

完美,这个就是本篇给大家介绍的Quartz的Cluster集群,一台挂,另一台顶住,双机热备,当然这些console你可以部署在多台机器中,要做的就是保持各个server的时间同步,因为quarz是依赖于本机server的时间,好了,本篇就先说到这里吧。

原文地址:http://www.cnblogs.com/huangxincheng/p/6916246.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分类: SQL Server          Windows server2003 + sql server2005 集群配置安装 一:环境 软硬件环境       虚拟3台windows server 2003主机。其中一台做域控DC,另外两台作为节点win1  win2. 域控DC网络设置: Hostname Private网卡 Public网卡   adtest   192.168.9.176     节点主机网络设置 Hostname Private网卡 Public网卡   Win1 10.0.0.173 192.168.9.173   Win2 10.0.0.174 192.168.9.174     二:建域test.com 在域控主机192.168.9.176上安装域 1        设置DC的ip    192.168.9.176
INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739037lWe2.png" \* MERGEFORMATINET 2      在DC中使用DCPROMO命令创建域   (后面的步骤中需要更新windows组件,必须先挂载安装盘)
INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077391708Ti6.jpg" \* MERGEFORMATINET 3   下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739247Oq09.jpg" \* MERGEFORMATINET 
 4  下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739274XN5X.jpg" \* MERGEFORMATINET 5  下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077393012nbo.png" \* MERGEFORMATINET 6 选择新林中的域 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739354rKwn.png" \* MERGEFORMATINET 

7  填入所要创建域的完整的域名
INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739377CMKf.png" \* MERGEFORMATINET 8  下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739509vRI0.png" \* MERGEFORMATINET 9   选择AD数据库和日志文件的存放位置 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739565AxuX.png" \* MERGEFORMATINET 10  存放SYSVOL的存放位置(注意:一定要放在NTFS的分区中) INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739603KBsU.png" \* MERGEFORMATINET 
 11   注意:AD是离不开DNS服务的,因为客户机加入域和登录域都需要把域名解析为IP地址,因为此时DC没有DNS服务器,所以选择第二项让系统在创建DC的同时把DNS服务随之一起安装上.当然你也可以安装DC后自己手动再安装和配置DNS服务器(当时是您给会正确配置DNS服务器),建议和DC一起让系统帮我们创建,因为省事 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739851kpky.png" \* MERGEFORMATINET 12  选择兼容的模式,为了以后可以方便windows2000和2003兼容 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407739883TU02.jpg" \* MERGEFORMATINET 
 13  设置AD的还原密码(为了以后对AD数据库做完备份,开机按F8进入AD还原模式需要的还原密码,如果在此设置了密码,一定切记): INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077399565Eoz.jpg" \* MERGEFORMATINET 14  下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407740932ypMd.jpg" \* MERGEFORMATINET 15  下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407741371FFnB.jpg" \* MERGEFORMATINET 16 需要挂载有关盘,才会自动安装DNS INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407741434D07d.jpg" \* MERGEFORMATINET 17  完成 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077425689rnx.jpg" \* MERGEFORMATINET 18   重启 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742596D44S.jpg" \* MERGEFORMATINET 
 19  安装完重起系统后登录界面为使用域中的管理员和密码登录到域 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077426257kHs.png" \* MERGEFORMATINET 20  进入系统后查看计算机的状态 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742652R7uD.png" \* MERGEFORMATINET 21查看管理工具会增加DNS和有关AD的工具,以及安全策略 
INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742694MvtT.png" \* MERGEFORMATINET 
 22 点开用户和计算机域控管理界面 (创建域test.com完成) INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742729f3b0.png" \* MERGEFORMATINET 三:配置节点win1 和 节点win2的网络,并添加到域中   1 网络配置 win1 网络配置 网卡1:   DNS需要配置DC的IP INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742769IgEN.jpg" \* MERGEFORMATINET 网卡2 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742840A6l3.jpg" \* MERGEFORMATINET “高级”里面配置一下禁用NetBIOS   不勾选前面两项 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407742943Fy03.jpg" \* MERGEFORMATINET Win2网络设置 网卡1: INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743537GJ7l.jpg" \* MERGEFORMATINET 网卡2 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077435693D38.png" \* MERGEFORMATINET Win1  win2 进行相同的操作 2  更改计算机名,以及加入域test.com INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743633bYBe.png" \* MERGEFORMATINET 3    属于域控制账号密码 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743676gbuo.jpg" \* MERGEFORMATINET 4   完成后重启 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743709vOFZ.jpg" \* MERGEFORMATINET 5 域登录 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743759G5G5.png" \* MERGEFORMATINET 
 6    加入域后的计算机属性 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743787p33j.png" \* MERGEFORMATINET Win2  也是一样的步骤加入到域中   6    在域控主机192.168.9.176中可以看到新添加的成员 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743817WsaU.png" \* MERGEFORMATINET 在步骤五中可能会提示报错指定域的名称或安全标识(SID)与该域的信任信息不一致 (因为指定域的名称或安全标识(SID)与该域的信任信息不一致)需要修改 修改方法:   1  .从安装盘中 support\tools\deploy.cab中提取sysprep.exe和setuppcl.exe  到桌面 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743850SDwD.png" \* MERGEFORMATINET 

INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743871Py6C.png" \* MERGEFORMATINET 
INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407743888vP01.png" \* MERGEFORMATINET 2  运行sysprep.exe"确定"开始重新封装 往下就是下一步下一步安装即可  (不能远程操作,封装一次即可,不作详述了) 四:安装win server2003集群 Win1节点上进行操作,关闭其他节点   1  依次单击“开始”、“所有程序”和“管理工具”,然后单击“群集管理器” INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077439293FFp.png" \* MERGEFORMATINET 2 下一步 
INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077440578D3X.png" \* MERGEFORMATINET 3  选择域(test.com),键入群集名win2003cluster。下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744070JRQx.png" \* MERGEFORMATINET         4 机器名输入 win1。下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744154ehw0.png" \* MERGEFORMATINET     5  这一步是检测硬件环境是否符合群集要求。如果这一步出现错误提示,可以点击“查看日志”,按照提示检查网络设置和磁盘阵列连接是否正确 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744230SSkp.gif" \* MERGEFORMATINET   1    通过下一步,输入集群的IP地址,操作系统虚拟服务器的IP 地址 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744249x6HR.gif" \* MERGEFORMATINET   6  输入域用户名和密码,这里使用的是域管理员administrator INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744263857b.gif" \* MERGEFORMATINET 说明:在项目实施时一定不能用域的管理员administrator。应该要求用户网络管理员提供一个专门管理 群集的新用户。这个新用户在各个群集节点中应该在本地管理员组(local administrator group)中。   7 点击“仲裁”按钮,在弹出的窗口中选择仲裁资源。我们选择磁盘Q(QDisk)作为仲裁盘 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744272ks9Q.gif" \* MERGEFORMATINET   8 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744294mA7n.gif" \* MERGEFORMATINET   9 完成 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744319FJ6n.gif" \* MERGEFORMATINET   10  群集 win2003cluster 已经配置成功。但是目前只有win1,我们需要将第二个节点加入,构建出容灾群集。 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744358n8K5.gif" \* MERGEFORMATINET     11  新建节点 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744371gd4L.gif" \* MERGEFORMATINET   12    下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744385peeG.gif" \* MERGEFORMATINET         13  输入“win2” INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744396zcBj.png" \* MERGEFORMATINET   14  下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744468rsZ5.gif" \* MERGEFORMATINET     15 下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744481R038.gif" \* MERGEFORMATINET   16 下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744502HRQ7.gif" \* MERGEFORMATINET       17 下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744520a8xd.gif" \* MERGEFORMATINET Win2上的共享磁盘QDisk 和ClusterData 已经被win1 所独占。这个警告不用理会     18 下一步,完成win2节点添加 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744536ppLl.gif" \* MERGEFORMATINET     19 操作系统容灾群集已经安装完毕。 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744552ya8d.gif" \* MERGEFORMATINET     20  配置群集网络通信 右键选择群集“属性” INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744587KWB4.gif" \* MERGEFORMATINET   21 本地连接2 -à属性   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744602x808.png" \* MERGEFORMATINET     22 专门用于群集节点内部通讯使用的 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077446226FNs.png" \* MERGEFORMATINET     23确保private 在public 上面(private 优先级更高)。确定完成网络设置。 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744651WcyM.jpg" \* MERGEFORMATINET       24  测试操作系统群集 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744660XhOo.gif" \* MERGEFORMATINET     25  点击移动组可以相互切换资源 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744686wgRC.png" \* MERGEFORMATINET         26为了测试群集的可用性,在win1 上右键选择“停止群集服务” INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744699WCOe.png" \* MERGEFORMATINET   27    Win2 接管了资源,成为目前群集的工作节点 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744712kFdi.png" \* MERGEFORMATINET INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744730Lazx.png" \* MERGEFORMATINET   28  重新启动win1 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744745g883.jpg" \* MERGEFORMATINET Windowns  server2003集群完成配置   五  :配置SQL Server 2005 群集 1说明:如果群集环境不需要安装报表服务(SQL Server Reporting Services),可以忽略此步骤。 安装IIS   2    打开组件服务---计算机---我的电脑---属性—安全配置,选择administrator 用户登陆,输入administrator 的密码。 这一步是必须的,否则在安装SQL server 2005 的时候会出现COM+错误。 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077447844cHJ.gif" \* MERGEFORMATINET INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077447977j94.gif" \* MERGEFORMATINET     3   配置MSDTC 到资源组中 进入 CMD 运行 net stop msdtc msdtc –uninstall msdtc –install net start msdtc   此操作之后在群集组直接出现 MSDTC 资源 如果出现msdtc无法正常使用,也可以用此方法重新配置   一般性增加MSDTC资源方法: INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_140774481409IC.png" \* MERGEFORMATINET “资源类型”选择“分布式事务协调器(DTC)” INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077448256dP6.gif" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744854jfNM.gif" \* MERGEFORMATINET 选择仲裁盘和群集名作为其依存资源。完成 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744867nQMJ.gif" \* MERGEFORMATINET 
确定,完成MSDTC 配置。 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744885M46X.gif" \* MERGEFORMATINET   4   注意,在安装SQL server 2005 前, 如果主机是多核心的处理器,请修改boot.ini 文件,把CPU 核心数 改为1 .可以在msconfig 选项中直接选择修改 ,这个是2005 本身的bug,等完成安装后打SP3 或更高的补丁。 补丁打完之后可修改回正常核心数量 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744896HzT9.gif" \* MERGEFORMATINET         5安装SQL Server 2005 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744939QYbK.png" \* MERGEFORMATINET 下一步 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077449503Df3.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744968I81t.png" \* MERGEFORMATINET 下一步(步骤2处理不好,会出现com+错误) INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077449795J34.png" \* MERGEFORMATINET   开始安装必备组件 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407744989AIgW.png" \* MERGEFORMATINET 系统配置检查 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745003rYzQ.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077450180cuh.gif" \* MERGEFORMATINET 输入注册信息 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745031baoA.png" \* MERGEFORMATINET 选择要安装的组件 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745057vz41.png" \* MERGEFORMATINET (所提供光盘只有SQL Server Database Services组件) 输入实例名:MSSQL2005 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745072podT.png" \* MERGEFORMATINET 输入虚拟服务器的名称:SH-sqldbc INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745107ArP0.png" \* MERGEFORMATINET 输入虚拟服务器名称,下一步(区别于集群虚拟服务器IP) INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745121U1uU.gif" \* MERGEFORMATINET 为虚拟服务器指定IP 地址,点击“添加” INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745126XcS5.gif" \* MERGEFORMATINET   为数据文件指定安装路径,请注意这里的S 盘是数据存储盘(ClusterData),千万不要把数据文件安装到仲裁盘(QDisk)上。 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745139mnRW.gif" \* MERGEFORMATINET 可以在集群管理器上分一下组 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745149zX6d.gif" \* MERGEFORMATINET 该用户其实应该是cluster,如果用administrator,会造成不能在远程计算机安装(后面述修改方法,也可以之前在域中建好用户) INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745155lTGS.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745190BL3x.gif" \* MERGEFORMATINET INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077451973Bma.png" \* MERGEFORMATINET     INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745210d8k8.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077452234KZ9.png" \* MERGEFORMATINET 选择混合模式验证 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745234SblE.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745246Aqpq.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745262pPPB.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745273LV55.png" \* MERGEFORMATINET 开始安装 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745288YFsc.png" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745350t0Wp.png" \* MERGEFORMATINET 安装程序。 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745365spAH.png" \* MERGEFORMATINET   完成后在另一个节点安装。   六:解决远程不能安装问题,创建swg域用户,委托管理 1 打开域控制管理 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_14077453825h6y.png" \* MERGEFORMATINET 2     新建用户 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745628BIXb.png" \* MERGEFORMATINET   3     添加到组 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745724heZa.png" \* MERGEFORMATINET     4     添加到administrator组中 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745737U5xo.png" \* MERGEFORMATINET   5     查看属性 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745745VMv1.jpg" \* MERGEFORMATINET   6     win1 win2 节点上加用户权限 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745754s7Nj.jpg" \* MERGEFORMATINET     7 添加到swg组 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745762t1Z5.jpg" \* MERGEFORMATINET   8 最后全部用swg用户等test.com域上的主机win1,win2 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745778Klvg.jpg" \* MERGEFORMATINET           七:安装完成后测试 1 win1上查看增加的资源 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745798o54e.jpg" \* MERGEFORMATINET       2  停止其中win1节点,服务自动转移 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745807BB77.jpg" \* MERGEFORMATINET   INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745813HCSC.jpg" \* MERGEFORMATINET 八:访问数据库,导入数据 1  右键“数据库” “加”
INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745821o56o.jpg" \* MERGEFORMATINET   2 导入整个数据库 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745830HtaT.jpg" \* MERGEFORMATINET   3 导入完成后,显示数据 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745846B7dG.jpg" \* MERGEFORMATINET   4 做故障转移时,数据库可以正常被访问 INCLUDEPICTURE \d "http://blog.itpub.net/attachment/201408/11/29500582_1407745935DEw2.jpg" \* MERGEFORMATINET  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值