Centos7 部署 VerneMQ 高可用集群

news2024/11/15 20:01:42

1.简要说明

1.1概述

VerneMQ首先是一个MQTT发布/订阅消息代理,它实现了OASIS行业标准MQTT协议;但是,VerneMQ还旨在通过提供一组与可扩展性,可靠性和高性能以及操作简单性相关的独特功能,将消息传递和物联网应用程序提升到一个新的水平;它使用无主集群技术,当不可避免的基础架构更改或维护窗口需要添加或删除节点时,没有像主节点或从节点这样的特殊节点需要考虑;它在普通硬件上水平和垂直扩展,以支持大量并发发布者和使用者,同时保持低延迟和容错能力。是物联网平台或智能产品的可靠消息中心。

1.2特性

1.VerneMQ完全开放源码,基于Apache License2.0开源协议,采用Erlang/OTP平台开发,支持故障隔离和容错,内置的可扩展指标,便于与第三方系统集成,无任何形式限制、无服务节点数量限制、无时间限制、无并发限制,并可提供商业支持
​
2.VerneMQ支持自定义插件,通过Lua脚本来扩充能力,也可以随时替换VerneMQ,可以在任何实现MQTT规范的broker上运行
​
3.数据持久化(基于LevelDB),支持基于文、数据库(PostgreSQL、MySQL、Redis和MongoDB)的身份验证和授权
​
4.支持数据桥接,MQTT/WebSocket/TCP/SSL连接支持,会话平衡、消息负载,避免消息过载(用于系统保护),当队列中数据大于配置量,将进行消息丢弃,支持队列数据FIFO或LIFO处理方式
​
5.完整的MQTTV3.1/V3.1.1及V5.0协议规范支持,支持QoS0、QoS1、QoS2服务级别,支持系统主题($SYS)、共享订阅
​
6.支持集群,使用无主集群技术
​
7.支持集成Graphite 、Prometheus监控

1.3架构

VerneMQ采用Erlang实现,Erlang旨在支持高并发和高可用性(容错)系统,数据副本采用Plumtree协议实现,MQTT中的保留消息是使用主题作为键存储在代理上的消息,每当客户端订阅该特定主题时,代理都会发送该消息的副本,设计和构建从Basho构建和打包Riak数据库的方式以及Plumtree中借鉴了很多,主题trie路由算法完全参考RabbitMQ MQTT插件,采用LevelDB作为数据持久化存储。

1.4关于MQTT

#什么是MQTT?
MQTT是一种消息队列传输协议。
MQTT协议是基于TCP的。
MQTT的优点在于以极少的代码及带宽资源,为远程设备提供可靠的消息服务。
MQTT是一种低开销的即时通讯协议。
​
#MQTT协议中三种身份
发布者(Publish)
代理(Broker)(服务器)
订阅者(Subscribe)
​
#MQTT传输的消息
主题(Topic):可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
负载(payload):可以理解为消息的内容,是指订阅者具体要使用的内容

2.安装

        12 和 21 两台机器都操作

2.1目录准备

mkdir -p /opt/vernemq
cd /opt/vernemq

2.2下载rpm包

wget https://github.com/vernemq/vernemq/releases/download/1.12.3/vernemq-1.12.3.centos7.x86_64.rpm

2.3安装

rpm -ivh vernemq-1.12.3.centos7.x86_64.rpm

3.配置文件

3.1备份

cp /etc/vernemq/vernemq.conf /etc/vernemq/vernemq.conf.bak

3.2修改配置文件

        10.0.61.12 配置文件,内容如下:

