mysql集群

一、优缺点

在使用mysql集群之前,先仔细了解mysql集群的优缺点,在应用场景中充分发挥集群的优点,才能把mysql集群技术用到刀刃上。

描述

优点
a) 99.999%的高可用性
b) 快速的自动失效切换
c)灵活的分布式体系结构,没有单点故障
d)高吞吐量和低延迟
e)可扩展性强,支持在线扩容
缺点
a)存在很多限制,比如:不支持外键
b)部署、管理、配置很复杂
c)占用磁盘空间大,内存大
d)备份和恢复不方便
e)重启的时候,数据节点将数据load到内存需要很长时间

二、操作

数据存储在mysql中,单节点存储如果数据量十分大,数据就很可能存不下。因此我们需要搭建部署mysql的集群模式,增加数据的存储量,而且提到数据库访问的并发。

操作步骤

1. 概述

MySQL 群集是 MySQL 适合于分布式计算环境的高可用、高冗余版本。它采用了 NDB Cluster 存储引擎,允许在 1
个群集中运行多个 MySQL 服务器。

MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括 MySQL 服务器,NDB Cluster 的数据节点,管理服务器,以及(可能存在的)专门的数据访问程序。

2. 系统环境

2.1 拓扑结构

Mysql集群拓扑结构如下所示:

mysql集群_第1张图片

节点环境说明:

节点/hostname IP地址 系统 作用
管理节点 /node1 192.168.202.20 CentOS 6.6 64位 管理数据节点、sql节点
数据节点 /node2 192.168.202.21 CentOS 6.6 64位 存储数据
数据节点 /node3 192.168.202.22 CentOS 6.6 64位 存储数据
数据节点 /node4 192.168.202.23 CentOS 6.6 64位 存储数据
数据节点 /node5 192.168.202.24 CentOS 6.6 64位 存储数据
Sql节点 /sql1 192.168.202.7 CentOS 6.6 64位 给客户端提供sql服务
Sql节点 /sql2 192.168.202.8 CentOS 6.6 64位 给客户端提供sql服务

2.2 服务器配置

服务端硬件配置要求 -------
CPU Xeon 2.4GHz 双CPU处理器
内存 12G +
硬盘 300G +
操作系统 CentOS 6.6×64
数量 7台服务器,能互相通信

3. 安装配置

3.1 准备工作

下载MySQL安装包,放于每台服务器的/usr/local/src目录下。

3.2 环境清理

安装服务端软件之前,务必检查当前服务器是否“干净”,即计算机在安装完操作系统和更新过重要补丁后没有安装过其他版本MySQL软件(解压缩等基本工具除外);

如果之前已经安装过服务端相关MySQL软件,请务必按照软件卸载说明卸载删除之前的版本。 具体操作如下:

清理之前操作系统自带的MySQL安装:
 # yum -y remove mysql
然后使用如下命令查找mysql包:
 # rpm -qa | grep mysql*
如果查找到,例如:mysql-libs-5.1.71-1.el6.x86_64,我们要对1个剩余的M与SQL包进行手动删除清理:
 # rpm  -e  --nodeps  mysql-libs-5.1.71-1.el6.x86_64

3.3 关闭防火墙和selinux

关闭防火墙
 # chkconfig iptables off
关闭 selinux
 # vim /etc/selinux/config  #(改为SELINUX=disabled)保存退出,
重启服务器
 # reboot

3.4 软件安装

由于软件安装包在/usr/local/src/目录下,需要切换到该目录进行操作。
 # cd /usr/local/src/
 # tar  -xzvf  mysql-cluster-gpl-7.4.5-linux-glibc2.5-x86_64.tar.gz
 # mv /usr/local/src/mysql-cluster-gpl-7.4.5-linux-glibc2.5-x86_64/*  /usr/local/src/mysql
注:第二个语句,解压mysql压缩包,并不一定解压到当前/usr/local/src/目录下,可能默认安装到/root/目录下,所以第三个语句要适当的改变。

