6.2.?使用流复制的主备切换场景示例

6.2.1. 主备模式配置
6.2.2. 主备切换
6.2.3. 主备切换模式下的高可用

先建一个简单的示例环境,此环境如下表所示:

表?6.2.?uxpool复制和负载均衡示例环境

主机名称IP地址uxpoolUXDBSever实例名称数据库名称
ux57.com192.168.0.157已安装已安装masteruxdb
ux58.com192.168.0.158已安装已安装slave_1uxdb

6.2.1.?主备模式配置

主数据与从数据之间同步的方式是使用同步的流复制关系,搭建流复制的具体方法请参照第三章的3.3小节,这里就不叙述了。

uxpool的配置项很多,安装完成后有三个模板文件,都存放在安装目录的etc目录下,一般在配置之前,先拷贝这个模板文件,然后在此基础上进行配置。配置方法为进入/home/uxdb/uxpool/etc目录,执行以下命令(master和slave_1分别配置):

cp pool_hba.conf.sample pool_hba.conf
cp uxpool.conf.sample uxpool.conf
cp pcp.conf.sample pcp.conf

在主备模式下,配置uxpool.conf中的参数“replication_mode”必须设置为“off”,而参数“master_slave_mode”必须设置为“on”,因为使用的是流复制的主备模式,所以“master_slave_sub_mode”要设置为“stream”;在主备模式下可以使用负载均衡,所以把“load_balance_mode”参数设置为“on”,具体配置如下:

  1. pcp.conf配置(master和slave_1分别配置):

    • uxpool有一个用于管理的接口,名为PCP,可通过网络获取数据库的节点信息.要使用pcp命令必须进行用户认证。这种认证需要pcp.conf文件中定义一个用户名和密码。在这个文件中,用户名和密码成对地出现在每一行中,它们用冒号(:)隔开。密码的格式是用md5的哈希加密。如设置一个用户“UXDB”及密码“123456”时,会先计算密码的md5值,如使用UXDB用户,分别进入ux57.com和ux58.com的/home/uxdb/uxdbinstall/uxpool/bin目录下,执行命令:

      ./ux_md5 123456
    • 计算完md5后,进入/home/uxdb/uxdbinstall/uxpool/etc目录下pcp.conf文件中配置如下一行内容:

      uxdb:e10adc3949ba59abbe56e057f20f883e

      其中“e10adc3949ba59abbe56e057f20f883e”就是密码的md5值,如下图所示:

    • 执行命令 ../bin/ux_md5 -p -m -u uxdb pool_passwd 如下图所示:

  2. pool_hba.conf配置(master和slave_1分别配置):

    pool_hba.conf是对登录用户进行验证的,要和uxdb的ux_hba.conf保持一致,要么都是trust,要么都是md5验证方式,这里采用了md5验证方式如下,进入/home/uxdb/uxdbinstall/uxpool/etc目录下配置如下:

  3. uxpool.conf配置(master和slave_1分别配置):

    进入/home/uxdb/uxdbinstall/uxpool/etc目录下uxpool.conf文件,进行编辑。

    • master端配置:

      # - uxpool Connection Settings -
      listen_addresses = '*'
      port = 9999
      pcp_listen_addresses = '*'
      pcp_port = 9898
      
      # - Backend Connection Settings -
      
      backend_hostname0 = 'ux57.com'    #主机master的hostname或者IP
      backend_port0 = 5432
      backend_weight0 = 1
      backend_data_directory0 = '/home/uxdb/uxdbinstall/dbsql/bin/master'   #集群数据目录
      backend_flag0 = 'ALLOW_TO_FAILOVER'
      
      backend_hostname1 = 'ux58.com'  
      backend_port1 = 5432
      backend_weight1 = 1
      backend_data_directory1 = '/home/uxdb/uxdbinstall/dbsql/bin/slave_1'  #集群数据目录
      backend_flag1 = 'ALLOW_TO_FAILOVER'
      
      # - Authentication -
      
      enable_pool_hba = on
      pool_passwd = 'pool_passwd'		#pool_passwd文件名
      
      pid_file_name = '/home/uxdb/uxdbinstall/uxpool/uxpool.pid'
      logdir = '/home/uxdb/uxdbinstall/uxpool/log'
      
      replication_mode = off     #复制开关
      load_balance_mode = on   #负载均衡开关
      master_slave_mode = on
      master_slave_sub_mode = 'stream'
      
      # - Streaming -
      
      sr_check_period = 5
      sr_check_user = 'repuser'
      sr_check_password = '123456'
      sr_check_database = 'uxdb'
                                      
      #--------------------------------------------------------------
      # HEALTH CHECK GLOBAL PARAMETERS
      #--------------------------------------------------------------
      health_check_period = 10     #检查的周期
      health_check_timeout = 20    #指定做健康检查的超时时间, 
      health_check_user = 'uxdb'  #指定健康检查连接后端数据库的用户。
      health_check_password = '123456'  #指定做健康检查时,连接后端数据库的密码。
      health_check_database = 'uxdb'
      
      health_check_period0 = 10
      health_check_timeout0 = 20
      health_check_user0 = 'uxdb'
      health_check_password0 = '123456'
      health_check_database0 = 'uxdb'
      
      #必须设置,否则primary数据库down了,uxpool不知道,不能及时切换。从库流复制还在连接数据,报连接失败。#只有下次使用uxpool登录时,发现连接不上,然后报错,这时候,才知道挂了,uxpool进行切换。
      
      failover_command = '/home/uxdb/uxdbinstall/uxpool/failover_stream.sh %H '
      
      # - Enabling - 
      use_watchdog = on 
      
      # - Watchdog communication Settings - 
      wd_hostname = 'ux57.com' 
      
      wd_port = 9000 
      
      delegate_IP = 'uc60.com'  #虚拟IP配置
      
      if_cmd_path = '/sbin' 
      
      if_up_cmd = 'ifconfig ens33:0 inet $_IP_$ netmask 255.255.254.0' 
      
      if_down_cmd = 'ifconfig ens33:0 down' 
      
      arping_cmd = 'arping -fqbDUV -w 1 $_IP_$'
       
      wd_heartbeat_port = 9694
      wd_heartbeat_keepalive = 2
      wd_heartbeat_deadtime = 30
      heartbeat_destination0 = 'ux58.com'
      heartbeat_destination_port0 = 9694
      heartbeat_device0 = 'ens33'
      
      other_uxpool_hostname0 = 'ux58.com' #对端
      other_uxpool_port0 = 9999
      other_wd_port0 = 9000

      如果是uxdb-2.1.1.0之后的版本还需要进行如下配置:

      failover_when_quorum_exists = off
    • Slave_1节点配置(该节点的配置与master节点基本相同,此处仅将配置不同的参数列出来):

      wd_hostname = 'ux58.com'                #本端
      heartbeat_destination0 = 'ux57.com'     #对端
      other_uxpool_hostname0 = 'ux57.com'     #对端
  4. 创建主备切换脚本(master和slave_1分别创建):

    uxpool.conf配置文件里,故障处理配置的是failover_command = '/home/uxdb/uxdbinstall/uxpool/failover_stream.sh %H ',因此,需要在/home/uxdb/uxdbinstall/uxpool/目录中写个failover_stream.sh脚本。

    • master 脚本如下:

      使用UXDB用户,进入/home/uxdb/uxpool目录下,创建文件:touch failover_stream.sh,编辑文件 vi failover_stream.sh

      #! /bin/sh
       #Failover command for streaming replication.
       #Arguments: $1: new master hostname.
       new_master=$1
       trigger_command="/home/uxdb/uxdbinstall/dbsql/bin/ux_ctl promote -D /home/uxdb/uxdbinstall/dbsql/bin/slave_1"
       #Prompte standby database.
       /usr/bin/ssh -T $new_master  $trigger_command
       exit 0;
    • Slave_1 脚本如下:

      使用UXDB用户,进入/home/uxdb/uxpool目录下,创建文件:touch failover_stream.sh,编辑文件 vi failover_stream.sh

      #! /bin/sh
      #Failover command for streaming replication.
      #Arguments: $1: new master hostname.
       new_master=$1
       trigger_command="/home/uxdb/uxdbinstall/dbsql/bin/ux_ctl promote -D /home/uxdb/uxdbinstall/dbsql/bin/master"
      #Prompte standby database.
       /usr/bin/ssh -T $new_master  $trigger_command
       exit 0;

      分别赋予master和slave_1主机 failover_stream.sh脚本可执行权限:

      chmod 777  /home/uxdb/uxdbinstall/uxpool/failover_stream.sh
  5. 创建uxpool日志文件(master和slave_1分别配置):

    进入/home/uxdb/uxdbinstall/uxpool目录下,执行命令:

    mkdir log
  6. 权限配置:

    如果两台机器之间为主备关系,用于主机宕机后的主备切换时,使用root用户登录,执行以下命令:

    [root@ux57 ~]# chmod u+s /sbin/ifconfig
    [root@ux57 ~]# chmod u+s /usr/sbin/
  7. 启动uxpool(master和slave_1分别启动):

    进入/home/uxdb/uxdbinstall/uxpool/bin目录下,执行命令:

    ./uxpool -n  -D > /home/uxdb/uxdbinstall/uxpool/log/uxpool.log 2>&1 & 

