MySQL InnoDB Cluser | Mysql 5.7 集群

  • 目前 本集群 应用在自己的 django demo 环境上,暂时稳定运行。
  • 欢迎加群 620176501 讨论 Mysql 集群的应用。

核心架构

* MySQL 5.7 引入了 Group Replication 功能,可以在一组 MySQL 服务器之间实现自动主机选举,形成一主多从结构。经过高级配置后,可以实现多主多从结构。
* MySQL Router 是一个轻量级透明中间件,可以自动获取上述集群的状态,规划 SQL 语句,分配到合理的 MySQL 后端进行执行。
* MySQL Shell 是一个同时支持 JavaScript 和 SQL 的交互程序,可以快速配置 InnoDB Cluster。


部署

  • 本次共3台机器,设置主机名及hosts | 配置每台服务 my.cnf 中report_host 字段,为自己的 hostname

    192.168.10.123 db1
    192.168.10.124 db2
    192.168.10.125 db3
  • 安装 mysql5.7.20 ,可以参考下面的安装基本,我搭建的时候就是用的这个。
    http://blog.51cto.com/hequan/1982428
  • 安装mysql-shell mysql-route
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

yum install mysql57-community-release-el7-11.noarch.rpm
yum install  mysql-shell  -y
yum install  mysql-router  -y
  • 设置相关用户的权限,生产环境 可以不是 root用户
grant all   privileges  on *.*  to ‘root‘@‘%‘  identified by ‘123456‘;
GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO [email protected]‘%‘ WITH GRANT OPTION;
GRANT RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, CREATE USER ON *.* TO [email protected]‘%‘ WITH GRANT OPTION;
GRANT SELECT ON *.* TO [email protected]‘%‘ WITH GRANT OPTION;
flush privileges;

mysqlsh

[[email protected] ~]#  mysqlsh

## 检查mysql 配置文件   (3台主机都要操作此步骤)
dba.checkInstanceConfiguration(‘[email protected]:3306‘) 

+----------------------------------+---------------+----------------+--------------------------------------------------+
| Variable                         | Current Value | Required Value | Note                                             |
+----------------------------------+---------------+----------------+--------------------------------------------------+
| binlog_checksum                  | CRC32         | NONE           | Update the server variable or restart the server |
| binlog_format                    | MIXED         | ROW            | Update the server variable or restart the server |
| enforce_gtid_consistency         | OFF           | ON             | Restart the server                               |
| gtid_mode                        | OFF           | ON             | Restart the server                               |
| log_slave_updates                | 0             | ON             | Restart the server                               |
| master_info_repository           | FILE          | TABLE          | Restart the server                               |
| relay_log_info_repository        | FILE          | TABLE          | Restart the server                               |
| transaction_write_set_extraction | OFF           | XXHASH64       | Restart the server                               |
+----------------------------------+---------------+----------------+--------------------------------------------------+

## 修复mysql 配置文件,    必须用 root(3台主机都要操作此步骤)
dba.configureLocalInstance(‘[email protected]:3306‘)  

Please provide the password for ‘[email protected]:3306‘:
Detecting the configuration file...
Found configuration file at standard location: /etc/my.cnf
Do you want to modify this file? [Y|n]:  [Y|n]: Y

## 重启mysql

## 重新检查  (3台主机都要操作此步骤)
dba.checkInstanceConfiguration(‘[email protected]:3306‘)
Please provide the password for ‘[email protected]:3306‘:
Validating instance...

The instance ‘db1:3306‘ is valid for Cluster usage
{
    "status": "ok"
}
## 登陆
mysqlsh --uri [email protected]:3306   

## 创建集群     main
mysql-js> var cluster = dba.createCluster(‘main‘)
A new InnoDB cluster will be created on instance ‘[email protected]:3306‘.

Creating InnoDB cluster ‘main‘ on ‘[email protected]:3306‘...
Adding Seed Instance...

Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.

## 添加子节点
mysql-js> cluster.addInstance(‘[email protected]:3306‘)
mysql-js> cluster.addInstance(‘[email protected]:3306‘)

## 查看节点信息
mysql-js> cluster.status()

## 将配置 持久化,写入到  my.cnf
mysql-js>  \connect db1
mysql-js> dba.configureLocalInstance(‘db1:3306‘)

## 查看基本信息
mysql-js>  cluster.describe();

## 退出之后,再查看节点信息
var cluster = dba.getCluster();
cluster.status();

Mysql-route 设置

