MySQL Cluster: HA als StorageEngine Erkan Yanar linsenraum.de 25. April 2012 Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 1 / 34
What About Hochverfügbarkeit mit MySQL Topic Wir wollen Hochverfügbarkeit Daten Service Und wie erreichen? Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 2 / 34
Datenredundanz/Verfügbarkeit Replication Lösungsmöglichkeiten: HA auf Basis von Replikation Replikation Datenredundanz Slave read only (Scaleout) HA Daten redundant? Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 3 / 34
Datenredundanz/Verfügbarkeit Replication Lösungsmöglichkeiten: HA auf Basis von Replikation Replikation Datenredundanz Slave read only (Scaleout) HA Daten redundant? Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 3 / 34
Datenredundanz/Verfügbarkeit Replication Lösungsmöglichkeiten: HA auf Basis von Replikation Replikation Datenredundanz Slave read only (Scaleout) HA Daten redundant? Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 3 / 34
Datenredundanz/Verfügbarkeit Replication Lösungsmöglichkeiten: HA auf Basis von Replikation Replikation Datenredundanz Slave read only (Scaleout) HA Daten redundant? Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 3 / 34
Datenredundanz/Verfügbarkeit Replication Sicherheit semisync vs. Performance async Failover Daten Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 4 / 34
Datenredundanz/Verfügbarkeit Blocklevel Blocklevel 2 Nodes Limit Nur ein Rechner Failover Daten Recoverydowntime Keine Skalierung Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 5 / 34
Datenredundanz/Verfügbarkeit Blocklevel Blocklevel 2 Nodes Limit Nur ein Rechner Failover Daten Recoverydowntime Keine Skalierung Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 5 / 34
Datenredundanz/Verfügbarkeit StorageEngines Modulares MySQL Storage Engine Authentication INFORMATION SCHEMA General Replication Audit... Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 6 / 34
Datenredundanz/Verfügbarkeit StorageEngines Modulares MySQL Storage Engine Authentication INFORMATION SCHEMA General Replication Audit... Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 6 / 34
Local Storage Engine Datenredundanz/Verfügbarkeit StorageEngines CREATE TABLE tablename (...) ENGINE=... Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 7 / 34
Datenredundanz/Verfügbarkeit StorageEngines Storage Engines CREATE TABLE tablename (...) ENGINE=... Local Storage INNODB/XtraDB MYISAM Aria PBXT OQGraph... Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 8 / 34
Weite Welt Datenredundanz/Verfügbarkeit StorageEngines CREATE TABLE tablename (...) ENGINE=... Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 9 / 34
Datenredundanz/Verfügbarkeit StorageEngines Network Storage FedratedX SpiderSE NDB (Network Database) CREATE TABLE tbl a( col a int, col b int, PRIMARY KEY(col a) ) ENGINE = FEDERATED CONNECTION mysql://ich:auch@10.10.10.24/db/tbl a ; Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 10 / 34
Datenredundanz/Verfügbarkeit StorageEngines Network Storage FedratedX SpiderSE NDB (Network Database) CREATE TABLE tbl a( col a int, col b int, PRIMARY KEY(col a)) ENGINE = SPIDER CONNECTION table tbl a, user ich, password auch PARTITION BY RANGE( col a ) ( PARTITION p1 VALUES LESS THAN (1000) COMMENT host 192.168.178.25, PARTITION p2 VALUES LESS THAN (2000) COMMENT host 192.168.178.26, PARTITION p3 VALUES LESS THAN (MAXVALUE) COMMENT host 192.168.178.27 ); Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 10 / 34
Datenredundanz/Verfügbarkeit StorageEngines Network Storage FedratedX SpiderSE NDB (Network Database) CREATE TABLE imha (... ) ENGINE=NDB; Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 10 / 34
MySQL Cluster Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 11 / 34
MySQL Cluster Network Storage Speicher Engine Shared Nothing HA: 99,999% ACID READ COMMITTED Row Locking Two Phase Commit Keine FK Key/Value Applikation! ALTER TABLE... ENGINE=NDB Hash-Partitionierung/Sharding Durchsatz, Parallelität Scaleout Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 12 / 34
MySQL Cluster Komponenten Komponenten ndb(mt)d mgmd MySQL/API Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 13 / 34
MySQL Cluster Komponenten Komponenten ndb(mt)d mgmd MySQL/API Datenknoten Partitionierung/Redundanz 2-Phase-Commit Failover max. 48 Nodes Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 13 / 34
MySQL Cluster Komponenten Komponenten ndb(mt)d mgmd MySQL/API Managementdeamon/knoten: Konfiguration Logging Arbitrator Managementinterface Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 13 / 34
MySQL Cluster Komponenten Komponenten ndb(mt)d mgmd MySQL/API API Kommunikation via ndb-api ENGINE=NDB Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 13 / 34
MySQL Cluster NoOfReplicas Implementing HA ndb(mt)d NoOfReplicas Primary lead Failover Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 14 / 34
MySQL Cluster 2PC Impelenting HA: 2PC Datenkonsitenz a la 2PC TransactionCoordinator Prepare Commit Latenz Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 15 / 34
MySQL Cluster 2PC Impelenting HA: 2PC 100.000 Inserts: InnoDB NDB 0m7.911s 1m47.806s Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 15 / 34
MySQL Cluster Changing Data INSERT/UPDATE Changing Data Parallel Inserts Parallel Updates Multi Data-Nodes Multi Api-Nodes! Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 16 / 34
MySQL Cluster SELECTs SELECT NDB SELECTs Key Lookups Nested Loop Join Push-Down-Join (SPJ) Parallel Scans Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 17 / 34
MySQL Cluster SELECTs a SELECT id2 FROM a WHERE id=@a; 100.000 x uniform Query InnoDB 5.5.20 ndb 7.1.0 ndb 7.2.5 a 8.526s 29.290s 29.290s Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 18 / 34
MySQL Cluster SELECTs a SELECT id2 FROM a WHERE id=@a; 100.000 x uniform b SELECT COUNT(*) FROM a JOIN b using (id); Query InnoDB 5.5.20 ndb 7.1.0 ndb 7.2.5 a 8.526s 29.290s 29.290s b 0.130s 16.290s SPJ 0.750s Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 18 / 34
MySQL Cluster SELECTs a SELECT id2 FROM a WHERE id=@a; 100.000 x uniform b SELECT COUNT(*) FROM a JOIN b using (id); c SELECT COUNT(*) FROM a JOIN b using (id) where a.id=100; 100.000x Query InnoDB 5.5.20 ndb 7.1.0 ndb 7.2.5 a 8.526s 29.290s 29.290s b 0.130s 16.290s 0.750s c 8.131s 40.285s 44.043s Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 18 / 34
MySQL Cluster SELECTs a SELECT id2 FROM a WHERE id=@a; 100.000 x uniform b SELECT COUNT(*) FROM a JOIN b using (id); c SELECT COUNT(*) FROM a JOIN b using (id) where a.id=100; 100.000x d SELECT COUNT(id2) FROM a JOIN b using (id2) where a.id=1000; Query InnoDB 5.5.20 ndb 7.1.0 ndb 7.2.5 a 8.526s 29.290s 29.290s b 0.130s 16.290s 0.750s c 8.131s 40.285s 44.043s d 34.844s 560.717s 559.317s Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 18 / 34
MySQL Cluster SELECTs a SELECT id2 FROM a WHERE id=@a; 100.000 x uniform b SELECT COUNT(*) FROM a JOIN b using (id); c SELECT COUNT(*) FROM a JOIN b using (id) where a.id=100; 100.000x d SELECT COUNT(id2) FROM a JOIN b using (id2) where a.id=1000; Query InnoDB 5.5.20 ndb 7.1.0 ndb 7.2.5 a 8.526s 29.290s 29.290s b 0.130s 16.290s 0.750s c 8.131s 40.285s 44.043s d 34.844s 560.717s 559.317s Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 18 / 34
MySQL Cluster Making the whole Cluster HA Begrenztes HA HA der MySQLd? Loadbalancer Connectoren Pacemaker Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 19 / 34
NDB best used for: UseCases Viele kleine Trans. Key/Value Lookups HA Hoher Durchsatz Telco Gaming... Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 20 / 34
Memory Memory Only NDB Speicheraufteilung IndexMemory DataMemory Hard Limit UNIQUE/PK Indices Indices und Data Pages stick to table Kein Auslagern Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 21 / 34
Memory Memory Only NDB Speicheraufteilung IndexMemory DataMemory Hard Limit UNIQUE/PK Indices Indices und Data Pages stick to table Kein Auslagern Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 21 / 34
Memory Memory Only NDB Speicheraufteilung IndexMemory DataMemory Hard Limit UNIQUE/PK Indices Indices und Data Pages stick to table Kein Auslagern Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 21 / 34
Memory Fixed Arrays Fröhliches Konfigurieren IndexMemory PK, UNIQUE DataMemory Data, (Ordered) Indices, StringMemory MaxNoOfOrderedIndexes MaxNoOfAttributes MaxNoOfUniqueHashIndexes MaxNoOfConcurrentOperations ndb config -f: -q Id,MaxNoOfConcurrentOperations Out of string memory,...permanent error: Schema error Maximale Zahl der Ordered Indices Max. Tabellen, Indices, Columns etc. Max. Unique Indices die nicht PK sind. Operation Records in TC1KB Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 22 / 34
Memory Memory hitting Disk Und was ist mit Disk? Disk IO! MySQL Cluster schreibt in DiskCheckpointSpeed DataMemory (als LCP) mit TimeBetweenLocalCheckpoints Abstand auf die Disk. Das Redo Log (NoOfFragmentLoges * FragmentLogFileSize) muss groß genug sein, um die Änderungen während 2x LCP zu speichern. Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 23 / 34
Konfiguration MySQL Cluster: Konfiguration config.ini Verwaltet vom mgmd Definiert Mitglieder Konfiguriert Teilnehmer Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 24 / 34
StartUp Konfiguration host1# ndb_mgmd [--initial] --config-file=/tmp/config.ini host2# ndbd [--initial] --ndb-connectstring=host1 host3# ndbd [--initial] --ndb-connectstring=host1 host4# mysqld --ndb-connectstring=host1 Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 25 / 34
config.ini Konfiguration [NDB_MGMD] HostName = 10.10.10.23 NodeID = 1 [NDBD DEFAULT] NoOfReplicas = 2 DataDir = /data/cluster IndexMemory = 20M DataMemory = 100M [NDBD] NodeID = 21 HostName = 10.10.10.21 [NDBD] NodeID = 22 HostName = 10.10.10.22 [mysqld] NodeID = 60 HostName = 10.10.10.20 [mysqld] NodeID = 61 HostName = 10.10.10.24 Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 26 / 34
config.ini Konfiguration [NDB_MGMD] HostName = 10.10.10.23 NodeID = 1 [NDBD DEFAULT] NoOfReplicas = 2 DataDir = /data/cluster IndexMemory = 20M DataMemory = 100M NoOfFragmentLogFiles = 32 # 32 * (16M*4) TimeBetweenLocalCheckpoints = 20 # 20=4MB,21=8MB,22=16MB TimeBetweenGlobalCheckpoints = 2000 #ndbmtd: MaxNoOfExecutionThreads # cores value # 2 2 -> 1LQH # 4 4 -> 2LQH # 8 8 -> 4LQH # Partitionen= 8*LQH # Partition = 46.137.488 Rows [NDBD] NodeID = 21 HostName = 10.10.10.21 [NDBD] NodeID = 22 HostName = 10.10.10.22 [mysqld] NodeID = 60 HostName = 10.10.10.20 Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 27 / 34
Prozesskonfig in my.cnf Konfiguration [mysqld] ndbcluster ndb-cluster-connection-pool = 1 [mysql_cluster] ndb-connectstring = 10.10.10.23 [ndb_mgmd] configdir = /data/cluster Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 28 / 34
Maintenance Rolling Restart Rolling Restarts/Upgrades Cluster muss oft restartet werden :( Service soll HA sein. auch bei Upgrades! Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 29 / 34
Maintenance Rolling Restart Rolling Restarts/Upgrades Cluster muss oft restartet werden :( Service soll HA sein. auch bei Upgrades! Solution: Rolling Rolling Rolling... Rolling Restart hält die Datennodes hochverfügbar. Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 29 / 34
Maintenance Rolling Restart Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 30 / 34
Maintenance Rolling Restart Online Operations ROLLING RESTART ADD INDEX DROP INDEX ADD COLUMN BACKUP ADD/CREATE NODEGROUP REORGANIZE PARTITION SW-UPGRADE Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 31 / 34
Ignored Lost TableSpace (WAN) Replication memcached-api mod ndb... Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 32 / 34
Maintenance Wofür kann man die Lösung gut gebrauchen? Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 33 / 34
Maintenance Ende Gelände Morgen Galera Cluster: (fast) alles besser! Erkan Yanar erkan.yanar@linsenraum.de... linsenraum.de/erkules www.xing.com/profile/erkan Yanar Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 34 / 34