目录
一.mysql路由器
1.1简单介绍
1.2实现mysql路由器
1.2.1准备工作
1.2.2下载mysql路由器软件,并解压安装
1.2.3修改文件配置
1.2.4恢复多组复制
1.2.5创建远程登录用户
1.2.6使用路由器远程访问数据库
1.2.7查看当前路由器连接的数据库
二.MySQL InnoDB Cluster集群
2.1简单介绍
2.2部署单组复制
2.2.1简单介绍
2.2.2编辑my.cnf文件,调整为单组模式
2.2.3选择任一节点启动临时引导模式,开启组群
2.2.4开启其他两个组群
2.2.5查看集群成员状态
2.2.6测试
2.3部署mysql shell
2.3.1简单介绍
2.3.2官网下载mysql shell软件包,并解压安装到路由器上
2.3.3创建一个集群管理员
2.3.4配置集群
2.4自动部署mysqlrouter
2.4.1简单介绍
2.4.2自动生成相关的配置文件信息,并重启路由服务
2.4.3测试
三.部署Mysql InnoDB Cluster高可用
3.1简单介绍
3.2搭建高可用、路由器与数据库架构
3.2.1准备工作
3.2.2server10上安装mysqlrouter,并完成自动部署工作
3.2.2部署中出现以下错误(补充)
3.2.3server11、server12完成高可用的相关配置
3.2.4为两个路由器添加VIP
3.2.5在两个路由器上设定arptables规则
3.2.6测试
四.MHA高可用集群
4.1简单介绍
4.2部署MHA高可用集群
4.2.1创建一主两从集群
4.2.2MHA部署
4.2.3测试手动故障切换
4.2.4测试故障自动切换
一.mysql路由器
1.1简单介绍
1.路由器:是一种网络硬件,负责连接不同的网络,并为数据包寻找最佳传输路径,是家庭或企业上网的“枢纽”。
2.Mysql路由器:是一种软件中间件,它位于应用程序和MySQL数据库之间,负责将数据库连接请求透明地路由到合适的后端MySQL服务器,以实现负载均衡和故障转移(高可用)。
3.Mysql路由器的配置决定了路由策略(如读写分离、负载均衡),但它本身并不会“坚持”把连接固定到某个具体的数据库实例。
4.重新以只读方式连接数据库,或者停止当前的数据库服务,会发现路由器会按照文件的设置要求连接新的数据库,这就是路由器的作用。
1.2实现mysql路由器
1.2.1准备工作
1.三台数据库,一台路由器。
2.三台数据库上要有mysql8.0.36
3.相关定义(可以自定以)
server5,server6,server9:数据库,192.168.7.141,192.168.7.142,192.168.7.145
server4:路由器,ip192.168.7.140
这四个系统互有对方解析:
1.2.2下载mysql路由器软件,并解压安装
1.进入mysql 路由器下载官网,下载8.0.46版本的msyqlrouter.rpm
2.在路由器的系统上安装mysql路由器
rpm -ivh mysql-router-community-8.0.46-1.el7.x86_64.rpm1.2.3修改文件配置
vim /etc/mysqlrouter/mysqlrouter.conf systemctl enable --now mysqlrouter.service1.2.4恢复多组复制
1.任选一台数据库系统,恢复组通道认证,临时启动引导模式开启组群
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; #恢复组通道认证 SET GLOBAL group_replication_bootstart_group=ON; START GROUP_REPLICATION; #开启多组复制 SET GLOCAL group_replication_bootstart_goup=OFF;2.其余两个数据库系统,只需开启组群就可自动加入
START GROUP_REPLICATION;3.查看组成员
SELECT * FROM performance_schema.replication_group_members; #查看组群成员1.2.5创建远程登录用户
在数据库上创建一个名为wzq的用户,允许全部IP访问
CREATE USER 'wxh'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'westos'; #创建wzq用户 GRANT ALL ON test.* to 'wxh'@'%' #允许用户对test数据进行读写操作1.2.6使用路由器远程访问数据库
1.检查路由器端口是否开启:
netstat -antlp | grep 7002.访问路由器,使用账号和密码远程访问数据库:
mysql -uwxh -pwestos -P 7001 -h 192.168.7.140 #7001端口 mysql -uwxh -pwestos -P 7002 -h 192.168.7.140 #7002端口7001:只读端口,进入数据库后,无法修改数据,轮询访问(server9->server5->server6)
7002:读写端口,进入数据库后,可以修改数据,顺序访问(server9->server5->server6->server9)
1.2.7查看当前路由器连接的数据库
1.用只读方式连接数据库后,逐一在数据库系统上输入losf检测端口命令,查看路由器连接的是哪一台数据库。之后中断连接,重新以只读方式连接数据库,或者停止当前的数据库服务,会发现路由器会按照文件的设置要求连接新的数据库,这就是路由器的作用。
server4:
mysql -P 7001 -u root -pwestos -h 192.168.7.140 #以只读模式连接路由器数据库:
lsof -i :3306 #3306是数据库监听端口号2.1.用读写方式连接数据库后,逐一在数据库系统上输入losf检测端口命令,查看路由器连接的是哪一台数据库。之后中断连接,重新以只读方式连接数据库,或者停止当前的数据库服务,会发现路由器会按照文件的设置要求连接新的数据库。
server4:
mysql -P 7002 -u root -pwestos -h 192.168.7.140 #以读写模式连接路由器,实际访问的是数据库数据库:
路由器的本质缺点:不同的是如果集群中新分配的主节点,与你文件中定义的下一个节点不同,则会出现故障。所以简单的路由器,一般只搭配多组复制。
二.MySQL InnoDB Cluster集群
2.1简单介绍
1.介绍:MYSQL的官方高可用解决方案,其中整合了多种MYSQL技术,能够快速部署和调试集群。核心功能:接入 InnoDB Cluster 元数据模式(metadata_cache),让 MySQL Router 自动感知集群拓扑,不再使用静态节点列表。
2.特点:
1.自动化部署:便于添加或移除集群中的节点,且新节点会自动同步集群中其他节点的数据
2.自动障碍转移:当集群中的主节点发生故障时,会自动从现有的从节点当中选出数据与主节点最接近的一个节点,作为集群中的新主节点
3.高级扩展:将主机群与数据中心的其他复制集群相连接,提高容灾能力
3.静态路由器与动态路由器:
静态路由器:它是"无感知"的。它只知道你配置的IP列表里的服务器是"通"还是"不通",完全不知道这些服务器在集群里扮演什么角色(比如哪个是主节点)。如果主节点挂了,它只能机械地尝试列表里的下一个,但这下一个可能是个备节点,导致你的写请求失败。并且路由器只能读取文件里的固定节点,每次新加入数据库,都要向文件写入它的IP。
动态路由器:它会实时监测集群中的状态。它保证了默认的读端口只会访问集群中的从节点,默认的读写端口会访问集群中的主节点。当主节点故障,MGR自动选举出新主后,Router会实时感知这一变化。后续通过读写端口发起的新连接,会被自动、正确地路由到新的主节点。同时,动态路由器会自动检测新加入的数据库节点,判断它在集群中的位置。
2.2部署单组复制
2.2.1简单介绍
1.单组复制:只有一台主机作为主节点支持读写,其他节点都是从节点仅能读数据。
2.当主节点出现故障时,数据库中会新选举出一个文件中权重较高的备用从节点,成为数据库的新主节点。(innodb cluster集群中,)
3.在之前的主节点恢复成功,重新加入集群后,会成为一个新的从节点。
2.2.2编辑my.cnf文件,调整为单组模式
vim /etc/mysql/my.conf systemctl restart mysqld2.2.3选择任一节点启动临时引导模式,开启组群
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;2.2.4开启其他两个组群
START GROUP_REPLICATION;2.2.5查看集群成员状态
SELECT * FROM performance_schema.replication_group_members;2.2.6测试
在主节点上创建用户,在从节点上查看
主节点:
CREATE DATABASE test; #创建test数据库 USE test; #切换到test库 #创建测试表 CREATE TABLE user ( username VARCHAR(50) PRIMARY KEY, password VARCHAR(50) ); #插入测试数据 INSERT INTO user VALUES ('user1', '111'); INSERT INTO user VALUES ('user2', '222'); INSERT INTO user VALUES ('user3', '333'); #查询验证 SELECT * FROM user; SHOW STATUS LIKE 'Rpl_semi_sync%'; ———————————————— 版权声明:本文为CSDN博主「wzq11_666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/2302_80987538/article/details/163375289从节点:
SELECT * FROM test.user;2.3部署mysql shell
2.3.1简单介绍
1.作用:InnoDB Cluester的核心管理工具,里面包含多种脚本,用于MYSQL的管理。核心作用:构建元数据集群,接管mysql集群,自动感知集群上的变化
2.功能:
1.多语言编辑模式:可自由切换javascripts模式、MYSQL模式、Python模式
2.强大的管理API:设置了一个全局变量dba,方便我们快速创建和部署高可用集群
2.3.2官网下载mysql shell软件包,并解压安装到路由器上
yum install -y mysql-shell-8.0.46-1.e17.x86_64.rpm2.3.3创建一个集群管理员
CREATE USER icadmin@'%' IDENTIFIED WITH 'mysql_native_password'BY 'westos'; GRANT ALL PRIVILIEGES on *.* TO 'icadmin'@'%' WITH GRANT OPTION; #赋予这个用户所有权限 FLASH PRIVILEGES;2.3.4配置集群
1.通过路由器远程登录MYSQL的主节点,输入集群管理员的密码,进入javascripts模式
msyqlsh icadmin@192.168.7.145 #你的管理员用户@主节点IP2.接管当前已有的MSR(MYSQL组复制)集群,延用组复制的模式
var cluster = dba.createCluster("mgr_single_cluster", {adoptFromGR:true, force:true});3.查看当前的集群状态,看到OK,说明接管成功
cluter.status();2.4自动部署mysqlrouter
2.4.1简单介绍
作用: MySQL Router 自动接入并识别你现有 InnoDB Cluster。该操作会自动根据你当前数据库中的集群状态修改你当前的路由器的配置文件,实现自动感知集群中的节点,并根据需求自动切换。
1.自动读取集群拓扑:Router 会使用你提供的账户连接到集群,从集群的元数据中获取所有成员节点的地址和角色(主/从)信息。
2.自动生成配置文件:根据读取到的拓扑信息,Router 会自动生成一个名为mysqlrouter.conf的配置文件,里面包含了读写分离的路由规则。
3.预设端口:路由器默认会从下面两个端口分流
6446:用于读写请求,所有写操作都会通过此端口自动路由到集群的主节点。
6447:用于只读请求,所有读操作都会通过此端口自动路由到集群的从节点。
4.自动创建专用用户:自动创建一个专用数据库的用户
2.4.2自动生成相关的配置文件信息,并重启路由服务
mysqlrouter --bootstrap icadmin@192.168.7.145:3306 --user=mysqlrouter #自动完成文件配置 systemctl restart mysqlrouter.service #重启服务注意:在我部署过程中,主节点在192.168.7.145这个主机上
2.4.3测试
1.以读写方式连接路由器,接着停止集群中的主节点数据库,路由器会自动寻找集群中的新的主节点数据库并连接它。并且,读写模式下,他只会连接主节点数据库。
server4:
mysql -h 192.168.7.140 -P 6446 -u wxh -pwestos数据库:
lsof -i :3306 systemctl stop mysqld2.以只读方式连接路由器,接着停止当前正在连接的数据库,路由器会自动寻找集群中的新的主节点数据库并连接它。并且,只读模式下,他只会连接从节点数据库。
server4:
mysql -h 192.168.7.140 -P 6447 -u wxh -pwestosmysql:
三.部署Mysql InnoDB Cluster高可用
3.1简单介绍
高可用:当主节点的高可用出现故障,备用的从节点高可用立刻接管工作,正常运行
横向扩容:通过增加数据库的数量,提高整体集群的性能
工作原理:客户端通过访问VIP进入高可用集群中,接着高可用把请求轮询发给路由器,最后通过路由器根据你当前的需求(读写还是只读)连接到对应的数据库中。
整体架构如下:
3.2搭建高可用、路由器与数据库架构
3.2.1准备工作
1.准备七台虚拟机或者Linux系统:两个高可用、两个路由器和三个数据库
server4,server10:路由器
server11、server12:高可用
server5、server6、server9:数据库
IP地址与server的关系如下:
2.新建的虚拟机要求:配置静态IP、时间同步、域名解析、关闭防火墙和selinux
静态IP:
vim /etc/sysconfig/network-scripts/ifcfg-ens32 #编辑网络配置文件 nmcli c up ens32 #刷新网络 systemctl restart network #重启网络服务时间同步:
vim /etc/chrony.conf域名解析:
vim /etc/hosts关闭防火墙和selinux:
vim /etc/sysconfig/selinux #关闭selinux,需要重启系统生效 systemctl disable --now firewalld #关闭防火墙3.2.2server10上安装mysqlrouter,并完成自动部署工作
1.将server4上的mysqlrouter安装包远程传输到server10上,并安装,启动路由
server4:
scp mysql-router-community-8.0.46-1.e17.x86_64.rpm server10:server10:
yum install -y mysql-router-community-8.0.46-1.e17.x86_64.rpm systemctl start mysqlrouter2.连接当前集群中的主节点数据库系统,自动部署路由器
mysqlrouter --bootstrap icadmin@192.168.7.145:3306 --user=mysqlrouter #自动完成文件配置 systemctl restart mysqlrouter #重启路由器3.2.2部署中出现以下错误(补充)
问题:系统中已经存在名为system的mysql router实例,你需要使用--force强制覆盖掉他
解决办法:部署命令后加上--force参数
mysqlrouter --bootstrap icadmin@192.168.7.145:3306 --user=mysqlrouter --force #强制覆盖3.2.3server11、server12完成高可用的相关配置
1.安装mariadb,用来测试server10路由器是否成功连接上后端数据库
yum install -y mariadb #mariadb用于测试 mysql -uwxh -pwestos -P 6446 192.168.7.146 #连接server10路由器的IP2.安装高可用软件(keepalived、ipvsadm)
yum install -y keepalived ipvsadm #安装相关软件3.确保两个高可用时间同步
date4.如果时间不同步,可以试着刷新或者重启一下chronyd服务(错误改正)
systemctl restart chronyd chronyc makestep #强制跳进到正常的时间 date5.修改server11的keepalived.conf文件完成主机的高可用配置
vim /etc/keepalived/keepalived.conf ipvsadm-save > /etc/sysconfig/ipvsadm #保存配置 systemctl restart keepalived ipvsadm -ln scp /etc/keepalived/keepalived.conf server12:/etc/keepalived/keepalived.conf #复制配置文件给server12 ip a #查看VIP是否加入6.修改server12的keepalived.conf文件完成备机高可用的配置
vim /etc/keepalived/keepalived.conf ipvsadm-save > /etc/keepalived/keepalived.conf systemctl restart keepalived ipvsadm -ln ip a #两台高可用只有一台拥有VIP3.2.4为两个路由器添加VIP
server4,server10:
ip a a 192.168.7.100 dev ens32 #这个IP是临时添加的,重启系统会丢失 ip a3.2.5在两个路由器上设定arptables规则
1.安装软件:
yum install -y arptables2.添加arptables规则:路由器不响应外部对于自身VIP的ARP查询;修改本机发出的 ARP 包的源 IP,从VIP伪装成本机的真实IP
arptables -A INPUT -d 192.168.7.100 -j DROP #拒绝外机对于本机VIP的访问 arptables -A OUTPUT -s 192.168.7.100 -j mangle --mangle-ip-s 192.168.7.140(你当前路由器的IP) #将源VIP伪装成真实的路由器本机IP arptables -nL arptables-save > /etc/sysconfig/arptables #将修改规则写入文件中保存 systemctl restart arptables3.2.6测试
1.在没有VIP的那台高可用机上访问VIP或者一台处于同VLn的系统访问VIP,观察是否能够连接到后端数据库:
mysql -uwxh -pwestos -P 6446 192.168.7.100 #以读写方式访问数据库 mysql -uwxh -pwestos -P 6447 192.168.7.100 #以只读方式访问数据库注意:如果在存在VIP的高可用上访问VIP,会出现无响应的情况,因为你正在访问本机,二不是路由器
2.停止当前server11的keepalived服务,会发现VIP自动漂移到server12上,这时候可用ipvsadm查看或者直接在server12上用IP查看VIP是否存在,接着用server12或外机测试能否访问到后端数据库
server11:
systemctl stop keepalived mysql -uwxh -pwestos -P 6446 192.168.7.100 #观察是否能够连接后端数据库 mysql -uwxh -pwestos -P 6447 192.168.7.100server12:
ipvsadm -nl #查看VIP是否转移 ip a #查看系统上是否存在VIP3.关闭一个路由器后,观察还能否正常访问后端数据库;接着打开路由器,关闭另一台路由器,观察是否能够访问后端数据库
server4:
systemctl stop mysqlrouter #关闭路由器服务测试机:
mysql -uwxh -pwestos -P 6446 192.168.7.100 #观察是否能够连接后端数据库 mysql -uwxh -pwestos -P 6447 192.168.7.100server10:测试前,先打开server4的路由器
systemctl stop mysqlrouter #关闭路由器服务测试机:
mysql -uwxh -pwestos -P 6446 192.168.7.100 #观察是否能够连接后端数据库 mysql -uwxh -pwestos -P 6447 192.168.7.100四.MHA高可用集群
4.1简单介绍
1.作用:实现 MySQL 数据库的主库故障自动切换,最大限度保证数据库服务的高可用性。
2.与InnoDB Cluster的区别:
MHA高可用:采用异步复制,主节点断开后,集群中会选择数据最接近的从节点作为新的主节点,抢修日志。事后从日志堆里"挑数据最全的"并"补日志"。
InnoDB Cluster:采用组复制,集群在每次提交事务前,需要多个从节点的确认。在主节点断开后,集群通过投票确认新的主节点。
4.2部署MHA高可用集群
4.2.1创建一主两从集群
1.准备工作:
三个数据库,一个作为主节点server5,两个作为从节点server6,server9
一个Manger管理节点:server4
2.编辑my.cnf文件
vim /data/mysql/my.cnf #编辑my.cnf文件3.mysql进行初始化,开启mysql服务
mysqld --defaults-file=/etc/mysql/my.cnf --initialize #进行mysql初始化 systemctl start mysqld grep password /data/mysql/my.cnf mysql -p4.创建数据库主从复制用户
alter user 'root'@'localhost' identify by 'westos'; create user 'repl'@'%' identify with my_native_password by 'westos'; grant replication slave on *.* to 'repl'@'%'; show master status;5.从库连接主库
change master to master_host='192.168.7.141',master_password='westos',master_auto_position=1; start slaves; show slaves status\G4.2.2MHA部署
1.server4安装mha软件
yum install -y mha4mysql-node-0.58-0.e17.centos.noarch.rpm2.server4和三台数据库配对免密登录
ssh-keygen ssh-copy-id server4 scp -r .ssh/ server5: #复制密钥给server5 scp -r .ssh/ server6: #复制密钥给server6 scp -r .ssh/ server7: #复制密钥给sercer93.编辑server4 manger文件配置
mkdir /etc/masterha vim /etc/masterha/app1.conf #编辑文件4.检测各节点ssh 免密连接,主从复制集群状态
masterha_check_ssh --conf=/etc/masterha/app1 .cnf masterha_check_repl --conf=/etc/masterha/app1 .cnf4.2.3测试手动故障切换
停止正在工作的主数据库,手动将主节点从停止工作的主数据库上移动到正常工作的从节点的数据库上,这个能够作为主数据库的从节点一般在配置文件中自定义。
1.手动将server5上的主数据库转移到server6上
masterha_master_switch --conf=/etc/masterha/app1 .cnf --master_state=alive --new_master_host=192.168.7.142 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000 #设定新的主节点为server62.模拟手动故障:server6上手动停止数据库服务
systemctl stop mysqld.service3.故障修复:手动将server6上已经停止数据库的主节点转移到server5上, server5自动升级 成从节点,在server9上查看当前的主节点
server6:
masterha_master_switch --master_state=dead --conf=/etc/masterha/app1 .cnf --dead_master_host=192.168.7.142 --dead_master_port=3306 --new_master_host=192.168.7.141 --new_master_port=3306 --ignore_last_failoverserver9:登录数据库,查看当前连接的主节点
show slave status\G4.恢复停止的数据库:重新启动数据库服务,该数据库自动成为当前主数据库的从数据库
systemctl start mysqld mysql -p change master to master_host='192.168.7.142' master_password='westos',master_auth_position=1; start slave; show slave status;4.2.4测试故障自动切换
当主节点发生故障时,程序会自动将主节点切换到备用的主节点上
1.手动删除刚才切换生成的lock文件,启动manger程序,并打入后台运行,完成切换任务后进程会自动退出
rm -f app1 .failover.complete masterha_manager --conf=/etc/masterha/app1 .cnf &2.编辑MHA配置文件,开启自动切换
vim /etc/masterha/app1.conf3.编辑master_ip文件,指定VIP和连接设备,并赋权
vim master_ip_failover vim master_ip_online_change chmod 655 master_ip_failover chmod 655 master_ip_online_change4.关闭当前的主节点数据库server5,在从节点数据库server9上查看当前正在连接的新的主数据库IP
server5:
systemctl stop mysqldserver9: