- 浏览: 146437 次
-
文章分类
最新评论
Sentinel(哨兵)是 Redis 的高可用性(high availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及它们属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,之后改由它来处理命令请求。
本节接下来将对 Sentinel 系统的初始化过程、实现原理,以及它如何对主服务器执行故障转移等操作进行详细的介绍。
启动并初始化 Sentinel
启动一个 Sentinel 可以使用命令:
$ redis-server /path/to/sentinel.conf --sentinel
或者:
$ redis-sentinel /path/to/sentinel.conf
Sentinel 本质上只是一个运行在特殊模式下的 Redis 服务器,所以启动的第一步就是初始化一个普通的 Redis 服务器。不过由于执行的工作不同,所以初始化过程也有所差别。比如,普通服务器在初始化时会通过载入 RDB 文件或者 AOF 文件来还原数据库状态,但因为 Sentinel 并不使用数据库,所以初始化 Sentinel 时就不会载入 RDB 或 AOF 文件。
下表展示了 Redis 服务器在 Sentinel 模式下运行时,服务器各个主要功能的使用情况。
启动 Sentinel 的第二步就是将一部分普通 Redis 服务器代码替换成 Sentinel 专用代码。比如,使用不同的默认端口 26379,而非常规的 6379,还有载入不同的命令列表等。
在应用了 Sentinel 的专用代码后,服务器会初始化一个 sentinelState 结构,其中保存了服务器中所有和 Sentinel 功能有关的状态(服务器的一般状态仍然由 redisServer 结构保存):
其中的 masters 字典记录了所有被 Sentinel 监视的主服务器的相关信息,字典的值是一个 sentinelRedisInstance 结构,代表一个被监视的 Redis 服务器实例,可以是主服务器、从服务器、或者另一个 Sentinel。
对 Sentinel 状态的初始化将引发对 masters 字典的初始化,而 masters 字典的初始化是根据被载入的 Sentinel 配置文件来进行的。
初始化 Sentinel 的最后一步是创建连向被监视主服务器的网络连接,Sentinel 将成为主服务器的客户端,它可以向主服务器发送命令,并从命令回复中获取相关信息。对于每个被监视的主服务器来说,Sentinel 会创建两个连向主服务器的异步网络连接:
* 一个是命令连接,专门用于向主服务器发送命令,并接收命令回复。
* 另一个是订阅连接,专门用于订阅主服务器的 __sentinel__:hello 频道。
Sentinel 默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送 INFO 命令,并根据命令回复来获取主服务器的当前信息,比如主服务器的运行 ID(run_id)、服务器角色、主服务器属下的从服务器信息等。
当 Sentinel 发现主服务器的从服务器时,除了会为之创建相应的实例结构之外,还会创建连接到从服务器的命令连接和订阅连接。之后,Sentinel 也会以十秒一次的频率通过命令连接向从服务器发送 INFO 命令,然后根据命令回复信息,不断地更新从服务器的实例结构。
默认情况下,Sentinel 会以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送以下格式的命令:
PUBLISH __sentinel__:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"
其中,前四个以“s_”开头的参数记录的是 Sentinel 自身的信息,分别表示 Sentinel 的 IP、端口号、运行 ID、当前的配置纪元(configuration epoch),后四个以“m_”开头的记录的则是主服务器的信息,分别表示主服务器的名字、IP、端口号和当前的配置纪元。
对于监视同一个服务器的多个 Sentinel 来说,一个 Sentinel 发送的信息会被其他 Sentinel 接收到,这些信息会被用于更新其他 Sentinel 对发送信息 Sentinel 的认知,也会被用于更新其他 Sentinel 对被监视服务器的认知。
当 Sentinel 通过频道信息发现一个新的 Sentinel 时,它不仅会为新 Sentinel 在对应主服务器实例结构的 sentinels 字典中创建相应的实例结构,还会创建一个连向新 Sentinel 的命令连接,而新 Sentinel 也同样会创建连向这个 Sentinel 的命令连接。使用命令连接相连的各个 Sentinel 可以通过向其他 Sentinel 发送命令请求来进行信息交换,比如对 Sentinel 实现主观下线检测和客观下线检测。
下线状态检测
Sentinel 默认会以每秒一次的频率向所有与之建立了命令连接的实例(包括主服务器、从服务器和其他 Sentinel 在内)发送 PING 命令,之后再通过命令回复来判断对应的实例是否在线。Sentinel 配置文件中的 down-after-milliseconds 选项指定了 Sentinel 判断实例进入主观下线所需的时间长度:如果一个实例在配置的毫秒内,连续向 Sentinel 返回无效回复(除 +PONG、-LOADING 和 -MASTERDOWN 之外的其他回复),那么 Sentinel 就会修改这个实例对应的实例结构,打开 flags 属性中的 SRI_S_DOWN 标识,以此来表示该实例已经进入主观下线状态。
当 Sentinel 将一个主服务器判断为主观下线后,为了更进一步确认,它会使用命令“SENTINEL is-master-down-by-addr”向同样监视这一主服务器的其他 Sentinel 进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或客观下线),同时也会让它们顺便选出领头 Sentinel。当从其他 Sentinel 那里接收到足够数量的已下线判断后(超过 quorum 参数配置的值),Sentinel 就会将其判断为客观下线,并打开主服务器实例结构 flags 属性的 SRI_O_DOWN 标识,然后执行故障转移操作。
故障转移
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个 Sentinel 会进行协商,选举出一个领头 Sentinel,以让其对下线主服务器执行故障转移操作。
以下是 Redis 选举领头 Sentinel 的规则和方法:
1、所有在线的 Sentinel 都有被选为领头 Sentinel 的资格。
2、每次进行选举后,不论选举是否成功,所有 Sentinel 的配置纪元计数器都会自增一次。
3、在一个配置纪元里,所有 Sentinel 都有一次将某个 Sentinel 设置为局部领头 Sentinel 的机会,并且局部领头一旦设置,在这个配置纪元里就不能再更改。
4、每个发现主服务器进入客观下线的 Sentinel 都会要求其他 Sentinel 将自己设置为局部领头。
5、Sentinel 设置局部领头的规则是先到先得。
6、领头 Sentinel 的产生需要半数以上 Sentinel 的支持。
7、如果在给定的时限内,没有一个 Sentinel 被选举为领头,那么各个 Sentinel 将在一段时间后再次进行选举,直到选出领头为止。
在领头 Sentinel 选举出来后,它将对已下线的主服务器执行故障转移操作,这包括以下三个步骤:
1)在已下线主服务器属下的所有从服务器里面,挑选出一个作为主服务器。
2)让其它从服务器改为复制新的主服务器。
3)将已下线主服务器设置为新的主服务器的从服务器。
具体来说,领头 Sentinel 在挑选新的主服务器时,它是按照下面的规则来对已下线主服务器的从服务器列表进行过滤的:
1、删除列表中所有处于下线或者断线状态的从服务器。
2、删除列表中所有最近五秒内没有回复过领头 Sentinel 的 INFO 命令的从服务器,以保证列表中剩余的从服务器都是最近成功进行过通信的。
3、删除所有与已下线主服务器连接断开超过 down-after-milliseconds * 10 毫秒的从服务器,这可以保证列表中剩余的从服务器都没有过早地与主服务器断开连接。
之后,领头 Sentinel 将把按照优先级最高、复制偏移量最大和运行 ID 最小的顺序挑选出的从服务器作为主服务器。
对于让其他从服务器和已下线主服务器变为新的主服务器的从服务器,则是通过命令 SLAVEOF 命令实现的。
参考书籍:《Redis设计与实现》第16章 —— Sentinel。
本节接下来将对 Sentinel 系统的初始化过程、实现原理,以及它如何对主服务器执行故障转移等操作进行详细的介绍。
启动并初始化 Sentinel
启动一个 Sentinel 可以使用命令:
$ redis-server /path/to/sentinel.conf --sentinel
或者:
$ redis-sentinel /path/to/sentinel.conf
Sentinel 本质上只是一个运行在特殊模式下的 Redis 服务器,所以启动的第一步就是初始化一个普通的 Redis 服务器。不过由于执行的工作不同,所以初始化过程也有所差别。比如,普通服务器在初始化时会通过载入 RDB 文件或者 AOF 文件来还原数据库状态,但因为 Sentinel 并不使用数据库,所以初始化 Sentinel 时就不会载入 RDB 或 AOF 文件。
下表展示了 Redis 服务器在 Sentinel 模式下运行时,服务器各个主要功能的使用情况。

