暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Halo数据库的高可用解决方案Shield的介绍和搭建

Halo Tech 2022-05-30
88

本期内容将介绍Halo数据库的高可用解决方案Shield,并在虚拟环境中搭建三节点的Shield。Halo Shield 是一套自动管理 Halo 主从数据库的高可用解决方案。该方案包括以下几个组成部分。1. Etcd 分布式键值数据库2. Patroni 流复制创建、管理、监控和自动故障转移进程。

Etcd 最少需要三个节点且为奇数来进行 leader 选举。一般可以和Halo数据库部署在相同的服务器上。Etcd 集群之间会进行心跳检测,当发生网络故障时,节点数少的etcd集群会不可用,从而避免脑裂。

Patroni 运用 etcd 集群存储、检测Halo 主从节点的状态与配置信息,当由于故障使得某个节点无法工作,Patroni会自动侦测故障,并通过 etcd 更新节点信息,从而通知所有其他节点。如果该故障节点是主节点,Patroni 还会自动切换,并重新绑定VIP到新的主节点,从而减少对应用系统的影响。

Patroni 通过连接 etcd 对其它节点做心跳检测,当主节点无法更新etcd中的leader lock,patroni会终止当前节点的Halo数据库从而避免脑裂。

应用系统通过访问虚拟IP(VIP)访问数据库。VIP通过网卡绑定在主库的网卡上,当发生故障转移时,主备节点切换,VIP随之绑定到新主库的网卡上,从而实现平滑的故障转移。

 

下面我们在vmware workstation中安装三台虚拟机,安装Oracle Linux7.9的操作系统。三台虚拟机安装Halo的软件,其中一台作为主库,初始化创建数据库集群,另外两台作为从库,使用pg_basebackup创建流复制的异步复制的从库。Halo安装好后,Etcd和Patroni的软件也随之安装,需要配置Etcd和Patroni,然后启动和开机自启动Etcd和Patroni的服务。

 

  1. 虚拟机的准备

准备三台虚拟机,内存2G,硬盘40G,网络适配器为仅主机模式,CD/DVD选择Oracle Linux 7.9的iso文件。安装操作系统,主机名为Halo1,Halo2,Halo3,网址为仅主机模式的网段,这里是192.168.137.0/24网段,规划为192.168.137.11,192.168.137.12,192.168.137.13,VIP规划为192.168.137.15。最好不要使用最小化安装,建议选择server with GUI。


2. Halo数据库软件的安装和主库的初始化。

参照

https://mp.weixin.qq.com/s/vJ0rl_KGUkwwxa3gxQlnWA
一宝,公众号:Halo TechHalo数据库安装,三分钟快速上手!你的第一个国产数据库!


注意特别要关闭防火墙和开机不自启动防火墙,并关闭selinux。halo1主机初始化数据库集群,halo2和halo3仅安装数据库软件,不进行初始化。


3. 构建两个从库的流复制环境。

参照

https://mp.weixin.qq.com/s/NXEQouettch01HmANXhXgA
ZhouLanQing,公众号:Halo TechHalo数据库之流复制概述


注意将三台主机的主机名和IP地址写到三台主机的hosts文件中。


4.Etcd的配置。

