点击上方“icloud布道师”,“星标或置顶公众号”
逆境前行,能帮你的只有自己


来源 / www.budaoshi.top

MySQL集群概述
MySQL Cluster 是一组计算机构成,适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。
来源:百度词条\ https://baike.baidu.com/item/MySQL
MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。

MySQL集群架构

SQL结点:给上层应用程序提供SQL访问
管理结点:管理整个集群;开启/关闭整个集群,通过nmb 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/

实验环境
在我们做的实验中mysql cluster集群各机器角色如下分配:
mysql 管理节点:cluster.129.cn IP:192.168.231.129
mysql 数据节点:cluster.130.cn IP:192.168.231.130
mysql 数据节点:cluster132.cn IP:192.168.231.132
msyql SQL节点:cluster133.cn IP:192.168.231.133
msyql SQL节点:cluster134.cn IP:192.168.231.134
环境清理
这一部分虽然是初始,但是有一点复杂
在所有的主机下面执行以下操作:
首先,清除旧版本的mysql
[root@bogon ~]# yum remove -y mariadb* mysql*
[root@bogon ~]# rpm -qa |grep mysql
然后,清除以下文件
[root@bogon ~]# rm -rf etc/my.cfg[root@bogon ~]# rm -rf var/lib/mysql/*[root@bogon ~]# rm -rf etc/init.d/mysqld
然后,打开/etc/profile文件,查看是否有与mysql相关的环境变量,如果有则删去
安装mysql clunter社区版
还是在所有的主机下面执行以下操作:

下载此包;然后传到每台服务器上
[root@bogon ~]# rz
然后传到每台服务器上
[root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm 192.168.231.130:~/[root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm 192.168.231.132:~/[root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm 192.168.231.133:~/[root@bogon ~]# scp mysql80-community-release-el7-3.noarch.rpm 192.168.231.134:~/
安装epel源
[root@bogon ~]# yum install epel-release -y
rpm包安装
[root@bogon ~]# rpm -ivh mysql80-community-release-el7-3.noarch.rpm
打开yum源,开启此mysql-clunter源
[root@bogon ~]# vim etc/yum.repos.d/mysql-community.repo
[mysql-cluster-7.6-community]name=MySQL Cluster 7.6 Communitybaseurl=http://repo.mysql.com/yum/mysql-cluster-7.6-community/el/7/$basearch/enabled=1gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

或者批量修改
sed -i "63s/0/1/g" etc/yum.repos.d/mysql-community.repo
然后刷新yum源
[root@bogon ~]# yum clean all&&yum list
安装cluster依赖包
[root@bogon ~]# yum install -y perl perl-Class-MethodMaker perl-DBI libaio numactl
安装cluster
[root@bogon ~]# yum install -y mysql-cluster-community-serve
针对数据结点服务器安装包
mysql 数据节点:cluster.130.cn IP:192.168.231.130
mysql 数据节点:cluster132.cn IP:192.168.231.132
[root@bogon ~]# yum install -y mysql-cluster-community-data-node
针对管理端安装management管理包
mysql 管理节点:cluster.129.cn IP:192.168.231.129
root@bogon ~]# yum -y install mysql-cluster-community-management-server
针对管理结点服务器创建文件
mysql 管理节点:cluster.129.cn IP:192.168.231.129
[root@bogon ~]# mkdir -p usr/mysql-cluster/

搭建mysql集群
经过复杂的安装配置,接下来搭建cluster
在管理结点创建配置文件
mysql 管理节点:cluster.129.cn IP:192.168.231.129
[root@bogon mysql-cluster]# vim usr/mysql-cluster/config.ini
[ndbd default]NoOfReplicas=2DataMemory=200MIndexMemory=100M[ndb_mgmd]nodeid=1datadir=/var/lib/mysqlHostName=192.168.231.129[ndbd]HostName=192.168.231.130DataDir=/var/lib/mysqlnodeid=2[ndbd]HostName=192.168.231.132DataDIR=/var/lib/mysqlnodeid=3[mysqld]HostName=192.168.231.133Datdir=/var/lib/mysqlnodeid=4[mysqld]HostName=192.168.231.134DataDir=/var/lib/mysqlnodeid=5

在这个文件里,我们分别给五个节点分配了ID,这有利于更好的管理和区分各个节点。
当然,要是不指定,MySQL也会动态分配一个
在数据结点创建配置文件
mysql 数据节点:cluster.130.cn IP:192.168.231.130
mysql 数据节点:cluster132.cn IP:192.168.231.132
打开配置文件
[root@bogon ~]# mv etc/my.cnf etc/my.bak[root@bogon ~]# vim /etc/my.cnf
两台配置文件完全一样
[mysql]datadir=/var/lib/mysqlndbclusterndb-connectstring=192.168.231.129[mysql_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[mysql_cluster]ndb-connectstring=192.168.231.129

在SQL结点创建配置文件
msyql SQL节点:cluster133.cn IP:192.168.231.133
msyql SQL节点:cluster134.cn IP:192.168.231.134
[root@bogon ~]# mv etc/my.cnf etc/my.bak[root@bogon ~]# vim /etc/my.cnf
[mysqld]ndbclusterndb-connectstring=192.168.231.129[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[mysql_cluster]ndb-connectstring=192.168.231.129


启动mysql cluster
初次启动命令以及用户密码更改调整:(请严格按照次序启动)
先启动:管理结点服务->数据结点服务->sql结点服务
执行初次启动前请先确认 将两台机器的防火墙关闭(service iptables stop 或者 设定 防火墙端口可通,两个端口即通讯端口1186、数据端口3306 )
在这次实验,我们默认关闭防火墙
[root@bogon mysql-cluster]# systemctl stop firewalld
启动管理结点服务器
mysql 管理节点:cluster.129.cn IP:192.168.231.129
[root@bogon mysql]# ndb_mgmd --ndb_nodeid=1 --initial -f usr/mysql-cluster/config.iniMySQL Cluster Management Server mysql-5.7.26 ndb-7.6.10
启动会报这个错误,我把第四行注释掉了就好了

[MgmtSrvr] WARNING -- at line 4: [DB] IndexMemory is deprecated, use Number bytes on each ndbd(DB) node allocated for storing indexes instead
注释掉/usr/mysql-cluster/config.ini中文件中的第四行,
#indexmemory
如果再启动报这个错误,说明有日志文件产生进程数据,清空/var/lib/mysql/的文件

[root@bogon mysql-cluster]# killall nbd_mgmdnbd_mgmd: no process found不是这个原因
[root@bogon mysql]# rm -rf /var/lib/mysql/*
差点写成rm -rf var/lib 所以这个命令还是慎用!
接下来启动客户端
[root@bogon mysql]# ndb_mgm

看到登陆成功
查看状态
ndb_mgm> show
Cluster Configuration---------------------[ndbd(NDB)] 2 node(s)id=2 (not connected, accepting connect from 192.168.231.130)id=3 (not connected, accepting connect from 192.168.231.132)[ndb_mgmd(MGM)] 1 node(s)id=1 @192.168.231.129 (mysql-5.7.26 ndb-7.6.10)[mysqld(API)] 2 node(s)id=4 (not connected, accepting connect from 192.168.231.133)id=5 (not connected, accepting connect from 192.168.231.134)

接下来启动数据节点
mysql 数据节点:cluster.130.cn IP:192.168.231.130
mysql 数据节点:cluster132.cn IP:192.168.231.132
[root@bogon ~]# ndbd --initial
2019-05-10 13:50:09 [ndbd] INFO -- Angel connected to '192.168.231.129:1186'2019-05-10 13:50:09 [ndbd] INFO -- Angel allocated nodeid: 2
看到连接管理结点服务器成功了
我们再返回管理结点看下状态

可以看到id=2的服务器开启成功
再启动另一台数据结点
[root@bogon ~]# ndbd --initial2019-03-28 08:56:56 [ndbd] INFO -- Angel connected to '192.168.231.129:1186'2019-03-28 08:56:56 [ndbd] INFO -- Angel allocated nodeid: 3
连接成功!
我们再返回管理结点看下状态

可以看到id=2和3的服务器都开启成功
接下来启动SQL节点
msyql SQL节点:cluster133.cn IP:192.168.231.133
msyql SQL节点:cluster134.cn IP:192.168.231.134
[root@bogon ~]# systemctl start mysqld
初始化比较慢,稍微一等
现在再查看管理结点状态
ndb_mgm> showCluster Configuration---------------------[ndbd(NDB)] 2 node(s)id=2 @192.168.231.130 (mysql-5.7.26 ndb-7.6.10, Nodegroup: 0, *)id=3 @192.168.231.132 (mysql-5.7.26 ndb-7.6.10, Nodegroup: 0)[ndb_mgmd(MGM)] 1 node(s)id=1 @192.168.231.129 (mysql-5.7.26 ndb-7.6.10)[mysqld(API)] 2 node(s)id=4 @192.168.231.133 (mysql-5.7.26 ndb-7.6.10)id=5 @192.168.231.134 (mysql-5.7.26 ndb-7.6.10)

由于4和5两台机器为新建,忘记关闭selinux,导致sql结点连接不上管理结点!!!
找了一天的错误!!!
现在进入sql结点服务器的数据库
此时的数据库有默认的密码,所以要修改密码!
首先找到随机密码
[root@bogon ~]# grep password var/log/messages
[root@bogon ~]# grep password var/log/messagesMay 10 14:02:28 bogon mysqld_pre_systemd: 2019-05-10T06:02:28.680228Z 1 [Note] A temporary password is generated for root@localhost: &e&%I%eUy6ddMay 10 14:07:05 bogon mysqld: 2019-05-10T06:07:05.024270Z 0 [Note] Shutting down plugin 'validate_password'May 10 14:07:07 bogon mysqld: 2019-05-10T06:07:07.073202Z 0 [Note] Shutting down plugin 'sha256_password'May 10 14:07:07 bogon mysqld: 2019-05-10T06:07:07.073204Z 0 [Note] Shutting down plugin 'mysql_native_password'May 10 14:09:05 bogon mysqld: 2019-05-10T06:09:05.680521Z 0 [Note] Shutting down plugin 'validate_password'May 10 14:09:07 bogon mysqld: 2019-05-10T06:09:07.629116Z 0 [Note] Shutting down plugin 'sha256_password'May 10 14:09:07 bogon mysqld: 2019-05-10T06:09:07.629118Z 0 [Note] Shutting down plugin 'mysql_native_p
复制随机密码并登陆数据库
[root@bogon ~]# mysql -u root -p'&e&%I%eUy6dd'

修改密码:
首先要修改密码的复杂度和长度
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;
然后修改密码
mysql> set password for root@localhost =password("123456");
刷新权限表
mysql> flush privileges;
然后创建一个登陆账户
在所有的sql结点创建!
mysql> grant all privileges on *.* to cluster@'%' identified by '123456';
刷新权限表
mysql> flush privileges;
模拟外部服务器登陆:
[root@bogon ~]# mysql -u cluster -p123456 -h 192.168.231.133
查看表
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || ndbinfo || performance_schema || sys |+--------------------+5 rows in set (0.09 sec)
现在是用cluster账号远程登陆sql结点1的数据库:
创建测试数据
mysql> create database ah;Query OK, 1 row affected (0.15 sec)mysql> use ahDatabase changedmysql> create table test1 (id int)engine=ndb;Query OK, 0 rows affected (0.37 sec)mysql> insert into test1 values(10010);Query OK, 1 row affected (0.64 sec)
查看测试数据
mysql> select * from test1;+-------+| id |+-------+| 10010 |+-------+1 row in set (0.04 sec)
现在是在sql2结点查看数据:
mysql> select * from ah.test1;+-------+| id |+-------+| 10010 |+-------+1 row in set (0.02 sec)
集群已经生效!
现在是sql结点2的数据库插入数据:
mysql> insert into test1 values (1333);
现在是在sq1结点查看数据:
mysql> select * from test1;+-------+| id |+-------+| 10010 || 1333 |+-------+2 rows in set (0.01 sec)
集群的任何一台服务器读写都同步!!!

测试单点故障
停掉一个sql节点测试单点故障问题
mysqladmin -uroot -p123456 shutdown
查看管理结点服务器状态

可以看到已经模拟挂掉一台sql结点数据库
现在在好的sql数据库插入数据并查看
mysql> insert into test1 values(10086);Query OK, 1 row affected (0.00 sec)mysql> select * from test1;+-------+| id |+-------+| 1333 || 10086 || 10010 |+-------+3 rows in set (0.00 sec)

测试正常!
规避单点故障

关闭cluster集群
关闭mysql集群顺序:
关闭管理节点服务>关闭管理节点时,数据结点服务自动关闭 >关闭SQL结点服务
mysql 管理节点:cluster.129.cn IP:192.168.231.129
ndb_mgm> shutdownNode 2: Cluster shutdown initiatedNode 3: Cluster shutdown initiatedNode 3: Node shutdown completed.Node 2: Node shutdown completed.3 NDB Cluster node(s) have shutdown.

mysql 数据节点:cluster.130.cn IP:192.168.231.130
mysql 数据节点:cluster132.cn IP:192.168.231.132
这两个结点自动关闭!
msyql SQL节点:cluster133.cn IP:192.168.231.133
msyql SQL节点:cluster134.cn IP:192.168.231.134
[root@bogon ~]# mysqladmin -uroot -p123456 shutdown

以上就是本期全部内容!




