datareader通过maxscale长时间读数据报错的问题

2019-08-20  本文已影响0人  嘿嘿逗

首先我们先把错误贴一下

场景是我们通过datareader从数据库里读一个表的内容【数据量非常的大,执行时间特别的长】,执行一段时间后就会报错,错误信息的主要内容就是下面这些,非关键信息就不贴了

MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed. ---> System.IO.EndOfStreamException: 尝试读取超出流末尾的内容。

各个配置项的解释

[maxscale]
threads=1
auth_connect_timeout=10 
auth_read_timeout =10
auth_write_timeout=10
ms_timestamp=<0|1>  #启用或禁用日志文件中的高精度时间戳。这样可以为所有的日志文件时间戳增加毫秒的精度。
skip_permission_checks =<true|false> #跳过服务和监视用户权限检查。当你知道权限是可以的,你想加快启动进程时,这是很有用的。这个参数需要一个布尔值,默认情况下是禁用的。建议不要禁用权限检查,这样当maxscale启动时就会检测到任何缺失的特权。如果您正在经历一个缓慢启动的MaxScale,因为在检查权限时大量的连接超时,禁用权限检查可以加快启动进程。
syslog=<0|1> #启用或禁用对syslog的消息记录。
maxlog=<0|1> #允许禁用向MariaDB MaxScale的日志文件记录消息。默认的日志记录是启用的。
log_to_shm=<0|1> #启用或禁用maxscale.log日志文件的共享内存。如果启用,那么将在/dev/ shm下创建实际的日志文件,并在MaxScale日志目录中创建一个指向该文件的符号链接。如果启用log_info和/或log_debug,日志记录到共享内存可能是合适的,因为日志记录到一个常规文件可能会导致性能下降,因为记录的数据量是这样的。但是,由于共享内存是一种稀缺资源,所以对共享内存的日志记录应该只是临时的,而不是定期的。由于MariaDB MaxScale可以记录到文件和syslog,因此提供最大灵活性的方法是启用syslog和log_to_shm,以及禁用maxlog。这样,消息通常会登录到syslog,但是如果有什么要调查的话,则可以从maxadmin启用log_info和maxlog,在这种情况下,信息消息将被记录到maxscale。共享内存中的日志文件。
log_warning=<0|1> #启用或禁用syslog优先级警告的日志记录。默认情况下启用此优先级的消息。
log_notice=<0|1> #启用或禁用syslog优先级通知的日志记录。这个优先级的消息提供了关于MariaDB MaxScale功能的信息,默认情况下是启用的。
log_info=<0|1> #启用或禁用syslog优先级信息的日志记录。这些消息提供了关于MariaDB MaxScale内部工作的详细信息,不应该由于它们的频率而启用,除非有特定的原因。例如,从这些信息中可以明显看出。为什么一个特定的查询被路由到主服务器而不是一个奴隶。这些信息在默认情况下是禁用的。
log_augmentation=<0|1> #启用或禁用消息的增强。如果启用了这个操作,那么每个已登录的消息将附加到日志记录的函数的名称。这主要用于开发目的,因此在默认情况下是禁用的。
log_throttling=X,Y,Z #如果持续存在错误的原因,可能会一次又一次地记录一个特定的错误(或警告)。为了防止日志被洪水淹没,可以指定一个特定的错误可能在一个时间段内记录多少次,在这个错误的日志记录被抑制一段时间之前。默认值是10、1000、10000,这意味着如果同样的错误在1秒内被记录10次,那么在接下来的10秒中,记录错误的日志就会被抑制。要禁用log throttling,添加一个带有空值的条目:log_throttling=
logdir=path   #设置日志文件存储的目录。该文件夹需要由运行MariaDB MaxScale的用户可读和写。
datadir=path  #设置MariaDB MaxScale使用的数据文件存储的目录。模块可以写入这个目录,例如binlogrouter使用这个文件夹作为存储二进制日志的默认位置。
libdir=/home/user/lib64/  #设置MariaDB MaxScale寻找模块的目录。库目录是MariaDB MaxScale在搜索模块时使用的唯一目录。如果您有MariaDB MaxScale的自定义模块,请确保将它们放在这个文件夹中。
cachedir=/tmp/maxscale_cache/ #配置MariaDB MaxScale用于存储缓存数据的目录。缓存数据的一个示例是从后端服务器获取的身份验证数据。如果连接到后端服务器是不可能的,那么MariaDB MaxScale存储这些数据。
piddir=/tmp/maxscale_cache/ #为MariaDB MaxScale配置PID文件的目录。这个文件包含运行的MariaDB MaxScale进程的进程ID。
execdir=/usr/local/bin/  #配置可执行文件所在的目录。启动的所有内部流程将使用此目录查找可执行文件。
connector_plugindir=/usr/lib/plugin/ #MariaDB connector-c插件目录的位置。在MaxScale中使用的MariaDB connector - c可以使用此目录加载身份验证插件。插件的版本必须与MaxScale所构建的连接器版本兼容。
persistdir=/var/lib/maxscale/maxscale.cnf.d/  #配置保存持久配置的目录。当通过MaxAdmin创建新服务器时,它将存储在这个目录中。不要使用或修改该目录的内容,使用/etc/maxscale.cnf.d /代替。
module_configdir=/var/lib/maxscale/  #配置存储模块配置的目录。路径参数解析相对于这个目录。该目录应该用于存储特定于模块的配置,例如dbfwfilter规则文件。任何非绝对路径的配置参数都将被解释为相对路径。相对路径使用模块配置目录作为工作目录。例如,配置参数file= my_file.txt将被解释为/etc/maxscale.cnf.d/my_file.txt,而file=/home/user/my_file.txt将被解释为/home/user/my_file.txt。

