DMDSC搭建

devtools/2024/9/25 9:37:50/

DMDSC搭建

DMDSC 集群是一个多实例、单数据库的系统。多个数据库实例可以同时访问、修改同一个数据库的数据。用户可以登录集群中的任意一个数据库实例,获得完整的数据库服务。

​ 本文开始进行DMDSC集群的搭建学习

环境配置

虚拟机配置

  • 参数详情

    设备摘要
    内存2GB
    处理器2
    硬盘(SCSI)30G
    硬盘2(SCSI)20G
    CD/DVD(IDE)自动检测
    网络适配器NAT
    网络适配器2自定义(VMnet2)
    • 配置第二块磁盘:

      • 虚拟机点击设置>添加“硬盘”

        在这里插入图片描述

      • 选择磁盘类型

      在这里插入图片描述

      • 创建新磁盘

        在这里插入图片描述

      • 指定磁盘大小(20G足够了),注意这里是用的单个磁盘文件

        在这里插入图片描述

      • 指定磁盘文件

        在这里插入图片描述

      • 完成后重新打开设置,点击硬盘2,选择高级选项,勾选模式为独立、永久

        在这里插入图片描述

        • 如果独立勾选不了,说明虚拟机上存在快照,删掉就可以勾选
    • 在第二台虚拟机上同样添加这个磁盘

      • 使用现有磁盘

        在这里插入图片描述

      • 选择前面创建好了的那个磁盘位置

        在这里插入图片描述

      • 一样是在高级选项中选择独立、永久

        在这里插入图片描述

    • 修改两台虚拟机的vmx配置

      • 找到虚拟机下的vmx文件,打开,添加如下内容

        scsi1.sharedBus = "virtual" 
        scsi1:1.deviceType = "disk"disk.locking = "false"
        diskLib.dataCacheMaxSize = "0"
        diskLib.dataCacheMaxReadAheadSize = "0"
        diskLib.DataCacheMinReadAheadSize = "0"
        diskLib.dataCachePageSize = "4096"
        diskLib.maxUnsyncedWrites = "0"
        disk.EnableUUID = "TRUE"
        

        在这里插入图片描述

    • 启动虚拟机查看情况

      fdisk -l
      lsblk
      

      在这里插入图片描述

      • sdb就是新增的共享磁盘,表示磁盘添加成功
  • 操作系统和数据库版本

    • 操作系统:CentOS7.9
    • 数据库版本:dm8_20240408_x86_rh7_64

磁盘及基本规划

  • 目录规划
    用途目录路径
    数据库软件安装目录/home/dmdba/dmdbms
    本地归档日志文件存放目录/home/dmdba/dmarch
    远程归档日志文件存放目录/home/dmdba/remote_arch
    备份文件存放目录/home/dmdba/dmbak
  • 共享磁盘规划
    • 将共享磁盘分为四个区,用途及大小如下:

      用途磁盘/分区空间大小
      存放dcr信息/dev/sdb11GB
      存放vote信息/dev/sdb21GB
      存放redo日志/dev/sdb310GB
      存放数据文件/dev/sdb48GB
  • 端口规划
    • 两个主机最好使用相同用途的端口配置成相同的端口号

      端口用途
      5236数据库实例dmrw监听端口
      9741DCR检查数据库实例监听端口
      9341CSS进程TCP连接端口
      9351ASM进程TCP连接端口
      7236ASM的MAL系统TCP连接端口
      9236数据库实例的MAL系统TCP连接端口
      • 防火墙需要开放以上的端口

        netstat -ano | grep 5236
        
  • 服务器规划
    服务器IP心跳IP数据库实例名
    DSC1192.168.19.13010.10.10.7dmrw/DSC1
    DSC2192.168.19.13710.10.10.4dmrw/DSC2

系统准备

  • 数据库安装

  • 关闭系统防火墙

    • 查看防火墙状态,如果显示为active,需要关闭防火墙,禁用则开机不启动防火墙。

      systemctl status firewalld.service
      systemctl stop firewalld.service
      systemctl disable firewalld.service
      

      在这里插入图片描述

  • 关闭SELinux

    • 查看是否开启了SELinux,如果显示为Enforcing,需要改为Disabled,再重启系统使配置生效。

      getenforce
      vi /etc/selinux/config     
      # 进入文件后修改 SELINUX = disabled
      # 保存退出文件
      reboot
      

      在这里插入图片描述

