linux之iptable
网络延迟是最核心的网络性能指标。由于网络传输、网络包处理等各种因素影响,网络延迟不可避免,但过大的延迟会直接影响用户体验。发现网络延时增大后,可以从路由、网络包的收发、网络包的处理,再到应用程序等,从各个层级分析网络延迟,待找到网络延时的来源层级后,再深入定位瓶颈所在。
NAT(network address translation) 网络地址转换也是一个可能导致网络延迟的因素。
NAT原理NAT技术可以重写IP数据包的源ip或者目的ip,被广泛用于解决公网ip地址短缺的问题。其只要原理是,网络中的多台主机,通过共享一个公网ip,访问外网资源。同时由于nat屏蔽了内网网络,也为局域网机器提供了安全隔离。
NAT的实现既可以在支持网络地址转换的路由器(NAT网关)中配置NAT,也可以在linux服务器中配置NAT。根据实现方式的不同,NAT分作如下三类:
静态NAT, 即内网IP与公网IP一一对应。
动态NAT,内网IP从公网IP池中动态选择一个进行映射。
网络地址端口转换NAPT (network address and port translation), 即把内网ip映射到公网i ...
linux之网络
网络模型OSI七层网络模型
四层网络
linux网络
linux网络收发流程
网络包的接收流程
当一个网络帧到达网卡时,网卡通过DMA方式把网络包放到收包队列中,然后通过硬中断,告知中断处理程序已经接收到网络包。
网卡中断处理程序为网络帧分配内核数据结构sk_buff,并将其拷贝到sk_buff缓冲区,然后通过软中断,通知内核收到了新的网络帧。
内核协议栈从缓冲区中取出网络帧,并通过网络协议栈从下往上逐层处理这个网络帧。内核协议栈处理网络帧的过程如下:
在数据链路层检查报文的合法性,检查上层协议类型(IPV4/6),去掉数据链路层帧头、帧尾,交给网络层
网络层取出IP头,判断网络包的下一步去向,比如交由上层处理或者转发。如果是确认该网络包交由本机则取出上层协议类型(TCP/UDP),去掉IP头,交由传输层。
传输层取出TCP头或者UDP头后,根据<源ip、源端口、目的ip、目的端口>四元组作为标识,找到对应的socket,并将数据拷贝到socket的接收缓冲区中。应用程序就可以使用socket接口读取到最新的数据了。
相 ...
redis之事务
redis 通过 multi、watch、exec等命令来实现事务功能。
redis提供这样一种将多个待执行的命令入队,在事务开始之后执行入队的事务命令,即使事务队列中部分命令执行失败也不会中断事务,事务队列中的所有命令执行完毕后,才会去请求其他客户端的命令请求。
事务的实现redis中事务从开始到结束有如下三个阶段:
事务开始
命令入队
事务执行
命令开始redis中,客户端使用multi命令标识当前客户端进入事务状态。该命令将执行该命令的客户端从非事务状态切换到事务状态#define CLIENT_MULTI (1<<3)。
1234typedef struct client { uint64_t id; /* Client incremental unique ID. */ uint64_t flags; /* Client flags: CLIENT_* macros. */}
命令入队客户端处于非事务状态时,这个客户端发送的命令将会被服务端立即执行。而客户端处于事务状态时,服务器会根 ...
redis之发布订阅
redis的发布订阅功能由publish|subscribe|psubscribe等命令组成。
频道的订阅与退订subscribe当客户端执行subscribe 命令订阅一个或多个频道时,这个客户端与被订阅的频道建就建立了一种订阅关系。
redis中将所有频道的订阅关系存储在服务器状态pubsub_channels中,键为被订阅频道,值为记录了所有订阅此频道的客户端。:
12345678struct redisServer { /* Pubsub */ dict *pubsub_channels; /* Map channels to list of subscribed clients */ dict *pubsub_patterns; /* A dict of pubsub_patterns */ int notify_keyspace_events; /* Events to propagate via Pub/Sub. This is an xor of NOTIFY_.. ...
redis之集群模式
redis 集群模式redis集群是redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。
redis集群的优点
高可用: 节点故障时,能自动进行故障转移,保证服务的持续可用。
负载均衡: 工作负载能够被分发到不同的节点上,有效分摊单节点访问压力。
容灾恢复:通过主从复制、哨兵机制,节点故障时能够快速进行故障恢复
数据分片: 集群模式下,可以由多个主节点执行写入操作
易于扩展:可以根据业务需求和系统负载,动态的添加或减少节点,实现水平扩展。
集群的实现原理一个redis集群通常由多个节点组成。在集群建立前,每个节点都是相互独立的,都处于一个只包含自己的集群中。在组件集群时,需要将每个独立的节点连接起来,构成一个包含多个节点的集群。
节点一个节点就是一个运行在集群模式下的redis服务器,服务器在启动时回一句cluster-enabled配置来决定是否开启服务器的集群模式。
1./src/redis-server --cluster-enabled yes # 开启集群模式
运行在集群模式下的服务器,会继续使用所有在单机模式中使用的服务器组件。例如: ...
java之ConcurrentHashMap
引用1. 一文彻底弄懂ConcurrentHashMap
java之spring注解
@Transactional
@TransmittableThreadLocal
@PostConstruct
引用1. PolarDB 数据库内核月报2. spring @Transactional注解参数详解3. TransmittableThreadLocal原理解析4. TransmittableThreadLocal(TTL)实现线程变量传递的原理分析
redis之哨兵机制
引言前文redis之主从复制中,在讲述redis主从模式时,提及主从模式在主节点故障时,无法自主恢复,需要人工干预才能恢复。那么有没有什么方法可以使集群能够自动进行故障恢复呢?当然有,那就是哨兵模式。
哨兵机制哨兵机制是redis高可用的解决方案: 由一个或者多个sentinel实例组成的sentinel系统监控任意多个主服务器,同时监控这些主服务器下的从服务器。在所监视的主服务器下线时,自动完成故障恢复:包括新选主、剩从切换新主、旧主变新从。故障恢复后,由新主处理命令请求。
第一次看到这里有疑惑,哨兵机制是对 主从做的改进, 那为什么 哨兵机制能够监控多个主服务器呢?此时的redis架构是多个 主从=主从-主从 模式么?
综上所述,哨兵机制需要提供如下服务:
感知 主服务器故障
拥有故障恢复能力 [选主过程由谁落实,有哪些条件?]
选取 leader sentinel
选取新的主服务器
剩从切换新主
旧主变新从那么redis 是如何为它提供如此能力的呢?
如何理解哨兵?目前可以先这样理解: sentinel是功能特殊的redis服务器,它能执行的命令不同 ...
redis之主从复制
主从模式主从结构是常用的计算机系统架构,通常被用于分布式系统中,其中一个节点master拥有最新的数据,其他节点slave复制并同步主节点的数据。
主从结构中,主节点负责写入数据,并将这些数据同步到从节点中;从节点只能读取数据。主从节点键通过网络连接,完成数据同步。
主从模式也常被用于数据库系统中,提供高可用能力。当主节点发生故障或者失效时,从节点可以被选举为新的主节点,保证系统的可用性。
主从模式的优点
负载均衡:读写分离:提高服务器的性能。
数据冗余:主从复制实现了数据的热备份,是持久化之外的数据冗余手段。
高可用基石:主从模式是哨兵模式和集群模式的基础。
主从模式的缺点?
主从模式不具备自动容错和恢复功能,主节点故障,集群无法工作,可用性较低。从节点升为主节点需要人工手动干预。
为什么redis要使用主从模式?在了解redis主从结构的原理前,先来了解一下分布式系统的理论基石 CAP原理:
C, Consistent, 即一致性;
A, Availability, 即可用性;
P, Partition, 即分区容忍性。
redis复制过程主从节点之间网络 ...
redis之客户端
redis服务器是典型的一对多服务器程序,一个服务器可以和多个客户端建立网络请求,每个客户端可以向服务器发送命令请求,服务器接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由IO多路复用技术实现的文件事件处理器,redis服务器使用单线程单进程的方式处理命令请求,并与多个客户端进行网络通信。6.0之后,IO多路复用处使用多线程实现。与服务器建立连接的客户端将以链表的形式被保存在redisServer中:
123struct redisServer { list *clients; // 链表保存各客户端状态}
客户端属性客户端状态包含的属性可以分为两类:
比较通用的属性,无论客户端执行什么工作,都需要使用这些属性
和特定功能相关的属性,比如操作数据库时需要用到的db属性和dictid属性,执行时需要用到mstate属性等。
id123typedef struct client { uint64_t id; // 自增客户端唯一id}
flags123typedef struct client { ...