Mysql-Cluster-7.6搭建数据库集群
系统:vm虚拟机下ubuntu server 18.04 lts
前言
当你的业务到达一定的当量,肯定需要一定数量的数据库来负载均衡你的数据库请求,我在之前的博客中已经说明了,如何实现负载均衡,但是还有一个问题就是数据同步,因为负载均衡的前提就是,各个服务器的数据库是数据同步的。在业务量不大的时候,我们会使用主从复制的方法实现服务器数据同步,一主多从或者是双主等,但是虽然进行了读写分离,但是对于读的方法限制还是比较大,所以解决数据同步的问题就是数据库集群的意义。我这里使用mysql官网提供的mysql-cluster实现集群。(到文章发布前的最新版本的安装教程,把网上踩的坑都踩过了一遍;)
mysql cluster中的几个概念解释
为了简单,我后面简称mysql-cluster为mc。
1、mc已经包含了mysql,我下载的最新的mc7.5,官方说明包含的是mysql版本是5.7。所以不需要使用别的msyql的安装包安装数据库。同时注意mysql5.7的版本在安装的命令和配置上面和之前的版本有很大的不同,所以网上有很多mc7.5之前的版本,所包含的mysql版本不同,所以安装方法不同。
2、管理节点,管理节点负责管理、配置、监控整个集群。
3、数据节点,使用内存存放数据,保存进数据节点的数据都会自动复制并存储到其他数据节点。
4、mysql节点,也叫数据库节点,和我们平时使用的mysql相同,作为数据库使用。被数据节点访问。
架构图及说明
因为虚拟机占用内存较大,只使用了3台服务器,在实际情况中最好将数据节点和mysql节点分开。在实际中负载均衡服务还需要做备份,因为万一负载均衡服务器宕机将会导致所有数据节点都无法访问,所以需要对负载均衡服务器备份,有条件的话,分开管理节点和负载均衡器。实验只实现整个数据库集群,负载均衡请参考之前的博客配置即可。
129的负载均衡可以参考 HAProxy实现mysql负载均衡 也可以使用的别的负载均衡方案。
下载mysql cluster
首先下载mysql cluster: http://cdn.mysql.com/Downloads/MySQL-Cluster-7.6/mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
我下载的版本是mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
注意看清是64位版本的,别下载错了
安装mysql cluster之前
安装之前,如果之前安装过mysql,那么需要删除相应的各种mysql文件,删除之前请停止mysql服务。并且不要忘记删除my.cnf这些配置文件。确保删除干净。不然可能会和后面的安装有冲突。如果是实验,关闭防火墙,实际中,防火墙打开对应端口,{注意实际中需要使用的端口不只有3306端口,还有同步需要使用的1186端口!!!}。保证服务器之前能互相访问,能ping通。保证固定的ip地址。保证没有别的程序占用需要使用的端口。如3306等。这些都确认完毕后再进行安装。需要linux基础的命令熟练,需要熟练安装mysql基本版本等操作,因为后序的一些操作我会简单描述,不做过多的说明了。
安装配置管理节点
将下载后的包上传至服务器/usr/local下
#cd /usr/local
tar -xzvf mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
Tips:输入tar -xzvf mysql- 就可以按一下tab键会自动匹配文件名,前提该文件夹下面有该文件
将需要的文件取出
cd mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
cp bin/ndb_mgm* /usr/local/bin
cd /usr/local/bin
chmod +x ndb_mgm*
新建配置文件并且初始化管理节点
mkdir /var/lib/mysql-cluster
mkdir /usr/local/mysql
vi /var/lib/mysql-cluster/config.ini
下面是配置文件,根据自己的需求修改,首先给出官网的默认配置文件,然后给出我的配
[ndbd default]
Options affecting ndbd processes on all data nodes:
NoOfReplicas=2 # Number of replicas
DataMemory=80M # How much memory to allocate for data storage
IndexMemory=18M # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example NDB Cluster setup.
ServerPort=2202 # This the default value; however, you can use any
# port that is free for all the hosts in the cluster
# Note1: It is recommended that you do not specify the port
# number at all and simply allow the default value to be used
# instead
# Note2: The port was formerly specified using the PortNumber
# TCP parameter; this parameter is no longer available in NDB
# Cluster 7.5.
[ndb_mgmd]
# Management process options:
HostName=192.168.0.10 # Hostname or IP address of MGM node
DataDir=/var/lib/mysql-cluster # Directory for MGM node log files
[ndbd]
# Options for data node "A":
# (one [ndbd] section per data node)
HostName=192.168.0.30 # Hostname or IP address
NodeId=2 # Node ID for this data node
DataDir=/usr/local/mysql/data # Directory for this data node's data files
[ndbd]
# Options for data node "B":
HostName=192.168.0.40 # Hostname or IP address
NodeId=3 # Node ID for this data node
DataDir=/usr/local/mysql/data # Directory for this data node's data files
[mysqld]
# SQL node options:
HostName=192.168.0.20 # Hostname or IP address
# (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
我的:
[ndbd default]
NoOfReplicas=2
DataMemory=512M
IndexMemory=18M
[ndb_mgmd]
HostName=192.168.164.140
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=192.168.164.137
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=192.168.164.139
DataDir=/var/lib/mysql-cluster
[mysqld]
[mysqld]
使用配置文件初始化管理节点
/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
出现MySQL Cluster Management Server mysql-x.x.x ndb-x.x.x
然后就能使用ndbd进去管理了(如果ndbd命令不行,就使用在/usr/local/bin目录下使用ndb_mgm命令)
ndbd
ndb_mgm>show(使用show命令查看管理情况,当数据节点配置完毕之后,我们再用这个命令查看和管理)
到此为止管理节点配置完毕,接下去配置数据和sql节点
安装配置数据和mysql节点
以下的所有操作需要在所有的集群节点都要进行相同的操作
新增用户组mysql和用户msyql
groupadd mysql
useradd -g mysql -s /bin/false mysql
新建文件夹并赋予权限
mkdir /var/lib/mysql-cluster
chown root:mysql /var/lib/mysql-cluster
将下载后的包上传至服务器/usr/local下
解压
tar -xzvf mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz
创建链接方便访问
ln -s /usr/local/mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz /usr/local/mysql
初始化数据库(这里要注意,如果你安装的版本和我的不同,数据库初始化的命令使不同的,很多之前的版本会使用:scripts/mysql_install_db --user=mysql来初始化,这个已经被mysql在新的版本中废弃了,所以需要使用下面的命令安装,如果你需要安装别的版本请参考mysql官网的对应版本的安装命令。)
进入刚才创建的目录下
cd /usr/local/mysql
如果下方这个命令无法使用,那么就进入bin目录下使用./mysqld --initialize进行初始化,总之正常安装mysql如何初始化就如何进行安装就可以了,这里还可以设置安装数据库的data目录等参数这里就不多解释了,网上安装mysql5.7的教程很多。
apt-get install libaio1 libaio-dev (若提示缺少libaio1.so,则使用该指令安装依赖)
mysqld --initialize
如果初始化成功之后,系统会提示一个随机生成的数据库密码,此时需要记住这个密码,之后登录数据库需要使用这个密码!!!
修改权限
#cd /usr/local/mysql
chown -R root .
chown -R mysql data
chgrp -R mysql .
cp support-files/mysql.server /etc/init.d/
chmod +x /etc/init.d/mysql.server
update-rc.d mysql.server defaults
配置数据节点
vi /etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=192.168.164.140
[mysql_cluster]
ndb-connectstring=192.168.164.140
其中的IP为管理节点的IP
启动集群节点上面的服务启动mysql(成功会有success)# /etc/init.d/mysql.server start
启动mysql成功之后请自己登录进mysql内然后进行密码修改等操作,就和正常安装完成mysql的操作一样。需要注意的是,集群数据库的密码需要相同哦!
#cd /usr/local/mysql
/usr/local/mysql# bin/mysql -u root -p
修改mysql密码:mysql>set password=password(‘peipei’);
mysql>flush privileges;
启动ndbd# /etc/init.d/ndbd --initial如果上述不行使用绝对路径的这个:
/usr/local/mysql/bin/ndbd --initial如果出现下述现象就成功了
2018-12-31 14:04:07 [ndbd] INFO – Angel connected to’192.168.164.140:1186’
2018-12-31 14:04:07 [ndbd] INFO – Angel allocated nodeid: 2
最后当所有的节点配置完成,回到管理节点,使用上述说过的show查看,如下的类似显示,证明已经连接完成
测试
修改mysql密码统一,修改mysql的访问权限,使外部ip能远程访问mysql
查看mysql端口号命令mysql> show global variables like ‘port’;
然后创建在一台上面创建数据库,看另一台是否被同步,然后创建表,然后新增删除等等。
唯一需要注意的是,创建表的时候必须选择表的引擎为NDBCLUSTER,否则表不会进行同步
下面是测试的截图
如果使用sql创建表,命令为:CREATE TABLE student (age INT) ENGINE=NDBCLUSTER
启动和关闭
启动mysql集群。启动顺序为:管理节点→数据节点→SQL节点。
启动的命令上面都有,删去–initial即可, 否则数据库中表会被清除!!!
关闭时只需要关闭管理节点,后面的数据节点会同时被关闭,mysql就和原来一样即可
管理节点关闭命令:ndb_mgm -e shutdown
(执行完成之后管理节点会关闭,数据节点也会关闭,但SQL节点不会,也就是数据库服务需要手动到每一台服务器上停止以保证数据同步)
启动mgm: /usr/local/bin/ndb_mgm
启动数据节点ndbd:/usr/local/mysql/bin/ndbd
启动sql节点:/etc/init.d/mysql.server start
总结
1、在实际中需要分开数据节点和sql节点。
2、安装最好参考官网的文档进行配置安装,网上的博客安装的可能为旧版本,命令可能不同,连我自己现在写的不知道你看的时候是不是官网又出了新版本,可能在某些地方进行了改动。
3、配置文件过于简单,还有很多配置会在实际中被使用到,需要参考文档进行添加。(my.cnf文件的配置需要根据你的实际进行修改)
4、架构简单,实验足够,现实远不足。(需要使用备份数据库,要备份管理节点等)
5、还未测试各种节点断开、服务器停止、数据库服务停止、是否会出现数据异常等等特殊情况,还需要进行考虑。因为一旦数据不同步,想要恢复数据会比较麻烦。(之后经过测试,数据库服务停止之后,或者服务器停止之后,只要管理节点正常,数据会之后在开启之后同步过去,但是为了防止万一还是需要做好数据备份工作)
最后给出mysql官网的参考文档:https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-installation.html
官网安装步骤可能和我的不同,我尽可能一台弄好再弄另外的,官网有配置和启动进行划分,每台同时进行,所以需要看清楚。
实现集群的方式不止这一种,网上给出了几种方式,这里只做参考:
http://www.2cto.com/database/201504/387166.htm