SqlServerProxy的一部分资料澳门美高梅手机网站

SqlServerProxy的部分资料

下载地址:http://files.cnblogs.com/files/lyhabc/SqlServerProxy.rar

一 、天性及贯彻原理

SqlServerProxy 性子介绍:

#——-#————————————————————————————–#
|性情 |不需求版本升级就同盟SQL Server 两千 到 SQL Server
二〇一五的有着版本。 |
|——-|————————————————————————————–|
|特性2 |开箱即用:只需简单布置一下就能初始应用。 |
|——-|————————————————————————————–|
|天性3 |内置命令能查看历史、实时、单个客户端的通讯量、请求数、事务数等。
|
|——-|————————————————————————————–|
|个性4
|开放请求分发处理接口,可依据业务须求本人定制,私下认可提供1个根据正则表达式匹配的贯彻。
|
#——-#————————————————————————————–#

 

SqlServerProxy 完结原理

Proxy能分析SQLServer通讯采纳的TDS协议内容,因此能再一次封装分发客户端的伸手。可是,不担负数据同步,供给利用复制等技巧来数量同步。没有分布式事务,只在通讯层工作,不会往数据库中充分任马瑜遥西,还开放实践请求内容记录接口,方便对实践内容展开审计。

 

SqlServerProxy的其他表明:

不扶助客户端连接时的加密选项为True,正是连接字符串中“Encrypt=True”,必须为False。

暂不帮衬采取TDS 4.2商议的客户端连接,TDS
4.2看作早期与Sybase包容的通讯协议,已很少使用。

选取MALX570S(多平移结果集)能健康连接到proxy,也能计算通讯量消息,但暂不帮助请求分发,以后会兑现。

将呼吁分发到从服务器时,使用的上下文数据库是请求会话在主服务器上的上下文数据库名,如需不一致名目,需求定制”ISlaveProvider”接口,详见“实践手册”。


风行版下载地址

http://www.projky.com/downloads/3a382709-d680-476c-853d-dc3af5c625de/SqlServerProxy.zip

新颖版对.NET Framework版本须求降到了.NET 4,未来援助Windows XP和Windows
Server 2000了,详见《安装及3分钟赶快体验.txt》。


正则测试器

澳门美高梅手机网站 1

澳门美高梅手机网站 2


② 、配置手册

① 、“dbServers.xml”
配置SqlServerProxy监听的端口、主服务器从服务器的连天地址消息。

<?xml version="1.0" encoding="utf-8" ?>
<!--定义主数据库和从服务器等信息。-->
<akuma>
  <!-- 代理服务监听的端口信息,可以配置监听多个端口。 -->
  <proxys>
    <proxy>
        <!-- 可为IPV6 或 IPV4 的地址。 -->
        <property name="ipAddress">0.0.0.0</property>
          <property name="port">8999</property>
          <property name="backlog">1024</property>
      </proxy>
    <proxy>
        <property name="ipAddress">::</property>
          <property name="port">7999</property>
          <property name="backlog">1024</property>
      </proxy>
   </proxys>
  <!-- 主服务器的连接信息。 -->
  <master>
      <property name="ipAddress">127.0.0.1</property>
          <property name="port">1433</property>
          <property name="backlog">256</property>
    <!-- 权重,分0到10级。0级将那些能分发的请求都发送到从服务器。 -->
      <property name="weight">5</property>
  </master>
  <!-- 从服务器的连接信息。 -->
    <slaves>
        <slave>
            <property name="ipAddress">127.0.0.1</property>
              <property name="port">1433</property>
              <property name="backlog">256</property>
              <!-- 必须提供正确的登陆user 和 password, 就采用该帐号和密码登录从服务器及心跳检测。-->
              <property name="user">sa</property>
              <property name="password">admin</property>
              <!-- 权重,分0到10级。0级不会分发请求到从服务器。 -->
              <property name="weight">5</property>
        </slave>
    </slaves>
  <heartbeat>
    <!-- 心跳SQL语句,检测从服务器是否在线。如果主服务器宕了之后,整个proxy服务不可用。 -->
    <!-- 默认单位为秒,如果你以毫秒为单位,那么需要在后面跟ms单位,如1500ms即代表1.5s。 -->
    <!-- 心跳SQL执行的间隔。 -->
    <property name="keepalive">2</property>
    <!-- 超过以下时间服务器仍然没响应,就认为宕机了。 -->
    <property name="deadtime">30</property>
    <property name="heartSQL">SELECT HOST_NAME();</property>
  </heartbeat>
</akuma>

 

