Innodb Cluster集群部署配置
一.简介
MySQL InnoDB Cluster提供了一个集成的,本地的,HA解决方案,由以下几部分组成:
MySQL Servers with Group Replication:向集群的所有成员复制数据,同时提供容错、自动故障转移和弹性。
MySQL Router:确保客户端请求是负载平衡的,并在任何数据库故障时路由到正确的服务器。
MySQL Shell:通过内置的管理API创建及管理Innodb集群。
各个组件的关系如下图所示:

每台服务器实例都运行MySQL Group Replication (冗余复制机制,内置failover)
MGR有两种模式,一种是Single-Primary,一种是Multi-Primary,即单主或者多主。
注意:模式Multi-Primary中,所有的节点都是主节点,都可以同时被读写,看上去这似乎更好,但是因为多主的复杂性,在功能上如果设置了多主模式,则会有一些使用的限制,比如不支持Foreign Keys with Cascading Constraints。
二.环境声明
环境:
ubuntu 16.4
mysql-5.7
多主模式
机器:
192.168.1.1 mysql-1
192.168.1.2 mysql-2
192.168.1.3 mysql-3
三.部署
安装(均操作)
1.下载deb
wget https://repo.mysql.com//mysql-apt-config_0.8.10-1_all.deb
按第一个,然后根据需要选择版本,这里选择mysql-5.7,选择后他会返回到第一页,这时候选择ok即可,会发现第一个的参数变成了5.7了
dpkg -i mysql-apt-config_0.8.10-1_all.deb
更新源
apt-get update
2.安装MySQL及组件,不要加-y,其中会弹出一个mysql设置密码的框,填写即可
apt-get install mysql-server mysql-shell mysql-router
3.添加MySQL用户和权限,默认安装完mysql就是启动的,账号密码根据情况设置,每个节点要一致,可以将root改为其它用户。
mysql -u root -p
grant all privileges on *.* to 'root'@'%' identified by 'password';
GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO root@'%' WITH GRANT OPTION;
GRANT RELOAD,SHUTDOWN,PROCESS,FILE, SUPER,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO root@'%' WITH GRANT OPTION;
GRANT SELECT ON *.* TO root@'%' WITH GRANT OPTION;
4.修改/etc/hosts
vim /etc/hosts
192.168.1.1 mysql-1
192.168.1.2 mysql-2
192.168.1.3 mysql-3
配置(均操作)
1.修改配置文件,主要修改server_id和local_address
vim /etc/mysql/my.cnf
[mysqld]
#mysql自身配置,这里默认即可
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
bind-address = 0.0.0.0
server_id = 1 #2,3 要每台不一样
gtid_mode = ON #开启gitd复制
log_bin = bilog
log_slave_updates = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
transaction_write_set_extraction = XXHASH64
enforce_gtid_consistency = ON
slave_preserve_commit_order = ON #确保GR_applier按照一致的顺序复现事务
binlog_checksum = NONE
loose-group_replication_group_name = a38e32fd-5fb6-11e8-ad7a-00259015d941 #UUID号,集群中要一致
loose-group_replication_local_address= "192.168.1.1:13306" #本地集群端口
loose-group_replication_group_seeds= "192.168.1.1:13306,192.168.1.2:13306,192.168.1.3:13306"
loose-group_replication_start_on_boot = OFF #默认关闭, 防止重启后自动创建新的Group
loose-group_replication_bootstrap_group = OFF #默认关闭, 防止自动创建新的Group
loose-group_replication_allow_local_disjoint_gtids_join = ON
loose-group_replication_single_primary_mode = OFF ##在单主模式中为ON,在多主模式中为OFF
loose-group_replication_enforce_update_everywhere_checks = ON
重启
systemctl restart mysql
2.检查配置,进入mysql-js shell,user是刚才配置的账号,登陆后可以按y保存密码,以后登陆js不需要密码
mysqlsh --uri=user@192.168.1.1:3306
过一会返回一个"status": "ok"则是集群配置正确了
mysql-js> dba.configureLocalInstance('root@localhost:3306');
如果返回error就往上翻,会有提示配置错误的部分

