您现在的位置是:首页 > 正文

MysqlCluster集群搭建及使用

2024-01-30 22:13:33阅读 0

亿级用户的分布式数据存储解决方案 1

1、简介

​ MySQL Cluster(MySQL集群)是一个高性能、可扩展、集群化数据库产品,其研发设计的初衷就是要满足许多行业里的最严酷应用要求。这些应用中经常要求数据库运行的可靠性要达到99.999%。
  自从2004年开始MySQL Cluster发布以来,其新特性的变化就不断的被更新增强。这增加了MySQL Cluster在新的应用领域、市场、行业中的需求量。MySQL Cluster目前已经不仅仅应用于传统的传统的电信业务中,如HLR(Home Locator Registry)或 SLR( Subscriber Locator Registry),它还被广泛的应用在VOIP、网络计费、会议管理、电子商务网站、搜索引擎,甚至是传统的后台应用中。

特点:

  • 高可用性:主服务器故障后可自动切换到后备服务器
  • 可伸缩性:可方便通过脚本增加DB服务器
  • 负载均衡:支持手动把某公司的数据请求切换到另外的服务器,可配置哪些公司的数据服务访问哪个服务器
d833c895d143ad4b031769ca82025aafa40f06fa

2、搭建Mysql Cluster(基于阿里云内网部署,相同实例地区)

主要参考23

MySQL结构,由3类节点(计算机或进程)组成,分别是:

  • 管理节点:用于给整个集群其他节点提供配置、管理、仲裁等功能。
  • 数据节点:MySQL Cluster的核心,存储数据、日志,提供数据的各种管理服务。
  • SQL节点(API):用于访问MySQL Cluster数据,提供对外应用服务。

各个节点中安装路径必须相同,配置环境一直!!!

  1. 如果机器上安装了mysql-server,先卸载掉

    首先删除mysql-server:

    sudo apt-get remove mysql-*
    

    然后清理残留的数据

    dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
    

    它会跳出一个对话框,你选择yes就好了

  2. 服务器上搭建时,同一个区域中的服务器(配置使用内网搭建,速度快)

修改 vi /etc/hosts 的文件,使用内网的ip

