首页
Linux教程
MongoDB教程
FTP教程
Apache教程
Nginx
jQuery
Redis
MySQL
PostgreSQL教程
PHP教程
Elasticsearch

MySQL

目录
MySQL教程
MySQL-CLUSTER

MySQL Cluster集群搭建


前言

mysql数据库的主从同步,实现读写分离,主要以replication方式实现数据库主从备份和读写分离,以减轻数据库的负载和避免数据的丢失。但是,这种实现务必要保证主从数据库的数据一致性,否则,一旦有一条数据复制失败,则会导致后面的数据同步都无法继续进行,即出现主从不同步的情形。因此,在这里再写一篇文章,分布式数据库集群,来补充这一缺点。

一、概述

  1. 分布式数据库集群

    Mysql cluster是适用于分布式计算环境的高可用、高冗余版本的mysql,其技术在分布式系统中为mysql数据提供了冗余特性,增强了安全性,使得单个mysql服务器故障不会对系统产生巨大的负面影响,系统的稳定性得到保障。Mysql cluster采用shared-nothing(无共享)架构,主要利用了NDB存储引擎来实现,NDB存储引擎是一个内存式存储引擎,要求数据必须全部加载到内存之中,具有自动分片(分区)功能。数据被自动分布在集群中的不同存储节点上,每个存储节点只保存完整数据的一个分片(fragment)。同时,用户可以设置同一份数据保存在多个不同的存储节点上,以保证单点故障不会造成数据丢失。

    Mysql cluster需要一组计算机,用到mysql cluster安装包,在集群中的每台计算机上安装,只是每台计算机的角色可能是不一样的。Mysql cluster按照节点类型可以分为3类:管理节点(对其他节点进行管理)、数据节点(存放cluster中的数据,可以有多个)和sql节点(存放表结构,可以有多个)。Cluster中的某计算机可以是某一种节点,也可以是2种或3种节点的集合。这3种节点只是在逻辑上划分,所以他们不一定和物理计算机是一一对应的关系。多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。

    管理节点(MGM):这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据,并停止节点,运行备份等。由于这类节点负责管理其他节点的配置,应该在启动其他节点之前启动这类节点。MGM节点是用命令"ndb_mgmd"启动的。

    数据节点(NDB):这类节点用于保存Cluster的数据,数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点,没有必要设定过多的副本,在NDB中数据会尽量的保存在内存中。数据节点使用命令"ndbd"(单线程)或"ndbmtd"(多线程)启动的。

    SQL节点:这是用来访问Cluster数据的节点,对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令"mysqld –ndbcluster"启动的,或将"ndbcluster"添加到"my.cnf"后使用"mysqld"启动。

    Mysql cluster的数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)。

    Mysql cluster具体的同步复制步骤,如下所示:

    1. Master执行提交语句时,事务被发送到slave,slave开始准备事务的提交。
    2. 每个slave都要准备事务,然后向master发送OK(或ABORT)消息,表明事务已经准备好(或者无法准备该事务)。
    3. Master等待所有Slave发送OK或ABORT消息,如果Master收到所有 Slave的OK消息,它就会向所有Slave发送提交消息,告诉Slave提交该事务;如果 Master收到来自任何一个Slave的ABORT消息,它就向所有 Slave发送ABORT消息,告诉Slave去中止事务。
    4. 每个Slave等待来自Master的OK或ABORT消息。如果Slave收到提交请求,它们就会提交事务,并向Master发送事务已提交 的确认;如果Slave收到取消请求,它们就会撤销所有改变并释放所占有的资源,从而中止事务,然后向Masterv送事务已中止的确认。
    5. Master收到来自所有Slave的确认后,就会报告该事务被提交(或中止),然后继续进行下一个事务处理。 由于同步复制一共需要4次消息传递,故mysql cluster的数据更新速度比单机mysql要慢。所以mysql cluster要求运行在千兆以上的局域网内,节点可以采用双网卡,节点组之间采用直连方式。

  2. 数据库的分布式和主从的区别

    主从(Master-Slave): 主从机器上安装mysql community(普通版)就可以。

    主从并没有像集群那样分三种节点,只有主和从两种,而且主从之间是通过mysql的replication方式来保证数据的一致性。相对mysql cluster的数据同步方式来讲是异步的。

    主从复制的过程中,若从数据库中出现其中一条数据同步失败(即relay log中的语句有其中一条写操作语句执行失败),则后面的数据无法继续同步(relay log中后面的写操作语句无法继续执行下去),必须得解决掉或跳过这个执行失败的语句(需要人为去操作),这样就不能保证所有的从数据库的数据一致了。而mysql cluster则不然,若其中只要有一个节点的写操作失败,则其他所有节点针对这一同步均会更新失败,以保证所有节点的数据一致性。

二、环境说明

  1. 系统环境

    服务器IP 节点类型 操作系统
    10.29.81.105 管理节点(MGM) Centos7 64位
    10.30.108.145 数据节点(NDB) Centos7 64位
    10.30.176.213 数据节点(NDB) Centos7 64位
    10.30.108.145 SQL节点 Centos7 64位
    10.30.176.213 SQL节点 Centos7 64位

    注意:我这里把数据节点和SQL节点安装在同一台服务器上。

  2. 软件环境

    mysql cluster 集群版本:mysql-cluster-gpl-7.5.17-el7-x86_64.tar.gz

    下载地址:http://src.12cc.com/mysql-cluster-gpl-7.5.12-linux-glibc2.12-x86_64.tar.gz

三、安装MySQL Cluster

所有服务器均需执行执行以下操作。

