资讯专栏INFORMATION COLUMN

MySQL Cluster搭建及配置

AbnerMing / 3043人阅读

摘要:节点负责向数据节点传送访问请求,具体集群过程以及数据库底层均对外透明。通常只需配置一个管理节点然而为了排除单点故障需要,有可能的话,尽量增加管理节点的数量。并发加大后出现默认只有,调整该参数为后解决。

MySQL Cluster介绍

MySQL Cluster是一个高性能、可扩展、集群化数据库产品。MySQL Cluster是一个基于NDB Cluster存储引擎的完整分布式数据库系统,采用无共享的数据存储技术,实时同步且支持快速故障切换、事务。NDB是一种in-memory的存储引擎,它具有可用性高和数据一致性好的特点。

MySQL Cluster可由多台服务器组成的、同时对外提供数据管理服务的分布式集群系统。通过合理的配置,可以将服务请求在多台物理机上分发实现负载均衡 ;同时内部实现了冗余机制,在部分服务器宕机的情况下,整个集群对外提供的服务不受影响,从而能达到99.999%以上的高可用性。

MySQL Cluster分为三类节点:

数据节点(Data Nodes):用于存储集群的数据。实现底层数据存储的功能,保存Cluster 的数据。每一个NDB 节点保存完整数据的一部分(或者一份完整的数据,视节点数目和配置而定),在MySQL Cluster 里面叫做一个fragment。而每一个fragment,正常情况来讲都会在其他的主机上面有一份(或者多分)完全相同的镜像存在。这些都是通过配置来完成的,所以只要配置得当,MySQL Cluster 在存储层不会出现单点的问题。数据节点是用命令ndbd启动的。

SQL节点(SQL Nodes):向外提供一个标准的SQL语言编程接口。SQL节点负责向数据节点传送访问请求,具体集群过程以及数据库底层均对外透明。
SQL节点提供用户SQL指令请求,解析、连接管理,query优化和响、cache管理等、数据merge、sort,裁剪等功能,当SQL节点启动时,将向管理节点同步架构信息,用以数据查询路由。SQL节点作为查询入口,需要消耗大量cpu及内存资源,可使用分布式管理节点,并在SQL节点外封装一层请求分发及HA控制机制可解决单点及性能问题,其提供了线性扩展功能。SQL节点是使用命令mysqld -ndbcluster启动的,或将ndbcluster添加到“my.cnf”后使用“mysqld”启动。

管理节点(NDB Management Server):负责整个Cluster 集群中各个节点的管理工作,包括集群的配置,启动关闭各节点,以及实施数据的备份恢复等。管理节点会获取整个Cluster 环境中各节点的状态和错误信息,并且将各Cluster 集群中各个节点的信息反馈给整个集群中其他的所有节点。通常只需配置一个管理节点;然而为了排除单点故障需要,有可能的话,尽量增加管理节点的数量。MGM节点是用命令ndb_mgm启动的。

MySQL Cluster搭建

环境准备

数据节点:192.168.1.5 192.168.1.6
SQL节点:192.168.1.2 192.168.1.11
管理节点:192.168.1.10

Mysql集群软件:mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz 下载地址

管理节点配置

将MySQL集群软件拷贝到管理节点的/usr/local目录下并解压为mysql,MySQLCluster管理节点默认是要安装在/usr/local下的,否则启动会报错

添加用户及用户组

# groupadd mysql
# useradd -g mysql mysql

更改所属用户和组

# chown -R mysql:mysql mysql

拷贝配置文件

# cp mysql-cluster/support-files/ndb-config-2-node.ini /etc/ndb-config.ini

修改配置文件,管理节点的配置文件非常重要,会影响整个集群

# vim /etc/ndb-config.ini

[ndbd default]
NoOfReplicas= 2  #定义在Cluster环境中复制份数
DataMemory= 80M #分配的数据内存大小,根据本机服务器内存适量来分配,实际运用中需要分配很大
IndexMemory= 24M #设定用于存放索引(非主键)数据的内存段大小
#一个NDB节点能存放的数据量是会受到DataMemory和IndexMemory两个参数设置的约束,两者任何一个达到限制数量后,都无法再增加能存储的数据量。如果继续存入数据系统会报错“table is full”。
DataDir= /var/lib/mysql-cluster  #用于存放集群日志信息

DataMeomory=1400M
IndexMemory=600M
LockPagesInMainMemory=1  # 会有问题
MaxNoOfConcurrentOperations=500000
TimeBetweenLocalCheckpoints=20
TimeBetweenGlobalCheckpoints=1000
TimeBetweenEpochs=100
TimeBetweenWatchdogCheckInitial=60000
TransactionInactiveTimeout =50000
MaxNoOfExecutionThreads=8 
BatchSizePerLocalScan=512 
MaxNoOfOrderedIndexes=512
MaxNoOfConcurrentOperations= 10000

