CComma's Blog

CComma's Blog

Connect the world

1. 客户端实现原理

  1. 获取 Sentinel 节点: 遍历所有 Sentinel 节点,获取一个可用的 Sentinel 节点
  2. 获取 master 节点: 执行 sentinel get-master-addr-by-name ${masterName} 命令获取 master 节点
  3. 验证 master 节点: 执行 role 或 role replication 命令获取节点信息进行验证其是否故障
  4. 故障转移通知: 当 redis 主从变化时通知客户端
    1. +switch-master: 切换主节点(从节点晋升主节点)
    2. +convert-to-slave: 切换从节点(主节点降为从节点)
    3. +sdown: 主观下线
Read more »

可实现 多个主从复制 的故障转移
主观下线: 一个 sentinel 节点主观地认为某个 redis 节点已下线,即这个主观认知可能是错误的(因网络等因素)
客观下线: 超过 quorum 个 sentinel 节点认为某个 master 节点已下线,达成共识。通过 sentinel is-master-down-by-addr 询问其他 sentinel 节点对该 master 节点的看法

sentinel monitor ${masterName} ${ip} ${port} ${quorum}

命令:

  • sentinel is-master-down-by-addr:
    • 客观下线时 sentinel 节点询问其他 sentinel 节点对该 master 节点的看法
    • 选举 sentinel 节点领导
  • sentinel failover ${masterName}: 手动故障转移
Read more »

1. 故障发现

概述: 通过 ping/pong 消息实现故障发现,不需要 sentinel
主观下线 流程:
ping 超时则认为主观下线
image.png
客观下线 流程:
半数以上持有槽的主节点都标记某节点主观下线时
image.png
image.png

Read more »

1. moved 重定向

概述: 客户端存取键值的时候使用的重定向

  • 命中则直接返回
  • 不命中则返回目标 ip 及对应的槽给客户端,通过 cluster keyslot ${key} 命令可算出 key 对应的槽

-c: cluster 模式执行,出现 moved 不命中的情况可直接跳转到对应节点上执行命令。非 cluster 模式时会出现 moved 错误
image.png

Read more »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2022-08-25 17:47:31.203 ERROR o.s.boot.SpringApplication.reportFailure:860 Application run failed
java.lang.TypeNotPresentException: Type com.dfire.soa.consumer.vo.DinningTableVo not present
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117) ~[na:1.8.0_292]
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125) ~[na:1.8.0_292]
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[na:1.8.0_292]
at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68) ~[na:1.8.0_292]
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138) ~[na:1.8.0_292]
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[na:1.8.0_292]
at sun.reflect.generics.repository.MethodRepository.getReturnType(MethodRepository.java:68) ~[na:1.8.0_292]
at java.lang.reflect.Method.getGenericReturnType(Method.java:255) ~[na:1.8.0_292]
at org.apache.dubbo.common.utils.ReflectUtils.getReturnTypes(ReflectUtils.java:1196) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.rpc.model.MethodDescriptor.<init>(MethodDescriptor.java:48) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.rpc.model.ServiceDescriptor.initMethods(ServiceDescriptor.java:54) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.rpc.model.ServiceDescriptor.<init>(ServiceDescriptor.java:45) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.rpc.model.ServiceRepository.lambda$registerService$0(ServiceRepository.java:64) ~[dubbo-2.7.15.jar:2.7.15]
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1688) ~[na:1.8.0_292]
at org.apache.dubbo.rpc.model.ServiceRepository.registerService(ServiceRepository.java:63) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:321) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:314) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:238) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.bootstrap.DubboBootstrap.exportService(DubboBootstrap.java:1099) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.bootstrap.DubboBootstrap.lambda$exportServices$14(DubboBootstrap.java:1086) ~[dubbo-2.7.15.jar:2.7.15]
at java.util.HashMap$Values.forEach(HashMap.java:981) ~[na:1.8.0_292]
at org.apache.dubbo.config.bootstrap.DubboBootstrap.exportServices(DubboBootstrap.java:1070) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.bootstrap.DubboBootstrap.start(DubboBootstrap.java:886) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onContextRefreshedEvent(DubboBootstrapApplicationListener.java:70) ~[dubbo-2.7.15.jar:2.7.15]
at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onApplicationContextEvent(DubboBootstrapApplicationListener.java:63) ~[dubbo-2.7.15.jar:2.7.15]
at com.alibaba.spring.context.OnceApplicationContextEventListener.onApplicationEvent(OnceApplicationContextEventListener.java:52) ~[spring-context-support-1.0.11.jar:na]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.13.jar:2.4.13]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) ~[spring-boot-2.4.13.jar:2.4.13]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) ~[spring-boot-2.4.13.jar:2.4.13]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) ~[spring-boot-2.4.13.jar:2.4.13]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) ~[spring-boot-2.4.13.jar:2.4.13]
at com.dfire.soa.SpringbootApplication.main(SpringbootApplication.java:21) [cash-platform-soa.jar:na]
Caused by: java.lang.ClassNotFoundException: com.dfire.soa.consumer.vo.DinningTableVo
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_292]
at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_292]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) ~[na:1.8.0_292]
at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_292]
at java.lang.Class.forName0(Native Method) ~[na:1.8.0_292]
at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_292]
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) ~[na:1.8.0_292]
... 38 common frames omitted

