达梦MPP(带主备)集群搭建

为了提高MPP系统可靠性,克服由于单节点故障导致整个系统不能继续正常工作的问题,DM在普通的MPP系统基础上,引入数据守护主备机制,为每一个MPP节点配置一个实时备库作为备份节点,必要时备库可切换为主库代替故障节点工作,提高系统的可靠性和可用性。我们推荐用户在使用DM MPP时都应使用MPP主备守护系统以确保系统可靠性。
MPP主备的主要目的是为DMMPP集群提供数据可靠性保障,备库只做数据容灾、备份,MPP备库并不是MPP集群的一部分,只是某个MPP节点(主库)的镜像。MPP备库不参与MPP操作,与其他MPP备库之间也没有任何关系,MPP备库只能以单节点方式提供只读服务,但不提供全局的MPP只读服务。
为了提高系统可靠性并节约硬件资源,DM MPP主备系统可采用交叉守护的方式,即每个EP和其对应的备库实例不在同一台主机上,将EP与别的EP的备库放在一台主机上。
完成MPP主备集群的搭建,要求如下:
1)完成MPP集群(带主备)的部署,并测试建表和插入数据是否会根据分布列进行自动分发。
2)测试故障一个节点后,集群可持续提供服务。

一、环境规划

配置一个两节点的MPP(主备)集群,实例名为EP01、EP02、EP01_1和EP01_2,相关配置信息如下。

机器IP实例名实例对外端口MAL端口MAL守护进程端口守护进程端口OGUID守护组安装目录实例归档归档上限
A机器192.168.148.128EP01523653365436553645331GRP1/home/dmdba/dmdbms/home/dmdba/dmdbms/data51200
A机器192.168.148.128EP02523753375437553745332GRP2/home/dmdba/dmdbms/home/dmdba/dmdbms/data51200
B机器192.168.148.130EP01_1523653365436553645331GRP1/home/dmdba/dmdbms/home/dmdba/dmdbms/data51200
B机器192.168.148.130EP01_2523753375437553745332GRP2/home/dmdba/dmdbms/home/dmdba/dmdbms/data51200

二、环境搭建

2.1创建实例

2.1.1创建实例EP01
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/home/dmdba/dmdbms/data/  PAGE_SIZE=32  EXTENT_SIZE=32  CASE_SENSITIVE=Y DB_NAME=EP01  INSTANCE_NAME=EP01 PORT_NUM=5236 LOG_SIZE=1024 SYSDBA_PWD=DaMeng123 SYSAUDITOR_PWD=DaMeng123
2.1.2 创建实例EP02
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/home/dmdba/dmdbms/data/  PAGE_SIZE=32  EXTENT_SIZE=32  CASE_SENSITIVE=Y DB_NAME=EP02  INSTANCE_NAME=EP02 PORT_NUM=5237 LOG_SIZE=1024 SYSDBA_PWD=DaMeng123 SYSAUDITOR_PWD=DaMeng123
2.1.3 创建实例EP01_1
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/home/dmdba/dmdbms/data/  PAGE_SIZE=32  EXTENT_SIZE=32  CASE_SENSITIVE=Y DB_NAME=EP01_1  INSTANCE_NAME=EP01_1 PORT_NUM=5236 LOG_SIZE=1024 SYSDBA_PWD=DaMeng123 SYSAUDITOR_PWD=DaMeng123
2.1.4 创建实例EP02_1
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/home/dmdba/dmdbms/data/  PAGE_SIZE=32  EXTENT_SIZE=32  CASE_SENSITIVE=Y DB_NAME=EP02_1  INSTANCE_NAME=EP02_1 PORT_NUM=5237 LOG_SIZE=1024 SYSDBA_PWD=DaMeng123 SYSAUDITOR_PWD=DaMeng123
2.1.5 注册服务

A机器

su root
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dmdbms/data/EP01/dm.ini -p DMSERVER01
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dmdbms/data/EP02/dm.ini -p DMSERVER02

B机器

su root
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dmdbms/data/EP01_1/dm.ini -p DMSERVER01
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dmdbms/data/EP02_1/dm.ini -p DMSERVER02
2.1.6创建成功后启动服务

两机器均需要执行

systemctl start DmServiceDMSERVER01.service
systemctl start DmServiceDMSERVER02.service

注意:两台机器关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

2.2 配置EP01库参数

