Docker方式部署ProxySQL和Keepalived组合实现MGR的高可用访问

news2024/9/21 20:33:14

ProxySQL 代理访问MGR,可以做到故障自动切换主节点,可以自定义访问规则实现读写分离

目录

  • 网络架构
  • 一、环境准备
  • 二、软件安装
    • 1. MGR集群配置
    • 2. 创建必要用户
    • 2. ProxySQL部署测试
    • 3. Keepalived部署高可用
    • 4. 测试高可用

网络架构

在这里插入图片描述

一、环境准备

三台物理主机: 22.04.3-Ubuntu Linux 16核 32G内存

Docker版本:24.0.9

MySQL版本:8.0.27

4个IP地址
192.168.30.191
192.168.30.192
192.168.30.193
192.168.30.190(作为虚拟IP)

二、软件安装

1. MGR集群配置

请参考博客:https://blog.csdn.net/gzt19881123/article/details/133419800

假设 192.168.30.191 为主节点,其他为从节点 组成MGR集群

2. 创建必要用户

在MGR主节点上创建一个用于ProxySQL监控的用户,后面配置用到。

CREATE USER 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'monitor';

GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
  
GRANT SELECT on sys.* to 'monitor'@'%';

GRANT SELECT on performance_schema.* to 'monitor'@'%';

FLUSH PRIVILEGES;

上面是示例用户密码(monitor/monitor),生产环境记得修改密度。

2. ProxySQL部署测试

三台物理服务器都操作下面步骤

下载Docker镜像

docker pull proxysql/proxysql:2.6.5

创建目录

mkdir -p /apps/proxysql/conf

在此目录下,创建映射配置文件

touch proxysql.cnf

文件内容如下:(这里一口气配置好MGR监控和主机信息,暂时没有配置读写分离访问策略)

datadir="/var/lib/proxysql"  

admin_variables=  
{  
    admin_credentials="admin:admin;radmin:radmin"  
    mysql_ifaces="0.0.0.0:6032"  
}

mysql_variables=  
{
    threads=8                    # 增加线程数以处理更多请求  
    max_connections=2000         # 适配32GB内存,允许更多连接  
    default_query_delay=0  
    default_query_timeout=3000000 # 有效的查询超时设置(以毫秒为单位)  
    have_compress=true  
    poll_timeout=2000  
    interfaces="0.0.0.0:6033"  
    default_schema="information_schema"  
    stacksize=1048576  
    server_version="8.0.27"  
    connect_timeout_server=3000  
    monitor_username="monitor"  
    monitor_password="monitor"  
    monitor_history=600000  
    monitor_connect_interval=60000  
    monitor_ping_interval=10000  
    monitor_read_only_interval=1500  
    monitor_read_only_timeout=500  
    ping_interval_server_msec=120000 # 适当调整  
    ping_timeout_server=500  
    commands_stats=true  
    sessions_sort=true  
    connect_retries_on_failure=10  

    # 优化内存使用及性能监控  
    max_idle_connections=1000       # 最大空闲连接数  
    monitor_server_prune_interval=60000 # 删除过期监控服务器的间隔  
}

mysql_group_replication_hostgroups =  
(  
    {  
        writer_hostgroup=10  
        backup_writer_hostgroup=11  
        reader_hostgroup=12  
        offline_hostgroup=13  
        active=1  
        max_writers=1  
        writer_is_also_reader=1  
        max_transactions_behind=100  
        comment="MySQL MGR Group"  
    }  
)

mysql_servers =  
(  
    { address="192.168.30.191" , port=3319 , hostgroup=10, max_connections=300 },  
    { address="192.168.30.192" , port=3319 , hostgroup=10, max_connections=300 },  
    { address="192.168.30.193" , port=3320 , hostgroup=10, max_connections=300 },  
)