<akuma>\<proxys>下铺排服务监听的端口,能够是IPV4或然IPV6的地址,还可含蓄多少个监听地址。测试时,将测试程序的连天字符串修改为监听地址及端口就ok了。
<akuma>\<master>配置主服务器的IP地址及端口。该地点可为IPV4或IPV6地址,只可以分包一个因素。权重必须位于0~10之间(包括0和10)。
<akuma>\<slaves>下安顿从服务器的IP地址及端口。可含蓄自由个<slave>成分。
<akuma>\<heartbeat>从劳动器心跳检查和测试,心跳检查和测试执行时采纳的AppName为“SqlServerProxy
Heartbeat”。

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Akuma.Contract</name>
    </assembly>
    <members>
        <member name="T:Akuma.Contract.Heartbeat.HeartbeatInterval">
            <summary>配置的心跳间隔参数。</summary>
        </member>
        <member name="P:Akuma.Contract.Heartbeat.HeartbeatInterval.KeepAlive">
            <summary>心跳SQL执行的间隔,单位毫秒。</summary>
        </member>
        <member name="P:Akuma.Contract.Heartbeat.HeartbeatInterval.DeadTime">
            <summary>超过以下时间服务器仍然没响应,就认为宕机了,单位毫秒。</summary>
        </member>
        <member name="P:Akuma.Contract.Heartbeat.HeartbeatInterval.HeartSql">
            <summary>执行的心跳语句。</summary>
        </member>
        <member name="T:Akuma.Contract.Heartbeat.IHeartbeat">
            <summary>心跳检测。</summary>
        </member>
        <member name="P:Akuma.Contract.Heartbeat.MonitorEntry.Conn">
            <summary>心跳连接字符串</summary>
        </member>
        <member name="P:Akuma.Contract.Heartbeat.MonitorEntry.SlaveId">
            <summary>心跳监视的服务器Id</summary>
        </member>
        <member name="P:Akuma.Contract.Heartbeat.MonitorEntry.Interval">
            <summary>心跳监视的间隔、下线时间、心跳Sql。</summary>
        </member>
        <member name="T:Akuma.Contract.Heartbeat.OnlineChangedEventArgs">
            <summary>标记监控项在线情况变化事件参数。</summary>
        </member>
        <member name="T:Akuma.Contract.Log.DefaultLogs">
            <summary>
              一个强类型的资源类,用于查找本地化的字符串等。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ResourceManager">
            <summary>
              返回此类使用的缓存的 ResourceManager 实例。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.Culture">
            <summary>
              使用此强类型资源类,为所有资源查找
              重写当前线程的 CurrentUICulture 属性。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.AcceptClientConnect">
            <summary>
              查找类似 {0} 连接到Proxy {1}。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientCorrectTerminated">
            <summary>
              查找类似 客户端 {0} 连接正常断开。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientProxyLoginSlaveSuccess">
            <summary>
              查找类似 客户端 {0} Proxy登陆到从服务器 {1} 成功。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientProxyMasterCorrectTerminated">
            <summary>
              查找类似 客户端 {0} Proxy所使用主服务器 {1} 连接正常断开。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientProxyMasterUnexpectedTerminated">
            <summary>
              查找类似 客户端 {0} Proxy所使用主服务器 {1} 连接意外中断。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientProxySlaveCorrectTerminated">
            <summary>
              查找类似 客户端 {0} Proxy所使用从服务器 {1} 连接正常断开。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientProxySlaveUnexpectedTerminated">
            <summary>
              查找类似 客户端 {0} Proxy所使用从服务器 {1} 连接意外中断。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientProxyTryConnectMasterFail">
            <summary>
              查找类似 客户端 {0} Proxy尝试连接到主服务器 {1} 失败。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientProxyTryLoginSlaveFail">
            <summary>
              查找类似 客户端 {0} Proxy尝试登陆到从服务器 {1} 失败。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ClientUnexpectedTerminated">
            <summary>
              查找类似 客户端 {0} 连接意外中断。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.DbServersConfigFileNotExist">
            <summary>
              查找类似 在运行目录下没有发现配置文件“dbServers.xml”。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.InternalCommand">
            <summary>
              查找类似 内置命令 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.MasterUseSlave">
            <summary>
              查找类似 主服务器会话 {0} 使用从服务器会话 {1}。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.NotSupportClientEncryption">
            <summary>
              查找类似 客户端 {0} 连接字符串启用了加密,必须关闭数据库连接的加密选项才能正常使用。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.NotSupportClientTdsVersion">
            <summary>
              查找类似 客户端 {0} 使用通信协议Tds4.2暂不支持,详情咨询开发商。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.ProxyAppOutOfRestricitDate">
            <summary>
              查找类似 SQLServer Proxy已过期,不能继续使用。详情咨询projky@126.com或1781575586@qq.com。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.RpcBatchLogFormat">
            <summary>
              查找类似 {0} 客户端 [{1}] {2} 事务 {3} 在 {4} 执行RPC [{5}] 个。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.RpcLogFormat">
            <summary>
              查找类似   RPC {0} 名称 {1} 参数 {2} 个。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.RpcParameterFormat">
            <summary>
              查找类似     参数 {0} 名称 {1}  类型 {2} 值 [{3}]。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.RulePatternCannotBeEmpty">
            <summary>
              查找类似 &quot;{0}&quot; 规则表达式字符串不能为空。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.SqlBatchLogFormat">
            <summary>
              查找类似 {0} 客户端 [{1}] {2} 事务 {3} 在 {4} 执行SQL [{5}]。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.DefaultLogs.StartListenEndPoint">
            <summary>
              查找类似 开始监听 {0}。 的本地化字符串。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Log.ExecuteEndPoint.ClientRemoteEndPoint">
            <summary>客户端连接到Proxy时使用的端点信息。</summary>
        </member>
        <member name="P:Akuma.Contract.Log.ExecuteEndPoint.ExecRemoteEndPoint">
            <summary>客户端请求被执行的主服务器或从服务器端点信息。</summary>
        </member>
        <member name="P:Akuma.Contract.Log.ExecuteEndPoint.ClientAppName">
            <summary>客户端请求被执行时使用的程序名称。</summary>
        </member>
        <member name="T:Akuma.Contract.Log.IBatchLog">
            <summary>客户端完整请求执行的SQL和RPC记录。</summary>
        </member>
        <member name="T:Akuma.Contract.Log.IRunLog">
            <summary>程序运行日志。</summary>
        </member>
        <member name="T:Akuma.Contract.Log.ISessionLog">
            <summary>通信时字节日志记录。</summary>
        </member>
        <member name="T:Akuma.Contract.Policy.ApplayOption">
            <summary>请求在从服务器上执行时的一些选项。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.ApplayOption.UseMasterSessionOption">
            <summary>
            默认为False。
            True,在从服务器执行查询前,将主服务器的@@OPTIONS选项同步到从服务器;False,不同步。
            仅同步ANSI_WARNINGS、ANSI_PADDING、ANSI_NULLS、ARITHABORT、ARITHIGNORE、QUOTED_IDENTIFIER 这几个选项。
            当UseMasterSessionOption为True,且CustomOptions != SessionOptions.None时,会导致冲突,优先采用CustomOptions提供的选项。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Policy.ApplayOption.CustomOptions">
            <summary>
            默认为SessionOptions.None。
            在从服务器执行查询前,将自定义的@@OPTIONS选项应用到从服务器。
            当UseMasterSessionOption为True,且CustomOptions != SessionOptions.None时,会导致冲突,优先采用CustomOptions提供的选项。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Policy.ApplayOption.UseMaserSessionDbName">
            <summary>
            默认为True。
            True,在从服务器执行查询前,将主服务器的数据库上下文名称同步到从服务器;False,不同步。
            当UseMaserSessionDbName为True,且CustomDbName != null时,会导致冲突,优先采用CustomDbName提供的数据库名称。
            UseMaserSessionDbName与CustomDbName必须至少一个有效。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Policy.ApplayOption.CustomDbName">
            <summary>
            默认null。
            在从服务器执行查询前,将从服务器数据库上下文切换到自定义的数据库名称。
            当UseMaserSessionDbName为True,且CustomDbName != null时,会导致冲突,优先采用CustomDbName提供的数据库名称。
            UseMaserSessionDbName与CustomDbName必须至少一个有效。
            </summary>
        </member>
        <member name="T:Akuma.Contract.Policy.ApplayResult">
            <summary>
            请求分发的结果。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Policy.ApplayResult.SlaveId">
            <summary>从服务器标识Id。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.ApplayResult.Option">
            <summary>在从服务器执行时的选项。</summary>
        </member>
        <member name="T:Akuma.Contract.Policy.ISlaveProvider">
            <summary>每一个客户端连接必须使用不同的ISlaveProvider对象。否则,会造成负载不均衡。</summary>
        </member>
        <member name="M:Akuma.Contract.Policy.ISlaveProvider.ApplyRpc(Akuma.Contract.Policy.RequestRpcCollection,Akuma.Contract.Policy.SessionInfo,Akuma.Contract.Policy.SlaveInfo[])">
            <summary>
            请求一个Rpc批处理。
            </summary>
            <param name="rpcColl">Rpc批处理。</param>
            <param name="sessionInfo">客户端会话的信息。</param>
            <param name="slaves">从服务器列表。</param>
            <returns>null,将请求分发到主服务器;非null值,根据从服务器Id将请求分发到对应从服务器。</returns>
        </member>
        <member name="M:Akuma.Contract.Policy.ISlaveProvider.ApplySql(Akuma.Contract.Policy.RequestSql,Akuma.Contract.Policy.SessionInfo,Akuma.Contract.Policy.SlaveInfo[])">
            <summary>
            请求一个Sql批处理。
            </summary>
            <param name="requestSql">Sql语句。</param>
            <param name="sessionInfo">客户端会话的信息。</param>
            <param name="slaves">从服务器列表。</param>
            <returns>null,将请求分发到主服务器;非null值,根据从服务器Id将请求分发到对应从服务器。</returns>
        </member>
        <member name="T:Akuma.Contract.Policy.RequestRpcCollection">
            <summary>
            Rpc批处理请求对象。Rpc请求一般只包含一个rpc,但特别情况下会包含多个rpc。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Policy.RequestRpcCollection.UseTransaction">
            <summary>
            当前Rpc批处理请求是否在事务中。
            </summary>
        </member>
        <member name="T:Akuma.Contract.Policy.RequestSql">
            <summary>
            Sql请求处理对象。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Policy.RequestSql.Text">
            <summary>
            请求执行的Sql语句。
            </summary>
        </member>
        <member name="P:Akuma.Contract.Policy.RequestSql.UseTransaction">
            <summary>
            当前sql请求是否在事务中。
            </summary>
        </member>
        <member name="T:Akuma.Contract.Policy.SessionInfo">
            <summary>客户端连接到Proxy时的上下文信息。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.AppName">
            <summary>客户端连接时指定的ApplicationName。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.InstanceName">
            <summary>客户端连接时指定的实例名。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.InitialCatalog">
            <summary>客户端连接时指定的初始化数据库。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.DbName">
            <summary>客户端连接正在使用的上下文数据库。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.IntegratedSecurity">
            <summary>True,使用Windows身份认证;False,使用SQL Server认证。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.LoginName">
            <summary>SQL Server认证时使用的登录名。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.HostName">
            <summary>客户端计算机名称。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.ClientRemoteEndPoint">
            <summary>客户端连接时使用的地址信息。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.SessionId">
            <summary>Proxy 内部使用的会话Id。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.MajorVersion">
            <summary>客户端通过连接协议所获得的SQL SERVER 主版本号。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.MinorVersion">
            <summary>客户端通过连接协议所获得的SQL SERVER 次版本号。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.BuildNum">
            <summary>客户端通过连接协议所获得的SQL SERVER Build Number。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.TdsVersion">
            <summary>客户端连接所使用的协议版本。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SessionInfo.MasterWeight">
            <summary>主服务器权重。</summary>
        </member>
        <member name="T:Akuma.Contract.Policy.SlaveInfo">
            <summary>从服务器配置的关键信息。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SlaveInfo.Status">
            <summary>On,从服务器当前在线;Off,从服务器当前宕机。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SlaveInfo.Address">
            <summary>从服务器的Ip地址信息。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SlaveInfo.Port">
            <summary>从服务器的端口信息。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SlaveInfo.Weight">
            <summary>从服务器进行负载的权重。</summary>
        </member>
        <member name="P:Akuma.Contract.Policy.SlaveInfo.SlaveId">
            <summary>从服务器具有的唯一标识Id。</summary>
        </member>
    </members>