3.5 新建mysql用户及用户组

按如下命令,一步步执行,进行新建mysql用户及用户组:
 # groupadd mysql
 # useradd -g mysql mysql
 # chown -R mysql:mysql /usr/local/src/mysql
 # chown -R root /usr/local/src/mysql
 # chgrp -R mysql /usr/local/src/mysql

3.6 初始化mysql集群

 # cd /home/data/usr/local/mysql
 # ./scripts/mysql_install_db  --user=mysql --basedir=/usr/local/src/mysql --datadir=/usr/local/src/mysql/data
安装目录是datadir=/usr/local/src/mysql/data

3.7 配置管理节点node1

注:删除自带的 /etc/my.cnf

切记:一定要删除掉! 因为ndb_mgmd启动的时候,也会加上/etc/my.cnf的配置内容,干扰我们,所以要删除它

具体操作如下:
 # rm -rf /etc/my.cnf
新建配置文件存放目录:
 # mkdir /usr/local/src/mysql/etc
 # chown mysql:mysql /usr/local/src/mysql/etc
创建配置文件 config.ini
 # vim //usr/local/src/mysql/etc/config.ini
config.ini内容如下:

[ndb_mgmd default]
datadir = /usr/local/src/mysql/data
[ndbd default]
NoOfReplicas = 2 #
DataMemory = 6G #
IndexMemory = 2G #
datadir = /usr/local/src/mysql/data
Default value = 20
Changed it to TimeBetweenLocalCheckpoints =6
Default value = 16M
Changed it to FragmentLogFileSize=256M
MaxNoOfTables = 10000
MaxNoOfAttributes = 100000
MaxNoOfOrderedIndexes = 10000
FileSystemPath =/usr/local/src/mysql/data
[ndb_mgmd]
NodeId = 1
HostName = 192.168.202.20
[ndbd]
NodeId = 2
HostName = 192.168.202.21
[ndbd]
NodeId = 3
HostName = 192.168.202.22
[ndbd]
NodeId = 4
HostName = 192.168.202.23
[ndbd]
NodeId = 5
HostName = 192.168.202.24
[mysqld]
NodeId = 6
HostName = 192.168.202.7
[mysqld]
NodeId = 7
HostName = 192.168.202.8
[mysqld]
[mysqld]
[mysqld]
[mysqld]

设置完成,保存退出!

3.8 配置数据节点和sql节点

注:所有的sql节点和data节点的配置文件都是一样的,都指向主节点,接受主节点管理。

拷贝文件
 # cp -rf /usr/local/src/mysql/support-files/mysql.server /etc/init.d/mysqld
 
mysql服务启动时会默认加载/etc/my.cnf作为其配置文件,修改节点上的my.cnf配置文件,内容如下:

[mysqld]
max_connections=100
datadir=/usr/local/src/mysql/data
basedir=/usr/local/src/mysql
ndbcluster
lower_case_table_names=1
innodb_lock_wait_timeout=500
ndb-connectstring=192.168.202.20
port=3306
[mysql_cluster]
ndb-connectstring=192.168.202.20
[ndb_mgm]
connect-string=192.168.202.20
[ndb_mgmd]
config-file=/usr/local/src/mysql/etc/config.ini

配置完成,保存退出!
MySql集群到此已经配置完成!下面我们就可以对它进行使用!

4. 集群启动

注:集群搭建完毕后,启动节点,必须按照如下启动顺序:

先启动管理节点(168.202.20 node1)

然后启动数据节点(192.168.202.21~192.168.202.24,node2 node3 node4 node5分别开启)

最后启动sql节点(192.168.202.7,192.168.202.8,sql1 sql2),具体启动操作如下所示。

4.1 启动管理节点

注:–initial 首次加载/usr/local/src/mysql/etc/config.ini文件,其它时候不要加,除非是在备份、恢复或配置变化后重启时,不然数据就清空。

