注册
DM集群的高可用的配置方式(多语言)
技术分享/ 文章详情 /

DM集群的高可用的配置方式(多语言)

卖女孩的小废柴 2024/08/09 805 2 0

一、介绍

强调以下:dm_svc.conf必须放置到应用服务器上才行,放到其他服务器上识别不到。

文章中有的框架可能没写到并不代表不支持,有没提到的可文章下方留言。

1.dm_svc.conf的作用:

  • dm_svc.conf文件主要是为了当DM数据库集群发生故障切换时,应用系统也能随之自动连接到切换后的集群主库上,这样应用可以做到无感切换。
  • dm_svc.conf文件在不同操作系统下文件的放置位置不同,一定要注意。
  • (重要)应用系统必须使用DM驱动连接DM数据库,DM驱动内部连接前会在当前系统的指定目录下,检查dm_svc.conf文件是否存在并解析配置。
  • 当数据库故障时,应用无感切换。必须满足连接的是高可用集群而不是单机同时dm_svc.conf文件配置正确才可以。二者缺一不可。

2.dm_svc_conf文件的位置
具体的可以看官方手册:https://eco.dameng.com/document/dm/zh-cn/pm/physical-storage.html#2.1.1.4%20dm_svc.conf
image.png

二、dm_svc.conf的配置

达梦使用服务名的方式完成高可用的链接方式,方法是在每个应用服务器的/etc目录下,使用root用户创建一个dm_svc.conf文件。
如启动应用程序非root用户,需要给dm_svc.conf文件赋予755权限,避免因权限问题导致的读取不到
当驱动链接数据库时会首先读取此目录下的文件,自动判断主备机器并尝试进行链接。

[root@VM-0-17-centos bin]# cat /etc/dm_svc.conf TIME_ZONE=(480) LANGUAGE=(cn) ## 注意替换成实际的集群ip:port,几个节点就写几台 DM=(192.168.123.123:5236,192.168.123.124:5236) [DM] LOGIN_MODE=(1) SWITCH_TIME=(300) SWITCH_INTERVAL=(200)

参数说明:

  1. TIME_ZONE表示指明客户端的默认时区,这里写480就行表示东八区
  2. 配置文件第三行:DM的值里面写了两个机器格式为ip:port的形式,要替换成实际的IP,这套集群几台机器就写几台。
  3. LOGIN_MODE=1,表示只连接主库。该参数特别重要
  4. 每个参数的含义可以看官网手册https://eco.dameng.com/document/dm/zh-cn/pm/physical-storage.html#2.1.1.4.1%20dm_svc.conf%20%E9%85%8D%E7%BD%AE%E9%A1%B9

三、多语言的连接方式

注意:

  1. 操作以下的示例,请确保已经正确配置dm_svc.conf文件
  2. 驱动使用的数据库版本建议与数据库的版本一致,如果驱动版本比数据库版本低,可能会出现部分不可解释的报错
  3. 每个版本的数据库都会在安装目录的drivers目录下提供对应的版本。具体的版本对应关系请查看同级目录下的readme.txt文件

1.JAVA的方式

以下写法对springboot 、标准接口、nacos等都是通用的

#不使用服务名前的写法 conn = DriverManager.getConnection("jdbc:dm://192.168.123.123:5236", "SYSDBA", "SYSDBA"); ## java语言的话目前有三种写法 ## 1. 使用服务名的方式(推荐) String url = "jdbc:dm://DM"; ## 2. 自定义dm_svc.conf文件,建议是放到应用启动的用户下,避免权限问题 String url = "jdbc:dm://DM?dmsvcconf=/home/XXXXX(自行替换)/dm_svc.conf"; ## 3. 连接串中手动直接拼接 String url = "jdbc:dm://DM?DM=(192.168.123.123:5236,192.168.123.124:5236)&login_mode=1";

注:这里推荐第一种写法,统一规范识别dm_svc.conf文件。

2.ODBC的方式

#不使用服务名前的写法 sret = SQLConnect(hdbc, (SQLCHAR *)"192.168.123.123", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS); #使用服务名的写法 sret = SQLConnect(hdbc, (SQLCHAR *)"DM", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS);

注:这里不需要调整odbc.ini、odbcinst.ini的相关配置,需要代码调整。(服务名识别不走odbc的配置文件)

