Padrões para configurar o sharding para o SQL Server 2008 R2, para lidar com grandes conjuntos de dados?

14

Quero lidar com um grande conjunto de dados (> 1 bilhão de linhas) no SQL Server 2008 R2. Ouvi dizer que se você configurar "sharding" ou "particionamento horizontal", torna mais rápido lidar com grandes conjuntos de dados, pois divide as tabelas em vários arquivos.

Você já usou sharding ou particionamento horizontal antes? Em caso afirmativo, você poderia sugerir algum padrão que, em sua experiência, alcance melhores resultados em comparação com uma única tabela massiva?

Contango
fonte

Respostas:

23

Primeiro, observe que 1 bilhão de linhas podem ser tratadas efetivamente com uma arquitetura particionada em hardware de servidor comum. As arquiteturas exóticas de nada compartilhado não serão necessárias para esse volume de dados; no entanto, você provavelmente obterá benefícios significativos com o particionamento de tabelas.

O sharding é algo diferente do particionamento horizontal e implica uma arquitetura de 'nada compartilhado', que não é suportado pela maioria das versões do SQL Server 1.

O SQL Server pode oferecer suporte ao particionamento horizontal e uma arquitetura de disco compartilhado será adequada para ~ 1 bilhão de linhas.

No SQL Server, você cria uma função de partição seleciona uma partição com base nos valores ou intervalos de valores em uma coluna em uma tabela, por exemplo

create partition function F_AccPrdPart (int)
    as range left for values (
    180001                         -- Dummy value
   ,199012 ,199112 ,199212 ,199312, 199412 ,199512
   ,199612 ,199712 ,199812 ,199912 ,200012 ,200112
   ,200212 ,200312 ,200412 ,200512 ,200612 ,200712
   ,200812
   ,200901, 200902, 200903, 200904, 200905, 200906
   ,200907, 200908, 200909, 200910, 200911, 200912
   ,201001, 201002, 201003, 201004, 201005, 201006
   ,201007, 201008, 201009, 201010, 201011, 201012
   ,201101, 201102, 201103, 201104, 201105, 201106
   ,201107, 201108, 201109, 201110, 201111, 201112
   ,202012
   ,939999                         -- Dummy value
)
go

Em seguida, crie um ou mais grupos de arquivos aos quais alocar as partições. Para um grande conjunto de dados, esses grupos de arquivos podem ser configurados em diferentes volumes físicos. Observe que o armazenamento de conexão direta será muito mais rápido que uma SAN para isso em quase todos os casos. No exemplo abaixo, teríamos criado 6 grupos de arquivos chamados PartVol1-PartVol6.

Um ou mais esquemas de partição podem ser criados para alocar partições de tabela para grupos de arquivos com base no valor da função de partição, por exemplo

create partition S_AccPrdPart as partition F_AccPrdPart
    TO ([PRIMARY]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6] 
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2]
      ,[PRIMARY]
      ,[PRIMARY])
go

Esse esquema foi projetado para particionar em um período contábil. As datas também são frequentemente usadas para isso, embora qualquer tecla possa ser usada.

Você pode criar uma tabela no esquema de partição como se fosse um grupo de arquivos, por exemplo

Create table FooTrans (
       FooTransID        int identity (1,1) not null
      ,AccPeriod         int not null
      ,[...]
) on S_AccPrdPart (AccPeriod)
go

Observe que a tabela é criada no esquema de partição, em vez de um grupo de arquivos especificado, e a cláusula especifica a coluna a ser usada como chave de partição. Com base na chave da partição, as linhas da tabela serão alocadas para um dos grupos de arquivos no esquema de partição.

Nota: Uma regra prática para o design de um esquema de particionamento é que cada partição tenha uma contagem de linhas entre os 10 e os milhões, digamos entre 10 e 50 milhões, dependendo da largura das linhas. O volume do disco em que a partição fica deve ser rápido o suficiente para fazer uma varredura de pelo menos uma única partição em alguns segundos.

