主机一台或多台。用于部署 MP、SP 和 BP。内存大小要求:至少 2GB。测试环境
中可以将上述服务部署到同一主机,生产环境下推荐每个主机只部署一种类型服务器。
操作系统。Linux、Unix、Windows 等。
达梦数据库软件。安装好 DM 数据库软件之后,将拥有配置和管理 DMDPC 所需的
所有软件:dmserver、dminit、DIsql 等。这些软件位于安装目录的 bin、tool 等子
目录中。
上传script脚本文件到机器的/opt目录下
切换到1ssh目录下
cd /opt/scripts/1ssh
创建host_ip文件,文件内容如下,将ip及root密码换成实际环境
测试批量执行
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "date"
注意:执行脚本要替换成对应的x86或者arm架构脚本:/opt/scripts/1ssh/bin
将/opt/scripts/1ssh/conf/0os目录复制到所有机器的/tmp/目录
https://blog.csdn.net/qq_43052801/article/details/distribute.sh host_ip conf/0os /tmp/
执行0os下述的脚本
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "cd /tmp/0os;sh rh7.sh"
上述脚本完成了所有机器的以下配置:
1. 创建dmdba用户及dinstall用户组,设置dmdba密码为dmdba:hust4400
2. 禁用selinux
3. 设置CPU高性能模式
4. 设置所有硬盘为deadline调度算法
5. 设置dmdba用户的limit
6. 设置sysctl.conf内核参数,比如修改core文件的生成路径,就需要修改脚本conf/sysctl.conf中的kernel.core_pattern参数
批量执行安装
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "yum -y install java numactl numad perf fio ntp iotop gdb ant net-tools vim"
安装nmon,以ARM为例
https://blog.csdn.net/qq_43052801/article/details/distribute.sh host_ip conf/nmon_arm /usr/bin/nmon
(在/opt/scripts/1ssh/conf目录下,把nmon_arm这个文件复制到所有机器的/usr/bin/nmon)
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "chmod 777 /usr/bin/nmon"
(赋予777权限)
输入nmon检查是否安装成功,按q退出
用 192.168.104.15 做时钟服务器
cat /etc/ntp.conf
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
各客户端
cat /etc/ntp.conf
server 192.168.104.15
restrict 192.168.104.15 nomodify notrap noquery
启动服务
systemctl start ntpd
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "echo 'systemctl restart ntpd' >>/etc/rc.d/rc.local"
或者
https://blog.csdn.net/qq_43052801/article/details/distribute.sh host_ip conf/ntp.conf /etc/
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "echo 'systemctl restart ntpd' >>/etc/rc.d/rc.local"
systemctl enable ntpd 经常开机不管用,所以建议用 /etc/rc.local 来做开机启动。
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "systemctl stop firewalld;systemctl disable firewalld"
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime"
以所有磁盘的数据盘为 /dev/sdb 盘为例
#检查所有机器的磁盘是否为sdb
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "fdisk -l|grep sdb"
#格式化磁盘,并创建挂载目录
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "mkfs.xfs -f /dev/sdb;mkdir -p /dmdata;rm -rf /dmdata/*"
#挂载磁盘
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "mount /dev/sdb /dmdata"
#检查磁盘挂载成功
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "df -Th|grep dmdata"
#所有机器设置磁盘开机自动挂载
vi /etc/rc.local
mount /dev/sdb /dmdata
#重启机器,再次检查是否挂载
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "df -Th|grep dmdata"
假设当前机器,存在完整的DM8安装目录 /home/dmdba/dm8_dpc ,下述脚本将会利用该目录下的 web/dem.war 来部署dem。
安装dm8软件在:/home/dmdba/dm8_dpc
https://blog.csdn.net/qq_43052801/article/details/execute.sh host_ip "mkdir -p /dmdata/dmagent"
https://blog.csdn.net/qq_43052801/article/details/distribute.sh host_ip /home/dmdba/dm8_dpc/tool/dmagent /dmdata/dmagent/
若工具执行有问题,则手动通过scp的方式将/home/dmdba/dm8_dpc/tool/dmagent拷贝到其他机器的/dmdata/dmagent目录下
sh /dmdata/dem/dm8/bin/DmService start
sh /dmdata/dem/dem_tomcat/apache-tomcat-8.5.58/bin/startup.sh
sh execute.sh host_ip "cd /dmdata/dmagent/dmagent; sh start.sh -d agent.ini"
注册agent服务
cd /dmdata/dmagent/dmagent
1.1 SP
计算节点, 可以多个,对外服务/用户交互,生成全局计划和子任务,函数调用/临时表
1.2 BP
存储节点,可以多个,后端,存储用户数据,接收计划并执行,执行子任务
1.3 MP
元数据节点,只有一个,提供元数据信息:字典对象信息、节点注册信息(MP/SP/BP)、处理DDL、广播信息(如字典信息/注册信息等)
PB级存储
最大BP组数1024
最大RAFT组数1024(含MP/SP/BP)
最大节点数4096(含MP/SP/BP)
最大副本数9
其它指标和达梦普通单机数据库一样
旧DEM界面
新DEM界面
旧DEM界面
新DEM界面
端口号可自定义,也可以默认生成 (一般放在/dmdata,后续涉及自带脚本,方便直接使用)
6.1 手动添加(方法一)
添加SP实例,SP比较消耗资源,不建议分配过多
6.2 快速添加(方法二)
生成快速添加实例的脚本,主要生成BP的脚本,SP、MP请手工添加。
#第1台机器上的实例实名
a=1
b=2
c=3
bp_num=3
#按次序部署在多台机器
for i in {161..163}
do
if [[ $b -gt $bp_num ]];then
b=$(expr $b - $bp_num)
fi
if [[ $c -gt $bp_num ]];then
c=$(expr $c - $bp_num)
fi
#echo "a:"$a
#echo "b:"$b
#echo "c:"$c
echo "[192.168.124.$i]"
#echo "MP MP_A"
echo "BP BP${a}_A RAFT_${a}"
echo "BP BP${b}_B RAFT_${b}"
echo "BP BP${c}_C RAFT_${c}"
let a+=1;
let b+=1;
let c+=1;
done
[192.168.124.161]
MP_C
BP BP1_A RAFT_1
BP BP2_B RAFT_2
BP BP3_C RAFT_3
[192.168.124.162]
MP_B
BP BP2_A RAFT_2
BP BP3_B RAFT_3
BP BP1_C RAFT_1
[192.168.124.163]
SP SP1 RAFT_SP1
MP_A
BP BP3_A RAFT_3
BP BP1_B RAFT_1
BP BP2_C RAFT_2
实例规划
每台机器三实例
考虑到副本的高可用,同一RAFT组的不同副本要分布到不到的机柜中,提升容灾性。
原则是同台服务器出现三台不同BP副本,例如:192.168.124.161(BP1_A,BP2_B,BP3_C)
端口规划
1.实例端口与其对应的AP_PORT 端口,后2位要一致。
2. 每台机器内的端口不能重复。
3. 同一类型实例,在不同机器上其初始端口号要保持一致。如MP、SP的端口号。
4. 结合BP实例名的后缀,端口号从小到大依次给BPx_A、BPx_B、BPx_C.
5.端口说明:
MP_PORT 是mp 实例的监听端口号,仅MP实例上有。
AP_PORT 分布式环境下协同工作的监听端口号,每个实例有一个该端口。 所有端口的有效值范围为(1024~65534),但此处强烈建议端口用4位数,不要用5位数。 项目中申请端口时,按实际使用量的2倍申请,保留一定的冗余,以备不时之需。
6.独立执行码:每个实例将使用单独一套执行码,与实例数据文件在同一个目录
7.RAFT组:每个实例为一组
默认下一步
RLOG_GEN_FOR_HUGE=1 修改参数后可用HUGE表
HUGE指是列存表(RLOG_GEN_FOR_HUGE=1开启使用huge表)
默认下一步
1.XMAL_HB_INTERVAL:所有节点都修改,节点间通信检测间隔(改为100s)
MP节点故障测试需要调小至10s,不然检测不到,报错
2.RAFT_VOTE_INTERVAL:主库广播心跳消息的间隔时间(默认不动)
3. RAFT_VOTE_INTERVAL:
3.1实例名后缀 A B C,其RAFT_VOTE_INTERVAL 依次为5s,11s,18s,实现A B C 依次优先被 选举为主机。 实际使用:大部分设置7s,13s,21s(测试时可适当小点,故障测试需要及时新主机接管)
3.2默认情况下,实例名后缀A的为主机。假若A故障,B优先做为新的主机,依次类推。
修改BP1_A参数后,依次引用到xxx_A实例上,以此类推
RAFT_VOTE_INTERVAL=7000
RAFT_VOTE_INTERVAL=13000,其他一样
RAFT_VOTE_INTERVAL=21000,其他一样
此处是研发部单独提供bin包,新版可使用ISO
1、新建表空间
每个BP上最少1个表空间,每个表空间只能存储在一个BP上。
考虑后面以表空间为单位进行数据重分布,那基本上决定了每个BP最少得有2个表空间,涉及到后续增加 BP后的数据重分布,那每个BP上的表空间建议偶数为好。
建议单个BP,表空间数量为2(内存小于512GB)或者4(内存大于等于512GB)。
CREATE TABLESPACE TS_1 DATAFILE 'TS_1.DBF' SIZE 128 STORAGE( ON RAFT_1);
混合表空间::一次创建两个同名的表空间,一个常规(非 HUGE)表空间和一个 HUGE 表空间,且既能存储 HUGE 表又能存储非 HUGE 表
CREATE TABLESPACE TS_2 DATAFILE 'TS_2.DBF' SIZE 128 WITH HUGE PATH 'e:mpraft_datahts' STORAGE( ON RAFT_2);
2、表空间组
表空间组是一组位于相同 RAFT 或者不同 RAFT 上的表空间集合,用于用户建表或者指定用户默认的存储位置
创建:
SP_TS_GROUP_CREATE('TSG_1', 'tablespace group1');
SP_TS_GROUP_ADD_TS(
ts_group_name varchar(128),
ts_name varchar(256)
)
向表空间组 TSG_1 中添加表空间 TS_1。
SP_TS_GROUP_ADD_TS('TSG_1', 'TS_1');
项目中没有明显的按用户分隔的需求,就是把DPC当成MPP来用,建议做1个表空间组即可,这个 表空间组包含所有的表空间
--创建表空间组
TSG_ALL SP_TS_GROUP_CREATE('TSG_ALL', 'tablespace group include all bp.');
--将所有表空间均增加到TSG_ALL表空间组中
select 'SP_TS_GROUP_ADD_TS(''TSG_ALL'','''||NAME||''');' from "SYS"."DPC_TABLESPACE";
3、用户
CREATE USER USER_1 IDENTIFIED BY 123456789 DEFAULT TABLESPACE GROUP TSG_1;
(指定用户的默认表空间或表空间组)
4、表
指定表空间
create table test2(c1 int, c2 int) PARTITION BY RANGE(c1)(
PARTITION p1 VALUES LESS THAN (10) storage (on TS_1),
PARTITION p2 VALUES LESS THAN (20) storage (on TSG_1),
PARTITION p3 VALUES EQU OR LESS THAN(MAXVALUE)
) storage (on TSG_2);
test2 中的 P1 分区存储在表空间 TS_1 上,P2 分区存储在表空间组 TSG_1 上。P3 未明确指定表空间或表空间组,缺省存储在表空间组 TSG_2 上
基于分区组建分区表
使用分区组创建表时,分区列的个数和数据类型必须和分区组中定义保持完全一致。
作用:1、简化用户创建水平分区表的操作、2、确保相同分区方式两张表的对应分区始终在同一 BP,减少跨机事务和连接时数据交 换开销,提升事务处理的性能。
分区类型有:
HASH分区
LIST分区
RANGE分区
二级分区如: LIST + HASH RANGE + HASH LIST + RANGE RANGE + LIST
LIST+HASH、RANGE+HASH是最常用的。
官方手册:8.6.2.2 分区组定义语句
HASH+RANGE
create partition group PG5
partition by hash(int)
subpartition by range(int)
( partition "part_1" (subpartition p11 values less than(1), subpartition p12 values less than(10)) ,
partition "part_2" (subpartition p21 values less than(0) , subpartition p22 values less than(10)) ,
partition "part_3" (subpartition p31 values less than(50) , subpartition p32 values less than(60)) ) storage (on TS_1,TS_2);
基于分区组 PG5 创建二级分区。
create table DPC_T3 (c int, c2 int, c3 int) using partition group PG5 by (c) SUBPARTITION by (c3);
5、数据分布
6、主备切换
切换主库的方式前提条件:
备库在执行切换前,会对自身否具有切换条件进行检查,下面列出了不具备切换的情况:
1. 不是多副本环境,不允许切换。
2. 备库选举角色不为 FOLLOWER,不允许切换。
3. 备库模式不为 STANDBY 或状态不为 OPEN,不允许切换。
4. 不存在有效的主库,不允许切换。
5. 备库自身归档无效,不允许切换。
6. 系统前一次节点变更还未完成(比如正在执行增删节点,尚未完成),不允许切换。
手动切换的前提条件和可能遇到问题的解决办法:
1. 所有操作是直连 MP 或 BP 节点执行切换。其中,对于 BS 主库节点需要 LOCAL 方 式登录执行。
2. 执行手动切换需要严格按照执行流程执行。
3. 若执行 SP_RAFT_SUSPEND_THREAD 时失败,可由用户根据返回值决定是否重试。
4. 若 执 行 SP_RAFT_SWITCHOVER 执 行 失 败 , 可 登 录 任 意 一 个 备 库 , 执 行 SP_RAFT_RESUME_THREAD 唤醒主库挂起的工作线程。若所有备库都故障,可以等到有活 动备库再执行此操作,或者将主库重启。
SP_RAFT_RESUME_THREAD('BP_1'); //唤醒 BP_1 工作线程
select * from dpc_instance; #查看主备库分布
select * from v$rlog_raft_info #查询当前节点的选举状态和日志提交信息 raft_shadow 当前节点是否是影子库,0:RAFT 库;1:影子库
select * from v$arch_status #查询归档状态信息, 只在主库上查询有效
----查看DPC集群状态
select leader,ip_external,F_SEQ_ARR,F_LSN_ARR from(select * from v$rlog_raft_info a,DPC_INSTANCE b where a.leader=b.name) ORDER BY TO_NUMBER(TRANSLATE(leader,'0123456789'||leader,'0123456789'));
(MP BP)手动切换流程如下:
1.disql 登录主库(对于 BS 主库节点需要通过 LOCAL 方式登录),挂起主库工作线 程。 SP_RAFT_SUSPEND_THREAD();
2.Disql 登录备库,执行 SP_RAFT_SWITCHOVER(),将备库切换为主库 SP_RAFT_SWITCHOVER();
7、表数据存储位置节点信息
新建普通测试表
create table part_test1 (c1 int c2 int);
insert into part_test1 select level level from dual connect by level<=100
commit;
查看表所在raft组情况
select SF_GET_EP_SEONO(ROWID),count t FRoM part_test1 GROUP BY SF_GET_EP_SEONO ROWID
select, raft_id,name,ip_external,INST_PORT,sys_mode from dpc_instance where raft_id=1
select * from dpc_instance
8、其他
7.1 知识点1
新增实例只能多实例到多实例,目前不能单实例到多实例
7.2 知识点2
只读表
ALTER TABLE table_name {READ onLY | READ WRITE};
:一是将访问各个站点目标表的分布式访问变成对同构临时表的 本地访问,减少通讯代价,提高查询效率;二是减少事务涉及的 BP,减少分布式事务提交 时的交互。
复制表:不支持,有只读表,可以更改后重新分发(机制:改对数据影响,更改后立马分发到其他节点)
mpp 存在,dpc为了兼容ap和bp概念取消
临时表:MP、BP、SP 均支持对临时表 DML 操作(查询,插入,修改、删除、提交、回滚)。
7.3 知识点3
相关参数
DPC_MODE :0:无;1/MP:MP;2/BP:BP;3/SP:SP;4/BS:BS。
BP 节点有两种启动模式:BP 模式和 BS 模式。用户可直接登录 BP 进行操作,此时的 BP 同时具有
前端 SP 节点的功能也具有 BP 的功能,生成分布式计划,并和 MP/其他 BP 甚至辅助 SP 进行数据交互。
7.4 知识点4
RAFT 归档将主库产生的 Redo 日志通
过 XMAL 模块传递到备库,RAFT 归档是多副本系统的实现基础,RAFT 归档只在主库生效,
一个主库可以配置 2~8 个 RAFT 备库,归档目标个数必须是偶数(确保总的实例个数是奇
数)。
7.5 知识点5
业务sql优化:
主要优化方式是通过更改表的结构,增加二级分区HASH 走本地索引加快查询效率