$ vim /etc/vernemq/vernemq.conf
accept_eula = yes
allow_anonymous = off
allow_register_during_netsplit = on
allow_publish_during_netsplit = on
allow_subscribe_during_netsplit = on
allow_unsubscribe_during_netsplit = on
allow_multiple_sessions = off
coordinate_registrations = on
max_inflight_messages = 20
max_online_messages = 1000
max_offline_messages = 1000
max_message_size = 0
upgrade_outgoing_qos = off
listener.max_connections = 10000
listener.nr_of_acceptors = 10
listener.tcp.default = 0.0.0.0:1885
listener.vmq.clustering = 0.0.0.0:44053
listener.http.default = 10.0.61.12:8787
systree_enabled = on
systree_interval = 20000
graphite_enabled = off
graphite_host = localhost
graphite_port = 2003
graphite_interval = 20000
shared_subscription_policy = prefer_local
plugins.vmq_passwd = on
plugins.vmq_acl = on
plugins.vmq_diversity = off
plugins.vmq_webhooks = off
plugins.vmq_bridge = off
topic_max_depth = 10
metadata_plugin = vmq_swc
vmq_acl.acl_file = /etc/vernemq/vmq.acl
vmq_acl.acl_reload_interval = 10
vmq_passwd.password_file = /etc/vernemq/vmq.passwd
vmq_passwd.password_reload_interval = 10
vmq_diversity.script_dir = /usr/share/vernemq/lua
vmq_bcrypt.pool_size = 1
log.console = file
log.console.level = info
log.console.file = /var/log/vernemq/console.log
log.error.file = /var/log/vernemq/error.log
log.syslog = off
log.crash = on
log.crash.file = /var/log/vernemq/crash.log
log.crash.maximum_message_size = 64KB
log.crash.size = 10MB
log.crash.rotation = $D0
log.crash.rotation.keep = 5
nodename = vmqnode1@10.0.61.12
distributed_cookie = vmq
erlang.async_threads = 64
erlang.max_ports = 262144
leveldb.maximum_memory.percent = 70

        10.0.61.21 配置文件,内容如下:

$ vim /etc/vernemq/vernemq.conf
accept_eula = yes
allow_anonymous = off
allow_register_during_netsplit = on
allow_publish_during_netsplit = on
allow_subscribe_during_netsplit = on
allow_unsubscribe_during_netsplit = on
allow_multiple_sessions = off
coordinate_registrations = on
max_inflight_messages = 20
max_online_messages = 1000
max_offline_messages = 1000
max_message_size = 0
upgrade_outgoing_qos = off
listener.max_connections = 10000
listener.nr_of_acceptors = 10
listener.tcp.default = 0.0.0.0:1885
listener.vmq.clustering = 0.0.0.0:44053
listener.http.default = 10.0.61.21:8787
systree_enabled = on
systree_interval = 20000
graphite_enabled = off
graphite_host = localhost
graphite_port = 2003
graphite_interval = 20000
shared_subscription_policy = prefer_local
plugins.vmq_passwd = on
plugins.vmq_acl = on
plugins.vmq_diversity = off
plugins.vmq_webhooks = off
plugins.vmq_bridge = off
topic_max_depth = 10
metadata_plugin = vmq_swc
vmq_acl.acl_file = /etc/vernemq/vmq.acl
vmq_acl.acl_reload_interval = 10
vmq_passwd.password_file = /etc/vernemq/vmq.passwd
vmq_passwd.password_reload_interval = 10
vmq_diversity.script_dir = /usr/share/vernemq/lua
vmq_bcrypt.pool_size = 1
log.console = file
log.console.level = info
log.console.file = /var/log/vernemq/console.log
log.error.file = /var/log/vernemq/error.log
log.syslog = off
log.crash = on
log.crash.file = /var/log/vernemq/crash.log
log.crash.maximum_message_size = 64KB
log.crash.size = 10MB
log.crash.rotation = $D0
log.crash.rotation.keep = 5
nodename = vmqnode2@10.0.61.21
distributed_cookie = vmq
erlang.async_threads = 64
erlang.max_ports = 262144
leveldb.maximum_memory.percent = 70

        配置文件解释:

##软件使用协议,默认是no,改为yes才能正常使用
accept_eula = yes

##是否开启匿名访问,开启匿名访问后将不验证用户名以及密码,默认为off
allow_anonymous = off

##即使VerneMQ集群不一致,也允许新的客户端连接,默认为off
allow_register_during_netsplit = off

##即使VerneMQ集群不一致,也会发布消息,默认为off
allow_publish_during_netsplit = off

##即使VerneMQ集群不一致,也允许新订阅,默认为off
allow_subscribe_during_netsplit = off