磁盘分区及绑定

磁盘分区(DSC1)

  • 分区(DSC1)

    fdisk /dev/sdb
    
    • 依次输入下列信息:

      n → p → 1 → “回车” → 1G           # dcr
      n → p → 2 → “回车” → 1G           # vote
      n → p → 3 → “回车” → 10G          # log0
      n → p → 4 → “回车” → 回车          # data0
      w                                 # 保存
      

      在这里插入图片描述

      • 这里我输入1G不管用,所以参照着输入的扇区位置(正好都是想要的大小)
    • 查看分区(DSC1)

      fdisk -l /dev/sdb
      

      在这里插入图片描述

    • DSC2上查看分区

      • 如果DSC2没有显示分区,可能是共享磁盘挂载失败,需要删除之后重新加载

配置裸设备(DSC1 & DSC2)

需要在两个节点上都操作

  • 新建udev规则文件(DSC1 & DSC2)

    vi /etc/udev/rules.d/90-raw.rules
    
    • 添加以下内容:

      ACTION=="add",KERNEL=="sdb1",RUN+="/bin/raw /dev/raw/raw1 %N"
      ACTION=="add",KERNEL=="sdb2",RUN+="/bin/raw /dev/raw/raw2 %N"
      ACTION=="add",KERNEL=="sdb3",RUN+="/bin/raw /dev/raw/raw3 %N"
      ACTION=="add",KERNEL=="sdb4",RUN+="/bin/raw /dev/raw/raw4 %N"
      KERNEL=="raw[1-4]", OWNER="dmdba", GROUP="dinstall", MODE="660"
      

      在这里插入图片描述

    • 执行命令使udev生效

      udevadm trigger --type=devices --action=change
      
    • 查看配置是否成功

      ll /dev/raw/raw* 
      

      在这里插入图片描述

      • 如果查看不到配置的裸设备,就重启一下服务器

添加配置文件

配置DRC初始化配置文件(DSC1 & DSC2)

  • 创建配置文件存放目录

    两个节点都要执行,使用dmdba用户

    mkdir -p /home/dmdba/config 
    
  • 新建dmdrc_cfg.ini文件
    • 节点1使用dmdba用户

      vim /home/dmdba/config/dmdcr_cfg.ini
      
    • 添加以下内容:

      DCR_N_GRP             = 3
      DCR_VTD_PATH          = /dev/raw/raw2
      DCR_OGUID         = 63635  
      [GRP]DCR_GRP_TYPE         = CSS  DCR_GRP_NAME         = CSSDCR_GRP_N_EP         = 2DCR_GRP_DSKCHK_CNT   = 60
      [CSS]DCR_EP_NAME          = CSS1DCR_EP_HOST          = 10.10.10.7DCR_EP_PORT          = 9341
      [CSS]DCR_EP_NAME          = CSS2DCR_EP_HOST          = 10.10.10.4DCR_EP_PORT          = 9341[GRP]DCR_GRP_TYPE         = ASMDCR_GRP_NAME         = ASMDCR_GRP_N_EP         = 2DCR_GRP_DSKCHK_CNT   = 60
      [ASM]DCR_EP_NAME          = ASM1DCR_EP_SHM_KEY       = 93360DCR_EP_SHM_SIZE      = 10DCR_EP_HOST          = 10.10.10.7DCR_EP_PORT          = 9351DCR_EP_ASM_LOAD_PATH  = /dev/raw
      [ASM]DCR_EP_NAME          = ASM2DCR_EP_SHM_KEY       = 93361DCR_EP_SHM_SIZE      = 10DCR_EP_HOST          = 10.10.10.4DCR_EP_PORT          = 9351DCR_EP_ASM_LOAD_PATH  = /dev/raw[GRP]DCR_GRP_TYPE         = DBDCR_GRP_NAME         = DSCDCR_GRP_N_EP         = 2DCR_GRP_DSKCHK_CNT   = 60
      [DSC]DCR_EP_NAME         = DSC1DCR_EP_SEQNO                 = 0DCR_EP_PORT         = 5236DCR_CHECK_PORT            = 9741  
      [DSC]DCR_EP_NAME         = DSC2DCR_EP_SEQNO                 = 1DCR_EP_PORT         = 5236DCR_CHECK_PORT            = 9741
      

      在这里插入图片描述