[ndb_mgmd]
Id=1
Hostname=192.168.1.10  # Hostname or IP address
#确定该目录存在,并修改所属用户为mysql
DataDir= /var/lib/mysql-cluster # Directory for MGM node logfiles

[ndbd]
Id= 2
HostName= 192.168.1.5 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node"s datafiles,数据节点存放数据的目录

[ndbd]
Id= 3
HostName= 192.168.1.6
datadir=/usr/local/mysql/data

[mysqld]
Id= 4
HostName= 192.168.1.2
#可以预留一些节点
# choose an unused port number
# in this configuration 63132, 63133, and 63134
# will be used
[tcp default]
PortNumber= 63132

配置完后启动管理节点

# ./ndb_mgmd --initial -f /etc/ndb-config.ini 
MySQL Cluster Management Server mysql-5.5.27 ndb-7.2.8
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 31: [MGM] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 35: [DB] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 39: [DB] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 43: [API] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 50: [tcp] PortNumber is deprecated
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 31: [MGM] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 35: [DB] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 39: [DB] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 43: [API] Id is deprecated, use NodeId instead
2014-08-29 11:22:04 [MgmtSrvr] WARNING  -- at line 50: [tcp] PortNumber is deprecated

其中--initial指定初始化加载,每次修改管理节点的配置重启都需要加上,否则不会生效;-f指定管理节点的参数文件

确定ndb_mgm进程及端口号

# netstat -langput | grep mgm
tcp        0      0 0.0.0.0:1186                0.0.0.0:*                   LISTEN      3427/ndb_mgmd       
tcp        0      0 127.0.0.1:45251             127.0.0.1:1186              ESTABLISHED 3427/ndb_mgmd       
tcp        0      0 127.0.0.1:1186              127.0.0.1:45251             ESTABLISHED 3427/ndb_mgmd

其中1186是管理节点的服务端口

查看集群信息

#  ./ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]    2 node(s)
id=2 (not connected, accepting connect from 192.168.1.5)
id=3 (not connected, accepting connect from 192.168.1.6)

[ndb_mgmd(MGM)]    1 node(s)
id=1    @192.168.1.10  (mysql-5.5.27 ndb-7.2.8)

[mysqld(API)]    1 node(s)
id=4 (not connected, accepting connect from 192.168.1.2)

可以看到当前只有管理节点,其他节点还未启动。

数据节点和SQL节点配置

解压MySQLCluster软件到指定目录/usr/local,数据节点可以不用放在/usr/local目录下

添加用户及用户组

# groupadd mysql
# useradd -g mysql mysql

更改所属用户和组

# chown -R mysql:mysql mysql

安装数据库

# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

拷贝配置文件

# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

修改配置文件

vim /etc/my.cnf

# Options for mysqld process:
[MYSQLD]                       
ndbcluster                      # run NDB engine
character_set_server=utf8
ndb-connectstring=198.168.1.10  # location of MGM node
 
# Options for ndbd process:
[MYSQL_CLUSTER]                 
ndb-connectstring=198.168.1.10  # location of MGM node

启动数据节点

# ./ndbd --initial
2014-08-29 14:04:54 [ndbd] INFO     -- Angel connected to "192.168.1.10:1186"
2014-08-29 14:04:54 [ndbd] INFO     -- Angel allocated nodeid: 2

启动SQL节点

# ./mysqld_safe --user=mysql &

SQL节点启动可以添加到系统服务

拷贝运行脚本,添加可执行权限

# cp support-files/mysql.server /etc/init.d/mysqld
# chmod +x /etc/init.d/mysqld

启动数据库

# service mysqld start
Starting MySQL....                                         [  OK  ]

查看集群信息

# ndb_mgm -e show
Cluster Configuration
---------------------
[ndbd(NDB)]    2 node(s)
id=2    @192.168.1.5  (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0, Master)
id=3    @192.168.1.6  (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0)

[ndb_mgmd(MGM)]    1 node(s)
id=1    @192.168.1.10  (mysql-5.5.27 ndb-7.2.8)

[mysqld(API)]    2 node(s)
id=4    @192.168.1.2  (mysql-5.5.27 ndb-7.2.8)
id=5    @192.168.1.11  (mysql-5.5.27 ndb-7.2.8)

可以看到当前所有节点均已启动

集群管理

查看集群内存使用情况

ndb_mgm> all report memoryusage;

关闭集群顺序:SQL节点->数据节点->管理节点 或者使用# ./ndb_mgm -e shutdown命令关闭集群

启动集群顺序: 管理节点->数据节点->SQL节点

验证测试

通过SQL节点(192.168.1.2记为SQL1/192.168.1.11记为SQL2)连入MySQL数据库

# ./mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ndbinfo            |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.04 sec)

修改密码

mysql> set password=password("root");

数据同步测试

连接SQL1,创建数据库dufu,创建成功