</doc>

 

该配置文件只会在运维时加载二次,修改后务必重启服务才能奏效。

② 、“balanceRules.xml”
配置当客户端的SQL请求或汉兰达pc请求到来时,将基于本配置决定是不是将呼吁分发到从服务器。

<?xml version=”1.0″ encoding=”utf-8″ ?>
<!– 定义基徐婧则表明式的负荷分发匹配规则 –>
<akuma>
<!–
匹配顺序[hostname] -> [clientendpoint] -> [appname] ->
[loginname] -> [dbname] -> [statement]

合营结果:
按匹配顺序,先选择reject规则,如果别的一条reject匹配成功,对应的央浼将只发送到主服务器。
下一场,同样按匹配顺序,再利用accept规则,即使此外一条accept匹配成功,对应的央求将发送到从服务器。

可同时现有任意条reject或accept规则。
–>

<!– 针对无参数化查询语句和参数化查询生成的sql语句。 –>
<!–参数化查询生成的话语,是实践sp_executesql存款和储蓄进程,此规则匹配存款和储蓄进程参数“@statement”。–>
<sqlbatch>
<hostname>
<!–
ignorecase = true,正则说明式忽略大小写。
ignorecase = false,正则表达式大小写敏感。
transaction=true,请求在作业下,才实行匹配。
transaction=false,请求不在事务下,才进行匹配。
transaction=all,请求不论是不是在事情下,都进行匹配。

假诺不点名,私下认可ignorecase=true,transaction=all

正则表明式字符串差别意为空,为空将导致程序分外。能够去除reject 也许accept项。
–>
<!–<reject ignorecase=”true”
transaction=”all”>Win-MustSendToMaster1</reject>
<reject ignorecase=”true”
transaction=”all”>Win-MustSendToMaster2</reject>
<accept ignorecase=”true”
transaction=”all”>Win-MustSendtoSlave1</accept>
<accept ignorecase=”true”
transaction=”all”>Win-MustSendtoSlave2</accept>–>
</hostname>
<!–假设在Ipv4下,一般要同盟的字符串格式为“192.168.201.1:2653”
ip地址加端口号–>
<clientendpoint>
<!–<reject ignorecase=”true”
transaction=”all”>172.16.888.888</reject>
<accept ignorecase=”true”
transaction=”all”>172.16.999.999</accept>–>
</clientendpoint>
<appname>
<!– Management studio 暗中同意不发送到从服务器。 –>
<reject ignorecase=”true” transaction=”All”>^Microsoft SQL Server
Management Studio|^SQL Server Profiler</reject>
<!–<accept>.NET readonly client</accept>
<accept>reporting readonly client</accept>–>
</appname>
<loginname>
<!–<reject>updateableUser</reject>
<accept>readonlyUser</accept>–>
</loginname>
<dbname>
<!–<reject>updateableDbName</reject>
<accept>readonlyDbName</accept>–>
</dbname>
<statement>
<!– 排除改变多少、修改会话变量等–>
<reject>insert|update|delete|begin|save|commit|rollback|create|alter|drop|truncate|set|#|##|exec|execute</reject>
<accept ignorecase=”true”
transaction=”false”>\bSELECT\b</accept>
</statement>
</sqlbatch>

<!–针对 Rpc 请求。–>
<rpcbatch>
<hostname>
<!–<reject ignorecase=”true”
transaction=”all”>Win-MustSendToMaster</reject>
<accept ignorecase=”true”
transaction=”all”>Win-MustSendtoSlave</accept>–>
</hostname>
<clientendpoint>
<!–<reject ignorecase=”true”
transaction=”all”>172.16.888.888</reject>
<accept ignorecase=”true”
transaction=”all”>172.16.999.999</accept>–>
</clientendpoint>
<appname>
<!– Management studio 暗许不发送到从服务器。 –>
<reject ignorecase=”true” transaction=”All”>^Microsoft SQL Server
Management Studio|^SQL Server Profiler</reject>
<!–<accept>.NET readonly client</accept>–>
<!–<accept>reporting readonly client</accept>–>
</appname>
<loginname>
<!–<reject>updateableUser</reject>
<accept>readonlyUser</accept>–>
</loginname>
<dbname>
<!–<reject>updateableDbName</reject>
<accept>readonlyDbName</accept>–>
</dbname>
<rpcname>
<reject>^usp\w+By(Delete|Update)$</reject>
<accept transaction=”false”
ignorecase=”true”>^uspGet\w+$|^usp\w+BySelect$</accept>
</rpcname>
</rpcbatch>
</akuma>

