达梦服务配置文件dm_svc.conf使用
1. 配置文件说明
dm_svc.conf是客户端连接的服务配置文件,在客户端(jdbc、dpi等)使用服务名进行数据库连接的情况下,需要对dm_svc.conf进行配置,如果已经安装了达梦数据库软件,会默认在安装的服务器目录上生成此配置文件,文件的位置分别位于
在windows平台:
32位的DM安装在Win32操作平台下,此文件位于%SystemRoot%\system32目录;
64位的DM安装在Win64操作平台下,此文件位于%SystemRoot%\system32目录;
32位的DM安装在Win64操作平台下,此文件位于%SystemRoot%\SysWOW64目录;
在Linux平台下,此文件位于/etc目录。
对于未安装dm数据库的情况下,可以手工生成dm_svc.conf文件,此文件可以放在默认的文件路径:
windows:%SystemRoot%\system32(SysWOW64)\dm_svc.conf
linux:/etc/dm_svc.conf
也可以根据不同的场景放置于非默认目录,但是此时的jdbc连接串中需要配置参数dmsvcconf,指定此参数的具体路径。
当然,在配置文件中的参数也可以直接写入在jdbc等的连接字符串中,针对以上三种情况下的jdbc连接串示例如下:
1. dm_svc.conf位于默认位置:jdbc:dm://dm_rww --这里的dm_rww是文件中配置的服务名称。
2. dm_svc.conf位于自定义位置:jdbc:dm://?dmsvcconf=/opt/dm_svc.conf
3. 无dm_svc.conf文件:jdbc:dm://dmconn?dmconn=(192.168.56.13:32141,192.168.56.14:32142,192.168.56.15:32143)&rw_Separate=(1)&rw_Percent(0)&login_mode=(1) --其他参数可继续添加
此文件中各参数的配置格式:
参数名=(参数值)
此文件的常用参数(摘自达梦系统管理员手册,更多参数意义参考管理员手册):
配置项 |
缺省值 |
简述 |
服务名 |
无 |
连接服务名,参数值格式为ip[:port],ip[:port],...... |
TIME_ZONE |
操作系统当前时区 |
指明客户端的默认时区,设置范围为:-779~840m,如60对应+1:00时区 |
LANGUAGE |
操作系统语言 |
当前数据库服务器使用的语言,会影响帮助信息错误和提示信息。支持的选项为:CN(表示中文)和EN(表示英文)。可以不指定,若不指定,系统会读取操作系统信息获得语言信息,建议有需要才指定。 |
LOGIN_ENCRYPT |
1 |
是否进行通信加密。0:不加密;1:加密 |
DIRECT |
Y |
是否使用快速装载。y:使用;n:不使用 |
LOGIN_MODE |
4 |
指定优先登录的服务器模式。0:优先连接Primary模式的库,Normal模式次之,最后选择Stantby模式;1:只连接主库;2:只连接备库;3:优先连接Standby模式的库,Primary模式次之,最后选择Normal模式;4:优先连接Normal模式的库,Primary模式次之,最后选择Standby模式 |
SWITCH_TIMES |
1 |
以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围1~9223372036854775807 |
SWITCH_INTERVAL |
200 |
在服务器之间切换的时间间隔,单位为毫秒,有效值范围1~9223372036854775807 |
RW_SEPARATE |
0 |
是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点 |
RW_PERCENT |
25 |
读写分离分发比例,有效值范围0~100 |
dm_svc.conf文件的配置可以分为两个区域,全局配置区和服务配置区两大部分,全局配置区可以配置所有的配置选项,服务配置区可以配置除服务名外的所有选项,并且服务配置区的优先级高于全局配置区,即如果两个区域都配置了相同的参数,则以服务配置区的参数为准。
全局配置区可以配置多个服务名和IP/PORT对应关系,同时可以配置通用性的参数,如传输加密参数:LOGIN_ENCRYPT=(0),对于个性的参数,如LOGIN_MODE=(1),则配置在服务配置区中(此配置参数在有单实例的服务名下,连接时会出现"没有匹配的可登陆服务器"错误,当然,根据优先级的原则,可以将此配置参数在单实例服务配置区配置为LOGIN_MODE=(3/4),也可以解决连接问题)。
全局配置区有多个服务名且服务需要个性化参数的话,则在服务配置区中,需要配置多个[服务名]开头的服务配置区,如果无个性化参数,则不需要进行服务配置区的配置。
2. 配置文件示例
正确的服务名配置方式示例:
此处只以读写分离和单实例两种数据库架构的情况下进行验证,其他如datawatch或者dsc集群,可以按照DM手册中的配置进行相应的参数填写即可
# 以#开头的行表示是注释
# 全局配置区
IMESDB=(192.168.56.13:32141,192.168.56.14:32142,192.168.56.15:32143)
IMESDB_SIG=(192.168.56.16:5236)
LOGIN_ENCRYPT=(0)
DIRECT=(Y)
TIME_ZONE=(480) #表示+8:00 时区
#其他通用性参数
# 服务配置区
[IMESDB] #读写分离服务配置
LOGIN_MODE=(1) #读写分离集群必须配置为1,否则连接到standby状态的数据库时,会因为standby库为只读模式从而导致出现insert/delete/update操作错误
TIME_ZONE=(480) #表示+8:00 时区
SWITCH_TIME=(3) #在服务器之间切换的次数
SWITCH_INTERVAL=(10) #在服务器之间切换的时间间隔,单位为毫秒
RW_SEPARATE=(1) #启用读写分离,必须配置此参数为1或2,否则所有的insert/delete/update/select操作都在primary上进行,不能启用读写分离机制
RW_PERCENT=(25) #读事务分发到主库的比例
#其他个性化参数
[IMESDB_SIG]
LOGIN_MODE=(3)
#其他个性化参数
3. 配置参数验证
以一个正常状态的单实例和读写分离集群来进行验证,该集群的当前状态为:
从图片可以看出,主节点是192.168.56.14,两个从节点分别是192.168.56.13和192.168.56.15
3.1. 连接串中指定读写分离参数验证
使用jmeter创建并发200个连接,并将读写分离相关参数写到jdbc的连接串中:
或者是:
200并发连接中,所有的insert操作都在主节点上执行,执行select语句时,大部分在standby库,少部分在primary库,后一种配置因为未配置standby节点的IP及端口,在出现primary节点故障的情况下,将会出现连接不到数据库的故障。
配置的连接串主机中,不包含primary节点的话,将会提示故障:
经过以上测试,可以得出结论:
1. 在读写分离的配置下,所有的数据库连接都将连接到primary节点上,再根据语句是增删改还是查询语句,来分配连接到哪些实例。
2. 在读写分离的模式下,连接串的主机列表中,必须有primary节点的数据库,否则将出现数据库服务模式无效的故障。
3.1. 配置文件中读写分离参数验证
3.1.1. 读写分离服务名正确配置验证
此时以读写分离的服务名连接数据库实例,因为login_mode配置为1,所有连接均是primary库,但是在执行不同类型的SQL语句时,执行的实例又不相同,执行insert/update/delete语句时,执行操作的实例为primary库,而执行查询操作时,执行操作的实例为standby库
使用jmeter创建并发200个连接,此时所有的insert语句都是在primary库上执行,执行select语句时,大部分实例为standby库,少部分的primary库,数据执行的结果与预期效果一致。
3.1.2. 读写分离服务名错误配置验证
将服务配置区的LOGIN_MODE修改为模式3,即优先选择standby模式的数据库连接
[IMESDB]
LOGIN_MODE=(3)
验证结果如下
此时因为连接的实例为standby模式,所以执行insert/delete/update操作会因为是只读模式而失败。
将服务配置区的RW_SEPARATE参数注释掉,此时使用服务名进行连接时,会默认启用此参数为0的配置,使用jemter进行连接
经过观察,所以的连接返回都是节点1,不再向节点2进行连接,即读操作也全部在primary角色的实例上进行SQL操作。
3.1.3. 单实例服务名配置正确验证
按照上例"正确的服务名配置方式示例"中的正确连接方式,无论通过服务名,或者是直接ip:port方式连接数据库实例都正常
3.1.4. 单实例服务名配置错误验证
按照以下错误的配置方法,将个性化参数LOGIN_MODE提前
服务连接正常,但是通过具体IP:PORT方式连接时,出现连接异常,如下所示:
此时将全局配置区文件的LOGIN_MODE修改为1,则使用IP:PORT方式或者服务名方式都可以正常连接,这里说明,全局配置区里配置的参数在使用disql连接时生效了。
3.1.5. 分区配置的优先级验证
单实例情况下使用TIME_ZONE参数进行验证,即在全局配置区中配置TIME_ZONE,也在相应的服务配置区中配置此参数,进行时间返回的验证。
此时,虽然全局配置区中的配置为中国所在的东8区,但是服务配置区却配置成西8区,通过dm_svc.conf文件所在的客户端连接到服务端后的查询:
在服务器上使用disql查询,正常的查询结果为:
此配置文件中,虽然在全局配置区中配置了正确的时区参数,但是在服务配置区中也配置了此参数,但是配置成了-480,根据服务配置区优先级高于全局配置区的说法,客户端在进行连接时,读取了配置文件的服务配置区的时区,所以才导致最终查询的结果与实际的时间相关16小时。
4. 总结说明
dm_svc.conf关系到多种客户端连接数据库服务,后续的数据库根据架构不同,需要的配置选项都要随之变化,甚至在不使用服务名进行连接时,全局区的参数也会生效,所以必须对此文件的作用有足够的了解,才能更好的解决数据库服务连接的情况,此文件内容正确的配置方法:
#全局配置区
服务名=(ip:port,ip:port,....)
#其他通用参数,达梦未对参数进行通用和个性化的划分,但是根据常用的参数使用来看,还是有差别的,比如和读写分离开关参数RW_SEPARATE,只在读写分离集群中才需要配置。
#服务配置区
[服务名]
#个性化参数
达梦社区:https://eco.dameng.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通