2022-04-10 11:35:15
摘要:★★★★★★http://www.rabbitmq.com/which-erlang.html (rabbitmq和erlang版本对应表)
RabbitMQ 群集安装(每一台机器都操作)
一、环境描述
1、操作系统
主机名
IP地址
操作系统版本
erlang 版本
rabbitmq 版本
192.168.3.99
node02
CentOS Linux release 7.4.1708 (Core)
21.0
3.7.7
192.168.3.100
node01
CentOS Linux release 7.4.1708 (Core)
21.0
3.7.7
192.168.3.222
node03
CentOS Linux release 7.4.1708 (Core)
21.0
3.7.7
2、设置linux静态IP+
命令:
# cd /etc/sysconfig/network-scripts/
# vim ifcfg-ens33
修改内容为:
TYPE=Ethernet
PROXY_METHOD=none
BOOTPROTO=static #静态IP
BROWSER_ONLY=no
DEFROUTE=yes
IPADDR=192.168.1.189 #调整
NETMASK=255.255.255.0 #调整
GATEWAY=192.168.1.1 #调整
DNS1=202.106.0.20 #调整
DNS2=8.8.8.8
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=312fb2fd-eade-4e6f-8abb-5602fc8d2da4
DEVICE=ens33
ONBOOT=yes # 支持静态IP
修改完毕后:执行命令:
# service network restart
重启网卡:
# systemctl restart network
3.关闭防火墙
查看防火墙:
# systemctl status firewalld.service
开……
阅读全文
2022-04-09 11:18:54
摘要:
一、消息队列的核心价值
应用场景
异步处理:电商订单支付成功后,异步通知库存系统扣减,避免主流程阻塞。
削峰填谷:秒杀活动瞬间高并发请求先入队,后端按处理能力消费,保护系统稳定性。
系统解耦:支付系统与物流系统通过消息传递数据,无需直接接口调用。
核心概念
生产者(Producer):发送消息的程序(如订单系统)。
消费者(Consumer):接收消息的程序(如库存系统)。
队列(Queue):消息的缓冲存储区,遵循先进先出(FIFO)原则。
二、主流消息队列产品对比
产品
特点
适用场景
RabbitMQ
基于AMQP协议,支持灵活的路由规则(交换机)、消息确认机制,功能全面
复杂业务逻辑、企业级应用
Kafka
高吞吐、持久化、分布式设计,支持百万级TPS
日志采集、实时流处理
RocketMQ
阿里开源,低延迟、高可用,专为金融场景优化
电商交易、大规模事务消息
Redis List
轻量级,基于内存操作,无高级特性(如重试、持久化)
简单任务队列、缓存场景
三、消息模型深度解析
队列模型(P2P)
单消费者消费消息,适用于订单支付、库存扣减等需严格顺序的场景。
发布-订阅模型(Pub/Sub)
典型应用:新闻推送、用户行为广播(如积分系统、数据分析系统同时消费)。
交换机模式——RabbitMQ特有
四、AMQP协议
AMQP核心组件
交换机(Exchange):接收生产者消息,按规则路由到队列(直连、广播、主题等模式)。
队列(Queue):临时存储消息的容器。
绑定(Binding):定义交换机与队列的映射关系。
工作流程
建立连接
选择/创建虚拟主机
创建交换机和队列
绑定交换机和队列
发布消息
路由消息
消息消费
消息确认 ACK
断开连接
五、RabbitMQ实战
1. RabbitMQ部署
docker run -d \
--name rabbit-01 \
--hostname my-rabbit \
-p 5672:5672 \ # AMQP端口
-p 15672:15672 \ # 管理界面端口
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=passw……
阅读全文
2022-04-02 21:34:55
摘要:一、MongoDB核心概念
1. 定位与优势
目标:处理海量数据(名称源自humongous),支持高可用、水平扩展。
数据模型:
JSON文档结构:天然贴合面向对象思想,支持嵌套对象和数组。
动态模式:使用BSON(JSON的二进制扩展)存储,支持日期、二进制等扩展类型。
核心优势:
易用性:类JSON语法降低学习成本。
高性能:内存映射引擎、写优化设计。
高可靠性:副本集自动故障转移。
高扩展性:原生分布式架构(分片集群)。
2. SQL vs MongoDB概念对比
关键差异:MongoDB属于半结构化数据模型,无固定表结构,不支持事务级JOIN。
二、基础操作实战
1. 集合与文档操作
// 创建/切换数据库
use sample
// 插入文档
db.persons.insertOne({ name: 张三, age: 22 })
db.persons.insertMany([...])
// 查询文档
db.movies.find( { year : 1975 } ) //单条件查询
db.movies.find( { year : 1989, title : Batman } ) //多条件and查询
db.movies.find( { $and : [ {title : Batman}, { category : action }] } ) // and的另一种形式
db.movies.find( { $or: [{year : 1989}, {title : Batman}] } ) //多条件or查询
db.movies.find( { title : /^B/} ) //按正则表达式查找
// 更新与删除
db.persons.updateMany({ age: 22 }, { $set: { status: active }})
db.persons.deleteMany({ age: { $lt: 18 }})
db.runCommand({ drop: persons }) // 删除集合
2. 查询条件对照表
SQL
MQL
a = 1
{ a: 1 }
a 1
{ a: { $ne: 1 } }
a 1
{ a: { $gt: 1 } }
a = 1
{ a: ……
阅读全文
2022-03-26 14:47:44
摘要:前提条件
在开始之前,请确保您已经准备好了 redis-cluster 文件夹,内部包含 docker-compose.yml 和 redis.conf 文件。
创建哨兵配置文件 (sentinel.conf)
在 redis-cluster 文件夹中,新建一个名为 sentinel.conf 的文件。
将以下配置内容复制并粘贴到 sentinel.conf 文件中。
# 哨兵监控的主节点信息
# 格式: sentinel monitor master-name ip port quorum
# name: 自定义的集群名称,例如 myredis
# ip: 主节点的IP、主机名、容器名
# port: 主节点的端口 6379
# quorum: 法定人数。表示至少需要多少个哨兵同意,才能判定主节点下线。3个哨兵建议设置为2
sentinel monitor myredis 6379 2
# 主节点连接密码。这必须与您在 redis.conf 中设置的 requirepass 和 masterauth 密码一致
# 格式: sentinel auth-pass master-name password
sentinel auth-pass myredis 123456
# 判定主节点下线的时长(毫秒)
# 如果主节点在30秒内没有响应,哨兵就认为它主观下线
# 格式: sentinel down-after-milliseconds master-name milliseconds
sentinel down-after-milliseconds myredis 30000
# 故障转移超时时间(毫秒)
# 当故障转移开始后,若超过此时间还未完成,则视为失败
# 格式: sentinel failover-timeout master-name milliseconds
sentinel failover-timeout myredis 180000
# 执行故障转移时,最多可以有多少个从节点同时对新的主节点进行同步
# 设置为 1 表示一次只有一个从节点进行同步,避免对新主节点造成过大压力
# 格式: sentinel parallel-syncs master-name num-slaves
sentinel parallel-syncs myre……
阅读全文
2022-03-25 15:08:57
摘要:概述
本指南将引导你完成以下步骤:
创建项目文件夹和必要的配置文件。
编写 docker-compose.yml 文件来定义一主两从三个 Redis 服务。
启动并验证 Redis 集群。
测试主从数据同步。
第一步:创建项目目录和文件
首先,在你电脑的任意位置(例如 D:\ 盘)创建一个新的文件夹,用来存放本次项目的所有文件。我们将其命名为 redis-cluster。
进入 redis-cluster 文件夹,在内部创建以下两个文件:
docker-compose.yml (用于编排 Docker 容器)
redis.conf (Redis 实例的配置文件)
创建完成后,你的文件夹结构应该如下所示:
redis-cluster/
├── docker-compose.yml
└── redis.conf
第二步:编写 docker-compose.yml 文件
用文本编辑器打开 docker-compose.yml 文件,并将以下内容复制进去。
version: '3.8'
services:
# 主节点服务
redis-master:
image: redis
container_name: redis-master
restart: always
ports:
- 6379:6379
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf # 挂载配置文件
command: redis-server /usr/local/etc/redis/redis.conf # 使用该配置启动
networks:
- redis-net
# 第一个从节点服务
redis-slave1:
image: redis
container_name: redis-slave1
restart: always
ports:
- 6380:6379
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/……
阅读全文
2022-03-24 13:16:49
摘要:一、知识点汇总
基础篇
功能特点介绍
系统架构
线程模型
单线程模式
多IO线程模式
入门篇
服务端与客户端
数据类型介绍和基础用法
在.net中使用Redis
持久化篇
AOF日志
AOF配置与日志文件
回写策略
重写机制
RDB快照
RDB配置
快走频率选择
混合持久化
高可靠篇
主从集群模式
设置主从同步
主从同步的三个阶段
主从级联模式
主从集群故障问题
哨兵模式
哨兵机制基本流程
主观下线与客观下线
选主策略
缓存篇
基础概念
缓存命中
缓存缺失
旁路缓存
缓存淘汰策略
随机策略
TTL过期策略
LRU算法策略
LFU算法策略
缓存异常
缓存不一致
缓存雪崩
缓存击穿
缓存穿透
缓存污染
二、基础篇
Redie特点
高性能:极低的延迟和极高的吞吐量
数据结构多样性:value支持丰富的数据结构
持久化:数据可以保存在硬盘
高可用性:主从复制、哨兵机制
发布订阅:
可扩展性:数据分片
系统架构
线程模型
Redis采用单线程模型,每秒10万级别处理能力
避免多线程的并非控制问题,主要是共享资源的访问,互斥锁(粗颗粒)
多路复用机制(网络IO)
IO多路复制机制:一个线程处理多个IO流
允许系统内核同时存在多个套接字(监听、已连接)
系统内核:事件回调机制
医院:病人(请求)----分诊台(内核监听)----转交给医生
一个医生(单线程)
Redis 6.0线程模型----加入了多IO线程模式----主要用于网络请求(网络IO,底层太快、单线程跟不上)
多线程默认关闭
config set io-threads-do-reads yes
config set io-threads 4 (cup核心数-2)
三、入门篇
基础数据类型(5种)
String字符串:任何形式的字节数据、二进制数据、单个数据最大512M
Hash哈希:字典、Map、专门用来存储对象:字段/值 对
List列表:有序的字符串元素集合(双向链表结构)、头部尾部高效插入、删除和访问、实现队列(先进先出)、栈(先进后出)
Set集合:无序且元素唯一的字符串集合
Sorted Set有序集合:元素唯一的字符串集合、每个元素关联一个分数(Score)、根据分数排序
特殊数据结构
BItm……
阅读全文
2021-11-14 11:12:25
摘要:一、基础概念
1. 聚集索引(Clustered Index)
结构特点
数据存储:
聚集索引决定了表中数据的物理存储顺序。
表中的每一行数据都会按照聚集索引的键值进行排序存储。
叶节点:
聚集索引的叶节点包含实际的数据行。
叶节点的数据行是按照聚集索引的键值连续存储的。
唯一性:
每个表只能有一个聚集索引。
聚集索引的键值必须是唯一的,除非在创建时允许重复键值(通过 ALLOW_ROW_LOCKS 和 ALLOW_PAGE_LOCKS 选项)。
存储效率:
由于数据按照键值连续存储,聚集索引在范围查询和排序操作中非常高效。
如果表中有大量数据,聚集索引的维护成本相对较高,因为插入、删除和更新操作需要重新排列数据。
使用场景
范围查询:
适用于需要频繁进行范围查询(如 BETWEEN、、)的表。
排序和分组:
适用于需要频繁进行排序和分组操作的列。
主键:
通常主键会创建为聚集索引,因为主键需要唯一标识每一行数据,并且主键列通常用于范围查询和排序操作。
数据访问模式:
适用于访问模式以顺序访问数据为主的场景。
2. 非聚集索引(Non-Clustered Index)
结构特点
数据存储:
非聚集索引的键值存储的是指向实际数据行的指针。
表中的数据行可以按照插入顺序或其他顺序存储,但非聚集索引提供了一种快速查找数据的方式。
叶节点:
非聚集索引的叶节点包含指向实际数据行的指针。
叶节点的数据行指针是按照非聚集索引的键值排序的。
唯一性:
每个表可以有多个非聚集索引。
非聚集索引的键值可以是唯一的,也可以不唯一。
存储效率:
非聚集索引的维护成本相对较低,因为插入、删除和更新操作不会重新排列实际数据行。
非聚集索引可以提高特定列的查询性能,但对整个表的数据存储没有影响。
使用场景
等值查询:
适用于需要频繁进行等值查询(如 =、IN)的列。
范围查询:
虽然非聚集索引也可以用于范围查询,但效率可能不如聚集索引,尤其是在范围较大时。
排序和分组:
适用于需要频繁进行排序和分组操作的列。
外键:
外键列通常会创建非聚集索引,以提高外键约束的性能。
数据访问模式:
适用于访问模式以随机访问数据为主的场景。
3. 索引优化规则
避免过多索引:
每个表的……
阅读全文
2021-06-05 13:18:50
摘要:一个好的 Commit Message 至关重要:
可以使自己或者其他开发人员能够清晰地知道每个 commit 的变更内容,方便快速浏览变更历史,比如可以直接略过文档类型或者格式化类型的代码变更。
可以基于这些 Commit Message 进行过滤查找,比如只查找某个版本新增的功能:git log --oneline --grep ^feat|^fix|^perf。
可以基于规范化的 Commit Message 生成 Change Log。
可以依据某些类型的 Commit Message 触发构建或者发布流程,比如当 type 类型为 feat、fix 时我们才触发 CI 流程。
确定语义化版本的版本号。比如 fix 类型可以映射为 PATCH 版本,feat 类型可以映射为 MINOR 版本。带有 BREAKING CHANGE 的 commit,可以映射为 MAJOR 版本。
Angular 规范在功能上能够满足开发者 commit 需求,在格式上清晰易读,目前也是用得最多的。
Angular 规范其实是一种语义化的提交规范(Semantic Commit Messages),所谓语义化的提交规范包含以下内容:
Commit Message 是语义化的:Commit Message 都会被归为一个有意义的类型,用来说明本次 commit 的类型。
Commit Message 是规范化的:Commit Message 遵循预先定义好的规范,比如 Commit Message 格式固定、都属于某个类型,这些规范不仅可被开发者识别也可以被工具识别。
在 Angular 规范中,Commit Message 包含三个部分,分别是 Header、Body 和 Footer,格式如下:
type[optional scope]: description
// 空行
[optional body]
// 空行
[optional footer(s)]
其中,Header 是必需的,Body 和 Footer 可以省略。在以上规范中,必须用括号 ()括起来, [] 后必须紧跟冒号 ,冒号后必须紧跟空格,2 个空行也是必需的。
在实际开发中,为了使 Commit Message 在 GitHub 或者其他 Git 工具上更加易读,我们往往会限制每行 mess……
阅读全文
2021-04-10 10:53:48
摘要:1、编辑yaml文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-claim
namespace: qjy-cicd
annotations:
volume.beta.kubernetes.io/storage-class: nfs-storage
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
# jenkins 对应的 RBAC
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin
namespace: qjy-cicd
labels:
name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jenkins-admin
labels:
name: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: qjy-cicd
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
# jenkins 对应的 svc
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: qjy-cicd
labels:
app: jenkins
spec:
type: NodePort
ports:
- name: http
port: 8080 #服务端口
targetPort: 8080
nodePort: 32001 #NodePort方式……
阅读全文