mysql 集群實踐_MySQL Cluster集群探索與實踐

MySQL集群是一種在無共享架構(SNA,Share Nothing Architecture)系統里應用內存數據庫集群的技術。這種無共享的架構可以使得系統使用低廉的硬件獲取高的可擴展性。

MySQL集群是一種分布式設計,目標是要達到沒有任何單點故障點。因此,任何組成部分都應該擁有自己的內存和磁盤。任何共享存儲方案如網絡共享,網絡文件系統和SAN設備是不推薦或不支持的。通過這種冗余設計,MySQL聲稱數據的可用度可以達到99.999%。

實際上,MySQL集群是把一個叫做NDB的內存集群存儲引擎集成與標準的MySQL服務器集成。它包含一組計算機,每個都跑一個或者多個進程,這可能包括一個MySQL服務器,一個數據節點,一個管理服務器和一個專有的一個數據訪問程序。它們之間的關系如下圖所示:

0da45be03c316251c44917df07d8989b.png

存儲引擎

MySQL Cluster 使用了一個專用的基于內存的存儲引擎,這樣做的好處是速度快, 沒有磁盤I/O的瓶頸,但是由于是基于內存的,所以數據庫的規模受系統總內存的限制, 如果運行NDB的MySQL服務器一定要內存夠大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多臺服務器上來實現數據的可靠性和擴展性,理論上 通過配置2臺NDB的存儲節點就能實現整個數據庫集群的冗余性和解決單點故障問題。

該存儲引擎有下列弊端:

基于內存,數據庫的規模受集群總內存的大小限制

基于內存,斷電后數據可能會有數據丟失,這點還需要通過測試驗證。

多個節點通過網絡實現通訊和數據同步、查詢等操作,因此整體性受網絡速度影響,

因此速度也比較慢

當然也有它的優點:

多個節點之間可以分布在不同的地理位置,因此也是一個實現分布式數據庫的方案。

擴展性很好,增加節點即可實現數據庫集群的擴展。

冗余性很好,多個節點上都有完整的數據庫數據,因此任何一個節點宕機都不會造成服務中斷。

實現高可用性的成本比較低,不象傳統的高可用方案一樣需要共享的存儲設備和專用的軟件才能實現,NDB 只要有足夠的內存就能實現。

體系結構

MySQL Cluster 由3個不同功能的服務構成,每個服務由一個專用的守護進程提供,一項 服務也叫做一個節點,下面來介紹每個節點的功能。

The management (MGM) node

管理節點,用來實現整個集群的管理,理論上一般只啟動一個,而且宕機也不影響 cluster 的服務,這個進程只在cluster 啟動以及節點加入集群時起作用, 所以這個節點不是很需要冗余,理論上通過一臺服務器提供服務就可以了。

通過 ndb_mgmd 命令啟動,使用 config.ini 配置文件

The storage or database (DB) node:

數據庫節點,用來存儲數據,可以和管理節點(MGM) , 用戶端節點(API) 可以處在 不同的機器上,也可以在同一個機器上面,集群中至少要有一個DB節點,2個以上 時就能實現集群的高可用保證,DB節點增加時,集群的處理速度會變慢。

通過 ndbd 命令啟動,第一次創建好cluster DB 節點時,需要使用 –init參數初始化。

例如: bin/ndbd –ndb-connectstring=ndb_mgmd.mysqlcluster.net –initial

The client (API) node:

客戶端節點,通過他實現 cluster DB 的訪問,這個節點也就是普通的 mysqld 進程, 需要在配置文件中配置ndbcluster 指令打開 NDB Cluster storage engine 存儲引擎,增加 API 節點會提高整個集群的并發訪問速度和整體的吞吐量,該節點 可以部署在Web應用服務器上,也可以部署在專用的服務器上,也開以和DB部署在 同一臺服務器上。

通過 mysqld_safe 命令啟動,

這3類節點可以分布在不同的主機上,比如 DB 可以是多臺專用的服務器,也可以 每個DB都有一個API,當然也可以把API分布在Web前端的服務器上去,通常來說, API越多cluster的性能會越好。

Mysql集群探索與實踐

