MySQL高可用集群解决方案之:MySql Cluster搭建

news2024/11/28 11:59:23

MySQL是当前使用最广泛的关系型数据库管理系统之一,但MySQL在高并发访问和大量数据处理方面存在较为明显的性能瓶颈。为了解决MySQL单点故障带来的不便和可扩展性问题,我们需要构建稳定性极高的MySQL集群方案。本文将介绍一种快速搭建MySQL集群的解决方案,并提供相应的代码实现。

我们采用了MySQL官方提供的集群方案——MySQL Cluster来构建稳定性极高的MySQL集群。MySQL Cluster是一种高可用、高可扩展、高性能的MySQL集群方案,它的数据节点(NDB)具有自动分片、自动负载均衡、自动容错等特点。

一:实验环境

在这里插入图片描述

二:实验步骤

1:安装包下载

请从http://dev.mysql.com/downloads/cluster/ 选择GENERIC LINUX

我下载的是:mysql-cluster-gpl-7.2.15-linux2.6-x86_64.tar.gz

2:解压

在所有节点上进行解压:

tar -xvf mysql-cluster-gpl-7.2.15-linux2.6-x86_64.tar.gz 
mv mysql-cluster-gpl-7.2.15-linux2.6-x86_64 /usr/local/mysql

3:管理节点的配置和启动

mkdir -p /data/mysql/mysql-cluster
cd /data/mysql/mysql-cluster

建立全局配置文件vi mgmd.cnf,内容为:

[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M

[ndb_mgmd]
hostname=192.168.6.66
datadir=/data/mysql/mysql-cluster

[ndbd]
hostname=192.168.6.68
datadir=/usr/local/mysql/data

[ndbd]
hostname=192.168.6.69
datadir=/usr/local/mysql/data

[mysqld]
hostname=192.168.6.66

[mysqld]
hostname=192.168.6.67


NoOfReplicas表示数据节点的冗余数量。

如果是2 表有两份数据,如果是1表示只有一份数据. 当NoOfReplicas=2时, 你可以试验一下如果一个data node 停掉了,cluster 可以照常工作; 如果NoOfReplicas=1, 一个data node 停掉了,cluster 就会自动停掉.

启动MGM node:

/usr/local/mysql/bin/ndb_mgmd -f mgmd.cnf 

ps -ef|grep mgmd|grep -v grep查看MGM node 进程是否已经起来。

[root@ser6-66 mysql-cluster]# ps -ef|grep mgmd|grep -v grep
root      1225     1  0 13:31 ?        00:00:00 /usr/local/mysql/bin/ndb_mgmd -f mgmd.cnf 

登录MGM控制台(ndb_mgm 192.168.6.66),用show命令查看各个节点的状态。

[root@ser6-66 mysql-cluster]# /usr/local/mysql/bin/ndb_mgm 192.168.6.66
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.6.66:1186
Cluster Configuration
---------------------
[ndbd(NDB)]2 node(s)
id=2 (not connected, accepting connect from 192.168.6.68)
id=3 (not connected, accepting connect from 192.168.6.69)
 
[ndb_mgmd(MGM)]1 node(s)
id=1@192.168.6.66  (mysql-5.5.35 ndb-7.2.15)
 
[mysqld(API)]3 node(s)
id=4 (not connected, accepting connect from 192.168.6.66)
id=5 (not connected, accepting connect from 192.168.6.67)

#默认管理节点使用的是1186端口。

4:数据节点配置与启动

我是先把/etc/my.cnf文件先删除,然后再创建的。

编辑/etc/my.cnf

内容如下:

[mysqld]
ndbcluster                        #运行NDB存储引擎
ndb-connectstring=192.168.6.66    #定位管理节点
[mysql_cluster]
ndb-connectstring=192.168.6.66    #定位管理节点

[root@ser6-68 ndbdata]# /usr/local/mysql/bin/ndbd --initial --ndb-connectstring=192.168.6.66

2015-08-17 14:21:05 [ndbd] INFO – Angel connected to ‘192.168.6.66:1186’

2015-08-17 14:21:05 [ndbd] INFO – Angel allocated nodeid: 2

(注意:–initial只需在第一次启动时加该参数)

查看ndb进程启动了

[root@ser6-68 ~]# ps -ef|grep ndb
root     26571     1  0 14:38 ?        00:00:01 /usr/local/mysql/bin/ndbd --ndb-connectstring=192.168.6.66
root     26572 26571  8 14:38 ?        00:10:50 /usr/local/mysql/bin/ndbd --ndb-connectstring=192.168.6.66
root     26921 26901  0 14:38 pts/1    00:00:00 grep ndb 

同理配置Data node 2(ndbd2.cnf)…….

在MGM node的控制台中show命令可以看到Data node不再是not connected状态了

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]2 node(s)
id=2@192.168.6.68  (mysql-5.5.35 ndb-7.2.15, starting, Nodegroup: 0)
id=3@192.168.6.69  (mysql-5.5.35 ndb-7.2.15, starting, Nodegroup: 0)
 