172.16.184.33	slave1
172.16.0.243	slave2
172.16.232.76	master
  1. 在相应的主机中修改名称(或者是修改hosts的文件的名称,为了便于后期使用,建议修改名称
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
  1. 设置主机之间的相互免密登录(设置公钥)

  2. 下载安装包,下载网址4

image-20210701095735494
  1. 将压缩包移动到/usr/local/mysql下,解压完成后,修改路径,每个节点都位于相同的路径下

    image-20210701192501534

  2. 集群默认端口为1186

2.1 安装配置管理节点(GMG)
  • 上传并解压文件
mkdir -p /usr/local/mysql (创建mysql目录)
cd /usr/local/mysql
tar -zxvf mysql-cluster-gpl-7.6.12-linux-glibc2.12-x86_64.tar
mv mysql-cluster-8.0.25-linux-glibc2.12-x86_64 mysql-cluster (解压到目录下进行重命名)
  • 创建管理目录
mkdir -p /var/log/mysql-cluster
mkdir -p /etc/mysql-cluster
  • 配置目录
vi /etc/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2                  #数据写入数量。2表示两份,2个数据节点
DataMemory=80M                  #配置数据存储可使用的内存
IndexMemory=18M                 #索引给100M


[ndb_mgmd]
nodeid=1
datadir=/var/log/mysql-cluster      #管理结点的日志
HostName=172.16.232.76              #管理结点的IP地址。本机IP


###### data node options:           #存储结点
[ndbd]
HostName=172.16.0.243
DataDir=/data/mysql                 #mysql数据存储路径
nodeid=2


[ndbd]
HostName=172.16.184.33
DataDir=/data/mysql                 #mysql数据存储路径
nodeid=3


# SQL node options:                 #关于SQL结点
[mysqld]
HostName=172.16.184.34
nodeid=4


[mysqld]
HostName=172.16.64.223
nodeid=5
  • 初始化管理节点
/usr/local/mysql/mysql-cluster/bin/ndb_mgmd -f /etc/mysql-cluster/config.ini
  • 查看集群的状态
/usr/local/mysql/mysql-cluster/bin/ndb_mgm
ndb_mgm> show
#或者使用
./ndb_mgm -e show
WX20210701-185520@2x

发现管理节点已经启动,当数据节点以及SQL节点未启动时显示的是not connected

2.2 安装配置数据节点(NDB)

将下面配置同步到其余的配置数据节点中

  • 上传并解压文件
mkdir -p /usr/local/mysql (创建mysql目录)
cd /usr/local/mysql
tar -zxvf mysql-cluster-gpl-7.6.12-linux-glibc2.12-x86_64.tar
mv mysql-cluster-8.0.25-linux-glibc2.12-x86_64 mysql-cluster (解压到目录下进行重命名)
  • 创建mysql用户并运行
useradd -M -s /sbin/nologin mysql
  • 创建mysql目录并授权
mkdir -p /etc/mysql
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql/
  • 配置数据节点
vi /etc/mysql/my.cnf
[mysqld]
datadir=/data/mysql                     #mysql数据存储路径
ndbcluster                              #启动ndb引擎
ndb-connectstring=172.16.232.76         #管理节点IP地址  

[mysql_cluster]
ndb-connectstring=172.16.232.76         #管理节点IP地址
  • 启动数据节点
#只有当第一次的时候才有加 --intital 否则数据会丢
/usr/local/mysql/mysql-cluster/bin/ndbd --initial
  • 查看状态
    WX20210701-185856@2x

WX20210701-185909@2xWX20210701-185917@2x

2.3 安装配置SQL节点(NDB)

将下面配置同步到其余的安装配置SQL节点中

  • 上传并解压文件
mkdir -p /usr/local/mysql (创建mysql目录)
cd /usr/local/mysql
tar -zxvf mysql-cluster-gpl-7.6.12-linux-glibc2.12-x86_64.tar
mv mysql-cluster-8.0.25-linux-glibc2.12-x86_64 mysql-cluster (解压到目录下进行重命名)
  • 创建mysql目录并授权
mkdir -p /etc/mysql
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql/
  • 创建SQL节点配置文件
vi /etc/mysql/my.cnf
[mysqld]
user=mysql
ndbcluster                                                              #启动ndb引擎
ndb-connectstring=172.16.232.76                       #管理节点IP地址  

[mysql_cluster]
ndb-connectstring=172.16.232.76                     #管理节点IP地址
  • 配置mysql服务
cp /usr/local/mysql/mysql-cluster/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
update-rc.d mysqld defaults
  • 编辑mysqld服务
vi /etc/init.d/mysqld
image-20210701194557199
替换为自己的安装目录
  basedir=/usr/local/mysql/mysql-cluster
  bindir=/usr/local/mysql/mysql-cluster/bin
  if test -z "$datadir"
  then
    datadir=/data/mysql
  fi
  sbindir=/usr/local/mysql/mysql-cluster/bin
  libexecdir=/usr/local/mysql/mysql-cluster/bin
  • 初始化mysql数据库

进入到 /usr/local/mysql/mysql-cluster/bin

#执行完命令 记得保存一下随机产生的密码
cd /usr/local/mysql/mysql-cluster/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/mysql-cluster --datadir=/data/mysql/ 

Slave3(保存随机产生的密码

WX20210701-190549@2x

Slave4(保存随机产生的密码

WX20210701-190639@2x

  • 启动mysql服务
systemctl daemon-reload
systemctl start mysqld

Slave3,发现已经启动了mysql的3306端口,出现红色的警告,可以使用systemctl daemon-reload尝试解决下,下面的截图是没有加systemctl daemon-reload的,但是还是可以正常启动

WX20210701-190806@2x

Slave4,发现已经启动了mysql的3306端口

WX20210701-190818@2x

2.4 集群状态

进入到

cd /usr/local/mysql/mysql-cluster/bin
./ndb_mgm

进入下面界面使用show可==查看到5个节点全部启动,说明搭建完成!!!==

WX20210701-191003@2x

3、操作Mysql Cluster

  • 在SQL节点(slave3,slave4)中使用操作数据库,输入前面保存的随机密码进入数据库中
cd /usr/local/mysql/mysql-cluster/bin
./mysql -uroot -p
  • 操作数据库

    在使用命令之前需要先修改数据库的密码后进行操作,否则将会出现下面的错误

    WX20210701-191514@2x

    使用下面命令修改密码为123456789

    alter user user() identified by "123456789";
    
WX20210701-191530@2x
  • 创建数据库

    在slave3中创建 mytest 数据库

    WX20210701-191654@2x

    登录slave4中的数据库同时也修改密码,然后查看数据库时发现mytest数据库同步创建

    WX20210701-191741@2x

  • 创建数据表并添加数据

    添加 engine=ndbcluster 或者是 engine=ndb(mysql cluster集群只能同步ndb引擎的表

    create table sys_myfirst(id varchar(36) primary key, name varchar(100), memo varchar(255)) ENGINE=innodb DEFAULT CHARSET=utf8 engine=ndbcluster;
    Query OK, 0 rows affected, 1 warning (0.42 sec)
    

    slave3中创建数据表,并添加两条数据

    image-20210701205405177

    slave4中可查看到slave3中创建的表与数据

    image-20210701205442243

4、MySQL Cluster的关闭顺序与单点故障测试

==关闭顺序与单点故障参考== 5

关闭顺序:SQL节点->数据节点->管理节点(在MySQL Cluster环境中,NDB节点和管理节点的关闭都可以在管理节点的管理程序中完成,也可以分节点关闭,但是SQL节点却没办法。所以,在关闭整个MySQL Cluster环境或者关闭某个SQL节点的时候,首先必须到SQL节点主机上来关闭SQL节点程序。关闭方法和MySQL Server的关闭一样。)

  1. SQL节点关闭

    systemctl stop mysqld

    root@slave3:/usr/local/mysql/mysql-cluster/bin# lsof -i:3306
    COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    mysqld  1319 mysql   40u  IPv6  24436      0t0  TCP *:mysql (LISTEN)
    root@slave3:/usr/local/mysql/mysql-cluster/bin# systemctl stop mysqld
    Warning: The unit file, source configuration file or drop-ins of mysqld.service changed on disk. Run 'systemctl daemon-reload' to reload units.
    root@slave3:/usr/local/mysql/mysql-cluster/bin# lsof -i:3306
    root@slave3:/usr/local/mysql/mysql-cluster/bin# systemctl start mysqld
    Warning: The unit file, source configuration file or drop-ins of mysqld.service changed on disk. Run 'systemctl daemon-reload' to reload units.
    ###或者在/etc/init.d中使用
    root@slave4:/etc/init.d# ./mysqld stop
    
  2. 数据节点(NDB)关闭

    image-20210702092053968

    cd /usr/local/mysql/mysql-cluster/bin
    ./ndbd stop
    2018-01-16 18:30:51 [ndbd] INFO     -- Angel connected to '192.168.0.30:1186'
    2018-01-16 18:30:51 [ndbd] INFO     -- Angel allocated nodeid: 2
    #或者使用pkill -9 ndbd
    #启动使用(不需要加--initial)
    ./ndbd
    
  3. 管理节点关闭(关闭管理节点后会一起关闭数据节点

    image-20210702093643332

    ndb_mgm> shutdown
    Node 2: Cluster shutdown initiated
    Node 3: Cluster shutdown initiated
    3 NDB Cluster node(s) have shutdown.
    Disconnecting to allow management server to shutdown.
    Node 3: Node shutdown completed.
    ndb_mgm> 
    #或者使用
    /usr/local/mysql/mysql-cluster/bin# ./ndb_mgm -e shutdown
    

5、Mysql Cluster 远程连接

  1. 改表法

    use mysql;
    select host, user from user;
    update user set host = '%' where user = 'root';
    select host, user from user;
    #修改完以后重启mysql
    
    image-20210701235401421
  2. 授权法

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456789' WITH GRANT OPTION;
    FLUSH PRIVILEGES  #使修改生效,就可以了
    

6、测试单点故障(高可用)

  • 当停止掉两台数据节点中的一台节点时,使用SQL节点进行操作,可以正常操作
  • 当停止掉两台SQL节点中的一台节点时,使用另一台SQL节点进行操作,也可以正常操作
  • 当分别停止掉两台数据节点和两台SQL节点中的一台节点时,只留一台SQL节点与一台数据节点,同样可以正常服务

7、SpringBoot中使用

springboot jpa连接mysql数据库集群(NDBCLUSTER)引擎设置6

主要参考:Spring Boot MyBatis 数据库集群访问实现 7

image-20210702205711624

代码路径8语雀

参考网址


  1. https://www.pianshen.com/article/51641527056/ ↩︎

  2. https://www.jianshu.com/p/37525ae8dee4 ↩︎

  3. https://www.cnblogs.com/zzdbullet/p/11475641.html ↩︎

  4. https://dev.mysql.com/downloads/cluster/ ↩︎

  5. https://blog.csdn.net/mashuai720/article/details/79126360 ↩︎

  6. https://blog.csdn.net/xyzdwf/article/details/102482393 ↩︎

  7. https://github.com/smltq/spring-boot-demo/tree/master/mybatis-multi-datasource ↩︎

  8. https://www.yuque.com/yuankaiqiang/file/19961453 ↩︎

网站文章

  • requests请求库

    requests请求库

    一、介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求 #安装:pip3 install requests #各种请求方式:常用...

    2024-01-30 22:13:05
  • 计算机软件可专利性否定,什么是计算机软件可专利性?计算机软件的专利保护有什么特点?...

    计算机软件的专利保护有什么特点?计算机软件可专利性,是指软件属于应当被授予专利的发明创造。计算机软件作为信息产业的支柱之一,对其进行制度保护是必要的。专利法上所称发明是指对产品、方法或者其改进所提出新...

    2024-01-30 22:13:00
  • vue+elementUi发送邮件组件编写

    vue+elementUi发送邮件组件编写

    父组件:<email-dialog v-if="showemailDialog" v-on:closeemailDialog="closeemailDialog" :multipleSelectio...

    2024-01-30 22:12:53
  • Sentinel+Nacos+SpringCloud流量控制实现

    Sentinel+Nacos+SpringCloud流量控制实现

    环境说明: Sentinel-1.6.0 Nacos-1.0.0 1.pom.xml配置 org.springframework.boot spring-boot-starter-parent...

    2024-01-30 22:12:46
  • Qt-QPixmap

    Qt-QPixmap

    2024-01-30 22:12:16
  • Mongo String类型日期转ISODate类型

    在mysql数据库导出的csv文件里的数据导入到mongodb数据库中, 发现日期数据是String,想要专为mongo的ISODate,方便以后的关于时间的查询。 以users表为例 方法一:少量数...

    2024-01-30 22:12:07
  • 定义可变参数的宏

    定义可变参数的宏

    像printf类的函数,如果代码中的比较多,且需要检查返回值时,没用到一个地方就添加一段返回值检查会比较烦,不添加,如果要求pclint扫描时会报warning 514。 为了方便,有两种方式,一种是...

    2024-01-30 22:11:59
  • 单表查询student表和score

    单表查询student表和score

    Sutdent 表的定义字段名 字段描述 数据类型 (主键 外键 非空 唯一 自增)Id 学号 INT(10) 是否是是是Name 姓名 VARCHAR(20) 否否是否否Sex 性别 VARCHAR...

    2024-01-30 22:11:29
  • 宽度的100%和auto的区别

    前段时间做项目,发现分不清width设为100%和auto的区别,实在是太水了,就查了点资料,做个总结,有不对的地方欢迎大家指出。 width:auto 块级元素默认的宽度值。看一下MDN上的解释:The browser will calculate and select a width for the specified element.大意是浏览器会自己选择一个合适的宽度值,那么...

    2024-01-30 22:11:22
  • 股票配对交易策略-最小距离法

    股票配对交易策略-最小距离法

    策略配对交易( Pairs Trading)为这种困境提供了一种既能避险又盈利的策略,其又被称之为价差交易或者统计套利交易,是一种风险小、收益较稳定的市场中性策略。一般的做法,是在市场中寻找两只历史价...

    2024-01-30 22:11:15