初始化启动方式
 # /usr/local/src/mysql/bin/ndb_mgmd  -f  /usr/local/src/mysql/etc/config.ini --initial

正常启动方式
 # /usr/local/src/mysql/bin/ndb_mgmd  -f  /usr/local/src/mysql/etc/config.ini

查看ndb_mgmd是否启动
 #  ps -ef | grep ndb_mgmd

查看集群状态
 # /usr/local/src/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
 # ndb_mgm> show

关闭集群
 # ndb_mgm> shutdown

退出ndb-mgm
 # ndb_mgm> exit

4.2 启动数据节点

注:安装后第一次启动数据节点时要加上–initial参数,其它时候不要加,除非是在备份、恢复或配置变化后重启时。

初始化启动方式
 # /usr/local/src/mysql/bin/ndbd  --initial

正常启动:
 # /usr/local/src/mysql/bin/ndbd

4.3 启动sql节点

启动 SQL 节点(等数据节点启动完后等待30秒后执行)
 # service mysqld start

关闭 SQL 节点
 # service mysqld stop

重启 SQL 节点
 # service mysqld restart

检验mysql是否运行
 # service mysqld status

到此,mysql集群已启动完毕,但是要像本地单机的mysql数据库一样使用,还需要以下一步操作。

三、测试

当搭建了mysql集群后,现在应当需要使用该mysql集群了,在使用的过程中,和单节点的mysql极为相似。

操作步骤

1. 配置mysql集群

mysql集群已启动完毕,需要给mysql重新设置密码,给它权限,才能使得用户的mysql客户端navicat,可以连接sql节点,进行数据库的增加,删除,备份,还原操作。具体操作如下:

为sql指定密码
 # /usr/local/src/mysql/bin/mysqladmin -u root password '11111'

启动mysql命令行窗口
 # /usr/local/src/mysql/bin/mysql -u root –p11111

设置访问权限
 # mysql> grant all privileges on *.* to root@”%” identified by '11111';
 # mysql> flush privileges;

现在,可以用navicat连接搭建的mysql集群了,但是本地需要和集群在一个网段,或者集群给本地开放一个端口,让本地去访问sql服务器。
注:这里有两个sql节点,操作任何一个都是可以的,都是一样的

2. mysql集群测试

这里连接任意一个sql节点,比如192.168.202.7 (sql1),在此节点上进行操作。
 # /usr/local/src/mysql/bin/mysql -u root -p 11111
 # mysql> create database cs;
 # mysql> use cs;
  Database changed
 # mysql> create table cs1(id int,name varchar(10)) engine=ndb ;
注:engine=ndb一定要加上,加上才能同步其他节点

 # mysql> insert into cs1 values(1,'test');
 # mysql> select * from cs1 ;

四、备份还原

当使用mysql集群数据库的时候,有时候会误删一些数据,那么数据就缺失了完整性,现在需要将数据进行备份,将误删的数据还原出来,这样保证数据的完整性。

操作步骤

注:这里备份还原的思想是,在数据库操作中,不小心把之前的集群数据库中原有的比较重要的数据删除了,可以通过此方法进行备份,还原。

1、备份

首先到管理节点(192.168.202.20  node1)上进行数据的备份,操作如下:
# /usr/local/src/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
# ndb_mgm> start backup

此时可以删除数据库中自己建的一些数据库,或者数据表,都可以进行还原
需要重新启动集群。

2、还原

注:还原操作在数据节点进行还原,在数据节点上进行恢复。每个节点都得还原一次,因为数据分散集群中的每个节点上。

第一个数据节点,假设为192.168.202.21 (node2),执行如下命令:
 #/usr/local/src/mysql/bin/ndb_restore -n 2 -m -b 1 -r /usr/local/src/mysql/data/BACKUP/BACKUP-1/