2.2.1修改dm.ini
cd /home/dmdba/dmdbms/data/EP01
vim /home/dmdba/dmdbms/data/EP01/dm.ini
#configuration file
ALTER_MODE_STATUS      =      0      #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS      =      2      #不允许备库 OFFLINE 表空间
MAL_INI                =      1      #打开 MAL 系统
ARCH_INI               =      1      #打开归档配置
MPP_INI                =      1      #启用 MPP 配置
2.2.2创建dmmal.ini
vim /home/dmdba/dmdbms/data/EP01/dmmal.ini
MAL_CHECK_INTERVAL           =    5      #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL       =    5      #判定 MAL 链路断开的时间

[MAL_INST1]
MAL_INST_NAME               =   EP01  #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST2]
MAL_INST_NAME               = EP02
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口[MAL_INST3]
MAL_INST_NAME              = EP01_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST4]
MAL_INST_NAME              = EP02_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237     #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口
2.2.3创建dmarch.ini
vim /home/dmdba/dmdbms/data/EP01/dmarch.ini
#DaMeng Database Archive Configuration file
#0:高性能,1:事务一致
ARCH_WAIT_APPLY      	 = 0        
[ARCHIVE_LOCAL1]
#本地归档类型
ARCH_TYPE            = LOCAL        
#本地归档存放路径 
ARCH_DEST            = /home/dmdba/dmdbms/data/EP01/arch  
ARCH_FILE_SIZE       = 1024
ARCH_SPACE_LIMIT     = 51200
ARCH_FLUSH_BUF_SIZE  = 2    
ARCH_HANG_FLAG       = 1
[ARCHIVE_REALTIME1]
#实时归档类型
ARCH_TYPE            = REALTIME
#实时归档目标实例名
ARCH_DEST            = EP01_1
2.2.4配置dmmpp.ini
vim /home/dmdba/dmdbms/data/EP01/dmmpp.ini
[SERVICE_NAME1] 
MPP_SEQ_NO = 0 
MPP_INST_NAME = EP01[SERVICE_NAME2] 
MPP_SEQ_NO = 1 
MPP_INST_NAME = EP02

#使用DM提供的工具dmctlcvt将dmmpp.ini转换成dmmpp.ctl,dmctlcvt工具在DM安装目录的“bin”子目录中。
转换生成的dmmpp.ctl需要放在与dm.ini同一个目录。下面的命令将dmmpp.ini转换为dmmpp.ctl,命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。

su - root
chown -R dmdba:2002 /home/dmdba/dmdbms
chmod -R 755 /home/dmdba/dmdbms
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmctlcvt TYPE=2 SRC=/home/dmdba/dmdbms/data/EP01/dmmpp.ini  DEST=/home/dmdba/dmdbms/data/EP01/dmmpp.ctl

2.3 配置EP02库参数

2.3.1修改dm.ini
cd /home/dmdba/dmdbms/data/EP02
vim /home/dmdba/dmdbms/data/EP02/dm.ini
#configuration file
ALTER_MODE_STATUS      =      0      #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS      =      2      #不允许备库 OFFLINE 表空间
MAL_INI                =      1      #打开 MAL 系统
ARCH_INI               =      1      #打开归档配置
MPP_INI                =      1      #启用 MPP 配置
2.3.2创建dmmal.ini
vim /home/dmdba/dmdbms/data/EP02/dmmal.ini
MAL_CHECK_INTERVAL           =    5      #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL       =    5      #判定 MAL 链路断开的时间[MAL_INST1]
MAL_INST_NAME               =   EP01  #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST2]
MAL_INST_NAME               = EP02
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口[MAL_INST3]
MAL_INST_NAME              = EP01_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST4]
MAL_INST_NAME              = EP02_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237     #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口
2.3.3创建dmarch.ini
vim /home/dmdba/dmdbms/data/EP01/dmarch.ini
#DaMeng Database Archive Configuration file
#0:高性能,1:事务一致
ARCH_WAIT_APPLY      	 = 0        
[ARCHIVE_LOCAL1]
#本地归档类型
ARCH_TYPE            = LOCAL        
#本地归档存放路径 
ARCH_DEST            = /home/dmdba/dmdbms/data/EP02/arch  
ARCH_FILE_SIZE       = 1024
ARCH_SPACE_LIMIT     = 51200
ARCH_FLUSH_BUF_SIZE  = 2    
ARCH_HANG_FLAG       = 1
[ARCHIVE_REALTIME1]
#实时归档类型
ARCH_TYPE            = REALTIME
#实时归档目标实例名
ARCH_DEST            = EP02_1
2.3.4配置dmmpp.ini
vim /home/dmdba/dmdbms/data/EP02/dmmpp.ini
[SERVICE_NAME1] 
MPP_SEQ_NO = 0 
MPP_INST_NAME = EP01[SERVICE_NAME2] 
MPP_SEQ_NO = 1 
MPP_INST_NAME = EP02