[ndb_mgmd(MGM)]1 node(s)
id=1@192.168.6.66  (mysql-5.5.35 ndb-7.2.15)
 
[mysqld(API)]3 node(s)
id=4 (not connected, accepting connect from 192.168.6.66)
id=5 (not connected, accepting connect from 192.168.6.67)

5:sql节点配置与启动

我是先把/etc/my.cnf文件先删除,然后再创建的。

以配置SQL node 1为例。

建基本库:

cd /usr/local/mysql
[root@ser6-66 mysql]# ./scripts/mysql_install_db --user=mysql
WARNING: The host 'ser6-66' could not be looked up with resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !
Installing MySQL system tables...
OK
Filling help tables...
OK
 
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
 
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
 
./bin/mysqladmin -u root password 'new-password'
./bin/mysqladmin -u root -h ser6-66 password 'new-password'
 
Alternatively you can run:
./bin/mysql_secure_installation
 
which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.
 
See the manual for more instructions.
 
You can start the MySQL daemon with:
cd . ; ./bin/mysqld_safe &
 
You can test the MySQL daemon with mysql-test-run.pl
cd ./mysql-test ; perl mysql-test-run.pl
 
Please report any problems with the ./bin/mysqlbug script!

编辑 /etc/my.cnf 文件,添加内容如下。

[client]
socket=/usr/local/mysql/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
ndbcluster
ndb-connectstring=192.168.6.66  #管理节点ip
[mysql_cluster]
ndb-connectstring=192.168.6.66  #管理节点ip

启动MySQL Server:
cd /usr/local/mysql/bin

[root@ser6-66 bin]# ./mysqld_safe -user=mysql &

[1] 7338

[root@ser6-66 bin]# 150824 13:06:05 mysqld_safe Logging to ‘/usr/local/mysql/data/ser6-66.err’.

150824 13:06:05 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

或者可以这样启动:

cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql

service mysql start

ndb_mgm> show

Cluster Configuration
---------------------
[ndbd(NDB)]2 node(s)
id=2@192.168.6.68  (mysql-5.5.35 ndb-7.2.15, Nodegroup: 0, *)
id=3@192.168.6.69  (mysql-5.5.35 ndb-7.2.15, Nodegroup: 1)
 
[ndb_mgmd(MGM)]1 node(s)
id=1@192.168.6.66  (mysql-5.5.35 ndb-7.2.15)
 
[mysqld(API)]2 node(s)
id=4@192.168.6.66  (mysql-5.5.35 ndb-7.2.15)
id=5@192.168.6.67  (mysql-5.5.35 ndb-7.2.15)

显示都连上了。

同理配置和启动SQL node 2。

6:配PATH

在各节点配置PATH

vi /root/.bash_profile

在PATH这一行后面,添加/usr/local/mysql/bin,如:

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
source /root/.bash_profile

7:修改root密码

在sql节点上修改:

/usr/local/mysql/bin/mysqladmin -u root password '123456' 

