mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群
MGR是MySQL Group Replication的缩写,即MySQL组复制。
在以往,我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题:
-
主从复制间容易发生复制延迟,尤其是在5.6以前的版本,以及当数据库实例中存在没有显式主键表时,很容易发生。
-
主从复制节点间的数据一致性无法自行实现最终一致性。
-
当主节点发生故障时,如果有多个从节点,无法自动从中选择合适的节点作为新的主节点。
-
如果采用(增强)半同步复制,那么当有个从节点因为负载较高、网络延迟或其他意外因素使得事务无法及时确认时,也会反过来影响主节点的事务提交。
MGR具备以下几个特点:
-
基于shared-nothing模式,所有节点都有一份完整数据,发生故障时可以直接切换。
-
MGR提供了数据一致性保障,默认是最终一致性,可根据业务特征需要自行调整一致性级别。
-
支持在线添加、删除节点,节点管理更方便。
-
支持故障自动检测及自动切换,发生故障时能自动切换到新的主节点,再配合MySQL Router中间件,应用层无需干预或调整。
-
支持单节点、多节点写入两种模式,可根据架构或业务需要选择哪种方案,不过强烈建议选用单主模式。
安装MGR集群
系统为Rocky 8.10三台,IP地址分别为192.168.40.13{4..6}
cat >> /etc/hosts << EOF
192.168.40.134 134host
192.168.40.135 135host
192.168.40.136 136host
EOF
安装MySQL8
yum install mysql-server -y &> /dev/null
配置&启动
配置文件为vim /etc/my.cnf.d/mysql-server.cnf
配置内容和相关信息:(注:uuid可以在终端使用uuidgen直接生成然后复制过来即可)
#/etc/my.cnf*.d/mysql-server.cnf
[mysqld]
...
#开启GTID,必须开启
gtid_mode = ON
#强制GTID的一致性
enforce_gtid_consistency = ON
#binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用
binlog_format = row
#server-id必须是唯一的
server-id = 133
#MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度
transaction_isolation = READ-COMMITTED
#因为集群会在故障恢复时互相检查binlog的数据,
#所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates = 1
#binlog校验规则,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum = NONE
#基于安全的考虑,MGR集群要求复制模式要改成slave记录记录到表中,不然就报错
master_info_repository = TABLE
#同上配套
relay_log_info_repository = TABLE
#组复制设置#记录事务的算法,官网建议设置该参数使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
#相当于此GROUP的名字,是UUID值,不能和集群内其他GTID值的UUID混用,可用uuidgen来生成一个新的,
#主要是用来区分整个内网里边的各个不同的GROUP,而且也是这个group内的GTID值的UUID
loose-group_replication_group_name = '5dbabbe6-8050-49a0-9131-1de449167446'
#IP地址白名单,默认只添加127.0.0.1,不会允许来自外部主机的连接,按需安全设置
loose-group_replication_ip_whitelist = '127.0.0.1/8,192.168.40.0/24'
#是否随服务器启动而自动启动组复制,不建议直接启动,怕故障恢复时有扰乱数据准确性的特殊情况
loose-group_replication_start_on_boot = OFF
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口
loose-group_replication_local_address = '192.168.40.150:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds = '192.168.40.150:33081,192.168.40.133:33081,192.168.40.152:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF
#是否启动单主模式,如果启动,则本实例是主库,提供读写,其他实例仅提供读,如果为off就是多主模式了
loose-group_replication_single_primary_mode = ON
#多主模式下,强制检查每一个实例是否允许该操作,如果不是多主,可以关闭
#loose-group_replication_enforce_update_everywhere_checks = on
上面的配置在每个节点进行同样的配置,只需修改IP和server-id
然后查看密码:grep -i password /var/log/mysql/mysqld.log,发现里面是没有密码的
[root@localhost ~]# grep -i password /var/log/mysql/mysqld.log
2025-02-11T08:53:38.546214Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
那我们直接登录,登录之后需要下载插件,使用命令:(终端)
mysql -e "install plugin group_replication soname 'group_replication.so'"
[root@localhost ~]# mysql -e "show plugins;" | grep "group_replication"
group_replication ACTIVE GROUP REPLICATION group_replication.so GPL
以上就说明插件安装好了
接下来创建MGR服务专用账户,并准备配置MGR服务通道,明文创建用户的时候这个操作没必要记录binlog,每个mysql主机上面创建用户是为了后面可以开启多主模式
mysql> set session sql_log_bin=0;
mysql> create user 'test'@'%' identified with mysql_native_password by '@OPENlab123';
mysql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO 'test'@'%';
#创建完用户后继续启用binlog记录
mysql> set session sql_log_bin=1;#配置MGR服务通道
#通道名字 group_replication_recovery 是固定的,不能修改
mysql> CHANGE MASTER TO MASTER_USER='test', MASTER_PASSWORD='@OPENlab123' FOR CHANNEL 'group_replication_recovery';
上面要在所有节点上面进行操作,接下来进入mysql配置
-
当你首次启动Group Replication集群时,需要一个节点来初始化整个集群。这个节点被称为“引导节点”。
-
group_replication_bootstrap_group=ON表示当前节点将作为引导节点,初始化一个新的集群。 -
如果不设置为
ON,节点会尝试加入一个已经存在的集群,而此时集群尚未初始化,因此会报错。
所以启动命令为下:(后面设置为OFF,这一步是必要的,以确保后续加入的节点不会尝试初始化新的集群)
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;
在mgr2\mgr3节点,进入mysql服务端,不需要SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
然后使用命令查看状态:SELECT * FROM performance_schema.replication_group_members;

