Mysql Cluster Deployment Best Practices
Mysql Cluster Deployment Best Practices
http://www.mysql.com/customers/cluster/
Suitable Applications
• Good fit
• OLTP apps with short running queries
• Application with realtime characteristics and requirements
• A lot of concurrent requests
• Write intensive applications
• Typically the following are a poor fit:
• Heavy reporting type (OLAP)
• Data Warehouse
Realtime Apps
Reporting System
App Servers
• Replication
SQL Layer Complex
• Mysqldump reporting queries
Storage • ndb_restore
Layer → csv
→ LOAD DATA INFILE
Data Collection/Aggregation
Architecture
Aggregate data from peripheral systems (sources)
HA Shard Catalog
• Shard Catalog stores user_id → shard_id and other indexes/
mappings (user_id → friend_id:shard_id).
• Shard Catalog can grow online
Storage
Layer
MySQL Cluster compared to InnoDB /
Other databases
• Every database has its characteristics
• MySQL Cluster is designed for
• Short, but many, parallell transactions
• High volume
• High degree of concurrency
• High availability (99.999%)
• Let’s look how MySQL Cluster compares to Innodb (and most other
traditional databases)
Load Balancer(s)
Redundant switches
S Q L + M g m S Q L + M g m
+AppServer +AppServer
+WebServer... +WebServer...
Bonding
NDBMTD NDBMTD
Hardware Selection : Network I
• Dedicated >= 1Gb/s networking
• On Oracle Sun CMT it may be necessary to bond 4 or more NICs
together because typically many data nodes are on the same
physical host.
• Prevent network failures (NIC x 2, Bonding, dual switches)
• Use dedicated network for cluster communication
• Put Data nodes ansd MySQL Servers on e.g 10.0.1.0 network and
let MySQL listen on a “public” interface.
• No security layer to management node
• Enable port 1186 access only from cluster nodes and
administrators
Hardware Selection : Network II
• The speed of the network greatly affects the performance
• ping <hostname>
• If ping time is > 0.200ms check (on 1Gig-E)
• routes – do you have >1 switch hop from one data
node to another?
• Do you have full duplex?
• NAPI enabled (should be)?
• On my machines I have 0.150ms (on 1Gig-E), but if
the switches are good then 0.080-0.100 is also
possible
• JUMBO frames, you can try to enable this but I have not
seen any noticeable improvements with this.
Hardware Selection - RAM & CPU
• Storage Layer (Data nodes)
• One data node can (7.0+) use 8 cores
• CPU: 2 x 4 core (Nehalem works really well). Faster CPU → faster
processing of messages.
• RAM: As much as you need
• a 10GB data set will require 20GB of RAM (because of
redundancy
• Each node will then need 2 x 10 / # of data nodes. (2 data nodes
→ 10GB of RAM → 16GB RAM is good
• SQL Layer (MySQL Servers)
• CPU: 2 – 16 cores
• RAM: Not as important – 4GB enough (depends on connections and
buffers)
Hardware Selection - Disk Subsystem
low-end mid-end high-end
LCP UNDOLOG
REDOLOG (REDO LOG)
UNDOLOG
TABLESPACE 1
TABLESPACE
TABLESPACE 2
2 x SAS 10KRPM (preferably)
(REDO LOG / UNDO LOG)
LCP
4 x SAS 10-15KRPM (preferably)
• Use High-end for heavy read / write workloads (1000's of 10KB records per sec) of data
(e.g Content Delivery platforms)
• SSD for TABLESPACE is also interesting – not much experience of this yet
• Having TABLESPACE on separate disk is good for read performance
• Enable WRITE_CACHE on devices
Disk Space Usage
Application layer
SQL layer
Storage layer
Synchronous Replication #give explicit nodeid in config.ini:
[mysqld]
id=8
hostname=X
Admin layer # in my.cnf:
ndb_connectstring=”nodeid=8;x,y”
ndb_cluster_connnection_pool=1
Administration Layer
• Modifying Schema is NOT online when you perform
the following:
• Rename a table
• Change data type
• Change storage size
• Drop column
• Rename column
• Add/Drop a PRIMARY KEY
• Altering a 1GB table requires 1GB of free
DataMemory (copying)
• Online (and ok to do with transactions ongoing):
• Add column (ALTER ONLINE …)
• CREATE INDEX
• Online add node
Admistration Layer
• ALTER TABLE etc (non-online DDL) performed on Admin
Layer!
• 1. Block traffic from
SQL layer to data nodes
App layer • ndb_mgm>
ENTER SINGLE USER
MODE 8
• Only Admin mysqld is now
SQL layer connected to the data nodes
STOP!! No Traffic Now! • Or do LOCK TABLES on SQL
Layer!
• 2. Perform heavy ALTER on
Storage
admin layer
layer
Synchronous Replication • 3. Allow traffic from SQL layer
to data nodes
#give explicit nodeid in config.ini
[mysqld]
• ndb_mgm> EXIT SINGLE
id=8
USER MODE
hostname=X
Admin layer # in my.cnf:
• Or do UNLOCK TABLES on
ndb_connectstring=”nodeid=8;x,y”
ndb_cluster_connnection_pool=1
the whole SQL Layer!
Admistration Layer
• You can also set up MySQL Replication from Admin layer to the
SQL layer
• Replicate mysql database
• GRANT, SPROCs etc will be replicated.
• Keeps the SQL Layer aligned¨
App layer
SQL layer
Storage layer
Synchronous Replication
Admin layer
binlog_do_db=mysql
Online Upgrades
• Change Online
• OS, SW version (7.0.x → 7.2.x)
• Configuration( e.g, increase DM, IM, Buffers, redo log, [mysqld] slots
etc
• Hardware (upgrade more RAM etc)
• These procedures requires a Rolling Restart
• Change config.ini, copy it over to all ndb_mgmd
• Stop ndb_mgmd , start ndb_mgmd with --reload
• Restart one data node at a time
• Restart one mysqld at a time
• Adding data nodes (7.0 and above)
• Adding MySQL Servers
• Make sure you have free [mysqld] slots
• Start the new mysqld
Scaling
• One data node can (7.0+) use up to 8 cores
• CPU: Reaches bottleneck at about 370% CPU
• add another node group (to spread load)
• DISK: iostat -kx 1 : Check util; await, svctime etc..
• Add disks
• NETWORK: iftop (linux)
• add another node group (to spread load)
• MySQL Server
• CPU: About the same – 300-500%
• Add another MySQL Server to offload query processing
• DISK: Should not be a factor if you are using only NDB tables
• NETWORK:
• Add another MySQL Server to offload query processing
Monitoring
• Mandatory to monitor
• CPU/Network/Memory usage
• Disk capacity (I/O) usage
• Network latency between nodes
• Node status ...
• Used Index/Data Memory
• www.severalnines.com/cmon - monitors data nodes and mysql
servers
• New in MySQL Cluster 7.1 :
• NDB$INFO Table in INFORMATION_SCHEMA
• Check node status
• Check buffer status etc
• Statistics
Best Practice : Primary Keys
• To avoid problems with
• Cluster 2 Cluster replication
• Recovery
• Application behavior (KEY NOT FOUND.. etc)
• ALWAYS DEFINE A PRIMARY KEY ON THE TABLE!
• A hidden PRIMARY KEY is added if no PK is specified. BUT..
• .. NOT recommended
• The hidden primary key is for example not replicated (between
Clusters)!!
• There are problems in this area, so avoid the problems!
• So always, at least have
id BIGINT AUTO_INCREMENT PRIMARY KEY
• Even if you don't “need” it for you applications
Best Practice : Query Cache
• Don't enable the Query Cache!
• It is very expensive to invalidate over X mysql servers
• A write on one server will force the others to purge their
cache.
• If you have tables that are read only (or change very
seldom):
• my.cnf:
• query_cache_type=2 (ON DEMAND)
• SELECT SQL_CACHE <cols> .. FROM table;
• Cache only queries with SQL_CACHE
• This can be good for STATIC data
Best Practice : Large Transactions
• Remember MySQL Cluster is designed for many and
short transactions
• You are recommended to UPDATE / DELETE in small chunks
• Use LIMIT 10000 until all records are UPDATED/DELETED
• MaxNoOfConcurrentOperations sets the upper
limit for how many records than can be modified
simultaneously on one data node.
• MaxNoOfConcurrentOperations=1000000 will use 1GB
of RAM
• Despite being possible, we recommend DELETE/UPDATE in
smaller chunks.
Best Practice : Table logging