#MySQL Cluster实践
##MySQL Cluster是什么
MySQL Cluster是一种在无共享架构(SNA,Shared Nothing Architecture)系统里应用内存 数据库集群的技术。
什么是SNA?有什么好处?
##MySQL Cluster目标
分布式设计,目标是要达到没有任何单点故障。 数据可用度99.999%
##MySQL Cluster核心
NDB内存集群存储引擎
特点:
1、分布式
2、基于内存
##MySQL Cluster体系结构
1、管理节点(ndb_mgm)
启动和节点维护,运行时不是必须的
2、数据或存储节点(ndbd)
两个以上节点实现高可用
3、客户端或SQL节点(普通mysqld进程)
需要配置my.cnf的ndbcluster
![](https://box.kancloud.cn/2016-05-20_573e7551e774e.png)
##NDB存储引擎特点
优点:
1、分布式,可以在不同的地理位置
2、扩展性好,在线增删节点
3、冗余性好,没有单点故障
4、速度快,实现高可用成本低
##NDB存储引擎特点
缺点:
1、基于内存,规模受限
2、部署、管理、配置复杂,备份和恢复时间长
3、多个节点基于网络同步,速度受网络影响大
4、有限制,数据行,不支持外键,复杂sql查询性能一般
##MySQL Cluster部署
1、下载cluster版本的mysql
包含普通版数据库,安装数据库是一样的
多了cluster的一些组件
2、数据表必须为ndbcluster引擎
其他引擎的数据表不会同步 3、管理节点、数据节点、SQL节点可以在一台服务器也可以分开 分开部署效率高
##MySQL Cluster管理节点config.ini
~~~
[NDBD DEFAULT] (忽略格式,每个配置项一行)
NoOfReplicas=2
[NDB_MGMD]
NodeId=1 hostname=10.131.172.145 datadir=/usr/local/mysql-cluster [NDBD]
NodeId=2 hostname=10.131.172.145 datadir=/usr/local/mysql-cluster/data [NDBD]
NodeId=3 hostname=10.131.172.146 datadir=/usr/local/mysql-cluster/data [MySQLD]
hostname=10.131.172.145 [MySQLD] hostname=10.131.172.146 [MySQLD]
~~~
##MySQL Cluster数据库配置my.cnf
~~~
[MYSQLD]
ndbcluster
[MYSQL_CLUSTER] ndb-connectstring=10.131.172.145:1186
~~~
##MySQL Cluster启动
**1、管理节点**
`bin/ndb_mgmd -f config.ini`
**2、数据节点**
~~~
bin/ndbd --defaults-file=my_cluster.cnf 第一次启动加参数 --initial
~~~
**3、SQL节点**
~~~
bin/mysqld --defaults-file=my_cluster.cnf & 就是普通的数据库操作,退出
bin/mysqladmin --defaults-file=my_cluster.cnf -uroot shutdown
~~~
##MySQL Cluster操作
**1、管理:**
`bin/ndb_mgm -e show 查看节点状态`
`bin/ndb_mgm -e shutdown 关闭集群`
`bin/ndb_mgm -e “all report memory” 查看内存使用信息`
`bin/ndb_desc -d test t1 -p 查看数据表分界点存储信息`
**2、对每个SQL节点可以像非cluster数据库一样独立操作,关闭**
**3、ndbcluster引擎的表数据会自动同步,避免单点故障**
**4、如何在线扩容?**
##MySQL Cluster在线扩容
1、管理节点配置文件添加机器
2、管理节点reload配置文件,此时新节点为未连接状态
3、滚动重启旧的数据存储节点
4、滚动重启所有SQL节点
5、初始化方式启动新的数据存储节点
6、为新节点创建组,例如:create nodegroup 3,4
7、旧的表需要用命令重新分配到所有数据节点: ALTER
ONLINE TABLE ... REORGANIZE PARTITION
http://www.cnblogs.com/xiaoTT/archive/2011/12/22/2297427.html
##MySQL Cluster性能
http://www.itpub.net/thread-1757006-1-1.html
1. 在写操作上ndbcluster是innodb的3到4倍
2. 在读性能上, ndbcluster是innodb的2倍,压力越大并发量越大时,ndbcluster的
查询性能越高
3. 99.999%高可用,无延时
#多主架构方案
![](https://box.kancloud.cn/2016-05-20_573e7552334cd.png)
![](https://box.kancloud.cn/2016-05-20_573e75526e792.png)
##多主方案对比
1. 双主
2. 多主
4. MHA
稳定、操作简单
结构稳定、简单,同步时间长,需要自己监控
3. Cluster
多台机器较好的方案,需要NDB引擎
主库宕机0.5-2秒切换,安装和运行不影响已有MySQL功能
#MySQL Proxy与Atlas
##MySQL Proxy是什么
MySQL Proxy是一个处于client和server之间的代理程序,可以监控、分析和改变 它们之间的通信。
1、负载均衡
2、主从分离
3、故障处理
4、查询分析
Atlas又是什么?
![](https://box.kancloud.cn/2016-05-20_573e7552ac378.png)
##MySQL Proxy使用
1. 下载mysql proxy
2. 安装lua(如果要主从分离或其他功能)
测试情况下修改rw-splitting.lua,更改默认连接数启动读写分离
3. 主从库新建同样的数据库用户和密码
4. 直接加参数启动即可(或者通过配置文件--defaults-file=proxy.cnf)
bin/mysql-proxy --daemon
-b 10.131.167.12:3306
-r 10.131.167.13:3306
-s /mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua 5. 客户端连接proxy的4040端口,就和普通的数据库一样使用
##MySQL Proxy配置文件(660权限)
~~~
[mysql-proxy]
admin-username=admin
admin-password=admin admin-lua-script=/mysql-proxy/share/doc/mysql-proxy/admin-sql.lua
proxy-backend-addresses=10.131.167.12:3306
proxy-read-only-backend-addresses=10.131.167.13:3306
proxy-lua-script=/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/mysql-proxy/proxy.log
log-level=debug daemon=true keepalive=true
~~~
##MySQL Proxy几个问题
1、slave宕机后,如何读取?
2、master宕机,会如何处理?
3、SQL启动后,proxy能自动监测吗?
4、如何解决主从同步时间问题?
![](https://box.kancloud.cn/2016-05-20_573e7552e3387.png)
##Atlas项目
https://github.com/Qihoo360/Atlas
Qihoo 360基于Mysql Proxy 0.8.2开发的数据库中间层 主要功能:
1、读写分离
2、负载均衡
3、IP过滤
4、自动分表
5、平滑上下线DB
6、自动摘除宕机的DB
相对于官方Proxy有什么特点?
##Atlas优势
相对于官方MySQL Proxy优势: 1、主流Lua代码用C实现,效率和性能更高 2、稳定性更高,360内部每天几十亿请求 3、配置操作更方便
4、实现了简单分表
![](https://box.kancloud.cn/2016-05-20_573e755320280.png)
##Atlas使用
**1、下载rpm并安装**
`rpm -i Atlas-xxx.rpm(CentOS)`
**2、修改配置/usr/local/mysql-proxy/conf/test.cnf加入主从机器**
~~~
proxy-backend-address=10.131.167.12:3306
proxy-read-only-backend-address=10.131.167.12:3306,10.131.167.13:3306 pwds=proxy:HJBoxfRsjel=
~~~
**3、启动**
主从库创建同样的数据库用户名和密码 `/usr/local/mysql-proxy/bin/mysql-proxyd test start(restart、stop)`
**4、使用和管理**
`mysql -P1234 mysql -P2345`
#连接池方案
**主从架构连接池方案**
1、php连接池
2、proxy
proxy能解决分库分表连接池问题吗?
**分库分表与主从架构连接池方案**
配置库
本质:
查询配置再连接实际库
#分布式数据库总结
**分布式数据库需要考虑的问题**
**1、数据量扩展**
分库分表
**2、访问量扩展**
主从分离、cluster
**3、单点故障**
slave、cluster、MHA
**4、备份与扩容**
在线扩容,冗余节点备份
**5、连接池**
php、proxy、中间层
**服务器分布式方案**
多个 proxy + cluster集群
**服务器分布式中间件**
1、服务器
2、客户端
3、中间件
**中间件的作用使得服务器和客户端都尽量简单并且高效**
php直连数据库一定有问题吗?
##服务器分布式中间件
基于RPC
1、局域网时代 DCOM、CORBA、JavaRMI
2、Thrift
Apache开源,Facebook出品,简单轻量
3、Ice
Internet Communications Engine,ZeroC分布式高性能面向对象的中间件 开源、跨平台跨语言、分布式、服务透明、负载均衡、面向对象,使用稍复杂
4、基于SOAP的WebService?
![](https://box.kancloud.cn/2016-05-20_573e75534ab50.png)
![](https://box.kancloud.cn/2016-05-20_573e755374fad.png)
**总结**
MySQL Cluster MySQL Proxy、Atlas 分布式数据库解决方案
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密