6.2.2.?主备切换

配置了主备模式之后,如果master机器宕机后,即停止当前主节点服务,然后稍等几秒钟,重新连接虚拟节点uc60,发现连接成功,查看主机状态,就会发现,主备发生切换,原来的主机成为备机,原来的备机成为了主机。宕机后的情况模拟如下:

  1. 进入/home/uxdb/uxdbinstall/dbsql/bin目录下,执行命令:

    [uxdb@ux57 bin]$ ./ux_ctl -D master/ stop
  2. 稍等几分钟后,重新使用uxpool连接数据库查看主备关系,主备机切换成功。如下图所示:

    进入/home/uxdb/uxdbinstall/dbsql/bin目录下,执行命令:

    [uxdb@ux57 bin]$ ./uxsql -h uc60.com -p 9999
    uxdb=# show pool_nodes;
  3. 主备切换后,如果原来宕机的master机器想作为备机使用,则需要修复节点,修复方法如下:

    • 同步数据时间线;

      如果宕机后导致两个节点数据时间线不一致,需要做数据同步操作,同步master节点上的时间线。

      ./ux_rewind  --target-uxdata=/home/uxdb/uxdbinstall/dbsql/bin/master  --source-server='host=ux58.com port=5432 user=uxdb dbname=uxdb password=123456'

      同步时间线时会遇到两种情况:

      第一种时间线无需同步,如下图所示:

      第二种时间线有差异需要同步,则会按照新主库(原salve_1)的数据同步时间线,如下图所示:

    • 重命名recovery.done为recovery.conf,并修改primary_conninfo参数信息:

      进入/home/uxdb/uxdbinstall/master目录,执行以下命令:

      [uxdb@ux57 master]$ mv recovery.done recovery.conf

      [uxdb@ux57 master]$ vi recovery.conf,修改primary_conninfo参数如下:

      primary_conninfo = 'application_name=ux57  host=ux58.com port=5432 user=repuser password=123456'
      trigger_file = '/home/uxdb/uxdbinstall/dbsql/bin/master/trigger_file'

      注意

      如果是uxdb-2.1.1.0之前的版本,需要进行该配置。

      如果是uxdb-2.1.1.0及其之后的版本,不再适用该配置。

    • 创建标志问件standby.signal。

      vi standby.signal
      # 添加
      standby_mode = 'on'

      注意

      每次切换都需要创建该文件。

    • 将master/uxsinodb.auto.conf下primary_conninfo中的host修改为新主端ip ux58.com。

    • 修改ux_hba.conf参数信息如下:

      进入/home/uxdb/uxdbinstall/dbsql/bin/master目录。

    • 修复master节点重新加入集群:

      启动master集群,并加入集群管理节点后,查询节点状态,节点状态正常,查询主备关系状态,主备关系状态正常。

      [uxdb@ux57 bin]$ ./ux_ctl -D master/ restart

      修复节点:

      [uxdb@ux57 bin]$ ./pcp_attach_node -d -U uxdb -h  uc60.com  -p 9898 -n 0

      查看修复状态 :

      [uxdb@ux57 bin]$ ./uxsql -h uc60.com -p 9999
      uxdb=# show pool_nodes;

6.2.3.?主备切换模式下的高可用

master端uxpool宕机后,停止master主机uxpool后,稍等片刻,继续访问uc60地址,可以访问成功,查看主机节点状态,节点状态正常。

  1. 在ux57.com 主机上,进入/home/uxdb/uxdbinstall/uxpool/bin目录下,执行命令:

    [uxdb@ux57 bin]$ ./uxpool -m fast stop
  2. 在ux57.com 主机上,数据库可以正常连接:

    [uxdb@ux57 bin]$ ./uxsql -h uc60.com -p 9999
  3. 在ux58.com 主机上,数据库可以正常连接:

    [uxdb@ux58 bin]$ ./uxsql -h uc60.com -p 9999
  4. 在ux57.com上插入数据:

  5. 在ux58上查看,数据相同。

XML 地图 | Sitemap 地图