美文网首页
离线PXC双机高可用集群安装及服务自启动脚本

离线PXC双机高可用集群安装及服务自启动脚本

作者: 阿乐_822e | 来源:发表于2020-11-30 15:21 被阅读0次

    项目背景: 生产环境,与外网物理隔离;且只能提供两台服务器做高可用。PXC的官网是建议组建集群时至少3台主机,实践后,发现添加一个仲裁节点(其实就是在一台第三方机器上安装一个garb服务)也可以正常使用。

    机器准备

    pxc-node0(192.168.0.153) 、pxc-node1(192.168.0.154),
    两台兼做负载均衡(haproxy)及HA(keepalived)机器
    VIP: 192.168.0.160
    另找一台网络中的第三方机器,做仲裁节点:192.168.0.155
    一台与PXC-node相同OS版本的外网机器,用来用载相关的依赖包

    安装PXC-node0

    1. 到外网机器上下载所需依赖包
    $ mkdir /home/rpm
    $ yum install --downloadonly --downloaddir=/home/rpm openssl socat  \
    procps-ng chkconfig procps-ng coreutils shadow-utils \
    grep libaio libev libcurl perl-DBD-MySQL perl-Digest-MD5 \
    libgcc libstdc++ libgcrypt libgpg-error zlib glibc openssl-libs
    $ tar czf pxc-rpm.tar  /home/rpm/
    $ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
    $ curl -O https://www.percona.com/downloads/Percona-XtraDB-Cluster-57/Percona-XtraDB-Cluster-5.7.14-26.17/binary/tarball/Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101.tar.gz
    

    2.安装pxc-node0
    以下在pxc-node0上操作:先将上述压缩包上传

    # 安装依赖包
    $ mkdir pxc-setup
    $ tar zxvf pxc-rpm.tar -C pxc-setup/
    $ cd pxc-setup/home/rpm/
    $ mkdir update
    $ mv libcurl-7.29.0-57.el7_8.1.x86_64.rpm curl-7.29.0-57.el7_8.1.x86_64.rpm ./update/
    $ rpm -ivh *.rpm     # 如果安装失败就一个一个装!
    $ rpm -Uvh update/*.rpm
    
    # 安装percona xtrbackup
    $ tar zxvf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz -C /usr/local/
    
    # 安装PXC
    $ tar zxvf Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101.tar.gz -C /usr/local/
    $ mv /usr/local/Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101/ /usr/local/pxc_mysql
    groupadd mysql
    useradd -M -g mysql -s /sbin/nologin/ -d /usr/local/mysql mysql
    mkdir -p /usr/local/pxc_mysql/{data,logs,tmp}
    mkdir -p /usr/local/pxc_mysql/logs/binlog
    chown -R mysql:mysql /usr/local/pxc_mysql/{data,logs,tmp}
    $ echo "export PATH=/usr/local/percona-xtrabackup-2.4.4-Linux-x86_64/bin:/usr/local/pxc_mysql/bin:$PATH" >> /etc/profile
    
    1. 配置PXC-node0
      以下在pxc-node0上操作
    $ cd /usr/local/pxc_mysql
    $ cp ./support-files/my-default.cnf my.cnf
    $ vi my.cnf  # 添加如下:
    wsrep_provider=/usr/local/pxc_mysql/lib/libgalera_smm.so  
    wsrep_cluster_name=pxc-mytest  #集群名称,所有节点必须一致
    wsrep_cluster_address=gcomm://192.168.0.153,192.168.0.154,192.168.0.155 #指定在集群中的各节点的ip
    wsrep_node_name=pxc_node0  #指定本节点在集群中唯一标识的节点名
    wsrep_node_address=192.168.0.153 #本节点地址
    wsrep_sst_method=xtrabackup-v2 #SST方式,默认是xtrabackup-v2,也是5.7唯一支持的方式
    wsrep_sst_auth=pxc:213456  #SST时用到的用户名密码
    wsrep_provider=/usr/local/pxc_mysql/lib/libgalera_smm.so
    pxc_strict_mode=ENFORCING #开启严格模式,也是默认行为
    binlog_format=ROW #binlog格式
    default_storage_engine=InnoDB #默认存储引擎
    innodb_autoinc_lock_mode=2 #自增锁模式
    skip-name-resolve
    event_scheduler=1
    max_connections=1500
    
    # 初始化第一个节点:
    $ bin/mysqld  --defaults-file=/usr/local/pxc_mysql/my.cnf --initialize --user=mysql \
    --basedir=/usr/local/pxc_mysql --datadir=/usr/local/pxc_mysql/data
    A temporary password is generated for root@localhost: ulCUnyVe%9o#  # 记下这个临时密码
    $ chown mysql:mysql /usr/share/mysql/english/errmsg.sys
    # 启动第一个节点:
    $ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf \
    --wsrep-new-cluster --user=mysql &
    $ mysql -uroot -p #使用上面的临时密码
    mysql> ALTER USER "root"@"localhost" IDENTIFIED BY "123456"; # 修改root密码
    mysql> CREATE USER "pxc"@"localhost" IDENTIFIED BY "213456"; #为SST创建一个用户并赋权限
    mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO "pxc"@"localhost"  IDENTIFIED BY "213456"; 
    mysql> FLUSH PRIVILEGES;
    

    配置PXC健康检查
    即安装配置xinetd服务

    $ yum install xinetd -y
    $ echo 'mysqlchk 9200/tcp # mysqlchk' >> /etc/services
    $ systemctl enable xinetd && systemctl start xinetd
    $ chkconfig --level 2345 xinetd on
    $ cp /usr/local/pxc_mysql/bin/clustercheck /usr/bin/
    $ cp /usr/local/pxc_mysql/bin/clustercheck /etc/xinetd.d/
    $ cp /usr/local/pxc_mysql/bin/mysql /usr/bin/
    $ mysql -uroot -p
    mysql> GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';       # 创建健康检查用户
    Query OK, 0 rows affected, 1 warning (0.54 sec)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.08 sec)
    $ vi /etc/xinetd.d/mysqlchk   # 输入以下内容 
    # default: on
    # description: mysqlchk
    service mysqlchk
    {
    # this is a config for xinetd, place it in /etc/xinetd.d/
      disable = no
      flags = REUSE
      socket_type = stream
      port = 9200
      wait = no
      user = nobody
      server = /usr/bin/clustercheck
      log_on_failure += USERID
      only_from = 0.0.0.0/0
      # recommended to put the IPs that need
      # to connect exclusively (security purposes)
      per_source = UNLIMITED
    }
    $ curl -I 192.168.0.153:9200   # 健康检查(或使用clustercheck命令)
    HTTP/1.1 200 OK
    Content-Type: text/plain
    Connection: close
    Content-Length: 40
    

    安装PXC-node1

    同样的方法在DC-PXC01上安装pxc与健康检查,但要作一些改动:

    # 修改机器名与IP,不详叙
    .......
    # 修改/usr/local/pxc_mysql/my.cnf中的wsrep_node_name、wsrep_node_address两项
    # 重新初始化PXC
    $ pkill mysqld
    $ rm -rf /usr/local/pxc_mysql/data/*
    $ bin/mysqld  --defaults-file=/usr/local/pxc_mysql/my.cnf --initialize --user=mysql \
    --basedir=/usr/local/pxc_mysql --datadir=/usr/local/pxc_mysql/data
    # 启动的命令参数和第一个节点不一样
    $ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
    # 此时再登录myql,会发现其密码已经被同步为123456了
    $ mysql -uroot -p123456
    mysql> show status like 'wsrep_cluster_%';
    +--------------------------+--------------------------------------+
    | Variable_name            | Value                                |
    +--------------------------+--------------------------------------+
    | wsrep_cluster_conf_id    | 2                                    |
    | wsrep_cluster_size       | 2                                    |
    | wsrep_cluster_state_uuid | 51e34fd0-e83a-11ea-b1d9-8e93ca22d0f6 |
    | wsrep_cluster_status     | Primary                              |
    +--------------------------+--------------------------------------+
    4 rows in set (0.00 sec)
    # 从上面可以看到2个节点都起来了!
    

    到这里,这个2节点的PXC群集就启动起来了

    安装配置haproxy(负载均衡)

    haproxy提供PXC集群的负载均衡
    以下操作在DC-PXC00/01上进行

    # 复制到内网机器上安装
    $ rpm -ivh haproxy-1.5.18-9.el7.x86_64.rpm 
    $ mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-bak
    $ vi /etc/haproxy/haproxy.cfg
    global
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    maxconn 4096
    chroot /usr/share/haproxy
    user haproxy
    group haproxy
    daemon
    
    defaults
    log global
    mode http
    option tcplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    contimeout 5000
    clitimeout 50000
    srvtimeout 50000
    
    frontend pxc-front
    bind *:3307
    mode tcp
    default_backend pxc-back
    
    frontend stats-front
    bind *:80
    mode http
    default_backend stats-back
    
    frontend pxc-onenode-front
    bind *:3316
    mode tcp
    default_backend pxc-onenode-back
    
    backend pxc-back
    mode tcp
    balance leastconn
    option httpchk
    server pxc_node0 192.168.0.153:3306 check port 9200 inter 12000 rise 3 fall 3
    server pxc_node1 192.168.0.154:3306 check port 9200 inter 12000 rise 3 fall 3
    
    backend stats-back
    mode http
    balance roundrobin
    stats uri /haproxy/stats
    
    backend pxc-onenode-back
    mode tcp
    balance leastconn
    option httpchk
    server pxc_node0 192.168.0.153:3306 check port 9200 inter 12000 rise 3 fall 3
    server pxc_node1 192.168.0.154:3306 check port 9200 inter 12000 rise 3 fall 3 backup
    # 说明:在此配置中,定义了三个前端-后端对。统计信息对用于HAProxy统计信息页面,其他用于Percona XtraDB集群。 MySQL将监听端口3316和3307。如果连接到端口3316,则将连接到pxc-onenode,并且一次只能使用一个节点(以避免由于乐观锁定而回滚)。如果该节点离线,您将开始使用另一个节点。但是,如果您连接到端口3307,则还将使用所有三个节点进行读写。在这种情况下,将使用Minimumconn负载平衡方法代替轮询,这意味着您始终以建立的最少连接数连接到后端。可以使用指向/haproxy/stats的浏览器在客户端节点上访问统计信息页面
    $ systemctl enable haproxy && service haproxy restart
    # 访问http://192.168.0.160/haproxy/stats页面,查看pxc高可用集群状态
    

    安装及配置keepalived(高可用)

    以下操作在DC-PXC00/01上进行

    $ yum install keepalived-1.3.5-6.el7.x86_64
    $ mv  /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf-bak
    $ vi /etc/keepalived/keepalived.conf
    global_defs {
        script_user root
        enable_script_security
    }
    
    vrrp_script chk_haproxy {
        script "/etc/keepalived/chk_haproxy.sh" # check the haproxy process
        interval 2 # every 2 seconds
        weight 2 # add 2 points if OK
    }
    
    vrrp_instance VI_1 {
        interface ens32 # 网卡接口名,要根据实际修改
        state BACKUP # 两台机都设为BACKUP,非抢占式
        virtual_router_id 110
        priority 100  # node1上为90
        nopreempt
    
    virtual_ipaddress {
        192.168.0.160 # virtual ip address
        }
            track_script {
            chk_haproxy
        }
    }
    # 检测脚本
    $ cat /etc/keepalived/chk_haproxy.sh
    #!/bin/bash
    stat=`ps -C haproxy --no-header |wc -l`
        if [ $stat -eq 0 ];then
            /usr/bin/systemctl start haproxy
            sleep 3
    
            if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
                /usr/bin/systemctl stop keepalived
            fi
    fi
    $ chmod +x /etc/keepalived/chk_haproxy.sh
    $ systemctl enable keepalived && service keepalived restart
    

    添加PXC双节点仲裁器

    为防止2个节点出现“脑裂”的问题,现在为它添加一个仲裁节点(Galera Arbitrator)。因为资源所限,我们将其放在第三方机器上。以下操作在这台第三方机器上进行:

    $ rpm -ivh Percona-XtraDB-Cluster-garbd-57-5.7.31-31.45.3.el7.x86_64.rpm
    $ vi /etc/sysconfig/garb   # 在末尾添加
    GALERA_NODES="192.168.0.153:4567, 192.168.0.155:4567, 192.168.0.155:4567"
    GALERA_GROUP="pxc-mytest"
    LOG_FILE="/tmp/garbd.log"
    # 还要删除“# REMOVE THIS AFTER CONFIGURATION”这一行,保存退出
    $ systemctl enable garb  && service garb start && service garb status
    # 可以通过garb日志查看服务详情
    $ tail -f /tmp/garbd.log
    

    ps:garb配置文件修改后,一定要删除“ REMOVE THIS AFTER CONFIGURATION”这一行,才能生效。

    MysqlPXC集群服务启动的说明

    在/usr/local/pxc_mysql/data目录下,有一个grastate.dat 文件,它记录了本机数据库的集群信息。其中有一个“seqno”字段,当它为“-1”时表示集群正常,为其它数值时表示集群的检查点。

    初始启动

    当集群初建时,可以任选一台机器作主,创建集群,另外一台加入这个集群:

    # 启动第一个节点:
    $ cd /usr/local/pxc_mysql
    $ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf \
    --wsrep-new-cluster --user=mysql &
    # 启动第二个节点,启动的命令参数和第一个节点不一样
    $ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
    

    异常情况下的启动

    当某节点上的mysql服务宕机/节点重启时,此时分两种情况:

    • 另外节点上的mysql服务正常,则那个节点(不管之前是主是从)肯定会成为主节点,那么故障节点必须 要以从机的身份加入群集
    $ cd /usr/local/pxc_mysql
    $ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
    
    • 当另外那个节点上的mysql服务以及仲裁节点上的garb服务(比如:机房断电)也宕机时,此时集群已经不存在了,这时先要分析grastate.dat 文件来确定哪个节点上的数据比较新,一般来说,grastate.dat 文件的时间越新,seqno越大,则它的数据越新,这时,就要以这个节点作主创建集群,另外的节点以从机身份加入(通常会引发lst,即增量备份操作,数据量较大时会造成集群性能下降)
    • 仲裁节点上的garb服务不能先于两个pxc节点上的服务启动

    pxc自动启动设置

    为简化pxc启动,下面配置一下脚本自动启动方式

    配置免密登录

    # 在node0上
    $ ssh-keygen   # (连按几次回车)生成登录秘钥
    $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.154 
    $ ssh root@192.168.0.154  # 尝试一下免密登录
    $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.155  
    $ ssh root@192.168.0.155  # 尝试一下免密登录
    # 在node1上
    $ ssh-keygen   # (连按几次回车)生成登录秘钥
    $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.153  
    $ ssh root@192.168.0.153  # 尝试一下免密登录
    $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.155
    $ ssh root@192.168.0.155  # 尝试一下免密登录
    

    编写服务脚本

    # 在node0上
    # 先配置一下软连接
    $ ln -s /usr/local/percona-xtrabackup-2.4.4-Linux-x86_64/bin/xtrabackup  /usr/bin/xtrabackup
    $ ln -s /usr/local/percona-xtrabackup-2.4.4-Linux-x86_64/bin/xbstream  /usr/bin/xbstream
    $ cd /usr/local/pxc_mysql/
    $ vi pxc.sh
    #!/bin/bash
    #chkconfig: 2345 38 46
    
    . /etc/init.d/functions
    if [ $# -ne 1 ];then
            echo "usage: $0 {start|stop|status}"
            exit 1
    fi
    case "$1" in
    start)
            # 检查自己的mysql是否已启动
            if [ `ps -C mysqld --no-header |wc -l` -gt 0 ];then
                    echo "pxc服务已在运行中......"
                    exit 1
            fi
    
            echo "pxc服务启动中......"
            # 检查对方的mysql是否已启动
            if [ `ssh 192.168.0.154 ps -C mysqld --no-header |wc -l` -eq 0 ] && [ `ssh 192.168.106.123 ps -C garbd --no-header |wc -l` -eq 0 ];then   
                # 对方与123上面的仲裁器均未启动,本机拉起群集(还应该有一个判断哪台机的grastate.dat文件更新的问题,暂时skip)
                cd /usr/local/pxc_mysql
                bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --wsrep-new-cluster --user=mysql &
                time=`date "+%F %H:%M:%S"`
                msg="$time  ------本机以主机身份拉起群集!------\n"
            else
               # 对方或123上面的仲裁器有一个或均已启动,本机以从机身份加入群集
               cd /usr/local/pxc_mysql
               bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
               time=`date "+%F %H:%M:%S"`
               msg="$time  ------本机以从机身份加入群集!------\n"           
            fi
    
            # 检查本机是否启动并写入日志
            sleep 10
            if [ `ps -C mysqld --no-header |wc -l` -gt 0 ];then
               echo -e $msg >>/tmp/pxc.log
               action "pxc服务已启动" /bin/true
               exit 0
            else
               echo -e "本机启动pxc失败,请检查!" >>/tmp/pxc.log
               action " 启动pxc服务失败,请检查! " /bin/false
               exit 1
            fi
     ;;
    stop)
            if [ `ps -C mysqld --no-header |wc -l` -gt 0  ];then
                    echo "正在停止pxc服务,请稍等......"
                    pkill mysqld
            else
                    action "pxc服务未启动!" /bin/false
                    exit 1
            fi
            sleep 10
            if [ `ps -C mysqld --no-header |wc -l` -eq 0 ];then
                    action "pxc服务已关闭!" /bin/true
                    exit 0
            else
                    action "本机关闭pxc失败,请检查!" /bin/false
                    exit 1
            fi
            ;;
    status)
            if [ `ps -C mysqld --no-header |wc -l` -gt 0 ]; then
                    action "pxc服务正在运行中!"
                    exit 0
            else
                    action "pxc服务已关闭!"
                    exit 1
            fi
            ;;
    *)
            echo "usage: $0 {start|stop|status}"
            exit 1
    esac
    
    $ chmod +x pxc.sh
    # 再到node1上重复上面几个步骤。注意要将脚本文件中的IP地址改为:192.168.0.153
    # 脚本的用法说明:脚本有3个参数:start/stop/status,分别是启动/停止/查看pxc服务状态
    $ ./pxc.sh start
    pxc服务已在运行中......
    $ ./pxc.sh stop
    正在停止pxc服务,请稍等......
    pxc服务已关闭! [  确定  ]
    $ ./pxc.sh status
    pxc服务已关闭! [  确定  ]
    

    把脚本添加到自启动

    $ cp  pxc.sh  /etc/rc.d/init.d/pxc
    $ cd /etc/rc.d/init.d
    $ chkconfig --add pxc
    $ chkconfig pxc on
    

    接下来,可以尝试重启机器,看pxc服务是否自动启动

    相关文章

      网友评论

          本文标题:离线PXC双机高可用集群安装及服务自启动脚本

          本文链接:https://www.haomeiwen.com/subject/nenaiktx.html