MySQL集群搭建实现高可用
1、MySQL集群概述和安装环境
MySQL Cluster是MySQL适合于分布式计算环境的高实用、高冗余版本。Cluster的汉语是“集群”的意思。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。
MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。
1.1 mysql 集群架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xazQiqqg-1584943258267)(C:\Users\pc\AppData\Roaming\Typora\typora-user-images\image-20200313204532221.png)]
上图是mysql的一种常见集群
SQL节点: 给上层应用层提供sql访问。
管理节点(MGM): 管理整个集群。 启动,关闭集群。 通过ndb_mgmd命令启动集群
存储/数据节点: 保存cluster中的数据。 数据节点,可以提供副本。实现数据冗余。
NDB引擎:是一种 “内存中”的存储引擎 , 它具有可用性高和数据一致性好的特点。
拓展:NDB引擎介绍:
NDB引擎
MySQL Cluster 使用了一个专用的基于内存的存储引擎——NDB引擎,这样做的好处是速度快, 没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制, 如果运行NDB的MySQL服务器一定要内存够大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上 通过配置2台NDB的存储节点就能*实现整个数据库集群的冗余性和解决单点故障问题。
缺陷:
- 基于内存,数据库的规模受集群总内存的大小限制
- 基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证。
- 多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响,因此速度也比较慢
优点:
- 多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。
- 扩展性很好,增加节点即可实现数据库集群的扩展。
- 冗余性很好,多个节点上都有完整的数据库数据,因此任何一个节点宕机都不会造成服务中断。
Mysql cluster的下载地址:https://dev.mysql.com/downloads/cluster/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GsDANwlq-1584943258276)(file:///C:\Users\pc\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg)]
在我们做的实验中mysql cluster集群各机器角色如下分配:
-
mysql 管理节点:TSL1.cn IP:192.168.43.111
-
mysql 数据节点:TSL2.cn IP:192.168.43.112
-
mysql 数据节点:TSL3.cn IP:192.168.43.113
-
msyql SQL节点:TSL4.cn IP:192.168.43.114
-
msyql SQL节点:TSL5.cn IP:192.168.43.115
1.2MySQL集群搭建
1.2.1.环境清理以及安装
这一部分虽然是初始过程但是比较复杂,请大家耐心配置。
所有主机上执行下面内容:
首先我们要清除旧版本,然后安装mysql cluster,最后是文件权限管理。
1.2.2mysql旧版本清除
首先使用如下命令来清理之前操作系统自带的mysql安装:
yum -y remove mysql
然后使用如下命令:
rpm -qa | grep mysql
对于找到的2个剩余mysql包,请按照如下的命令格式予以删除:
rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64
最后删掉下列文件:
rm -rf /var/lib/mysql/\
rm -rf /etc/my.cnf
rm -rf /etc/init.d/mysqld
vim /etc/profile 删除与mysql相关内容
2.mysql cluster 7.5版本安装
2.1上传并安装最新的EPEL源 和 mysql社区版源安装包
[root@TSL1~]# rpm -ihv epel-release-7-10.noarch.rpm
[root@TSL1 ~]# rpm -ihv mysql57-community-release-el7-11.noarch.rpm
2.2开启mysql cluster 源
[root@TSL1 ~]# sed -i “55s/0/1/g” /etc/yum.repos.d/mysql-community.repo
2.3刷新yum源缓存
[root@TSL1 ~]# yum clean all && yum list
2.4安装解决Cluster的依赖包
[root@TSL1~]# yum install -y perl perl-Class-MethodMaker perl-DBI libaio numactl
2.5安装Mysql Cluster
[root@TSL1 ~]# yum install -y mysql-cluster-community-server
2.6查看安装路径
[root@TSL1~]# rpm -ql mysql-cluster-community-server
其他4台主机上重复2.1—2.5的步骤
3、数据节点主机都要安装数据节点的相关包(2台)
[root@TSL2~]# yum install -y mysql-cluster-community-data-node
[root@TSL3 ~]# yum install -y mysql-cluster-community-data-node
4、管理节点安装management管理包
[root@TSL1~]# yum -y install mysql-cluster-community-management-server
5、创建文件夹
管理节点创建配置目录:
[root@TSL1~]# mkdir -p /usr/mysql-cluster/
6、搭建mysql集群
经过复杂的初始配置,我们终于要搭建集群了。我们按配置,启动,测试的顺序来整理这一部分。
6.1各个机器上的配置
我们先将需求配置到各台机器上
6.1.1 TSL1创建管理节点上配置文件
[root@TSL1 ~]vim /usr/mysql-cluster/config.ini #写入以下内容
[ndbd default]
NoOfReplicas=2 #数据写入数量。2表示两份
DataMemory=200M #配置数据存储可使用的内存
IndexMemory=100M #索引给100M
[ndb_mgmd]
nodeid=1
datadir=/var/lib/mysql #管理结点的日志
HostName=192.168.43.111 #管理结点的IP地址。本机IP
data node options: #存储结点
[ndbd]
HostName=192.168.43.112
DataDir=/var/lib/mysql #mysql数据存储路径
nodeid=2
[ndbd]
HostName=192.168.43.113
DataDir=/var/lib/mysql #mysql数据存储路径
nodeid=3
SQL node options: #关于SQL结点
[mysqld]
HostName=192.168.43.114
nodeid=4
[mysqld]
HostName=192.168.43.115
nodeid=5
在这个文件里,我们分别给五个节点分配了ID,这有利于更好的管理和区分各个节点。当然,要是不指定,MySQL也会动态分配一个
6.2.TSL2、TSL3数据节点
[root@TSL2 /]# vim /etc/my.cnf #请配置TSL3一样
[root@TSL3 /]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql #mysql数据存储路径
ndbcluster #启动ndb引擎
ndb-connectstring=192.168.43.111 #管理节点IP地址
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=192.168.43.111 #管理节点IP地址
7、SQL节点配置文档:
7.1配置
[root@TSL4~]#vim /etc/my.cnf #请配置TSL5一样
[root@TSL5~]#vim /etc/my.cnf
[mysqld]
ndbcluster #启动ndb引擎
ndb-connectstring=192.168.43.111 # 管理节点IP地址
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=192.168.43.111 #管理节点IP地址
说明:数据节点和SQL结点配置文件区别 ,就多一行
数据结点有:datadir=/var/lib/mysql #mysql数据存储路径。
SQL节点上没有。
7.2MySQL Cluster启动
初次启动命令以及用户密码更改调整:(请严格按照次序启动)
先启动:管理结点服务->数据结点服务->sql结点服务
关闭:关闭管理结点服务,关闭管理结点服务后,nbdb数据结点服务会自动关闭->手动把sql结点服务关了。
执行初次启动前请先确认 将两台机器的防火墙关闭(service iptables stop 或者 设定 防火墙端口可通,两个端口即通讯端口1186、数据端口3306 )
7.3TSL1上启动管理结点命令
[root@TSL1 ~]#ndb_mgmd --ndb_nodeid=1 --initial -f /usr/mysql-cluster/config.ini
#尽量不要把 管理结点、 数据结点、存储结点 配置在同一台机子上,否则一个挂了,就全挂了。
查看端口号:
[root@TSL1~]# netstat -antup | grep 1186
tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 7057/ndb_mgmd
tcp 0 0 127.0.0.1:1186 127.0.0.1:60324 ESTABLISHED 7057/ndb_mgmd
tcp 0 0 127.0.0.1:60324 127.0.0.1:1186 ESTABLISHED 7057/ndb_mgmd
7.4 TSL2和TSL3启动数据节点服务
[root@TSL2 ~]# ndbd --initial
[ndbd] INFO – Angel connected to ‘192.168.43.111: 1186’
[ndbd] INFO – Angel allocated nodeid: 2
[root@TSL3 ~]# ndbd --initial
[ndbd] INFO – Angel connected to ‘192.168.43.111: 1186’
[ndbd] INFO – Angel allocated nodeid: 3
7.5 TSL4、TSL5启动SQL结点服务
[root@TSL4~]#systemctl start mysqld
[root@TSL5~]#systemctl start mysqld
8、查看mysql 集群状态:
[root@TSL1 ~]#ndb_mgm
ndb_mgm> show
9、数据同步实验测试
因为默认密码比较坑人,我们就需要在此之前改一下两台机器mysql的密码。
查看mysql root用户密码
注意:我们只需修改sql节点的密码
[root@TSL4 ~]# grep password /var/log/messages
The random password set for the root user at Wed Apr 1 22:15:48020(local time): gDVpNRBxTcgd17di
5.7以上版本 关闭密码安全策略插件
在my.cnf添加 validate-password=off 重启mysql
[root@TSL4 ~]# mysql –uroot –p’gDVpNRBxTcgd17di’
mysql>set password for ‘root’@‘localhost’=password(‘123456’);
mysql>grant all privileges on *.* to cluster@”%” identified by “123456” #授权
mysql>flush privileges;
另一台sql节点也是一样操作
10、模拟外部机器的一个客户端 插入数据:
mysql -ucluster -p123456 -h 192.168.43.114
注意:创建表的时候使用ndb引擎
mysql> create database db;
mysql> use db;
mysql> create table test(id int) engine=ndb;
mysql> insert into test values(1000);
mysql> select * from test;
登陆另一台sql节点查看
mysql -ucluster -p123456 -h 192.168.43.115
mysql> use db;
mysql> select * from test;
停掉一个sql节点测试
[root@TSL1 ~]# mysqladmin -uroot -p123456 shutdown
ndb_mgm> show 查看状态
11、关闭服务
关闭mysql集群顺序: 关闭管理节点服务-》 关闭管理节点时,数据结点服务自动关闭 –》 需要手动关闭SQL结点服务
[root@xuegod63 /] # ndb_mgm
– NDB Cluster – Management Client –
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 2: Node shutdown completed.
ndb_mgm> exit
ps -axu | grep ndbd #查看不到,说明数据节点已经被关
手动关闭SQL节点服务
TSL4和TSL5上,手动关闭SQL节点服务
[root@TSL4 ~]# mysqladmin -uroot -p123456 shutdown
[root@TSL5 ~]# mysqladmin -uroot -p123456 shutdown
或者:方法二 kill掉
[root@TSL4 ~]# ps -axu | grep mysql
[root@TSL4 ~]# kill -9 7617
[root@TSL4 ~]# kill -9 7743
[root@TSL4~]# ps -axu | grep mysql #TSL5同样kill掉
12、总结
再次启动,mysql集群启动:
[root@TSL1 /]# ndb_mgmd --ndb_nodeid=1 --initial -f /usr/mysql-cluster/config.ini
[root@TSL2 /]#ndbd
[root@TSL3 /]#ndbd
[root@TSL4/]# systemctl restart mysqld
[root@TSL5 /]# systemctl restart mysqld
查看mysql 集群状态:
[root@TSL6~]# ndb_mgm
– NDB Cluster – Management Client –
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.43.112 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *)
id=3 @192.168.43.113 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.43.111 (mysql-5.7.20 ndb-7.5.8)
[mysqld(API)] 2 node(s)
id=4 @192.168.43.114 (mysql-5.7.20 ndb-7.5.8)
id=5 @192.168.43.115(mysql-5.7.20 ndb-7.5.8)
!!!特别声明:相关概念来源于网络