J'ai un cluster mysql avec 3 nœuds de données et un nœud SQL. Actuellement, j'ai 1 million de documents 1 Ko. Les inserts sont très rapides, ne prend que quelques ms. Mais les SELECTS sont très lents> 20s.
Toutes les machines sont des instances EC2 M1.Larget (8 Go de RAM).
Voici le config.ini:
[NDB_MGMD]
NodeId=49
HostName=Host1
DataDir=/var/lib/mysql-mgmd-data
Portnumber=1186
[NDBD DEFAULT]
NoOfReplicas=1
DataMemory=1536M
IndexMemory=2560M
StringMemory=25
MaxNoOfTables=4096
MaxNoOfOrderedIndexes=2048
MaxNoOfUniqueHashIndexes=512
MaxNoOfAttributes=24576
MaxNoOfTriggers=14336
FragmentLogFileSize=256M
InitFragmentLogFiles=SPARSE
NoOfFragmentLogFiles=16
RedoBuffer=48M
MaxNoOfConcurrentOperations=100000
MaxNoOfConcurrentTransactions=16384
TimeBetweenGlobalCheckpoints=1000
TimeBetweenEpochs=100
TimeBetweenEpochsTimeout=32000
DiskCheckpointSpeedInRestart=100M
DiskCheckpointSpeed=10M
TimeBetweenLocalCheckpoints=20
HeartbeatIntervalDbDb=15000
HeartbeatIntervalDbApi=15000
MemReportFrequency=30
BackupReportFrequency=10
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
SharedGlobalMemory=384M
DiskPageBufferMemory=1G
BatchSizePerLocalScan=512
[NDBD]
NodeId=1
HostName=Host2
DataDir=/mnt/mysql-cluster/1/
[NDBD]
NodeId=2
HostName=Host3
DataDir=/mnt/mysql-cluster/2/
[NDBD]
NodeId=3
HostName=Host4
DataDir=/mnt/mysql-cluster/3/
[MYSQLD DEFAULT]
[MYSQLD]
NodeId=53
HostName=Host1
my.cnf
[mysqld]
ndbcluster
ndb-nodeid=53
ndb-connectstring=Host1,
Insérer:
INSERT INTO mytab(mykey, a, b, c, d, e, f, g, h, i,j)VALUES (1,1,2,3,4,5,6,7,8,9,0);
Sélectionner:
SELECT * FROM mytab WHERE mykey = 12345;
Créer une déclaration de table:
mytab | CREATE TABLE `mytab` (
`mykey` varchar(32) NOT NULL,
`a` varchar(100) DEFAULT NULL,
`b` varchar(100) DEFAULT NULL,
`c` varchar(100) DEFAULT NULL,
`d` varchar(100) DEFAULT NULL,
`e` varchar(100) DEFAULT NULL,
`f` varchar(100) DEFAULT NULL,
`g` varchar(100) DEFAULT NULL,
`h` varchar(100) DEFAULT NULL,
`i` varchar(100) DEFAULT NULL,
`j` varchar(100) DEFAULT NULL,
PRIMARY KEY (`mykey`)
) /*!50100 TABLESPACE mytab_space STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 MAX_ROWS=1000000000
/*!50100 PARTITION BY KEY (mykey) */ |
Quelqu'un a-t-il une idée pourquoi il est si lent?
[. ____
Il semble que de résoudre votre problème, vous avez choisi le mauvais outil.
Le cluster MySQL est bon lorsque vous faites la plupart des recherches sur la clé à partir de plusieurs threads à partir de tables à base de mémoire. Les tables à base de disque peuvent être utiles lorsque vous avez rarement lu les données. Ou votre jeu de données de travail est une petite partie de la table qui doit s'intégrer dans le cache de mémoire dont la taille est définie par diskpagebuffermoryemory variable de configuration.
Si vos requêtes ont besoin de nombreuses gammes ou une scanie complète - le cluster MySQL est lent, même sur des machines physiques. En effet, de telles requêtes ont besoin de nombreux échanges de données entre les nœuds de données. Essayez de pinging entre vos nœuds de données. Et pour la numérisation de plage Les nœuds de données peuvent avoir besoin d'échanger des centaines et des milliers de tels messages.
MySQL a également déclaré précédemment que pour les nœuds de données, vous devez utiliser des machines physiques et avoir une bonne interconnexion pour le trafic de noeud de données. Je doute que cette recommandation ne soit plus valide de nos jours.
Et je pense que vous devriez essayer de nettoyer votre config. Pour tester la plupart de ces choses, rien ne change tout à fait changé et que certains paramètres peuvent ralentir des choses. Essayez un tel simplifié NDBD_DEFAULT
section:
[NDBD DEFAULT]
NoOfReplicas=1
DataMemory=1536M
IndexMemory=2560M
LockPagesInMainMemory=2
ODirect=1