连接SQL2,查看到创建成功的数据库dufu

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dufu               |
| mysql              |
| ndbinfo            |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

SQL1创建表,插入数据

mysql> use dufu;
Database changed

mysql> create table t(i int,name varchar(10)) engine=ndbcluster;
Query OK, 0 rows affected (0.22 sec)

mysql> insert into t values(1,"this_sql1");
Query OK, 1 row affected (0.01 sec)

SQL2查询

mysql> select * from t;
+------+-----------+
| i    | name      |
+------+-----------+
|    1 | this_sql1 |
+------+-----------+
1 row in set (0.01 sec)

通过以上测试,SQL集群数据是同步的。

可用性测试

关掉数据节点1或SQL节点1,看集群是否能够正常工作
经过测试,关闭冗余节点不会对MySQL集群造成影响,失败节点重新启动后会再次加入加群。可以通过管理节点查看到各个节点的状态

遇到的问题

以上测试只是针对MySQLCluster简单的验证测试,后面我们组织了一次更大压力的测试,400~1000并发,每个连接执行100次循环,每个查询约有5000条数据,同时执行进行的读操作在40000~100000之间,出现了很多问题。

首先是数据节点启动问题:

Ndb kernel thread 4 is stuck in: Job Handling elapsed=100 Watchdog: User time: 82 System time: 667 
Ndb kernel thread 4 is stuck in: Job Handling elapsed=200
Watchdog: User time: 82 System time: 668 
Ndb kernel thread 4 is stuck in: Job Handling elapsed=300 Watchdog: User time: 82 System time: 669 
Ndb kernel thread 4 is stuck in: Job Handling elapsed=400 Watchdog: User time: 82 System time: 670

内存不够或者datamemory、indexmemory设置过大、maxnooflocalscans设置过大导致,通过增大服务器硬件资源以及调大内存设置大小解决。

并发加大后出现:

too many connections

SQL节点的max_connections默认参数为150,调整该参数大小为1000解决。

并发加大后出现:

ERROR 1205 (HY000) at line 10208: Lock wait timeout exceeded; try restarting transaction

TransactionDeadlockDetectionTimeout默认只有1200,调整该参数为10000后解决。调整完后需要重启集群

并发加到1000后,错误率急剧上升,出现:

got temporary error 245 "too many active scans" from ndbcluster

NaxNoOfConcurrentScans参数太小,默认最大为500.调整为500后,还是继续报错-_-!,可能与MaxNoOfLocalScans参数有关。

更新操作,并发加到1000后,出现:

ERROR 1297 (HY000): Got temporary error 410 "REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase NoOfFragmentLogFiles)" from NDBCLUSTER

改错表示redo日志可能太小,需要调整redo日志大小,设置TimeBetweenLocalCheckpoints=30
NoOfFragmentLogFiles=128(还未试验)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46523.html

相关文章

  • MySQL数据库高可用集群搭建-PXC集群部署

    摘要:下文简称集群提供了高可用的一种实现方法。,同步需要,在整个同步数据过程中不需要。中定义的集群内部全局事务,用于记录集群中发生状态改变的唯一标识以及队列中的偏移量。节点的数据库的登陆和节点的用户名密码一致,自动同步。 Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上...

    zhaochunqi 评论0 收藏0
  • 浅谈MySQL集群高可用架构

    摘要:前言高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。本身没有提供的解决方案,通过方案能实现服务器的故障转移,从而实现的高可用。 前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能保证整个系统的高可用。对于...

    alphahans 评论0 收藏0
  • 浅谈MySQL集群高可用架构

    摘要:前言高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。本身没有提供的解决方案,通过方案能实现服务器的故障转移,从而实现的高可用。 前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能保证整个系统的高可用。对于...

    _Dreams 评论0 收藏0
  • rancher1.6高可用集群搭建

    摘要:停掉一台,查看负载均衡健康检查是否正常搭建集群创建需使用的数据库启动访问增加访问控制。给配置负载均衡,增加配置重启访问添加主机,添加容器,测试是否正常,恶意掉容器或者关闭机器,查看整个集群是否正常。 rancher高可用集群搭建 一、搭建环境 1.安装系统 下载centos最新版, http://mirrors.sohu.com/centos/7/isos/x86_64/CentOS...

    gghyoo 评论0 收藏0
  • Centos8 部署 ElasticSearch 集群并搭建 ELK,基于Logstash同步MyS

    摘要:如果这不起作用,请将驱动程序移到下方,并且不要在配置文件中提供任何驱动程序路径参考链接多数原因是文件渠道文件配置出错,检查一下管道配置文件里面的建议不要使用,会报错误重新配置了权限还是报错,暂时没找到原因,所以换了个用户就行了Centos8安装Docker 1.更新一下yum [root@VM-24-9-centos ~]# yum -y update 2.安装cont...

    bang590 评论0 收藏0

发表评论

0条评论

AbnerMing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<