使用DM提供的工具dmctlcvt将dmmpp.ini转换成dmmpp.ctl,dmctlcvt工具在DM安装目录的“bin”子目录中。
转换生成的dmmpp.ctl需要放在与dm.ini同一个目录。下面的命令将dmmpp.ini转换为dmmpp.ctl,命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。

su - root
chown -R dmdba:2002 /home/dmdba/dmdbms
chmod -R 755 /home/dmdba/dmdbms
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmctlcvt TYPE=2 SRC=/home/dmdba/dmdbms/data/EP02/dmmpp.ini  DEST=/home/dmdba/dmdbms/data/EP02/dmmpp.ctl

2.4 配置EP01_1库参数

2.4.1修改dm.ini
cd /home/dmdba/dmdbms/data/EP01_1
vim /home/dmdba/dmdbms/data/EP01_1/dm.ini
#configuration file
ALTER_MODE_STATUS      =      0      #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS      =      2      #不允许备库 OFFLINE 表空间
MAL_INI                =      1      #打开 MAL 系统
ARCH_INI               =      1      #打开归档配置
MPP_INI                =      1      #启用 MPP 配置
2.4.2创建dmmal.ini
vim /home/dmdba/dmdbms/data/EP01_1/dmmal.ini
MAL_CHECK_INTERVAL           =    5      #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL       =    5      #判定 MAL 链路断开的时间[MAL_INST1]
MAL_INST_NAME               =   EP01  #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST2]
MAL_INST_NAME               = EP02
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口[MAL_INST3]
MAL_INST_NAME              = EP01_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST4]
MAL_INST_NAME              = EP02_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237     #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口
2.4.3创建dmarch.ini
vim /home/dmdba/dmdbms/data/EP01_1/dmarch.ini
#DaMeng Database Archive Configuration file
#0:高性能,1:事务一致
ARCH_WAIT_APPLY      	 = 0        
[ARCHIVE_LOCAL1]
#本地归档类型
ARCH_TYPE            = LOCAL        
#本地归档存放路径 
ARCH_DEST            = /home/dmdba/dmdbms/data/EP01_1/arch  
ARCH_FILE_SIZE       = 1024
ARCH_SPACE_LIMIT     = 51200
ARCH_FLUSH_BUF_SIZE  = 2    
ARCH_HANG_FLAG       = 1
[ARCHIVE_REALTIME1]
#实时归档类型
ARCH_TYPE            = REALTIME
#实时归档目标实例名
ARCH_DEST            = EP01
2.4.4配置dmmpp.ini
vim /home/dmdba/dmdbms/data/EP01_1/dmmpp.ini
[SERVICE_NAME1] 
MPP_SEQ_NO = 0 
MPP_INST_NAME = EP01[SERVICE_NAME2] 
MPP_SEQ_NO = 1 
MPP_INST_NAME = EP02

使用DM提供的工具dmctlcvt将dmmpp.ini转换成dmmpp.ctl,dmctlcvt工具在DM安装目录的“bin”子目录中。
转换生成的dmmpp.ctl需要放在与dm.ini同一个目录。下面的命令将dmmpp.ini转换为dmmpp.ctl,命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。

su - root
chown -R dmdba:2002 /home/dmdba/dmdbms
chmod -R 755 /home/dmdba/dmdbms
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmctlcvt TYPE=2 SRC=/home/dmdba/dmdbms/data/EP01_1/dmmpp.ini  DEST=/home/dmdba/dmdbms/data/EP01_1/dmmpp.ctl

2.5 配置EP02_1库参数