创建ASM磁盘(DSC1)

  • 使用dmdba用户,到DM数据库安装目录下的bin目录中执行命令

    ./dmasmcmd
    
  • 进入ASM提示符后执行以下命令:

    create dcrdisk '/dev/raw/raw1' 'dcr'
    create votedisk '/dev/raw/raw2' 'vote'
    create asmdisk '/dev/raw/raw3' 'LOG0'
    create asmdisk '/dev/raw/raw4' 'DATA0'
    

    在这里插入图片描述

  • 初始化磁盘

    • 使用编辑好的dmdrc_cfg.ini文件初始化drcdisk和votedisk,并在ASM提示符执行以下命令

      init dcrdisk '/dev/raw/raw1' from '/home/dmdba/config/dmdcr_cfg.ini' identified by '1314520dsy'
      init votedisk '/dev/raw/raw2' from '/home/dmdba/config/dmdcr_cfg.ini' 
      

      在这里插入图片描述

配置ASM的MAL系统配置文件(DSC1 & DSC2)

两个节点都要配置,且文件内容相同

  • 执行以下命令:

    vi /home/dmdba/config/dmasvrmal.ini
    
    • 添加以下内容

      
      [MAL_INST1]
      MAL_INST_NAME              = ASM1
      MAL_HOST                    = 10.10.10.7
      MAL_PORT                    = 7236[MAL_INST2]
      MAL_INST_NAME              = ASM2
      MAL_HOST                    = 10.10.10.4
      MAL_PORT                    = 7236
      

      在这里插入图片描述

配置DRC启动配置文件(DSC1 & DSC2)

  • 两节点先创建dmdrc.ini文件

    • 两者在内容上主要是DMDSC_SEQNO和PATH中实例名有差距

    • 这里把ASM和DB的重启参数均设置为0,手动拉起ASM和DB服务

      vi /home/dmdba/config/dmdcr.ini
      
  • 节点1添加内容

    DMDCR_PATH     = /dev/raw/raw1
    DMDCR_MAL_PATH =/home/dmdba/config/dmasvrmal.ini  #dmasmsvr 使用的 MAL 配置文件路径
    DMDCR_SEQNO   = 0
    #ASM 重启参数,命令行方式启动
    DMDCR_ASM_RESTART_INTERVAL = 0
    DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr  dcr_ini=/home/dmdba/config/dmdcr.ini
    #DB 重启参数,命令行方式启动
    DMDCR_DB_RESTART_INTERVAL = 0
    DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver  path=/home/dmdba/config/dsc1/dm.ini dcr_ini=/home/dmdba/config/dmdcr.ini
    

    在这里插入图片描述

  • 节点2添加内容

    DMDCR_PATH     = /dev/raw/raw1
    DMDCR_MAL_PATH =/home/dmdba/config/dmasvrmal.ini  #dmasmsvr 使用的 MAL 配置文件路径
    DMDCR_SEQNO   = 1
    #ASM 重启参数,命令行方式启动
    DMDCR_ASM_RESTART_INTERVAL = 0
    DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr  dcr_ini=/home/dmdba/config/dmdcr.ini
    #DB 重启参数,命令行方式启动
    DMDCR_DB_RESTART_INTERVAL = 0
    DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver  path=/home/dmdba/config/dsc2/dm.ini dcr_ini=/home/dmdba/config/dmdcr.ini
    
    • 两个节点的DMDSC_SEQNO参数必须唯一,每个节点一个参数;DMDCR_DB_STARTUP_CMD 中启动脚本路径和配置文件路径要配置准确
    • 如果不配置 css 自动启动 asm 和 db ,则需要配置 DMDCR_ASM_RESTART_INTERVAL 和DMDCR_DB_RESTART_INTERVAL 为 0

启动DMDSC集群

启动DMCSS服务(DMDSC1 & DMDSC2)

  • 两个节点启动DMCSS,使用dmdba用户到数据库安装路径的bin目录下

    # 前台方式启动
    ./dmcss dcr_ini=/home/dmdba/config/dmdcr.ini 
    

    在这里插入图片描述

  • 或者使用服务方式启动

    # 服务方式启动
    systemctl start DmCSSServicecss1/DmCSSServicecss2
    

    注:

    先启动的节点是控制节点。

