2022-04-30 20:53:37
摘要:Kafka最初是领英公司开发的消息流组件,后来捐献给了Apche。
一、拓扑结构
Broker 是 Kafka 集群中的核心服务器,你可以把它想象成一个邮局:
生产者(Producer)就像寄信人,把消息(信件)送到 Broker(邮局)
消费者(Consumer)就像收信人,从 Broker 取走自己的消息
一个 Kafka 集群通常由多个 Broker 组成,共同处理消息存储和转发Broker 的核心职责
1. 消息存储中心
持久化存储 :所有消息最终都会写入磁盘,而不仅仅是内存
分区管理 :每个 Broker 负责存储某些分区的数据
日志分段 :将大日志文件分割成多个段(segment),便于维护和清理
2. 消息路由中心
维护所有主题/分区的元数据信息
决定生产者应该把消息发送到哪个分区
协调消费者从哪个分区获取消息
3. 副本协调者
管理 Leader 副本和 Follower 副本的同步
监控副本的健康状态
在 Leader 失效时组织新的选举Broker的工作流程
Kafka的存储结构就像一本书的目录:
主题(Topic) :相当于书的标题,是消息的分类。比如用户注册、订单支付等。
分区(Partition) :相当于书的章节,每个主题可以被分成多个分区。分区使Kafka可以并行处理消息。
副本(Replica) :相当于书的复印本,每个分区可以有多个副本(通常3个)。分为Leader副本(主本)和Follower副本(副本)。
Kafka 会智能地将副本分布在不同 Broker 上:
同一个分区的不同副本不会放在同一个 Broker
尽量将分区的 Leader 均匀分布在所有 Broker
例如下图有 2个 Broker 和 1 个主题(分区数=3,副本数=2):
Kafka的消息存储就像写日记:
消息以追加(append-only) 方式写入分区,不可修改
每个消息都有一个位移(offset) ,相当于日记的行号
消息按时间保留(默认7天),超过时间自动删除
分区日志被分成多个段(segment) 文件,便于管理
基于日志结构构建的消息引擎:消费消息时是读取日志文件,消息不会删除
二、消息流程
1. 消息写入流程
生产者连接到任意 Broker 获取元数据
Broker 返回主题分区信息和 Leader Brok……
阅读全文
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-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-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方式……
阅读全文
2021-04-02 19:15:08
摘要:1、打包镜像
docker build -t zq-apigateway:1.0.0 ./zq-apigateway/.
2、Helm Create
在master节点上创建一个文件夹,如deploy
cd deploy
helm create zq-apigateway
将生成的文件下载到本地进行编辑
3、编辑deployment.yaml
spec/template/spec/containers,imagePullPolicy后
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
valueFrom:
configMapKeyRef:
name: zq-env-config
key: skywalking_hostingStartup
- name: SkyWalking__Transport__gRPC__Servers
valueFrom:
configMapKeyRef:
name: zq-env-config
key: skywalking_servers
- name: exceptionless__ServerUrl
valueF……
阅读全文
2021-03-27 17:09:31
摘要:截止到目前生产环境上要使用到的基础应用基本已经搭建完成,但似乎还缺少一点什么,对!就是docker镜像的仓库,如果没有私仓,我们需要把镜像手动推送各个node节点,这样太不方便了。
我们使用harbor来搭建:
一、安装
1. 确定30002,30003,30004端口没有被占用
2. helm repo add harbor https://helm.goharbor.io
3. helm search repo harbor
4. helm pull harbor/harbor --version=1.6.1
5. tar -xf harbor-1.6.1.tgz
6. 改values里面storageClass的值nfs-storage(有3个地方)
7. 改ingress
ingress:
hosts:
core: harbor.qhfinance.com
notary: notary.qhfinance.com
8. 改harborAdminPassword: xxxxx #设置密码
9. helm install harbor -f harbor-values.yaml --namespace qjy-public harbor/harbor --version 1.6.1
10. 配置host,随便一个节点的ip地址
vim /etc/hosts
172.16.0.3 harbor.qhfinance.com
二、访问
访问地址http://harbor.qhfinance.com/,默认用户名/密码为:admin/xxxxx
默认harbor只有一个公共的library项目,该项目的权限和docker hub一样不需要认证就可以拉取镜像,我们把它改成私有,也可以重新创建一个私有项目。
三、配置证书
因为我们部署的Harbour是有自带凭证(CA),所以需要再Docker Client加入凭证,这样Docker Client才有办法存取到私有的注册表。
首先,在Kubernetes Master使用以下指令取得凭证
kubectl get secret/harbor-harbor-ingress -n qjy-cicd -o jsonpath=……
阅读全文
2021-03-25 15:47:21
摘要:1、下载Charts包
git clone https://github.com/apache/skywalking-kubernetes
cd skywalking-kubernetes/chart
helm repo add elastic https://helm.elastic.co
helm dep up skywalking
2、修改配置文件 skywalking/values-my-es.yaml
oap:
image:
tag: 8.4.0-es7 # Set the right tag according to the existing Elasticsearch version
storageType: elasticsearch7
ui:
image:
tag: 8.4.0
service:
type: NodePort
externalPort: 80
internalPort: 8080
nodePort: 30008
elasticsearch:
enabled: false
config: # For users of an existing elasticsearch cluster,takes effect when `elasticsearch.enabled` is false
host: elasticsearch-client.qjy-efk.svc.cluster.local
port:
http: 9200
user: elastic # [optional]
password: xxxxx # [optional]
3、执行
kubectl create namespace qjy-apm
helm install skywalking skywalking --namespace qjy-apm -f ./skywalking/values-my-es.yaml
阅读全文