假如报错:

Enter password: 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/usr/local/mysql/mysql.sock' (2) 

[root@ser6-67 ~]# find / -name mysql.sock

/tmp/mysql.sock

[root@ser6-67 ~]# ln -s /tmp/mysql.sock /usr/local/mysql/mysql.sock

8:测试

登录sql节点192.168.6.67:

8.1 测试sql节点是否同步

[root@ser6-67 bin]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.35-ndb-7.2.15-cluster-gpl MySQL Cluster Community Server (GPL)
 
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ndbinfo            |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
 
--看到mysql cluster比mysql多了一个ndbinfo数据库。
 
--测试sql节点是否同步
在6.67上建个dba库,在dba下建个表t,t2。
mysql> create database dba;
Query OK, 1 row affected (0.07 sec)
 
mysql> use dba;
Database changed
mysql> create table t(id int);
Query OK, 0 rows affected (0.02 sec)
mysql> create table t2(id int) engine=ndb;
Query OK, 0 rows affected (0.11 sec)
 
mysql> show tables;
+---------------+
| Tables_in_dba |
+---------------+
| t             |
| t2            |
+---------------+
2 rows in set (0.00 sec)
 
 
在6.66上登录mysql,看到存储引擎为ndb的t2同步过来了,t1没同步过来:
mysql> use dba;
Database changed
mysql> show tables;
Empty set (0.03 sec)
 
 
mysql> show tables;
+---------------+
| Tables_in_dba |
+---------------+
| t2            |
+---------------+
1 row in set (0.00 sec)

– 总结:只有表存储引擎为 ndb 时,才能同步。

8.2 分片测试

mysql> insert into t2 values(1);
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into t2 values(2);
Query OK, 1 row affected (0.00 sec)
 
mysql> select partition_name,table_rows from information_schema.PARTITIONS where     table_name='t2' and table_schema='dba';
    
+----------------+------------+
| partition_name | table_rows |
+----------------+------------+
| p0             |          1 |
| p1             |          1 |
 
+----------------+------------+
2 rows in set (0.00 sec)

看到数据被自动分到了两个数据节点。

8.3 模拟NDB节点宕机

当ndb节点宕掉一个,其上面的数据还可以通过sql节点查询吗

影响后续的插入删除吗?

在192.168.6.68上杀掉数据节点:
mgm控制台会自动显示:

ndb_mgm> Node 2: Node shutdown completed. Initiated by signal 15.
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=2 (not connected, accepting connect from 192.168.6.68)
id=3	@192.168.6.69  (mysql-5.5.35 ndb-7.2.15, Nodegroup: 0, *)
 
