• 生产环境安装、配置、管理PostgreSQL数据库集群


    1 生产环境安装、配置、管理PostgreSQL14.5

    欢迎观看我发布的视频

    “生产环境安装、配置、管理PostgreSQL14.5数据库集群”

    数据库软件不是简单的安装上就好,还要经过一系列的测试和配置,使之切合您的硬件,充分利用硬件资源,从而达到提高性能的吞吐量的效果.

    2 pgpool 4.3.3参数中文说明

    仓促完成如有错漏请留言.

    #------------------------------------------------------------------------------
    # BACKEND CLUSTERING MODE       集群采用的模式(共6种)
    # Choose one of: 'streaming_replication', 'native_replication',
    #	'logical_replication', 'slony', 'raw' or 'snapshot_isolation'
    # (change requires restart)
    #------------------------------------------------------------------------------
    
    backend_clustering_mode = 'streaming_replication'
    
    #------------------------------------------------------------------------------
    # CONNECTIONS           PostgreSQL节点配置信息
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-connection.html
    #------------------------------------------------------------------------------
    
    # - pgpool Connection Settings -
    listen_addresses = '0.0.0.0'
    port = 9999
    socket_dir = '/tmp'
    
    #当此参数设置为1或更大时,当前连接数超过(num_init_children-reserved_connections)将不接受来自客户端的连接,并显示错误消息“抱歉,客户端已太多”.
    #如果此参数设置为0,则不会拒绝来自客户端的连接,但是侦听队列的长度可能很长,并可能导致系统不稳定.默认值为0.
    reserved_connections=1
    
    # - pgpool Communication Manager Connection Settings pgpool通信管理器连接设置-
    # 
    
    
    pcp_listen_addresses = '192.168.1.67'
    pcp_port = 9898
    pcp_socket_dir = '/tmp'
    #指定连接队列的长度(实际上是listen的“backlog”参数)为,backlog = listen_backlog_multiplier * num_init_children。
    listen_backlog_multiplier = 1
    #设置为on时,Pgpool-II将在传入的客户端连接上启用序列化。如果没有序列化,操作系统内核会唤醒所有Pgpool-II子进程以执行accept,但是只有其中的一个进程实际上获得了传入连接,因为所有子进程同时唤醒,会发生大量的上下文切换,会影响性能.
    #可以通过序列化accept来解决性能问题,因为只有一个Pgpool-II进程被唤醒并传入连接执行accept.但序列化有其自身的开销,设置为on时建议将num_init_children值设置大一点.对于少量num_init_children,可能会由于序列化开销而降低性能.
    #注意:启用child_life_time后,serialize_accept不起作用.如果您打算打开serialize_accept,请确保将child_life_time设置为0.如果您担心Pgpool-II进程内存泄漏或任何潜在问题,则可以使用child_max_connections,这纯粹是一种实现限制,将来可能会被删除
    #serialize_accept = off
    
    # - Backend Connection Settings PostgreSQL连接设置(最多128台)-
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-backend-settings.html
    
    #有几台PostgreSQL NODE就设置几台(包含主备)
    backend_hostname0 = 'pgser01'
    backend_port0 = 5432
    backend_weight0 = 1
    backend_data_directory0 = '/pdata/base'
    backend_flag0 = 'ALLOW_TO_FAILOVER'         #允许故障转移
    backend_application_name0 = 'standby01'
    
    backend_hostname1 = 'pgser02'
    backend_port1 = 5432
    backend_weight1 = 1
    backend_data_directory1 = '/pdata/base'
    backend_flag1 = 'ALLOW_TO_FAILOVER'
    backend_application_name1 = 'standby02'
    
    backend_hostname2 = 'pgser03'
    backend_port2 = 5432
    backend_weight2 = 1
    backend_data_directory2 = '/pdata/base'
    backend_flag2 = 'ALLOW_TO_FAILOVER'
    backend_application_name2 = 'standby03'
    
    backend_hostname3 = 'pgser04'
    backend_port3 = 5432
    backend_weight3 = 1
    backend_data_directory3 = '/pdata/base'
    backend_flag3 = 'ALLOW_TO_FAILOVER'
    backend_application_name3 = 'standby04'
    
    # - Authentication -
    enable_pool_hba = on                       #是否启用pgpool_hba
    pool_passwd = 'pool_passwd'                 #pool_passwd密码              
    authentication_timeout = 5s                 #完成客户端认证的最长时间,以秒计  
    allow_clear_text_frontend_auth = off        #如果PostgreSQL需要md5或SCRAM身份验证才能进行某些用户的身份验证,但该用户的密码不存在于“pool_passwd”文件中,则启用allow_clear_text_frontend_auth将允许Pgpool-II对前端客户端使用明文密码身份验证,以从客户端获取纯文本形式的密码并将其用于后端身份验证。
    
    # - SSL Connections -
    #不使用
    
    
    #------------------------------------------------------------------------------
    # POOLS     pgpool进程池
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-connection.html
    #------------------------------------------------------------------------------
    
    # - Concurrent session and pool size 并发会话和池大小-
    
    #Pgpool-II启动的子进程数量.分为两种情况:
    #   reserved_connections>0时,当前连接数超过(num_init_children-reserved_connections)将不接受来自客户端的连接,并显示错误消息“抱歉,客户端已太多”.
    #   reserved_connections=0时,来自客户端的连接将写入队列等待连接,队列大小为listen_backlog_multiplier*num_init_children
    #
    #   max_pool、num_init_children、max_connections superuser_reserved_connections必须满足以下公式:
    #       max_pool*num_init_children <= (max_connections - superuser_reserved_connections) (no query canceling needed)
    #       max_pool*num_init_children*2 <= (max_connections - superuser_reserved_connections) (query canceling needed)
    
    num_init_children = 32   
    
    #每个Pgpool-II子进程中缓存连接的最大数量.
    #如果传入连接连接到具有相同用户名,相同的PostgreSQL连接参和相同的数据库时,Pgpool-II将重用缓存的连接.
    #如果条件不满足Pgpool-II将创建与PostgreSQL的新连接.
    #如果缓存的连接数超过max_pool,则将丢弃最旧的连接并将该槽用于新连接。
    #默认值为4.请注意从Pgpool-II进程到后端的连接数可能达到num_init_children * max_pool
    max_pool = 2
    
    # - Life time 与PostgreSQL连接池的生成周期-
    
    #指定Pgpool-II子进程(如果该进程保持空闲状态)的的生命周期(以秒为单位).当Pgpool-II由于child_life_time而终止时,新的子进程会立即生成.child_life_time是防止Pgpool-II子进程中的内存泄漏和其他意外错误的措施。默认值为 300(5 分钟),设置为0将禁用该功能。
    #注意: child_life_time不适用于尚未接受任何连接的进程。
    #注意:启用child_life_time后,serialize_accept将失效。
    child_life_time = 10min
    
    #默认值为0,表示关闭该功能.Pgpool-II子进程为child_max_connections客户端连接提供服务后终止子进程,并将立即生成一个新的子进程来代替它.child_max_connections在非常繁忙的服务器上很有用,因为child_life_time和connection_life_time永远不会被触发.
    #child_max_connections = 0
    
    #指定终止与PostgreSQL后端的连接的时间(以秒为单位).默认值为0,表示连接不会断开。
    #connection_life_time = 0
    
    #指定客户端自上次查询以来保持空闲状态时断开客户端连接的时间(以秒为单位).防止Pgpool-II子级被懒惰的客户端占用或客户端与Pgpool-II之间的TCP/IP连接中断非常有用.默认值为0,将关闭该功能。
    #client_idle_limit = 0
    
    #------------------------------------------------------------------------------
    # LOGS  日志
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-logging.html
    #------------------------------------------------------------------------------
    
    # - Where to log -
    
    log_destination = 'stderr'                  #枚举[syslog,stderr],logging_collector为on时需要设置为stderr,syslog写入至/var/log/pgpool.log.
    
    # - What to log -
    #log_line_prefix = '%m: %a pid %p: '
    #log_connections = off                       #设置为 on,日志记录所有客户端连接时的信息
    #log_disconnections = off                    #设置为 on,日志记录所有客户端断开连接时的信息
    #log_hostname = off                          #设置为 on,在ps命令结果中输出主机名而不是IP地址,以及连接日志(当log_connections=on时)
    #log_statement = off                         #设置为 on,日志记录所有SQL语句
    #log_per_node_statement = off                #与log_statement类似,不同之处在于它分别打印每个数据库节点的日志,确保复制或负载均衡正常工作
    #log_client_messages = off                   #设置为 on,日志记录所有将客户端消息
    #log_standby_delay = 'if_over_threshold'     #枚举[if_over_threshold,,none],日志记录备机延迟,值范围
    
    # - Syslog specific 只有log_destination=syslog才有效-
    
    #syslog_facility = 'LOCAL0'
                                       # Syslog local facility. Default to LOCAL0
    #syslog_ident = 'pgpool'
                                       # Syslog program identification string
                                       # Default to 'pgpool'
    
    # - Debug -
    
    #log_error_verbosity = default               #控制为记录的每条消息发出的详细信息量,值为terse、default、verbose
    #client_min_messages = notice                #控制发送到客户端的最低消息级别
    #log_min_messages = warning                  #默认值为“警告”,控制向日志发出的最低消息级别
    
    # This is used when logging to stderr:
    logging_collector = on                      #logging_collector参数只有log_destination = 'stderr'才有效.启用一个后台进程收集标准stderr消息并将其重定向到日志文件
    
    # -- Only used if logging_collector is on 只有logging_collector = on才有效---
    log_directory = '/pfast/pgpool_logs'        #日志文件的目录
    log_filename = 'pgpool-%Y-%m-%d.log'        #设置所创建日志文件的文件名
    #log_file_mode = 0600                        #日志文件的权限
    #log_truncate_on_rotation = off              #是否截断日志文件,需要和log_filename配合使用
    
    #log_rotation_age = 1d                      #使用单个日志文件的最长时间,之后将创建新的日志文件.如果指定此值时不带单位,则以分钟为单位.默认值为 24 小时
    #log_rotation_size = 0                      #单个日志文件的最大大小.将这几千字节发送到日志文件后,将创建一个新的日志文件.设置为零可禁用基于大小创建新日志文件。
    
    #------------------------------------------------------------------------------
    # FILE LOCATIONS    文件位置调整至ssd磁盘
    # https://www.pgpool.net/docs/latest/en/html/runtime-misc.html
    #------------------------------------------------------------------------------
    
    pid_file_name = '/pfast/pgpool.pid'  #pgpool
    logdir = '/pfast'                           #pgpoo状态文件目录
    
    #------------------------------------------------------------------------------
    # CONNECTION POOLING        pgpool连接池功能
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-connection-pooling.html
    #------------------------------------------------------------------------------
    
    connection_cache = on                       #设置为on时,将缓存到后端的连接.即使启用了connection_cache也不会连接template0、template1、 postgres、regression这几个数据库.
    
    #https://www.postgresql.org/docs/14/sql-abort.html
    #reset_query_list = 'ABORT; DISCARD ALL'     #默认值.在退出用户会话时要发送的用于重置后端连接的SQL命令.可以通过用 “;” 分隔每个命令来指定多个命令。
    #reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'
    #   ABORT:中止当前事务
    #   RESET ALL:把所有运行时参数的值恢复到默认值
    #   SET SESSION AUTHORIZATION DEFAULT:设置当前会话的会话用户标识符和当前用户标识符为默认
    #   DISCARD ALL:抛弃所有会话状态
    
    
    #------------------------------------------------------------------------------
    # REPLICATION MODE  复制模式
    # https://www.pgpool.net/docs/42/en/html/runtime-config-running-mode.html
    #------------------------------------------------------------------------------
    
    #replicate_select = off             #当设置为on时,Pgpool-II将启用“选择查询复制”模式,即SELECT查询被发送到所有后备节点
    #insert_lock = off                  #当设置为on时,Pgpool-II将在PostgreSQL上自动锁定该表,然后再为此发出INSERT语句
    #lobj_lock_table = ''               #指定用于大对象复制的表名.如果指定Pgpool-II将锁定由lobj_lock_table指定的表,并生成一个大对象ID,可通过pg_largeobject查看,然后调用lo_create创建大对象,此过程可保证Pgpool-II将在复制模式下的所有数据库节点中获取相同的大型对象ID。
    
    # - Degenerate handling -
    #当设置为off时,并且所有节点都不以相同的数据包类型回复发送到所有PostgreSQL后端节点的查询时,则回复与大多数节点不同的后端节点将被Pgpool-II退化。
    #如果replication_stop_on_mismatch设置为关闭,并且发生了类似的情况,则Pgpool-II仅终止当前用户会话,而不会退化后端节点
    #replication_stop_on_mismatch = off
    
    #如果设置为on,并且所有节点都不会以相同数量的受影响元组回复INSERT/UPDATE/DELETE查询,则回复与大多数不同的后端节点将被 Pgpool-II退化.
    #如果failover_if_affected_tuples_mismatch设置为关闭,并且发生类似的情况,则Pgpool-II仅终止当前用户会话,而不会退化后端节点
    #failover_if_affected_tuples_mismatch = off
                                       # On disagreement with the number of affected
                                       # tuples in UPDATE/DELETE queries, then
                                       # degenerate the node which is most likely
                                       # "minority".
                                       # If off, just abort the transaction to
                                       # keep the consistency
    
    #------------------------------------------------------------------------------
    # LOAD BALANCING MODE   负载均衡模式
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-load-balancing.html
    #------------------------------------------------------------------------------
    
    load_balance_mode = on                  #启用SELECT查询负载均衡模式
    ignore_leading_white_space = on         #忽略负载均衡中SQL查询开头的空格
    
    #如查你的函数为可读写的,必须将函数添加至write_function_list列表
    read_only_function_list = ''            #只读pg函数列表,用英文的,号分隔,有条件带架构名称(test,public.test2),函数名支持正则表达式
    write_function_list = ''                #只写pg函数列表,用英文的,号分隔,有条件带架构名称(test,public.test2),函数名支持正则表
    
    #primary_routing_query_pattern_list = '' #指定应发送到主节点的以分号分隔的SQL列表.正则表达式特殊字符'、;、*、(、)、|、+、.、\、?、^、$、{、{、}需要使用\来转义
    
     #指定“数据库名称:节点名称或节点id(负载均衡概率)"列表,以指定的负载均衡按概率将SELECT查询发送到特定postgresql备机.负载均衡概率指定一个介于0和1之间的值.默认值为 1.0
    #   示例:database_redirect_preference_list = 'postgres:primary,mydb[01]:1(0.3),mydb2:standby'
    #       将postgres数据库上的所有SELECT路由到主机
    #       将连接至mydb0或mydb1数据库上的30% SELECT路由到1号备机,其他70%的SELECT将发送到其它备机。
    #       将连接至mydb2数据库上的所有SELECT路由到备机
    #database_redirect_preference_list = '' 
    
    #app_name_redirect_preference_list = ''  #指定应用程序名称:节点名称或节点id(负载均衡概率)”对的列表,使用方法同上。                                   
    #allow_sql_comments = off                #设置为on时,pgpool-II在确定查询上是否可以进行负载均衡或查询缓存时,将忽略SQL中的注释.当此参数设置为off时,查询上的SQL注释可以有效地阻止对查询进行负载均衡或缓存
    
    #指定出现写入SQL后的负载平衡行为.此参数在流式复制模式下特别有用,将写入SQL发送到主服务器时,异步备机存在时间滞后问题,因此如果客户端在写入SQL后立即读取刚才写入的行,则客户端可能无法看到该行的最新值,此时客户端应始终从主服务器读取数据,但是这会导致禁用了负载平衡从而导致性能降低.
    #   off:则即使出现写入后立即SELECT,也会对SELECT进行负载平衡,但客户端可能会看到较旧的数据.但是对于PostgreSQL synchronous_commit = “remote_apply”时或同步复制非常有用,因为在此类环境中没有复制延迟.
    #   transaction:写入查询且显式事务时,在事务结束之前,后续select不会进行负载平衡.请注意,不在显式事务中的select不受该参数的影响.在大多数情况下,此设置可提供最佳平衡.这是Pgpool-II 3.7或更早版本中的默认和相同行为.
    #   trans_transaction:写入查询且显式事务时,在会话结束之前后续select不会在事务和后续显式事务中进行负载平衡.对于较旧的应用程序更安全,但事务性能较低。请注意,不在显式事务中的select不受该参数的影响。
    #   always: 在会话结束之前,后续select不会进行负载平衡,无论它们是否在显式事务中.这提供了与非群集感知应用程序最高兼容性和最低的性能
    #   dml_adaptive:Pgpool-II将跟踪显式事务中WRITE语句中引用的每个表,并且如果它们正在读取的表以前在同一事务中修改过,则不会对后续READ查询进行负载平衡.表上的依赖函数、触发器和视图可以使用dml_adaptive_object_relationship_list
    #disable_load_balance_on_write = 'off'   #设置为off可以采用insert into t(c) values(1) returning c这种方法获取当前写入的行数据
    
    
    #防止依赖对象的负载平衡,您可以指定对象名称后跟冒号(:),,分隔的依赖对象名称列表。
    #   table_1上安装了触发器,该触发器每个INSERT都执行table_2插入,您需要确保在插入到table_1后,读取table_2不得在同一事务中获得负载平衡。对于此配置,您可以设置
    #dml_adaptive_object_relationship_list= ''
    
    #设置为on时将为每个select确定负载平衡节点.
    #设置为off时负载平衡节点在会话开始时确定,并且在会话结束之前不会更改。
    #例如:在使用连接池的应用程序中与postgresql始终保持打开的连接状态,此会话可能保留很长时间,因此负载平衡节点在会话结束之前不会更改.在此类应用程序中,启用statement_level_load_balance时,可以决定每个查询的负载平衡节点,而不是每个会话的负载均衡节点
    #statement_level_load_balance = off
    
    #------------------------------------------------------------------------------
    # STREAMING REPLICATION MODE    流复制模式
    # https://www.pgpool.net/docs/latest/en/html/runtime-streaming-replication-check.html
    #------------------------------------------------------------------------------
    
    # - Streaming -
    
    sr_check_period = 10                #检查流式复制延迟的时间间隔(以秒为单位)
    sr_check_user = 'rep'               #指定要执行流式复制检查的PostgreSQL用户名
    sr_check_password = ''              #指定sr_check_user用户的密码.如果用户不需要密码则不填写
    sr_check_database = 'test'          #指定要执行流式复制延迟检查的数据库
    
    #指定备用服务器上相对于主服务器的复制延迟的最大容差级别(以WAL字节为单位),如果延迟超过配置的级别,Pgpool-II将停止将SELECT查询发送到备用服务器,并开始将所有内容路由到主服务器(即使启用了load_balance_mode),直到备用服务器赶上主服务器.将此参数设置为0将禁用延迟检查.此延迟阈值检查每隔sr_check_period执行一次.
    #delay_threshold = 0 
    
    #仅当delay_threshold设置为大于0时此参数才有效.
    #设置为on时如果负载平衡节点的延迟大于delay_threshold,Pgpool-II不会向主节点发送读取查询,而是发送给backend_weight>0且延迟最小的备用节点.如果所有备用节点的延迟都大于delay_threshold时,且主节点配置为负载平衡节点,则Pgpool-II将发送到主节点。默认值为关闭。
    #prefer_lower_delay_standby = off
    
    
    # - Special commands -
    
    
    #follow_primary_command = ''        #用于通过调用pcp_recovery_node命令从新的主数据库恢复备用数据库。
    #------------------------------------------------------------------------------
    # HEALTH CHECK GLOBAL PARAMETERS            PostgreSQL数据库健康检查-全局配置
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-health-check.html
    #------------------------------------------------------------------------------
    
    health_check_period = 20                    #PostgreSQL健康检查时间间隔(以秒为单位).默认值为0,表示禁用健康检查
    health_check_timeout = 10                   #PostgreSQL健康检查时连接至PostgreSQL的超时时间
    health_check_user = 'test'                  #PostgreSQL健康检查时连接至PostgreSQL的用户名                                    
    health_check_password = '123'               #PostgreSQL健康检查时连接至PostgreSQL的密码
    health_check_database = 'test'              #PostgreSQL健康检查时连接至PostgreSQL的数据库
    #health_check_max_retries = 0                #PostgreSQL健康检查失败时放弃并启动故障转移之前要执行的最大重试次数
    #health_check_retry_delay = 1                #PostgreSQL健康检查失败后在重新尝试之前的休眠时间(以秒为单位),health_check_max_retries>0时才有效,否则不使用此参数.如果为0则健康检查失败后立即重试(无延迟)
    #connect_timeout = 10000                     #指定在放弃使用系统调用连接到后端之前的时间量(以毫秒为单位).默认值为10000毫秒(10秒),0表示无超时connect.
    #------------------------------------------------------------------------------
    # HEALTH CHECK PER NODE PARAMETERS (OPTIONAL) 健康检查-为每个节点单独配置
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-health-check.html
    #------------------------------------------------------------------------------
    #health_check_period0 = 0
    #health_check_timeout0 = 20
    #health_check_user0 = 'nobody'
    #health_check_password0 = ''
    #health_check_database0 = ''
    #health_check_max_retries0 = 0
    #health_check_retry_delay0 = 1
    #connect_timeout0 = 10000
    
    #------------------------------------------------------------------------------
    # FAILOVER AND FAILBACK             故障切换和故障恢复
    # https://www.pgpool.net/docs/latest/en/html/runtime-config-failover.html
    #------------------------------------------------------------------------------
    
    #故障转移意味着自动分离Pgpool-II无法访问的PostgreSQL节点.无论配置参数如何设置都会进行故障转移,因此称为自动故障转移过程.Pgpool-II使用以下方法确认PostgreSQL节点的不可访问性:
    #   定期运行健康检查并尝试从Pgpool-II连接到PostgreSQL节点以确认其运行状况.如果连接失败则可能是Pgpool-II和PostgreSQL节点之间的网络连接有问题或者PostgreSQL节点无法正常工作.Pgpool-II不会区分每种情况,只是决定如果运行健康检查失败则表示此PostgreSQL节点不可用
    #   连接到PostgreSQL节点时发生错误,或者在与其通信时发生网络级错误.在这种情况下,如果failover_on_backend_error关闭,Pgpool-II将断开与客户端的会话
    #   在客户端已经连接到Pgpool-II并且PostgreSQL处于关闭状态的情况下(请注意:如果没有客户端连接到Pgpool-II,则关闭PostgreSQL不会触发故障转移)
    #如果配置了failover_command并发生了故障转移则执行failover_command.failover_command应由用户提供.从4.1开始,故障转移命令的示例脚本为failover.sh.sample.你可以failover.sh.sample基础按需修改
    #故障转移命令的主要作用是从现有备用服务器中选择新的主服务器,并将其升级为主服务器,并给管理员发送邮件通知管理员发生了故障转移
    #虽然发生故障时可能会发生故障转移,但也可以手动触发故障转移,这称为切换,可以使用pcp_detach_node命令触发切换
    #在默认设置中,通过故障转移或切换分离的PostgreSQL节点永远不会自动返回到以前的状态(附加状态).PostgreSQL节点修复好后使用-D选项重新启动Pgpool-II或运行pcp_attach_node使其再次进入附加状态.建议在执行此操作之前确认SHOW POOL NODES的replication_state状态为“streaming”.该状态表示备用服务器已通过流式复制正确连接到主服务器,并且两个数据库处于同步状态
    #从4.1开始,可以使用新的参数auto_failback自动执行上述操作
    
    #   特殊字符	描述
    #01       %d	    已分离节点的数据库节点ID
    #02       %h	    分离节点的主机名
    #03       %p	    分离节点的端口号
    #04       %D	    分离节点的数据库群集目录
    #05       %m	    新的主节点 ID
    #06       %H	    新主节点的主机名
    #07       %M	    旧的主节点标识
    #08       %P	    旧的主节点ID
    #09       %r	    新主节点的端口号
    #10       %R	    新主节点的数据库集群目录
    #11       %N	    旧主节点的主机名(Pgpool-II 4.1 或更高版本)
    #12       %S	    旧主节点的端口号(Pgpool-II 4.1 或更高版本)
    #13       %%	    “%”字符,代表%自身
    failover_command = '/usr/local/pgpool/etc/failover.sh %d %h  %p %D %m %M %H %P %r %R %N %S'
    
    #指定在PostgreSQL节点附加到Pgpool-II时要运行的命令.在执行命令之前Pgpool-II将以下特殊字符替换为后端特定信息.
    #   特殊字符	描述
    #01   %d	        附加节点的数据库节点ID
    #02   %h	        附加节点的主机名
    #03   %p	        附加节点的端口号
    #04   %D	        附加节点的数据库群集目录
    #05   %m	        新的主节点 ID
    #06   %H	        新主节点的主机名
    #07   %M	        旧的主节点标识
    #08   %P	        旧的主节点ID
    #09   %r	        新主节点的端口号
    #10   %R	        新主节点的数据库集群目录
    #11   %N	        旧主节点的主机名(Pgpool-II 4.1 或更高版本)
    #12   %S	        旧主节点的端口号(Pgpool-II 4.1 或更高版本)
    #13   %%	        “%”字符,代表%自身
    #failback_command = ''
    
    
    #failover_on_backend_error = on             #设置为on时Pgpool-II会将PostgreSQL节点读取/写入错误视为后端节点故障,并在断开当前会话后触发该节点上的故障转移.当此设置为off时Pgpool-II仅报告错误并在发生此类错误时断开会话
    
    #failover_on_backend_shutdown = on         #设置为on时Pgpool-II通过检查当前连接PostgreSQL节点会话上的特定错误代码57P01(admin_shutdown)和57P02(crash_shutdown)来检测后端关闭事件.如果它检测到这些错误代码,则会在该节点上触发故障转移,当此设置为off时Pgpool-II仅报告错误并在发生此类错误时断开会话.默认值为关闭。
    
    #detach_false_primary = off                 #如果设置为on则分离假的主节点.默认值为off.此参数仅在流式复制模式下有效,并且对于PostgreSQL 9.6或更高版本有效.更多内容主参看文档
    
    #search_primary_node_timeout = 5min         #指定发生故障转移方案时搜索主节点的最长时间(以秒为单位).超过此时间Pgpool-II将放弃查找主节点.默认值为300.将此参数设置为0意味着永远尝试查找主节点
    
    #------------------------------------------------------------------------------
    # ONLINE RECOVERY   在线恢复,建议使用手动恢复,防止脑裂
    # https://www.pgpool.net/docs/latest/en/html/runtime-online-recovery.html
    #------------------------------------------------------------------------------
    
    #recovery_user = 'nobody'
                                       # Online recovery user
    #recovery_password = ''
                                       # Online recovery password
                                       # Leaving it empty will make Pgpool-II to first look for the
                                       # Password in pool_passwd file before using the empty password
    
    #recovery_1st_stage_command = ''
                                       # Executes a command in first stage
    #recovery_2nd_stage_command = ''
                                       # Executes a command in second stage
    #recovery_timeout = 90
                                       # Timeout in seconds to wait for the
                                       # recovering node's postmaster to start up
                                       # 0 means no wait
    #client_idle_limit_in_recovery = 0
                                       # Client is disconnected after being idle
                                       # for that many seconds in the second stage
                                       # of online recovery
                                       # 0 means no disconnection
                                       # -1 means immediate disconnection
    
    #auto_failback = off
                                       # Dettached backend node reattach automatically
                                       # if replication_state is 'streaming'.
    #auto_failback_interval = 1min
                                       # Min interval of executing auto_failback in
                                       # seconds.
    
    #------------------------------------------------------------------------------
    # WATCHDOG      看门狗
    #https://www.pgpool.net/docs/latest/en/html/tutorial-watchdog-intro.html#TUTORIAL-WATCHDOG-COORDINATING-NODES
    #注意:为确保仲裁机制正常工作,Pgpool-II节点的数量必须为奇数且大于或等于3。
    #
    #https://www.pgpool.net/docs/latest/en/html/runtime-watchdog-config.html
    #Pgpool-II 4.1或更早版本因为需要指定自己的pgpool节点信息和目标pgpool节点信息,因此每个pgpool节点的设置是不同的.从Pgpool-II 4.2开始所有主机上的所有配置参数都是相同的
    #------------------------------------------------------------------------------
    
    # - Enabling -
    
    use_watchdog = on                           #是否启用看门狗
    
    # -Connection to up stream servers -
    
    #指定需要检查的服务器的列表(以英文的,号分隔服务器).注意列表中的每个服务器都需要响应ping.如果无法ping通的服务器看门狗会将其视为故障服务器.请注意,您不应将PostgreSQL服务器分配给此参数.
    #"您不应将PostgreSQL服务器分配给此参数"这句话的意思是pgpool和postgresql部署在不同机器上的情况
    #在本案例中pgpool只要master和sync slave上运行,async slave不运行pgpool,因此只要看门狗只要设置两台即可
    #   async slave是在Backend Connection Settings上设置的,可以通过负载均衡可以访问,它的故障由健康检查负责,它和看门狗是不冲突的
    #   pgpool在pgser01上trusted_servers设置为pgser02,同时也要修改hostname0
    #   pgpool在pgser02上trusted_servers设置为pgser01,同时也要修改hostname0
    trusted_servers = 'pgser01,pgser02'
    
    #ping_path = '/bin'                          #ping命令所在目录,测试目录是否正确/bin/ping pgser02.
    
    # - Watchdog communication Settings 看门狗通信设置-
    hostname0 = 'pgser01'                       #指定Pgpool-II服务器的主机名或IP地址
    wd_port0 = 9000                             #看门狗服务端口号
    pgpool_port0 = 9999                         #pgpool端口号
    
    hostname1 = 'pgser02'                       #指定Pgpool-II服务器的主机名或IP地址
    wd_port1 = 9000                             #看门狗服务端口号
    pgpool_port1 = 9999 
    
    
    #此参数可用于在选择领导者看门狗节点的选举中提升本地看门狗节点的优先级.当集群在旧的领导者看门狗节点发生故障时,集群将选择新的领导者节点,具有较高wd_priority值的节点将被选为领导者看门狗节点.wd_priority在群集启动时也有效,当一些看门狗节点同时启动时,选择wd_priority值较高的节点作为领导节点.因此我们应该按照wd_priority优先级的顺序启动看门狗节点,以防止意外节点被选为领导者
    #wd_priority在 Pgpool-II V3.5 之前的版本中不可用。
    #在本案例中pgpool只要master和sync slave上运行,因此此参数不受影响
    #wd_priority = 1
    
    
    #wd_authkey = ''                            #指定用于所有监视程序通信的身份验证密钥,空值表示禁用监视程序身份验证。
    wd_ipc_socket_dir = '/tmp'           #创建接受Pgpool-II看门狗IPC连接的UNIX域套接字的目录
    
    # - Virtual IP control Setting 虚拟ip-
    
    delegate_IP = '192.168.1.65'        #连接的Pgpool-II的虚拟IP地址(VIP)
    #if_cmd_path = '/sbin'               #指定Pgpool-II将用于切换虚拟IP的命令的路径
    #加载和卸载虚拟ip,注意修改网卡名称
    if_up_cmd =   '/usr/bin/sudo /sbin/ip addr add 192.168.1.66/24 dev ens32 label ens32:0 && /usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens32 label ens32:1'
    if_down_cmd = '/usr/bin/sudo /sbin/ip addr del 192.168.1.66/24 dev ens32 && /usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens32'
    #arping_path = '/usr/sbin'
    #arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens32:1' #指定用于在虚拟IP交换之后发送ARP请求的命令
    
    # - Behaivor on escalation Setting 升级和降级-
    
    #设置为on时当pgpool-II升级到master状态时将清除共享内存中的所有查询缓存.这可以防止新的master Pgpool-II使用与旧master不一致的查询缓存
    #这只有在memqcache_method是“shmem”时才有效
    clear_memqcache_on_escalation = off
    
    #wd_escalation_command = ''                 #看门狗在升级到领导看门狗的节点上执行此命令.如果在节点上配置了虚拟IP,则在启动虚拟IP之前执行此命令
    #wd_de_escalation_command = ''              #当master看门狗节点变更为slave看门狗节点时,master看门狗会在该节点上执行此命令.
    
    # - Watchdog consensus settings for failover 看门狗故障转换-
    
    #该参数为on时Pgpool-II在切换为slave或故障转移时将考虑仲裁.如果看门狗节点的数量(即Pgpool-II节点的数量)可以占看门狗节点总数的大多数,我们可以说“仲裁存在”.例如:假设看门狗节点数为5,如果活动节点数大于或等于3则存在仲裁.另一方面如果活动节点数为2或更低则仲裁不存在,因为它永远不会占多数。
    #如果仲裁存在Pgpool-II可以更好地进行故障检测,因为即使看门狗节点错误地检测到后端节点的故障,也会被其他master看门狗节点拒绝.Pgpool-II在failover_require_consensus处于打开状态时以这种方式工作(默认值),但您可以对其进行更改,以便在检测到故障时立即进行故障转移.检测到错误的故障的Pgpool-II节点将隔离后端节点.
    #在本案例中pgpool只有master和sync slave上运行,因此此参数为off
    failover_when_quorum_exists = off
    
    #该参数为on时Pgpool-II在切换为slave或故障转移将进行故障转移投票(如果监视程序仲裁存在)
    #例如在三节点群集中执行故障转移,至少有两个节点要求在特定后端节点上执行故障转移
    #如果此参数处于关闭状态,则即使没有共识,也会触发故障转移
    failover_require_consensus = off
    
    #此参数与failover_require_consensus结合使用.启用后单个Pgpool-II节点在故障转移时可以投多个投票。
    #allow_multiple_failover_requests_from_node = off
    
    #此参数配置Pgpool-II如何进行多个投标规则计算,以达成故障转移的共识
    #enable_consensus_with_half_votes = off
    
    # - Watchdog cluster membership settings for quorum computation -
    
    #wd_remove_shutdown_nodes = off         #SHUTDOWN节点时会立即标记为非成员并从集群中删除,如果SHUTDOWN的节点再次启动,它将自动添加到群集中。
    #wd_lost_node_removal_timeout = 0s      #迷失的看门狗节点达到X秒后(以秒为单位)仍无响应,将标记为非成员并从集群中删除.当LOST节点重新连接到群集时,将还原其集群成员身份
    #wd_no_show_node_removal_timeout = 0s   #如果节点在集群初始化时未显示且x秒后(以秒为单位)仍无响应,则将其标记为非成员.非成员节点在启动并连接到集群后立即成为集群成员
    
    # - Lifecheck Setting 看门狗生命周期检查-
    
    # -- common --
    
    #以英文逗号分隔的网络设备名称列表,由监视程序进程监视网络链路状态.如果列表中的所有网络接口都变为非活动状态(禁用或电缆拔出),则看门狗将将其视为完全网络故障Pgpool-II节点将自杀.指定“”(空)列表将禁用网络接口监视.将其设置为“any”将启用对除环回之外的所有可用网络接口的监视。
    #wd_monitoring_interfaces_list在 Pgpool-II V3.5 之前的版本中不可用。
    #wd_monitoring_interfaces_list = ''
    
    wd_lifecheck_method = 'heartbeat'           #指定生命周期检查的方法,心跳,查询,外部
    wd_interval = 10                            #指定Pgpool-II生命周期检查间隔(以秒为单位)
    # -- heartbeat mode 心跳模式--
    #在本案例中pgpool只要master和sync slave上运行,async slave不运行pgpool,因此只要看门狗只要设置两台即可
    #   pgpool在pgser01上heartbeat_hostname0设置为pgser02,注意修改网卡的名称
    #   pgpool在pgser02上heartbeat_hostname0设置为pgser01,注意修改网卡的名称
    heartbeat_hostname0 = 'pgser02'
    heartbeat_port0 = 9694
    heartbeat_device0 = 'ens32'
    
    
    wd_heartbeat_keepalive = 2                 #指定发送检测信号之间的间隔时间(以秒为单位)
    wd_heartbeat_deadtime = 30                 #指定将远程节点标记为失败/失效节点(如果在该时间内未收到检测信号)之前的时间(以秒为单位)
    # -- query mode --
    
    #wd_life_point = 3
                                        # lifecheck retry times
                                        # (change requires restart)
    #wd_lifecheck_query = 'SELECT 1'
                                        # lifecheck query to pgpool from watchdog
                                        # (change requires restart)
    #wd_lifecheck_dbname = 'template1'
                                        # Database name connected for lifecheck
                                        # (change requires restart)
    #wd_lifecheck_user = 'nobody'
                                        # watchdog user monitoring pgpools in lifecheck
                                        # (change requires restart)
    #wd_lifecheck_password = ''
                                        # Password for watchdog user in lifecheck
                                        # Leaving it empty will make Pgpool-II to first look for the
                                        # Password in pool_passwd file before using the empty password
                                        # (change requires restart)
    
    #------------------------------------------------------------------------------
    # OTHERS    其它配置
    #https://www.pgpool.net/docs/latest/en/html/runtime-misc.html
    #------------------------------------------------------------------------------
    #relcache_expire = 0               #relation缓存的生存期(以秒为单位).0:表示relation缓存永不过期(默认值).relation缓存用于针对PostgreSQL system catalog查询结果.relation缓存包括表结构在内的各种信息并检查表类型(例如:检查引用的表是否为临时表)等.relation缓存保留在pgpool子过程内存空间中,其生存期与子进程的生存期相同.如果启用了enable_shared_relcache,缓存也保留在共享内存中,以便在子进程之间共享。如果使用ALTER TABLE或类似的命令修改了表,则relation缓存与实际不再一致,因此使用relcache_expire控制relation缓存的生存期.
    
     #指定relation缓存条目的数量,默认值为 256.您可以通过公式"使用表 * 10"估计所需的relation缓存数量
    # 如果 Pgpool-II 日志中经常出现以下消息"pool_search_relcache: cache replacement happened",则可能需要增加relcache_size以获得更好的性能。
    #relcache_size = 256
    
    #check_temp_table = catalog                 #枚举[catalog,trace,none],设置为catalog或trace时将在SELECT语句中启用临时表检查
    
    #check_unlogged_table = on                  #设置为on,则在SELECT语句中启用unlogged table检查
    
    enable_shared_relcache = off                #是否启用relcache共享
    
    #relcache_query_target = primary            #枚举[primary,load_balance_node],relcache查询目标,默认发送至master节点
    #------------------------------------------------------------------------------
    # IN MEMORY QUERY MEMORY CACHE      #pgpool共享内存缓存
    #https://www.pgpool.net/docs/latest/en/html/runtime-in-memory-query-cache.html     
    #因为内存资源紧张,查询不缓存至pgpool.实际也建议不缓存
    #------------------------------------------------------------------------------
    #是否启用pgpool共享内存缓存.注意:如果enable_shared_relcache设置为on,即使将memory_cache_enabled参数设置为off,也会使用pgpool缓存
    memory_cache_enabled = off 
    
    #memqcache_method = 'shmem'                 #枚举[shmem,memcached],指定pgpool共享内存缓存的存储类型
    #memqcache_memcached_host = 'localhost'     #设置pgpool共享内存缓存所在的位置(设置主机名或IP地址)
    #memqcache_memcached_port = 11211           #设置pgpool共享内存缓存所在的位置的端口号
    #memqcache_total_size = 64MB                #设置pgpool共享内存缓存大小
    
    #指定pgpool共享内存缓存条目数,用于定义共享内存管理空间的大小
    #管理空间大小可以按以下方式计算:memqcache_max_num_cache * 48字节.太小的数字会导致注册缓存时出错,另一方面,数量过多会浪费空间
    #memqcache_max_num_cache = 1000000
    
    #指定pgpool共享内存的生存期(以秒为单位).默认值为0,表示pgpool共享内存永不过期,缓存在更新表之前保持有效
    #memqcache_expire和memqcache_auto_cache_invalidation彼此正交。
    #memqcache_expire = 0
    
    #设置为on时将自动删除与更新的表相关的缓存.关闭时不会删除缓存
    #memqcache_auto_cache_invalidation = on
    
    #指定要缓存的SELECT查询结果的最大大小(以字节为单位).查询结果数据大于此值的结果将不会由Pgpool-II缓存.
    #当由于大小限制而拒绝缓存数据时,将显示以下消息"LOG:   pid 13756: pool_add_temp_query_cache: data size exceeds memqcache_maxcache. current:4095 requested:111 memq_maxcache:4096"
    #对于pgpool共享内存存储类型为shmem,缓存memqcache_maxcache必须设置为低于memqcache_cache_block_size.
    #对于pgpool共享内存存储类型为memcached,它必须小于slab的大小
    #memqcache_maxcache = 400kB
    
    
    #memqcache_cache_block_size = 1MB           #指定pgpool共享内存缓存块大小.如果memqcache_method =“shmem”,则为必填项
    #memqcache_oiddir = '/var/log/pgpool/oiddir'    #指定用于记录SELECT时使用的表的oid的完整路径(临时工作目录)
    
    
    #cache_safe_memqcache_table_list = ''       #以英文逗号分隔的表名列表,其SELECT结果应由Pgpool-II缓存.此参数仅适用于访问未记录表的VIEW和SELECT.除非由cache_unsafe_memqcache_table_list指定
    #cache_unsafe_memqcache_table_list = ''     #以英文逗号分隔的表名列表,其SELECT结果Pgpool-II不会缓存.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
    • 461
    • 462
    • 463
    • 464
    • 465
    • 466
    • 467
    • 468
    • 469
    • 470
    • 471
    • 472
    • 473
    • 474
    • 475
    • 476
    • 477
    • 478
    • 479
    • 480
    • 481
    • 482
    • 483
    • 484
    • 485
    • 486
    • 487
    • 488
    • 489
    • 490
    • 491
    • 492
    • 493
    • 494
    • 495
    • 496
    • 497
    • 498
    • 499
    • 500
    • 501
    • 502
    • 503
    • 504
    • 505
    • 506
    • 507
    • 508
    • 509
    • 510
    • 511
    • 512
    • 513
    • 514
    • 515
    • 516
    • 517
    • 518
    • 519
    • 520
    • 521
    • 522
    • 523
    • 524
    • 525
    • 526
    • 527
    • 528
    • 529
    • 530
    • 531
    • 532
    • 533
    • 534
    • 535
    • 536
    • 537
    • 538
    • 539
    • 540
    • 541
    • 542
    • 543
    • 544
    • 545
    • 546
    • 547
    • 548
    • 549
    • 550
    • 551
    • 552
    • 553
    • 554
    • 555
    • 556
    • 557
    • 558
    • 559
    • 560
    • 561
    • 562
    • 563
    • 564
    • 565
    • 566
    • 567
    • 568
    • 569
    • 570
    • 571
    • 572
    • 573
    • 574
    • 575
    • 576
    • 577
  • 相关阅读:
    机器学习笔记之高斯过程(三)高斯过程回归——函数空间角度
    软件测试/测试开发丨App自动化—CSS 定位与原生定位
    10. python字典
    计算机网络第一章习题_网络概述
    LeetCode/LintCode 题解丨一周爆刷字符串:乱序字符串
    抖音小店一周卖了7万多,每天赚2000多,7个步骤教新手如何起店
    从零开始学mitmproxy抓包工具
    java: 不兼容的类型: org.apache.xmlbeans.XmlObject无法转换为x2006.main.CTRow
    spring多数据源动态切换的实现原理及读写分离的应用
    LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)
  • 原文地址:https://blog.csdn.net/kmblack1/article/details/126857611