Rubens Guimarães - CEO, e-Seth
Como projetar e colocar em prática bancos de dados inteligentes SQL e NoSQL em ambientes de alto consumo de dados.
Técnicas de sharding, tunning, elasticidade automatizada em ambientes cloud e outros recursos.
Apresentado no InterCon 2018 - https://eventos.imasters.com.br/intercon
2. Rubens Guimarães
Diretor de Tecnologia da eSeth
Engenheiro de Software com especialização na
Academia Latino-Americana de Segurança da Informação
e Stanford University - Palo Alto CA
Desenvolve projetos de tecnologia de ponta para empresas de
porte, instituições financeiras, redes de franquias e marcas
reconhecidas na América Latina, EUA e Europa.
4. O volume de informações
digitais produzidas nos últimos
02 anos é equivalente ao volume
produzido em toda a história.
Vai aumentar mais. Machine learning, IoT, Cognitive Services, etc
5.
6. Relacional
Tabelas, colunas e registros são
estruturas típicas deste tipo de
tecnologia.
Linguagem SQL.
SQL Server, Oracle, MySQL
NoSQL
Capacidades que vão além das
características típicas dos
sistemas gerenciadores
relacionais.
DocumentDB, MongoDB,
Redis, Cassandra, Riak
12. HORIZONTAL
Mesma estrutura com
dados diferentes.
Tabela A
Tabela B
Tabela C
Tabela A
Tabela B
Tabela C
Tabela A
Tabela B
Tabela C
Tabela A
Tabela B
Tabela C
Estruturas diferentes com
dados diferentes.
Tabela A
Tabela B
Tabela C
Tabela D
Depende do projeto e da capacidade da aplicação executar ações separadas.
Shard Map Manager x
13. TUNNING PERIÓDICO
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command nvarchar(4000);
SELECT
object_id AS objectid,
index_id AS indexid,
partition_number AS partitionnum,
avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;
OPEN partitions;
14. TUNNING PERIÓDICO
WHILE (1=1)
BEGIN;
FETCH NEXT
FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag;
IF @@FETCH_STATUS < 0 BREAK;
SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;
SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;
SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;
-- 10 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
IF @frag < 10.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
IF @frag >= 10.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
IF @partitioncount > 1
SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
EXEC (@command);
PRINT N'Executed: ' + @command;
END;
15.
16. Shard Map Manager
Instale:
Microsoft.Azure.SqlDatabase.ElasticScale.Client
Conecte ao SSMS:
CREATE EXTERNAL DATA SOURCE MyExtSrc
WITH (
TYPE=SHARD_MAP_MANAGER,
LOCATION='myserver.database.windows.net',
DATABASE_NAME='ShardMapDatabase',
CREDENTIAL= SMMUser,
SHARD_MAP_NAME='ShardMap' );
CREATE EXTERNAL TABLE [dbo].[order_line](
[ol_o_id] int NOT NULL,
[ol_d_id] tinyint NOT NULL,
[ol_w_id] int NOT NULL,
[ol_number] tinyint NOT NULL,
[ol_i_id] int NOT NULL,
[ol_delivery_d] datetime NOT NULL,
[ol_amount] smallmoney NOT NULL,
[ol_supply_w_id] int NOT NULL,
[ol_quantity] smallint NOT NULL,
[ol_dist_info] char(24) NOT NULL
)
WITH
(
DATA_SOURCE = MyExtSrc,
SCHEMA_NAME = 'orders',
OBJECT_NAME = 'order_details',
DISTRIBUTION=SHARDED(ol_w_id)
);
17. .NET – vários DBs
using (var scope = new TransactionScope())
{
using (var conn1 = new SqlConnection(connStrDb1))
{
conn1.Open();
SqlCommand cmd1 = conn1.CreateCommand();
cmd1.CommandText = string.Format("insert into T1 values(1)");
cmd1.ExecuteNonQuery();
}
using (var conn2 = new SqlConnection(connStrDb2))
{
conn2.Open(); var cmd2 = conn2.CreateCommand();
cmd2.CommandText = string.Format("insert into T2 values(2)");
cmd2.ExecuteNonQuery();
}
scope.Complete(); }
19. CONTEINERS
- Isolamento físico dos shardlets.
- Permissões e Controle de exposições.
- Gerenciamento facilitado.
- Permite mover db entre conteiners
sem sair do ar de forma vertical.
23. AZURE DATA FACTORY
Serviço de integração de dados baseado em nuvem que
automatiza a movimentação e a transformação dos dados.
SQL Server
Oracle
MySQL
MongoDb
PostgreSQL
Sybase
Cassandra
DB2
Teradata
Amazon Redshift
24. DESEMPENHO SQL SERVER NO AZURE
1- Direcione o tempdb para a unidade D na VM:
USE MASTER
GO
ALTER DATABASE tempdb MODIFY FILE (NAME= tempdev, FILENAME= ‘D:SQLTEMPtempdb.mdf’)
GO
ALTER DATABASE tempdb MODIFY FILE (name = templog, filename = ‘D:SQLTEMPtemplog.ldf’)
GO
25. DESEMPENHO SQL SERVER NO AZURE
2- Configurar os serviços do SQL Server para inicialização manual:
3- Criar um script para a cada inicialização da VM a pasta “SQLTEMP” (indicada
no script do passo 1) seja criada na unidade D antes da iniciação dos serviços do
SQL:
$SQLService=”SQL Server (MSSQLSERVER)”
$SQLAgentService=”SQL Server Agent (MSSQLSERVER)”
$tempfolder=”D:SQLTEMP”
if (!(test-path -path $tempfolder)) {
New-Item -ItemType directory -Path $tempfolder
}
Start-Service $SQLService
Start-Service $SQLAgentService
4- Agendar uma tarefa no Windows para execução do script ao inicializar o
servidor:
26. ANÁLISE
Máximo de solicitações simultâneas
SELECT COUNT(*) AS [Concurrent_Requests] FROM sys.dm_exec_requests R
OU
SELECT COUNT(*) AS [Concurrent_Requests] FROM sys.dm_exec_requests R
INNER JOIN sys.databases D ON D.database_id = R.database_id AND D.name = 'MyDatabase‘
Máximo de sessões
SELECT COUNT(*) AS [Sessions] FROM sys.dm_exec_connections
OU
SELECT COUNT(*) AS [Sessions] FROM sys.dm_exec_connections C
INNER JOIN sys.dm_exec_sessions S ON (S.session_id = C.session_id)
INNER JOIN sys.databases D ON (D.database_id = S.database_id)
WHERE D.name = 'MyDatabase'
27. ANÁLISE
SELECT
avg(avg_cpu_percent) AS 'Average CPU use in percent',
max(avg_cpu_percent) AS 'Maximum CPU use in percent',
avg(avg_data_io_percent) AS 'Average physical data I/O use in percent',
max(avg_data_io_percent) AS 'Maximum physical data I/O use in percent',
avg(avg_log_write_percent) AS 'Average log write use in percent',
max(avg_log_write_percent) AS 'Maximum log write use in percent',
avg(max_session_percent) AS 'Average % of sessions',
max(max_session_percent) AS 'Maximum % of sessions',
avg(max_worker_percent) AS 'Average % of workers',
max(max_worker_percent) AS 'Maximum % of workers' FROM sys.resource_stats WHERE
database_name = 'userdb1' AND start_time > DATEADD(day, -7, GETDATE());
Os dados são coletados a cada 5 minutos e são mantidos por aproximadamente 35
dias. Essa exibição é útil para uma análise de histórico de longo prazo de como seu
banco de dados SQL usa recursos.