🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#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 分布式数据库解决方案