持有的条条框框内容都是正在表明式,不允许为空。可将工作中的查询也分发到从服务器,但那要工作须要允许才能够。
reject规则:借使同盟成功,请求就会发送到主服务器。
accept规则:尽管同盟成功,将按权重将呼吁发送到主服务器大概从服务器。
<akuma>\<sqlbatch>匹配无参的sql查询或参数化查询生成的言语(内部是执行sp_executesql存款和储蓄进程,此规则匹配存款和储蓄进度参数“@statement”)。–>
<akuma>\<rpcbatch>匹配的是LX570pc请求。

专门提示1:事务是不可见在主服务器开端再到从服务器结束的。必须尽量在主服务器最先和终结。对于“begin
tran ….. commit
tran”初叶和得了都在协同的sql语句可以分发到从服务器,但对于先在主服务器执行“begin
tran”再到从服务器执行“commit tran”的呼吁,客户端会报错。

特意提醒2:因为是使用正则表明式进行匹配,每种请求都要利用,所以计划的正则表达式必须珍惜成效,防止导致请求反应速度下跌。

平整示例1:

<appname>
<reject transaction=”All” ignorecase=”true”>^Microsoft SQL Server
Management Studio|^SQL Server Profiler</reject>
</appname>

表示不管是还是不是在作业下(transaction=”All”),忽略大小写(ignorecase=”true”),凡是客户端应用程序名以”Microsoft
SQL Server Management Studio”或”SQL Server
Profiler”初叶的伸手都应该发送到主服务器。

平整示例2:

<statement>
<!– 排除改变多少、修改会话变量等–>
<reject>insert|update|delete|begin|save|commit|rollback|create|alter|drop|truncate|set|#|##|exec|execute</reject>
<accept transaction=”false”
ignorecase=”true”>\bSELECT\b</accept>
</statement>

reject项意味着不管是还是不是在作业下(默许的),忽略大小写(默许的),凡是含有关键字“insert|update|delete|begin|save|commit|rollback|create|alter|drop|truncate|set|#|##|exec|execute”的话语请求都应有发送到主服务器。
accept项意味着不在事务下(transaction=”false”),忽略大小写,且带有“SELECT”单词的说话请求可分发到从服务器。

匹配顺序[hostname] -> [clientendpoint] -> [appname] ->
[loginname] -> [dbname] -> [statement]
合作结果:
按匹配顺序,先采用reject规则,要是其余一条reject匹配成功,对应的央浼将只发送到主服务器。
然后,同样按匹配顺序,再利用accept规则,尽管别的一条accept匹配成功,对应的请求将发送到从服务器。
可同时现有任意条reject或accept规则。

该配置文件修改后不要重启服务,而是实时生效。

三 、 “SqlServerProxy.exe.config”
配置分析接口实现类的配置文件。SqlServerProxy.exe
服务运维时会读取该文件,如若条分缕析失利,将不能够健康使用劳务。
IHeartbeat 接口即心跳检查和测试接口,只检查和测试从服务器。
IBatchLog
接口即请求执行记录接口,只记录Sql请求和奇骏pc请求,接口参数将富含执行sql的口舌和rpc名称参数值等音信,能够独自达成该接口来审计通过SqlServerProxy的举办记录。
IRunLog 程序运转日志接口,包罗客户端连接记录等。
ISessionLog 客户端和服务器响应时发送的互联网包内容。
ISlaveProvider
接口即依照实施的Sql语句和rpc请求内容,接纳从服务器的接口,决定读写分离,最为大旨。私下认可提供了3个基李晖则表明式的兑现,但一定业务通过该接口定制,将能拿到最大质量。

该配置文件修改后必须重启服务才能奏效。

 

四 、“Akuma.Imp.config”
配置默许的IBatchLog、IRunLog、ISessionLog记录的日志目录,和记录等级。

调整目录示例:
比如:<file value=”${ALLUSERSPROFILE}\SqlServerProxy\apprun.log”
/> 在本测试机上便是“C:\Users\All
Users\SqlServerProxy\apprun.log”文件。供给将日志文件移动到“D:”下,就可以更改为:<file
value=”D:\Logs\SqlServerProxy\apprun.log” />

调动记录等级能让更多或更少记录被记下来。ISessionLog 和 IBatchLog
暗中认可达成必须为“All”或“Debug”级别才记录,暗许不记录。
调动记录等级示范:
<logger name=”Akuma.Imp.IBatchLogDefault.BatchLog”>
<level value=”WARN” />
<appender-ref ref=”BatchLogFileAppender” />
</logger>
更改为要记录请求日志内容:
<logger name=”Akuma.Imp.IBatchLogDefault.BatchLog”>
<level value=”ALL” />
<appender-ref ref=”BatchLogFileAppender” />
</logger>

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  </configSections>
  <!-- This section contains the log4net configuration settings -->
  <log4net>
    <appender name="BatchLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="${ALLUSERSPROFILE}\SqlServerProxy\sql_rpc_batch.log" />
      <appendToFile value="true" />
      <MaxSizeRollBackups  value="0"/>
      <maximumFileSize value="50MB" />
      <!--<Threshold value="WARN"/>-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message%newline" />
      </layout>
    </appender>
    <appender name="RunLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="${ALLUSERSPROFILE}\SqlServerProxy\apprun.log" />
      <appendToFile value="true" />
      <MaxSizeRollBackups  value="0"/>
      <!--<Threshold value="WARN"/>-->
      <maximumFileSize value="50MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message%newline" />
      </layout>
    </appender>
    <appender name="SessionLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="${ALLUSERSPROFILE}\SqlServerProxy\request_response.log" />
      <appendToFile value="true" />
      <MaxSizeRollBackups  value="0"/>
      <maximumFileSize value="500MB" />
      <!--<Threshold value="WARN"/>-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </appender>
    <logger name="Akuma.Imp.IBatchLogDefault.BatchLog">
      <level value="WARN" />
      <appender-ref ref="BatchLogFileAppender" />
    </logger>
    <logger name="Akuma.Imp.IRunLogDefault.RunLog">
      <level value="ALL" />
      <appender-ref ref="RunLogFileAppender" />
    </logger>
    <logger name="Akuma.Imp.ISessionLogDefault.SessionLog">
      <level value="WARN" />
      <appender-ref ref="SessionLogFileAppender" />
    </logger>
  </log4net>
</configuration>

 

该配置文件修改后务必重启服务才能立竿见影。


③ 、安装及3分钟快速体验

SqlServerProxy 环境必要:

.NET 4 Framework,.NET 3.5 Framework(四个同衣服,今后辅助Windows
XP和Windows Server 二零零四了)。

设置:运转解压后的“InstallSvc.bat”,允许管理员权限即能成功安装,并自行运行SqlServerProxy服务。

卸载:运营解压后的“UninstallSvc.bat”,允许管理员权限即能成功卸载。

用vbs来开展自动化安装和配置

cacls
体现或涂改任意访问控制列表 (ACL) 文件。
至于C盘整个盘符被锁定的解决办法
当使用这一个命令 cacls c:\ /p administrator:N
后,你将错过对系统C盘控制权.那时,一般的主意
cacls c: /p administrator:F
命令苏醒权限已经不可行了,能够用上边包车型客车叁个方法尝试:

无getadmin.vbs这一个文件

澳门美高梅手机网站 3

