当前位置: 首页 > news >正文

MySQl高可用集群搭建(MGR + ProxySQL + Keepalived)

前言

服务器规划(CentOS7.x)

IP地址主机名部署角色
192.168.x.101mysql01mysql
192.168.x.102mysql02mysql
192.168.x.103mysql03mysql
192.168.x.104proxysql01proxysql、keepalived
192.168.x.105proxysql02proxysql、keepalived

将安装包 mysql_cluster_ha_pack.zip 上传至集群所有服务器,并解压(需要包请私我)。

上传位置 /root/

一、基础配置

1.1 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

1.2 关闭selinux

# 获取selinux状态
getenforce
# 临时关闭
setenforce 0 
# 永久关闭需要重启
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux 

1.3 修改主机名

# 临时修改
hostnamectl --transient set-hostname xxxx
# 永久修改需要重启   --static可以省略
hostnamectl --static set-hostname xxxx 

1.4 修改hosts

vim /etc/hosts

192.168.x.101 mysql01
192.168.x.102 mysql02
192.168.x.103 mysql03
192.168.x.104 proxysql01
192.168.x.105 proxysql02

二、MySQL安装

2.1 安装MySQL(mysql01、02、03)

cd /root/mysql_cluster_ha_pack/mysql
mv mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar /root
# 执行 mysql_auto_install.sh 前请确认 /opt/module/mysql 目录不存在
sh mysql_auto_install.sh
# 提示输入 root 用户密码
(Default password: root):xxxxxx

2.2 修改配置

(mysql01)

vim /etc/my.cnf
# 追加下面内容
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin=binlog
binlog_checksum=NONE
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql01:24901"
loose-group_replication_group_seeds="mysql01:24901,mysql02:24901,mysql03:24901"
loose-group_replication_bootstrap_group=OFF
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
max_connections=2000

(mysql02)

vim /etc/my.cnf
# 追加下面内容
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin=binlog
binlog_checksum=NONE
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql02:24901"
loose-group_replication_group_seeds="mysql01:24901,mysql02:24901,mysql03:24901"
loose-group_replication_bootstrap_group=OFF
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
max_connections=2000

(mysql03)

vim /etc/my.cnf
# 追加下面内容
server-id=3
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin=binlog
binlog_checksum=NONE
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql03:24901"
loose-group_replication_group_seeds="mysql01:24901,mysql02:24901,mysql03:24901"
loose-group_replication_bootstrap_group=OFF
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
max_connections=2000

2.3 初始化MySQL(mysql01、02、03)

systemctl restart mysqld
# 连接mysql,输入root的密码
mysql -uroot -p
# 创建同步数据用户
CREATE USER rpl_user@'%' IDENTIFIED BY 'rpl202302';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
# 重置已产生的binlog
RESET MASTER;
# 安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
# 运行下面的SQL,看到结果出现PLUGIN_STATUS=ACTIVE,说明安装成功了
SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'group_replication' \G;
# 指定主从账户与指定通信频道
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="rpl202302" FOR CHANNEL 'group_replication_recovery';

2.4 启动 MGR 集群

(mysql01)

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

(mysql02、03)

START GROUP_REPLICATION;
-- 运行下面结果进行验证。
SELECT * FROM performance_schema.replication_group_members;

日志位置:/var/log/mysqld.log

2.5 查看自身角色

show variables like '%read_only%';

(mysql01)

在这里插入图片描述

(mysql02、03)

在这里插入图片描述

与图片保持一致成功。

三、ProxySQL安装

3.1 安装Proxysql(proxysql01、02)

cd /root/mysql_cluster_ha_pack/proxysql/rpms/proxysql
rpm -ivh *.rpm --force

3.2 安装mysql客户端(proxysql01、02)

cd /root/mysql_cluster_ha_pack/proxysql/rpms/mysql_client
rpm -Uvh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-client-5.7.28-1.el7.x86_64.rpm