## 此命令会更新 /etc/mysqlrouter/mysqlrouter.conf 中的配置信息, 可以是别的机器 这里选择的为db2

[[email protected] ~]# mysqlrouter --bootstrap [email protected]:3306 --user mysqlrouter

Please enter MySQL password for root:
WARNING: The MySQL server does not have SSL configured and metadata used by the router may be transmitted unencrypted.

Bootstrapping system MySQL Router instance...
MySQL Router  has now been configured for the InnoDB cluster ‘main‘.

The following connection information can be used to connect to the cluster.

Classic MySQL protocol connections to cluster ‘main‘:
- Read/Write Connections: localhost:6446    读写
- Read/Only Connections: localhost:6447     只读

X protocol connections to cluster ‘main‘:
- Read/Write Connections: localhost:64460
- Read/Only Connections: localhost:64470

Existing configurations backed up to /etc/mysqlrouter/mysqlrouter.conf.bak
[[email protected] ~]# systemctl start mysqlrouter

## 启动
systemctl start mysqlrouter
systemctl enable mysqlrouter

## 查看端口
[[email protected] ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:64460           0.0.0.0:*               LISTEN      2958/mysqlrouter
tcp        0      0 0.0.0.0:6446            0.0.0.0:*               LISTEN      2958/mysqlrouter
tcp        0      0 0.0.0.0:6447            0.0.0.0:*               LISTEN      2958/mysqlrouter
tcp        0      0 0.0.0.0:64470           0.0.0.0:*               LISTEN      2958/mysqlrouter

## 验证
mysql -u root -h 127.0.0.1 -P 6446 -p

select @@port;
select @@hostname;

故障模拟

##关闭 db1 数据库,自动切换如下:

"topology": {
            "db1:3306": {
                "address": "db1:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "(MISSING)"
            },
            "db2:3306": {
                "address": "db2:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            },
            "db3:3306": {
                "address": "db3:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            }
##重启db2 ,执行命令

mysql> show databases;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    20
Current database: *** NONE ***
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| db1        |
+------------+

##重启节点后,需要手动加入
"db2:3306": {
                "address": "db2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "(MISSING)"

cluster.rejoinInstance(‘[email protected]:3306‘)
The instance ‘db2:3306‘ was successfully added to the MySQL Cluster.
## 所有节点都重启了,重新加入

mysqlsh --uri [email protected]:3306
mysql-js> var cluster = dba.rebootClusterFromCompleteOutage();

Reconfiguring the default cluster from complete outage...

The instance ‘db2:3306‘ was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y

The instance ‘db3:3306‘ was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y

The cluster was successfully rebooted.

报错总结:

##如果节点在加入集群前,执行了写操作,加入集群时会报错
ERROR: Error joining instance to cluster: ‘db2:3306‘ - Query failed. MySQL Error (3092): The server is not configured properly to be an active member of the group. Please see more details on error log.. Query: START group_replication (RuntimeError)

##登陆 db2 数据库 执行 reset master;
## 如果出现了   "status": "NO_QUORUM"     执行修复,重新加入
## 暂未测试

cluster.forceQuorumUsingPartitionOf("db1:3306")

mysql-js> cluster.rejoinInstance(‘[email protected]:3306‘)
mysql-js> cluster.rejoinInstance(‘[email protected]:3306‘)

附言:

官方文档: https://dev.mysql.com/doc/refman/5.7/en/mysql-innodb-cluster-userguide.html

节点有哪状态

    * ONLINE  - 节点状态正常。
    * OFFLINE  -   实例在运行,但没有加入任何Cluster。
    * RECOVERING - 实例已加入Cluster,正在同步数据。
    * ERROR  -  同步数据发生异常。
    * UNREACHABLE -  与其他节点通讯中断,可能是网络问题,可能是节点crash。
    * MISSING 节点已加入集群,但未启动group replication

集群有哪些状态

    * OK – 所有节点处于online状态,有冗余节点。
    * OK_PARTIAL – 有节点不可用,但仍有冗余节点。
    * OK_NO_TOLERANCE – 有足够的online节点,但没有冗余,例如:两个节点的Cluster,其中一个挂了,集群就不可用了。
    * NO_QUORUM – 有节点处于online状态,但达不到法定节点数,此状态下Cluster无法写入,只能读取。
    * UNKNOWN – 不是online或recovering状态,尝试连接其他实例查看状态。
    * UNAVAILABLE – 组内节点全是offline状态,但实例在运行,可能实例刚重启还没加入Cluster。

原文地址:http://blog.51cto.com/hequan/2059436

时间: 2024-10-13 22:49:20

MySQL InnoDB Cluser | Mysql 5.7 集群的相关文章

MyCAT+MySQL 搭建高可用企业级数据库集群

第1章 课程介绍课程介绍1-1 MyCAT导学 试看1-2 课程介绍 第2章 MyCAT入门这一章中,我们将回顾了垂直切分,水平切分,分库分表等基础概念,然后快速回如何安装和启动MyCAT的,介绍如何以打包好的可执行程序的方式来启动MyCAT.以及如何对其相关的启动配置文件进行配置.2-1 章节综述2-2 什么是MyCAT2-3 什么是数据库中间层2-4 MyCAT的主要作用2-5 MyCAT基本元素2-6 MyCAT安装 第3章 MYCAT核心配置详解本章将对MyCAT的常用核心配置文件ser

mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

主要思路 测试环境 实现mysql主备复制 配置A主mysql 配置B备mysql 验证同步配置结果 验证是否同步 关闭B备mysql的同步,验证读写分离 实现读写分离 安装mycat 配置mycat 启动mycat 测试读写分离 验证是否同步 关闭B备mysql的同步,验证读写分离 数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,

mysql+myca搭建稳定高可用集群,负载均衡,主备复制,读写分离

数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,推荐mycat,社区活跃,性能稳定. 测试环境 MYSQL版本:Server version: 5.5.53,到官网可以下载WINDWOS安装包. 注意:确保mysql版本为5.5以后,以前版本主备同步配置方式不同. linux实现思路类似,修改my.cnf即可. A主mysql.19

MySQL主从同步读写分离的集群配置

大型网站为了解决大量的高并发访问问题,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器支持,如此多的数据库连接操作,服务器性能再好数据库必然会崩溃.数据丢失的话,后果更是不堪设想.这时候,我们会考虑如何减少数据库的连接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached等.如果资金充足的话,必然会想到假设服务器集群,来分担主数据库的压力.或者在硬件设备上,投入大量资金,购买高性能的服务器.出名

MyCAT+MySQL 搭建高可用企业级数据库集群——第1章 课程介绍

1-1 Mycat导学 1-2 课程介绍 1-1 Mycat导学 1.Mycat导学内容介绍: PS:来吧,让我们一起努力,变成更好的自己吧! 1-2 课程介绍 1.课程介绍: 目标:通过Mycat实现MySQL的高可用集群架构: 原文地址:https://www.cnblogs.com/tqtl911/p/9099913.html

MHA-结合MySQL半同步复制高可用集群(Centos7)

目录 一.理论概述 本案例部署思路 二.环境 三.部署 部署MHA 部署二进制包MySQL及部署主从复制 部署半同步复制 配置MHA MHA测试 部署lvs+keepalived(lvs1,lvs2) 四.总结 一.理论概述 在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. 优点 缺点 由perl语言开发的开源工具 需要编写脚本或利用第三方工具来实现Vip的配置 支持

mysql的AB及读写和集群

Mysql的AB及读写  第1章 Mysql的AB配置 1.1 master配置 1.2 slave配置 1.2.1 192.168.13.190 1.2.2 192.168.13.191 1.2.3 192.168.13.192 1.2.4 192.168.13.193 1.2.4 192.168.13.189 第2章 读写分离 2.1 安装mycat 2.1.1 server.xml 2.1.1 schema.xml 2.2 启动mycat 2.2.1 启动mycat 2.2.2 mycat

mysql系列之--------mmm高可用集群

mmm高可用集群介绍: 高可用集群介绍:主备模式,当主不能提供服务的时候备用主机接替它提供服务. 这个过程对于客户端是透明的. 一.前期准备工作 1.准备五台linux服务器:主(192.168.4.122),主备(192.168.4.123) 从(192.168.4.126),从(192.168.4.127),管理主机(192.168.4.128) 四台主机做主从的用户名:tongbu,密码:123456 2.主和主备做成相互的主从模式,两台从服务器做成主备的从 3.IP规划,write-vi

Heartbeat+Drbd+Mysql高可用(HA)集群架构的部署

主机环境 redhat6.5 64位 实验环境 服务端1 ip 172.25.25.111   主机名:server1.example.com          服务端2 ip172.25.25.112    主机名:server2.example.com 安装包   heartbeat-3.0.4-2.el6.x86_64.rpm             heartbeat-devel-3.0.4-2.el6.x86_64.rpm   ldirectord-3.9.5-3.1.x86_64.r