Mysql cluster 安装配置手册

目录

系统简介.... 1

1. 安装系统.... 2

1.1 安装centOS6.4. 2

1.2 关闭SELINUX. 2

1.3 系统升级并删除旧内核... 2

1.4 开启防火墙相应端口... 2

1.5 安装编译工具... 3

1.6 安全更新... 3

1.7 软件安装环境设置... 3

1:设定系统目录... 3

1.1:软件存放目录... 3

1.2:软件下载路径... 3

1.8 ip 地址设置... 4

1:管理节点设置如下... 4

2:数据节点1设置如下:... 4

3:数据节点2设置如下:... 5

1.9 ntp 配置... 6

1:在管理节点上配置如下... 6

2:数据节点和sql节点上配置如下... 6

1.10 应用软件清单... 6

2. 应用程序安装配置.... 7

2.1服务端管理节点安装... 7

1基础环境配置... 7

2:修改管理配置文件... 7

3启动应用程序... 10

2.2数据节点和sql节点(172.16.10.115)安装... 11

1基础环境安装... 11

2:安装应用程序... 11

3:启动应用程序... 12

3. 功能测试.... 13

3.1 数据复制功能... 13

1:登陆172.16.10.115. 13

2:登陆 172.16.10.116 查看数据是否完整复制... 13

3.2 增加新的节点... 13

1:修改管理节点的config.ini配置文件... 13

2:重启管理节点... 14

3:滚动重启旧的数据存储节点服务... 14

4滚动重启所有的数据查询节点服务... 15

5:以初如化方式启动新增加的数据存储节点... 15

6:为新节点增加分组... 15

7:重新分配集群数据... 16

3.3数据节点故障切换... 17

1:模拟节点故障... 17

2登陆管理台查看系统状态... 17

3:测试数据访问... 17

3.4 sql 节点均衡负载... 17

1:部署keepalived + LVS. 17

2:真实主机上配置添加启动脚本... 20

3.5 双管理节点设置... 22

1修改管理节点配置文件... 22

2复制配置文件... 22

3轮流重启管理节点... 22

4修改数据节点和sql节点配置文件... 22

5轮流重启数据节点... 23

6轮流重启sql节点... 23

3.6数据节点故障恢复... 23

1安装应用软件... 23

2复制mysql配置文件... 23

3: 启动数据节点程序... 24

4创建需要的应用数据库... 24

3.7 创建磁盘表... 24

1创建日志文件组... 24

2创建表空间... 24

3:创建表使用磁盘表... 25

3.8删除表空间... 25

1:删除使用该表空间的表... 25

2:删除所有数据文件... 25

3:删除表空间... 26

命令格式如下: mysql> DROP TABLESPACE ts_1 -> ENGINE NDBCLUSTER;26

4:查看表空间使用情况... 26

5:删除日志文件组... 26

3.9 MySQL簇的联机备份... 26

1:簇备份概念... 26

2:备份参数... 27

3:备份步骤... 28

4:要想放弃正在处理的备份... 29

5:如何恢复簇备份... 29

6:注意事项... 32

4.故障处理.... 32

4.1. 错误一... 32

4.2. 错误二... 33

1:修改数据节点Mysql的配置文件... 33

2:修改管理节点配置文件增大数据和索引大小... 33

3:增大表空间容量... 33

4.3.错误三... 34

4.4.错误四... 35

4.5.错误五... 35

4.6.错误六... 36

4.7.错误七... 36

4.8.错误八... 37

4.9.错误九... 37










系统简介

该系统应用mysql cluster gpl 版本安装,具有mysqlcluster的功能,其中包括数据复制,故障切换,应用数据备份等内容,结合keepalived +lvs 系统实现访问节点的负载均衡,可以对数据的告诉访问提供有效的支持。“NDB” 是一种内存中存储引擎,它具有可用性高和数据一致性好的特点。

MySQL Cluster 能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但在 Cluster 级别上的存储引擎上做这个最简单。MySQL ClusterNDB存储引擎包含完整的数据集,仅取决于 Cluster本身内的其他数据。MySQL Cluster Cluster部分可独立于MySQL服务器进行配置。在MySQL Cluster中, Cluster的每个部分被视为1个节点。管理(MGM)节点:这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令“ndb_mgmd”启动的。数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。数据节点是用命令“ndbd”启动的。 SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld–ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。注释:在很多情况下,术语节点用于指计算机,但在讨论MySQL Cluster时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语“ Cluster主机

1. 安装系统

1.1 安装centOS6.4

最小化安装的centOS6.4

分别安装两台mysql cluster管理节点服务器、两台mysql cluster 数据节点服务器和sql节点服务器,sql节点和数据节点可以在一台机子上安装。

1.2 关闭SELINUX

#vi /etc/selinux/config

  #SELINUX=enforcing     #注释掉此项

  #SELINUXTYPE=targeted  #注释掉此项

SELINUX=disabled #增加关闭selinux

  :wq  保存,关闭。

  #shutdown -r now重启系统

1.3 系统升级并删除旧内核

使用下列命令对系统进行强制升级

yum -y update

执行该命令查看已有的内核版本

   #rpm -q kernel

通过参数-e加上内核全名来删除想删除的内核版本

   #rpm -e xxxxxxxx

注意:删除就内核后需要重启系统,绿色字体为具体的版本号

1.4 开启防火墙相应端口

打开防火墙相应的端口

#vi/etc/sysconfig/iptables

在打开的文件中添加下面的内容(在22端口的下面添加)

-A INPUT -m state --stateNEW -m tcp -p tcp --dport 3306 -j ACCEPT

-A INPUT -m state --stateNEW -m tcp -p tcp --dport 1186 -j ACCEPT

#开启33061186端口

#/etc/init.d/iptablesrestart  #重启防火墙使配置生效