3.3 配置(proxysql01、02)

vim /etc/proxysql.cnf
# 替换部分
admin_variables=
{admin_credentials="admin:admin;cluster_kevin:proxy2023"mysql_ifaces="0.0.0.0:6032"cluster_username="cluster_kevin"cluster_password="proxy2023"cluster_check_interval_ms=1000cluster_check_status_frequency=10cluster_mysql_query_rules_save_to_disk=truecluster_mysql_servers_save_to_disk=truecluster_mysql_users_save_to_disk=truecluster_proxysql_servers_save_to_disk=truecluster_mysql_query_rules_diffs_before_sync=3cluster_mysql_servers_diffs_before_sync=3cluster_mysql_users_diffs_before_sync=3cluster_proxysql_servers_diffs_before_sync=3
}# 追加部分(注意修改IP)
proxysql_servers =                                    
({hostname="192.168.x.104"port=6032weight=1comment="proxysql01"},{hostname="192.168.x.105"port=6032weight=1comment="proxysql02"}
)
# 通过命令修改配置
sed -i 's/threads=4/threads=8' /etc/proxysql.cnf
sed -i 's/max_connections=2048/max_connections=1000000' /etc/proxysql.cnf

3.4 MySQL创建用户\视图(mysql01)

# 连接mysql,输入root的密码
mysql ‐uroot ‐p
CREATE USER 'monitor'@'%' IDENTIFIED BY "monitor@2023";
CREATE USER 'proxysql'@'%' IDENTIFIED BY "proxysql@2023";
GRANT ALL PRIVILEGES ON *.* TO 'monitor'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'proxysql'@'%';
FLUSH PRIVILEGES;
USE sys;
SOURCE /root/mysql_cluster_ha_pack/proxysql/addition_to_sys.sql# 查看 mysql 处于 MGR 中的角色状态
select * from sys.gr_member_routing_candidate_status;

3.5 启动

(proxysql01、02)

rm -rf /var/lib/proxysql/proxysql.db
systemctl start proxysql

(proxysql01)

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
# 查看集群状态,配置中的集群信息是否加载进来
select * from proxysql_servers;
# 添加角色
set mysql-monitor_username='monitor';
set mysql-monitor_password='monitor@2023';
INSERT INTO mysql_users(username,password,active,default_hostgroup,transaction_persistent ) VALUES ('proxysql','proxysql@2023',1,10,1);
# 添加后端节点 注意修改成对应的ip!
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.101',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.102',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.103',3306);
# 设置读写主机组
INSERT INTO mysql_group_replication_hostgroups (writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind) VALUES (10,20,30,40,1,1,0,100);
# 设置读写分离规则
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1), (2,1,'^SELECT',30,1);
# 保存启用
load mysql servers to runtime;
save mysql servers to disk;
load mysql users to runtime;
save mysql users to disk;
load mysql variables to runtime;
save mysql variables to disk;
load mysql query rules to runtime;
save mysql query rules to disk;

日志位置:/var/lib/proxysql/proxysql.log

3.6 查看 MGR 状态(proxysql01、02)

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '# 状态校验
select hostgroup_id,hostname,port,status from runtime_mysql_servers;

在这里插入图片描述

除了 hostname 其余应保持一致。

四、Keepalived安装

4.1 安装Keepalived(proxysql01、02)

cd /root/mysql_cluster_ha_pack/keepalived/rpms/gcc
rpm -Uvh *.rpm --nodeps --force
cd /root/mysql_cluster_ha_pack/keepalived/rpms/gcc-c++
rpm -Uvh *.rpm --nodeps --force
cd /root/mysql_cluster_ha_pack/keepalived
tar -zxf keepalived-2.2.7.tar.gz -C /usr/local/src
cd /usr/local/src/keepalived-2.2.7/
./configure --prefix=/usr/local/keepalived
make & make install
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
mkdir /etc/keepalived
# 监控脚本
cp /root/mysql_cluster_ha_pack/keepalived/proxysql_check.sh /etc/keepalived/proxysql_check.sh
chmod u+x /etc/keepalived/proxysql_check.sh