第二个数据节点,假设为192.168.202.22(node3),执行如下命令:
 #/usr/local/src/mysql/bin/ndb_restore -n 3 -b 1 -r /usr/local/src/mysql/data/BACKUP/BACKUP-1/

第三个数据节点,假设为192.168.202.23(node4),执行如下命令:
 #/usr/local/src/mysql/bin/ndb_restore -n 4 -b 1 -r /usr/local/src/mysql/data/BACKUP/BACKUP-1/

第二个数据节点,假设为192.168.202.24(node5),执行如下命令:
 #/usr/local/src/mysql/bin/ndb_restore -n 5 -b 1 -r /usr/local/src/mysql/data/BACKUP/BACKUP-1/
注:
-m是元数据。就是表和库的目录,所以-m只执行一次,在第一个数据节点执行。
-r 开关是记录集合。
-n 当前的数据节点
-b 备份的节点,主节点。

注:最后备份完,还不能看到数据,由于还原的时候不能自动恢复库名,所以数据库名得自己建,根据在第一个数据节点下备份的元数据表结构,建立数据库,当数据库建完,数据库下面的表,数据就自动还原。

五、迁移

还没有mysql集群的时候,可能应用生产数据库是单节点的mysql,现在生产环境放到了mysql集群上,那么之前mysql单节点的数据,都要搬到mysql集群中,改怎么操作呢?

Mysql单点库到集群库的迁移,可以通过两种方式:
1. 单点数据库新建备份,生成备份.psc文件,然后通过navicat还原到集群数据库中。
2. 单点数据库生成.sql文件,然后到sql节点执行sql语句。两种方法都可行,但是针对数据量较大时,.sql文件会非常庞大,而不像.psc进行过压缩,传递较困难。

1. 迁移.psc

把mysql集群数据库当成单点数据库一样,直接用.psc文件进行还原备份。还原备份完后,需要转换它们的引擎为ndbcluster,具体步骤如下:

SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=ndbcluster;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = 'epointjweb4_0'    
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name;

注:需要转换引擎的数据库名。
通过上面语句,生成的一系列ALTER语句,然后将这些ALTER语句再执行一遍。

2. 迁移.sql

导出整个数据库中的所有数据:
 # /usr/local/src/mysql/bin/mysqldump -u root -p  dabaseName  > fileName.sql
注:fileName.sql最好加上路径名,否则导出文件都不知道在哪儿了

导出数据库中的某个表的数据:
 # /usr/local/src/mysql/bin/mysqldump -u root  -p  dabaseName  tableName > fileName.sql

导入sql方法一:
 # /usr/local/src/mysql/bin/mysql -uroot -p11111
 # mysql> source /usr/local/src/fileName.sql
注:fileName.sql要有路径名。

导入sql方法二:
 # mysql -uroot -p database < fileName.sql

#应用场景

MySQL Cluster 5.1的一个最受期待的特性是集群已支持基于磁盘的数据存取。NDB存储引擎大大增强了MySQL Cluster的性能,该引擎之前是一个100%的内存数据库引擎。这种引擎对可以运行在内存里的数据库来说是极好的选择,现在基于磁盘的存取数据支持使MySQL 5.1集群拓展了数据库规模,使MySQL集群用户有能力创建更大的数据库而且能对其有效的管理。

对于必须具备很高可用性,但不苛求像基于内存数据存储那样的高性能特性的数据,利用磁盘存取的方式将是最好的选择。另外,那些由于操作系统或硬件条件所致的硬性局限,可以考虑移植基于内存存取的库到磁盘存取的库当中,或者在支持磁盘存取数据的MySQL Cluster上开发新的应用。

六、磁盘表

1. 涉及概念

MySQL Cluster采用一系列的Disk Data objects来实现磁盘表。
(1)Tablespaces:作用是作为其他Disk Data objects的容器。
(2)Undo logy files:存储事务进行回滚需要的信息,一个或者多个undo log files组成一个log files group,最后,该log file group关联到一个tablespaces。
(3)Data files:作用是存储表中的数据,data file直接关联到tablespaces。

