MySQL HA 高可用性,MySQL Cluster 叢集

标签: Linux cluster ha high availability mysql | 发表时间:2015-06-12 00:00 | 作者:cross
出处:http://ssorc.tw

MySQL Cluster,需要的 server 要三台(含)以上,是不需要當心 primary key 重覆的問題,它架構分 Manage Nodes、Data Nodes、SQL Nodes,網路上有很多文章都說 Data Node 是存放資料的地方,明明 SQL Nodes 就存在著 mysql test XXX 等資料庫名稱啊,為何說它是存資料的地方,不會意思是 Data Nodes 是存資料在記憶體的意思吧,是的沒錯,Data Node 確實是儲存資料的地方 (ndbd程序),只是它不是像 /var/lib/mysql 的樣子可以容易被我們看得懂,Data Node 是將資料及index放在記憶體中,且也有存在硬碟裡(停止程序時再啟動資料是還在的),不過當記憶體不足時,它會有錯誤( table XXX is full),新版是有支援寫到硬碟裡。而 SQL Node (mysqld程序) 只是讓我們建立資料庫、表的地方 (看得到/var/lib/mysql/XXX),只是 SQL Node 這邊是看不到實際空間用量的。

環境

manager node: 10.10.10.137
data node1: 10.10.10.135
data node2: 10.10.10.134
data node3: 10.10.10.171
sql node1: 10.10.10.135
sql node2: 10.10.10.134
sql node3: 10.10.10.171

manager node 及所有的 node 都要裝 mysql-cluster (到 mysql 官網下載)

tar zxf mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64.tar.gz
mv mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64 /usr/local/mysql

manager node

mkdir /var/lib/mysql-cluster
cat <<EOF> /var/lib/mysql-cluster/config.ini
[ndb_mgmd default]
datadir=/var/lib/mysql-cluster

[ndbd default]
NoOfReplicas=3
DataMemory=80M
IndexMemory=18M
datadir=/usr/local/mysql/data

[ndb_mgmd]
NodeId=1
hostname=10.10.10.137

[ndbd]
NodeId=2
hostname=10.10.10.135

[ndbd]
NodeId=3
hostname=10.10.10.134

[ndbd]
NodeId=4
hostname=10.10.10.171

[mysqld]
NodeId=5
hostname=10.10.10.135

[mysqld]
NodeId=6
hostname=10.10.10.134

[mysqld]
NodeId=7
hostname=10.10.10.171
EOF

manager node 設定,它只要 ndb_mgm 與 ndb_mgmd 而已

cp -rp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/
chmod +x /usr/local/bin/ndb_mgm*

data nodes

cat <<EOF> /etc/my.cnf
[mysqld]
# enable mysql cluster
ndbcluster
# 與 manager 連線,default port 是 1186
ndb-connectstring=10.10.10.137:1186

[mysql_cluster]
ndb-connectstring=10.10.10.137:1186
EOF

sql nodes

useradd -d /usr/local/mysql mysql
cd /usr/local/mysql
chown -R root .
chown -R mysql data
chgrp -R mysql .
cat <<EOF> /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

default_storage_engine=ndbcluster

# enable mysql cluster
ndbcluster
# 與 manager 連線,default port 是 1186
ndb-connectstring=10.10.10.137:1186

[mysql_cluster]
ndb-connectstring=10.10.10.137:1186

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
socket=/usr/local/mysql/data/mysql.sock
EOF

sql nodes

cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql
yes|cp -rp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server
chmod +x /etc/init.d/mysql.server

cluster 環境開始執行

manager node

ndb_mgmd --nodaemon -v -f /var/lib/mysql-cluster/config.ini

data nodes

/usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v --nodaemon --initial

–initial 只能在第一次完全無正式資料時啟用,不然原資料就會毀了

第二次之後要再啟動,只要如此即可

/usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v --nodaemon

–nodaemon 我只是測試用方便,正式跑時可以省略

sql nodes

/etc/init.d/mysql.server start

匯入已存在的 sql

需要把它們的 engine 都改成 ndbcluster

一定要是 ndb 的 engine,cluster 才會同步

sql nodes 的 mysql 起來後,改一下 root 密碼

/usr/local/mysql/bin/mysqladmin -u root password '123456'

如果有使用 phpmyadmin 遇到無法登入的情況 (錯誤  #2002 無法登入 MySQL 伺服器),那是因為 socket 檔的關系

ln -s /usr/local/mysql/data/mysql.sock /var/lib/mysql/

查看狀態,在 monitor 上

ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	3 node(s)
id=2	@10.10.10.135  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=3	@10.10.10.134  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
id=4	@10.10.10.171  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@10.10.10.137  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]	3 node(s)
id=5	@10.10.10.135  (mysql-5.6.24 ndb-7.4.6)
id=6	@10.10.10.134  (mysql-5.6.24 ndb-7.4.6)
id=7	@10.10.10.171  (mysql-5.6.24 ndb-7.4.6)

 