2.5.1修改dm.ini
cd /home/dmdba/dmdbms/data/EP02_1
vim /home/dmdba/dmdbms/data/EP02_1/dm.ini
#configuration file
ALTER_MODE_STATUS      =      0      #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS      =      2      #不允许备库 OFFLINE 表空间
MAL_INI                =      1      #打开 MAL 系统
ARCH_INI               =      1      #打开归档配置
MPP_INI                =      1      #启用 MPP 配置
2.5.2创建dmmal.ini
vim /home/dmdba/dmdbms/data/EP02_1/dmmal.ini
MAL_CHECK_INTERVAL           =    5      #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL       =    5      #判定 MAL 链路断开的时间[MAL_INST1]
MAL_INST_NAME               =   EP01  #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST2]
MAL_INST_NAME               = EP02
MAL_HOST                    = 192.168.148.128  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.128  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口[MAL_INST3]
MAL_INST_NAME              = EP01_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5336     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5236      #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口[MAL_INST4]
MAL_INST_NAME              = EP02_1
MAL_HOST                    = 192.168.148.130  #MAL 系统监听 TCP 连接的 IP 地址​
MAL_PORT                    =   5337     #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST               = 192.168.148.130  #实例的对外服务 IP 地址
MAL_INST_PORT               =  5237     #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT              = 5437  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5537  #实例监听守护进程 TCP 连接的端口
2.5.3创建dmarch.ini
vim /home/dmdba/dmdbms/data/EP02_1/dmarch.ini
#DaMeng Database Archive Configuration file
#0:高性能,1:事务一致
ARCH_WAIT_APPLY      	 = 0        
[ARCHIVE_LOCAL1]
#本地归档类型
ARCH_TYPE            = LOCAL        
#本地归档存放路径 
ARCH_DEST            = /home/dmdba/dmdbms/data/EP02_1/arch  
ARCH_FILE_SIZE       = 1024
ARCH_SPACE_LIMIT     = 51200
ARCH_FLUSH_BUF_SIZE  = 2    
ARCH_HANG_FLAG       = 1
[ARCHIVE_REALTIME1]
#实时归档类型
ARCH_TYPE            = REALTIME
#实时归档目标实例名
ARCH_DEST            = EP02
2.5.4配置dmmpp.ini
vim /home/dmdba/dmdbms/data/EP02_1/dmmpp.ini
[SERVICE_NAME1] 
MPP_SEQ_NO = 0 
MPP_INST_NAME = EP01[SERVICE_NAME2] 
MPP_SEQ_NO = 1 
MPP_INST_NAME = EP02

使用DM提供的工具dmctlcvt将dmmpp.ini转换成dmmpp.ctl,dmctlcvt工具在DM安装目录的“bin”子目录中。
转换生成的dmmpp.ctl需要放在与dm.ini同一个目录。下面的命令将dmmpp.ini转换为dmmpp.ctl,命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。

su - root
chown -R dmdba:2002 /home/dmdba/dmdbms
chmod -R 755 /home/dmdba/dmdbms
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmctlcvt TYPE=2 SRC=/home/dmdba/dmdbms/data/EP02_1/dmmpp.ini  DEST=/home/dmdba/dmdbms/data/EP02_1/dmmpp.ctl

2.6 配置dmwatcher.ini

一般来说,每个单独的实例都是使用一个单独的守护进程守护。比如前面的实时主备和读写分离集群的配置。
本例中,由于同一台机器上有不同组的两个实例,我们可以只配置一个守护进程,同时守护两个实例。A机器上配置dmwatcher.ini,配置为全局守护类型,使用自动切换模式。