如果出现MEMBER_STATE都为ONLINE则表示成功启动,如果出现了RECOVERING字段,那么查看日志tail /var/log/mysql/mysqld.log,一般都是/etc/hosts文件配置问题,里面的主机名要和系统主机名一致
上图可知我的136host为primary其他为secondary,下面我们进行转为多主模式和切换单主主机
切换主节点
我们通过上图中的MEMBER_ID可以看到每台主机是不同的,我们使用命令进行切换:
这里切换为135host为主节点
select group_replication_set_as_primary('1db22c88-e8ee-11ef-b7ab-000c299b2989');
这条命令可以在任何主机上执行,里面的那串数字就是MEMBER_ID,primary变为了135host

切换多主模式
在任何主机上面执行命令:select group_replication_switch_to_multi_primary_mode();

切换回单主模式
在任何主机上面执行命令:select group_replication_switch_to_single_primary_mode();

添加新节点和删除节点
新增
首先,要先完成MySQL Server初始化,创建好MGR专用账户、设置好MGR服务通道等前置工作。步骤同上
接下来,直接执行命令 start group_replication 启动MGR服务即可,新增的节点会进入分布式恢复这个步骤,它会从已有节点中自动选择一个作为捐献者(donor),并自行决定是直接读取binlog进行恢复,还是利用Clone进行全量恢复。
为了降低对primary节点的影响,建议选择其他的Secondary节点
新增节点:IP 192.168.40.137 137host
mysql> set global clone_valid_donor_list='192.168.150.136:3306';
在这个节点先停掉mgr服务(如果你之前启用了的话),关闭super_read_only模式
stop group_replication;
set global super_read_only=0;
clone instance from 'test'@192.168.40.136:3306 identified by '@OPENlab123';
上面填写的端口值3306不是mgr服务的端口,全量复制完数据后,该节点会进行一次自动重启。之后执行start group_replication,就可以正常加入集群了。
删除
在命令行模式下,一个节点想退出MGR集群,直接执行 stop group_replication 即可,如果这个节点只是临时退出集群,后面还想加回集群,则执行 start group_replication 即可自动再加入。而如果是想彻底退出集群,则停止MGR服务后,执行 reset master; reset slave all; 重置所有复制(包含MGR)相关的信息就可以了。
重启MGR集群
正常情况下,MGR集群中的Primary节点退出时,剩下的节点会自动选出新的Primary节点。当最后一个节点也退出时,相当于整个MGR集群都关闭了。这时候任何一个节点启动MGR服务后,都不会自动成为Primary节点,需要在启动MGR服务前,先设置 group_replication_bootstrap_group=ON,使其成为引导节点,再启动MGR服务,它才会成为Primary节点,后续启动的其他节点也才能正常加入集群。可自行测试,这里不再做演示。参考上面的引导节点启动(启动完毕之后要group_replication_bootstrap_group=OFF关闭)
小结:
MGR和传统主从复制类似,在运行过程中主要关注各节点的运行状态,以及Secondary节点的事务是否有延迟。本文介绍如何监控MGR节点状态、事务状态等。
-
表示各节点的状态,共有几种状态:ONLINE、RECOVERING、OFFLINE、ERROR、UNREACHABLE 等,下面分别介绍几种状态。
-
ONLINE,表示节点处于正常状态,可提供服务。
-
RECOVERING,表示节点正在进行分布式恢复,等待加入集群,这时候有可能正在从donor节点利用clone复制数据,或者传输binlog中。
-
OFFLINE,表示该节点当前处于离线状态。提醒,在正要加入或重加入集群时,可能也会有很短瞬间的状态显示为 OFFLINE。
-
ERROR,表示该节点当前处于错误状态,无法成为集群的一员。当节点正在进行分布式恢复或应用事务时,也是有可能处于这个状态的。当节点处于ERROR状态时,是无法参与集群事务裁决的。节点正在加入或重加入集群时,在完成兼容性检查成为正式MGR节点前,可能也会显示为ERROR状态。
-
UNREACHABLE,当组通信消息收发超时时,故障检测机制会将本节点标记为怀疑状态,怀疑其可能无法和其他节点连接,例如当某个节点意外断开连接时。当在某个节点上看到其他节点处于 UNREACHABLE 状态时,有可能意味着此时部分节点发生了网络分区,也就是多个节点分裂成两个或多个子集,子集内的节点可以互通,但子集间无法互通。
-
利用MySQL Router构建读写分离MGR集群
这里注重介绍利用MYSQL Router实现读写分离,读负载均衡和故障自动转移
建议把MySQL Router部署在应用服务器上,每个应用服务器都部署一套,这样应用程序可以直接连接本机IP,连接的效率更高,而且后端数据库发生变化时,程序端也无需修改IP配置。
部署MySQL Router
安装包去官网上面找对应和自己MySQL版本相同的安装(建议),安装选择mysql-router版本的
安装:rpm -ivh mysql-router-community-8.0.36-1.el8.x86_64.rpm
安装之后直接启动即可:systemctl enable --now mysqlrouter.service(开机自启)
[root@135host ~]# ps -ef | grep -v grep | grep mysqlrouter
mysqlro+ 27361 1 0 12:23 ? 00:00:00 /usr/bin/mysqlrouter
上面可以看到已经是正常启动了(本人资源有限,就在安装的有MGR上的主机上将就安装)
mysqlrouter的初始化自动生成的配置文件是:/etc/mysqlrouter/mysqlrouter.conf
写入以下内容
cat >> /etc/mysqlrouter/mysqlrouter.conf << EOF
[routing:write]
bind_address = 192.168.40.135#本地的IP地址
bind_port = 8001#自定义一个端口号用于监听读写
mode = read-write
destinations = 192.168.40.136:3306#目标MRG集群的primary主机
[routing:blanace]
bind_address = 192.168.40.135
bind_port = 8002#自定义一个端口用于监听读
mode = read-only
destinations = 192.168.40.135:3306,192.168.40.134:3306
EOF[root@135host ~]systemctl restart mysqlrouter.service#重启
确认分离效果:(创建用户只能在primary节点上面创建)
mysql> create user 'admin'@'%' identified with mysql_native_password by '@OPENlab123';
Query OK, 0 rows affected (0.09 sec)mysql> grant all on *.* to admin@'%';
Query OK, 0 rows affected (0.02 sec)
我们先使用命令在mysql终端中:
mysql> select MEMBER_ID,MEMBER_ROLE from performance_schema.replication_group_members;
+--------------------------------------+-------------+
| MEMBER_ID | MEMBER_ROLE |
+--------------------------------------+-------------+
| 165f4dc6-e8ee-11ef-bd10-000c29481d69 | PRIMARY |
| 1db22c88-e8ee-11ef-b7ab-000c299b2989 | SECONDARY |
| a9389006-e8ed-11ef-a2f2-000c29017dd6 | SECONDARY |
+--------------------------------------+-------------+
3 rows in set (0.00 sec)
然后在可以远程登录安装的有MySQL Router的主机:如果登录的MEMBER_ID为PEIMARY的话则表明,写分离成功
mysql -uadmin -p@OPENlab123 -h192.168.40.135 -P8001
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 53
Server version: 8.0.36 Source distributionCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid |
+--------------------------------------+
| 165f4dc6-e8ee-11ef-bd10-000c29481d69 |
+--------------------------------------+
1 row in set (0.01 sec)
经验证连接到了PRIMARY节点上,而换8002端口,开两个线程连接的话,一个会到134,一个会到135
mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid |
+--------------------------------------+
| 1db22c88-e8ee-11ef-b7ab-000c299b2989 |
+--------------------------------------+
1 row in set (0.00 sec)
mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid |
+--------------------------------------+
| a9389006-e8ed-11ef-a2f2-000c29017dd6 |
+--------------------------------------+
1 row in set (0.01 sec)
总结:
本文介绍了如何利用MySQL Router实现读写分离、读负载均衡,以及故障自动转移,利用MySQL Router可以提升应用端的透明性,后端数据库发生一些变化时,应用端无需跟着频繁变更。
相关文章:
mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群
MGR是MySQL Group Replication的缩写,即MySQL组复制。 在以往,我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题: 主从复制间容易发生复制延迟,尤其是在5.6以前的版本…...
保研考研机试攻略:python笔记(4)
🐨🐨🐨15各类查找 🐼🐼二分法 在我们写程序之前,我们要定义好边界,主要是考虑区间边界的闭开问题。 🐶1、左闭右闭 # 左闭右闭 def search(li, target): h = len(li) - 1l = 0#因为都是闭区间,h和l都可以取到并且相等while h >= l:mid = l + (h - l) // 2…...
如何保证缓存和数据库一致性
保证缓存和数据库一致性是分布式系统中的一个常见挑战。以下是几种常用的策略和方法,用于解决缓存与数据库之间的数据一致性问题: 1. 基础同步策略 基础同步策略包括以下几种常见的操作顺序: 先更新缓存再更新数据库:这种方法可能导致缓存中的数据成为脏数据,因为如果数…...
关于conda换镜像源,pip换源
目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源,恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…...
分布式服务框架 如何设计一个更合理的协议
1、概述 前面我们聊了如何设计一款分布式服务框架的问题,并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制,以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…...
git客户端版本下载
1. 访问官方网站:您可以在git官方网站(https://git-scm.com)上找到git软件最新稳定版下载链接。 2.如果需要下载其它版本,可访https://github.com/git-for-windows/git/releases选择想要的版本下载。...
前端快速生成接口方法
大家好,我是苏麟,今天聊一下OpenApi。 官网 : umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录(项目目录下)创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…...
mysql 学习12 存储引擎,mysql体系结构
mysql 体系结构 存储引擎简介 存储引擎 就是 存储数据,建立索引,更新/查询 数据等技术的实现方式。 存储引擎 是基于表的,而不是基于库的,所以存储引擎也可以称为 表类型 mysql默认的使用InnoDB 做为存储引擎 查看一下我们之前…...
【Java八股文】02-Java集合面试篇
【Java八股文】02-Java集合面试篇 概念数组与集合区别常用集合Java中的线程安全的集合是什么?Collections和Collection的区别 Listjava中list的几种实现把ArrayList变成线程安全的有哪些方法?CopyOnWriteArrayList是如何保证线程安全的? Mapj…...
稀土抑烟剂——为汽车火灾安全增添防线
一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素(如稀土氧化物和稀土金属化合物)开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能,减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性,…...
Unity进阶教程AOI算法原理详解
最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题,今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中,单服同时在线一般都会有几千人。当有个玩家执行一个操作,理想情况下要把玩家的操作广播同步给单…...
Python中的HTTP客户端库:httpx与request | python小知识
Python中的HTTP客户端库:httpx与request | python小知识 在Python中,发送HTTP请求和处理响应是网络编程的基础。requests和httpx是两个常用的HTTP库,它们都提供了简洁易用的API来发送HTTP请求。然而,httpx作为新一代的HTTP客户端…...
ASP.NET Core SignalR的分布式部署
假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,客户端3、4连接到服务器B上的ChatRoomHub,那么客户端1发送群聊消息时,只有客户端1、2能够收到,客户端3、4收不到;在客户端3…...
【Elasticsearch】match查询
Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析,包括其工作原理、参数配置和使用场景。 1.match查询的…...
AndroidStudio中可用的Ai插件
GitHub Copilot 这是我目前主用的,还行 1. 安装 打开 Android Studio:启动您的 Android Studio。 导航到插件设置: 点击菜单栏中的 File(文件) > Settings(设置)。在设置窗口中࿰…...
【C】链表算法题7 -- 环形链表||
leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到…...
STM32系统架构介绍
STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射(特殊的存储器)2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司,…...
Android Studio:EditText常见4种监听方式
1. 文本变化监听(TextWatcher) TextWatcher 主要用于监听 EditText 里的文本变化,它有三个方法: beforeTextChanged(文本变化前)onTextChanged(文本正在变化时)afterTextChanged&a…...
window patch按块分割矩阵
文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵,具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…...
机器学习(李宏毅)——BERT
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention、Transformer,可参阅我其他文章。 二、大纲 BERT简介self-…...
数据科学之数据管理|统计学
使用python学习统计 目录 01 统计学基础 7 一、 统计学介绍 7 二、 数据和变量 8 02 描述统计 10 一、 描述统计概述 10 二、 分类变量的描述 11 三、 等距数值变量的描述 13 四、 等比数值变量的描述 16 五、 常用软件包介绍 16 六、 数值变量的描述统计 18 (一)…...
深度学习-111-大语言模型LLM之基于langchain的结构化输出功能实现文本分类
文章目录 1 langchain的结构化输出1.1 推荐的使用流程1.2 模式定义1.3 返回结构化输出1.3.1 工具调用(方式一)1.3.2 JSON模式(方式二)1.3.3 结构化输出法(方式三)2 文本分类2.1 定义分类模式2.2 配置分类提示模板2.3 初始化分类模型2.4 分类示例3 参考附录1 langchain的结构化输…...
常见的排序算法:插入排序、选择排序、冒泡排序、快速排序
1、插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素…...
C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现
文章目录 一、std::gcd 的基本用法(一)包含头文件(二)函数签名(三)使用示例 二、std::gcd 的实现原理三、std::gcd 的优势(一)简洁易用(二)类型安全ÿ…...
力扣刷题(数组篇)
日期类 #pragma once#include <iostream> #include <assert.h> using namespace std;class Date { public:// 构造会频繁调用,所以直接放在类里面(类里面的成员函数默认为内联)Date(int year 1, int month 1, int day 1)//构…...
OpenWRT中常说的LuCI是什么——LuCI介绍(一)
我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西,但luci到底是什么东西,可能还不够清楚,今天就趁机来介绍下,openwrt中的luci,到底是个什么东西。 什么是LuCI? 首先,LuCI是OpenWRT中…...
机器学习核心算法解析
机器学习核心算法解析 机器学习是人工智能的核心技术之一,它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法,包括监督学习、无监督学习和强化学习,并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...
【目标检测json2txt】label从COCO格式json文件转YOLO格式txt文件
目录 🍀🍀1.COCO格式json文件 🌷🌷2.YOLO格式txt文件 💖💖3.xml2json代码(python) 🐸🐸4.输入输出展示 🙋🙋4.1输入json 🍂🍂4.2输出txt 整理不易,欢迎一键三连!!! 送你们一条美丽的--分割线-- 🍀🍀1.COCO格式json文件 COCO数…...
LVDS接口总结--(5)IDELAY3仿真
仿真参考资料如下: https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …...
Flink内存配置和优化
在 Apache Flink 1.18 的 Standalone 集群中,内存设置是一个关键配置,它直接影响集群的性能和稳定性。 Flink 的内存配置主要包括 JobManager 和 TaskManager 的内存分配。 以下是如何在 Standalone 模式下配置内存的详细说明。 JobManager 内存配置 Jo…...