##允许客户端在 VerneMQ 集群不一致时取消订阅,默认为off
allow_unsubscribe_during_netsplit = off

##允许客户端使用同一客户端多次登录,默认为off
allow_multiple_sessions = off

##客户端注册可以以协调或不协调的方式进行;未协调的注册速度更快,并将导致具有相同客户端id的其他客户端最终断开连接,而协调的注册确保具有相同客户端id的任何其他客户端将立即断开连接,默认为on
coordinate_registrations = on

##处理的QoS1或2消息的最大数量,设置为0表示没有最大值
max_inflight_messages = 20

##队列中当前正在传输的消息上方要保留的最大消息数。默认值为1000。设置为-1表示无最大值;此选项允许控制特定客户端会话如何处理消息突发;作为一般经验法则,将此数字设置为比单个消费者需要处理的预期消息速率稍高;注意,将此值设置为0将完全阻止来自任何队列的传递
max_online_messages = 1000

##脱机队列中保留的QoS1或2消息的最大数量;默认值为1000。设置为-1表示没有最大值。如果不应脱机存储邮件,则设置为0
max_offline_messages = 1000

##此选项设置VerneMQ允许的最大MQTT大小;VerneMQ将不接受超过此大小的消息;默认值为0,这意味着接受所有有效的MQTT消息
max_message_size = 0

##如果发布的消息的QoS低于其发送的订阅的QoS,VerneMQ可以升级传出的QoS
upgrade_outgoing_qos = off

##listener.tcp.buffer_size是三个整数(sndbuf、recbuf、buffer)的列表,分别指定erlang驱动程序中的内核TCP发送缓冲区、内核TCP接收缓冲区和用户级缓冲区大小;建议使用val(用户级缓冲区)>=val(接收缓冲区),以避免由于不必要的复制而导致性能问题;如果未设置,则使用操作系统默认值
## listener.tcp.buffer_sizes = 4096,16384,32768

##定义最大并发连接数的整数或“无穷大”
listener.max_connections = 10000

##设置等待同时接受新连接的接收器的数量
listener.nr_of_acceptors = 10

##配置MQTT可连接地址以及端口
## - listener.tcp.default = 127.0.0.1:1883
## - listener.tcp.internal = 127.0.0.1:10883
## - listener.tcp.my_other_listener = 127.0.0.1:10884
##也适用于SSL侦听器和WebSocket处理程序:
## - listener.ssl.default = 127.0.0.1:8883
## - listener.ws.default = 127.0.0.1:800
## - listener.wss.default = 127.0.0.1:880
listener.tcp.default = 0.0.0.0:1885

##服务器内网ip,集群通讯端口
##如果设置成外网ip集群之间将无法通讯
listener.vmq.clustering = 0.0.0.0:44053

##web监控页面地址及端口
listener.http.default = 10.0.61.12:8787

##启用$SYSTree报表程序
systree_enabled = on

##$SYS订阅层次结构更新之间的整数毫秒数,它提供有关代理的状态信息;如果未设置,则默认为20秒;设置为0可完全禁用发布$SYS层次结构
systree_interval = 20000

##启用Graphite Reporter图形
graphite_enabled = off

##服务器主机名
graphite_host = localhost

##graphitetcp端口
graphite_port = 2003

##向graphite推送指标的时间间隔
graphite_interval = 20000

##共享订阅的分发策略;默认值为preferr_local,这将确保如果有可用的本地订户,将使用本地订户local_only将选择一个随机本地订户
shared_subscription_policy = prefer_local

##如果未开启匿名访问,就需要为Vernemq添加相关的账号密码
plugins.vmq_passwd = on

##配置topic的读写权限,默认状态下允许所有用户对所有的topic可读写;但安全和规范起见,建议规定各任务之间不同的topic并对权限加以控制
plugins.vmq_acl = on

##基于Lua的插件
plugins.vmq_diversity = off

##基于Webhook的插件
plugins.vmq_webhooks = off

##VerneMQ网桥插件
plugins.vmq_bridge = off

##限制最大主题深度
topic_max_depth = 10