我測試時是用 virtualbox 架設環境的

  • centos 6.4 x64
  • 1 core cpu
  • 512MB ram
  • 500GB disk
  • wordpress 4.2.2

在大量 insert 資料時,我看 data nodes 每台的 ndbd 的 cpu 使用率在 30% 以下

當我真的 insert 資料後,可以發現在 sql nodes 用 phpmyadmin 查看時,大小的欄位是寫未知,也就是無法知道容量用了多少,就算 du -sh /usr/local/mysql/data/DBNAME 也永遠都是 148KB,也就是說 sql node 只是讓你用來連線 3306 用的,真正的資料確實存在於 data nodes (即 ndbd 啟動的地方)。

情境測試
1x manage node + 1x sql node + 3x data nodes 的情況下
only manage node 掛了,服務正常
1x data node 掛了,服務正常
2x data node 掛了,服務正常
1x data node > 1x data node > 1x manage node 依序掛了,服務正常
1x manage node > 1x data node 依序掛了,中斷,因為 manage node 是負責管理掌管者,沒有它就不知道誰掛了後要怎麼處理了
假如其中一台 data node 掛了,要再起來,不過中途是有資料再寫入了,這台 data node 就要 –initial

Q: index 與 data 是存在 memory,那存在 disk 怎麼作 ?

Q: 怎麼查資料用量 ?

Q: 當 ndbd 的 %MEM 100%時 ?

Q: ERROR 1114 (HY000): The table ‘wp_posts’ is full
A: 評估用量,然後用 http://www.severalnines.com/clusterconfigurator 計算

其它 table full 情況

http://blog.snsgou.com/post-132.html
    DataMemory=15000M
    IndexMemory=2560M

http://www.greensoftcode.net/techntxt/20135434119419995310
    1.config.ini
    [ndbd default]
    NoOfReplicas=2 
    MaxNoOfConcurrentOperations=10000
    DataMemory=320M
    IndexMemory=96M
    TimeBetweenWatchDogCheck=30000
    MaxNoOfOrderedIndexes=512

    2.my.cnf
    [mysqld]
    ndbcluster
    ndb-connectstring=124.95.137.12
    optimizer_switch=engine_condition_pushdown=off

http://www.aichengxu.com/view/51918
    場景一,數據空間或索引內存空間滿
    DataMemory= 80 M
    IndexMemory= 20 M
    場景二,索引數量限制
    MaxNoOfTables= 1024
    MaxNoOfOrderedIndexes= 10240
    MaxNoOfUniqueHashIndexes= 10240
    場景三,數據目錄所在的硬盤空間滿了

Q: 假如把全部 ndbd 全停用時,資料還在嗎 ?
A: 在,但不知道怎麼查看內容 (實際存在狀態)

QA: 要完成 MySQL 叢集的運作環境最少需要 3 台伺服器,MySQL 官方建議最少用 4 台

QA: manage node 不要和 data node 同一台

QA: Management 可以跟 SQL node 放同一台

QA: Management 掛了,不影響服務,除了 Data Node 跟著掛了,所以可以配置兩台 Management 防止

 

以下參考 MySQL Cluster FAQ 截取一些說明

現在的 MySQL Cluster 7.3 版本,已是 MySQL 5.6 了

硬體規格
CPU: Intel/AMD x86, UltraSPARC
Memory: Minimum 1GB RAM
HDD: 3GB
Network: 1+ nodes (Gigabit Ethernet - TCP/IP)

誰適合
High volume OLTP
Real time analytics
Ecommerce and financial trading with fraud detection
Mobile and micro-payments
Session management & caching
Feed streaming, analysis and recommendations
Content management and delivery
Massively Multiplayer Online Games
Communications and presence services
Subscriber/user profile management and entitlements

Availability 99.999% (<5 min downtime/year)

Performance http://www.mysql.com/why-mysql/benchmarks/mysql-cluster/ 每秒可達 200 萬查詢量 (前提要有好的硬體設備) (http://ssorc.tw/5664)

數量配置
2 x data nodes
2 x SQL/NoSQL Application Nodes
2 x Management Nodes

MySQL Cluster 使用是要購買 License 的

