Innodb Cluster集群部署配置
阅读原文时间:2021年12月15日阅读:4

目录

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