##指定用于存储和复制VerneMQ元数据对象的元数据插件,为与现有部署兼容,默认值保持在vmq_plumtree,对于新的集群部署,建议从一开始就使用vmq_swc,请注意,这两种协议不兼容,因此不能混合使用集群
metadata_plugin = vmq_swc

##访问控制列表文件的路径
vmq_acl.acl_file = ./etc/vmq.acl

##设置acl重新加载间隔,值0将禁用acl文件的自动重新加载
vmq_acl.acl_reload_interval = 10

##密码文件的路径
vmq_passwd.password_file = ./etc/vmq.passwd

##设置密码重新加载间隔,值0将禁用密码文件的自动重新加载
vmq_passwd.password_reload_interval = 10

##配置vmq_dersity插件脚本目录;在脚本目录中搜索Lua脚本,这些脚本在插件启用时自动加载
vmq_diversity.script_dir = ./share/lua

##是否启用数据库
vmq_diversity.auth_postgres.enabled = off

##指定postgresql驱动程序是否应使用TLS
vmq_diversity.postgres.ssl = off

##PostgreSQL中使用的密码哈希方法
vmq_diversity.postgres.password_hash_method = crypt

##
vmq_diversity.auth_cockroachdb.enabled = off

##指定cockrachdb驱动程序是否应使用TLS
vmq_diversity.cockroachdb.ssl = on

##CockrochDB中使用的密码哈希方法
vmq_diversity.cockroachdb.password_hash_method = bcrypt

##
vmq_diversity.auth_mysql.enabled = off

##mysql中使用的密码哈希方法
vmq_diversity.mysql.password_hash_method = password

## 
vmq_diversity.auth_mongodb.enabled = off

##指定mongodb驱动程序是否应使用TLS
vmq_diversity.mongodb.ssl = off

##
vmq_diversity.auth_redis.enabled = off

##pool_size指定同时允许的bcrypt操作数,auto将尝试检测所有逻辑cpu,并将池大小设置为该值,如果无法检测到逻辑CPU的数量,则使用值1
vmq_bcrypt.pool_size = 1

##发出默认日志消息的位置
##关闭:已禁用
##文件:由 log.console.file 指定的文件
##控制台:到标准输出(使用“vmq 附加直接”时可见)
##两者:log.console.file 和 standard out
log.console = file

##控制台日志的严重级别,默认为“info”
log.console.level = info

##console设置为file或both,即记录控制台消息的文件
log.console.file = ./log/console.log

##错误日志路径
log.error.file = ./log/error.log

##设置为on时,将日志输出到syslog
log.syslog = off

##启用崩溃日志
log.crash = on

##如果启用了崩溃日志,则将写入以下路径
log.crash.file = ./log/crash.log

##崩溃日志中单个消息的最大字节数
log.crash.maximum_message_size = 64KB

##旋转前崩溃日志的最大大小
log.crash.size = 10MB

##旋转崩溃日志的计划
log.crash.rotation = $D0

##要保留的循环崩溃日志数
log.crash.rotation.keep = 5

##集群中节点名称
nodename = vmqnode1@10.0.61.12

##用于分布式节点通信的Cookie,同一集群中的所有节点都应该使用相同的cookie,否则它们将无法通信
distributed_cookie = vmq

##设置异步线程池中的线程数,有效范围为0-1024;如果线程支持可用,则默认值为64
erlang.async_threads = 64

##并发端口的数量
erlang.max_ports = 262144

##分配给LevelDB的总服务器内存的百分比
leveldb.maximum_memory.percent = 70

3.3添加账号密码

        如果开启了匿名访问(allow_anonymous = off),就不需要添加

$ vmq-passwd -c /etc/vernemq/vmq.passwd admin

账户:admin
密码:admin123

3.4配置topic

        默认状态下允许所有用户对所有的topic可读写,但为了安全和规范起见,建议规定各任务之间不同的topic并对权限加以控制

#配置文件路径:
/etc/vernemq/vmq.acl

##topic [read|write] <topic>

#举例
user admin(用户)
topic test(主题)
topic read test(主题阅读)
topic write open_to_all(主题写入)

4.启动

4.1启动vernemq

