#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

##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%高可用,無延時
#多主架構方案


##多主方案對比
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又是什么?

##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、如何解決主從同步時間問題?

##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、實現了簡單分表

##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?


**總結**
MySQL Cluster MySQL Proxy、Atlas 分布式數據庫解決方案
- SWOOLE及php網絡編程
- LNMP架構與Socket,http協議
- 如何高效學習
- 開發工具箱
- 編寫高效的js
- js閉包編寫全功能的購物車
- JSON和JSONP
- 多級分類的開發與應用
- 設計安全的登錄注冊流程
- 前端性能優化
- 前端架構優化
- 使用第三方云服務加速產品開發
- 移動互聯網之API開發
- php分層
- 全文檢索的實踐與部署
- webIM的原理及前后端實現
- 如何配置高效的數據庫以及MySQL的代碼及插件開發
- NoSql.隊列,任務隊列
- 構建本機緩存,構建分布式緩存池
- 數據庫分庫分表的設計
- Nginx原理及模塊開發初步
- 無限擴充的數據庫架構
- php構建分庫分表分布式數據庫連接池
- 靜態文件上傳、分布式存儲與分發
- MySQL Cluster,Proxy分析與實踐
- 架構解密