[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.6.66  (mysql-5.5.35 ndb-7.2.15)
 
[mysqld(API)]	2 node(s)
id=4	@192.168.6.66  (mysql-5.5.35 ndb-7.2.15)
id=5	@192.168.6.67  (mysql-5.5.35 ndb-7.2.15)

看到其他节点没有宕掉。

登录sql节点192.168.6.66或67,发现数据都也还在:

mysql> select * from t2;
+------+
| id   |
+------+
|    2 |
|    1 |
+------+
2 rows in set (0.00 sec)

再插入测试数据,仍然可以正常插入。

mysql>  insert into t2 values(1);
Query OK, 1 row affected (0.00 sec)
 
mysql>  insert into t2 values(4);
Query OK, 1 row affected (0.00 sec)
 
mysql>  select partition_name,table_rows from information_schema.PARTITIONS where     table_name='t2' and table_schema='dba';
+----------------+------------+
| partition_name | table_rows |
+----------------+------------+
| p0             |          2 |
| p1             |          2 |
+----------------+------------+
2 rows in set (0.00 sec)

我们看到杀掉其中一个NDB节点,mysql依然高可用。

实验完毕,现在,我们再启动该数据节点。

/usr/local/mysql/bin/ndbd   --ndb-connectstring=192.168.6.66
--注意,这次启动,就不要再指定initial参数了。

8.4 模拟sql节点宕机

测试关闭其中一个sql节点,看集群能否正常使用

[root@ser6-66 mysql-cluster]# service mysql stop
Shutting down MySQL....                                    [  OK  ]
 
192.168.6.67上看还能否正常插入:
mysql> use dba;
Database changed
 
mysql> insert into t2(id) values(3);
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into t2(id) values(5);
Query OK, 1 row affected (0.00 sec)
 
说明只存在一个sql节点,不影响使用,验证了集群的高可用。
启动6.66的sql节点:
[root@ser6-66 mysql-cluster]# service mysql start
Starting MySQL..                                           [  OK  ]
 
mysql> select * from t2;
No connection. Trying to reconnect...
Connection id:    2
Current database: dba
 
+------+
| id   |
+------+
|    3 |
|    5 |
|    1 |
|    2 |
|    1 |
|    4 |
+------+
6 rows in set (0.00 sec)

看到数据同步过来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法

系列文章目录 前言 本文主要介绍BIRCH算法、DBSCAN算法、OPTICS算法,以及相关案例举例,以下案例仅供参考 一、BIRCH算法 1.1、BIRCH算法简介 BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies,平衡迭代规约…

Kubernetes(K8s)各组件白话解释

深入springboot怎么启动tomcat NameSpacePodDeployment1. 创建多个副本2. 扩容/缩容3. 滚动更新4. 版本回退 ServiceClusterIpNodePort Ingress 个人笔记,仅供参考。 来源于尚硅谷视频 转载请评论。 NameSpace 名称空间,在K8s中用于隔离资源。对不同资源…

第十一届“泰迪杯”数据挖掘挑战赛成绩公示

第十一届“泰迪杯” 数据挖掘挑战赛成绩公示 第十一届“泰迪杯”数据挖掘挑战赛历时两个月顺利结束。竞赛采用盲审(屏蔽参赛者信息;评审专家只能评阅非本区域作品;三位评阅专家同时评阅同一作品,超限调整后再取平均分&#xff0…

【小米的技术分享】数据库索引原理与底层数据结构解析

大家好,我是小米。今天我们来探讨一下数据库索引原理以及底层索引数据结构,同时还会介绍叶子节点存储的内容以及索引失效的情况。废话不多说,让我们开始吧! IO操作与索引 首先,我们先来了解一下IO操作对于数据库索引的…

【区块链 | L2】作为Layer2赛道的领跑者,如何理解 Arbitrum?

上周我们介绍了以太坊L2扩展解决方案Optimism,本周我们继续介绍另一个L2解决方案——Arbitrum。Arbitrum 是以太坊的一个 Optimistic Rollup L2 可扩展性解决方案。 Part.1 什么是Arbitrum? Arbitrum 是一个构建在以太坊之上的区块链网络。你可以使用 Arbitrum 链来做任何在…

长短连接对压测的影响有多大?!

【引言】 当我们进行压力测试时,长短连接是一个非常重要的参数。但是,你知道吗?长短连接对于压测结果有着非常大的影响!如果你不理解这个参数,那么你的压测结果可能会出现严重的偏差。 在这篇文章中,我将…

快速在linux上配置python3.9的环境以及可能报错的解决方案(python其它版本可同样方式安装)

一. linux安装python3.9 步骤1:安装系统依赖(重要) 这一步不执行,后面各种错误。 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-d…

C#:不同登录用户阅读状态的修改:不同的登录用户,登录用户修改阅读状态后,状态变为已读,未修改阅读状态的用户,依然显示未读的程序实例

一、创建数据库 首先,可以使用SQL Server Management Studio创建一个新的数据库(MyDatabase) 以及三个表(Users, Messages, UserMessageStatus),分别用于存储用户信息,消息信息以及用户消息状态。 Users表 该表包含了所有注册用户的信息。…

Es elasticsearch 十七 Java api 实现聚合 几个聚合示例 sql 开启许可 新特效 java 实现es7 sql 功能

目录 Java api 实现聚合 依赖 简单聚合按照颜色分组获取每个卖出数量 聚合每个颜色卖出数量,及平均价格(每个分桶子聚合) 按照颜色分组 ,获取销售数量,avg min max sum 按照600区间价格范围分组,算出…

你学习web安全的路线可以介绍是吗

学习网络安全一定要选好一个方向去下功夫,如果不清楚自己究竟适合什么方向,可以都稍微尝试一下再来做选择,实战能力才是重点,所以你最应该找平台,多多实战,完成实际项目! 书籍推荐:…

『赠书活动 | 第九期』清华社赞助 | 《Java系列丛书》

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 『赠书活动 | 第九期』 本期书籍:《Java系列丛书》 公众号赠书:第一期 参与方式:关注公众号:低调而奢华 …

react-router V6 传递参数的三种方式

react-router V6 传递参数的三种方式 路由跳转使用navigate()路由传参1,searchParams传参2,params 传参3,state传参总结 路由跳转使用navigate() 编程式导航 导入一个 useNavigate钩子函数执行 useNavigate 函数得到 跳转函数在事件中执行跳…

服务器PING值不稳定是什么情况?

​  服务器ping值不稳定是指服务器在不同时间段内,对同一IP地址进行ping测试时,返回的延迟时间不同,存在波动的情况。这种情况会对服务器的性能和稳定性产生影响,影响用户的使用体验。下面我们来分析一下服务器ping值不稳定的原…

模拟IC方向面试常考问题及答案汇总,IC人必看

有不少小伙伴说想了解模拟IC方向的面试题目,这不就来了!(文末可领全部面试题目) 1. 基尔霍夫定理的内容是什么? 电流定律:在集总电路中,任何时刻,对任一节点,所有流出节…

怎样让你的客户服务更高效

随着商业环境的变化,越来越多的企业开始意识到客户服务对于企业的重要性。高效的客户服务能够促进客户满意并增加销售额,从而帮助企业获得更大的成功。但是,怎样才能让您的客户服务更高效呢?以下是一些建议。 建立一个完善的客户…

浅水域三维探地雷达数值模拟研究

Gprmax浅水域三维地质雷达数值模拟研究 前言 浅水域地下不良地质体的探测一直是工程勘察的难点,地质雷达具有仪器轻便、操作简洁、分辨率高的优势,在浅水域勘察中具有很大的应用前景。目前,二维地质雷达已经有不少应用,三维地质…

面试专题:设计模式

面试时常见的就是的就是让你手写一个单例模式(注意单例模式的几种不同的实现方法)或者让你说一下某个常见的设计模式在你的项目中是如何使用的,另外面试官还有可能问你抽象工厂和工厂方法模式的区别、工厂模式的思想这样的问题。 建议把代理模…

C++核心编程——详解运算符重载

文章目录&#x1f4ac; 一.运算符重载基础知识①基本概念②运算符重载的规则③运算符重载形式④运算符重载建议 二.常用运算符重载①左移(<<)和右移(>>)运算符重载1️⃣重载后函数参数是什么&#xff1f;2️⃣重载的函数返回类型是什么&#xff1f;3️⃣重载为哪种…

Web测试有哪些基本要点?软件测试找第三方软件检测机构靠谱吗?

互联网时代的到来&#xff0c;让Web应用成为了人们生活和工作中不可或缺的一部分。随着Web应用的快速发展&#xff0c;Web测试也变得越来越重要。本文将从Web测试的基本要点和第三方软件检测机构的可靠性两方面进行讨论。 一、Web测试的基本要点 1. 安全性测试&#xff1a;评…

JVM(Java Virtual Machine)

JVM &#x1f50e;内存区域划分Program Counter Register(程序计数器)Native Method Stacks(本地方法栈)JVM Stacks(虚拟机栈)区分虚拟机栈与本地方法栈&#x1f36d;栈是线程私有的&#x1f36d; Heap(堆区)Metaspace(元数据区)总结 &#x1f50e;类加载类加载的流程加载验证准…