1.5 安装编译工具

对所有服务器安装编译工具,执行如下命令

#rpm -e mysql-libs --nodeps

#yum install wget  make gcc gcc-c++ zlib-devel opensslopenssl-devel pcre-devel gd  kernel keyutils  patch  perlpopt-static kernel-devel libnl* popt*  yum-security  ntp make cmake bison perl libaio python-paramiko.noarch


1.6 安全更新

系统稳定后定期对系统进行安全更新,命令如下:

#yum --security check-update    

1.7 软件安装环境设置

1:设定系统目录

1.1:软件存放目录

输入如下命令,让软件存储到此目录下/usr/local/src

#cd /usr/local/src

1.2:软件下载路径

#wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar

#tar –xvf MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar

1.8 ip 地址设置

1:管理节点设置如下

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

内容如下:

DEVICE=eth0

TYPE=Ethernet

UUID=f97bf9ed-e6ab-4243-adcb-d055a1fe33f1

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=none

HWADDR=00:0C:29:EC:D6:21

IPADDR=172.16.10.117

PREFIX=24

GATEWAY=172.16.10.254

DNS1=8.8.8.8

DEFROUTE=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

#service network restart

2:数据节点1设置如下:

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

内容如下:

DEVICE=eth0

TYPE=Ethernet

UUID=f97bf9ed-e6ab-4243-adcb-d055a1fe33f1

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=none

HWADDR=00:0C:29:EC:D6:21

IPADDR=172.16.10.115

PREFIX=24

GATEWAY=172.16.10.254

DNS1=8.8.8.8

DEFROUTE=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

#service network restart

3:数据节点2设置如下:

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

内容如下:

DEVICE=eth0

TYPE=Ethernet

UUID=f97bf9ed-e6ab-4243-adcb-d055a1fe33f1

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=none

HWADDR=00:0C:29:EC:D6:21

IPADDR=172.16.10.116

PREFIX=24

GATEWAY=172.16.10.254

DNS1=8.8.8.8

DEFROUTE=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

#service network restart


1.9 ntp 配置

1:在管理节点上配置如下

#vi /etc/ntp.conf

添加一下内容:

restrict 172.16.10.0 mask 255.255.255.0 nomodifynotrap

保存退出后,重启ntp服务

#service ntpd restart

#chkconfig ntpd on

2:数据节点和sql节点上配置如下

#vi /etc/ntp.conf

注释掉一下内容:

#server 0.centos.pool.ntp.org iburst

#server 1.centos.pool.ntp.org iburst

#server 2.centos.pool.ntp.org iburst

#server 3.centos.pool.ntp.org iburst

增加下面一行

server 172.16.10.117

#service ntpd restart

#chkconfig ntpd on

1.10 应用软件清单

操作系统:centos6.4 64bit

数据库软件:

MySQL-Cluster-client-gpl-7.3.3-1.el6.x86_64.rpm

MySQL-Cluster-devel-gpl-7.3.3-1.el6.x86_64.rpm

MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm

Keepalived 软件:

keepalived-1.1.17.tar.gz

Lvs软件:

ipvsadm-1.24.tar.gz

2. 应用程序安装配置

2.1服务端管理节点安装

1基础环境配置

#rpm -e mysql-libs --nodeps

#yum -y install make cmake bison

#yum -y install perl libaio

#yum -yinstall python-paramiko.noarch

#cd /usr/local/src

#wget http://downloads.mysql.com/archives/get/file/MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm

#yum -y localinstall  MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm

2:修改管理配置文件

#mkdir /var/lib/mysql-cluster

#vi /var/lib/mysql-cluster/config.ini

内容如下:

#

# Configuration file for MyCluster

#


[NDB_MGMD DEFAULT]

Portnumber=1186


[NDB_MGMD]

NodeId=46

HostName=172.16.10.117

DataDir=/var/lib/mysql-cluster/

Portnumber=1186


[TCP DEFAULT]

SendBufferMemory=4M

ReceiveBufferMemory=4M


[NDBD DEFAULT]

BackupMaxWriteSize=1M

BackupDataBufferSize=16M

BackupLogBufferSize=4M

BackupMemory=20M

BackupReportFrequency=10

MemReportFrequency=30

LogLevelStartup=15

LogLevelShutdown=15

LogLevelCheckpoint=8

LogLevelNodeRestart=15

DataMemory=8M

IndexMemory=4M

MaxNoOfTables=4096

MaxNoOfOrderedIndexes=4096

MaxNoOfTriggers=3500

NoOfReplicas=2

StringMemory=25

DiskPageBufferMemory=256M

SharedGlobalMemory=96M

LongMessageBuffer=32M

MaxNoOfConcurrentTransactions=16384

BatchSizePerLocalScan=512

FragmentLogFileSize=64M

NoOfFragmentLogFiles=16

RedoBuffer=32M

MaxNoOfExecutionThreads=2

StopOnError=false

LockPagesInMainMemory=1

TimeBetweenEpochsTimeout=32000

TimeBetweenWatchdogCheckInitial=60000

TransactionInactiveTimeout=60000

HeartbeatIntervalDbDb=15000

HeartbeatIntervalDbApi=15000

MaxNoOfAttributes= 34760


[NDBD]

NodeId=1

HostName=172.16.10.115

DataDir=/var/lib/mysql/


[NDBD]

NodeId=2

HostName=172.16.10.116

DataDir=/var/lib/mysql/



[MYSQLD DEFAULT]


[API]

NodeId=50

HostName=172.16.10.115


[API]

NodeId=51

HostName=172.16.10.116


[API]


[API]


###############################################################################