$ systemctl start vernemq

 

4.2添加nginx配置

upstream vernemq{
   server 10.0.61.12:8787;
   server 10.0.61.21:8787;
} 
    
server {
    listen 8087;
    server_name localhost;

    location / {
            proxy_pass http://vernemq;
            proxy_next_upstream error timeout invalid_header http_500 http_403 http_404 non_idempotent;
            proxy_next_upstream_timeout 0;
            proxy_next_upstream_tries 0;
            proxy_connect_timeout 30s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
            index index.html index.htm;
    }
}

4.3加入集群

        10.0.61.21 加入集群

$ vmq-admin cluster join discovery-node=vmqnode2@10.0.61.21

        web监控页面地址

http://10.0.61.22:8087/status

        查看集群信息

$ vmq-admin cluster show

         到此 Centos7 部署 VerneMQ 高可用集群介绍完成。

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

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

相关文章

Dynamics 365Online 应用内消息通知(In-app notifications)

应用内通知其实一直是个刚需&#xff0c;但D365一直缺乏这个功能&#xff0c;如果客户有需求&#xff0c;我们只有通过自定义的方式实现&#xff0c;好在V9以后顶部栏可以自定义了&#xff0c;可以自己加Icon&#xff0c;实现通知的样式。 好在2022WAV1后&#xff0c;D365终于加…

喜讯丨上海首家代谢组学技术研究民非机构-上海百趣代谢组学技术研究中心获批成立

经上海市科学技术委员会批复同意组建&#xff0c;由上海市民政局审批&#xff0c;上海百趣代谢组学技术研究中心正式成立。上海百趣代谢组学技术研究中心将联合科研单位、相关企业&#xff0c;共同推动代谢组学技术研究在检测方法、分析方法、检测仪器和数据库标准化方面的进步…

景联文科技:一文详解!如何选择一家专业的数据标注公司?

“近年来&#xff0c;人工智能发展速度迅速&#xff0c;三大决定性因素是&#xff1a;算法、算力和数据&#xff0c;数据是人工智能的基础。数据标注的精确度是行业内的一大重点&#xff0c;随着人工智能技术的不断成熟&#xff0c;对场景化数据的精确度要求将越来越高&#xf…

[附源码]Python计算机毕业设计Django游戏论坛网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

ChatGPT能否取代Google、Baidu,成为下一代搜索引擎?一文了解最近火出圈的ChatGPT

前 言 OpenAI这家公司又放大招了&#xff0c;继发布GPT、GPT2和GPT3模型后&#xff0c;本月初发布了ChatGPT模型【也被称为GPT3.5】&#xff0c;结合大家的测试效果来看&#xff0c;该模型效果确实很震撼&#xff0c;在人工智能圈子引起了不小的轰动。在AI发展相对处于低谷期的…

华为机试 - 机器人

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 现有一个机器人&#xff0c;可放置于 M N 的网格中任意位置&#xff0c;每个网格包含一个非负整数编号&#xff0c;当相邻网格的数字编号差值的绝对值小于等于 1 时&#xff0c;机器人可以在网格间移…

原生API编写简单富文本编辑器002

原生API编写简单富文本编辑器002 1. 为功能按钮添加点击事件 我们在index.js 中为所有功能按钮添加点击事件监听&#xff0c;在点击对应按钮时执行相应的原生命令。 window.onload function() {const btns document.getElementById(editorBar).getElementsByTagName(li);fo…

centos7安装xfce桌面后,桌面空白,只有openbox功能,解决办法

因为有openbox和图标桌面 两个模式 在登录时,输入密码,下一步,旁边<齿轮按钮>,选择 图标桌面,再登录 前期centos7安装xfce步骤 yum update yum install epel-release -y yum groupinstall -y “X Window system” yum grouplist //查看是否有xfce yum groupinstall -y …

ClickHouse在自助行为分析场景的实践应用

导读 公司每日产生海量数据&#xff0c;按业务需要进行统计产出各类分析报表&#xff0c;但巨大的数据量加上复杂的数据模型&#xff0c;以及个性化的分析维度&#xff0c;采用传统的离线预计算方式难以灵活支持&#xff0c;为此需引入一种满足实时多维分析场景的计算引擎框架…