Sistemas de particionamento, sharding e nada compartilhado

Um pouco de terminologia parece aqui para desambiguar parte da discussão sobre esse tópico.

  • Um sistema de 'nada compartilhado' é um sistema paralelo em que os nós não têm armazenamento SAN compartilhado, mas usam armazenamento local para o nó. O exemplo clássico desse tipo de arquitetura é o Teradata. Os sistemas shared nothing escalam bem para conjuntos de dados muito grandes, pois não possuem gargalos de E / S central. A taxa de transferência de E / S é escalonada com o número de nós no sistema.

  • Um sistema de 'disco compartilhado' é aquele em que um ou mais servidores de banco de dados compartilham um único subsistema de armazenamento em disco. O banco de dados pode ser um único servidor com armazenamento local ou conectado a uma SAN ou um cluster de servidores conectado a uma SAN compartilhada. Os sistemas desse tipo são limitados pela taxa de transferência disponível no subsistema de armazenamento.

  • 'Sharding' é um termo usado para descrever a divisão de um banco de dados entre vários servidores físicos em uma arquitetura de nada compartilhado. Várias plataformas terão suporte maior ou menor para bancos de dados fragmentados. Nos círculos Teradata, o termo não é usado porque o Teradata apresenta uma imagem de sistema único transparente para os clientes, mesmo que a arquitetura física seja um tipo de nada compartilhado.

    As versões mais antigas do SQL Server têm suporte limitado ao sharding através de modos de exibição particionados distribuídos. A Microsoft agora cria uma versão do SQL Server 2008 R2 que oferece suporte a uma arquitetura de nada compartilhado com uma única imagem do sistema, mas esta versão está disponível apenas para OEMs e pode ser comprada apenas em um pacote de hardware.

Para 1 bilhão de linhas

Por 1 bilhão de linhas (a menos que as linhas individuais sejam extremamente amplas), uma arquitetura compartilhada de nada ou fragmentada está confortavelmente nos domínios do exagero. Esse tipo de volume pode ser tratado em um único servidor com especificações razoáveis, se tiver um subsistema de disco adequadamente rápido.

O disco de conexão direta local é de longe o mais econômico em termos de preço para desempenho. Um único controlador RAID SAS pode ter várias matrizes e vários controladores podem ser instalados em um servidor. Dependendo da configuração, uma matriz SAS moderna de 24 a 25 slots pode oferecer milhares de IOPS ou 1 GB + / s no desempenho de streaming; um servidor com vários barramentos PCI-e e vários controladores pode, teoricamente, lidar com mais.

O tipo de desempenho necessário para trabalhar com um banco de dados de 1 bilhão de linhas pode ser alcançado com bastante facilidade e baixo custo com o hardware do servidor básico e armazenamento de conexão direta desse tipo. Uma SAN também pode ser usada, mas você pode precisar de vários controladores SAN para obter desempenho equivalente, e o hardware provavelmente será uma ordem de magnitude mais cara.

Como recomendação geral, use armazenamento de conexão direta para aplicativos com requisitos pesados ​​de E / S, a menos que você precise de um tempo de atividade realmente bom. Os erros de configuração e controle de alterações são uma fonte muito maior de tempo de inatividade não programado do que a falha de hardware nas operações modernas de data center.

As SANs podem oferecer uma plataforma de armazenamento mais gerenciável se você tiver um grande portfólio de aplicativos, pois oferecem uma variedade de recursos de gerenciamento de armazenamento centralizado. No entanto, isso tem um preço alto e obter alto desempenho da infraestrutura baseada em SAN é difícil e caro.

1 A Microsoft faz uma versão paralela do SQL Server, mas ela está disponível apenas através dos canais OEM fornecidos com o hardware. As versões disponíveis no mercado não suportam esse recurso.

ConcernedOfTunbridgeWells
fonte
3
Uau - resposta incrível, acho que são todas as dicas necessárias para que este projeto funcione bem.