启动 Sentinel 的第二步就是将一部分普通 Redis 服务器代码替换成 Sentinel 专用代码。比如,使用不同的默认端口 26379,而非常规的 6379,还有载入不同的命令列表等。
在应用了 Sentinel 的专用代码后,服务器会初始化一个 sentinelState 结构,其中保存了服务器中所有和 Sentinel 功能有关的状态(服务器的一般状态仍然由 redisServer 结构保存):
struct sentinelState{ uint64_t current_epoch; // 当前纪元,用于实现故障转移 // 保存了所有被这个 sentinel 监视的主服务器 // 字典的键是主服务器的名字 // 字典的值则是一个指向 sentinelRedisInstance 结构的指针 dict *masters; int tilt; // 是否进入了 TILT 模式? int running_scripts; // 目前正在执行的脚本的数量 mstime_t tilt_start_time; // 进入 TILT 模式的时间 mstime_t previous_time; // 最后一次执行时间处理器的时间 list *scripts_queue; // FIFO 队列,包含了所有需要执行的用户脚本 }sentinel;
其中的 masters 字典记录了所有被 Sentinel 监视的主服务器的相关信息,字典的值是一个 sentinelRedisInstance 结构,代表一个被监视的 Redis 服务器实例,可以是主服务器、从服务器、或者另一个 Sentinel。
typedef struct sentinelRedisInstance{ /* ... other fields */ int flags; // 标识值,记录了实例的类型 // 实例的名字 // 主服务器的名字由用户在配置文件中设置 // 从服务器以及 Sentinel 的名字由 Sentinel 自动设置,格式为“ip:port” char *name; char *runid; // 实例的运行 ID uint64_t config_epoch; // 配置纪元,用于实现故障转移 sentinelAddr *addr; // 实例的地址 // 保存了监视同一个主服务器的其他 Sentinel // 字典的键是 Sentinel 的名字,格式为“ip:port” // 字典的值则是对应 Sentinel 的 sentinelRedisInstance 实例结构 dict *sentinels; // SENTINEL down-after-milliseconds 选项设定的值 // 实例无响应多少毫秒后才会被判断为主观下线(subjectively down) mstime_t down_after_period; // SENTINEL monitor <master-name> <IP> <port> <quorum> 选项中的 quorum 参数 // 判断这个实例为客观下线(objectively down)所需的支持投票数量 int quorum; // SENTINEL parallel-syncs <master-name> <number> 选项的值 // 在执行故障转移操作时,可以同时对新的主服务器进行同步的从服务器数量 int parallel_syncs; // SENTINEL failover-timeout <master-name> <ms> 选项的值 // 刷新故障迁移状态的最大时限 mstime_t failover_timeout; }sentinelRedisInstance;
对 Sentinel 状态的初始化将引发对 masters 字典的初始化,而 masters 字典的初始化是根据被载入的 Sentinel 配置文件来进行的。
初始化 Sentinel 的最后一步是创建连向被监视主服务器的网络连接,Sentinel 将成为主服务器的客户端,它可以向主服务器发送命令,并从命令回复中获取相关信息。对于每个被监视的主服务器来说,Sentinel 会创建两个连向主服务器的异步网络连接:
* 一个是命令连接,专门用于向主服务器发送命令,并接收命令回复。
* 另一个是订阅连接,专门用于订阅主服务器的 __sentinel__:hello 频道。
Sentinel 默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送 INFO 命令,并根据命令回复来获取主服务器的当前信息,比如主服务器的运行 ID(run_id)、服务器角色、主服务器属下的从服务器信息等。
当 Sentinel 发现主服务器的从服务器时,除了会为之创建相应的实例结构之外,还会创建连接到从服务器的命令连接和订阅连接。之后,Sentinel 也会以十秒一次的频率通过命令连接向从服务器发送 INFO 命令,然后根据命令回复信息,不断地更新从服务器的实例结构。
默认情况下,Sentinel 会以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送以下格式的命令:
PUBLISH __sentinel__:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"
其中,前四个以“s_”开头的参数记录的是 Sentinel 自身的信息,分别表示 Sentinel 的 IP、端口号、运行 ID、当前的配置纪元(configuration epoch),后四个以“m_”开头的记录的则是主服务器的信息,分别表示主服务器的名字、IP、端口号和当前的配置纪元。
对于监视同一个服务器的多个 Sentinel 来说,一个 Sentinel 发送的信息会被其他 Sentinel 接收到,这些信息会被用于更新其他 Sentinel 对发送信息 Sentinel 的认知,也会被用于更新其他 Sentinel 对被监视服务器的认知。
当 Sentinel 通过频道信息发现一个新的 Sentinel 时,它不仅会为新 Sentinel 在对应主服务器实例结构的 sentinels 字典中创建相应的实例结构,还会创建一个连向新 Sentinel 的命令连接,而新 Sentinel 也同样会创建连向这个 Sentinel 的命令连接。使用命令连接相连的各个 Sentinel 可以通过向其他 Sentinel 发送命令请求来进行信息交换,比如对 Sentinel 实现主观下线检测和客观下线检测。
下线状态检测
Sentinel 默认会以每秒一次的频率向所有与之建立了命令连接的实例(包括主服务器、从服务器和其他 Sentinel 在内)发送 PING 命令,之后再通过命令回复来判断对应的实例是否在线。Sentinel 配置文件中的 down-after-milliseconds 选项指定了 Sentinel 判断实例进入主观下线所需的时间长度:如果一个实例在配置的毫秒内,连续向 Sentinel 返回无效回复(除 +PONG、-LOADING 和 -MASTERDOWN 之外的其他回复),那么 Sentinel 就会修改这个实例对应的实例结构,打开 flags 属性中的 SRI_S_DOWN 标识,以此来表示该实例已经进入主观下线状态。
当 Sentinel 将一个主服务器判断为主观下线后,为了更进一步确认,它会使用命令“SENTINEL is-master-down-by-addr”向同样监视这一主服务器的其他 Sentinel 进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或客观下线),同时也会让它们顺便选出领头 Sentinel。当从其他 Sentinel 那里接收到足够数量的已下线判断后(超过 quorum 参数配置的值),Sentinel 就会将其判断为客观下线,并打开主服务器实例结构 flags 属性的 SRI_O_DOWN 标识,然后执行故障转移操作。
故障转移
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个 Sentinel 会进行协商,选举出一个领头 Sentinel,以让其对下线主服务器执行故障转移操作。
以下是 Redis 选举领头 Sentinel 的规则和方法:
1、所有在线的 Sentinel 都有被选为领头 Sentinel 的资格。
2、每次进行选举后,不论选举是否成功,所有 Sentinel 的配置纪元计数器都会自增一次。
3、在一个配置纪元里,所有 Sentinel 都有一次将某个 Sentinel 设置为局部领头 Sentinel 的机会,并且局部领头一旦设置,在这个配置纪元里就不能再更改。
4、每个发现主服务器进入客观下线的 Sentinel 都会要求其他 Sentinel 将自己设置为局部领头。
5、Sentinel 设置局部领头的规则是先到先得。
6、领头 Sentinel 的产生需要半数以上 Sentinel 的支持。
7、如果在给定的时限内,没有一个 Sentinel 被选举为领头,那么各个 Sentinel 将在一段时间后再次进行选举,直到选出领头为止。
在领头 Sentinel 选举出来后,它将对已下线的主服务器执行故障转移操作,这包括以下三个步骤:
1)在已下线主服务器属下的所有从服务器里面,挑选出一个作为主服务器。
2)让其它从服务器改为复制新的主服务器。
3)将已下线主服务器设置为新的主服务器的从服务器。
具体来说,领头 Sentinel 在挑选新的主服务器时,它是按照下面的规则来对已下线主服务器的从服务器列表进行过滤的:
1、删除列表中所有处于下线或者断线状态的从服务器。
2、删除列表中所有最近五秒内没有回复过领头 Sentinel 的 INFO 命令的从服务器,以保证列表中剩余的从服务器都是最近成功进行过通信的。
3、删除所有与已下线主服务器连接断开超过 down-after-milliseconds * 10 毫秒的从服务器,这可以保证列表中剩余的从服务器都没有过早地与主服务器断开连接。
之后,领头 Sentinel 将把按照优先级最高、复制偏移量最大和运行 ID 最小的顺序挑选出的从服务器作为主服务器。
对于让其他从服务器和已下线主服务器变为新的主服务器的从服务器,则是通过命令 SLAVEOF 命令实现的。
参考书籍:《Redis设计与实现》第16章 —— Sentinel。
发表评论
-
Lua 脚本
2019-10-07 19:49 724Redis 2.6 版本开始引入对 Lua 脚 ... -
Redis事务的实现
2019-09-22 18:56 490Redis 事务是 ... -
Redis集群之复制、故障转移及消息实现
2019-09-14 21:04 524在Redis集群 ... -
Redis集群实现原理
2019-09-14 12:19 702Redis 集群是 Redis 提供的分布式数 ... -
数据库复制
2019-07-13 22:02 381在连接到一 ... -
redis 客户端实现
2019-06-02 15:06 390Redis 服务器是典型的一对多服务器程序,通 ... -
AOF 持久化
2019-05-12 13:36 436除了前面提到的 RDB 持久化功能外,Redi ... -
RDB 文件结构
2019-04-27 12:10 603在RDB 持久化一节中,我们对 RDB 持久化 ... -
RDB 持久化
2019-04-14 17:20 435RDB 持久化功能可以将 Redis 在某个时 ... -
Redis 数据库通知功能的实现
2019-04-07 11:56 1306Reids 数据库通知功能可以让客户端通过订阅 ... -
数据库实现
2019-03-24 13:58 459Redis 服务器将其所有的数据库都保存在 r ... -
Redis 五种对象
2019-01-20 11:13 384阅读本节前需要阅读 Redis 对象系统概览一 ... -
Redis 对象系统概览
2019-01-06 13:10 802前面介绍了 Redis 中用到的所有主要数据结 ... -
整数集合与压缩列表
2018-12-09 21:19 614在 Redis 中,当一 ... -
跳跃表在 Redis 中的应用
2018-08-23 16:30 2043前提申明,因篇幅 ... -
字典实现
2018-08-20 15:49 591字典在 Redis 中的应用相当广泛,如 Redis ... -
redis 字符串和列表实现
2018-08-08 16:41 761Redis 虽说由 C 语言 ...
相关推荐
本文详细分析了2023年7月抖音平台上美妆品牌「里季、VC美妆、娇润泉」的社媒营销和电商业绩。通过对销售额、直播销售、视频销售、热门商品、粉丝画像等方面的深入剖析,揭示了各品牌在抖音平台的成功之道。里季凭借创始人紫橙董事长的直播带货取得显著成绩,VC美妆则依靠素颜霜爆款和品牌自播,娇润泉通过洁面乳和精华液的推广,借助尾部达人视频切片和头部达人直播实现销售增长。
1、文件说明: Centos8操作系统subscription-manager-rhsm-certificates-1.28.21-3.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf subscription-manager-rhsm-certificates-1.28.21-3.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
内容概要:本文详细介绍了力士乐驱动调试软件13v16中文版的特点及其在伺服驱动和液压同步调试中的应用。软件具有中文界面,便于理解和操作,涵盖参数设置、监控、诊断和调试四大模块。参数设置模块支持通过输入数值或拖动滑块调整电机速度和加速度;监控模块提供实时数据监测和图表展示;诊断模块帮助排查和解决问题;调试模块适用于高级调试如PID参数调整。此外,文中还分享了多个实用技巧,如批量修改参数、故障代码速查、动态链接库调用等。 适合人群:从事工业自动化、机电一体化领域的工程师和技术人员,尤其是对伺服驱动和液压控制系统有一定经验的人群。 使用场景及目标:①用于伺服驱动系统的调试,确保电机参数正确配置和稳定运行;②用于液压同步控制项目的调试,提高同步精度;③通过丰富的案例和技巧分享,帮助用户高效解决常见问题,提升工作效率。 其他说明:本文不仅介绍了软件的基本功能,还深入探讨了实际调试过程中的一些经验和技巧,为用户提供全面的指导和支持。
计算机绘图-讲稿.pdf
计算机二级access历年真题及讲解.pdf
计算机复习小结.pdf
1、文件说明: Centos8操作系统stubby-0.4.2-2.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf stubby-0.4.2-2.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
计算机二级C语言历年真题.pdf
内容概要:本文详细介绍了一种利用ELMAN神经网络对红酒数据集进行分类的方法及其MATLAB实现。首先介绍了红酒数据集的特点以及数据预处理步骤,包括数据读取、特征提取、归一化等。接着阐述了ELMAN神经网络的基本概念及其在处理时间序列和模式识别方面的优势。随后展示了如何在MATLAB中创建、配置和训练ELMAN神经网络,包括设置网络结构、选择合适的训练参数等。最后通过评估模型性能,计算分类准确率,并绘制混淆矩阵来展示实验结果。此外还提供了代码优化建议,如调整网络参数、改进数据处理方法等。 适合人群:对机器学习尤其是神经网络感兴趣的初学者,以及有一定MATLAB编程基础的研究人员。 使用场景及目标:适用于想要了解ELMAN神经网络的工作原理及其应用的人群;希望通过具体案例掌握如何使用MATLAB实现神经网络建模和训练的技术人员。 其他说明:文中提供的代码可以直接运行,用户可根据自身需求修改数据源、调整网络参数等,从而应用于不同的分类任务。同时,对于非时序数据也可以考虑采用其他类型的神经网络以提高效率。
数据结构C/C++实现代码,供参考学习,练习,用于面试考试
内容概要:本文详细介绍了Halcon与C#联合开发的一个稳定版本的工业视觉框架。首先强调了环境配置的重要性,确保Halcon的runtime版本与开发环境一致,避免常见的dll版本不匹配问题。接着阐述了图像处理流水线的设计,利用Task+async/await提高效率并避免界面卡顿。文中展示了如何通过状态机实现流程引擎,使配置文件定义处理步骤更加灵活。此外,文章深入探讨了内存管理和异常处理的最佳实践,如使用using语句确保HRegion对象正确释放,以及将Halcon的错误码转化为易读信息。最后,作者分享了一些实用技巧,如通过WCF实现算法和服务化通信,以及提供了一个PCB板检测的Demo项目作为实例。 适合人群:具有一定编程基础,尤其是熟悉C#和Halcon的开发人员,以及从事工业视觉项目的工程师。 使用场景及目标:适用于希望深入了解Halcon与C#联合开发的工业视觉框架的技术人员。主要目标是帮助读者掌握图像处理流程、内存管理、异常处理等方面的知识,从而能够构建高效稳定的工业视觉系统。 其他说明:文中提供了大量代码片段和实践经验,有助于读者更好地理解和应用相关技术。同时,提醒读者在实际开发过程中需要注意的一些常见问题及其解决方案。
计算机二级笔试(选择)真题及答案.pdf
源码
内容概要:本文探讨了在机械模型设计中如何利用技术交底书进行创新。文章首先解释了技术交底书的概念及其重要性,接着通过具体的代码示例展示了如何在机械臂设计中引入动态调整算法以提高性能和效率。此外,文章介绍了如何使用Python和YAML等工具将机械模型的参数化设计与技术交底书相结合,实现了自动化更新和版本控制。最后,文章强调了在设计过程中发现并解决具体问题的重要性,如渐开线参数修形、轨迹预测算法优化以及模块化参数系统的应用。 适合人群:机械工程师、软件开发者、项目经理和技术文档撰写人员。 使用场景及目标:适用于机械模型设计项目的各个阶段,旨在提升设计效率、减少错误率、优化性能,并使技术交底书成为动态且易维护的文档。 其他说明:文中提到的技术手段不仅限于特定行业,可以广泛应用于各种涉及复杂机械系统的工程项目中。同时,文章鼓励跨学科合作,如机械工程与编程的结合,以实现更高效的解决方案。
内容概要:本文详细记录了作者在Cadence平台中完成一个两级放大电路版图设计的过程,涵盖了从初步设计到最终通过LVS(Layout vs Schematic)和DRC(Design Rule Check)验证的所有步骤。文章首先介绍了电路的基本结构和参数设定,如共源放大器和共栅放大器的关键参数调整,以及在Virtuoso环境中进行的具体操作。接着,作者分享了在版图绘制过程中遇到的各种挑战及其解决方案,包括晶体管尺寸优化、走线布局、寄生参数控制、金属层间距调整等。此外,还特别强调了LVS和DRC验证中的常见问题及应对策略,如端口不匹配、器件参数偏差、金属密度规则等。最后,作者总结了一些实用的设计技巧和注意事项,为后续类似项目提供了宝贵的经验。 适合人群:从事集成电路设计的专业人士,尤其是对模拟电路版图设计感兴趣的工程师和技术爱好者。 使用场景及目标:帮助读者掌握Cadence环境下两级放大电路版图设计的方法,提高LVS和DRC验证的成功率,减少设计周期内的返工次数,提升设计效率。 其他说明:文中提到的具体数值和代码片段仅供参考,在实际应用中需要根据具体的工艺规则和个人需求进行适当调整。
内容概要:本文详细介绍了如何利用西门子S7-200 PLC的指针操作来高效地进行数据统计,具体包括求平均值、最大值和最小值的方法。文中提供了完整的代码示例,涵盖了从初始化、循环处理到最终结果输出的全过程。此外,还讨论了指针操作的优势以及一些常见的注意事项,如数据类型的正确处理、防止溢出等。文章强调了指针操作在批量数据处理中的高效性和灵活性,特别是在工控项目中的应用价值。 适合人群:从事工业自动化控制系统的开发人员,尤其是对西门子S7-200 PLC有一定了解的技术人员。 使用场景及目标:适用于需要频繁处理大量数据的工控项目,如温度采集、压力波动分析等。通过掌握本文介绍的方法,开发者能够提高数据处理效率,减少代码复杂度,并确保程序的稳定性和可靠性。 其他说明:文章不仅提供了具体的编程技巧,还分享了许多实践经验,帮助读者更好地理解和应用这些技术。同时提醒读者在实际操作中应注意的一些潜在问题,如数据类型匹配、指针越界等。
1、文件说明: Centos8操作系统subunit-perl-1.4.0-14.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf subunit-perl-1.4.0-14.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
C++相关书籍,计算机相关书籍,linux相关及http等计算机学习、面试书籍。
无线猫灵5g随身WiFi R106_1.268.4_EQ100 优化更新!