4.2 配置

查看网卡名(proxysql01、02)

ifconfig

在这里插入图片描述

(proxysql01)

vim /etc/keepalived/keepalived.conf
# 仅需修改网卡名称和虚拟IP
! Configuration File for keepalivedvrrp_script chk_proxysql_port  {script "sh /etc/keepalived/proxysql_check.sh"interval 2weight 1
}vrrp_instance VI_1 {state MASTERinterface ens192 #节点网卡名virtual_router_id 51priority 100advert_int 2authentication {auth_type PASSauth_pass keep2023}virtual_ipaddress {192.168.0.99/24 #虚拟IP,和外网的IP要一个网段}track_script {chk_proxysql_port}
}

(proxysql02)

vim /etc/keepalived/keepalived.conf
# 仅需修改网卡名称和虚拟IP
! Configuration File for keepalivedvrrp_script chk_proxysql_port  {script "sh /etc/keepalived/proxysql_check.sh"interval 2weight 1
}vrrp_instance VI_1 {state BACKUPinterface ens192 #节点网卡名virtual_router_id 51priority 99advert_int 2authentication {auth_type PASSauth_pass keep2023}virtual_ipaddress {192.168.0.99/24 #虚拟IP,和外网的IP要一个网段}track_script {chk_proxysql_port}
}

4.3 启动(proxysql01、02)

systemctl start keepalived

日志位置:/var/log/messages

五、测试

create database testdb;
use testdb;
create table test (id int primary key,name varchar(20));
select * from test;
insert into test values (1,'zhangsan');

读写分离测试

# 登录proxysql回到6032,查看路由日志
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
select hostgroup,username,digest_text,count_star from stats_mysql_query_digest;

通过 stop mysql 或 stop proxysql 服务做故障迁移测试(MGR集群单点故障和proxysql集群单点故障);

相关文章:

MySQl高可用集群搭建(MGR + ProxySQL + Keepalived)

前言 服务器规划(CentOS7.x) IP地址主机名部署角色192.168.x.101mysql01mysql192.168.x.102mysql02mysql192.168.x.103mysql03mysql192.168.x.104proxysql01proxysql、keepalived192.168.x.105proxysql02proxysql、keepalived 将安装包 mysql_cluster_…...

java+Selenium+TestNg搭建自动化测试架构(3)实现POM(page+Object+modal)

1.Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性。 PageObject设计…...

oracle11g忘记system密码,重置密码

