SlideShare a Scribd company logo
Highly Available PHP/MySQL
Applications with mysqlnd
Jervin Real
PHP-UGPH, June 2014
Highly Available Applications
• … how much your application is able to serve its end users
within a time period
Highly Available Applications
• … how much your application is able to serve its end users
within a time period
• Usually referred to as 99[..]% uptime
Highly Available Applications
• … how much your application is able to serve its end users
within a time period
• Usually referred to as 99[..]% uptime
• It actually depends on whose perspective
Highly Available Applications
Keep PHP<>MySQL downtime to a minimum
WTF are you saying? I’m a “devloper"!
No no no no no no!
Lack of knowledge
Limited resources
How?
MySQL
MySQL HA
• MySQL Native Replication (Single Primary)
MySQL HA
• MySQL Native Replication (Single Primary)
• MySQL Native Replication (Multi-Master)
MySQL HA
• MySQL Native Replication (Single Primary)
• MySQL Native Replication (Multi-Master)
• MySQL NDB Cluster
MySQL HA
• MySQL Native Replication (Single Primary)
• MySQL Native Replication (Multi-Master)
• MySQL NDB Cluster
• Galera based
MySQL HA
• MySQL Native Replication (Single Primary)
• MySQL Native Replication (Multi-Master)
• MySQL NDB Cluster
• Galera based
• Percona XtraDB Cluster
• MariaDB Galera Cluster
• MySQL+Galera
MySQL HA
• MySQL Native Replication (Single Primary)
• MySQL Native Replication (Multi-Master)
• MySQL NDB Cluster
• Galera based
• Percona XtraDB Cluster
• MariaDB Galera Cluster
• MySQL+Galera
• Tungsten Replicator
MySQL HA
• MySQL Native Replication (Single Primary)
• MySQL Native Replication (Multi-Master)
• MySQL NDB Cluster
• Galera based
• Percona XtraDB Cluster
• MariaDB Galera Cluster
• MySQL+Galera
• Tungsten Replicator
• … and many more
• MySQL Master HA
MySQL HA (External Support)
MySQL HA (External Support)
• MySQL Master HA
• Percona Replication Manager (Pacemaker)
MySQL HA (External Support)
• MySQL Master HA
• Percona Replication Manager (Pacemaker)
• Haproxy
MySQL HA (External Support)
• MySQL Master HA
• Percona Replication Manager (Pacemaker)
• Haproxy
• Load Balancers
MySQL HA (External Support)
• MySQL Master HA
• Percona Replication Manager (Pacemaker)
• Haproxy
• Load Balancers
• MySQL Multi Master
MySQL HA (External Support)
• MySQL Master HA
• Percona Replication Manager (Pacemaker)
• Haproxy
• Load Balancers
• MySQL Multi Master
PHP (Application)
HA via Application
• Traditionally complex to implement
• Unnecessary overhead
• No single point of failure
mysqlnd
mysqlnd
• MySQL Native Driver
mysqlnd
• MySQL Native Driver
• Written C (as all extensions should be!)
mysqlnd
• MySQL Native Driver
• Written C (as all extensions should be!)
• MySQL Client Libraries no more
mysqlnd
• MySQL Native Driver
• Written C (as all extensions should be!)
• MySQL Client Libraries no more
• Smaller memory footprint in many cases
mysqlnd
• MySQL Native Driver
• Written C (as all extensions should be!)
• MySQL Client Libraries no more
• Smaller memory footprint in many cases
• Performance statistics
mysqlnd
• MySQL Native Driver
• Written C (as all extensions should be!)
• MySQL Client Libraries no more
• Smaller memory footprint in many cases
• Performance statistics
• Compression
mysqlnd
• MySQL Native Driver
• Written C (as all extensions should be!)
• MySQL Client Libraries no more
• Smaller memory footprint in many cases
• Performance statistics
• Compression
• Plugins
mysqlnd Plugins
• mysqlnd_qc - query result cache
mysqlnd Plugins
• mysqlnd_qc - query result cache
• mysqlnd_mux - connection multiplexing
mysqlnd Plugins
• mysqlnd_qc - query result cache
• mysqlnd_mux - connection multiplexing
• mysqlnd_uh - user handler
mysqlnd Plugins
• mysqlnd_qc - query result cache
• mysqlnd_mux - connection multiplexing
• mysqlnd_uh - user handler
• mysqlnd_memcache - Memcache (MySQL interface)
mysqlnd Plugins
• mysqlnd_qc - query result cache
• mysqlnd_mux - connection multiplexing
• mysqlnd_uh - user handler
• mysqlnd_memcache - Memcache (MySQL interface)
• mysqlnd_ms - replication and load balancing
mysqlnd_ms
mysqlnd_ms Supported Clusters
• All previously mentioned with few limitations
Limitations (Master-Slave)
• Master is a single point of failure
• Need external help for failover
• . . or, shoot the other node in the foot, this is still HA!
Limitations (Master-Slave)
Limitations (Master-Slave)
Limitations (Master-Slave)
Limitations (Master-Master)
• Risky, even if you try segregating writes per master you
can still lose data
Limitations (Master-Master)
db1
db1
Limitations (Master-Master)
db1
db1
Limitations (Master-Master)
db2
db1
Limitations (Master-Master)
db1 + db2
• Not good if sync_binlog = 0 AND/OR innodb_flush_log_at_trx_commit <> 1
• Not really recommended in general, use appropriate technologies
instead
Some More Limitations
• Lazy connections is on by default
• Each request will create its own connections when needed,
persistent connections may be required
• https://bugs.php.net/bug.php?id=67564
• https://bugs.php.net/bug.php?id=67565
• https://bugs.php.net/bug.php?id=67574
• Be careful with multi-statements and read-write splitting,
they are likely to be executed on slave!
SELECT  *  FROM  tbl;  DELETE  FROM  tbl;
• Single Primary - one writable node
• Multiple Primary - all nodes writable
mysqlnd_ms Supported Clusters
• Master-Slave
mysqlnd_ms Supported Clusters
• Master-Slave
• Declare 2 clusters
mysqlnd_ms Supported Clusters
• Master-Slave
• Declare 2 clusters
• When primary fails, mark it permanently dead and switch
to secondary
mysqlnd_ms Supported Clusters
• Master-Slave
• Declare 2 clusters
• When primary fails, mark
it permanently dead and
switch to secondary
{  
    "primary":  {  
        "master":  {  
            "master_1":  {  
                "host":  "127.0.0.1",  
                "port":  33001  
            }  
        },  
        "slave":  {  
            "slave_0":  {  
                "host":  "127.0.0.1",  
                "port":  33002  
            }  
        }  
    },  
    "standby":  {  
        "master":  {  
            "master_1":  {  
                "host":  "127.0.0.1",  
                "port":  33002  
            }  
        },  
        "slave":  {  
        }  
    }  
}
mysqlnd_ms Supported Clusters
• Master-Slave
• Declare 2 clusters
• When primary fails, mark
it permanently dead and
switch to secondary
• Works better with
master-master!
{  
    "primary":  {  
        "master":  {  
            "master_1":  {  
                "host":  "127.0.0.1",  
                "port":  33001  
            }  
        },  
        "slave":  {  
            "slave_0":  {  
                "host":  "127.0.0.1",  
                "port":  33002  
            }  
        }  
    },  
    "standby":  {  
        "master":  {  
            "master_1":  {  
                "host":  "127.0.0.1",  
                "port":  33002  
            }  
        },  
        "slave":  {  
        }  
    }  
}
mysqlnd_ms Supported Clusters
• Master-Slave Demo
• https://github.com/dotmanila/demo-me/phpugph201407/
• master-slave.ini
• mysqlnd_ms_ms.ini
• master-slave.php
mysqlnd_ms Supported Clusters
• Multi-Masters (NDB, Galera)
• Declare all nodes as masters
mysqlnd_ms Supported Clusters
• Multi-Masters (NDB, Galera)
mysqlnd_ms Supported Clusters
• Multi-Masters (NDB,
Galera)
• Declare all nodes as
masters
mysqlnd_ms Supported Clusters
  {  
      "primary":  {  
          "master":  {  
              "master_1":  {  
                  "host":  "192.168.56.44",  
                  "port":  "3306"  
              },  
              "master_2":  {  
                  "host":  "192.168.56.43",  
                  "port":  "3306"  
              },  
              "master_3":  {  
                  "host":  "192.168.56.42",  
                  "port":  "3306"  
              }  
          },  
          "slave":  {  },  
          "filters":  {  "random":  [  ]  },  
          "failover":  {    
              "strategy":  "loop_before_master",    
              "remember_failed":  true    
          }  
      }  
  }