mysql_users:  
(  
    {  
        username = "root"  
        password = "YOUR_ROOT_PASSWORD"  
        default_hostgroup = 10  
    }  
)
  • mysql_variables 各参数说明参考官方文档,这里简单记录下:

    参数名说明
    threads可用于处理请求的线程数。增加此值可以帮助处理更多的并发请求。
    max_connections允许的最大连接数,针对32GB内存进行了调整以适应更多连接。
    default_query_delay查询之间的延迟时间(以毫秒为单位)。设置为0表示没有延迟。
    default_query_timeout查询执行的最长时间(以毫秒为单位),3000000毫秒即50分钟。
    have_compress如果设置为true,则启用通信压缩。
    poll_timeout套接字轮询操作的等待时间(以毫秒为单位)。
    interfaces指定服务器监听连接的IP地址和端口。
    default_schema默认使用的数据库模式,此处为information_schema
    stacksize每个线程的堆栈大小(以字节为单位),1048576字节即1 MB。
    server_version使用的MySQL服务器版本。
    connect_timeout_server在连接超时之前等待服务器连接建立的时间(以毫秒为单位)。
    monitor_username用于监控的用户名。
    monitor_password与监控用户名关联的密码。
    monitor_history保留监控历史数据的时间(以毫秒为单位)。
    monitor_connect_interval尝试监控连接之间的时间间隔(以毫秒为单位)。
    monitor_ping_interval监控服务器状态的ping尝试之间的时间间隔(以毫秒为单位)。
    monitor_read_only_interval监控期间检查只读状态的时间间隔(以毫秒为单位)。
    monitor_read_only_timeout监控只读状态的超时时间(以毫秒为单位)。
    ping_interval_server_msec检查服务器状态的ping时间间隔(以毫秒为单位);根据需要进行适当调整。
    ping_timeout_server服务器ping的超时时间(以毫秒为单位)。
    commands_stats如果启用(true),则跟踪命令的统计信息。
    sessions_sort如果为true,允许对会话进行排序,有助于管理和监控。
    connect_retries_on_failure服务器连接失败时的重试次数。
    max_idle_connections允许的最大空闲连接数,以优化内存使用。
    monitor_server_prune_interval从列表中删除过期监控服务器的时间间隔(以毫秒为单位)。
  • mysql_group_replication_hostgroups 配置MGR的信息,后面自动将各节点划分到如下配置的组信息中:
    写组10、备写组11、读组12、离线组13

  • mysql_servers 配置MGR 集群的每一个节点信息,默认组可以都写成10,ProxySQL会根据监控信息自动重新划分

  • mysql_users 规定可以使用 proxsql连接的用户,如果不在这里面是无法连接上mysql的。

ProxySQL常用的端口如下:

端口类型默认端口描述
Admin Port (管理端口)6032用于管理和配置 ProxySQL
MySQL Frontend Port (MySQL 前端端口)6033用于应用程序连接到 ProxySQL,就像连接到 MySQL 服务器一样
Stats Port (统计端口)6080用于访问 ProxySQL 的统计信息

三台主机上创建容器: 注意:必须host模式 否则监控无效


 sudo docker run -d --network=host \
    --privileged \
    --restart=always \
    --name proxysql \
    -v /apps/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf \
    proxysql/proxysql:2.6.5
		

进入容器中验证:

docker exec -it proxysql /bin/bash

在容器中执行:

mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

查看当前主机信息:

select hostgroup_id, hostname,port, status  from runtime_mysql_servers;

(这里是示例图,非对应上面主机IP)
在这里插入图片描述
查看监控详情:

select  time_start_us, hostname,  port,  viable_candidate,  read_only, transactions_behind,  error  from mysql_server_group_replication_log   order by time_start_us desc   limit 6;

(这里是示例图,非对应上面主机IP)
在这里插入图片描述
read_only 字段为 NO 的表示主节点,为YES的表示从节点,hostname会将名称和IP都记录上,MGR节点间通讯采用的时主机名

使用Navicat 采用 6033 端口连接ProxySQL看下是否可以成功连接上MySQL主节点。

3. Keepalived部署高可用

三台物理服务器都操作下面步骤

镜像下载

docker pull osixia/keepalived:2.0.20

映射文件

mkdir -p /apps/keepalived/conf
cd /apps/keepalived/conf
touch keepalived.conf

192.168.30.191上 keepalived.conf:

vrrp_instance VI_1 {  
    state MASTER  
    interface eth0             
    virtual_router_id 51  
    priority 101                 
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass yourpass  
    }  
    
    virtual_ipaddress {  
        192.168.1.100        
    }  
    
    track_script {  
        chk_proxysql  
    }  
}  

vrrp_script chk_proxysql {  
    script "nc -zv localhost 6033 > /dev/null 2>&1"  
    interval 2  
    weight -3  
}

192.168.30.192上 keepalived.conf:

vrrp_instance VI_1 {  
    state BACKUP
    interface eth0             
    virtual_router_id 51  
    priority 100                 
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass yourpass  
    }  
    
    virtual_ipaddress {  
        192.168.1.100        
    }  
    
    track_script {  
        chk_proxysql  
    }  
}  