1. 準備好3臺機器,從官網下載最新的mysql集群版本,此處用到mysql-cluster-gpl-7.1.5.tar.gz源碼包, 配置并安裝,記得加上

–with-plugins=innobase,ndbcluster (innobase可選)

3臺機器分別是192.168.207.153,192.168.208.3,192.168.208.9,具體分配如下

管理節點(ndb_mgmd):192.168.207.153

數據節點(ndbd): 192.168.208.3

數據節點(ndbd): 192.168.208.9

SQL節點(mysqld): 192.168.208.3

SQL節點(mysqld): 192.168.208.9

2. 在mysql目錄下新建mysql-cluster文件夾,切換到mysql-cluster,新建config.ini

[NDBD DEFAULT]

NoOfReplicas=2 #備份,副本,這樣的話2臺數據節點的數據就會同步

DataMemory=200M

IndexMemory=100M

[TCP DEFAULT]

portnumber=2202

[NDB_MGMD] #管理節點

id=1

hostname=192.168.207.153

datadir=/home/taozi/mysql/mysql-cluster

[NDBD] #數據節點

id=2

hostname=192.168.208.3

datadir=/home/taozi/mysql/data

[NDBD] #數據節點

id=3

hostname=192.168.208.9

datadir=/home/taozi/mysql/data

[MySQLD] #sql節點

id=4

hostname=192.168.208.3

[MySQLD] #sql節點

id=5

hostname=192.168.208.9

[MySQLD] #sql節點

id=6

3. 在管理節點服務器上啟動管理節點服務 (如果不存在ndb_mgmd那么要從libexec下面復制過來)

~/mysql/bin/ndb_mgmd -f ~/mysql/mysql-cluster/config.ini

4. 進入2臺數據節點服務器,分別啟動數據節點服務

~/mysql/bin/ndbd (第一次啟動使用 ~/mysql/bin/ndbd --initial)

5. 最后分別進入sql節點服務器,修改my.cnf,加入

[MYSQL_CLUSTER]

ndb-connectstring=192.168.207.153

[MYSQLD]

ndbcluster

ndb-connectstring=192.168.207.153

啟動mysql服務

/home/taozi/mysql/bin/mysqld_safe --ledir=/home/taozi/mysql/bin /

--log-error=/home/taozi/mysql/data/t.err --datadir=/home/taozi/mysql/data /

--socket=/home/taozi/mysql/tmp/mysql.sock --pid-file=/home/taozi/mysql/data/mysqld.pid &

6. 此時回到管理節點

~/mysql/bin/ndb_mgm -e show

可以看到顯示如下

[taozi@search153 mysql]$ ./show.sh

Connected to Management Server at: localhost:1186

Cluster Configuration

---------------------

[ndbd(NDB)] 2 node(s)

id=2 @192.168.208.3 (mysql-5.1.47 ndb-7.1.5, Nodegroup: 0, Master)

id=3 @192.168.208.9 (mysql-5.1.47 ndb-7.1.5, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)

id=1 @192.168.207.153 (mysql-5.1.47 ndb-7.1.5)

[mysqld(API)] 3 node(s)

id=4 @192.168.208.3 (mysql-5.1.47 ndb-7.1.5)

id=5 @192.168.208.9 (mysql-5.1.47 ndb-7.1.5)

id=6 (not connected, accepting connect from any host)

7. 進入sql節點,在test數據庫創建表

CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

PRIMARY KEY (`id`)

) ENGINE=ndbcluster DEFAULT CHARSET=gbk

切換到2臺數據節點服務器~/mysql/data/ndb_2_fs和~/mysql/data/ndb_3_fs看看,

或者直接去數據庫查,數據已經同步了!

8. 關閉集群服務

關閉sql節點等同于停止mysql服務,此時外界數據不將再進來。然后關閉管理節點

~/mysql/bin/ndb_mgm -e shutdown

rm ~/mysql/mysql-cluster/ndb_1_config.bin.1 #不是必須的,如果config.ini有改動則要加上

這樣操作后,管理節點和數據節點都將停止服務

Notes:

1:如果發現關閉一臺機器的ndbd進程,另一臺機器的ndbd的進程也關閉,則需要修改參數NoOfReplicas。

2:./ndbd --initial 不能同時在所有數據節點機器上執行,如執行,會刪除所有數據

3:可以像操作非簇類型的數據庫那樣,操作mysqld節點

4:每次修改config.ini文件,重啟ndb_mgmd時,需要刪除mysql-cluster文件下的ndb_1_config.bin.1文件,

因為他默認調用此文件

5:NDB 簇不支持自動發現數據庫的功能,這點很重要,一旦在一個數據節點上創建了世界(world)數據庫和它的表,

在簇中的每個SQL節點上還需要發出命令 CREATE DATABASE world,后跟FLUSH TABLES。這樣,節點就能

識別數據庫并讀取其表定義。(在本版本MySQL Cluster 7.1.5下數據庫也會自動同步的)

6:如果在相關節點服務器啟動時,注意查看~/mysql/mysql-cluster目錄內的相關日志文件以獲取錯誤信息.

7:在管理節點的配置文件里各[mysqld],[ndbd]和[ndb_mgmd]配置的選項值順序應該如下:

[mysqld]

Id=4

HostName=192.168.208.3

Id在頂端緊跟其后的是HostName,如果順序錯了,當SQL或數據節點連接管理節點時,管理節點無法正確的定位

到其對應的節點配置上.

因為無法定位到對應的節點配置,當沒有剩余的[空節點]時,客戶端節點啟動時(./mysqld or ./ndbd)

還會報:

Configuration error: Error : Could not alloc node id at 192.168.0.231 port 1186: No free

node id found for mysqld

(API).Failed to initialize consumers

8:[空節點]是沒有指定HostName選項的節點配置均為空節點,空節點可以用來動態配置一些動態IP的節點,

一般管理節點的 配置文件要預留3個以上的空節點,因為備份時需要連接一個節點,如下:

[mysqld]

Id=6

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388793.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python基礎:搭建開發環境(1)

1.Python語言簡介 2.Python環境 Python環境產品存在多個。 2.1 CPython CPython是Python官方提供的。一般情況下提到的Python就是指CPython,CPython是基于C語言編寫的。 CPython實現的解釋器將源代碼編譯為字節碼(ByteCode),再由虛…

python數據結構之隊列(一)

隊列概念隊列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。隊列是一種先進先出的(First In First Out)的線性表,簡稱FIFO。允許插入的一端為隊尾,允許刪除的一端為隊頭。…

Android實現圖片放大縮小

Android實現圖片放大縮小 package com.min.Test_Gallery; import Android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.os.Bun…

matlab散點圖折線圖_什么是散點圖以及何時使用

matlab散點圖折線圖When you were learning algebra back in high school, you might not have realized that one day you would need to create a scatter plot to demonstrate real-world results.當您在高中學習代數時,您可能沒有意識到有一天需要創建一個散點圖…

java判斷題_【Java判斷題】請大神們進來看下、這些判斷題你都知道多少~

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓、判斷改錯題(每題2分,共20分)(正確的打√,錯誤的打并說明原因)1、 Java系統包提供了很多預定義類,我們可以直接引用它們而不必從頭開始編寫程序。 ( )2、 程序可以用字符‘*’替代一個TextField中的每個字…

PoPo數據可視化第8期

PoPo數據可視化 聚焦于Web數據可視化與可視化交互領域,發現可視化領域有意思的內容。不想錯過可視化領域的精彩內容, 就快快關注我們吧 :) 微信訂閱號:popodv_com谷歌決定關閉云可視化服務 Fusion Tables谷歌宣布即將關閉其 Fusion Tables 云服務&#x…

AC自動機題單

AC自動機題目 真的超級感謝xzy 真的幫到我很多 題單 [X] [luogu3808]【模板】AC自動機(簡單版) https://www.luogu.org/problemnew/show/P3808[X] [luogu3796]【模板】AC自動機(加強版)https://www.luogu.org/problemnew/show/P37…

java list用法_Java List 用法詳解及實例分析

