Issue deploying xConnect SQL shards on multi-machine setup

December 27, 2017

When I was trying to get the Sitecore 9 xp0 topology working, I ran into an issue with the xConnect SQL shard deployment. I installed everything using the SIF scripts and it seemed to have installed fine, but I found connection errors in the xConnect logs:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.

I checked the connection strings in the config files for xConnect and everything seemed fine. A better look at the stack trace showed me this error was originating from the Azure ShardMapManager code that xConnect used to manage the SQL shards. This ShardMapManager uses information from a table (ShardsGlobal) to connect to the right shard databases and opening this table showed me that the server name was set to localhost. However, SQL server was installed on another machine.

Because I was installing everything on seperated machines, I also ran the SIF scripts that created the shards on the SQL machine. These SIF scripts use a proprietary tool called Sitecore.Xdb.Collection.Database.SqlShardingDeploymentTool.exe and the connection settings you use with this tool are implicitely used when connecting to the shards from xConnect. So bottom line: Make sure that the connection settings you pass into the Sitecore.Xdb.Collection.Database.SqlShardingDeploymentTool.exe tool are the same ones that you will use when connecting from xConnect.

I was using the microsoft/mssql-server-windows-express docker image for the SQL database and you can only use windows authentication in the Build phase of this image. To work around this, I manually updated the connection settings in the shard tables after running the Sitecore.Xdb.Collection.Database.SqlShardingDeploymentTool.exe tool:

UPDATE [xp0_Xdb.Collection.ShardMapManager].[__ShardManagement].[ShardsGlobal] SET ServerName = '<SERVERNAME>'

Besides this, don’t forget to make the user (That you are using in the connection string) db_owner of the sharding databases. If not, you will get errors in the xConnect logs about SQL not being able to get information about the original db_owner.

Comments

comments powered by Disqus