dubbo:2.7.15,spring-boot:2.4.13

今天遇到一个问题,本地启动项目没有问题,发布到测试环境提示 ClassNotFoundException。
报的错都是一些新加的 jar 包下的类,都是 SNAPSHOT 包。看起来像是找不到类导致 Spring 无法创建 bean,但是明明包里是有这个类的。
经过一天的修改发布观察,发现是 maven 依赖的问题,只要引用了多个相同的依赖包就会遇到这样的问题。比如 consumer 包,该项目直接引用了 consumer 包,还引用了一个包,那个包也引用了 consumer 包,导致 consumer 包出现了两次,如图。
image.png

按理来说只是包重复引用应该不会出现这样的问题,更何况版本都是一样的。所以目前原因暂不明,可能和快照包有关,也可能和 dubbo 等一系列包升级有关。

一、概述

采用虚拟槽分片:

  • 每个节点分配一堆槽
  • 每个节点与其他所有节点共享消息
  • 官方指定全部槽数量为 16384(0-16383)
  • 每个节点有主从复制

image.png
命令:

  • cluster nodes: 查看自动生成的集群本地配置文件记录
  • cluster info: 集群信息
  • cluster meet ip port: 两个 cluster 节点之间的消息沟通
  • cluster addslots slot [slot…]: 为节点分配槽
  • cluster slots: 查看槽的分配信息
  • cluster replicate ${node-id}: 设置主从关系
  • cluster forget ${downNodeId}: 遗忘节点
  • ** cluster keyslot ${key}:** 返回 key 对应的槽
Read more »

nginx 相对于 apache 的优点:

  • 轻量级,同样起 web 服务,比 apache 占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速

apache 相对于 nginx 的优点:

  • rewrite ,比 nginx 的 rewrite 强大
  • 模块超多,基本想到的都可以找到
  • 少 bug ,nginx 的 bug 相对较多

Nginx 配置简洁,Apache 复杂
最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程;nginx 是异步的,多个连接(万级别)可以对应一个进程

Read more »

安装

1. 安装依赖环境

  1. 安装 gcc:yum install gcc-c++
  2. 安装 PCRE 库,用于解析正则表达式:yum install -y pcre pcre-devel
  3. zlib 压缩:yum install -y zlib zlib-devel
  4. SSL 安全加密套接字协议层,用于 HTTP 安全传输:yum insta;; -y openssl openssl-devel
Read more »
0%