确保 HALO_BASE 环境变量已设置,在所有需要运行 etcd 服务的服务器上用 halo用户执行 etcd_config.sh,输入etcd 将要运行的所有服务器 IP 地址。


    export HALO_BASE=/u01/app/halo


    $HALO_BASE/product/shield/etcd/v3.5.2/conf/etcd_config.sh
    Starting to run etcd configuration setup
    Please set HALO_BASE environment variables before proceed
    Press y/Y to continue, any other key to cancel
    y


    Please input IP list where etcd cluster will be running
    e.g. 192.168.1.1,192.168.1.2,192.168.1.3
    192.168.137.11,192.168.137.12,192.168.137.13


    192.168.137.11 will be used as node IP


    Initializing done.


    Following steps to be done manually.
    Run following commands as root
    ln -s /u01/app/halo/product/shield/etcd/v3.5.2/conf/etcd.service /usr/lib/systemd/system/etcd.service
    复制


    根据输出信息,在所有运行 etcd 服务的服务器上用 root 用户创建自启动服务连接.

      ln -s u01/app/halo/product/shield/etcd/v3.5.2/conf/etcd.service usr/lib/systemd/system/etcd.service
      复制


      三节点都运行。


      5. patroni的配置。

      确保 HALO_BASE、HALO_HOME、PGDATA 环境变量已设置,在所有主备服务器上用halo用户执行 patroni_config.sh,输入etcd 将要运行的所有服务器 IP 地址、输入当前服务器名和VIP信息。

        export HALO_BASE=/u01/app/halo
        $HALO_BASE/product/shield/patroni/conf/patroni_config.sh


        Starting to run patroni configuration setup
        Please set HALO_BASE, HALO_HOME, PGDATA environment variables before proceed
        Press y/Y to continue, any other key to cancel
        y


        Please input IP list where etcd cluster will be running
        e.g. 192.168.1.1,192.168.1.2,192.168.1.3
        192.168.137.11,192.168.137.12,192.168.137.13


        Input current node name
        Default: halo1




        Input VIP for the HA cluster
        192.168.137.15
        192.168.137.15 will be used as VIP


        Input network interface to bind the VIP
        Default: ens33


        ens33 will be used as network interface


        Input VIP netmask
        Default: 255.255.255.0


        255.255.255.0 will be used as VIP netmask


        Input VIP broadcast address
        Default: 192.168.137.255


        192.168.137.255 will be used as VIP broadcast address


        Initialize python ...


        Python initializing done.




        Initializing done.
        Following steps to be done manually.
        1. Add the following line into the end of .bash_profile of user halo
        export PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATH
        export PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml


        2. Run following commands as root
        ln -s /u01/app/halo/product/shield/patroni/conf/patroni.service /usr/lib/systemd/system/patroni.service


        3. Add the following line to /etc/sudoers
        halo    ALL=(ALL)       NOPASSWD: /usr/sbin/ip, /usr/bin/arping, /usr/sbin/iptables
        复制

        根据输出信息,在所有主备服务器上执行以下步骤:

        1.在 halo 用户的 .bash_profile 中加入

          export PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATH
          export PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml
          复制

          2.用 root 用户创建自启动服务连接

            ln -s /u01/app/halo/product/shield/patroni/conf/patroni.service /usr/lib/systemd/system/patroni.service
            复制

            3.用 root 用户在 /etc/sudoers 中加入以下行,vim打开后使用:wq!保存。

              halo    ALL=(ALL)       NOPASSWD: /usr/sbin/ip, /usr/bin/arping, /usr/sbin/iptables
              复制



              6. 创建数据库管理用户

              在主库上创建以下用户

                psql
                create user patroni SUPERUSER password 'patroni';
                复制


                7. 创建watchdog服务(可选)

                使用 root 执行以下命令

                  yum install -y watchdog
                  modprobe softdog
                  chown halo /dev/watchdog
                  systemctl start watchdog
                  systemctl enable watchdog
                  复制


                  8. 启动ETCD服务

                  在所有配置了etcd服务的服务器上用root启动服务

                    systemctl start etcd
                    复制

                    确保至少同时在2台服务器上启动etcd服务,如果只在1台服务器上启动,etcd会因为找不到其他服务器而启动失败.


                    如需开机自启动etcd服务,用root执行以下命令

                      systemctl enable etcd
                      复制

                       

                      查询etcd运行状态

                        $HALO_BASE/product/shield/etcd/v3.5.2/etcdctlendpoint status --cluster=true -w table
                        复制


                        9. 启动patroni服务

                        在所有主备服务器上用root启动patroni服务

                          systemctl start patroni
                          复制

                           

                          如需开机自启动patroni服务,用root执行以下命令

                            systemctl enable patroni
                            复制


                            10. 主备节点查询,以halo用户执行。

                            patronictllist

                                                       

                            11. 停止自动主备切换

                            patronictl pause



                            12. 手动主备切换

                            patronictl switchover

                             

                            13. 恢复自动故障转移。

                            patronictl resume

                            文章转载自Halo Tech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论