2.6.1 在A机器配置dmwatcher.ini
cd /home/dmdba/dmdbms/data/EP01
vim /home/dmdba/dmdbms/data/EP01/dm.ini
[GRP1]
DW_TYPE               = GLOBAL       #全局守护类型
DW_MODE               = AUTO         #自动切换模式
DW_ERROR_TIME         = 10           #远程守护进程故障认定时间
INST_RECOVER_TIME     = 60           #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME       = 10           #本地实例故障认定时间
INST_OGUID            = 45331        #守护系统唯一 OGUID 值
INST_INI              = /home/dmdba/dmdbms/data/EP01/dm.ini 配置文件路径
INST_AUTO_RESTART     = 1            #打开实例的自动启动功能
INST_STARTUP_CMD      = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD   = 0            #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD  = 0            #指定备库重演日志的时间阈值,默认关闭[GRP2]
​DW_TYPE               = GLOBAL       #全局守护类型
DW_MODE               = AUTO         #自动切换模式
DW_ERROR_TIME         = 10           #远程守护进程故障认定时间
INST_RECOVER_TIME     = 60           #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME       = 10           #本地实例故障认定时间
INST_OGUID            = 45332        #守护系统唯一 OGUID 值
INST_INI              = /home/dmdba/dmdbms/data/EP02/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART    = 1             #打开实例的自动启动功能
INST_STARTUP_CMD     = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD  = 0             #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0             #指定备库重演日志的时间阈值,默认关闭
2.6.2 在B机器配置dmwatcher.ini
cd /home/dmdba/dmdbms/data/EP01_1
vim /home/dmdba/dmdbms/data/EP01_1/dm.ini
[GRP1]
DW_TYPE               = GLOBAL       #全局守护类型
DW_MODE               = AUTO         #自动切换模式
DW_ERROR_TIME         = 10           #远程守护进程故障认定时间
INST_RECOVER_TIME     = 60           #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME       = 10           #本地实例故障认定时间
INST_OGUID            = 45331        #守护系统唯一 OGUID 值
INST_INI              = /home/dmdba/dmdbms/data/EP01_1/dm.ini 配置文件路径
INST_AUTO_RESTART     = 1            #打开实例的自动启动功能
INST_STARTUP_CMD      = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD   = 0            #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD  = 0            #指定备库重演日志的时间阈值,默认关闭[GRP2]
​DW_TYPE               = GLOBAL       #全局守护类型
DW_MODE               = AUTO         #自动切换模式
DW_ERROR_TIME         = 10           #远程守护进程故障认定时间
INST_RECOVER_TIME     = 60           #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME       = 10           #本地实例故障认定时间
INST_OGUID            = 45332        #守护系统唯一 OGUID 值
INST_INI              = /home/dmdba/dmdbms/data/EP02_1/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART    = 1             #打开实例的自动启动功能
INST_STARTUP_CMD     = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD  = 0             #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0             #指定备库重演日志的时间阈值,默认关闭

2.7 主库备份从库启动

#两机器均需执行
systemctl stop DmServiceDMSERVER01.service
systemctl stop DmServiceDMSERVER02.service
2.7.1主从库均启动AP服务
cd /home/dmdba/dmdbms/bin/service_template/
./DmAPService start
2.7.2备份主库

节点EP01(A机器)

cd /home/dmdba/dmdbms/bin
./dmrman
backup database '/home/dmdba/dmdbms/data/EP01/dm.ini' backupset '/home/dmdba/dmdbms/data/EP01/bak/dmbackup';

节点EP02(A机器)

cd /home/dmdba/dmdbms/bin
./dmrman
backup database '/home/dmdba/dmdbms/data/EP02/dm.ini' backupset '/home/dmdba/dmdbms/data/EP02/bak/dmbackup';
2.7.3备份文件拷贝到从库(A机器)

节点EP01

scp -r /home/dmdba/dmdbms/data/EP01/bak/dmbackup root@192.168.148.130:/home/dmdba/dmdbms/data/EP01_1/bak

节点EP02

scp -r /home/dmdba/dmdbms/data/EP02/bak/dmbackup root@192.168.148.130:/home/dmdba/dmdbms/data/EP02_1/bak
2.7.4恢复从库(B机器)

节点EP01

su dmdba
cd /home/dmdba/dmdbms/bin
./dmrman
restore database '/home/dmdba/dmdbms/data/EP01_1/dm.ini' from backupset '/home/dmdba/dmdbms/data/EP01_1/bak/dmbackup';
recover database '/home/dmdba/dmdbms/data/EP01_1/dm.ini' from backupset '/home/dmdba/dmdbms/data/EP01_1/bak/dmbackup';
recover database '/home/dmdba/dmdbms/data/EP01_1/dm.ini' update db_magic;

在这里插入图片描述
节点EP02

su dmdba
cd /home/dmdba/dmdbms/bin
./dmrman
restore database '/home/dmdba/dmdbms/data/EP02_1/dm.ini' from backupset '/home/dmdba/dmdbms/data/EP02_1/bak/dmbackup';
recover database '/home/dmdba/dmdbms/data/EP02_1/dm.ini' from backupset '/home/dmdba/dmdbms/data/EP02_1/bak/dmbackup';
recover database '/home/dmdba/dmdbms/data/EP02_1/dm.ini' update db_magic;

在这里插入图片描述

2.7.5注册服务

A机器执行

su root
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p EP01 -dm_ini /home/dmdba/dmdbms/data/EP01/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p EP02 -dm_ini /home/dmdba/dmdbms/data/EP02/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdba/dmdbms/data/EP01/dmwatcher.ini

在这里插入图片描述
B机器执行