注意:在安装mysql cluster之前,必须得先检查该服务器上是否已安装了普通mysql,若安装了则需先把mysql删除干净,因为mysql cluster就包括了普通版mysql

在安装管理节点、数据节点和sql节点时,最好以root用户登录执行,否则有一些步骤需要用到sudo命令来执行。

wget http://src.12cc.com/mysql-cluster-gpl-7.5.12-linux-glibc2.12-x86_64.tar.gz
tar -xzvf mysql-cluster-gpl-7.5.12-linux-glibc2.12-x86_64.tar.gz
mv mysql-cluster-gpl-7.5.12-linux-glibc2.12-x86_64.tar.gz /usr/local/mysql

四、安装管理节点

在服务器10.29.81.105上执行以下操作。

注意,管理节点的防火墙端口开放,默认是1186

  1. 拷贝文件

    需要文件ndb_mgmd和ndb_mgm,可以按以下方式拷贝,并且赋予可执行权限。

    cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/

  2. 配置文件

    ndb_mgmd程序的启动有一个配置文件config.ini,存放目录一般在/var/lib/mysql-cluster,以下命令是创建文件config.ini

    mkdir /var/lib/mysql-cluster
    vim /var/lib/mysql-cluster/config.ini

    config.ini文件内容如下:

    [ndbd default]
    NoOfReplicas=1
    DataMemory=80M
    ServerPort=2202

    [ndb_mgmd]
    NodeId=1
    HostName=10.29.81.105
    DataDir=/var/lib/mysql-cluster

    [ndbd]
    NodeId=2
    HostName=10.30.108.145
    DataDir=/usr/local/mysql/data

    [ndbd]
    NodeId=3
    HostName=10.30.176.213
    DataDir=/usr/local/mysql/data

    [mysqld]
    HostName=10.30.108.145

    [mysqld]
    HostName=10.30.176.213

    [NDBD DEFAULT]:表示每个数据节点的默认配置,在每个节点的[NDBD]中不用再写这些选项,只能有一个。
    NoOfReplicas:副本数量,数据节点数必须是副本数的整数倍。
    [NDB_MGMD]:表示管理节点的配置,只有一个,默认的对其他节点的端口是1186,故服务器需要开放1186端口。
    [NDBD]:表示每个数据节点的配置,可以有多个,分别写上不同数据节点的IP地址。
    [MYSQLD]:表示SQL节点的配置,可以有多个,分别写上不同SQL节点的IP地址。

  3. 启动管理节点

    ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial

    ndb_mgmd是mysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。第一次启动要加"--initial",以后如果配置文件config.ini有改动也要加"--initial",其它情况启动管理节点不用加"--initial"参数。

  4. 关闭集群

    在管理节点上执行 ndb_mgm -e shutdown可以关闭管理节点以及数据节点

五、安装SQL节点

10.30.108.145和10.30.176.213要分别安装SQL节点程序。MySQL-Cluster的SQL节点其实就是普通版本的MySQL,所以安装方法跟普通版本的MySQL一样。

由于我们的数据节点和SQL节点在同一台机器,安装的时候要注意先安装SQL节点,然后再安装数据节点,不然会失败。数据节点的安装相对简单,跟管理节点差不多,就拷贝两个文件。

如果以前安装过mysql,需要删除对应的文件 例如 /usr/local/mysql /etc/my.cnf /etc/init.d/mysql* /etc/rc.d/init.d/mysql*。

我们假设你已经把MySQL-Cluster已经下载并解压到/usr/local/mysql目录下。

查看/etc/passwd和/etc/group文件中是否有mysql用户和组,如果没有按照如下指令创建。

groupadd mysql
useradd -g mysql -s /bin/false mysql
cd /usr/local/mysql/bin/

配置my.cnf文件

数据节点和SQL节点需要配置文件my.cnf

vim /etc/my.cnf

按照如下方式配置。

[mysqld]
ndbcluster

[mysql_cluster]
ndb-connectstring=10.29.81.105

初始化mysql,命令如下:

./mysqld --initialize

如果出现如下错误。

运行以下命令就可以解决。

yum install -y libaio

数据库初始化后会产生root用户的随机密码,如图上红框所示。要记住密码,一会登录数据库要用到。

将mysql目录所有者和组都修改为mysql

cd /usr/local
chown -R mysql:mysql mysql/

设置开机自动启动SQL节点

cp mysql/support-files/mysql.server /etc/rc.d/init.d/mysql.server
chmod +x /etc/rc.d/init.d/mysql.server
chkconfig --add mysql.server
/etc/rc.d/init.d/mysql.server start

查询是否启动成功

chkconfig --list

修改数据库密码

/usr/local/mysql/bin/mysql -uroot -p

系统提示输入数据库密码,这个密码就是刚才上面产生的随机密码。

随机密码一般复杂难记,修改密码。

mysql> set password=password('新密码');
mysql>\q

如果要停止MySQL,命令如下。

/etc/rc.d/init.d/mysql.server stop

六、安装数据节点

需要拷贝ndbd和ndbmtd两个文件到/usr/local/bin目录。

cp /usr/local/mysql/bin/ndbd /usr/local/bin/ndbd

如果这两个文件没有可执行权限需要给与x权限

cd /usr/local/bin
chmod +x ndb*

创建数据存储目录。

mkdir -p /usr/local/mysql/data

上述目录需要和管理节点中配置的DataDir一致

chown -R mysql:mysql /usr/local/mysql/

启动数据节点

在每一台数据节点上都执行ndbd

ndbd --initial

安装后第一次启动数据节点时要加上--initial参数。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。