启动ASM服务(DSC1 & DSC2)

  • 两个节点启动ASM,使用dmdba用户到数据库安装路径的bin目录下

    ./dmasmsvr dcr_ini=/home/dmdba/config/dmdcr.ini
    

    在这里插入图片描述

    • 出现ASM server is Ready即为启动成功

创建ASM磁盘组(DSC1)

  • ASM启动成功后,节点1在dmdba用户下启动dmasmtool工具

    • 在ASM提示符下创建ASM磁盘组,创建REDO日志磁盘组和数据文件磁盘组

      ./dmasmtool dcr_ini=/home/dmdba/config/dmdcr.ini
      create diskgroup 'DMLOG' asmdisk '/dev/raw/raw3'
      create diskgroup 'DMDATA' asmdisk '/dev/raw/raw4'
      exit   # 退出
      

      在这里插入图片描述

初始化共享存储集群数据库实例(DSC1)

  • 配置dminit控制文件(DSC1)
    • 节点1使用dmdba用户执行命令

      vi /home/dmdba/config/dminit.ini
      
    • 添加以下内容

      db_name        = DSC
      system_path       = +DMDATA/datasystem        = +DMDATA/data/dsc/system.dbf
      system_size       = 128
      roll     = +DMDATA/data/dsc/roll.dbf
      roll_size     = 128
      main     = +DMDATA/data/dsc/main.dbf
      main_size     = 128
      ctl_path     = +DMDATA/data/dsc/dm.ctl
      ctl_size     = 8
      log_size     = 1024
      dcr_path     = /dev/raw/raw1   #dcr 磁盘路径,目前不支持 asm,只能是裸设备
      dcr_seqno     = 0
      auto_overwrite   = 1
      [DSC1] #inst_name 跟 dmdcr_cfg.ini 中 DB 类型 group 中 DCR_EP_NAME 对应
      config_path    = /home/dmdba/config/dsc1
      port_num     = 5236
      mal_host     = 10.10.10.7
      mal_port     = 9236
      log_path     = +DMLOG/log/DSC1_log01.log
      log_path     = +DMLOG/log/DSC1_log02.log
      [DSC2] #inst_name 跟 dmdcr_cfg.ini 中 DB 类型 group 中 DCR_EP_NAME 对应
      config_path    = /home/dmdba/config/dsc2
      port_num     = 5236
      mal_host     = 10.10.10.4
      mal_port     = 9236
      log_path     = +DMLOG/log/DSC2_log01.log
      log_path     = +DMLOG/log/DSC2_log02.log
      
  • 初始化实例(DSC1)

    • 节点1使用dmdba用户执行命令:

      ./dminit control=/home/dmdba/config/dminit.ini
      

      在这里插入图片描述

      • 显示create dm database success即说明初始化完成,并且会在ini控制文件目录下生成2个实例的配置文件
  • 复制相应配置文件(DSC1—>DSC2)

    • 将DSC2目录复制到节点2上对应的目录下

      scp -r dsc2 192.168.19.137:/home/dmdba/config/
      

      在这里插入图片描述

      在这里插入图片描述

      • 注意要到对应的config目录下进行复制
  • 注册服务(DSC1 & DSC2)

    • 配置成功后需要注册为系统服务,方便启动和关闭集群,以及实现开机自动启动

    • 两个节点都要注册,使用root用户,到数据库安装的script/root目录

      • 节点1执行命令:

        ./dm_service_installer.sh -t dmcss -p css1 -dcr_ini /home/dmdba/config/dmdcr.ini
        

        在这里插入图片描述

      • 节点2执行命令:

        ./dm_service_installer.sh -t dmcss -p css2 -dcr_ini /home/dmdba/config/dmdcr.ini
        

        在这里插入图片描述

  • 关闭前台的CSS,以服务方式启动CSS

    • 节点1命令:

      systemctl start DmCSSServicecss1
      
    • 节点2命令:

      systemctl start DmCSSServicecss2
      