su root
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p EP01_1 -dm_ini /home/dmdba/dmdbms/data/EP01_1/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p EP02_1 -dm_ini /home/dmdba/dmdbms/data/EP02_1/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdba/dmdbms/data/EP01_1/dmwatcher.ini

在这里插入图片描述

2.7.6启动主备服务并修改参数

A机器执行

/home/dmdba/dmdbms/bin/DmServiceEP01 start
/home/dmdba/dmdbms/bin/DmServiceEP02 start/home/dmdba/dmdbms/bin/disql SYSDBA/DaMeng123:5236
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(45331);
ALTER DATABASE PRIMARY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);/home/dmdba/dmdbms/bin/disql SYSDBA/DaMeng123:5237
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(45332);
ALTER DATABASE PRIMARY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

B机器执行

/home/dmdba/dmdbms/bin/DmServiceEP01_1 start
/home/dmdba/dmdbms/bin/DmServiceEP02_1 start/home/dmdba/dmdbms/bin/disql SYSDBA/DaMeng123:5236
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(45331);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);/home/dmdba/dmdbms/bin/disql SYSDBA/DaMeng123:5237
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(45332);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

启动守护进程(两台机器均需要启动)

/home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start

2.8 配置dmmonitor.ini

修改 dmmonitor.ini 配置确认监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT 配置项保持一致。
创建 dmmonitor.ini

vi /home/dmdba/dmdbms/data/EP01_1/dmmonitor.ini
MON_DW_CONFIRM              = 1              #确认监视器模式
MON_LOG_PATH                = ../log  #监视器日志文件存放路径
MON_LOG_INTERVAL            = 60             #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE           = 32             #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT         = 0              #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID              = 45331          #组 GRP1 的唯一 OGUID 值 
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP                   = 192.168.148.128:5436
MON_DW_IP                   = 192.168.148.130:5436
[GRP2]
MON_INST_OGUID              = 45332          #组 GRP2 的唯一 OGUID 值 
#以下配置为监视器到组 GRP2 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP                  = 192.168.148.128:5437
MON_DW_IP                  = 192.168.148.130:5437

启动监听器

cd /home/dmdba/dmdbms/bin
./dmmonitor /home/dmdba/dmdbms/data/EP01_1/dmmonitor.ini

在这里插入图片描述

三、环境验证

登录监听器输入命令

show

(GRP1)
在这里插入图片描述
(GRP2)
在这里插入图片描述
输入以下SQL语句,查看两节点状态是否为OK:

SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();

在这里插入图片描述

四、验证是否根据分布列进行自动分发

4.1建立不同的分布式表