• Multi-Masters (NDB,
Galera)
mysqlnd_ms Supported Clusters
  {  
      "primary":  {  
          "master":  {  
              "master_1":  {  
                  "host":  "192.168.56.44",  
                  "port":  "3306"  
              },  
              "master_2":  {  
                  "host":  "192.168.56.43",  
                  "port":  "3306"  
              },  
              "master_3":  {  
                  "host":  "192.168.56.42",  
                  "port":  "3306"  
              }  
          },  
          "slave":  {  },  
          "filters":  {  "random":  [  ]  },  
          "failover":  {    
              "strategy":  "loop_before_master",    
              "remember_failed":  true    
          }  
      }  
  }
• Multi-Masters (NDB,
Galera)
• Declare all nodes as
masters
• roundrobin - single node
writer (first node in
config)
mysqlnd_ms Supported Clusters
  {  
      "primary":  {  
          "master":  {  
              "master_1":  {  
                  "host":  "192.168.56.44",  
                  "port":  "3306"  
              },  
              "master_2":  {  
                  "host":  "192.168.56.43",  
                  "port":  "3306"  
              },  
              "master_3":  {  
                  "host":  "192.168.56.42",  
                  "port":  "3306"  
              }  
          },  
          "slave":  {  },  
          "filters":  {  "random":  [  ]  },  
          "failover":  {    
              "strategy":  "loop_before_master",    
              "remember_failed":  true    
          }  
      }  
  }
• Multi-Masters (NDB,
Galera)
• Declare all nodes as
masters
• roundrobin - single node
writer (first node in
config)
• random - all nodes
mysqlnd_ms Supported Clusters
  {  
      "primary":  {  
          "master":  {  
              "master_1":  {  
                  "host":  "192.168.56.44",  
                  "port":  "3306"  
              },  
              "master_2":  {  
                  "host":  "192.168.56.43",  
                  "port":  "3306"  
              },  
              "master_3":  {  
                  "host":  "192.168.56.42",  
                  "port":  "3306"  
              }  
          },  
          "slave":  {  },  
          "filters":  {  "random":  [  ]  },  
          "failover":  {    
              "strategy":  "loop_before_master",    
              "remember_failed":  true    
          }  
      }  
  }
• Multi-Masters (NDB,
Galera)
• Declare all nodes as
masters
• roundrobin - single node
writer (first node in
config)
• random - all nodes
• remember_failed is not
what it says it is
  {  
      "primary":  {  
          "master":  {  
              "master_1":  {  
                  "host":  "192.168.56.44",  
                  "port":  "3306"  
              },  
              "master_2":  {  
                  "host":  "192.168.56.43",  
                  "port":  "3306"  
              },  
              "master_3":  {  
                  "host":  "192.168.56.42",  
                  "port":  "3306"  
              }  
          },  
          "slave":  {  },  
          "filters":  {  "random":  [  ]  },  
          "failover":  {    
              "strategy":  "loop_before_master",    
              "remember_failed":  true    
          }  
      }  
  }
mysqlnd_ms Supported Clusters
• Master-Master Demo
• https://github.com/dotmanila/demo-me/phpugph201407/
• master-master.ini
• mysqlnd_ms_mm.ini
• master-master.php
mysqlnd_ms Supported Clusters
Am I Using mysqlnd? (rpm)
[revin@forge  ~]$  rpm  -­‐q  php-­‐mysql.x86_64  -­‐-­‐requires  
[…]  
libmysqlclient_r.so.16()(64bit)  
libmysqlclient_r.so.16(libmysqlclient_16)(64bit)  
libmysqlclient.so.16()(64bit)  
libmysqlclient.so.16(libmysqlclient_16)(64bit)  
[…]
[revin@forge  ~]$  rpm  -­‐q  php-­‐mysqlnd.x86_64  -­‐-­‐requires  
php-­‐pdo(x86-­‐64)  =  5.4.30-­‐36.el6.art  
rpmlib(VersionedDependencies)  <=  3.0.3-­‐1  
rpmlib(FileDigests)  <=  4.6.0-­‐1  
rpmlib(PayloadFilesHavePrefix)  <=  4.0-­‐1  
rpmlib(CompressedFileNames)  <=  3.0.4-­‐1  
libc.so.6()(64bit)  
libc.so.6(GLIBC_2.2.5)(64bit)  
libc.so.6(GLIBC_2.3.4)(64bit)  
libc.so.6(GLIBC_2.4)(64bit)  
libpthread.so.0()(64bit)  
libpthread.so.0(GLIBC_2.2.5)(64bit)  
rtld(GNU_HASH)  
rpmlib(PayloadIsXz)  <=  5.2-­‐1
Am I Using mysqlnd? (rpm)
[revin@forge  ~]$  php  -­‐i  
[…]  
!
mysql  
!
MySQL  Support  =>  enabled  
Active  Persistent  Links  =>  0  
Active  Links  =>  0  
Client  API  version  =>  5.1.59  
MYSQL_MODULE_TYPE  =>  external  
MYSQL_SOCKET  =>  /var/lib/mysql/mysql.sock  
MYSQL_INCLUDE  =>  -­‐I/usr/include/mysql  
MYSQL_LIBS  =>  -­‐L/usr/lib64/mysql  -­‐lmysqlclient
Am I Using mysqlnd? (phpinfo)
[revin@forge  ~]$  php  -­‐i  
[…]  
!
mysqlnd  
!
mysqlnd  =>  enabled  
Version  =>  mysqlnd  5.0.10  -­‐  20111026  -­‐  $Id:  c85105d7c6f7d70d609bb4c000257868a40840ab  $  
Compression  =>  supported  
SSL  =>  supported  
Command  buffer  size  =>  4096  
Read  buffer  size  =>  32768  
Read  timeout  =>  31536000  
Collecting  statistics  =>  Yes  
Collecting  memory  statistics  =>  No  
Tracing  =>  n/a  
Loaded  plugins  =>  mysqlnd,example,debug_trace,  
   auth_plugin_mysql_native_password,  
   auth_plugin_mysql_clear_password  