启动数据库实例(DSC1 & DSC2)

  • 两个节点启动DB,使用dmdba用户到数据库安装的bin目录下执行命令

    • 节点1:

      ./dmserver path=/home/dmdba/config/dsc1/dm.ini dcr_ini=/home/dmdba/config/dmdcr.ini
      

      在这里插入图片描述

    • 节点2:

      ./dmserver path=/home/dmdba/config/dsc2/dm.ini dcr_ini=/home/dmdba/config/dmdcr.ini
      

      在这里插入图片描述

    • 报错说明:

      1. ASM连接异常:[code:-11041] ASM connection exception

        在这里插入图片描述

        • 原因:ASM服务未启动

        • 解决方法:启动ASM服务

          ./dmasmsvr dcr_ini=/home/dmdba/config/dmdcr.ini
          
      2. 端口连接错误:comm_create_lsnr_sockets_low failed to create socket or listen port:5236,errno:107

        在这里插入图片描述

        • 原因:5236端口被占用,估计是之前的数据库实例建立的时候给占用了
        • 解决:关闭已经启用了的数据库实例
      3. 不存在日志文件,无法启动数据库:+DMLOG/log/DSC_log01.log not exist,can not startup

        在这里插入图片描述

        • 原因:创建ASM磁盘组时,创建DMLOG失败

        • 解决方法:启用dmasmtool工具,创建日志磁盘组(DSC1节点)

          ./dmasmtool dcr_ini=/home/dmdba/config/dmdcr.ini
          create diskgroup 'DMLOG' asmdisk '/dev/raw/raw3'
          

          在这里插入图片描述

        • 重新创建数据库实例,目的是为了REDO日志可以指向磁盘组

        • 数据库实例创建好之后,再重新启动,可以成功(注意重新将DSC2文件夹给复制到节点2)

验证集群状态

配置监视器(DSC1)

  • 创建监视器配置文件

    • 任意节点都可以(这里我就在DSC1上),执行命令:

      vi /home/dmdba/config/dmcssm.ini
      
    • 添加内容:

      #和 dmdcr_cfg.ini 中的 DCR_OGUID 保持一致
      CSSM_OGUID = 63635
      #配置所有 CSS 的连接信息,
      #和 dmdcr_cfg.ini 中 CSS 配置项的 DCR_EP_HOST 和 DCR_EP_PORT 保持一致
      CSSM_CSS_IP = 10.10.10.7:9341
      CSSM_CSS_IP = 10.10.10.4:9341
      CSSM_LOG_PATH =/home/dmdba/dmdbms/log #监视器日志文件存放路径
      CSSM_LOG_FILE_SIZE = 1024 #每个日志文件最大 1024 MB
      CSSM_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
      
  • 启动监视器

    • 使用dmdba用户,到数据库安装目录的bin目录下执行命令:

      ./dmcssm ini_path=/home/dmdba/config/dmcssm.ini
      

      在这里插入图片描述

  • 输入命令查看状态

    在这里插入图片描述

    • inst_status为OPEN,vtd_status为WORKING,active为TRUE,说明服务正常

数据库共享验证(DSC1 & DSC2)

  • DSC1 & DSC2都查询T1表,显示不存在

    在这里插入图片描述

  • DSC1节点上创建T1表

    create table T1(id int,name varchar2(20));
    

    在这里插入图片描述

  • DCS1节点向表格插入数据

    insert into T1 values (1,'name1'),(2,'name2');
    

    在这里插入图片描述

  • DSC2节点上查询数据

    select * from T1;
    

    在这里插入图片描述

  • DSC1节点commit提交数据,DSC2再次查询数据

    ##DSC1
    commit;##DSC2
    select * from T1;
    

    在这里插入图片描述

    • 成功查询到数据,说明可以同步

客户端验证(DSC1/DSC2)

  • 任意一个节点上配置dm_svc.conf文件,执行命令(我这里在DSC2节点上配置)

    vi /etc/dm_svc.conf
    
    • 添加内容:

      dmdsc=(192.168.19.130:5236,192.168.19.137:5236) 
      

      在这里插入图片描述

  • 使用disql工具登录集群,查询视图v$dsc_ep_info,查看集群状态

    ./disql SYSDBA/SYSDBA@dmdsc##查询v$dsc_ep_info视图
    select * from v$dsc_ep_info;
    

    在这里插入图片描述

归档配置