Linux基础IO

基础IO&#x1f3de;️1. 系统文件I/O&#x1f4d6;1.1 接口介绍&#x1f4d6;1.2 creat系统调用&#x1f4d6;1.3 理解fd文件描述符&#x1f4d6;1.4 不按顺序的读取和写入&#x1f4d6;1.5 文件重命名&#x1f301;2. 理解Linux下一切皆文件&#x1f320;3. 理解重定向&#…

5G LAN赋能智慧工厂加速落地,四信5G工业路由器成最佳助攻

近年来&#xff0c;随着5G技术的蓬勃发展&#xff0c;信息技术与企业发展更加紧密结合已经成为未来企业发展的主要趋势。而作为“新基建”的代表&#xff0c;5G与工业网络的融合无疑成为未来5G网络的一个重要应用场景。 然而&#xff0c;在传统的工厂制造中&#xff0c;大多数设…

Java基础-面向对象综合练习-拼图游戏

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面&#xff0c;写一个项目&#xff0c;知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello&#xff0c;各位大家好。今天&#xff0c;我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们先来…

ADI Blackfin DSP处理器-BF533的开发详解5:PLL配置内核和系统时钟(含源代码)

又是一个熟悉的名词&#xff0c;PLL。 硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 PLL(Phase Locked Loop)是 ADSP-BF53x 的内核和时钟设置的机制&#xff0c;叫做锁相环。通过 P…

论文阅读笔记 | 三维目标检测——CenterPoint算法

如有错误&#xff0c;恳请指出。 文章目录0. 前言1. 背景2. 准备工作3. 网络结构3.1 RPN3.2 RCNN4. 实验结果paper&#xff1a;《Center-based 3D Object Detection and Tracking》&#xff08;2021CVPR&#xff09; 0. 前言 CenterPoint应该是与CenterNet是同一个团队的成果…

[附源码]Python计算机毕业设计Django在线项目管理

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

庄懂的TA笔记(十一)< >

庄懂的TA笔记&#xff08;十一&#xff09;&#xff1c; &#xff1e; 目录&#xff1a; 一、shader面板玩法 > 增广 : 多种 面板设计玩法&#xff1a; 二、shader参数类型 > 增广 &#xff1a;认识 多种参数类型 &#xff1a; 三、增广 &#xff1a;认识 IVO …

体验一下传说中可以干掉程序员的OpenAI ChatGPT

ChatGPT初体验 ​ OpenAI公司最近开发了一个新的聊天AI模型&#xff0c;ChatGPT。网上铺天盖地传言AI可以替代程序员。于是今天也来体验了一下。下面是一个使用的案例&#xff1a; ​ 首先看来他也不是万能的。 问&#xff1a; 今年世界杯冠军预测 ChatGPT: 对于世界杯的冠军…

【20221208】【排序专题】

一、冒泡排序&#xff08;稳定排序&#xff09; 思想&#xff1a;冒泡排序的思想就是比较当前数和后一个数的大小&#xff0c;将较大的数往后移动&#xff0c;这样可以确保一轮下来能将最大的数放在数组的最末端。然后重复此操作即可完成排序。 上面第一轮比较完&#xff0c;我…

VSCode无法远程连接VMWare(Ubuntu)其中一个可能原因(inet消失)

有时候把虚拟机挂起后&#xff0c;等自己下次再想用&#xff0c;打开vscode用之前的ssh配置&#xff0c;却始终无法连接&#xff0c;进程sshd也是开启的&#xff0c;就很纳闷。 然后么&#xff0c;咱就想查查是不是网络的问题&#xff0c;毕竟ssh是通过ipv4连的虚拟机&#xff…

【explain执行计划】MySQL性能调优

explain是MySQL性能调优过程中必须掌握的工具&#xff0c;explain结果中常见的type结果及代表的含义&#xff0c;并且通过同一个SQL语句的性能差异&#xff0c;说明建立正确的索引多么重要。 explain结果中的type字段代表什么意思&#xff1f; MySQL的官网解释非常简洁&#x…