MysqlCluster
yuankaiqiang Lv5

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

[toc]

1、简介

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

c?o;kd&5YLDT

vTw8&01niyek

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

alter user user() identified by “123456789”;

特点:

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

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

主要参考^2

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

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

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

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

    首先删除mysql-server:

    1
    sudo apt-get remove mysql-*

    然后清理残留的数据

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

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

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

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

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

  2. 下载安装包,下载网址^1

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

    image-20210701192501534

  2. 集群默认端口为1186

2.1 安装配置管理节点(GMG)

  • 上传并解压文件
1
2
3
4
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 (解压到目录下进行重命名)
  • 创建管理目录
1
2
mkdir -p /var/log/mysql-cluster
mkdir -p /etc/mysql-cluster
  • 配置目录
1
vi /etc/mysql-cluster/config.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[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
  • 初始化管理节点
1
/usr/local/mysql/mysql-cluster/bin/ndb_mgmd -f /etc/mysql-cluster/config.ini
  • 查看集群的状态
1
2
3
4
/usr/local/mysql/mysql-cluster/bin/ndb_mgm
ndb_mgm> show
#或者使用
./ndb_mgm -e show
WX20210701-185520@2x

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

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

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

  • 上传并解压文件
1
2
3
4
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用户并运行
1
useradd -M -s /sbin/nologin mysql
  • 创建mysql目录并授权
1
2
3
mkdir -p /etc/mysql
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql/
  • 配置数据节点
1
2
3
4
5
6
7
8
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地址
  • 启动数据节点
1
2
#只有当第一次的时候才有加 --intital 否则数据会丢
/usr/local/mysql/mysql-cluster/bin/ndbd --initial
  • 查看状态
WX20210701-185856@2x

WX20210701-185909@2x

WX20210701-185917@2x

2.3 安装配置SQL节点(NDB)

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

  • 上传并解压文件
1
2
3
4
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目录并授权
1
2
3
mkdir -p /etc/mysql
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql/
  • 创建SQL节点配置文件
1
vi /etc/mysql/my.cnf
1
2
3
4
5
6
7
[mysqld]
user=mysql
ndbcluster #启动ndb引擎
ndb-connectstring=172.16.232.76 #管理节点IP地址

[mysql_cluster]
ndb-connectstring=172.16.232.76 #管理节点IP地址
  • 配置mysql服务
1
2
3
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服务
1
vi /etc/init.d/mysqld
image-20210701194557199
替换为自己的安装目录
1
2
3
4
5
6
7
8
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

1
2
3
#执行完命令 记得保存一下随机产生的密码
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服务
1
2
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 集群状态

进入到

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

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

WX20210701-191003@2x

3、操作Mysql Cluster

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

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

    WX20210701-191514@2x

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

    1
    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引擎的表==)

    1
    2
    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的关闭顺序与单点故障测试

关闭顺序与单点故障参考 ^4

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

  1. SQL节点关闭

    systemctl stop mysqld

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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

    1
    2
    3
    4
    5
    6
    7
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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. 该表法

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

    1
    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语雀

参考网址

 评论