MySQL Cluster 記憶體需求的計算公式:
(SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes

MySQL Cluster 叢集安裝環境介紹

* 官方建議叢集伺服器的節點(Node) 硬體配備最低需求:
CPU: Intel/AMD x86
Memory: 512MB RAM
HDD: 3GB
Network: 1+ nodes (Standard Ethernet - TCP/IP)
最佳硬體配備:
CPU: 2x Intel Xeon, Intel Itanium, AMD Opteron, Sun SPARC, IBM PowerPC
Memory: 16GB RAM
HDD: 4x 36GB SCSI (RAID 1 Controller)
Network: 1-8 Nodes (Gigabit Ethernet); 8+ Nodes (Dedicated Cluster Interconnect e.g. SCI)


要完成 MySQL 叢集的運作環境最少需要 3 台伺服器,MySQL 官方建議最少用 4 台 

Management 可以跟 SQL node 放同一台

Management 不能跟 Data node 放同一台

Management 掛了,不影響服務,除了 Data Node 跟著掛了,所以可以配置兩台 Management 防止

Split-Brain 是叢集應用中常見的問題。簡單的說,當叢集中的兩個節點間斷線時,便會認為對方停止服務,因此認為自己是叢集中唯一的節點,於是開始嘗試取代對方的服務,這種狀況通常稱為 Split-brain。

The post MySQL HA 高可用性,MySQL Cluster 叢集 appeared first on SSORC.tw.

相关 [mysql ha 高可用性] 推荐:

MySQL HA 高可用性,MySQL Cluster 叢集

- - SSORC.tw
而 SQL Node (mysqld程序) 只是讓我們建立資料庫、表的地方 (看得到/var/lib/mysql/XXX),只是 SQL Node 這邊是看不到實際空間用量的. manager node 及所有的 node 都要裝 mysql-cluster (到 mysql 官網下載). manager node 設定,它只要 ndb_mgm 與 ndb_mgmd 而已.

MySQL HA 的選擇…

- - Gea-Suan Lin's BLOG
Percona 把常見的 MySQL High Availability 選擇整理後發表成 Webinar,投影片在這裡可以看到 (以及下載):「 Choosing a MySQL High Availability Solution」. 沒有太多新的東西,主要還是再次描述 MySQL HA 這塊目前沒有萬靈丹,常見的這幾個方案各有自己的優缺點,會依照環境與需求而產生不同的選擇.

oracle HA 高可用性详解

- - CSDN博客推荐文章
FAILOVER,Oracle RAC的高可用性的技术基础是Failover,就是指集群中的热河一个节点的故障都不会影响到用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户高手而言感觉不到这种切换,这个功能在Oracle中被称作Failover(故障转移). Oracle RAC的Failover可以细分为3中,分别是:.

利用keepalived构建高可用MySQL-HA(转)

- - 数据库 - ITeye博客
关于MySQL-HA,目前有多种解决方案,比如heartbeat、drbd、mmm、共享存储,但是它们各有优缺点. heartbeat、drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题;对于mmm,生产环境中很少有人用,且mmm 管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支;对于共享存储,个人觉得MySQL数据还是放在本地较为安全,存储设备毕竟存在单点隐患.

MySQL高可用性大杀器之MHA

- - OurMySQL
作为前提条件,应先配置MySQL复制,并设置 SSH公钥免密码登录. 下面以CentOS为例来说明,最好先安装 EPEL,不然YUM可能找不到某些软件包. MHA由Node和Manager组成,Node运行在每一台MySQL服务器上,也就是说,不管是MySQL主服务器,还是MySQL从服务器,都要安装Node,而Manager通常运行在独立的服务器上,但如果硬件资源吃紧,也可以用一台MySQL从服务器来兼职Manager的角色.

[转][转]MySQL高可用性之Keepalived+Mysql(双主热备)

- - heiyeluren的blog(黑夜路人的开源世界)
1、配置两台Mysql主主同步. #backup这台设置2 log-bin = mysql-bin binlog-ignore-db = mysql,information_schema. #忽略写入binlog日志的库 auto-increment-increment = 2. #字段变化增量值 auto-increment-offset = 1.

nginx + keepalive 实现HA

- - CSDN博客编程语言推荐文章
主nginx负载均衡器 192.168.166.203. 辅nginx负载均衡器 192.168.166.177. VIP地址 192.168.166.178. 二.修改配置文件为以下内容: [master slave].  state MASTER #(主机为MASTER,备用机为BACKUP).

SUSE Linux HA双机搭建

- - CSDN博客数据库推荐文章
原来的数据库服务器运行在HP DL388G7服务器上面,内存32G,由于业务增长,内存吃紧,加上时不时出现服务器硬件故障,由于是单实例单服务器,存在单点发现,于是打算采取一些措施改善一下:. 2)并搭建服务器操作系统级别的双机. 3)迁移数据库数据到新服务器. 前面已经写过数据迁移相关的文章,题目为“ EXP/IMP迁移数据”,链接如下: http://blog.csdn.net/laven54/article/details/8877940.

hdfs-ha热备原理

- - 开源软件 - ITeye博客
下面的总结来自于: http://dongxicheng.org/hadoop-hdfs/hdfs-ha-federation-deploy/ .            Hadoop 2.0中的HDFS增加了两个重大特性,HA和Federaion. HA即为High Availability,用于解决NameNode单点故障问题,该特性通过热备的方式为主NameNode提供一个备用者,一旦主NameNode出现故障,可以迅速切换至备NameNode,从而实现不间断对外提供服务.