--1、创建哈希分布表T_HASH,分布列为 C1
CREATE TABLE T_HASH(C1 INT, C2 CHAR(10))DISTRIBUTED BY HASH (C1);-- 插入测试数据
INSERT INTO T_HASH VALUES (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E');-- 验证数据分布(正确方法)
--MPP系统下设置当前会话是否只查询本节点数据。如果不设置,表示可以查询全部节点数据,0表示全部,1表示当前节点
SP_SET_SESSION_MPP_SELECT_LOCAL(0);
--查询MPP系统下当前会话是否只查询本节点数据。0表示查询全部节点数据,1表示只查询本节点数据
SELECT SF_GET_SESSION_MPP_SELECT_LOCAL();
--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_HASH');

可以观察到EP01、EP02和上能够查询到各个节点的数据,EP01_1和EP02_1只能观察到当前节点的数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

--2、创建随机分布表 T_RANDOM
CREATE TABLE T_RANDOM(C1 INT, C2 CHAR(10))DISTRIBUTED RANDOMLY;-- 插入数据
INSERT INTO T_RANDOM VALUES 
(1, 'A'), (2, 'B'), (3, 'C'), 
(4, 'D'), (5, 'E'), (6, 'F');-- 验证数据分布(正确方法)
--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_RANDOM');

在这里插入图片描述

--3、创建复制分布表 T_FULLY
CREATE TABLE T_FULLY(C1 INT, C2 CHAR(10))DISTRIBUTED FULLY;-- 插入数据
INSERT INTO T_FULLY VALUES 
(1, 'A'), (2, 'B'), (3, 'C'), 
(4, 'D'), (5, 'E'), (6, 'F');--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_FULLY');

在这里插入图片描述

--4、创建范围分布表 T_RANGE,分布列为 C1
CREATE TABLE T_RANGE (C1 INT, C2 CHAR(10)) DISTRIBUTED BY RANGE (C1) (VALUES EQU OR LESS THAN (100) ON EP01, VALUES LESS
THAN(MAXVALUE) ON EP02);
-- 插入测试数据
INSERT INTO T_RANGE VALUES (50, 'A'), (150, 'B'), (25, 'C'), (300, 'D'), (75, 'E');--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_RANGE');

在这里插入图片描述

--5、创建LIST分布表T_LIST,分布列为C1
CREATE TABLE T_LIST(C1 INT, C2 CHAR(10))
DISTRIBUTED BY LIST (C1) (VALUES(3) ON EP01,VALUES(4) ON EP02);-- 插入测试数据
INSERT INTO T_LIST VALUES (3, 'A'), (4, 'B'), (4, 'C'), (3, 'D'), (4, 'E');--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_LIST');

在这里插入图片描述

--6、创建哈希分布表的范围水平分区表
CREATE TABLE T_HASH_RANGE_PARTITION
(C1 INT, C2 CHAR(10), C3 CHAR(10))
PARTITION BY RANGE(C1)
(
PARTITION PART_1 VALUES LESS THAN(0) ,
PARTITION PART_2 VALUES LESS THAN(10) ,
PARTITION PART_3 VALUES LESS THAN(100) ,
PARTITION PART_4 VALUES LESS THAN(MAXVALUE)
)
DISTRIBUTED BY HASH (C1);-- 插入测试数据
INSERT INTO T_HASH_RANGE_PARTITION VALUES 
(-5, 'A', 'X'), (5, 'B', 'Y'), (50, 'C', 'Z'), (500, 'D', 'W');--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_HASH_RANGE_PARTITION');

在这里插入图片描述
总结:
哈希分布:数据均匀分布,相同键值总在同一节点,适合JOIN操作频繁的表
随机分布:数据完全随机分布,适合没有明显JOIN需求的表
复制分布:每个节点有完整数据副本,适合小表、维度表
范围分布:按范围值分布数据,适合范围查询频繁的场景
LIST分布:按离散值分布,适合有明显分类属性的数据
组合分布:可以结合分区和分布策略实现更复杂的数据分布

4.2 故障切换测试(主库宕机)

我们模拟故障节点EP01和EP02,观察主备切换情况,实例EP01_1和实例RP02_1自动接管。
在这里插入图片描述
在这里插入图片描述
简单验证是否根据分布列进行自动分发,在EP02_1上插入数据。
在这里插入图片描述
在EP02_1和EP01_1上均能查询到数据
在这里插入图片描述

4.3 故障恢复

恢复节点EP01和EP02,观察主备切换情况
在这里插入图片描述
可以看到EP01和EP02切换为备库了。
在这里插入图片描述
在这里插入图片描述

达梦社区地址:

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台
https://eco.dameng.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94318.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94318.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94318.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础学习(一):类名规范、返回值、注释、数据类型

目录 一、类名规范二、返回值三、注释四、数据类型 1. 基本类型2. 引用类型3. 强制数据类型转换4. 进制5. 进制的转换6. 超范围运算 相关文章 Java基础学习(二):Java中的变量和常量、final(重点)、运算、字符串 了…

Nginx相关实验(2)

nginx的一些高级配置 nginx状态页 基于nginx 模块 ngx_http_stub_status_module 实现, 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module 否则配置完成之后监测会是提示语法错误 #检查模块是否配置 如果不存在需要添加模块重新编译 nginx …

2.Java和C++有什么区别

2.Java和C有什么区别 1.在C中,支持操作符重载,而在Java里是不允许的 2.C支持多继承,而Java不可以,但Java可以单继承多实现 3.Java内置多线程机制,而C没有 4.Java里面自带了垃圾回收机制,可以自动清理缓存等…

MLIR Introduction

简介 MLIR 项目是一个构建可重用和可扩展编译器基础设施创新项目,旨在解决软件碎片化问题,显著降低构建特定领域编译器的成本。 基于MLIR,可以实现: 数据流图表达(如TensorFlow),包含dynamic…

[找出字符串中第一个匹配项的下标]

代码思路分析: 1. 边界情况处理 代码中没有显式处理以下边界情况,但逻辑已隐含支持: needle 为空字符串:应返回 0(但题目通常保证 needle 非空)。haystack 比 needle 短:直接返回 -1&#xff08…

深入剖析RT-Thread串口驱动:基于STM32H750的FinSH Shell全链路Trace分析与实战解密(上)

0. 概述 这是cherryusb代码trace分析系列文章之七。 RT-Thread串口驱动框架与FinSH Shell运行机制深度解析:针对STM32H750 ART-PI平台,本文独辟蹊径采用创新的代码trace分析方法,破解庞大串口框架下的复杂运行逻辑。通过精确trace日志与drv_u…

Python与C++通信教程:C++打包dll,供Python调用(1)

目录 1,新建一个工程 math_functions.cpp内容: 先编译一下看是否可以正常运行: 2,编译成dll,并用Python调用 有两种方式: 命令 1(使用静态链接): 可移植性: 命令 2(动态链接): 可移植性: 这里我使用的是静态链接的方式: python调用实例 test_dll.py 1,…

编程与数学 03-002 计算机网络 19_网络新技术研究

编程与数学 03-002 计算机网络 19_网络新技术研究一、软件定义网络(SDN)(一)SDN的基本原理与架构(二)SDN的应用场景与优势二、网络功能虚拟化(NFV)(一)NFV的概…

uniapp 跨端开发

一、创建uniapp项目 1. 项目架构2. 初始化项目3. pages.json 和 tabBar 案例4. uni-app和原生小程序开发区别5. 用命令行创建uni-app项目 官网链接:https://uniapp.dcloud.net.cn/quickstart-cli.html#创建uni-app6. 用vscode开发uni-app在uni-app中只有manifest.js…

区块链支付技术的核心原理

区块链支付利用分布式账本技术(DLT)实现点对点的价值转移,无需传统银行或支付网关的中介。核心特点是去中心化、透明、可追溯。• 基本流程:1. 用户发起交易:通过加密货币钱包发送支付请求(例如用ETH支付&a…

linux中 多进程 导致cuda错误的问题解决

问题总结与解决方案 核心问题 在使用 Linux 系统时,多进程并行计算中加载模型到 GPU 时出现错误:_MODEL SentenceTransformer( model_path, device "cuda" if torch.cuda.is_available() else "cpu" )根本原因: CUDA 上…

智能感知的新入口:AIGC 与低延迟视频通路的深度融合

✳️ 引言:AIGC,正在重构视觉智能的“生成逻辑” AI生成内容(AIGC)正在从“内容创作工具”跃升为计算机视觉系统的新引擎。它不再只是“文生图”、“图生文”的演示技术,而是实实在在地改变着我们构建、处理和理解视觉…

Ubuntu 内网多台服务器时间同步方案(适用于临时能上外网的环境)

哎,最近项目是运行在内网环境下的,出现了由于时间不同步导致的bug。一般来讲,几台服务器的时间不一致,会带来很多问题,比如日志时间对不上、分布式服务出现异常,等等。项目上现在有三台服务器,其…

延长电池寿命的低Iq技术

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。一、概述随着电池供电型应用的激增,人们对质优价廉的电池和电池包的需求持续猛涨。电池制造商们不断采用新的化学物…

QT 如何实现enum与字符串的互转

将enum中定义的枚举值,以字符串的形式写入文件,同时也能从字符串转为枚举值。举例说明: ColorSelector中的Colors枚举,我们希望 kColorRed 这个写入到本地文件时,可以直接保存“kColorRed”,而非kColorRed对…

SLAM卷不动了,机器人还有哪些方向能做?

关注gongzhonghao【CVPR顶会精选】众所周知,机器人因复杂环境适应性差、硬件部署成本高,对高效泛化一直需求迫切。再加上多传感器协同难题、真实场景数据获取不易,当下对迁移学习 机器人智能融合的研究也就更热烈了。不过显然,这…

H.266 vs H.265/AV1/H.264:从工程落地看下一代视频系统的技术演进

一、背景:编解码标准演进背后的技术驱动 视频编码标准的更迭,从未只是一次简单的技术升级,而是对码率压缩效率、编码复杂度与画质质量三者之间平衡点的持续探索。在 H.264 成为全平台事实标准的十余年里,它成功支撑了 SD 至 1080…

Javascript面试题及详细答案150道之(031-045)

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

Git如何同步本地与远程仓库并解决冲突

在团队协作开发中,保持本地仓库与远程仓库同步是至关重要的。本文将详细介绍如何使用 Git 更新本地仓库至最新远程版本,并深入解析冲突的产生原因及解决方法。一、同步本地与远程仓库1. 检查远程仓库配置首先,确保本地仓库已正确关联远程仓库…

Hadoop MapReduce 3.3.4 讲解~

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…