MySQL Cluster: HA als StorageEngine - · PDF fileWhat About Hochverfugbarkeit mit MySQL Topic...
Transcript of MySQL Cluster: HA als StorageEngine - · PDF fileWhat About Hochverfugbarkeit mit MySQL Topic...
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
Hochverfugbarkeit mit MySQL
Topic
Wir wollen Hochverfugbarkeit
Daten
Service
Und wie erreichen?
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 2 / 34
Datenredundanz/Verfugbarkeit Replication
Losungsmoglichkeiten:
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/Verfugbarkeit Replication
Losungsmoglichkeiten:
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/Verfugbarkeit Replication
Losungsmoglichkeiten:
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/Verfugbarkeit Replication
Losungsmoglichkeiten:
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/Verfugbarkeit Replication
Sicherheit semisync vs. Performance async
Failover
Daten
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 4 / 34
Datenredundanz/Verfugbarkeit 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/Verfugbarkeit 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/Verfugbarkeit 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/Verfugbarkeit 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/Verfugbarkeit StorageEngines
Local Storage Engine
CREATE TABLE tablename (...) ENGINE=...
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 7 / 34
Datenredundanz/Verfugbarkeit 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
Datenredundanz/Verfugbarkeit StorageEngines
Weite Welt
CREATE TABLE tablename (...) ENGINE=...
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 9 / 34
Datenredundanz/Verfugbarkeit StorageEngines
Network Storage
FedratedX
SpiderSE
NDB (Network Database)
CREATE TABLE tbl a(col a int,col b int,PRIMARY KEY(col a))ENGINE = FEDERATEDCONNECTION’mysql://ich:[email protected]/db/tbl a’;
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 10 / 34
Datenredundanz/Verfugbarkeit StorageEngines
Network Storage
FedratedX
SpiderSE
NDB (Network Database)
CREATE TABLE tbl a( col a int, col b int, PRIMARY KEY(col a))ENGINE = SPIDERCONNECTION ’ 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/Verfugbarkeit 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, Parallelitat
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 0m7.911s
NDB 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
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.750sc 8.131s 40.285s 44.043sd 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.290sb 0.130s 16.290s SPJ 0.750s
c 8.131s 40.285s 44.043sd 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.290sb 0.130s 16.290s 0.750sc 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.290sb 0.130s 16.290s 0.750sc 8.131s 40.285s 44.043sd 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.290sb 0.130s 16.290s 0.750sc 8.131s 40.285s 44.043sd 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
Frohliches Konfigurieren
IndexMemory PK, UNIQUE
DataMemory Data, (Ordered) Indices,
StringMemory Out of string memory, ...Permanent error: Schema error
MaxNoOfOrderedIndexes Maximale Zahl der Ordered Indices
MaxNoOfAttributes Max. Tabellen, Indices, Columns etc.
MaxNoOfUniqueHashIndexes Max. Unique Indices die nicht PK sind.
MaxNoOfConcurrentOperations Operation Records in TC1KB
ndb config -f: -q Id,MaxNoOfConcurrentOperations
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 inDiskCheckpointSpeed DataMemory (alsLCP) mit TimeBetweenLocalCheckpointsAbstand auf die Disk.
Das Redo Log (NoOfFragmentLoges *
FragmentLogFileSize) muss groß genug
sein, um die Anderungen wahrend 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
Konfiguration
StartUp
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
Konfiguration
config.ini
[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
Konfiguration
config.ini
[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
[mysqld]
NodeID = 61
HostName = 10.10.10.24
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 27 / 34
Konfiguration
Prozesskonfig in my.cnf
[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!
Solution: Rolling Rolling Rolling . . .
Rolling Restart halt die Datennodes hochverfugbar.
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 halt die Datennodes hochverfugbar.
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/CREATENODEGROUP
REORGANIZEPARTITION
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
Wofur kann man die Losung gut gebrauchen?
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 33 / 34
Maintenance
Ende Gelande
Morgen Galera Cluster: (fast) alles besser!
Erkan [email protected]. . .linsenraum.de/erkuleswww.xing.com/profile/Erkan Yanar
Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 34 / 34