vrrp_script chk_proxysql {  
    script "nc -zv localhost 6033 > /dev/null 2>&1"  
    interval 2  
    weight -3  
}

192.168.30.193上 keepalived.conf:

vrrp_instance VI_1 {  
    state BACKUP
    interface eth0             
    virtual_router_id 51  
    priority 99              
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass yourpass  
    }  
    
    virtual_ipaddress {  
        192.168.1.100        
    }  
    
    track_script {  
        chk_proxysql  
    }  
}  

vrrp_script chk_proxysql {  
    script "nc -zv localhost 6033 > /dev/null 2>&1"  
    interval 2  
    weight -3  
}

主要是如下几个变量要注意:

interval 2 每隔2秒执行一次

weight -5 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级减5

fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) 默认值为 3

rise 1 #检测1次成功就算成功。但不修改优先级 默认值为 2

interface 当前节点服务器的网卡名称

priority 优先级,每一个节点上不一样

virtual_ipaddress 虚拟ip

virtual_router_id 共享相同虚拟IP的节点上该参数值必须一样 ,
keepalived可以代理多个虚拟IP,每一个虚拟IP对应的virtual_router_id值不可一样。

state 指定当前keepalived的初始状态,这个可用是 MASTER 或者 BACKUP ,如果是BACKUP 则作为从节点,但是这个值会根据监控脚本运行状态改变优先级从而导致状MASTER /BACKUP 切换.

三台物理服务器都操作下面步骤


docker run -d --name keepalived \
	--cap-add=NET_ADMIN \
	--cap-add=NET_BROADCAST \
	--cap-add=NET_RAW \
	--net=host \
	-e KEEPALIVED_INTERFACE=eth0 \
	-v /apps/keepalived/conf/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
	osixia/keepalived:2.0.20 --loglevel debug --copy-service

变量 KEEPALIVED_INTERFACE 是指当前节点服务器的网卡名称如果不想开启debug模式去掉--loglevel debug