API  Extensions  =>  mysql,mysqli,pdo_mysql
Am I Using mysqlnd? (phpinfo)
Conclusion
• Yes, we can achieve HA with mysqlnd_ms
• Not for the faint of heart
• Do not rely on for HA (writes) on critical production
systems
• Good for intended use case, rw-splitting
Highly Available MySQL/PHP Applications with mysqlnd
Q&A
• http://dotmanila.com/blog/
• http://www.mysqlperformanceblog.com/
• @dotmanila
Percona is Hiring!!
http://www.percona.com/about-us/careers/open-positions
$t  =  true  AND  false;  echo  (int)  $t;

More Related Content

PDF
Introduction to Galera
PDF
MariaDB Galera Cluster - Simple, Transparent, Highly Available
PPTX
Maria DB Galera Cluster for High Availability
PDF
High Availability with Galera Cluster - SkySQL Road Show 2013 in Berlin
PDF
Using and Benchmarking Galera in different architectures (PLUK 2012)
PDF
9 DevOps Tips for Going in Production with Galera Cluster for MySQL - Slides
ODP
MySQL HA with PaceMaker
PDF
Galera cluster for MySQL - Introduction Slides
Introduction to Galera
MariaDB Galera Cluster - Simple, Transparent, Highly Available
Maria DB Galera Cluster for High Availability
High Availability with Galera Cluster - SkySQL Road Show 2013 in Berlin
Using and Benchmarking Galera in different architectures (PLUK 2012)
9 DevOps Tips for Going in Production with Galera Cluster for MySQL - Slides
MySQL HA with PaceMaker
Galera cluster for MySQL - Introduction Slides

What's hot (20)

ODP
Built-in query caching for all PHP MySQL extensions/APIs
PDF
Best practices for MySQL High Availability
ODP
Vote NO for MySQL
PPTX
MariaDB Galera Cluster
ODP
MySQL? Load? Clustering! Balancing! PECL/mysqlnd_ms 1.4
PDF
Scaling with sync_replication using Galera and EC2
PDF
Introduction to Galera Cluster
DOCX
Master master vs master-slave database
PDF
DIY: A distributed database cluster, or: MySQL Cluster
ODP
MySQL 5.6 Global Transaction Identifier - Use case: Failover
ODP
The mysqlnd replication and load balancing plugin
PDF
Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication
ODP
The PHP mysqlnd plugin talk - plugins an alternative to MySQL Proxy
ODP
PoC: Using a Group Communication System to improve MySQL Replication HA
KEY
Intro to PECL/mysqlnd_ms (4/7/2011)
PPTX
MySQL Multi Master Replication
PDF
Galera cluster for high availability
PPT
Codership's galera cluster installation and quickstart webinar march 2016
PDF
Automate MariaDB Galera clusters deployments with Ansible
PDF
Choosing a MySQL High Availability solution - Percona Live UK 2011
Built-in query caching for all PHP MySQL extensions/APIs
Best practices for MySQL High Availability
Vote NO for MySQL
MariaDB Galera Cluster
MySQL? Load? Clustering! Balancing! PECL/mysqlnd_ms 1.4
Scaling with sync_replication using Galera and EC2
Introduction to Galera Cluster
Master master vs master-slave database
DIY: A distributed database cluster, or: MySQL Cluster
MySQL 5.6 Global Transaction Identifier - Use case: Failover
The mysqlnd replication and load balancing plugin
Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication
The PHP mysqlnd plugin talk - plugins an alternative to MySQL Proxy
PoC: Using a Group Communication System to improve MySQL Replication HA
Intro to PECL/mysqlnd_ms (4/7/2011)
MySQL Multi Master Replication
Galera cluster for high availability
Codership's galera cluster installation and quickstart webinar march 2016
Automate MariaDB Galera clusters deployments with Ansible
Choosing a MySQL High Availability solution - Percona Live UK 2011
Ad

Similar to Highly Available MySQL/PHP Applications with mysqlnd (20)

