?
MYSQL?CLUSTER 方案介紹
? 本文的大致框架來自 羅志威、黃川的報告, 在它的基礎上進行簡化和修改一些bug并且添加了主從復制的章節,最后做出該文檔
MySQL?Cluster? 是 MySQL 適合于分布式計算環境的高實用、高冗余版本。它采用了 NDB?Cluster? 存儲引擎,允許在 1 個? Cluster? 中運行多個 MySQL 服務器。現在 mysql?cluster? 被獨立出來 ,? 作為一個專門的產品進行運營 ,?mysql-server-5.6+? 就不在存在對 mysql?cluster 的支持,需要獨立下載 cluster 包進行安裝 .?
推薦在 Linux 下完成安裝 ,? 如果一定要在 Windows 上的話 ,? 則需要考慮使用解壓版本的進行安裝 ,? 且路徑中不能帶有空格字符 .
測試環境信息
服務器信息
項 |
項 值 |
操作系統 |
Ubuntu?14.04?32 位 |
Mysql?Cluster? 版本 |
mysql-cluster-gpl-7.3.5-debian6.0-i686 |
內存 |
2G |
CPU |
2.20 雙核 |
網絡環境 |
100M 局域網 |
部署 |
1 個數據節點, 1?SQL 節點, 1 管理節點 |
?
管理節點信息
機器 IP |
數據節點編號 |
192.168.1.37 |
1 |
?
機器 IP |
數據節點編號 |
192.168.1.37 |
2 |
數據節點信息
?
SQL 節點信息
機器 IP |
數據節點編號 |
192.168.1.37 |
3 |
?
機器安裝環境
機器 IP |
用戶名、密碼 |
安裝路徑 |
路徑說明 |
192.168.1.37 |
root/root |
/root/mysql/mysqlc |
mysql?cluster? 目錄 |
/root/mysql/data/mysqld_data |
sql 節點數據路徑 |
||
/root/mysql/data/ndb_data |
數據節點數據路徑 |
||
/root/mysqldata/mgmd_data |
管理節點數據 |
||
/root/mysql/conf |
配置文件路徑 |
節點說明
SQL 節點:
這是用來訪問簇數據的節點。對于 MySQL 簇,客戶端節點是使用 NDB 簇存儲引擎的傳統 MySQL 服務器。典型情況下, SQL 節點是使用命令 mysqld?– -ndbcluster 啟動的,或將 ndbcluster 添加到 my.cnf 后使用 mysqld 啟動。簇中所有的表結構都保存在 mysql 節點中,為了保證每個數據節點中數據分布均勻,在進行數據插入的時候 sql 節點采用了 表分片的策略將數據均勻分配到不同的數據節點上。
?
數據節點:
這類節點用于保存簇的數據。數據節點的數目與副本的數目相關,是片段的倍數。例如,對于兩個副本,每個副本有兩個片段,那么就有 1 個數據節點(在測試環境中就采用了兩個副本兩個片段的策略,故有 1 個數據節點, ( ndb_mgmd?配置文件中 NoOfReplicas 屬性配置 ) 此時管理節點會將數據節點進行分組,?數據節點是用命令 ndbd啟動的。
各個數據節點中都用兩個檢查點:本地檢查點、全局檢查點。本地檢查點的目的是為了將內存中的數據和磁盤上的數據進行同步。全局檢查點是在各節點中進行通訊,以保證事物的一致性。
?
管理節點:
管理節點是管理數據節點和 sql 節點的工具,在系統正常運行期間停止管理節點對整個系統的運行不會有任何影響。在管理節點提供了數據節點和 sql 節點的全局配置信息,包括數據、索引所占用內存大小、數據存放的目錄信息、各個節點 ip 信息等。通過管理節點可以啟動和停止節點、啟動和停止消息跟蹤(僅對調試版本)、顯示節點版本和狀態、啟動和停止備份等的命令。
?
安裝配置說明
?軟件下載說明:
1、?軟件下載地址: http://www.mysql.com/downloads/cluster/
2、?安裝版本: mysql-cluster-gpl-7.3.5-debian6.0-i686
安裝步驟說明:
一、?管理節點安裝
1、?登陸系統建立目錄結構
?
mkdir?–p?/root/mysql/data/mgmd_data
mkdir?/root/mysql/data/ndb_data
mkdir?/root/mysql/data/mysqld_data
mkdir?/root/mysql/conf
mkdir?/root/mysql/mysqlc
?
?
2、?安裝 mysqlc
dpkg?–i?mysql-cluster-gpl-7.3.5-debian6.0-i686
mv?/opt/mysql/server-5.6/*?/root/mysql/mysqlc
?
3、?設置環境變量
在 .bashrc 文件的 PATH 后面加入如下信息 /root/mysql/mysqlc/bin
vim?~/.bashrc
加入后,文件如下所示
?
加入后執行如下命令使配置生效:
.?~/.bashrc
4、?在 /root/mysql/conf 目錄下建立 mgmd.conf文件,然后在文件中配置各節點信息 , 如下所示:
[ndbd?default]
NoOfReplicas=1?#設置冗余的分數(一個sql節點對應幾個data節點)
DataMemory=100M?#指定存放數據的內存段大小
IndexMemory=50M#制定索引的內存段大小
LockPagesInMainMemory=1?#將進程鎖定在內存中
TimeBetweenLocalCheckpoints=20#本地檢查點時間間隔。
TimeBetweenGlobalCheckpoints=1000#全局檢查點時間間隔。
TimeBetweenEpochs=100#復制同步的間隔時間
TimeBetweenWatchdogCheckInitial=60000?
MaxNoOfTables=1024?#該參數為作為整體的簇設置了最大表對象數目
MaxNoOfOrderedIndexes=2048?#設置哈希索引在系統中同一時間被使用總數
MaxNoOfUniqueHashIndexes=512?#設置最大的唯一索引的總數
MaxNoOfAttributes=20480?#定義了可在簇中定義的屬性數目
MaxNoOfTriggers=10240#設置簇中觸發程序對象的最大數目
DiskCheckpointSpeedInRestart=100M?#重啟的時候本地檢查點期間發送到磁的速度?
NoOfFragmentLogFiles=16?#該參數用于設置節點的REDO日志文件的個數??
RedoBuffer=65M?#設置redo日志緩存
MaxNoOfConcurrentOperations=500000?#設置事務中同時更新的最大記錄數
MaxNoOfExecutionThreads=8#線程的數量?
BatchSizePerLocalScan=512?#該參數用于計算鎖定記錄的數目
SharedGlobalMemory=20M?#這個參數設置用于日志緩沖、磁盤操作和表空間...
DiskPageBufferMemory=80M?#設置硬盤上的緩存頁的空間總量的大小
#[tcp?default]
#portnumber=2202#通訊端口(現在無效)
[ndb_mgmd]
hostname=192.168.1.39#管理節點IP
datadir=/root/mysql/data/mgmd_data#管理節點數據目錄
Nodeid=1#管理節點編號
[ndbd]
hostname=192.168.1.39#數據節點IP
datadir=/root/mysql/data/ndb_data#數據節點數據目錄
NodeId=2#數據節點編號
[mysqld]
hostname=192.168.1.39#sql節點IP
NodeId=3#sql節點編號
?
5、?管理節點啟動命令
第一次啟動:
ndb_mgmd?-f?/root/mysql/conf/mgmd.conf?--configdir=/root/mysql/conf/?--initial
非第一次啟動:
ndb_mgmd?-f?/root/mysql/conf/mgmd.conf?--configdir=/root/mysql/conf/
注意:?路徑不能使用相對地址,?需要使用絕對地址.
啟動后可以輸入 ndb_mgm 命令進入管理控制臺,然后輸入 show 命令查看節點狀態,如下圖所示:
?
二、?數據節點安裝
1、?管理節點啟動命令
第一次啟動命令:
ndbd?-c?192.168.1.39:1186?--initial?
非第一次啟動命令:
ndbd?-c?192.168.1.39:1186?
???注意:如果在啟動的時候加入 initial 參數,那么會將用于備份和還原的日志信息都會清空,也就是說會將數據庫中的數據刪除掉。在啟動的時候一定要注意。
三、?SQL 節點安裝
?
1、?在 /root/mysql/conf 目錄下建立 mys qld.conf 文件,然后在文件中配置各節點信息 , 如下所示:
[mysqld]
ndbcluster
ndb-wait-setup=1?#等待data節點創建數據表時間限制
datadir=/root/mysql/data/mysqld_data
basedir=/root/mysql/mysqlc
socket=/tmp/mysql.sock?#Windows注釋掉
skip-name-resolve?#跳過域名解析
port=3306
#ndb-connectstring=192.168.1.39
[mysql_cluster]
ndb-connectstring=192.168.1.39?#指向管理節點
?
2、?第一次安裝 sql 節點后要執行如下腳本,該腳本只執行一次。
cd??/root/mysql/mysqlc
./scripts/mysql_install_db?--no-defaults?--datadir=/root/mysql/data/mysqld_data/?--basedir=.
?
3、?sql節點啟動命令
mysqld?--defaults-file=/root/mysql/conf/mysqld.conf?--user=root
?
4、?權限配置
本地權限配置 :
mysqladmin??–uroot???–proot
非本機訪問權限配置 :
GRANT?ALL?PRIVILEGES?ON?*.*?TO?'root'@'%'?IDENTIFIED?BY?'root'?WITH?GRANT?OPTION;
FLUSH?PRIVILEGES;
關閉mysql?cluster
數據節點?和?管理節點通過進入?ndb_mgm?,?輸入shutdown?來關閉
sql節點通過?mysqladmin?-uroot?-p?shutdown?來關閉
方案測試
一、?測試工具
壓力測試工具使用的是 mysql 自帶的 mysqlslap 壓力測試工具。
mysqlslap:
mysql 自帶的一個壓力測試工具,自 5.1.4 版本之后的 MySQL?client? 包含了此工具,下載 mysql?client?rpm 包安裝后可直接使用。在?使用 mysqlslap 的時候,可以指定 sql 語句或者是包含 sql 語句的文件,如果是文件,那么文件中的每一行至少有一個語句(不能一個 sql 語句分成?兩行或多行),因為默認的分隔符( delimiter )是換行符,當然,你也可以手動重置新的分隔符。另外,你也不能在文件中添加注?釋, mysqlslap 不支持。
Mysqlslap參數說明 :
--concurrency 代表并發數量,多個可以用逗號隔開,當然你也可以用自己的分隔符隔 開,這個時候要用到 --delimiter 開關。
--engines 代表要測試的引擎,可以有多個,用分隔符隔開。
--iterations 代表要運行這些測試多少次。
--auto-generate-sql? 代表用系統自己生成的 SQL 腳本來測試。
--auto-generate-sql-load-type? 代表要測試的是讀還是寫還是兩者混合的?
--number-of-queries? 代表總共要運行多少次查詢。每個客戶運行的查詢數量可以 用查詢總數 / 并發數來計算。比如倒數第二個結果 2=200/100 。
--debug-info? 代表要額外輸出 CPU 以及內存的相關信息。
--number-int-cols? 代表示例表中的 INTEGER 類型的屬性有幾個。
--number-char-cols? 意思同上。
--create-schema? 代表自己定義的模式(在 MySQL 中也就是庫)。
--query? 代表自己的 SQL 腳本。
--only-print? 如果只想打印看看 SQL 語句是什么,可以用這個選項。
-h?sql 節點 ip
-u? 用戶
-p( 小寫 )? 密碼
-P( 大寫 )? 端口
二、?壓力測試建表及存儲過程
1.?建庫、建表腳本:
CREATE?DATABASE?cluster1;
USE?cluster1;
CREATE?TABLE?ndbtest?(
id?int(11)?NOT?NULL?AUTO_INCREMENT,
regtime?DATETIME?DEFAULT?NULL,
name?VARCHAR(200)?DEFAULT?NULL,
PRIMARY?KEY?(`id`)
)?ENGINE=ndb?AUTO_INCREMENT=1000001?DEFAULT?CHARSET=latin1?PACK_KEYS=0;
?
2.?存儲過程腳本
DELIMITER?$$
DROP?PROCEDURE?IF?EXISTS?`p_test_t1_disk`?$$
CREATE?PROCEDURE?`p_test_t1_disk`()
BEGIN
declare?i?int?default?0;
test:?loop
insert?into?cluster1.ndbtest(regtime,name)?values(sysdate(),md5(rand()));
set?i=i+1;
if?i>=10000?then
leave?test;
end?if;
end?loop;
END?$$
DELIMITER?;
3.?工具運行命令
mysqlslap?-uroot?-proot?--concurrency=1?--iterations=1?--query='call?cluster1.p_test_t1_disk;'?--number-of-queries=1?-h?192.168.1.37?--create-schema=cluster1
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
MYSQL?REPLICATION 方案介紹
Mysql?Replication ( MySQL 主從復制)是 MySQL 數據庫使用率非常高的一種技術,它使用某個數據庫服務器為?主,然后在其他數據庫服務器上進行復制,后面復制的數據庫也稱從數據庫。 MySQL 支持單向、異步復制,復制過程中一個服務器充當主服務器,而一個或多個?其它服務器充當從服務器。
在設置鏈式復制服務器時,從服務器本身也可以充當主服務器,如:
a->b->c
,
b
對于
a
來說是從服務器,但是它又?是
c
的主服務器。
Mysql?Replication
(
MySQL
主從復制)主要用于:
1. 使用一個從服務器執行備份,而不會干擾主服務器。在備份過程中主服務器可以繼續處理更新;
2.
解決數據庫讀需求很高
(
讀寫分離
),?
通常使用
amoeba
或者
mysqlproxy
作為中間代理層
.
Mysql?Replication
(
MySQL
主從復制)的原理:
Mysql 的復制( replication )是一個異步的復制,從一個 Mysql?instace (稱之為 Master )復制到另一個 Mysql?instance (稱之 Slave )。實現整個復制操作主要由三個進程完成的,其中兩個進程在 Slave ( Sql 進程和 IO 進程),另外一個進程在? Master ( IO 進程)上。
要實施復制,首先必須打開
Master
端的
binary?log
(
bin-log
)功能,否則無法實現。因為整個復制過程實際上就是
Slave
從
Master
端獲取該日志然后再在自己身上完全順序的執行日志中所記錄的各種操作。
復制的基本過程如下:
1)
、
Slave
上面的
IO
進程連接上
Master
,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內容;
2)
、
Master
接收到來自
Slave
的
IO
進程的請求后,通過負責復制的
IO
進程根據請求信息讀取制定日志指定位置之后的日志信息,返回給
Slave?
的
IO
進程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經到
Master
端的
bin-log
文件的名稱以及
bin-log
的位置;
3)
、
Slave
的
IO
進程接收到信息后,將接收到的日志內容依次添加到
Slave
端的
relay-log
文件的最末端,并將讀取到的
Master
端的?
bin-log
的文件名和位置記錄到
master-info
文件中,以便在下一次讀取的時候能夠清楚的高速
Master“
我需要從某個
bin-log
的哪個位置開始往后的日志內容,請發給我
”
;
4)
、
Slave 的 Sql 進程檢測到 relay-log 中新增加了內容后,會馬上解析 relay-log 的內容成為在 Master 端真實執行時候的那些可執行的內容,并在自身執行。
如果要實現 Slave 和 Master 為同一個 mysqld,? 需要添加 log-slave-updates?=?1
參數到 my.cnf- à[mysqld]
服務器結構:
A 、 B 、 C 三臺服務器;?其中 A 為新聞數據源, A 為 B 的 Master , B 為 A 的 Slave , 同時也是 C 的 Master ;
B 服務器從 A 復制部分數據, C 備份 A 的所有數據;
注意 :
如果數據庫在做主從的時候已經有數據了 ,? 則需要進行鎖表操作 .
mysql>?flush?tables?with?read?lock;
記住數據導完后要解鎖:
mysql>?unloclk?tables;
?
Master?A 的配置
?
sudo?vi?/etc/mysql/my.cnf
?
刪除以下參數前的注釋并修改
server-id???????=?1?// 分配 server-id
log-bin?????????=?master-bin?// 默認 mysql-bin, 可以不修改
log-bin-index???=?master-bin.index??// 非必須
bind-adress?????=?0.0.0.0?// 默認 127.0.0.1? 不修改可能導致無法訪問
?
修改系統防火墻使 B 服務器可以訪問 3306 端口,(詳查 ufw 命令)??
重啟 mysql :
sudo?/init.d/mysql?restart
?
通過語句:
GRANT?REPLICATION?SLAVE,REPLICATION?CLIENT?ON?*.*?TO?user@'ip?B'?IDENTIFIED?BY?'password';
?
給 B 服務器建立一個可以連接到 A 的帳號
進入 mysql ,通過:
show?master?status;
查看 A 的狀態,記錄下 file 的位置和 postion 的參數
?
?
?
Slave?B 的配置
sudo?vi?/etc/mysql/my.cnf
?
server-id???????=?2
log-bin?????????=?slave-bin
bind-address????=?0.0.0.0
relay-log-index?=??slave-relay-bin.index?// 非必須
relay-log???????=?slave-relay-bin???// 非必須
?
添加參數:
log-slave-updates?=?1???
// 通常情況,從服務器從主服務器接收到的更新不記入它的二進制日志。
// 該選項告訴從服務器將其 SQL 線程執行的更新記入到從服務器自己的二進制日志。
?
replicate_wild_do_table?=?copy_db.copy_table?// 表示需要復制的庫中的表,可以善用 %
replicate_wild_ignore_table?=?ignore_db.ignore_table?// 不復制的表
?
至于為什么不使用 replicate_do_db 和 replicate_ignore_db 參數,
是為了方式跨庫更新時出錯,如果能確保不會跨庫更新可考慮
?
重啟 mysql ,進入本機 mysql
?
執行以下語句:
CHANGE?MASTER?TO?MASTER_HOST='server?A?ip',
MASTER_PORT=3306,
MASTER_USER='user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
?
//MASTER_LOG_FILE 和 MASTER_LOG_POS 對應 A 中的 file 位置和 postion 參數,表示開始復制的 bin 文件和位置
?
start?slave;????// 啟動 Slave
show?slave?status ;?? // 查看 Slave_IO_State 參數,如果是 Waiting?for?master?to?send?event, 則正常
// 正常狀態下 Slave_IO_Running 與 Slave_SQL_Running 均為 yes
?
// 如不能正常鏈接,根據 Slave_IO_State , Slave_IO_Running , Slave_SQL_Running , Last_IO_Error
// 等參數查找失敗原因
?
通過:
show?master?status;
命令記錄 file 位置和 postion 參數;
?
給 C 服務器分配一個帳號用于同步;
方法參照 A ,防火墻設置參照 A ;
?
?
?
?
Slave?C 的配置
sudo?vi?/etc/mysql/my.cnf
server-id??=?3
relay-log-index?=??slave-relay-bin.index?// 非必須
relay-log???????=?slave-relay-bin???// 非必須
?
通過 CHANGE?MASTER?TO 語句來修改 master 的參數,參照 B 的配置;
通過
show?slave?status;
檢查 C 的狀態,參照 B
?
?
?
?
?
讀寫分離配置 :
推薦使用 amoeba,?amoeba? 相比較 mysqlproxy,? 優點在于中文文檔齊全 ( 國人編寫 ) ,穩定性高,免除了 mysqlproxy 的 lua 配置的復雜性 .
Amoeba 讀寫分離:
http://docs.hexnova.com/amoeba/rw-splitting.html
高可用性
可以制作兩個 master, 它們兩個為雙熱備主機,然后通過 keepalive 整合 master? 變為一個 VIP ,?最后? amoeba 和 slave 都是通過這個 VIP? 來進行操作, amoeba 把 insert 等操作發送到這個 VIP ,? slave 通過 VIP 獲得具體的 bin 日志,然后進行更新
Keepalive 在使用的時候,通常只有一臺 master 會進行工作,另外一臺進行主從復制,當 query 發送到 VIP 的時候,就會進入工作的 master 運行。當工作 master 宕機后, keepaliave 會自動切換 VIP 指向空閑 master 進行工作,?這樣子就實現了高可用性。
所以在雙擊熱備的環境中?,總共會占用 3+ 個 IP 地址。
?
負載均衡
負載均衡在 IP 層上,通常使用 LVS 軟件,在 HTTP 層面上可以使用 Nginx , lighttpd , apache?web?server? 等軟件。
現在為了實現 MySql 的 master 的負載均衡,可以使用 LVS ,?在 IP 層面上進行負載均衡,
也可以使用 MySql-Cluster(NDB) 產品,?它已經實現了高可用性以及負載均衡 .
高可用性和負載均衡都可以直接通過 NDB 來實現 , 上面提及的是一般方法
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