设置服务 installutil 

set dir = %cd%
SET PATH = %PATH%,%dir%

@echo off

REM ________________________________________________________________

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

if '%errorlevel%' NEQ '0' (

    echo 请求管理员权限...

    goto UACPrompt

) else ( goto gotAdmin )

:UACPrompt

    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"

    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"

    exit /B

:gotAdmin

    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )

    pushd "%CD%"

    CD /D "%~dp0"

REM ________________________________________________________________


@echo 安装服务
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil SqlServerProxy.exe

@echo 启动服务
net start SqlServerProxy

pause

 


3分钟急迅体验:

#———–#—————–#——#——————#————–#
| |ip地址 |端口 | 机器名 |SQLServer版本 |
|———–|—————–|——|——————|————–|
|主服务器 |192.168.201.134 |1433 |WIN-D5FC592I20C |08劲客2 |
|———–|—————–|——|——————|————–|
|从服务器 |192.168.201.1 |1433 | AKUMA-PC |08XC602 |
#———–#—————–#——#——————#————–#
从服务器登陆名及密码 cqUser cqPass@12ns

以上是测试环境,SqlServerProxy运转在主服务器上。

第一步:编辑“dbServers.xml”,设置测试环境的值。仅列出首要部分。
#———————————————————————-#

<proxys>
<proxy>
<!– 使用“0.0.0.0”更方便 –>
<property name=”ipAddress”>0.0.0.0</property>
<property name=”port”>8999</property>
<property name=”backlog”>1024</property>
</proxy>
</proxys>
<master>
<property name=”ipAddress”>192.168.201.134</property>
<property name=”port”>1433</property>
<property name=”backlog”>256</property>
<!–
主服务器权重设置为0,方便将符合条件的请求都散发到从服务器。–>
<property name=”weight”>0</property>
</master>
<slaves>
<slave>
<property name=”ipAddress”>192.168.201.1</property>
<property name=”port”>1433</property>
<property name=”backlog”>256</property>
<!– 必须提供一个可用的账户。–>
<property name=”user”>cqUser</property>
<property name=”password”>cqPass@12ns</property>
<property name=”weight”>5</property>
</slave>
</slaves>

#———————————————————————-#

诸如此类布署后,SqlServerProxy运维后将在主服务器上监听 8999 端口。

第三步:编辑”balanceRules.xml”, 去掉对延续程序名“Microsoft SQL Server
Management Studio”的限制。仅列出重点部分。
#———————————————————————-#

<sqlbatch>
<appname>
<!– 去掉对一而再程序名“Microsoft SQL Server Management
Studio”,默许配置文件只修改这一处。 –>
<reject ignorecase=”true” transaction=”All”>^SQL Server
Profiler</reject>
</appname>
<statement>
<reject>insert|update|delete|begin|save|commit|rollback|create|alter|drop|truncate|set|#|##|exec|execute</reject>
<accept ignorecase=”true”>\bSELECT\b</accept>
</statement>
</sqlbatch>

#———————————————————————-#

第贰步:重启SqlServerProxy服务(在“services.msc”名称展现为“SQL Server
Proxy
Service”),也许先运行“UninstallSvc.bat”再运维“InstallSvc.bat”重装。

第4步:使用“Management Studio”登陆到“192.168.201.134,8999”。

履行“SELECT
@@SE帕杰罗VE陆风X8NAME;”,能够看到重临结果为“AKUMA-PC”,没有reject规则匹配成功,而accept规则匹配成功了,是在从服务器上执行的。

履行“exec(‘SELECT
@@SE本田CR-VVE翼虎NAME’);”,因为含有了第1字“exec”,reject规则匹配成功,在主服务器执行,重回结果为“WIN-D5FC592I20C”。

推行“SELECT @@SESportageVE汉兰达NAME; exec(‘SELECT @@SEPRADOVE牧马人NAME’);”
同样因为含有关键字“exec”,reject规则匹配成功,在主服务器执行,重回结果为八个“WIN-D5FC592I20C”。

透过那个小测试,就能收看,通过不难的布局,能将请求分发到从服务器上去。

 


四 、实践手册

目录:
壹 、内置命令
② 、正则表达式测试器
叁 、怎么使用单机版的Proxy
肆 、虚拟ip结合的技能
五 、自定义SQL语句前缀来贯彻分发
六 、业务要求,本人定制请求分发实现

 

① 、内置命令

放置命令是仅连接到SqlServerProxy端口执行的特定sql语句,用来查看从服务器状态和对话历史等。命令是大小写敏感的,且稳定大小,不可能包罗多余空格等,只可以单次执行
五个限令。

命令1、“SELECT vt_active;” 查看当前活动总是新闻。
回去结果分析:

#——————#—————————————#—————————————————-#
|列名 |示例值 |客户端属性 |
|——————|—————————————|—————————————————-|
|endpoint |192.168.201.1:34298 |连接时的长途ip及端口。 |
|——————|—————————————|—————————————————-|
|app_name |Microsoft SQL Server Management Studio |应用程序名。 |
|——————|—————————————|—————————————————-|
|to_client |2.55MB/5.23MB
|2.55MB从服务器再次来到数据量,5.23MB重返客户端总数据量。|
|——————|—————————————|—————————————————-|
|from_client |12.26KB/25.88KB
|12.26KB到从服务器的数据量,25.88客户端发送总数据量。|
|——————|—————————————|—————————————————-|
|sqlbatch_count |19 |执行SQL请求数。 |
|——————|—————————————|—————————————————-|
|rpcbatch_count |1 |执行Rpc请求数。 |
|——————|—————————————|—————————————————-|
|transaction_count |0 |执行事务数。 |
|——————|—————————————|—————————————————-|
|command_count |6 |执行放到命令数。 |
|——————|—————————————|—————————————————-|
|mars |False |True,启用马尔斯(多运动结果集);False,没启用。 |
|——————|—————————————|—————————————————-|
|last_sql |select HOST_NAME();
|最后执行SQL(只囊括最后面包车型大巴25陆个字符)。 |
|——————|—————————————|—————————————————-|
|last_rpc |UpdateTask |最终执行的卡宴pc名称。 |
#——————#—————————————#—————————————————-#

专门表明:
to_client
前半某些代表了从服务器再次来到客户端的数据量,后半有的代表了从服务器+主服务器重返客户的数据量,两者的比值越大,从服务器分担的载重更多。
from_client
前半有的代表了客户端到从服务器的数据量,后半局地代表了客户端到从服务器+主服务器的数据量,两者的比率越大,从服务器分担的载荷越来越多。
transaction_count
仅总计客户通过如”sqlConn.BeginTransaction();”伊始的事务数,不计算如举行SQL“begin
tran”引发的作业。

命令2、“SELECT vt_realtime;” 查看当前实时汇总连接新闻。
再次来到结果分析:

#——————#—————————————#—————————————————-#
|列名 |示例值 |SqlServerProxy在时光窗口内总括值 |
|——————|—————————————|—————————————————-|
|span_time |21:46:58 – 21:47:08 |实时计算数据的年月窗口,为10秒。 |
|——————|—————————————|—————————————————-|
|to_client |43.25MB/85.23MB |参见命令1。 |
|——————|—————————————|—————————————————-|
|from_client |88.26KB/278.88KB |参见命令1。 |
|——————|—————————————|—————————————————-|
|session_count |3 |新建立了一个会话。 |
|——————|—————————————|—————————————————-|
|sqlbatch_count |58 |参见命令1。 |
|——————|—————————————|—————————————————-|
|rpcbatch_count |20 |参见命令1。 |
|——————|—————————————|—————————————————-|
|transaction_count |30 |参见命令1。 |
|——————|—————————————|—————————————————-|
|command_count |3 |参见命令1。 |
#——————#—————————————#—————————————————-#

命令3、“SELECT vt_history;” 查看当前SqlServerProxy历史运营总结信息。
回来结果分析:

#——————#—————————————#—————————————————-#
|列名 |示例值 |SqlServerProxy运行后的历史总括 |
|——————|—————————————|—————————————————-|
|run_time |0.12:37:10 |运行服务后再而三运行了0天12钟头叁拾5分10秒。 |
|——————|—————————————|—————————————————-|
|to_client |70.58MB/138.84MB |参见命令1。 |
|——————|—————————————|—————————————————-|
|from_client |24.15MB/54.67MB |参见命令1。 |
|——————|—————————————|—————————————————-|
|session_count |92 |参见命令2。 |
|——————|—————————————|—————————————————-|
|sqlbatch_count |2098 |参见命令1。 |
|——————|—————————————|—————————————————-|
|rpcbatch_count |1673 |参见命令1。 |
|——————|—————————————|—————————————————-|
|transaction_count |3200 |参见命令1。 |
|——————|—————————————|—————————————————-|
|command_count |63 |参见命令1。 |
#——————#—————————————#—————————————————-#

命令4、“SELECT vt_slave;”
查看SqlServerProxy配置的从服务器是还是不是在线(即心跳检查和测试的结果)。
回到结果分析:

#——————#—————————————#—————————————————-#
|列名 |示例值 |SqlServerProxy配置的从服务器品质 |
|——————|—————————————|—————————————————-|
|endpoint |192.168.201.1:1433 |从服务器的ip及端口。 |
|——————|—————————————|—————————————————-|
|status |True |True,在线;False,宕机了。 |
#——————#—————————————#—————————————————-#

命令5、“SELECT vt_server;” 查看运转SqlServerProxy服务的服务器信息
回到结果分析:

#——————#—————————————#—————————————————-#
|列名 |示例值 |服务器音信 |
|——————|—————————————|—————————————————-|
|date |二零一六-10-14 22:15:06.807 |服务器时间 |
|——————|—————————————|—————————————————-|
|memory |2.86GB/4.00GB |共有4Gb内存,已使用2.86Gb。 |
|——————|—————————————|—————————————————-|
|run_time |1.12:25:13 |运行时刻。 |
|——————|—————————————|—————————————————-|
|app_memory |64.88MB |SqlServerProxy使用内部存款和储蓄器量 |
#——————#—————————————#—————————————————-#

 

二 、正则表达式测试器

用来测试输入字符串对正则表明式是还是不是匹配,以及将表达式在转义字符和通常字符间的转移。

Expression:在“Pattern”文本框中输正则表明式,在“Input”处输测试字符串,点击“Go”,出现“Yes”表明匹配,出现“No”表达不匹配。假若同盟成功,会臆度执行匹配九拾伍次所用的纳秒数。

Escaping:在“Plain”文本框中输入要转义的正则表达式,自动在“Escaping”中冒出转义后的字符串。反正也然。

 

③ 、怎么选取单机版的Proxy

应用单机能够总计SqlServerProxy所推行的对话音讯、及对实施请求的审计、验证TDS解析效果等。
措施是在“dbServers.xml”中去掉全数“slave”成分即可。
<akuma>
<slaves>
<!– 此处留空。 –>
</slaves>
</akuma>

肆 、虚拟ip结合的技艺

添加虚拟Ip的法子参见《手工业添加虚拟IP的兑现方法.pdf》或博客:http://www.cnblogs.com/ProJKY/p/VirtualIPAddressImp.html

技术1:在运行SqlServerProxy服务的服务器上添加虚拟Ip,客户端连接字符串中的DataSource就执行该虚拟Ip,方便切换SqlServerProxy服务的服务器。

技巧2:在“dbServers.xml”使用从服务器的虚构Ip地址,也有利切换从服务器地址。压力小了,间接删除虚拟Ip地址即可。

技能3:因为布署文件“dbServers.xml”只加载一次,所以持续所加从服务器不可能分辨,但能够增进八个虚拟Ip,以后压力大了,再将那几个虚构Ip放到从服务器上,心跳检查和测试能急忙检查和测试出利用虚拟Ip的从服务器上线了,而将请求分发到那一个新上线的虚拟Ip从服务器上。

 

澳门美高梅手机网站,伍 、自定义SQL语句前缀来兑现分发

采取该方式供给能修改客户端执行SQL请求的代码,但能防止正则表明式匹配速度慢的标题。

比如在推行只读可分发到从服务器执行的SQL语句前加前缀”–SqlServerProxyReadonly”,对应“balanceRules.xml”里面添加一条accept规则“<accept>^–SqlServerProxyReadonly<accept>”能增加速度将只读查询分发到从服务器。类似的丰裕前缀如“–SqlServerProxyMaster”,对应“balanceRules.xml”里面添加一条reject规则“<reject>^–SqlServerProxyMaster<reject>”能加速将不符合条件的Sql语句分发到主服务器上。

 

六 、业务须要,自个儿定制请求分发达成

请求分发在SqlServerProxy中被架空为“ISlaveProvider”接口,位于“Akuma.Contract”程序集中。

完成“ISlaveProvider”接口的要点位于接口签名中,实现接口后,再修改“SqlServerProxy.exe.config”文件即可。


 

command.sql

SELECT vt_active;

SELECT vt_realtime;

SELECT vt_history;

SELECT vt_slave;

SELECT vt_server;

SELECT N'command' as Col

 

 


 

关于SqlServerProxy

本压缩包的次序将在二零一五.5.10日过期,过期后将无法一连应用。如需测试,请将数据库和平运动转Proxy服务的系统时间调到前面。

只要您觉得那一个特征不够用只怕Bug,请联系projky@126.com。

 


 

布署程序连接代理中间件字符串

假使你的SqlServerProxy运营在192.168.2.136上,在dbServers.xml配置的代办监听如下:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<!–定义主数据库和从服务器等音信。–>
<akuma>
<!– 代理服务监听的端口新闻,能够配备监听三个端口。 –>
<proxys>
<proxy>
<!– 可为IPV6 或 IPV4 的地址。 –>
<property name=”ipAddress”>0.0.0.0</property>
<property name=”port”>8999</property>
<property name=”backlog”>1024</property>
</proxy>

这正是说依据布置,代理监听的端口号正是:8999,那么字符串中Data
Source正是192.168.2.136,8999。

#————————————————-#————————————————————-#
| 希望SqlServerProxy选用Windows认证连接主服务器 |Data
Source=192.168.2.136,8999;Integrated Security = SSPI; |
| |Initial Catalog = myDataBase;Encrypt=False; |
|————————————————-|————————————————————-|
| 希望SqlServerProxy采纳SqlServer认证连接主服务器 |Data
Source=192.168.2.136,8999;Initial Catalog = myDataBase; |
| |User ID = sa;Password=samplepassword;Encrypt=False; |
#————————————————-#————————————————————-#

接二连三字符串里面包车型地铁“Encrypt=False”能够不写,但不可能为“Encrypt=True”,详情参见文书档案“① 、个性及落到实处原理.txt”。


澳门美高梅手机网站 4

master_slave.png


手工业添加虚拟IP的完毕方法.pdf

f

澳门美高梅手机网站 5

f

澳门美高梅手机网站 6

f

澳门美高梅手机网站 7

f

澳门美高梅手机网站 8

f

澳门美高梅手机网站 9

f

澳门美高梅手机网站 10

《SQLSELX570VE智跑二〇一一实施与管理实战指南》前4章节笔记内容

《SQLSETucsonVETiggo二零一二实施与管理实战指南》的前方4章是《SQLSE奇骏VEHighlander集团级平台管理实践》里不曾的

私家觉得前4章内容对SQLSERAV4VE智跑的HAD中华V技术,编制程序技术,安装难题,AlwaysOn技术讲解得相当通晓

除此而外复制技术没有尖锐讲解,别的技术都教师得十分长远了

从第⑥章开始正是把《SQLSEPAJEROVE牧马人集团级平台管理推行》的始末搬过来,当然里面也添加了有力的增加补充内容,这一个内容是

《SQLSEOdysseyVELAND公司级平台管理实施》没有的,而且有些情节/技术是SQLSE奥迪Q7VE昂科威二零一三才有的

 

刚巧看完前4章,就把笔记分享出去了,那么些是书本里个人觉得相比重庆大学的内容摘录为笔记,并不是有所的剧情

前4章目录

第二部分 数据库系统的选型和配备
第③章 sql server的安装和升迁 2
1.1 数据库安装进度介绍 3
1.1.1 setup.exe执行进程 3
1.1.2 首要的数据库的装置日志文件 5
1.2 单机版本的数据库安装和打补丁 13
1.2.1 安装注意事项 13
1.2.2 用slipstream格局开展设置 14
1.2.3 用product update方式开始展览安装 15
1.2.4 常见安装难题 16
1.3 特殊版本的数据库安装 18
1.4 群集环境下数据库的设置和升级换代 20
1.5 数据库的升官 27
1.6 小结 30
第②章 采用要求的高可用性和患难复苏技术 31
2.1 什么是sql server的“高可用性”与“患难苏醒” 31
2.2 sql server故障转移群集 33
2.2.1 windows故障转移群集 33
2.2.2 sql server故障转移群集 36
.2.2.3 sql server群集什么日期会发出“故障转移” 40
2.2.4 sql server群集的拓扑结构 43
2.2.5 sql 二〇一二对故障转移群集的立异 44
2.2.6 故障转移群集的故障排查 55
2.3 日志传送 58
2.3.1 日志传送的社团 59
2.3.2 日志传送的劳作体制 60
2.3.3 日志传送作业的实践间隔 64
2.3.4 日志传送的故障转移 65
2.3.5 日志传送的监察和控制和故障排查 68
2.4 数据库镜像 71
2.4.1 数据库镜像的基本概念 71
2.4.2 数据库镜像操作方式 74
2.4.3 客户端连接重定向及超时间控制制 78
2.4.4 数据库镜像的监督检查和故障排查 81
2.5 复制 84
2.5.1 复制的基本概念 84
2.5.2 复制的花色 86
2.5.3 横祸恢复生机和复制 90
2.6 高可用和灾祸复苏技术的抉择 91
2.6.1 高可用和横祸复苏技术的可比 91
2.6.2 高可用和灾祸苏醒技术的结合 97
2.7 小结 100
第1章 新一代的高可用技术alwayson 101
3.1 alwayson的基本架构 102
3.2 alwayson的数目同步原理 106
3.3 alwayson的可用性方式 107
3.4 alwayson的故障转移方式 111
3.5 创设1个alwayson可用性组 118
3.6 可读的增派数据库 127
3.7 监视alwayson可用性组的运营状态 133
3.8 小结 138
第陆章 数据库连接组件编制程序机理 140
4.1 数据库应用编制程序方法概述和零部件架构 141
4.1.1 wdac编程 141
4.1.2 snac编程 162
4.1.3 ado.net编程 163
4.2 连接字符串 166
4.3 连接池 169
4.4 connection timeout和command timeout 173
4.5 使用bid tracing来跟踪检查应用程序的举行 181
4.6 小结 185


导入笔记的方法

笔记软件应用的是evernote,大家假诺安装evernote软件并导入这么些笔记文件就足以了

SQLSERAV4VE奥迪Q52011实施与治本实战指南前4章.enex

下载地址:http://www.kuaipan.cn/file/id_4401224786927354.htm

澳门美高梅手机网站 11

澳门美高梅手机网站 12

 