其中 172.16.10.117 为管理节点ip.172.16.10.115172.16.10.116 为数据库节点ip.[API]用于表示MysqldAPI)节点的定义,空的[API]必须和现有API节点数一致。[NDBD]用于表示数据节点的定义。[NDB_MGMD]用于定义管理节点,多个管理节点的情况。需要分别用[NDB_MGMD]定义各个节点。SQL节点和数据节点定义的管理IP之间用,分割。

注意区分大小写

3启动应用程序

# /usr/sbin/ndb_mgmd -f/var/lib/mysql-cluster/config.ini

#vi /etc/rc.local

加入一下内容:

/usr/sbin/ndb_mgmd -f/var/lib/mysql-cluster/config.ini

2.2数据节点和sql节点(172.16.10.115)安装

1基础环境安装

#rpm -e mysql-libs

# cd /usr/local/src/

#wget http://downloads.mysql.com/archives/get/file/MySQL-Cluster-client-gpl-7.3.3-1.el6.x86_64.rpm

#wget  http://downloads.mysql.com/archives/get/file/MySQL-Cluster-devel-gpl-7.3.3-1.el6.x86_64.rpm

#wget http://downloads.mysql.com/archives/get/file/MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm

2:安装应用程序

#yum -y localinstallMySQL-Cluster-*

#vi /etc/my.cnf

内容如下:

[mysql_cluster]

ndb-connectstring="172.16.10.117:1186"

[mysqld]

ndbcluster

ndb-connectstring="172.16.10.117:1186"

datadir=/var/lib/mysql

port=3306

###############################################################################

其中172.16.10.117 为管理节点ip。注意格式。在ip地址和端口上要加“号。

3:启动应用程序

#/etc/init.d/mysql restart

#chkconfig mysql on

#ndbmtd --initial              #第一次启动的时候使用(仅限第一次使用和备份恢复数据

时使用,以后不能使用该命令,否则会丢失所有数据)

#ndbmtd                                   #以后启动数据节点,使用该命令

#vi /etc/rc.local

加入一下内容:

/usr/sbin/ndbmtd

172.16.10.116 安装方法和172.16.10.115 安装方法一样。

登陆管理端

#ndb_mgm

ndb_mgm> show

出现一下内容表示连接正常

spacer.gif

3. 功能测试

3.1 数据复制功能

1:登陆172.16.10.115

#mysql -uroot -p

mysql>create database hahaha;

mysql>use hahaha

mysql>create table ddd(id int) engine=ndbcluster;

mysql>insert into ddd valuez(1)

注意在节点上创建表时,表的引擎为ndbcluster

2:登陆 172.16.10.116 查看数据是否完整复制

#mysql –uroot –p

Mysql>use hahaha;

Mysql>select * from ddd;

3.2 增加新的节点

注意:增加或减少数据节点的数量和NoOfReplicas(即副本数,通过管理节点的config.ini配置文件来设置)有关,一般来说NoOfReplicas2,那么增加或减少的数量也应该是成对的,否则要设置另外的NoOfReplicas。首先必须确保新加入的数据节点作为新的group加入,默认2node1groupGroup数量=Node总数/NoOfReplicas数。

1:修改管理节点的config.ini配置文件

添加如下一段:

[NDBD]
NodeId=6
HostName= 172.16.10.118
Datadir=/var/lib/mysql
[NDBD]
NodeId=7
HostName= 172.16.10.119
Datadir=/var/lib/mysql

这里的Id不能跟已有的Id重复

2:重启管理节点

reload方式启动管理节点

执行ndb_mgm进入管理命令界面

找到管理节点的id,然后执行管理节点id stop,退出

[root@sg204mysql-cluster]# libexec/ndb_mgmd -f /opt/mysql-cluster/etc/config.ini --reload   #加上reload参数,使得修改过的config.ini生效

启动成功后用show查看,可以看到新加入的数据节点,并且处于未连接状态。

3:滚动重启旧的数据存储节点服务

(滚动重启,不能所有节点同时重启,如果同时停止,数据库前端查询就会出现错误)

ndb_mgm> 2 RESTART

Node 2: Node shutdown initiated

Node 2: Node shutdown completed, restarting, no start.

Node 2 is being restarted

ndb_mgm> Node 2: Start initiated (version 7.1.19)

Node 2: Started (version 7.1.19)

ndb_mgm> 3 RESTART

Node 3: Node shutdown initiated

Node 3: Node shutdown completed, restarting, no start.

Node 3 is being restarted

ndb_mgm> Node 3: Start initiated (version 7.1.19)

ndb_mgm> Node 3: Started (version 7.1.19)

4滚动重启所有的数据查询节点服务

[root@sg204 mysql-cluster]#bin/mysqladmin-uroot -ppassword shutdown

[root@sg204 mysql-cluster]# mysqld_safe--console --ndbcluster --ndb-connectstring=172.16.10.117

5:以初如化方式启动新增加的数据存储节点

[root@sg204 mysql-cluster]#ndbd –c 172.16.10.117 --initial

启动后在管理节点上用show命令查看可以看到新加入的节点已经启动并处于未分组状态