4. 测试高可用

  • 使用虚拟IP 192.168.1.100 连接ProxySQL 6033端口,读写MySQL数据库
  • 关闭MySQL主节点,查看是否可以继续读写MySQL数据库
  • 关闭某服务器上的ProxySQL服务看下是否可以继续读写MySQL数据库
  • 重新测试,直接关闭一台服务器或者拔掉一台服务器的网线继续查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu22.04之禁止内核自动更新(二百六十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

2516. 每种字符至少取 K 个 滑动窗口 正难则反

给你一个由字符 a、b、c 组成的字符串 s 和一个非负整数 k 。每分钟,你可以选择取走 s 最左侧 还是 最右侧 的那个字符。 你必须取走每种字符 至少 k 个,返回需要的 最少 分钟数;如果无法取到,则返回 -1 。 示例 1: …

专注LabVIEW 做好一件事

在一次LabVIEW的系统改造项目中,遇到一个设备,操作手册居然还是基于DOS系统的。不难看出,这套设备虽然年代久远,但背后的技术积淀极为深厚。事实证明,这套系统在业内享有很高的认可度,由国外团队开发&#…

翻译神器大盘点:哪些软件让语言障碍不再是问题

如果你渴望提升外文阅读能力,却面临外语基础薄弱的挑战,不必过于担心。幸运的是,当前科技为我们提供了诸多便捷的解决方案——翻译工具。比如百度在线翻译这些工具功能强大,极大地拓宽了我们在日常生活与学习中的语言应用边界。 …

PHP轻松创建高效收集问卷调查小程序系统源码

轻松创建,高效收集 —— 问卷调查小程序,你的调研神器! 一、告别繁琐,一键开启调研之旅 还在为设计问卷、收集数据而头疼不已吗?现在,有了“问卷调查小程序”,一切都变得轻松简单!无…

戏曲文化苑管理系统小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,操作日志管理,基础数据管理,公告管理,戏曲管理,用户管理,轮播图信息 微信端账号功能包括:系统首页&#…

向改变技术世界的“导师们”致敬

在教师节这个特殊的日子里,我们通常向那些在课堂上辛勤工作的教师表达敬意,但在技术领域,也有一些导师通过他们的思想、发明和贡献,深刻改变了我们的世界。今天,让我们向那些改变技术世界的导师们致敬,他们…

VUCA时代与传统企业数字化转型

VUCA时代是一个具有现代概念的词,它代表了当前社会和经济环境的一种普遍特征。VUCA是Volatility(易变性)、Uncertainty(不确定性)、Complexity(复杂性)和Ambiguity(模糊性&#xff0…

C#笔记8 线程是什么?多线程怎么实现和操作?

这和前面的学习内容可能有点不太连贯,但是呢我们一般来说的学习就是遇到什么困难就去学习什么,这也是为什么看那些循序渐进的教程虽然学的很饱满,但是我们有时会学了前面忘记了后面,或者对某个板块理解不深,乃至于写代…

递归搜索与回溯专题篇二

目录 N皇后 有效的数独 解数独 单词搜索 黄金矿工 不同路径III N皇后 题目 思路 根据题意可知,要想得到n皇后的摆放方案,结果须满足每一行及每一列都只有一个皇后,且每个主对角线和副对角线上只能有一个皇后,我们的做法是&…

STM32单片机 定时器TIM输出比较 PWM波形

一. OC(Output Compare)输出比较 了解:IC(Input Capture)输入捕获、CC(Capture/Compare)输入捕获和输出比较单元功能:用来输出PWM波形,PWM波形又是用来驱动电机的必要条…

2008-2022年各省环境污染综合指数数据(含原始数据+计算结果)

2008-2022年各省环境污染综合指数数据(含原始数据计算结果) 1、时间:2008-2022年 2、来源:统计年鉴、各省年鉴、环境年鉴 3、指标:省份、年份、废水排放总量(万吨)、废气中二氧化硫排放量&am…

系统架构设计师 - 系统可靠性分析与设计

系统可靠性分析与设计 系统可靠性分析与设计(论文写作)可靠性相关基本概念 ★★系统可靠性分析 ★★★★可靠性指标串联系统与并联系统 软件可靠性设计 ★★★★影响软件可靠性的主要因素可靠性设计策略N 版本程序设计防卫式程序设计 双击容错 大家好呀&…

公共场所团队管理-手机端源码讲解--SAAS本地化及未来之窗行业应用跨平台架构

一、团队自主注册码 二、代码 var 二维码 "未来之窗?url"encodeURIComponent(url);var 图片 "<img src"二维码">";CyberWin_Dialog.layer(图片,{type:"frame",title:title,width:"320px",height:"320px"…

从阅读到编辑,全方位PDF编辑器软件功能探索

你现在收到的文件是不是大部分也都是PDF格式的&#xff1f;这个格式可以完整的保存任意Office软件制作文档的格式&#xff0c;但是编辑起来就不是那么方便了。这次我汇集了一些我和身边小伙伴常用的类似福昕高级pdf编辑器这样的编辑工具统统分享给你吧。 1.福昕PDF编辑器 链接…

蚁剑webshell连接报错A JavaScript error occurred in the main process

报错如图&#xff1a; 已知解决方式&#xff1a; 将上传shell中文文件名修改为任意的英文文件名即可连接。

数据库体系结构概述

文章目录 1、集中式数据库2、分布式数据库2.1、体系结构2.2、特性2.3、分片方式2.4、透明性2.5、两阶段提交协议 2PC 1、集中式数据库 三级模式 外模式: 也称用户模式&#xff0c;对应 用户视图模式&#xff08;概念模式&#xff09;: 对应数据库表&#xff08;关系表&#xff…

读软件设计的要素06概念完整性

1. 概念完整性 1.1. 当概念组合成一个软件时&#xff0c;它们可以同步以便协调行为 1.1.1. 同步可能会消除一个概念的某些行为&#xff0c;但决不会添加与该概念的规范不一致的新行为 1.1.2. 在使用概念设计软件时&#xff0c;即使你没有精确定义同步&#xff0c;至少要说服自…

二进制方式安装Helm

二进制方式安装Helm 官网&#xff1a;https://helm.sh/ 1、下载安装包 wget -L https://get.helm.sh/helm-v3.16.0-rc.1-linux-amd64.tar.gz2、解压 tar -xf helm-v3.16.0-rc.1-linux-amd64.tar.gz3、移动到/usr/local/bin/目录下 mv linux-amd64/helm /usr/local/bin/he…

ResNet结构图(ResNet18、ResNet50)

原理&#xff1a;利用conv将通道数逐渐增加&#xff0c; 图片尺寸逐渐缩小 ResNet18结构图 ResNet18中的"18"指的是网络中的加权层数量。具体来说&#xff0c;它包含了18个卷积层和全连接层。 ResNet18的架构包括&#xff1a; 1个7x7卷积层16个3x3卷积层&#xf…