none
sharepoint 加入服务器场,结果在场中的服务器页面,服务实例显示在别的的服务器下 RRS feed

  • 问题

  • 上周在客户那里遇到一个问题,原本SharePoint 2013 场里有一台SharePoint 机器和一台DB,在Central Administration->Servers in the Farm 里面看到 DB 是直接用IP地址命名的。

    但是加入一台新的SharePoint服务器后,Servers in the farm 页面没有多出新的机器,反而IP命名的DB服务器上多出了许多服务实例。

    一开始以为只是显示出了点错,就没在意,谁知道后来有些界面出错了,原来是ServiceApplicationProxy 找ServiceApplication时找到了DB那台机器上。

    于是查为啥SharePoint 服务器加入场时加到DB上去了。Review 了 SPFarm.Join()的代码,里面有一段

                        foreach (SPServer server in this.Servers)
                        {
                            if (!SPServer.IsLocalAddress(server.Address))

    在SharePoint Server上PowerShell里用Reflection调用SPServer.IsLocalAddress(DB的IP地址),结果居然返回True。再继续读 IsLocalAddress() 的代码并在Power Shell里测试,发现原来 DB 的IP地址 DNS 反向解析居然得到的是 SharePoint Server 的机器名。

    相关人员修改了DNS相关设置,再把SharePoint服务器加入场,就正常了。



    注: 在PowerShell 里用来反向解析 DNS 的代码是 [System.net.dns]::GetHostEntry("10.0.1.1")
    • 已编辑 GuYuming 2017年8月11日 7:14
    • 已更改类型 GuYuming 2017年8月11日 10:06
    2017年8月7日 6:38

全部回复

  • AppFabric Distributed Cache Service 还是有点问题,目前我查到的状态是

    [microsoft.sharepoint.administration.spserver]::local 

    返回的值有问题,Address 对应到了DB Server的IP地址

    怀疑是因为 SPServer.RegistryServerId 返回的值有问题,这是一个 Internal Static 方法,我在PowerShell里用如下方法调用

    $spserver=new-object microsoft.sharepoint.administration.spserver

    $bindingflags=[system.reflection.bindingflags] "NonPublic,Static"

    $method=$spserver.gettype().getmethods($bindingflags)|?($_.name -eq "get_RegistryServerId")

    $method.invoke($null,$null)

    上次调用 IsLocalAddress 用的PowerShell 没记下来,这次类似的情况,又重新发明一下轮子,用了可能是更长的时间,一开始犯了一个错误,试图用 [microsoft.sharepoint.administration.spserver].gettype() 直接返回 spserver 类型, 结果得到了一个RuntimeType 类型,没能得到 get_RegistryServerId 方法

     
    2017年8月14日 10:36
  • 这个问题现在修复了,虽然过程自己都觉得有点乱,想得到进一步的确认,以下是我记得的一些要点:

    AppFabric Distributed Cache 有问题的这台 Server 上, [microsoft.sharepoint.administration.spserver]::local 会返回 DB 那台机器的IP 地址,也就是说是个错误的值,之前看了 Local 静态方法的代码,读了 RegistryServerId 这个Internal 方法返回的值,也是对应到DB 的值,和实际这台机器注册表(HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions)上的值不符。

    后来看到 [microsoft.sharepoint.administration.spserver]::local.EncodedServerId 这个Public 属性值也同注册表 不符。重要的是,这个m_EncodedServerId 是[Persisted]的,我的理解会依据Object Guid 和Configure DB Persisted 的内容同步。

    于是又清了 SharePoint Configuration Cache, 开了新的 PowerShell  instance , 这时候 [microsoft.sharepoint.administration.spserver]::local  返回正确值,再Add-SPDistributedCacheServiceInstance 就不会加到 DB那台Server上去了。但 Remove-SPDistributedCacheServiceInstance 还是会报 “cacheHostInfo is null”。依据 https://blogs.msdn.microsoft.com/sambetts/2014/03/19/sharepoint-2013-distributed-cache-appfabric-troubleshooting/ ,即使 

    $serviceInstance.Unprovision()

    报 "cacheHostInfo is null",但依然运行

    $serviceInstance.Delete()

    ,再重新 Add, Remove,Add SPDistributedCacheServiceInstance 就不会报错了,get-cachehost 得到的信息也正常了。


    • 已编辑 GuYuming 2017年8月15日 9:18
    2017年8月15日 9:08
  • 重述一下,也许最重要的一步就是开一个新的 PowerShell instance (清SharePoint Configuration Cache是否必须?),以保证 [microsoft.sharepoint.administration.spserver]::local 返回正确值,然后再 Add-SPDistributedCacheServiceInstance

    如果这一点解释不通可能就是后面有高人相助了,这个系统后台不是我一人访问

    • 已编辑 GuYuming 2017年8月15日 9:45
    2017年8月15日 9:21
  • 再补充一下,期间(具体啥时候步骤不记得了),还依据上述官方博客 运行 了 

    Unregister-CacheHost -HostName [machine] -ProviderType SPDistributedCacheClusterProvider -ConnectionString \\[machine]

    ,还根据错误提示,调整了注册表 SPDistributedCacheClusterProvider 以及 ConnectionString 相关的值,回想起来也不知道是不是必须的

    2017年8月15日 9:36