ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

LNMP架构4——MySQL高可用

LNMP架构4——MySQL高可用 1 mysql路由器重新开启虚拟机集群已失效恢复主节点server25mysqlSET GLOBALgroup_replication_bootstrap_groupON;mysqlSTART GROUP_REPLICATION;mysqlSET GLOBALgroup_replication_bootstrap_groupOFF;恢复备节点server22和server23mysqlSTART GROUP_REPLICATION;mysqlSELECT * FROM performance_schema.replication_group_members;集群恢复在server26上部署 MySQL Router为应用层提供统一的数据库访问入口[rootserver26 ~]# rpm -ivh mysql-router-community-8.0.46-1.el7.x86_64.rpm[rootserver26 ~]# cd /etc/mysqlrouter/[rootserver26 mysqlrouter]# vim mysqlrouter.conf[rootserver26 mysqlrouter]# systemctl enable --now mysqlrouter.service[rootserver26 mysqlrouter]# netstat -antlp|grep :7001[rootserver26 mysqlrouter]# netstat -antlp|grep :7002【静态手动路由模式】不是自动对接 MGR 集群模式。Router 不会自动探测主从切换节点宕机不会自动剔除7001端口只读7002端口读写主节点server25添加用户zxl用于测试机server26远程访问mysqlmysqlcreate userzxl%identified by123456;mysqlgrant all on test.* tozxl%;给server26安装mysql从server25复制[rootserver25 ~]# systemctl stop mysqld.service[rootserver25 ~]# cd /usr/local[rootserver25 local]# scp -rp mysql server26:/usr/local/server26[rootserver26 mysqlrouter]# groupadd -g 1005 mysql[rootserver26 mysqlrouter]# useradd -u 1004 -g mysql -M -d /usr/local/mysql/ -s /sbin/nologin mysql[rootserver26 mysqlrouter]# mkdir -p /data/mysql[rootserver26 mysqlrouter]# mkdir /etc/mysql[rootserver26 mysqlrouter]# chown -R mysql.mysql /data/mysql[rootserver26 mysqlrouter]# vim ~/.bash_profile[rootserver26 mysqlrouter]# source ~/.bash_profile[rootserver26 mysqlrouter]# which mysql/usr/local/mysql/bin/mysql至此mysql已安装好server26可以访问集群中的数据[rootserver26 mysqlrouter]# mysql -h 192.168.40.146 -u zxl -P 7001 -p123456mysqlshow databases;mysqlselect* from test.t1;启动组复制查询集群成员状态[rootserver25 local]# mysql -p123456mysqlSTART GROUP_REPLICATION;mysqlSELECT * FROM performance_schema.replication_group_members;集群中的机器均安装lsof服务用于验证 MySQL Router 是否成功工作yuminstall-ylsof在 server26 本机上通过 MySQL Router 的 7001 端口连接到后端的 MySQL 数据库集群[rootserver26 mysqlrouter]# mysql -h 192.168.40.146 -u zxl -P 7001 -p123456server26 上的 MySQL Router 收到了连接请求并且它成功地将该请求转发到了后端的 server22 这个数据库节点。连接状态为 ESTABLISHED说明连接已经建立可以进行数据交互同理可以访问 7002 端口[rootserver26 mysqlrouter]# mysql -h 192.168.40.146 -u zxl -P 7002 -p1234562 InnoDB ClusterInnoDB Cluster 是 MySQL 官方提供的一套完整的高可用解决方案。它通过将多个 MySQL 服务器实例组合成一个集群提供自动故障转移、数据复制和读写分离等功能。InnoDB Cluster 主要由以下三个核心组件构成MySQL 服务器 (MySQL Server)这是集群的基础至少需要 3 个 MySQL 服务器实例。通常采用单主模式即一个实例作为主节点Primary 处理读写请求其余作为从节点Secondary 处理只读请求并复制主节点的数据。也可以配置为多主模式所有实例均可读写。MySQL Group Replication这是 InnoDB Cluster 的核心技术引擎。它基于共识算法如 Paxos提供数据复制、自动成员资格管理和自动故障转移功能。当主节点发生故障时集群会自动从从节点中选举一个新的主节点对应用透明。MySQL Router这是一个轻量级的中间件作为应用程序和数据库集群之间的“路由器”。它了解集群的拓扑结构并自动将读写请求路由到当前的主节点将只读请求分发到从节点。当主节点发生故障切换时Router 能自动感知并将请求路由到新的主节点从而实现应用层的无缝切换。优势高可用性 (High Availability)通过自动故障转移和容错机制确保服务持续可用。易用性 (Ease of Use)通过 MySQL Shell 的 AdminAPI 可以轻松部署和管理避免复杂的手动配置。透明路由 (Transparent Routing)MySQL Router 让应用程序无需感知后端集群的复杂拓扑和变化。读写分离 (Read/Write Splitting)将读和写操作分发到不同的实例提升整体性能。2.1 配置mgr单主模式修改配置文件切换单主模式[rootserver25 ~]# vim /etc/mysql/my.cnf[rootserver25 ~]# systemctl restart mysqld.service用引导模式“强行”建立一个新组使主节点恢复为 primary[rootserver25 ~]# mysql -p123456mysqlSELECT * FROM performance_schema.replication_group_members;#此时看到集群已经失效mysqlSET GLOBALgroup_replication_bootstrap_groupON;mysqlSTART GROUP_REPLICATION;mysqlSET GLOBALgroup_replication_bootstrap_groupOFF;mysqlSELECT * FROM performance_schema.replication_group_members;server22和server23重新启动集群即可恢复为secondary[rootserver22 ~]# mysql -p123456mysqlSTART GROUP_REPLICATION;mysqlSELECT * FROM performance_schema.replication_group_members;此时已经改为单主模式2.2 mysql shellMySQL Shellmysqlsh是官方推出的新一代高级命令行客户端和代码编辑器可以看作是传统 mysql 命令的增强版。核心能力多语言编程支持可以在同一个工具中使用 SQL、JavaScript 和 Python 编写脚本非常适合编写复杂的自动化运维任务。强大的 AdminAPI通过 AdminAPI你可以使用简单的 JavaScript 或 Python 命令来创建、配置和管理 InnoDB Cluster、InnoDB ClusterSet 和 InnoDB ReplicaSet大大简化了高可用集群的运维工作。现代化的交互体验提供更友好的命令行界面包括语法高亮、智能的 TAB 键自动补全以及历史命令记录\history能显著提升工作效率。安装[rootserver26 ~]# yum install -y mysql-shell-8.0.46-1.el7.x86_64.rpm在primary节点创建集群管理员mysqlCREATEUSERicadmin%IDENTIFIED BY123456;mysqlGRANT ALL PRIVILEGES ON *.* TO icadmin%WITH GRANT OPTION;mysqlFLUSH PRIVILEGES;接管现有mgr集群[rootserver26 ~]# mysqlsh icadmin192.168.40.145:3306var clusterdba.createCluster(mgr_single_cluster,{adoptFromGR:true, force:true});cluster.status();#验证集群状态CTRLD退出2.3 mysql router自动生成配置[rootserver26 ~]# mysqlrouter --bootstrap icadmin192.168.40.145:3306 --usermysqlrouter[rootserver26 ~]# systemctl restart mysqlrouter.service[rootserver26 ~]# mysql -h 192.168.40.146 -u zxl -P 6446 -p123456连接 6446 端口 时Router 会将其路由到 InnoDB Cluster 的 主库Primary 可以读写。连接 6447 端口 时Router 会将其路由到 从库Secondary只读。主节点查看此时停掉主节点server25的服务备节点仍可工作并推选出一个新的主节点server22恢复服务原来的主节点变为备节点2.4 mysql router 高可用与横向扩容可以搭配keepalived、lvs 实现mysqlrouter 高可用与横向扩容新加入四台虚拟机server26、server27做路由器server28、server29做LVS分别将七台机器的IP都加入解析文件第一层均衡LVSserver28 server29作用提供 VIP虚拟IP 和 负载均衡。将客户端发往 VIP 的连接按照轮询rr算法分发到后端的多个 MySQL Router 实例server26 和 server27实际就是对路由器实现负载均衡。实现 Router 层的高可用和负载分担。如果 server26 宕机LVS 会自动将流量全部切到 server27同时两个 Router 共同承担连接压力。第二层路由MySQL Routerserver26 server27作用读写分离和故障感知。发往 7001 端口的连接Router 会全部路由到当前 MGR 集群的 primary 节点server25。发往 7002 端口的连接Router 会根据负载均衡策略将连接分发到多个 secondary 节点server22、server23。这里实现了读请求的负载均衡。7001读写端口保证写入一致性所有写操作必须由主库处理。7002只读端口将查询压力分散到多个从库提升整体吞吐量。第三层数据层MGRserver25、22、23—— 保障“数据一致性”作用数据存储和高可用。目的主库故障时从库自动升级为主库保证数据不丢失服务可持续。2.4.1 路由器部署[rootserver27 ~]# yum install -y mysql-router-community-8.0.46-1.el7.x86_64.rpm时间同步systemctl restart chronyd安装mysql或mariadb进行测试[rootserver26 ~]# scp -rp /usr/local/mysql server27:/usr/local/[rootserver27 ~]# vim .bash_profile #将mysql路径写入[rootserver27 ~]# source .bash_profile[rootserver27 ~]# which mysql[rootserver27 ~]# mysqlrouter --bootstrap icadmin192.168.40.142:3306 --usermysqlrouter[rootserver27 ~]# systemctl restart mysqlrouter.service[rootserver27 ~]# mysql -h 192.168.40.146 -P 6446 -u zxl -p123456测试可以远程访问数据库2.4.2 LVS部署server28、server29yuminstall-yinstallkeepalived.x86_64 yuminstall-yipvsadm主节点部署[rootserver28 ~]# vim /etc/keepalived/keepalived.conf[rootserver28 ~]# systemctl enable --now keepalived.service自动绑定VIP备节点部署配置文件拷贝到备节点[rootserver28 ~]# scp /etc/keepalived/keepalived.conf server29:/etc/keepalived/设置为备用节点优先级低于主节点不会自动接管VIP[rootserver29 ~]# vim /etc/keepalived/keepalived.conf[rootserver29 ~]# systemctl enable --now keepalived.service查看当前生效的负载均衡规则表ipvsadm-ln在 MySQL Router 节点上通过 arptables 实现 LVS DR 模式的 ARP 抑制和 VIP 绑定server26[rootserver26 ~]# yum install -y arptables[rootserver26 ~]# ip a a 192.168.40.100/24 dev eth0[rootserver26 ~]# arptables -A INPUT -d 192.168.40.100 -j DROP[rootserver26 ~]# arptables -A OUTPUT -s 192.168.40.100 -j mangle --mangle-ip-s 192.168.40.176[rootserver26 ~]# arptables-save /etc/sysconfig/arptables[rootserver26 ~]# systemctl restart arptables.serviceserver27[rootserver27 ~]# ip a a 192.168.40.100/24 dev eth0[rootserver27 ~]# arptables -A INPUT -d 192.168.40.100 -j DROP[rootserver27 ~]# arptables -A OUTPUT -s 192.168.40.100 -j mangle --mangle-ip-s 192.168.40.177[rootserver27 ~]# arptables-save /etc/sysconfig/arptables[rootserver27 ~]# systemctl restart arptables.service在server29测试可通过VIP访问数据库[rootserver29 ~]# yum install -y mariadb[rootserver29 ~]# mysql -h 192.168.40.100 -P 6446 -u zxl -p123456测试测试 Keepalived 的 VIP 漂移机制server28停止keepalived服务VIP自动从server28解绑绑定到server29恢复server28VIP自动切换回server28测试 MySQL Router 层的高可用和自动故障恢复机制以及 LVS或 Router 内部对故障节点的剔除与恢复策略访问6446端口指向主库可以在除了LVS的主节点以外的机器上执行从 Master 节点访问 VIP请求不一定经过 LVS可能会直接由本机处理mysql-h192.168.40.100-P6446-uzxl-p123456server25与主备路由器都建立server22和server23无连接停掉26的mysqlrouter再访问[rootserver26 ~]# systemctl stop mysqlrouter.serviceserver25只与server27有连接恢复服务重新与server26建立连接但是建立的 TCP 连接是持久的已有的连接不会立即切回保持连接到 server27过一段时间没有持续的新连接请求产生且已有的短连接执行完毕后自然关闭再次访问mysql-h192.168.40.100-P6446-uzxl-p123456有新的连接由于负载均衡的配置此次连接上server26此时查看调度器26有一条新的TCP连接访问6447端口指向从库mysql-h192.168.40.100-P6447-uzxl-p123456此时主库server25无连接从库server22和server23连接均衡若遇以下问题Router 多次握手 / 连接异常超过 MySQL 参数 max_connect_errors 阈值数据库直接拉黑 Router 的 IP拒绝它继续发起连接。可在集群的三个节点中执行以下语句临时解锁mysqladmin-uroot-pflush-hosts3 MHA高可用MHA高可用和 InnoDB Cluster基于 MGR是两种不同的高可用实现路径。MHA 本身并不改变 MySQL 主从复制的架构而是作为一套管理工具运行在主从集群之上。它通过 SSH 连接到各个数据库节点执行一系列脚本来实现高可用。核心组件MHA Manager管理节点通常部署在一台独立服务器上是集群的“大脑”负责监控主库、发起和执行故障切换。MHA Node数据节点部署在每台 MySQL 服务器上接收 Manager 的指令并执行具体操作比如保存日志、应用差异数据等。工作原理当主库宕机时监控与发现Manager 节点会持续监控主库的健康状态。一旦发现主库无法连接例如连续几次心跳失败就判定主库发生故障。尽力抢救数据MHA 会尝试通过 SSH 登录到故障的主库尽力把主库上最新的二进制日志binlog复制出来以防数据丢失。选举新主库Manager 会检查所有从库根据数据更新的程度哪个从库的 Exec_Master_Log_Pos 最大选举出数据最新的从库作为新主库的候选者。数据补齐与切换如果上一步成功抢救了主库的 binlogMHA 会把这些日志应用到候选新主库上确保其数据是最新的。接着MHA 会让其他从库与这个新主库建立复制关系。最后通过脚本或与 Keepalived 等工具配合将虚拟 IPVIP漂移到新的主库上对上层应用屏蔽切换过程。3.1 创建一主两从集群3.1.1 master配置清理数据[rootserver25 ~]# systemctl stop mysqld.service[rootserver25 ~]# cd /data/mysql/[rootserver25 mysql]# rm -fr *修改配置[rootserver25 mysql]# vim /etc/mysql/my.cnf注意这里要保证集群里每个节点的server_id不同初始化并启动服务[rootserver25 mysql]# mysqld --defaults-file/etc/mysql/my.cnf --initialize[rootserver25 mysql]# grep temporary mysql-error.log[rootserver25 mysql]# systemctl start mysqld.service配置master[rootserver25 mysql]# mysql -pmysqlalter user rootlocalhost identified by123456;mysqlCREATEUSERrepl%IDENTIFIED WITH mysql_native_password BY123456;mysqlGRANT REPLICATION SLAVE ON *.* TOrepl%;mysqlshow master status;3.1.2 slave配置server22[rootserver22 ~]# systemctl stop mysqld.service[rootserver22 ~]# cd /data/mysql/[rootserver22 mysql]# rm -fr *[rootserver22 mysql]# vim /etc/mysql/my.cnf[rootserver22 mysql]# mysqld --defaults-file/etc/mysql/my.cnf --initialize[rootserver22 mysql]# grep temporary mysql-error.log[rootserver22 mysql]# systemctl start mysqld.service[rootserver22 mysql]# mysql -pmysqlalter user rootlocalhost identified by123456;mysqlCHANGE MASTER TOMASTER_HOST192.168.40.145,MASTER_USERrepl,MASTER_PASSWORD123456, MASTER_AUTO_POSITION1;mysqlstart slave;mysqlshow slave status\G;server23[rootserver23 ~]# systemctl stop mysqld.service[rootserver23 ~]# cd /data/mysql/[rootserver23 mysql]# rm -fr *[rootserver23 mysql]# vim /etc/mysql/my.cnf[rootserver23 mysql]# mysqld --defaults-file/etc/mysql/my.cnf --initialize[rootserver23 mysql]# grep temporary mysql-error.log[rootserver23 mysql]# systemctl start mysqld.service[rootserver23 mysql]# mysql -pmysqlalter user rootlocalhost identified by123456;mysqlCHANGE MASTER TOMASTER_HOST192.168.40.145,MASTER_USERrepl,MASTER_PASSWORD123456, MASTER_AUTO_POSITION1;mysqlstart slave;mysqlshow slave status\G;3.2 MHA部署server26做管理端删除server26下所有文件将如下四个rpm包放在/root下复制客户端软件并安装[rootserver26 ~]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server25:[rootserver26 ~]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server22:[rootserver26 ~]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server23:[rootserver25 ~]# yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm[rootserver22 ~]# yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm[rootserver23 ~]# yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpmserver26安装管理端软件[rootserver26 ~]# yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm缺少四个依赖模块[rootserver26 ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo[rootserver26 ~]# yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpmMHA配置[rootserver26 ~]# mkdir /etc/masterha[rootserver26 ~]# vim /etc/masterha/app1.cnf在master上设置mysql 管理员权限slave节点会自动同步[rootserver25 ~]# mysql -p123456mysqlCREATEUSERroot%IDENTIFIED WITH mysql_native_password BY123456;mysqlGRANT ALL PRIVILEGES ON *.* TO root%WITH GRANT OPTION;管理端配置ssh免密[rootserver26 ~]# ssh-keygen[rootserver26 ~]# ssh-copy-id server26[rootserver26 ~]# scp -r .ssh/ server25:[rootserver26 ~]# scp -r .ssh/ server22:[rootserver26 ~]# scp -r .ssh/ server23:检测各节点ssh免密连接[rootserver26 ~]# masterha_check_ssh --conf/etc/masterha/app1.cnf检测主从复制集群状态[rootserver26 ~]# masterha_check_repl --conf/etc/masterha/app1.cnf3.3 故障切换3.3.1 手动切换正常节点当前主节点在server25状态正常手动切换到server22[rootserver26 ~]# masterha_master_switch --conf/etc/masterha/app1.cnf --master_statealive --new_master_host192.168.40.142 --new_master_port3306 --orig_master_is_new_slave --running_updates_limit10000server22变成主库server25和server23是从库3.3.2 手动切换故障节点此时主节点为server22手动停止master节点上的msql服务模拟故障[rootserver22 ~]# systemctl stop mysqld.service将server25切换为主库[rootserver26 ~]# masterha_master_switch --master_statedead --conf/etc/masterha/app1.cnf --dead_master_host192.168.40.142 --dead_master_port3306 --new_master_host192.168.40.145 --new_master_port3306 --ignore_last_failover查看主库状态查看正常的从库状态手动恢复故障节点[rootserver22 ~]# systemctl start mysqld.service[rootserver22 ~]# mysql -p123456mysqlchange master tomaster_host192.168.40.145,master_userrepl,master_password123456,master_auto_position1;mysqlstart slave;mysqlshow slave status\G;3.3.3 自动切换故障切换后会生成lock文件需要手动删除[rootserver26 ~]# cd /etc/masterha/[rootserver26 masterha]# cd app1/[rootserver26 app1]# lsapp1.failover.complete[rootserver26 app1]# rm -f app1.failover.complete在进行自动切换之前必须保证主从集群正常一主两从加入故障切换脚本[rootserver26 app1]# cd[rootserver26 ~]# vim /etc/masterha/app1.cnf编辑项目开始前加入的脚本master_ip_failover是 MHA 在故障切换过程中调用的关键脚本之一其核心功能是管理 VIP 的漂移[rootserver26 ~]# mv master_ip_* /etc/masterha/[rootserver26 ~]# cd /etc/masterha/[rootserver26 masterha]# chmod x master_ip_*[rootserver26 masterha]# vim master_ip_failovermaster_ip_online_change是 MHA 用于在线手动切换的脚本也将VIP写入[rootserver26 masterha]# vim master_ip_online_change启动manger程序并打入后台运行[rootserver26 masterha]# masterha_manager --conf/etc/masterha/app1.cnf [rootserver26 masterha]# ps aux | grep masterha_manager查看测试停掉主节点的mysql服务模拟故障[rootserver25 ~]# systemctl stop mysqld.service自动切换主节点到server22完成切换任务后manager进程会自动退出防止二次切换查看故障切换日志
返回列表