PDF
MySQL HA with Pacemaker
PDF
Linux-HA with Pacemaker
PPTX
M|18 Writing Stored Procedures in the Real World
PDF
Linux-HA with Pacemaker
PDF
OSDC 2014: Colin Charles - Automated MySQL failover with MHA: getting started...
PDF
2013 london advanced-replication
PDF
Replication MongoDB Days 2013
PDF
Automating Complex Setups with Puppet
PDF
视觉中国的MongoDB应用实践(QConBeijing2011)
PDF
Make Your Life Easier With Maatkit
KEY
Mysqlnd uh
PPTX
Designing enterprise drupal
PDF
MySQL NDB 8.0 clusters in your laptop with dbdeployer
PDF
Ensuring High Availability for Real-time Analytics featuring Boxed Ice / Serv...
PDF
MySQL Backup and Security Best Practices
PPTX
Speed up R with parallel programming in the Cloud
PDF
Automating complex infrastructures with Puppet
PDF
Buildingsocialanalyticstoolwithmongodb
KEY
Mongo scaling
PDF
MongoDB: Optimising for Performance, Scale & Analytics
MySQL HA with Pacemaker
Linux-HA with Pacemaker
M|18 Writing Stored Procedures in the Real World
Linux-HA with Pacemaker
OSDC 2014: Colin Charles - Automated MySQL failover with MHA: getting started...
2013 london advanced-replication
Replication MongoDB Days 2013
Automating Complex Setups with Puppet
视觉中国的MongoDB应用实践(QConBeijing2011)
Make Your Life Easier With Maatkit
Mysqlnd uh
Designing enterprise drupal
MySQL NDB 8.0 clusters in your laptop with dbdeployer
Ensuring High Availability for Real-time Analytics featuring Boxed Ice / Serv...
MySQL Backup and Security Best Practices
Speed up R with parallel programming in the Cloud
Automating complex infrastructures with Puppet
Buildingsocialanalyticstoolwithmongodb
Mongo scaling
MongoDB: Optimising for Performance, Scale & Analytics
Ad

More from Jervin Real (12)

PDF
Low Cost Transactional and Analytics with MySQL + Clickhouse
PDF
Low Cost Transactional and Analytics with MySQL + Clickhouse
PDF
ZFS and MySQL on Linux, the Sweet Spots
PDF
Lock, Stock and Backup: Data Guaranteed
PDF
Learning MySQL 5.7
PDF
Heterogenous Persistence
PDF
Preventing and Resolving MySQL Downtime
PDF
TokuDB - What You Need to Know
PDF
PLAM 2015 - Evolving Backups Strategy, Devploying pyxbackup
PDF
Learning by Experience, Devploying pyxbackup
PDF
AWS Users Meetup April 2015
PDF
High Performance Rails with MySQL
Low Cost Transactional and Analytics with MySQL + Clickhouse
Low Cost Transactional and Analytics with MySQL + Clickhouse
ZFS and MySQL on Linux, the Sweet Spots
Lock, Stock and Backup: Data Guaranteed
Learning MySQL 5.7
Heterogenous Persistence
Preventing and Resolving MySQL Downtime
TokuDB - What You Need to Know
PLAM 2015 - Evolving Backups Strategy, Devploying pyxbackup
Learning by Experience, Devploying pyxbackup
AWS Users Meetup April 2015
High Performance Rails with MySQL

Recently uploaded (20)

PDF
Understanding Forklifts - TECH EHS Solution
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
System and Network Administraation Chapter 3
PDF
Nekopoi APK 2025 free lastest update
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PPTX
Introduction to Artificial Intelligence
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
top salesforce developer skills in 2025.pdf
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
System and Network Administration Chapter 2
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
medical staffing services at VALiNTRY
PDF
Digital Strategies for Manufacturing Companies
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
How Creative Agencies Leverage Project Management Software.pdf
PPT
Introduction Database Management System for Course Database
Understanding Forklifts - TECH EHS Solution
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
System and Network Administraation Chapter 3
Nekopoi APK 2025 free lastest update
Design an Analysis of Algorithms II-SECS-1021-03
How to Migrate SBCGlobal Email to Yahoo Easily
Introduction to Artificial Intelligence
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
top salesforce developer skills in 2025.pdf
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Design an Analysis of Algorithms I-SECS-1021-03
Wondershare Filmora 15 Crack With Activation Key [2025
System and Network Administration Chapter 2
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
medical staffing services at VALiNTRY
Digital Strategies for Manufacturing Companies
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
How Creative Agencies Leverage Project Management Software.pdf
Introduction Database Management System for Course Database

Highly Available MySQL/PHP Applications with mysqlnd

  • 1. Highly Available PHP/MySQL Applications with mysqlnd Jervin Real PHP-UGPH, June 2014
  • 2. Highly Available Applications • … how much your application is able to serve its end users within a time period
  • 3. Highly Available Applications • … how much your application is able to serve its end users within a time period • Usually referred to as 99[..]% uptime
  • 4. Highly Available Applications • … how much your application is able to serve its end users within a time period • Usually referred to as 99[..]% uptime • It actually depends on whose perspective
  • 5. Highly Available Applications Keep PHP<>MySQL downtime to a minimum
  • 6. WTF are you saying? I’m a “devloper"! No no no no no no!
  • 10. MySQL
  • 11. MySQL HA • MySQL Native Replication (Single Primary)
  • 12. MySQL HA • MySQL Native Replication (Single Primary) • MySQL Native Replication (Multi-Master)
  • 13. MySQL HA • MySQL Native Replication (Single Primary) • MySQL Native Replication (Multi-Master) • MySQL NDB Cluster
  • 14. MySQL HA • MySQL Native Replication (Single Primary) • MySQL Native Replication (Multi-Master) • MySQL NDB Cluster • Galera based
  • 15. MySQL HA • MySQL Native Replication (Single Primary) • MySQL Native Replication (Multi-Master) • MySQL NDB Cluster • Galera based • Percona XtraDB Cluster • MariaDB Galera Cluster • MySQL+Galera
  • 16. MySQL HA • MySQL Native Replication (Single Primary) • MySQL Native Replication (Multi-Master) • MySQL NDB Cluster • Galera based • Percona XtraDB Cluster • MariaDB Galera Cluster • MySQL+Galera • Tungsten Replicator
  • 17. MySQL HA • MySQL Native Replication (Single Primary) • MySQL Native Replication (Multi-Master) • MySQL NDB Cluster • Galera based • Percona XtraDB Cluster • MariaDB Galera Cluster • MySQL+Galera • Tungsten Replicator • … and many more
  • 18. • MySQL Master HA MySQL HA (External Support)
  • 19. MySQL HA (External Support) • MySQL Master HA • Percona Replication Manager (Pacemaker)
  • 20. MySQL HA (External Support) • MySQL Master HA • Percona Replication Manager (Pacemaker) • Haproxy
  • 21. MySQL HA (External Support) • MySQL Master HA • Percona Replication Manager (Pacemaker) • Haproxy • Load Balancers
  • 22. MySQL HA (External Support) • MySQL Master HA • Percona Replication Manager (Pacemaker) • Haproxy • Load Balancers • MySQL Multi Master
  • 23. MySQL HA (External Support) • MySQL Master HA • Percona Replication Manager (Pacemaker) • Haproxy • Load Balancers • MySQL Multi Master
  • 25. HA via Application • Traditionally complex to implement • Unnecessary overhead • No single point of failure
  • 28. mysqlnd • MySQL Native Driver • Written C (as all extensions should be!)
  • 29. mysqlnd • MySQL Native Driver • Written C (as all extensions should be!) • MySQL Client Libraries no more
  • 30. mysqlnd • MySQL Native Driver • Written C (as all extensions should be!) • MySQL Client Libraries no more • Smaller memory footprint in many cases
  • 31. mysqlnd • MySQL Native Driver • Written C (as all extensions should be!) • MySQL Client Libraries no more • Smaller memory footprint in many cases • Performance statistics
  • 32. mysqlnd • MySQL Native Driver • Written C (as all extensions should be!) • MySQL Client Libraries no more • Smaller memory footprint in many cases • Performance statistics • Compression
  • 33. mysqlnd • MySQL Native Driver • Written C (as all extensions should be!) • MySQL Client Libraries no more • Smaller memory footprint in many cases • Performance statistics • Compression • Plugins
  • 34. mysqlnd Plugins • mysqlnd_qc - query result cache
  • 35. mysqlnd Plugins • mysqlnd_qc - query result cache • mysqlnd_mux - connection multiplexing
  • 36. mysqlnd Plugins • mysqlnd_qc - query result cache • mysqlnd_mux - connection multiplexing • mysqlnd_uh - user handler
  • 37. mysqlnd Plugins • mysqlnd_qc - query result cache • mysqlnd_mux - connection multiplexing • mysqlnd_uh - user handler • mysqlnd_memcache - Memcache (MySQL interface)
  • 38. mysqlnd Plugins • mysqlnd_qc - query result cache • mysqlnd_mux - connection multiplexing • mysqlnd_uh - user handler • mysqlnd_memcache - Memcache (MySQL interface) • mysqlnd_ms - replication and load balancing
  • 40. mysqlnd_ms Supported Clusters • All previously mentioned with few limitations
  • 41. Limitations (Master-Slave) • Master is a single point of failure • Need external help for failover • . . or, shoot the other node in the foot, this is still HA!
  • 45. Limitations (Master-Master) • Risky, even if you try segregating writes per master you can still lose data
  • 49. Limitations (Master-Master) db1 + db2 • Not good if sync_binlog = 0 AND/OR innodb_flush_log_at_trx_commit <> 1 • Not really recommended in general, use appropriate technologies instead
  • 50. Some More Limitations • Lazy connections is on by default • Each request will create its own connections when needed, persistent connections may be required • https://bugs.php.net/bug.php?id=67564 • https://bugs.php.net/bug.php?id=67565 • https://bugs.php.net/bug.php?id=67574 • Be careful with multi-statements and read-write splitting, they are likely to be executed on slave! SELECT  *  FROM  tbl;  DELETE  FROM  tbl;
  • 51. • Single Primary - one writable node • Multiple Primary - all nodes writable mysqlnd_ms Supported Clusters
  • 53. • Master-Slave • Declare 2 clusters mysqlnd_ms Supported Clusters
  • 54. • Master-Slave • Declare 2 clusters • When primary fails, mark it permanently dead and switch to secondary mysqlnd_ms Supported Clusters
  • 55. • Master-Slave • Declare 2 clusters • When primary fails, mark it permanently dead and switch to secondary {      "primary":  {          "master":  {              "master_1":  {                  "host":  "127.0.0.1",                  "port":  33001              }          },          "slave":  {              "slave_0":  {                  "host":  "127.0.0.1",                  "port":  33002              }          }      },      "standby":  {          "master":  {              "master_1":  {                  "host":  "127.0.0.1",                  "port":  33002              }          },          "slave":  {          }      }   } mysqlnd_ms Supported Clusters
  • 56. • Master-Slave • Declare 2 clusters • When primary fails, mark it permanently dead and switch to secondary • Works better with master-master! {      "primary":  {          "master":  {              "master_1":  {                  "host":  "127.0.0.1",                  "port":  33001              }          },          "slave":  {              "slave_0":  {                  "host":  "127.0.0.1",                  "port":  33002              }          }      },      "standby":  {          "master":  {              "master_1":  {                  "host":  "127.0.0.1",                  "port":  33002              }          },          "slave":  {          }      }   } mysqlnd_ms Supported Clusters
  • 57. • Master-Slave Demo • https://github.com/dotmanila/demo-me/phpugph201407/ • master-slave.ini • mysqlnd_ms_ms.ini • master-slave.php mysqlnd_ms Supported Clusters
  • 58. • Multi-Masters (NDB, Galera) • Declare all nodes as masters mysqlnd_ms Supported Clusters
  • 59. • Multi-Masters (NDB, Galera) mysqlnd_ms Supported Clusters
  • 60. • Multi-Masters (NDB, Galera) • Declare all nodes as masters mysqlnd_ms Supported Clusters  {        "primary":  {            "master":  {                "master_1":  {                    "host":  "192.168.56.44",                    "port":  "3306"                },                "master_2":  {                    "host":  "192.168.56.43",                    "port":  "3306"                },                "master_3":  {                    "host":  "192.168.56.42",                    "port":  "3306"                }            },            "slave":  {  },            "filters":  {  "random":  [  ]  },            "failover":  {                  "strategy":  "loop_before_master",                  "remember_failed":  true              }        }    }
  • 61. • Multi-Masters (NDB, Galera) mysqlnd_ms Supported Clusters  {        "primary":  {            "master":  {                "master_1":  {                    "host":  "192.168.56.44",                    "port":  "3306"                },                "master_2":  {                    "host":  "192.168.56.43",                    "port":  "3306"                },                "master_3":  {                    "host":  "192.168.56.42",                    "port":  "3306"                }            },            "slave":  {  },            "filters":  {  "random":  [  ]  },            "failover":  {                  "strategy":  "loop_before_master",                  "remember_failed":  true              }        }    }
  • 62. • Multi-Masters (NDB, Galera) • Declare all nodes as masters • roundrobin - single node writer (first node in config) mysqlnd_ms Supported Clusters  {        "primary":  {            "master":  {                "master_1":  {                    "host":  "192.168.56.44",                    "port":  "3306"                },                "master_2":  {                    "host":  "192.168.56.43",                    "port":  "3306"                },                "master_3":  {                    "host":  "192.168.56.42",                    "port":  "3306"                }            },            "slave":  {  },            "filters":  {  "random":  [  ]  },            "failover":  {                  "strategy":  "loop_before_master",                  "remember_failed":  true              }        }    }
  • 63. • Multi-Masters (NDB, Galera) • Declare all nodes as masters • roundrobin - single node writer (first node in config) • random - all nodes mysqlnd_ms Supported Clusters  {        "primary":  {            "master":  {                "master_1":  {                    "host":  "192.168.56.44",                    "port":  "3306"                },                "master_2":  {                    "host":  "192.168.56.43",                    "port":  "3306"                },                "master_3":  {                    "host":  "192.168.56.42",                    "port":  "3306"                }            },            "slave":  {  },            "filters":  {  "random":  [  ]  },            "failover":  {                  "strategy":  "loop_before_master",                  "remember_failed":  true              }        }    }
  • 64. • Multi-Masters (NDB, Galera) • Declare all nodes as masters • roundrobin - single node writer (first node in config) • random - all nodes • remember_failed is not what it says it is  {        "primary":  {            "master":  {                "master_1":  {                    "host":  "192.168.56.44",                    "port":  "3306"                },                "master_2":  {                    "host":  "192.168.56.43",                    "port":  "3306"                },                "master_3":  {                    "host":  "192.168.56.42",                    "port":  "3306"                }            },            "slave":  {  },            "filters":  {  "random":  [  ]  },            "failover":  {                  "strategy":  "loop_before_master",                  "remember_failed":  true              }        }    } mysqlnd_ms Supported Clusters
  • 65. • Master-Master Demo • https://github.com/dotmanila/demo-me/phpugph201407/ • master-master.ini • mysqlnd_ms_mm.ini • master-master.php mysqlnd_ms Supported Clusters
  • 66. Am I Using mysqlnd? (rpm) [revin@forge  ~]$  rpm  -­‐q  php-­‐mysql.x86_64  -­‐-­‐requires   […]   libmysqlclient_r.so.16()(64bit)   libmysqlclient_r.so.16(libmysqlclient_16)(64bit)   libmysqlclient.so.16()(64bit)   libmysqlclient.so.16(libmysqlclient_16)(64bit)   […]
  • 67. [revin@forge  ~]$  rpm  -­‐q  php-­‐mysqlnd.x86_64  -­‐-­‐requires   php-­‐pdo(x86-­‐64)  =  5.4.30-­‐36.el6.art   rpmlib(VersionedDependencies)  <=  3.0.3-­‐1   rpmlib(FileDigests)  <=  4.6.0-­‐1   rpmlib(PayloadFilesHavePrefix)  <=  4.0-­‐1   rpmlib(CompressedFileNames)  <=  3.0.4-­‐1   libc.so.6()(64bit)   libc.so.6(GLIBC_2.2.5)(64bit)   libc.so.6(GLIBC_2.3.4)(64bit)   libc.so.6(GLIBC_2.4)(64bit)   libpthread.so.0()(64bit)   libpthread.so.0(GLIBC_2.2.5)(64bit)   rtld(GNU_HASH)   rpmlib(PayloadIsXz)  <=  5.2-­‐1 Am I Using mysqlnd? (rpm)
  • 68. [revin@forge  ~]$  php  -­‐i   […]   ! mysql   ! MySQL  Support  =>  enabled   Active  Persistent  Links  =>  0   Active  Links  =>  0   Client  API  version  =>  5.1.59   MYSQL_MODULE_TYPE  =>  external   MYSQL_SOCKET  =>  /var/lib/mysql/mysql.sock   MYSQL_INCLUDE  =>  -­‐I/usr/include/mysql   MYSQL_LIBS  =>  -­‐L/usr/lib64/mysql  -­‐lmysqlclient Am I Using mysqlnd? (phpinfo)
  • 69. [revin@forge  ~]$  php  -­‐i   […]   ! mysqlnd   ! mysqlnd  =>  enabled   Version  =>  mysqlnd  5.0.10  -­‐  20111026  -­‐  $Id:  c85105d7c6f7d70d609bb4c000257868a40840ab  $   Compression  =>  supported   SSL  =>  supported   Command  buffer  size  =>  4096   Read  buffer  size  =>  32768   Read  timeout  =>  31536000   Collecting  statistics  =>  Yes   Collecting  memory  statistics  =>  No   Tracing  =>  n/a   Loaded  plugins  =>  mysqlnd,example,debug_trace,     auth_plugin_mysql_native_password,     auth_plugin_mysql_clear_password   API  Extensions  =>  mysql,mysqli,pdo_mysql Am I Using mysqlnd? (phpinfo)
  • 70. Conclusion • Yes, we can achieve HA with mysqlnd_ms • Not for the faint of heart • Do not rely on for HA (writes) on critical production systems • Good for intended use case, rw-splitting
  • 72. Q&A • http://dotmanila.com/blog/ • http://www.mysqlperformanceblog.com/ • @dotmanila Percona is Hiring!! http://www.percona.com/about-us/careers/open-positions
  • 73. $t  =  true  AND  false;  echo  (int)  $t;