id=3 @172.16.10.118 ((mysql-5.6.14 ndb-7.3.3, nonodegroup)
id=4 @172.16.10.119 ((mysql-5.6.14 ndb-7.3.3, no nodegroup)


6:为新节点增加分组

在管理节点上ndb_mgm下输入以下命令:

ndb_mgm> create nodegroup 3,4


这时在管理节点上show,可以看到新节点已经分组。

ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=1 @172.16.10.115 (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, Master)
id=2 @172.16.10.116 (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)
id=3 @172.16.10.117 (mysql-5.6.14 ndb-7.3.3, Nodegroup: 1)
id=4 @172.16.10.118 (mysql-5.6.14 ndb-7.3.3, Nodegroup: 1)

[ndb_mgmd(MGM)] 1 node(s)
id=49 @172.16.10.117 (mysql-5.6.14 ndb-7.3.3)

[mysqld(API)] 4 node(s)
id=4 @172.16.10.115 (mysql-5.6.14 ndb-7.3.3)
id=5 @172.16.10.116 (mysql-5.6.14 ndb-7.3.3)
id=8 @172.16.10.117 (mysql-5.6.14 ndb-7.3.3)
id=9 @172.16.10.118 (mysql-5.6.14 ndb-7.3.3)


7:重新分配集群数据

登陆任意sql客户端连接数据库

#mysql –uroot -p

Mysql>SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'NDBCLUSTER';
Mysql>ALTER ONLINE TABLE table_name REORGANIZEPARTITION;

Mysql >OPTIMIZE TABLE table_name ;
然后通过show命令或者使用ndb_desc命令查看

ndb_desc -c 172.16.10.117 -d tuge datasource -p

-c后面跟管理节点的ip-d跟数据库的名字,datasource为表名,-p输出分区的详细信息迁移之后空间还没有释放出来,需要通过optimize命令优化表,释放迁移走的空间(当optimize一个ndb大表的时候很慢,很容易出问题)

3.3数据节点故障切换

1:模拟节点故障

登陆数据节点服务器,使用一下命令结束掉进程

# pkill -9 ndbmtd

2登陆管理台查看系统状态

Ndb_mgm>show

如下图状态所示

spacer.gif

3:测试数据访问

登陆sql节点连接数据库

# mysql –uroot –p

查看数据是否完整。

Mysql>select count(*)  from table_name ;

查看数据插入是否正常。

Mysql>insert into table_name values();

3.4 sql 节点均衡负载

1:部署keepalived + LVS

在管理节点上部署keepalived+lvs。配置过程参考keepalived+lvs 安装文档

Keeplived 配置文件示例是如下图

! Configuration File for keepalived


global_defs {

 notification_email {                        #定义了发送报警的email

   acassen@firewall.loc

   failover@firewall.loc

   sysadmin@firewall.loc

  }

 notification_email_from Alexandre.Cassen@firewall.loc

 smtp_server 192.168.200.1

 smtp_connect_timeout 30

 router_id LVS_DEVEL                   #定义了vrrp routerID,主备需要一致

}


vrrp_instance VI_81 {

   stateMASTER

#备份服务器上将MASTER改为BACKUP

  interface eth0                              #keepalive检测的网络接口

  virtual_router_id 81               #主、备机的virtual_router_id必须相同

  priority 100                    #主、备机取不同的优先级,主机 > 备份机

  advert_int 1         #VRRPMulticast广播周期秒数

  authentication {

      auth_type PASS      #VRRP认证方式

      auth_pass 1111       #VRRP口令字

   }

  virtual_ipaddress {

       172.16.10.119

#(这里写用于服务的VIP,这些VIP不会被用于keepalived检测状态)

#       192.168.200.17

#       192.168.200.18

   }

}


virtual_server 172.16.10.119 3306 {            # 定义用于服务的virtual_server

  delay_loop 6                               #每隔2秒查询realserver状态

  lb_algo wrr                                        #LVS调度算法为Round Robin

  lb_kind DR                                  #LVS工作模式为Direct Route

  nat_mask 255.255.255.0

  persistence_timeout 50

  protocol TCP



  real_server 172.16.10.116 3306 {          #定义Real Server

      weight 1                                       #RealServer的权重

      TCP_CHECK {

          connect_timeout 3    #连接超时时间

          nb_get_retry 3          #重试次数

          delay_before_retry 3 #延迟时间

       }

   }


  real_server 172.16.10.116 3306 {

      weight 1

      TCP_CHECK {

          connect_timeout 3

          nb_get_retry 3

          delay_before_retry 3

       }

   }

}

2:真实主机上配置添加启动脚本

# vi /bin/lvs_DR.sh

内容如下

#!/bin/bash

# Writtenby NetSeek

#description: Config realserver lo and apply noarp

WEB_VIP=192.168.2.3


./etc/rc.d/init.d/functions


case"$1" in

start)

      ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP

#在回环接口上添加ip为虚拟ip的主机地址,广播地址为本身。

      /sbin/route add -host $WEB_VIP dev lo:0

#为虚拟ip做一个主机路由

      echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

      echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

      echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

      echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

#将上面的参数设定为指定的值

      sysctl -p >/dev/null 2>&1

      echo "RealServer Start OK"


       ;;

stop)

      ifconfig lo:0 down

      route del $WEB_VIP >/dev/null 2>&1

      echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

      echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

      echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

      echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

      echo "RealServer Stoped"

       ;;