3…NET的方式

##DmConnection cnn = new DmConnection(); ##cnn.ConnectionString = "Server=192.168.123.123; User Id=SYSDBA; PWD = SYSDBA;Port=5236"; ##cnn.Open(); ##DmCommand command = new DmCommand(); #不使用服务名前的写法 cnn.ConnectionString = "Server=192.168.123.123; User Id=SYSDBA; PWD = SYSDBA;Port=5236"; #使用服务名的写法 cnn.ConnectionString = "Server=DM; User Id=SYSDBA; PWD = SYSDBA;";

4.GO的方式

该写法在所有的GO的ORM框架中都适用。比如说GORM、ZORM等框架

#不使用服务名前的写法 db, err := sql.Open("dm", "dm://SYSDBA:SYSDBA@192.168.123.123:5236?autoCommit=true") # 使用服务名的写法 # 1. 标准写法(推荐) db, err := sql.Open("dm", "dm://SYSDBA:SYSDBA@DM?autoCommit=true") # 2. 连接串中手动直接拼接(未测试) db, err := sql.Open("dm", "dm://SYSDBA:SYSDBA@DM=(192.168.123.123:5236,192.168.123.124:5236)

5.Python的方式

import dmPython # 不使用服务名前的写法 conn = dmPython.connect('SYSDBA', 'SYSDBA', '192.168.123.123:5236') # 使用服务名的写法 conn = dmPython.connect('SYSDBA', 'SYSDBA', 'DM') #sqlalchemy框架 # 不使用服务名前的写法 engine = create_engine('dm://SYSDBA:SYSDBA@192.168.123.123:5236', connect_args={'autoCommit': False}) # 使用服务名的写法 engine = create_engine('dm://SYSDBA:SYSDBA@DM', connect_args={'autoCommit': False}) ## django框架服务名连接数据 # 不使用服务名前的写法 DATABASES = { 'default': { 'ENGINE': 'django_dmPython', 'NAME': 'DAMENG', 'USER': 'SYSDBA', 'PASSWORD': 'SYSDBA', 'OPTIONS': {'schema': 'DJANGGO'}, 'HOST': '10.15.1.18', 'PORT': '5236', } } # 使用服务名的写法 DATABASES = { 'default': { 'ENGINE': 'django_dmPython', 'NAME': 'DAMENG', 'USER': 'SYSDBA', 'PASSWORD': 'SYSDBA', 'OPTIONS': {'schema': 'DJANGGO'}, 'HOST': 'DM', 'PORT': '5236', } }

6.disql的连接方式

## 不使用高可用的连接方式 [root@VM-0-17-centos bin]# ./disql SYSDBA/SYSDBA@127.0.0.1:5236 服务器[127.0.0.1:5236]:处于主库打开状态 登录使用时间 : 9.777(ms) disql V8 SQL> ^C ## 使用高可用服务名的连接方式 [root@VM-0-17-centos bin]# ./disql SYSDBA/SYSDBA@DM 服务器[188.131.177.169:5236]:处于主库打开状态 登录使用时间 : 1.906(ms) disql V8 SQL>

image.png

7.PHP语言的方式

# 不使用服务名前的写法 $link = dm_connect("localhost:5236", "SYSDBA", "SYSDBA") # 使用服务名的写法 $link = dm_connect("DM", "SYSDBA", "SYSDBA")

8.R语言的方式

library(DBI) library(RDameng) #数据库地址地址 dbHost <- "192.168.145.190" dbServerName <- "DmServiceDMSERVER" dbUserName <- "SYSDBA" dbPassword <- "SYSDBA" drv <- dbDriver("Dm") # 不使用服务名前的写法 drv <- dbDriver("Dm") connect.string <- paste("(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=", dbHost, ")(PORT= 5236))(CONNECT_DATA=(SERVICE_NAME=", dbServerName, ")))", sep = "") dm8Con <- dbConnect(drv,username = dbUserName, password = dbPassword,dbname = connect.string) # 使用服务名的写法 dmCon <- dbConnect(drv,username = "SYSDBA", password = "123456",dbname = "DM") #查看连接信息 #dbGetInfo(oracleCon) #查看驱动详细信息 #dbGetInfo(drv)
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服