Java List 用法詳解及實例分析Java中可變數組的原理就是不斷的創建新的數組,將原數組加到新的數組中,下文對Java List用法做了詳解。List:元素是有序的(怎么存的就怎么取出來,順序不會亂),元素可以重復(角標1上有個3,角標2上也可以…

python字符串和List:索引值以 0 為開始值,-1 為從末尾的開始位置;值和位置的區別哦...

String(字符串)Python中的字符串用單引號 或雙引號 " 括起來,同時使用反斜杠 \ 轉義特殊字符。 字符串的截取的語法格式如下: 變量[頭下標:尾下標]索引值以 0 為開始值,-1 為從末尾的開始位置。[一個是值&#x…

邏輯回歸 python_深入研究Python的邏輯回歸

邏輯回歸 pythonClassification techniques are an essential part of machine learning and data science applications. Approximately 70% of problems in machine learning are classification problems. There are lots of classification problems that are available, b…

spring定時任務(@Scheduled注解)

(一)在xml里加入task的命名空間 xmlns:task"http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd(二)啟用注…

net user 用戶名 密碼 /add 建立用戶

net user 用戶名 密碼 /add 建立用戶 other: net use \\ip\ipc$ " " /user:" " 建立IPC空鏈接 net use \\ip\ipc$ "密碼" /user:"用戶名" 建立IPC非空鏈接 net use h: \\ip\c$ "密碼" /user:"用戶名" 直接登陸后映…

JavaScript是如何工作的:與WebAssembly比較及其使用場景

*摘要:** WebAssembly未來可期。 原文:JavaScript是如何工作的:與WebAssembly比較及其使用場景作者:前端小智Fundebug經授權轉載,版權歸原作者所有。 這是專門探索 JavaScript及其所構建的組件的系列文章的第6篇。 如果…

友元 java_C++ 友元關系詳解

在C中,在某些情況下,允許特定的非成員函數訪問一個類的私有成員,同時仍然阻止一般的訪問,這是很方便做到的。例如,被重載的操作符,如輸入或輸出操作符,經常需要訪問類的私有數據成員。這些操作符…

Matplotlib中的“ plt”和“ ax”到底是什么?

Indeed, as the most popular and fundamental data visualisation library, Matplotlib is kind of confusing in some perspectives. It is usually to see that someone asking about的確,作為最受歡迎的基礎數據可視化庫,Matplotlib在某些方面令人困…

【數據庫的備份與還原】 .

差異備份,日志備份還原 IF DB_ID(db) IS NOT NULL DROP DATABASE db GO CREATE DATABASE db GO CREATE TABLE db.dbo.T(ID INT PRIMARY KEY IDENTITY(1,1)); GO BACKUP DATABASE db TO DISKd:/1.bak WITH FORMAT GO INSERT INTO db.dbo.T DEFAULT VALUES GO BACKUP DATAB…

方法 數組

方法的特點: 定義方法可以將功能代碼進行封裝 封裝:兩方面含義: 1.將有特定邏輯的多條代碼組合成一個整體!! 2.方便維護,提高代碼的復用性(聯想變量的作用域問題) 方法只有被調用才會被執行!!(方法調用的流程) 方法的重載: 兩同一不同: 同類,同方法名 形參列表不同 …

java 控制jsp_JSP學習之Java Web中的安全控制實例詳解

普通用戶界面修改登錄的Servlet,修改后的代碼如下:LoginProcess.java代碼:package servlet;import javabean.User;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.Ser…

PHP 基礎 自動類型轉換之比較運算符

<?php var_dump( 123fg456>122); var_dump(some string 0); var_dump(123.0 123d456); var_dump(0 "a"); var_dump("1" "01"); var_dump("1" "1e0"); 當數字與字符串進行比較運算時&#xff0c;字符串會自動轉…

java的多線程訪問共享變量_java多線程通信之共享變量

(1)當訪問共同的代碼的時候&#xff1a;可以使用同一個Runnable對象&#xff0c;這個Runnable對象中有這個共享數據&#xff0c;比如賣票系統就可以這么做。或者這個共享數據封裝在一個對象當中&#xff0c;然后對這個對象加鎖&#xff0c;也可以實現數據安全訪問。public clas…