[Read-Write Service]
type=service
router=readwritesplit | readconnroute   #服务的路由器参数定义了路由器模块的名称,该模块将用于实现MariaDB MaxScale客户机和后端数据库之间的路由算法。另外,路由器也可以通过一个逗号分隔的选项列表来控制路由算法的行为。控制路由选择的两个参数是router和router_options。路由器选项是特定于特定路由器的,并被用来修改路由器的行为。读取的连接路由器可以通过master、slave或synced的选项,例如配置一个服务来使用此路由器,并限制服务器对处于从属状态的服务器的选择。
router_options=slave | master,slave  
servers=server1  #服务定义中的servers参数提供了包含服务的后端服务器的逗号分隔列表。服务器名是使用服务器类型参数的块的名称部分使用的名称(见下文)。
user=myuser
passwd=mypwd
filters=counter | QLA
enable_root_user=[0|1]  #此参数控制root连接到MariaDB MaxScale的能力,并通过MariaDB MaxScale将其转到后端服务器。默认值为0,禁用root连接到MariaDB MaxScale。
localhost_match_wildcard_host=[0|1]  #该参数使“127.0.0.1”(localhost)与“%”通配符匹配,用于MySQL协议验证。默认值为0,因此为了验证与MariaDB MaxScale正在运行的同一机器的连接,MySQL用户表中需要一个显式user@localhost条目。
version_string=5.5.37-MariaDB-RWsplit  #这个参数设置了一个自定义的版本字符串,它是由MariaDB MaxScale向客户端发送的。
connection_timeout=300 #connection_timeout参数用于将会话与已经闲置太久的MariaDB MaxScale断开连接。默认情况下,会话超时是禁用的。要启用它们,请在服务的配置部分中以秒为单位定义超时。
max_connections=100  #最大同时连接MaxScale应该允许该服务。如果参数为零或省略,则没有限制。在到达极限后,任何试图建立更多连接的尝试都会导致返回“太多的连接”错误。
log_auth_warnings=[0|1]  #启用或禁用认证失败和警告的日志记录。该参数采用布尔值。MariaDB MaxScale通常会抑制关于失败身份验证的警告消息。启用此选项将把这些消息记录到消息日志中,并详细介绍谁尝试连接到MariaDB MaxScale和从何处连接。
auth_all_servers=[0|1] #此参数控制在从后端服务器加载用户时仅使用单个服务器或所有服务器。这需要一个布尔值,当启用时,将在所有服务器上创建所有用户和授予的联合。
strip_db_esc=[0|1] #当从后端服务器加载用户时,strip_db_esc参数从数据库名称中删除字符。该参数采用布尔值,当启用时,将从数据库名称中删除所有反斜杠(\)字符。自MaxScale 2.0.1以来,该参数的默认值为true。在以前的版本中,默认值为false。一些可视化数据库管理工具会自动地避开一些字符,这可能会导致当MariaDB MaxScale试图对用户进行身份验证时发生冲突。
retry_on_failure=[0|1] # retry_on_failure参数控制MariaDB MaxScale是否尝试重新启动失败的服务并接受布尔值。此功能默认启用,以防止由于网络中断导致服务启动失败而导致永久禁用服务。如果在启动MariaDB MaxScale时不能启动服务,禁用重新启动失败的服务将使它们永久禁用。
max_slave_connections=100%

问题1 connection_timeout参数的设置问题

如果不设置这个参数会有大量的这种日志

 error  : (29393) Lost connection to the master server, closing session. Lost connection to master server while connection was idle. Connection has been idle for 160.0 seconds. Error causedby: #HY000: Lost connection to backend server.

如果设置了这个参数又会有这样的日志

warning: Timing out 'angelababa'@::ffff:192.168.0.10, idle for 300.7 seconds

这个connection_timeout 参数在实际使用中不知道为什么,不设置的话会按照160s自动清除连接,设置的话就是按照设置的时间去清除连接,当使用datareader进行大量的数据读取的时候,这里会有问题,程序执行到160s或者你设置的那个时间,连接会被清除掉,(不设置就是默认被禁用的,难道这句话的意思和设置为0不一样???)
当设置为0的时候,会按照数据库中这两个参数的值去清理连接

interactive_timeout=3600
wait_timeout=3600

经过两天的验证,当不设置或者设置为0的时候,会按照数据库中设置的超时时间进行空闲连接清理,另外,程序直连数据库进行reader的时候连接状态为query状态【所以执行时间再长它也不会被中断】,但是经过maxscale以后连接状态会变成sleep状态【到了设置的超时时间就一定会被清理】。所以对于长时间执行的sql【不可预期sql执行时间】需要注意,不要通过maxscale去长时间的操作数据库,可以直接去连mysql就好了。
CommandTimeout这个参数也需要注意一下,根据实际需要可以适当设置并延长这个超时时间,也可以设置为0【永远不超时】,但是应尽量避免设置为0,否则会无限期地等待执行命令。
最终修改的配置为
maxscale中

connection_timeout=0#这里不设置也可以

mysql中

interactive_timeout=3600
wait_timeout=3600

datareader操作直接连mysql的从库

上一篇下一篇

猜你喜欢

热点阅读