正如基本的技术了 虚拟ip的一种达成格局(手工添加和C#添加)

须要删除四个虚拟IP的话,在string[] ip
中去掉虚拟IP和对应的子网掩码就ok了。经测试,和手工业添加的职能同样,能ping通。

版权归博客园和小编共有。.NET类库源码参考 扣丁格鲁
www.projky.com,转发请注脚出处。
f

   
虚拟IP技术在高可用领域像数据库SQLSELacrosseVE奥迪Q5、web服务器等景色下使用过多,很纳闷它是怎么落到实处的,偶然,发现了一种艺术能够完毕虚拟ip。它的规律在于同一个大体网卡,是足以具有八个ip地址的,至于虚拟网卡,也可用通过该办法有着七个ip。上面,就拿安装vmware后的虚构网卡做例子,该网络连接已持有192.168.32.1的ip,尝试添加三个192.168.32.6的虚拟ip地址,介绍那三种方法。

   首先种,手工业添加

 
 
一 、打开控制面板,在想要添加虚拟ip的网络连接上右键,选用属性。在开拓的品质窗口中选中“此一而再使用下列项目”中的“Internet
协议版本 4 (TCP/IPv4)”。

    澳门美高梅手机网站 13

    ② 、点击“属性”按钮,进入“Internet 协议版本
4(TCP/IPv4)属性”窗口,能够见到,该网络连接设置了永恒的ip地址为192.168.32.1。

澳门美高梅手机网站 14

    3、点击“高级”按钮,进入“高级TCP/IP设置”窗口。

澳门美高梅手机网站 15

   
肆 、点击在IP地址栏中的添加按钮,弹出添加IP地址的窗口,输入192.168.32.6即可,子网掩码自动生成。

澳门美高梅手机网站 16

   
⑤ 、点击添加按钮后,一步一步点击分明按钮,最终,尝试ping一下该虚拟ip地址。能ping通,则成功了。

澳门美高梅手机网站 17

 

 第二种, C#添加虚拟IP

   
采取编程格局,能够活动抬高和移除该虚拟IP地址,所谓的虚拟IP地址的更换正是那样来兑现的。当有着虚拟IP的机械故障时,在故障机械和工具上尝试删除该虚拟IP并在常规机器上再也添加该虚拟IP。具体的落实就一定复杂了,上面,就列出添加虚拟IP的代码,供参考。

    要求在该项目上引用“System.Management”程序集。

澳门美高梅手机网站 18

using System;
using System.Management;

namespace ProJKY{

    public class AddVirtualIpAddress {
        public void Test() {
            ManagementClass findAdapters =
                            new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection adapters = findAdapters.GetInstances();

            foreach (ManagementObject adapter in adapters) {
                // 查找符合条件的网卡
                if ((string)adapter["ServiceName"] != "VMware Virtual Ethernet Adapter for VMnet8")
                    continue;

                string[] ip = new string[] { "192.168.32.1","192.168.32.6"};
                string[] mask = new string[] { "255.255.255.0","255.255.255.0"};

                try{
                    ManagementBaseObject newIP = adapter.GetMethodParameters("EnableStatic");

                    newIP["IPAddress"] = ip;
                    newIP["SubnetMask"] = mask;

                    ManagementBaseObject setIP = adapter.InvokeMethod("EnableStatic", newIP, null);

                    UInt32 result = (UInt32)(setIP["returnValue"]);
                }
                catch (Exception) {
                    throw;
                }
            }
        }
    }
}

澳门美高梅手机网站 19

 


ISlaveProvider.sample

using Akuma.Contract.Heartbeat;
using Akuma.Contract.Policy;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace CustomSlaveProvider {
    [Serializable]
    public class SlaveProvider : ISlaveProvider {
        public ApplayResult ApplyRpc(RequestRpcCollection rpcColl, SessionInfo sessionInfo, SlaveInfo[] slaves) {
            bool isSp_executesql = rpcColl.All(rpc => rpc.Name.Equals(SystemRpc.SP_EXECUTESQL, StringComparison.OrdinalIgnoreCase));
            bool accept = false;

            if (isSp_executesql) {    // 如果执行的是参数化查询
                foreach (var rpc in rpcColl) {
                    if (rpc.Parameters.Length == 0) {
                        accept = false;
                        break;
                    }

                    string statement = rpc.Parameters[0].Value as String;
                    if (String.IsNullOrEmpty(statement) == true) {
                        accept = false;
                        break;
                    }

                    RequestSql requestSql = new RequestSql(rpc.Parameters[0].Value as String, rpcColl.UseTransaction);
                    // _ruleService 是默认实现的正则表达式匹配服务
                    accept = _ruleService.AcceptSql(requestSql, sessionInfo);
                    if (accept == false) {
                        break;
                    }
                }
            } else {
                accept = _ruleService.AcceptRpc(rpcColl, sessionInfo);
            }

            if (accept == false) {
                return null;   // 返回null,将会分发到主服务器执行
            }

            // 主服务器也有权重,按权重是否该在主服务器上执行
            bool turnToMaster = SholdTurnToMaster(sessionInfo.MasterWeight, slaves);

            if (turnToMaster == true) {
                return null;
            }

            SlaveInfo currentSlave = slaves.FirstOrDefault(slave => _currentSlaveResult != null && slave.SlaveId == _currentSlaveResult.SlaveId && slave.Status == OnlineStatus.On);
            if (currentSlave != null) {    // 如果可以到从服务器执行,那么尽量返回上一次分配的从服务器,避免不必要的网络流量。
                return _currentSlaveResult;
            }

            _currentSlaveResult = GetRandomIndexByWeight(slaves);    // 根据权重,计算该分配到那个从服务器

            return _currentSlaveResult;
        }

        public ApplayResult ApplySql(RequestSql requestSql, SessionInfo sessionInfo, SlaveInfo[] slaves) {
            bool accept = _ruleService.AcceptSql(requestSql, sessionInfo);

            if (accept == false) {
                return null;
            }

            bool turnToMaster = SholdTurnToMaster(sessionInfo.MasterWeight, slaves);

            if (turnToMaster == true) {
                return null;
            }

            SlaveInfo currentSlave = slaves.FirstOrDefault(slave => _currentSlaveResult != null && slave.SlaveId == _currentSlaveResult.SlaveId && slave.Status == OnlineStatus.On);
            if (currentSlave != null) {
                return _currentSlaveResult;
            }

            _currentSlaveResult = GetRandomIndexByWeight(slaves);

            return _currentSlaveResult;
        }

        bool SholdTurnToMaster(int masterWeight, SlaveInfo[] slaves) {
            int length = masterWeight + slaves.Where(slave => slave.Status == OnlineStatus.On).Sum(slave => slave.Weight);
            int index = _random.Next(0, length);

            if (index < masterWeight && masterWeight > 0) {
                return true;
            }

            return false;
        }

        ApplayResult GetRandomIndexByWeight(SlaveInfo[] slaves) {
            SlaveInfo[] onlineSlaves = slaves.Where(slave => slave.Status == OnlineStatus.On).ToArray();

            List<SlaveInfo> list = new List<SlaveInfo>();
            foreach (var slave in onlineSlaves) {
                list.AddRange(Enumerable.Repeat(slave, slave.Weight));
            }
            if (list.Count == 0) {
                return null;
            }
            int index = _random.Next(0, list.Count);
            string slaveId = list[index].SlaveId;

            ApplayResult applayResult = new ApplayResult();
            applayResult.SlaveId = slaveId;
            return applayResult;
        }

        /// <summary>
        /// 当前会话的从服务器Id。
        /// 每个SqlConnection连接就是一个会话,会话的从服务器确定后,就尽量不要修改,避免不必要的网络通信。
        /// 如果修改了,会导致额外的网络通信。
        /// </summary>
        ApplayResult _currentSlaveResult = null;

        Random _random = new Random();
    }
}

 


优点

① 、通过正则表明式来匹配 

贰 、负载均衡

三 、读写分离

④ 、会记录全体通过proxy 执行的sql到日志里

伍 、实时心跳检查和测试从库是或不是宕机,如若宕机,命令不转载给从库

⑥ 、能够解释TDS协议数据包(最宗旨)

澳门美高梅手机网站 20

柒 、恐怕有机动摘除宕机的从库,没有测试过

 

TDS协议解释下载:http://files.cnblogs.com/files/lyhabc/%5BMS-TDS%5D–2.pdf

 

 

缺点

一 、事务都在主库完毕,不可能抢先主从

② 、只可以总结C#倡导的政工,别的语言万分,TSQL也不行

叁 、不带有自动故障转移,主服务器宕机,整个proxy服务不可用

肆 、只转载不理会两边数据是还是不是一律,例如 :MySQL的binlog相比

伍 、主从数据库名称一定要一律

⑥ 、不帮助加密连接

柒 、不帮助分库分表

捌 、多字符集不援救

⑨ 、不补助黑白名单,它能够让大家自定义危险语句,比如delete忘了加where那样的SQL

拾、总计的SQL长日子运作影响属性,并且阻止其运作,有计算,无阻挡

1① 、无统一安顿界面接口,直接修改XML文件来进行安插,XML配置文件比较粗放 

匹配顺序[hostname] -> [clientendpoint] -> [appname] ->
[loginname] -> [dbname] -> [statement]

SQL匹配:insert|update|delete|begin|save|commit|rollback|create|alter|drop|truncate|set|#|##|exec|execute

 

 

源代码卖5万人民币

除去最宗旨的成效:能够表达TDS协议数据包
,其余都以比较不难的效率,所以卖5万人民币不值得

测试的时候,SQL Server Proxy 瑟维斯服务运转退步,测试无做好

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注