共享存储集群归档需要配置本地归档和远程归档(保证每个节点都有所有归档日志)

  • 实例DSC1上配置

    alter database mount;
    alter database archivelog;
    alter database add archivelog 'DEST=/home/dmdba/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=102400';
    alter database add archivelog 'DEST=dsc2, TYPE=REMOTE, FILE_SIZE=1024, SPACE_LIMIT=102400, INCOMING_PATH=/home/dmdba/remote_arch';
    alter database open;
    
  • 实例DSC2上配置

    alter database mount;
    alter database archivelog;
    alter database add archivelog 'DEST=/home/dmdba/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=102400';
    alter database add archivelog 'DEST=dsc1, TYPE=REMOTE, FILE_SIZE=1024, SPACE_LIMIT=102400, INCOMING_PATH=/home/dmdba/remote_arch';
    alter database open;
    

关闭DMDSC集群

  1. 关闭数据库:监视器中执行ep stop dsc
  2. 关闭ASM:监视器中执行ep stop asm
  3. 关闭css:各节点关闭自己的css:systemctl stop DmCSSServicecss1/DmCSSServicecss2

注:

关闭顺序:dmserver—>dmasmsvr—>dmcss

总结

  • 本次是进行了DMDSC的手动启动搭建,让我对磁盘划分、初始化有了一个新的认识。我主要的错误就是自己执行命令时想图方便,结果弄巧成拙,所以还是要一步一步来才好。

参考

  • https://eco.dameng.com/document/dm/zh-cn/pm/dsc-overview.html

http://www.ppmy.cn/devtools/98704.html

相关文章

Prometheus 服务发现

1、基于文件的服务发现 基于文件的服务发现是仅仅略优于静态配置的服务发现方式,它不依赖于任何平台或第三方服务,因而也是最为简单和通用的实现方式。 Prometheus Server 会定期从文件中加载 Target 信息,文件可使用 YAML 和 JSON 格式&…

SpringBoot优雅的封装不同研发环境下(环境隔离)RocketMq自动ack和手动ack

1. RocketMq的maven依赖版本&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.3.0</version></dependency>2.RocketMq的yml文件&#xff1…

Unity+Addressable

前期准备 下载一个hfs本地服务器&#xff0c;打开即可 HFS ~ HTTP 文件服务器 (rejetto.com) 1.安装Addressable插件 创建组 2.使用图片创建预制体 放入Addressable Groups内 3.右键 新建组 创建预制体t拖拽放入新建组里 新组命名为Gameobject 简化名称 4.创建一个测试脚本 …

【git bash编码错误解决方案】启动conda环境时报错,其他terminal却正常

&#x1f50e;嘿&#xff0c;这里是慰慰&#x1f469;&#x1f3fb;‍&#x1f393;&#xff0c;会发各种类型的文章&#xff0c;智能专业&#xff0c;从事前端&#x1f43e; &#x1f389;如果有帮助的话&#xff0c;就点个赞叭&#xff0c;让我开心一下&#xff01;&#x1f…

Python将Word文档转为PDF

使用python将word转pdf_py work转pdf-CSDN博客 掌握Python技巧&#xff1a;PDF文件的加密和水印处理-CSDN博客

UE5用蓝图实现物体A始终朝向物体B |Find Look at Rotation|

非常常用的蓝图节点 |Find Look at Rotation|&#xff1a;获取 物体A 到 物体B 的Rotator。 Tick中将算出的Rotator设置给物体A&#xff0c;即可实现永远朝向物体B

2024/8/25周报

摘要 Abstract 多目标优化算法 多目标优化&#xff08;Multi-Objective Optimization, MOO&#xff09;是优化领域的一个分支&#xff0c;它处理的是同时优化多个相互冲突的目标函数的问题。在实际应用中&#xff0c;很少有决策问题只涉及单一目标&#xff0c;通常需要在多个…

SolidityFoundry Merkle Airdrop

Merkle airdrop Merkle Tree&#xff0c;也叫默克尔树或哈希树&#xff0c;是区块链的底层加密技术&#xff0c;被比特币和以太坊区块链广泛采用。Merkle Tree允许对大型数据结构的内容进行有效和安全的验证&#xff08;Merkle Proof&#xff09;。对于有N个叶子结点的Merkle T…