开启group_replication(均操作)
1.为之前创建的集群用户,添加权限
change master to master_user='root',master_password='password' for channel 'group_replication_recovery';
2.安装group_replication
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
启动group_replication
1.第一台机器操作
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
如果上述命令报错3098,在多主模式下登陆数据库做如下操作:
进入数据库,查询集群库的表名
use mysql_innodb_cluster_metadata
show databases;
查询创建表语句,找到CONSTRAINT开头的部分,每个表都要找
show create table 表名\G;
CONSTRAINT `外键名` FOREIGN KEY (`xxxx`) REFERENCES `xxxxxx` (`id`)
删除外键,多主模式集群不支持外键,删除每个有外键的表
alter table 表名 drop foreign key 外键名;
再操作一遍如下即可
set global group_replication_bootstrap_group=on;
start group_replication;
`set global group_replication_bootstrap_group=off;
2.其它节点机器操作
start group_replication;
创建集群(在mysql-1执行)
1.创建,进入js后操作,单主模式集群执行var cluster = dba.createCluster('mysqlCluster')
mysqlsh --uri=user@192.168.1.1:3306
当前多主机模式执行操作,按y确定
mysql-js> var cluster = dba.createCluster('mycluster',{force:1})
如果是单机模式,执行如下
mysql-js> var cluster = dba.createCluster('mysqlCluster')
应当返回如下
Cluster successfully created based on existing replication group.Cluster successfully created based on existing replication group.
2.添加其它节点,如果报错已经添加了,则不用添加
mysql-js> cluster.addInstance('user@192.168.1.2:3306')
mysql-js> cluster.addInstance('user@192.168.1.3:3306')
3.查看集群状态,会返回一个列表
mysql-js>cluster.status();
创建Mysql-router(在mysql-1执行)
1.添加路由,按提示输入密码
mysqlrouter --bootstrap root@192.168.1.1:3306 --user mysqlrouter
2.启动路由
systemctl start mysqlrouter
systemctl enable mysqlrouter
3.查看端口
netstat -unltp | grep 6446
4.登陆路由,
mysql -u root -h 127.0.0.1 -P 6446 -p
select @@port;
select @@hostname;
然后业务就可以使用router服务器的地址和6446端口来连接使用mysql集群,从而实现负载均衡了,不要再直接连三台msyql服务器,连接router会自动处理负载均衡,推荐使用多个router节点做备用,防止单个节点挂掉,官方建议router节点可以部署在应用服务器或者其内网
节点故障重启后,需要手动加入,示例主节点故障,通过router连接的集群依然可以正常工作(当然由于少了一台mysql服务器,集群负载能力会相应下降)
cluster.rejoinInstance('root@192.168.1.2:3306')
四.维护
如何将Multi-Primary改为Single-Primary?
1.解散原来的集群
mysql-js> cluster.dissolve({force: true})
2.每台主机MySQL修改如下配置
mysql> set global group_replication_enforce_update_everywhere_checks=OFF;
mysql> set global group_replication_single_primary_mode=ON;
3.重新创建集群
mysql-js> var cluster = dba.createCluster('mysqlCluster');
mysql-js> cluster.addInstance('user@svr2:3306');
mysql-js> cluster.addInstance('user@svr3:3306');
五.报错处理
MEMBER_STATE为RECOVERING
执行如下命令应该都显示ONLINE,这里显示RECOVERING
SELECT * FROM performance_schema.replication_group_members;

解决办法:
修改/etc/hosts,将主机名和ip对应,然后进到每台mysql中,操作如下sql即可
主服务器
set global group_replication_bootstrap_group=on;
start group_replication;
`set global group_replication_bootstrap_group=off;
其它节点:
start group_replication;
3098
报错信息:
panic: The table does not comply with the requirements by an external plugin. (errno 3098) (sqlstate HY000)
解决办法:
意思是表中有外键,多主模式是不支持外键的,但是用户的mysql即使是第一次安装也会报这个错误;
其实是dba.createCluster()会创建集群库mysql_innodb_cluster_metadata,在该库中会建立五个表,其中四个表有外键!!
不明白官方为什么留这么大的一个坑,总之,把表中的外键全部删除,再次执行就成功了。
3092
报错信息:
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
解决办法:
查看每台机器的配置文件这2行是否正确
loose-group_replication_local_address
loose-group_replication_group_seeds
查看是否启动了local_address所写的端口
netstat -unltp
Innodb Cluster集群部署配置的更多相关文章
- Mysql Innodb cluster集群搭建
之前搭建过一个Mysql Ndb cluster集群,但是mysql版本是5.7的,看到官网上mysql8的还是开发者版本,所以尝试搭建下mysql Innodb cluster集群. MySQL的高 ...
- centos6下redis cluster集群部署过程
一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...
- Centos 7 下 Mysql 5.7 Galera Cluster 集群部署
一.介绍 传统架构的使用,一直被人们所诟病,因为MySQL的主从模式,天生的不能完全保证数据一致,很多大公司会花很大人力物力去解决这个问题,而效果却一般,可以说,只能是通过牺牲性能,来获得数据一致性 ...
- MySQL Cluster 集群部署
前言 此篇博客用以介绍 MySQL Cluster 集群部署方法 一.节点规划 序号 IP地址 节点名称 1 172.16.1.201 mysql-manage 2 172.16.1.202 mysq ...
- redis cluster 集群 安装 配置 详解
redis cluster 集群 安装 配置 详解 张映 发表于 2015-05-01 分类目录: nosql 标签:cluster, redis, 安装, 配置, 集群 Redis 集群是一个提供在 ...
- Redis cluster 集群部署和配置
目录 一.集群简介 cluster介绍 cluster原理 cluster特点 应用场景 二.集群部署 环境介绍 节点部署 启动集群 三.集群测试 一.集群简介 cluster介绍 redis clu ...
- 2、Redis 底层原理:Cluster 集群部署与详解
Redis 简介 Redis 提供数据缓存服务,内部数据都存在内存中,所以访问速度非常快. 早期,Redis 单应用服务亦能满足企业的需求.之后,业务量的上升,单机的读写能力满足不了业务的需求,技术上 ...
- Redis5.0.8 Cluster集群部署
目录 一.Redis Cluster简介 二.部署 三.创建主库 一.Redis Cluster简介 Redis Cluster集群是一种去中心化的高可用服务,其内置的sentinel功能可以提供高可 ...
- RocketMQ集群部署配置
目标,使用2台机器部署RocketMQ多Master多Slave模式,异步复制集群模式. 第一步,修改/etc/hosts文件 192.168.116.115 rocketmq1 192.168.11 ...
随机推荐
- Python基础(普通函数及参数)
# def my_abs(x): # if not isinstance(x,(int,float)):#参数类型做检查,只允许整数和浮点数类型的参数.数据类型检查可以用内置函数isinstance( ...
- dart系列之:dart类的扩展
目录 简介 使用extends 抽象类和接口 mixins 总结 简介 虽然dart中的类只能有一个父类,也就是单继承的,但是dart提供了mixin语法来绕过这样限制. 今天,和大家一起来探讨一下d ...
- xpath的chrome插件安装,xpath基本语法
xpath插件安装: 注意:提前安装xpath插件 (1)打开chrome浏览器 (2)点击右上角小圆点 (3)更多工具 (4)扩展程序 (5)拖拽xpath插件到扩展程序中 (6)如果crx文件失效 ...
- [loj2461]完美的队列
参考论文,这里一共写了论文中的3种做法,第一种做法为强制在线时的做法,第二种为时间复杂度略高的做法(前两种都无法通过),第三种为本题正解,并给出了一种理论复杂度更优的做法 1.做法1 情况1 $\fo ...
- [bzoj4003]城市攻占
倍增,对于每一个点计算他走到$2^i$次祖先所需要的攻击力以及最终会变成什么(一个一次函数),简单处理即可(然而这样是错的,因为他只保证了骑士的攻击力可以存,并没有保证这个一次函数的系数可以存)(其实 ...
- [bzoj1177]Oil
考虑将三个矩形按某种方式划分为再三个大矩形中找最大值,容易发现只有6种划分方式,分为两类:1.4种,考虑第一条横/竖和第二条在第一条的两侧,这一类情况只需要预处理出左上/左下/右上/右下的最大子矩阵即 ...
- Lilypond+TexLive(LuaLatex+lyluatex)+VS Code实现谱文混排
没想到发文章反而更难被预览了,那就复制一份到随笔里好了. 多次尝试之下,终于实现了现阶段谱文混排的最理想方式: 1. 综合Latex的排版(还有广泛适用人群)的优势以及Lilypond的美观优势: 2 ...
- Linux 使用wpa_supplicant手动配置连接wifi
Linux 使用wpa_supplicant手动配置连接wifi wpa_supplicant 简介 wpa_supplicant是Linux BSD, Mac OSX和Windows的WPA的服务, ...
- springboot与数据访问之jdbc
官网的starthttps://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-starter 添加依 ...
- 【机器学习与R语言】11- Kmeans聚类
目录 1.理解Kmeans聚类 1)基本概念 2)kmeans运作的基本原理 2.Kmeans聚类应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解Km ...