在使用mysql集群之前,先仔细了解mysql集群的优缺点,在应用场景中充分发挥集群的优点,才能把mysql集群技术用到刀刃上。
数据存储在mysql中,单节点存储如果数据量十分大,数据就很可能存不下。因此我们需要搭建部署mysql的集群模式,增加数据的存储量,而且提到数据库访问的并发。
MySQL 群集是 MySQL 适合于分布式计算环境的高可用、高冗余版本。它采用了 NDB Cluster 存储引擎,允许在 1
个群集中运行多个 MySQL 服务器。MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括 MySQL 服务器,NDB Cluster 的数据节点,管理服务器,以及(可能存在的)专门的数据访问程序。
Mysql集群拓扑结构如下所示:
节点环境说明:
节点/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服务 |
服务端硬件配置要求 | ------- |
---|---|
CPU | Xeon 2.4GHz 双CPU处理器 |
内存 | 12G + |
硬盘 | 300G + |
操作系统 | CentOS 6.6×64 |
数量 | 7台服务器,能互相通信 |
下载MySQL安装包,放于每台服务器的/usr/local/src目录下。
安装服务端软件之前,务必检查当前服务器是否“干净”,即计算机在安装完操作系统和更新过重要补丁后没有安装过其他版本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
关闭防火墙
# chkconfig iptables off
关闭 selinux
# vim /etc/selinux/config #(改为SELINUX=disabled)保存退出,
重启服务器
# reboot
由于软件安装包在/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/目录下,所以第三个语句要适当的改变。
按如下命令,一步步执行,进行新建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
# 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
注:删除自带的 /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]
设置完成,保存退出!
注:所有的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集群到此已经配置完成!下面我们就可以对它进行使用!
注:集群搭建完毕后,启动节点,必须按照如下启动顺序:
先启动管理节点(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),具体启动操作如下所示。
注:–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
注:安装后第一次启动数据节点时要加上–initial参数,其它时候不要加,除非是在备份、恢复或配置变化后重启时。
初始化启动方式
# /usr/local/src/mysql/bin/ndbd --initial
正常启动:
# /usr/local/src/mysql/bin/ndbd
启动 SQL 节点(等数据节点启动完后等待30秒后执行)
# service mysqld start
关闭 SQL 节点
# service mysqld stop
重启 SQL 节点
# service mysqld restart
检验mysql是否运行
# service mysqld status
到此,mysql集群已启动完毕,但是要像本地单机的mysql数据库一样使用,还需要以下一步操作。
当搭建了mysql集群后,现在应当需要使用该mysql集群了,在使用的过程中,和单节点的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节点,操作任何一个都是可以的,都是一样的
这里连接任意一个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集群数据库的时候,有时候会误删一些数据,那么数据就缺失了完整性,现在需要将数据进行备份,将误删的数据还原出来,这样保证数据的完整性。
注:这里备份还原的思想是,在数据库操作中,不小心把之前的集群数据库中原有的比较重要的数据删除了,可以通过此方法进行备份,还原。
首先到管理节点(192.168.202.20 node1)上进行数据的备份,操作如下:
# /usr/local/src/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
# ndb_mgm> start backup
此时可以删除数据库中自己建的一些数据库,或者数据表,都可以进行还原
需要重新启动集群。
注:还原操作在数据节点进行还原,在数据节点上进行恢复。每个节点都得还原一次,因为数据分散集群中的每个节点上。
第一个数据节点,假设为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/
注:最后备份完,还不能看到数据,由于还原的时候不能自动恢复库名,所以数据库名得自己建,根据在第一个数据节点下备份的元数据表结构,建立数据库,当数据库建完,数据库下面的表,数据就自动还原。
还没有mysql集群的时候,可能应用生产数据库是单节点的mysql,现在生产环境放到了mysql集群上,那么之前mysql单节点的数据,都要搬到mysql集群中,改怎么操作呢?
把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语句再执行一遍。
导出整个数据库中的所有数据:
# /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上开发新的应用。
在每一个数据节点上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必须唯一命名。
在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;
CREATE TABLESPACE ts_cloudstore
ADD DATAFILE 'cloudstore_data_1.dbf'
USE LOGFILE GROUP lg_cloudstor
INITIAL_SIZE 20480M
AUTOEXTEND_SIZE 1024M
ENGINE NDBCLUSTER;
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
alter tablespace ts_cloudstore
drop datafile 'cloudstore_data_1.dbf'
engine ndbcluster;
alter tablespace ts_cloudstore
drop datafile 'cloudstore_data_2.dbf'
engine ndbcluster;
drop tablespace ts_cloudstore engine ndbcluster;
drop logfile group lg_cloudstor engine ndbcluster;
具体操作如下:
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集群的过程中,会遇到很多问题,报很多错误,常见的几处错误在此列一下。
错误: 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类型,再继续执行。
错误:在转换磁盘表的过程中,如果转换前的内存表没有主键,那么不能转换为磁盘表。
错误:2006 - MySQL server has gone away
在sql节点输入如下命令set global max_allowed_packet=1024*1024*60;
错误:在mysql集群查询过程中,大小写敏感。
在sql节点的/etc/my.cnf配置文件中,加入参数设置:
[mysqld]
Lower_case_table_names=1
错误: Connection is read-only. Queries leading to data modification are not allowed
# mysqladmin -u root -p flush-tables