在每一个数据节点上undo log files和data files都是实际的文件,默认的,存放在ndb_node_id_fs文件夹下,该路径是在MySQL Cluster的config.ini中用DataDir指定的,node_id是data node的node ID。可以用绝对路径或者相对路径指定undo log或者data file的路径。tablespaces和log file group则不是实际的文件。

注意:尽管不是所有的Disk Data Object都作为文件存储,但是他们共享同一的命名空间,这意味着每个Disk Data Object必须唯一命名。

2. 创建日志组文件

 在sql节点下执行以下sql语句:

CREATE LOGFILE GROUP lg_cloudstor 
    ADD UNDOFILE 'cloudstor_undo_1.log' 
    INITIAL_SIZE 1024M 
    UNDO_BUFFER_SIZE 100M 
    ENGINE NDBCLUSTER;

ALTER LOGFILE GROUP lg_cloudstor 
    ADD UNDOFILE 'cloudstor_undo_2.log' 
    INITIAL_SIZE 1024M 
    ENGINE NDBCLUSTER;

3. 创建表空间

 CREATE TABLESPACE ts_cloudstore 
    ADD DATAFILE 'cloudstore_data_1.dbf' 
    USE LOGFILE GROUP lg_cloudstor 
    INITIAL_SIZE 20480M 
    AUTOEXTEND_SIZE 1024M 
    ENGINE NDBCLUSTER;

4. 添加新的datafile(给表空间添加日志文件)

 ALTER TABLESPACE ts_cloudstore 
    ADD DATAFILE 'cloudstore_data_2.dbf' 
    INITIAL_SIZE 20480M 
    AUTOEXTEND_SIZE 1024M 
    ENGINE NDBCLUSTER;

注意:上面增加的日志文件和数据文件的信息保存在information_schema.FILES表里。
可以通过以下命令,查看在物理磁盘上新建的数据文件: 
 # cd /usr/local/src/mysql/data/ndb_2_fs/
 # ls -lh

5. 删除数据文件(下步骤需要用时再操作!)

  alter tablespace ts_cloudstore 
    drop datafile 'cloudstore_data_1.dbf' 
    engine ndbcluster;

  alter tablespace ts_cloudstore 
    drop datafile 'cloudstore_data_2.dbf' 
    engine ndbcluster;

6. 删除表空间

 drop tablespace ts_cloudstore engine ndbcluster;

7. 删除日志组

 drop logfile group lg_cloudstor engine ndbcluster;

8. 将原有内存表转为磁盘表

具体操作如下:

SELECT  CONCAT('ALTER TABLE `', table_name, '` TABLESPACE ts_cloudstore STORAGE DISK ENGINE=ndbcluster;')
AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = 'bidinfo_jiangsu'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name;

注:需要修改,需要转为磁盘表的数据库。
执行以上SQL语句,将会生成一系列ALTER语句,将这些ALTER语句再执行一次。

七、注意

在使用mysql集群的过程中,会遇到很多问题,报很多错误,常见的几处错误在此列一下。

错误1

错误: ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 14000. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs.

在将单点库数据转成集群库的时候,会报上面的错误,那么需要将出错的表中较长的字段改为Text类型或者Blob类型,再继续执行。

错误2

错误:在转换磁盘表的过程中,如果转换前的内存表没有主键,那么不能转换为磁盘表。

错误3

错误:2006 - MySQL server has gone away

在sql节点输入如下命令set global max_allowed_packet=1024*1024*60;

错误4

错误:在mysql集群查询过程中,大小写敏感。

在sql节点的/etc/my.cnf配置文件中,加入参数设置:
   [mysqld]
   Lower_case_table_names=1

错误5

错误: Connection is read-only. Queries leading to data modification are not allowed

 # mysqladmin -u root -p flush-tables

你可能感兴趣的:(数据库)