status)

        #Status of LVS-DR real server.

       islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP`

       isrothere=`netstat -rn | grep "lo:0" | grep $web_VIP`

       if [ ! "$islothere" -o ! "isrothere" ];then

           # Either the route or the lo:0 device

           # not found.

           echo "LVS-DR real server Stopped."

       else

           echo "LVS-DR Running."

       fi

;;

*)

        #Invalid entry.

       echo "$0: Usage: $0 {start|status|stop}"

       exit 1

;;

esac

exit 0

# vi /etc/rc.local

添加开机启动项:

/bin/lvs_DR.sh start

3.5双管理节点设置

ndb 管理节点提供热备

1修改管理节点配置文件

#vi /var/lib/mysql-cluster/config.ini

[NDB_MGMD] 段的上方。增加新的[NDB_MGMD]段内容如下:

[NDB_MGMD]

NodeId=48                                                                    #新节点id48,老的节点ip49

HostName=172.16.10.21                                                #新管理节点ip

DataDir=/var/lib/mysql-cluster/

Portnumber=1186

注意NodeId 不要和现有的NodeId冲突

2复制配置文件

登陆新增加的管理节点

将原有管理节点上的配置文件,复制到新管理节点/var/lib/mysql-cluster

3轮流重启管理节点

登陆管理节点1,进行重启

#pkill -9 ndb_mgmd

#ndb_mgmd –f /var/lib/mysql-cluster/config.ini  --reload

登陆管理节点2,进行重启

#pkill -9 ndb_mgmd

#ndb_mgmd –f/var/lib/mysql-cluster/config.ini --reload


4修改数据节点和sql节点配置文件

#vi /etc/my.cnf

修改内容如下:

[mysql_cluster]

ndb-connectstring="172.16.10.117:1186","172.16.10.21:1186"

[mysqld]

ndbcluster

ndb-connectstring="172.16.10.117:1186","172.16.10.21:1186"

datadir=/var/lib/mysql

port=3306

5轮流重启数据节点

登陆数据节点1,进行重启

#pkill  -9 ndbmtd

#ndbmtd

登陆数据节点2,进行重启

#pkill  -9ndbmtd

#ndbmtd

6轮流重启sql节点

登陆sql节点1,进行重启

#/etc/init.d/mysql restart

登陆sql节点2,进行重启

#/etc/init.d/mysql restart

3.6数据节点故障恢复

1安装应用软件

#yum –y install MySQL-Cluster-server-*MySQL-Cluster-client-* MySQL-Cluster-devel-*

2复制mysql配置文件

复制其他节点的配置文件my.cnf/etc/目录下

3:启动数据节点程序

执行一下命令

#ndbmtd –initial

#/etc/init.d/mysql start

4创建需要的应用数据库

#mysql –uroot –p

Mysql>create database ‘数据库名’


3.7 创建磁盘表

1创建日志文件组

执行一下命令:

#mysql –uroot –p

Mysql> CREATE LOGFILEGROUP lg_2

ADD UNDOFILE 'undo_2.log'

INITIAL_SIZE 1024M

UNDO_BUFFER_SIZE 128M

ENGINE NDBCLUSTER;

2创建表空间

执行一下命令

#mysql –uroot –p

Mysql> CREATE TABLESPACE ts_2    ADDDATAFILE 'data_2.dat'  USE LOGFILE GROUP lg_2  INITIAL_SIZE 409600M ENGINENDBCLUSTER;

3:创建表使用磁盘表

命令行格式如下

#mysql –uroot –p

Mysql>CREATE TABLE (id int …….)TABLESPACE ts_2STORAGE DISK ENGINE=NDBCLUSTER;

3.8删除表空间

删除日志文件组或者表空间的时候需要按顺序删除,只有在无表使用数据文件的时候才能删除数据文件

操作顺序:

1:删除使用该表空间的表

执行一下命令

mysql>DROP TABLE dt_1;

2:删除所有数据文件

命令格式如下:

mysql> ALTER TABLESPACE ts_1
DROP DATAFILE 'data_2.dat'
ENGINE NDBCLUSTER;

mysql> ALTER TABLESPACE ts_1
DROP DATAFILE 'data_1.dat'
ENGINE NDBCLUSTER;

3:删除表空间

命令格式如下:
mysql> DROP TABLESPACE ts_1
-> ENGINE NDBCLUSTER;

4:查看表空间使用情况

命令格式如下:

Mysql>SELECT TABLESPACE_NAME, FILE_NAME,EXTENT_SIZE*TOTAL_EXTENTS/1024/1024 AS TOTAL_MB,EXTENT_SIZE*FREE_EXTENTS/1024/1024 AS FREE_MB, EXTRA FROMinformation_schema.FILES WHERE FILE_TYPE="DATAFILE";

5:删除日志文件组

说明:只有使用UNDO logfile group的表空间都删除情况下才能删除undo logfile group
操作语法:
mysql> DROP LOGFILE GROUP lg_1
ENGINE NDBCLUSTER;

查看undo日志文件使用量信息
mysql>select * from ndbinfo.logspaces wherelog_type='DD-UNDO';

mysql>SELECT FILE_NAME, LOGFILE_GROUP_NUMBER,EXTRA     FROMINFORMATION_SCHEMA.FILES  WHERELOGFILE_GROUP_NAME = 'lg_2';

3.9 MySQL簇的联机备份


1:簇备份概念

备份指的是在给定时间对数据库的快照。备份包含三个主要部分:
1Metadata(元数据):所有数据库表的名称和定义。
2Table records(表记录):执行备份时实际保存在数据库表中的数据。
3Transaction log(事务日志):指明如何以及何时将数据保存在数据库中的连续记录。
每一部分(这三部分)均会保存在参与备份的所有数据节点上。在备份过程中,每个节点均会将这三个部分保存在磁盘上的三个文件中(意思是说,有几个节点,将会把相同的数据,保存几份.例如,2个数据节点,那么就会分别在2个节点上,保存2次,保存目录默认为
[NDBD]
DateDir=/usr/local/mysql/BACKUP
4BACKUP-backup_id.node_id.ctl
包含控制信息和元数据的控制文件。每个节点均会将相同的表定义(对于簇中的所有表)保存在自己的该文件中
5BACKUP-backup_id-0.node_id.data
包含表记录的数据文件,它是按片段保存的,也就是说,在备份过程中,不同的节点会保存不同的片段。每个节点保存的文件以指明了记录所属表的标题开始。在记录清单后面有一个包含关于所有记录校验和的脚注。
6BACKUP-backup_id.node_id.log
包含已提交事务的记录的日志文件。在日志中,仅保存已在备份中保存的表上的事务。参与备份的节点将保存不同的记录,这是因为,不同的节点容纳了不同的数据库片段。
在上面所列的内容中,backup_id指的是备份IDnode_id是创建文件的节点的唯一ID
使用管理服务器创建备份开始备份前,请确保已为备份操作恰当地配置了簇。

2:备份参数

(以下参数,都写入在mgmdconfig.ini配置文件中)
本节讨论的参数定义了与在线备份执行有关的内存缓冲集。
1BackupDataBufferSize
在创建备份的过程中,为了将数据发送到磁盘,将使用两类缓冲。备份数据缓冲用于填充由扫描节点的表而记录的数据。一旦将该缓冲填充到了指定的水平BackupWriteSize(请参见下面的介绍),就会将页发送至磁盘。在将页写入磁盘的同时,备份进程能够继续填充该缓冲,直至其空间消耗完为止。出现该情况时,备份进程将暂停扫描,直至一些磁盘写入操作完成并释放了内存为止,然后扫描继续。
该参数的默认值为2MB
2BackupLogBufferSize
备份日志缓冲扮演的角色类似于备份数据缓冲,不同之处在于,它用于生成备份执行期间进行的所有表写入的日志。相同的原理也适用于备份数据缓冲情形下的页写入,不同之处在于,当备份日志缓冲中没有多余空间时,备份将失败。出于该原因,备份日志缓冲的大小应足以处理执行备份时产生的负载。
该参数的默认值对于大多数应用程序均是适当的。事实上,备份失败的原因更可能是因为磁盘写入速度不够,而不是备份日志缓冲变满。如果没有为应用程序产生的写负载配置磁盘子系统,簇很可能无法执行所需的操作。最好按恰当的方式配置簇,使得处理器成为瓶颈而不是磁盘或网络连接。默认值是2MB
3BackupMemory
该参数是BackupDataBufferSizeBackupLogBufferSize之和。默认值是2MB + 2MB = 4MB
4BackupWriteSize
该参数指定了由备份日志缓冲和备份数据缓冲写入磁盘的消息大小。默认值是32KB.
5BackupDataDir
#
可更改默认的备份目录,BackupDataDir=/mysqlback
#
当然前提,mkdir /mysqlback ,需要在所有数据节点上运行
也能指定存放备份的目录。默认情况下,该目录是FileSystemPath/BACKUP
6FileSystemPath
该参数指定了存放为元数据创建的所有文件、REDO日志、UNDO日志和数据文件的目录。默认目录是由DataDir指定的。注意,启动ndbd进程之前,该目录必须已存在。
7DataDir
该参数指定了存放跟踪文件、日志文件、pid文件以及错误日志的目录。

3:备份步骤

使用管理服务器创建备份包含以下步骤:
1)启动管理服务器(ndb_mgm)
2)执行命令START BACKUP
3)管理服务器将用消息“指示备份开始”作出应答。这意味着管理服务器将请求提交给了簇,但尚未收到任何回应。
4)管理服务器回复“备份backup_id开始”,其中,backup_id是该备份的唯一ID(如果未作其他配置,该ID还将保存在簇日志中)。这意味着簇已收到并开始处理备份请求。它不表示备份已完成。
5)管理服务器发出消息“备份backup_id完成”,通知备份操作已结束。

如下图示例(其中2 表示备份id):
#ndb_mgm> start backup 2;

Waiting for completed, this may take severalminutes

Node 1: Backup 2 started from node 49

Node 1: Backup 2 started from node 49 completed

StartGCP: 489 StopGCP: 492

#Records: 2089 #LogRecords: 0

Data: 52400 bytes Log: 0 bytes

ndb_mgm> Node 1: Started (version 7.3.3)

Node 2: Started (version 7.3.3)
上例中表示该备份实在节点node 49 这台机子上执行的,所以在执行恢复操作时。在需要先在node 49 这台机子上,执行恢复操作命令如下:

#ndb_restore -c 172.16.10.117-n 2 -m -b 1 -r /mysql/BACKUP/BACKUP-1/

mgmd为管理节点的ip
node_id为数据节点ID,mgm的客户端通过show查看
-m在第一个数据节点上执行,它的作用恢复数据元,数据元的作用:所有数据库表的名称和定义.在其他节点,上就不需要此参数了.
backup_id就是备份的次数.也就是你在此startbackup,提示的那个id

4:要想放弃正在处理的备份

1)启动管理服务器。
2)执行命令ABORT BACKUP backup_idbackup_id是当备份开始时包含在管理服务器应大中的备份ID(在消息“备份backup_id启动”中)
3)管理服务器用消息“放弃指示的备份backup_id”确认放弃请求,注意,尚未收到对该请求的实际回应。
4)一旦放弃了备份,管理服务器将通报“备份backup_idXYZ而放弃”。这意味着簇中止了备份,并从簇文件系统中删除了与该备份有关的所有文件。在系统shell中使用下述命令,也能放弃正在执行的备份:shell> ndb_mgm -e "ABORT BACKUP backup_id"
注释:执行放弃操作时,如果没有IDbackup_id的备份,管理服务器不会给出任何明确回应。但是,所发出的无效放弃命令将在簇日志中给出

5:如何恢复簇备份

簇恢复程序是作为单独的命令行实用工具ndb_restore实现的,它将读取由备份(由在管理节点的客户端上执行start backup)创建的文件,并将保存的信息插入数据库。必须为每组备份文件执行恢复程序,也就是说,执行次数与创建备份时运行的数据库节点数相同。(当初创建备份时,有几个数据节点参与,就需要执行这样的命令几次,2个数据节点,就需要执行2,但第一次与第二次在参数上是不同的,第一次需要参数-m,第二次,不用加此参数,此参数的作用是,创建数据元.)


首次执行恢复程序时,还需要恢复元数据。换句话讲,必须重新创建数据库表(注意,开始执行恢复操作时,簇中应有一个空数据库,这里说的创建数据库表,并不是说,让你在sql节点上,在指定的库内,createtable建个空白,而是说,ndb_restore命令中的一个参数-m)。恢复程序对于簇来说相当于API,因此,需要一个空闲连接,以便与簇相连。(为此,我们可以在config.ini中添加一个[mysqld],以便于有个空的节点ID,为它提供.)可使用ndb_mgm命令SHOW(在系统shell下使用ndb_mgm-e SHOW即可完成该操作)进行验证,查看,是否有一个空的mysql(api)节点,没有任何连接,并且允许任意主机,连接。可以使用开关“-c connectstring”来确定MGM节点的位置。(关于连接字符串的更多信息,请参见17.4.4.2节,“MySQL簇连接字符串。备份文件必须位于恢复程序参量给定的目录下。能够使用与创建时所用配置不同的配置,将备份恢复到数据库。例如,对于备份ID12的备份,该备份是在具有两个数据库节点(节点ID无恶23)的簇中创建的,可以将其恢复到具有4个节点的簇中。这样,ndb_restore必须运行两次,为创建备份时的每个数据库节点运行一次。
我恢复实例操作流程():
(1)首先备份,start backup(记住,backup_id)
(2)修改config.ini,再其追加个[API]---增加空的[API]的个数要和现有的API节点数据相同。

增加前:

[mysqld(API)]  2 node(s)

id=50   @172.16.10.115  (mysql-5.6.14 ndb-7.3.3)

id=51   @172.16.10.116  (mysql-5.6.14 ndb-7.3.3)
增加后:

[mysqld(API)]   4 node(s)

id=50   @172.16.10.115  (mysql-5.6.14 ndb-7.3.3)

id=51   @172.16.10.116  (mysql-5.6.14 ndb-7.3.3)

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

id=53 (not connected,accepting connect from any host)
(3)停止mgmd,ndb_mgm -e shutdown(如果是在第一次添加空闲节点后,可以执行该命令结束掉管理节点和其他节点。在以后的恢复操作中,不需要每次都关闭到管理节点)
(4)启动mgmd,ndb_mgmd(当然,config.ini文件目录下执行此命令)
(5)启动数据节点:ndbd --initial(有几个节点,执行此命令几次)
(6)在数据节点上执行ndb_restore -c mgmd -n node_id -m -bbackup_id -r [backup_path=]/path/to/backup/files
我的:ndb_restore -c 172.16.10.117 -n 2 -m -b 1-r /mysql/BACKUP/BACKUP-1/
记住,这个"/",很重要.
mgmd为管理节点的ip
node_id为数据节点ID,mgm的客户端通过show查看
-m在第一个数据节点上执行,它的作用恢复数据元,数据元的作用:所有数据库表的名称和定义.在其他节点,上就不需要此参数了.
backup_id就是备份的次数.也就是你在此startbackup,提示的那个id,如果不知道,可以到保存此备份的目录下看.
执行的结果:()

[root@xiayali root]#/usr/local/mysql/bin/ndb_restore -c 172.16.10.117  -n 2 -m -b 1 -r /mysqlback/BACKUP/BACKUP-1/
Ndb version in backup files: Version5.0.19
Connected to ndb!!
Successfully restored table test/def/ctest
_____________________________________________________
Processing data in table: test/def/ctest(2) fragment 0
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 0
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 0
Restored 0 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
执行过后,在其sql节点上,只能看到表,不能看到数据,哈哈,这就是-m的作用!
(7)在其他数据节点上执行
ndb_restore -c 192.168.1.112 -n 3 -b 1 -r /mysql/BACKUP/BACKUP-1/
执行的结果:()
[root@xiayali bin]# /usr/local/mysql/bin/ndb_restore -c 192.168.1.112 -n 3 -b 1-r /mysqlback/BACKUP/BACKUP-1/
Ndb version in backup files: Version 5.0.19
Connected to ndb!!
_____________________________________________________
Processing data in table: test/def/ctest(2) fragment 1
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 1
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 1
Restored 1 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
执行过后,就能用select看到数据了
注释:对于快速恢复,能够以并行方式恢复数据,但必须有足够的可用簇连接。然而,数据文件必须始终前于日志文件。

注意:

6:注意事项

1:如果采用磁盘表方式存储数据时,在恢复的时候需要将mysql 数据库目录中的/var/lib/mysql/ndb_1_fs目录中的数据文件和undofile 文件重新命名或者删除掉。在恢复数据的时候,ndb节点,在需要按以下命令执行

#pkill -9 ndbmtd

#ndbmtd --initial (进行初始化操作)

管理节点如果已经添加有空的[API]或者[MYSQLD]节点。

2:在执行 /usr/local/mysql/bin/ndb_restore -c 172.16.10.117 -n 2 -m -b 1 -r /var/lib/mysql/BACKUP/BACKUP-1命令后,如果需要恢复整个数据库,即是整个数据库都被删除(drop database),则在恢复数据后,需要先创建数据库(create database ),然后数据才能出现。

4.故障处理

4.1. 错误一

管理台提示以下错误,无法正常添加节点。

- Failed to allocate nodeid, error: 'Error:Could not alloc node id at 172.16.10.117 port 1186: Connection done from wronghost ip 172.16.10.24.

该故障说明配置文件中没有172.16.10.24NDB节点'


4.2. 错误二

创建表提示

Error Code: 1114 - The table 'USER_PROPS' isfull

1:修改数据节点Mysql的配置文件

#vi /etc/my.cnf

[mysqld]下添加/修改两行:
tmp_table_size = 256M
max_heap_table_size = 256M

2:修改管理节点配置文件增大数据和索引大小

#vi /var/lib/mysql-cluster/config.ini

增加或修改以下内容:

DataMemory=1024M

IndexMemory=512

MaxNoOfOrderedIndexes=1024

3:增大表空间容量

3.1查看表空间使用情况

Mysql>SELECT TABLESPACE_NAME, FILE_NAME,EXTENT_SIZE*TOTAL_EXTENTS/1024/1024 AS TOTAL_MB,EXTENT_SIZE*FREE_EXTENTS/1024/1024 AS FREE_MB, EXTRA FROMinformation_schema.FILES WHERE FILE_TYPE="DATAFILE";

3.2修改表空间,增加新的数据文件

Mysql>ALTER TABLESPACE ts_1

ADD DATAFILE 'data_4.dat'

INITIAL_SIZE 10240M

ENGINE NDBCLUSTER;

3.3:查看undo日志文件使用量信息
Mysql>select * from ndbinfo.logspaces wherelog_type='DD-UNDO';

Mysql>SELECT FILE_NAME,LOGFILE_GROUP_NUMBER, EXTRA     FROMINFORMATION_SCHEMA.FILES  WHERELOGFILE_GROUP_NAME = 'lg_2';


3.5修改日志文件组,增加新的undo file文件

Mysql> ALTER LOGFILE GROUP lg_1

ADD UNDOFILE 'undo_2.log'

INITIAL_SIZE 2048M

ENGINE NDBCLUSTER;

4.3.错误三

无法创建日志文件组,并添加undo日志文件(如果创建时按以下语句执行报语法错误提示,可能是编码问题,运行命令setcharacter_set_client=latin1; 原因:Character sets and binary log files. Currently, thendb_apply_status and ndb_binlog_index tables are created using the latin1(ASCII) character set. Because names of binary logs are recorded in this table,binary log files named using non-Latin characters are not referenced correctlyin these tables. This is a known issue, which we are working to fix. (Bug#50226)

1mysql> create logfile group lg_2 add undofile 'undo_2.log'initial_size 1024M undo_buffer_size 128M engine ndbcluster;
ERROR 1528 (HY000): Failed to create LOGFILE GROUP
mysql> show errors;
+-------+------+---------------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------------+
| Error | 1296 | Got error 1504 'Out of logbuffer memory' from NDB |
| Error | 1528 | Failed to create LOGFILE GROUP |
+-------+------+---------------------------------------------------+
2 rows in set (0.00 sec)

2:可以看出是由于超出logbuffermemory 大小原因导致的,是因为SharedGlobalMemory的值比UNDO_BUFFER_SIZE小导致错误。

解决办法:把SharedGlobalMemory调大,原来我的UNDO_BUFFER_SIZE128,但是我的SharedGlobalMemory80,将SharedGlobalMemory设置成384M解决问题。

4.4.错误四

导入数据的时候遇到如下报错:

ERROR 1005 (HY000) at line 25: Can't createtable 'tuge.pangolin_fnc_accountverification' (errno: 140) Error | 1296 | Goterror 738 'Record too big' from NDB    

分析原因:表但行数据太大

解决办法:需要更改表结构,使最大单行数据的大小小于8KB

4.5.错误五

导入大量数据的时候遇到如下报错

Error 1297: Got temporary error 'REDO' logoverloaded.

ERROR : Got temporary error 1204 'Temporary failure,distribution changed' from NDBCLUSTER

ERROR : Got temporary error 1234 'REDO log filesoverloaded (increase disk hardware)' from NDBCLUSTER

分析原因:遇到这个错误,是表示redolog用完了,需要增加

解决办法:修改config.ini文件,更改或添加如下参数:

FragmentLogFileSize=256M

NoOfFragmentLogFiles=16

NoOfFragmentLogFiles这个参数可以更改到更大,但是初始化的时候会慢一点

4.6.错误六

在还原的时候遇到如下报错:

Configuration error: Error : Could not allocnode id at 192.168.100.223 port 1186: Id 12 configured as ndbd(NDB), connectattempted as mysqld(API).


Unable to connect to management server.


分析原因:因为还原的时候会去连接mysqld,而在配置ndb的时候没有添加空的mysqld节点,因此出现这个报错


解决办法:在config.ini添加几个空的mysqld节点(空节点数必须和现有节点数一致),语法如下:

[API]

[API]

4.7.错误七

导入大量数据的时候或者执行大量的insert或者update操作的时候,经常会出现如下报错:

ERROR 1297 (HY000) at line 1: Got temporaryerror 1218 'Send Buffers overloaded in NDB kernel' from NDBCLUSTER

这个报错的原因有几个,第一、是参数SendBufferMemory设置过小,第二、和mysqld的二进制日志有关系,第三、和网络环境有关系

解决办法:查看网络环境是否OK ,是否出现双工模式部队,是否都是千兆网或者百兆网,加大SendBufferMemory的设置,一般2M就够了,设置TotalSendBufferMemory = 256M,最后如果还是出现如此报错,建议关闭mysql的二进制日志,在my.cnf中注释掉相关的参数就可以了,比如:

#log-bin=mysql-bin

4.8.错误八

管理节点错误日志

Status: Temporary error, restart node

Message: System error, node killed during noderestart by other node (Internal error, programming error or missing errormessage, please report a bug)

Error: 2303

Error data: Node 12 killed this node because GCPstop was detected

Error object: NDBCNTR (Line: 273) 0x00000006

分析原因:这个问题是因为undo日志文件空间用完了!

解决办法:增加undo日志空间文件,语法如下:

ALTER LOGFILE GROUP lg_1

ADD UNDOFILE 'undo_2.log'

INITIAL_SIZE 2048M

ENGINE NDBCLUSTER;

4.9.错误九

还原的时候出现如下报错:

Temporary error: 266: Time-out in NDB, probablycaused by deadlock

分析原因:出现这个问题是锁定超过1.2s

解决办法:在config.ini中加入:TransactionDeadLockDetectionTimeOut=10000 默认是1200