OPW-00001: 无法打开口令文件 cmd.exe 使用管理员身份登录 找到xxx\product\11.2.0\dbhome_1\database\PWDorcl.ora文件,删除 执行orapwd fileD:\app\product\11.2.0\dbhome_1\database\PWDorcl.ora passwordtiger (orapwd 在\product\11.2.0\dbhome_1\BIN目录下…...

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…...

HTTP协议知识体系核心重点梳理

HTTP协议知识体系核心重点梳理TCP/IP协议1.四层模型2.通信过程3.tcp三次握手和四次挥手4.tcp安全传输4. 一次HTTP通信流程HTTP协议HTTP/1.1CookieHttp报文格式内容编码分块传输编码HTTP状态码重定向状态码常用的通用首部cache-controlExpiresConnectionTransfer-Encoding常用的…...

Nginx优化与防盗链

Nginx优化与防盗链 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! &#x1f4c…...

自动驾驶路径规划概况

文章目录前言介绍1. 路径规划在自动驾驶系统架构中的位置2. 全局路径规划的分类2.1 基础图搜索算法2.1.1 Dijkstra算法2.1.2 双向搜索算法2.1.3 Floyd算法2.2 启发式算法2.2.1 A*算法2.2.2 D*算法2.3 基于概率采样的算法2.3.1 概率路线图(PRM)2.3.2 快速…...

某某银行行面试题目汇总--HashMap为什么要扩容

一、HashMap啥时候扩容,为什么扩容? HashMap的默认大小是16。在实际开发过程中,我们需要去存储的数据量往往是大于存储容器的默认大小的。所以,出现容量默认大小不能满足需求时,就需要扩容。而这个扩容的动作是由集合自…...

求职者:“我有五年测试经验”面试官: “不,你只是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实,没有持续学习的习惯,但对于…...

Nacos配置中心

什么是配置中心所谓配置中心:在微服务的环境下,将项目需要的配置信息保存在配置中心,需要读取时直接从配置中心读取,方便配置管理的微服务工具我们可以将部分yml文件的内容保存在配置中心一个微服务项目有很多子模块,这些子模块可能在不同的服务器上,如果有一些统一的修改,我们…...

【故障】6、yum不可用

文章目录[toc]一、yum命令不能使用1)报错2)问题分析3)完全删除python及yum重新安装1、删除python2、删除yum3、下载Python依赖rpm包4、下载yum依赖rpm包5、强制安装python6、强制安装yum7、测试一、yum命令不能使用 1)报错 Ther…...

深度解读 | 数据资产管理面临诸多挑战,做好这5个措施是关键

日前,大数据技术标准推进委员会(中国通信标准化协会下(CCSA)的专业技术委员会,简称TC601)发布《数据资产管理实践白皮书》(6.0 版)(以下简称:报告&#xff09…...

双检测人脸防伪识别方法(活体检测+人脸识别+关键点检测+人像分割)

双检测人脸防伪识别=人脸检测+活体检测+人脸识别 1.人脸关键点+语义分割 使用mediapipe进行视频人脸关键点检测和人像分割: import time import cv2 import mediapipe as mp import numpy as npmp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solution…...

2023年3月 - 笔记

内容已复习 采用下划线标识内容已重写 并补充优化 新建文章并添加超链接 背景颜色 绿色 Python 2023年3月1日 Python 把列表转成元组 # 1、Python 把列表转成元组 使用tuple 即可 list_a [1, 2, 3, 4, 5, 6] list_b tuple(list_a) print(list_b)# 2、如果想把 元组转成列…...

浅谈Redisson实现分布式锁对原理

1.Redisson简介 Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,我没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java…...

struts1.2升级struts2.5.30问题汇总

严重: 配置应用程序监听器[org.apache.struts2.tiles.StrutsTilesListener]错误java.lang.NoClassDefFoundError: org/apache/tiles/web/startup/AbstractTilesListenerat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader…...

电动汽车充放电的优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

《JeecgBoot系列》 如何设计表单实现“下拉组件二级联动“ ? 以省市二级联动为例

《JeecgBoot系列》 如何设计表单实现"下拉组件二级联动" ? 以省市二级联动为例 一、准备字典表 1.1 创建字典表 CREATE TABLE sys_link_table ( id int NULL, pid int NULL, name varchar(64) null );1.2 准备数据 idpidname1全国21浙江省32杭州市42宁波市51江苏…...

数学小课堂:数学的线索(从猜想到定理再到应用的整个过程)

文章目录 引言I 勾股定理1.1 勾三股四弦五1.2 数学和自然科学的三个本质差别1.3 总结引言 从猜想到定理再到应用的整个过程是数学发展和体系构建常常经历的步骤。 I 勾股定理 勾股定理: 直角三角形两条直角边的平方之和等于斜边的平方,这个定理在国外都被称为毕达哥拉斯定理…...

Collecting package metadata (current_repodata.json): failed

一、问题描述 安装anaconda之后,想创建环境,用了下面这段代码: conda create -n pytorch python3.7 conda创建环境报错了,报了如下这一堆: Collecting package metadata (current_repodata.json): failedUnavailab…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...