一、工作原理和流程
MySQL InnoDB集群提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式
二、MySQL InnoDB集群组成部分
1、MySQL Servers with Group Replication:向集群的所有成员复制数据,同时提供容错、自动故障转移和弹性。MySQL Server 5.7.17或更高的版本。
2、MySQL Router:确保客户端请求是负载平衡的,并在任何数据库故障时路由到正确的服务器。MySQL Router 2.1.3或更高的版本。
3、MySQL Shell:通过内置的管理API创建及管理Innodb集群。MySQL Shell 1.0.9或更高的版本
三、高可用集群部署
1、准备三台虚拟机
2、安装mysql8.0.22
官网下载地址:https://downloads.mysql.com/archives/community/
创建工作目录:
[root@node2 ~]#mkdir work && cd work
安装相应插件:
[root@node2 work]# yum -y install openssl-devel perl net-tools lrzsz wget
安装mMySQL8.0.22:
[root@node2 work]#rpm -ivh mysql-community-common-8.0.22-1.el7.x86_64.rpm
[root@node2 work]#rpm ivh mysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm
[root@node2 work]#rpm -ivh mysql-community-libs-8.0.22-1.el7.x86_64.rpm
[root@node2 work]#rpm -ivh mysql-community-client-8.0.22-1.el7.x86_64.rpm
[root@node2 work]#rpm -ivh mysql-community-devel-8.0.22-1.el7.x86_64.rpm
[root@node2 work]#rpm -ivh mysql-community-server-8.0.22-1.el7.x86_64.rpm
注:在此之前需关闭掉selinux,若之前安装过 MySQL 服务,先卸载
rpm -qa|grep mysql|xargs rpm -e --nodeps
3、配置hosts文件,并设置ssh免密登录
修改hosts文件:
[root@node2 ~]# vi /etc/hosts
配置ssh免密登录:
[root@node2 ~]# ssh-keygen (一路回车)
[root@node2 ~]# cat /root/.ssh/id_rsa.pub
[root@node2 .ssh]# vi authorized_keys
4、修改MySQL配置文件(以下内容为部分配置)
[root@node2 ~]#vi /etc/my.cnf
5、创建相关目录并授权
[root@node2 ~]#mkdir /var/log/mysql #用于存放日志
[root@node2 ~]#chown -R mysql:mysql /var/log/mysql
[root@node2 ~]#mkdir -p /data/mysql #用于存放数据
[root@node2 ~]#chown -R mysql:mysql /data/mysql/
注:以上目录均在配置文件中有定义
6、启动数据库并设置为开机自启
[root@node2 ~]#systemctl start mysqld
[root@node2 ~]#systemctl enable mysqld
[root@node2 ~]#systemctl status mysqld
7、防火墙放行端口
[root@node2 ~]# firewall-cmd --add-port=33061/tcp --per
[root@node2 ~]# firewall-cmd --add-port=3306/tcp –per
8、在日志文件中找到初始密码,进入数据库修改密码,并用户授权
[root@node2 etc]# cat /var/log/mysql/error.log
[root@node2 etc]# mysql -uroot –p
mysql> alter user ‘root’@‘localhost’ identified by ‘123456’;
mysql> create user ‘root’@‘%’ identified with mysql_native_password by ‘123456’;
mysql> grant all privileges on . to ‘root’@‘%’ with grant option;
mysql> flush privileges;
9、安装mysql-shell
[root@node2 ~]# wget https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@node2 ~]#tar -zvxf mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@node2 ~]#mv mysql-shell-8.0.26-linux-glibc2.12-x86-64bit mysql-shell
[root@node2 ~]#mv mysql-shell /usr/local/
(注:以上操作在三台机子上均执行)
10、安装mysql-router(只在master上安装)
[root@node3 ~]#wget https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-8.0.26-linux-glibc2.12-x86_64.tar.xz
[root@node3 ~]#tar xvJf mysql-router-8.0.26-linux-glibc2.12-x86_64.tar.xz
[root@node3 ~]#mv mysql-router-8.0.26-linux-glibc2.12-x86_64 mysql-router
[root@node3 ~]#mv mysql-router /usr/local/
11、添加环境变量
[root@node3 ~]#vi /etc/profile
export PATH=KaTeX parse error: Expected 'EOF', got '#' at position 77: … [root@node3 ~]#̲source /etc/pro…PATH:/usr/local/mysql-shell/bin/" >> /etc/profile
[root@node3 ~]#source /etc/profile
12、进入mysqlsh界面创建集群
[root@node1 ~]# mysqlsh
MySQL JS > \c root@node1:3306
MySQL node3:3306 ssl JS > dba.configureInstance();
MySQL node3:3306 ssl JS > dba.checkInstanceConfiguration(“root@node1:3306”);
创建集群:
MySQL node3:3306 ssl JS > var cluster = dba.createCluster(‘sqlCluster’);
将其他节点加入集群:
MySQL node3:3306 ssl JS > cluster.addInstance(‘root@node2:3306’);
MySQL node3:3306 ssl JS > cluster.addInstance(‘root@node1:3306’);
查看集群状态:
MySQL node3:3306 ssl JS > cluster.status()
在mysql界面可以查看集群状态:
mysql> select * from performance_schema.replication_group_members;
13、mysql-router配置
[root@node3 ~]# /usr/local/mysql-route/bin/mysqlrouter --bootstrap root@node3:3306 -d myrouter --user=root
注:这里会在当前目录下产生mysql-router 目录, 并生成router配置文件,接着修改配置文件
[root@node3 myrouter]# vi /usr/local/mysql-router/myrouter/mysqlrouter.conf
添加以下内容:
部分配置文件详解:
[DEFAULT]
logging_folder = /usr/local/mysql-router/myrouter/log #日志存放目录
plugin_folder = /usr/local/mysql-router/lib/mysqlrouter #插件存放目录
config_folder = /etc/mysql-route #配置文件存放目录
runtime_folder = /usr/local/mysql-router/myrouter/run #运行目录
[routing:read_writer]
bind_address = 192.168.1.13 # 写节点地址
bind_port = 7001 # 写节点端口
MySQL router提供两种mode:read-only和read-write,设置为read-write,常用于设置destinations为master时,实现master的高可用
mode = read-write # 模式:读还是写
# 主节点地址:默认情况下第一台主数据库为写主库,当第一台主数据库DOWN机后,第二台数据库被提升为主库
destinations = node1:3306,node2:3306,node3:3306
max_connections = 1024
[routing:read_only] # 从节点负载均衡配置
bind_address = 192.168.1.13 # 绑定的IP地址
bind_port = 7002 # 监听的端口
mode = read-only
destinations = node1:3306,node2:3306,node3:3306 # 主节点地址:默认情况下第一台主数据库为写主库,当第一台主数据库DOWN机后,第二台数据库被提升为主库
max_connections = 1024
启动服务:
[root@node3 bin]# nohup mysqlrouter -c /usr/local/mysql-router/myrouter/mysqlrouter.conf & # -c为指定配置文件路径
[root@node3 bin]# ps -ef | grep router
注:至此,集群和router安装结束,可以使用远程工具连接
管理节点本身连接mysqlsh:
[root@node3 ~]# mysqlsh --uri root@localhosst:6446
防火墙放行端口,使其他节点能够远程登录:
[root@node3 myrouter]# firewall-cmd --add-port=7001/tcp –per
[root@node3 myrouter]# firewall-cmd --add-port=6446/tcp –per
[root@node1 ~]# mysql -uroot -h192.168.1.13 -P7001 –p
14、进入数据库后做测试
mysql> show databases;
创建数据库:
mysql> CREATE DATABASE kevin CHARACTER SET utf8 COLLATE utf8_general_ci;
在其他主机上(node1 node2 node3)登录数据库发现刚刚创建的数据库已经同步
[root@node3 ~]# mysql -uroot -p
15、故障模拟测试
停掉主节点:
[root@node3 ~]# systemctl stop mysqld
再查看集群状态,主已经切换到node2上
只有两台数据库在线
[root@node1 ~]# mysql -uroot -h192.168.1.13 -P6446 –p 发现仍然能够访问数据库信息
再创建一个数据库后发现另外一台从仍能同步
将故障机重新启动后,node3又重新加入集群,但是主已经是node2,而不会切换到node3上(那些不可用的目标会暂时被隔离,并且mysql router会不断的检查它们的状况,当重新可用时会重新加入到目标列表)
cluster=dba.getCluster()
dba.dropMetadataSchema()
mysql-js> cluster.setupAdminAccount(icadmin)
注:参考网址
https://www.cnblogs.com/taozhang/p/13707180.html
https://dev.mysql.com/doc/mysql-shell/8.0/en/deploying-production-innodb-cluster.html
https://blog.csdn.net/weixin_42089154/article/details/119685457