跳到主要内容

部署高可用、负载均衡的MySQL集群服务

悦库网盘集群化由悦库服务集群、MGR(MySQL Group Replication)集群、Ceph存储集群以及虚拟路由器 4个子模块组成,本文指导用户搭建高可用、高扩展以及负载均衡的MySQL数据库集群的搭建,如图中红线框所示部分。

img

实现方案

通过MySQL组复制实现高可用与高可扩展性,通过Keepalived配置高可用的负载均衡。

  • MySQL组复制(MySQL Group Replication简称MGR)是MySQL官方提供的高可用与高可扩展的解决方案。MGR有两种配置模式:单主模式和多主模式。在单主模式下,一个节点作为可读写的主节点,其他节点作为只读的从节点,当主节点宕掉,分组会在从节点中选举出一个新的主节点。多主模式下,每个节点都作为可读写节点,但在此模式下,不支持SERIALIZABLE级别的事务隔离,对于级联外键约束也有限制。一个组(Group)至少需要3个MySQL实例。 本文中采用多主模式,每个节点均可读写,配合LVS实现负载均衡。
  • Keepalived用于对MySQL组复制(MGR)集群的节点进行健康检查,通过LVS提供虚拟IP(VIP)实现MGR集群节点的负载均衡,并通过虚拟路由冗余协议(VRRP)将多个虚拟路由形成路由组,避免Keepalived的单节点故障。

环境准备

准备5台主机,分别安装Ubuntu 18操作系统

  • 其中3台主机,安装Docker并拉取MySQL镜像,IP分别为192.168.0.201、192.168.0.202、192.168.0.203形成MGR集群,MySQL版本号为8.0.28

    apt install -y docker.io
    docker pull mysql:8.0.28
  • 其中2台主机,安装Keepalived,IP分别为192.168.0.191、192.168.0.192形成虚拟路由组,并提供虚拟IP(VIP):192.168.0.200

    apt install -y keepalived

部署步骤

1. 部署MySQL组复制(MGR)

  • 配置hostname和域名解析

    #在192.168.0.201配置hostname为node-01
    hostnamectl set-hostname node-01

    #在192.168.0.202配置hostname为node-02
    hostnamectl set-hostname node-02

    #在192.168.0.203配置hostname为node-03
    hostnamectl set-hostname node-03

    #分别修改192.168.0.201、192.168.0.202、192.168.0.203的/etc/hosts文件,增加如下配置
    192.168.0.201 node-01
    192.168.0.202 node-02
    192.168.0.203 node-03
  • 分别为192.168.0.201、192.168.0.202、192.168.0.203开放330613306端口

    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --zone=public --add-port=13306/tcp --permanent
    firewall-cmd --reload
  • 配置组复制参数分别在192.168.0.201、192.168.0.202、192.168.0.203中创建并编辑配置文件/opt/mysql/conf/my.cnf

    mkdir -p /opt/mysql/conf
    vim /opt/mysql/conf/my.cnf

    配置内容如下:

    [mysqld]
    server_id = 1
    gtid_mode = ON
    enforce_gtid_consistency = ON
    master_info_repository = TABLE
    event_scheduler = 1
    lower_case_table_names = 1
    default_authentication_plugin = mysql_native_password

    # 同步配置
    binlog_format = ROW
    binlog_checksum = NONE
    log_bin = ON
    relay_log_info_repository = TABLE

    # 组复制配置
    plugin_load_add = "group_replication.so"
    loose-group_replication_group_name = "89c88c78-c46e-11ec-a8aa-0800271ee0d3"
    loose-group_replication_start_on_boot = OFF
    loose-group_replication_bootstrap_group = OFF
    loose-group_replication_single_primary_mode = OFF
    loose-group_replication_enforce_update_everywhere_checks = ON
    loose-group_replication_ssl_mode = DISABLED
    loose-group_replication_local_address = "192.168.0.201:13306"
    loose-group_replication_group_seeds = "192.168.0.201:13306,192.168.0.202:13306,192.168.0.203:13306"
    loose-group_replication_ip_whitelist = "192.168.0.0/24,127.0.0.1"

    配置说明: 其中server_id和loose-group_replication_local_address要单独配置,其余配置项一致

    配置项说明
    server_id1唯一标识MySQL实例
    gtid_modeON开启事务的gtid
    enforce_gtid_consistencyON强制gtid一致性
    master_info_repositoryTABLEmaster.info使用数据表方式记录
    log_binON开启binlog
    binlog_formatROWbinlog的复制模式
    binlog_checksumNONE不使用binlog校验和
    relay_log_info_repositoryTABLE作为从库同步事务后,记录至数据表
    default_authentication_pluginmysql_native_password配置用户账户的加密方式
    plugin_load_add"group_replication.so"加载组复制插件
    loose-group_replication_group_name"89c88c78-c46e-11ec-a8aa-0800271ee0d3"UUID,分组的节点需配置一致
    loose-group_replication_start_on_bootOFF启动MySQL时不自动开启组复制
    loose-group_replication_bootstrap_groupOFF关闭此MySQL实例的组引导
    loose-group_replication_single_primary_modeOFF关闭单主模式,即使用多主模式
    loose-group_replication_enforce_update_everywhere_checksON在多主模式下,建议开启此选项,严格检查一致性
    loose-group_replication_ssl_modeDISABLED组复制节点通信禁用SSL
    loose-group_replication_local_address"192.168.0.201:13306"当前MySQL实例的组复制通信地址
    loose-group_replication_group_seeds"192.168.0.201:13306,192.168.0.202:13306,192.168.0.203:13306"组复制的节点通信地址
    loose-group_replication_ip_whitelist"192.168.0.0/24,127.0.0.1"设置组复制节点通信的IP白名单,同网段可省略
  • 启动mysql容器 分别在192.168.0.201、192.168.0.202、192.168.0.203上创建MySQL容器

    docker run -itd \
    --name mysql \
    --net=host \
    --restart=always \
    --privileged=true \
    -v /opt/mysql/log:/var/log/mysql \
    -v /home/mysql/data:/var/lib/mysql \
    -v /opt/mysql/conf:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:8.0.28
  • 配置引导节点 在192.168.0.201上配置引导节点,用于初始化组复制的配置

    • 登录mysql引导节点

      docker exec -it mysql /bin/bash
      mysql -uroot -p123456
    • 配置组复制用户,并启动组复制

      -- 创建组复制用户
      set sql_log_bin=0;
      create user repl@'%' identified by '666666';
      grant replication slave on *.* to repl@'%';
      set sql_log_bin=1;
      flush privileges;

      -- 使用账户密码登录其他MySQL节点
      change master to master_user='repl', master_password='666666' for channel 'group_replication_recovery';

      -- 启动组复制
      set global group_replication_bootstrap_group=on;
      start group_replication;
      set global group_replication_bootstrap_group=off;
    • 验证

      select * from performance_schema.replication_group_members;
  • 配置其他节点 分别在192.168.0.202和192.168.0.203上配置从节点

    • 登录mysql从节点

      docker exec -it mysql /bin/bash
      mysql -uroot -p123456
    • 配置组复制用户,并启用组复制

      -- 创建组复制用户
      set sql_log_bin=0;
      create user repl@'%' identified by '666666';
      grant replication slave on *.* to repl@'%';
      set sql_log_bin=1;
      flush privileges;

      -- 使用账户密码登录其他MySQL节点
      change master to master_user='repl', master_password='666666' for channel 'group_replication_recovery';

      -- 启动组复制
      start group_replication;

      -- 如果启动失败,先重置一次,再启动
      reset master;
      start group_replication;
    • 验证

      select * from performance_schema.replication_group_members;

2. 部署Keepalived

  • 在部署MySQL实例的主机上配置VIP转发规则 分别在192.168.0.201、192.168.0.202、192.168.0.203中配置

    ifconfig lo:0 192.168.0.200 broadcast 192.168.0.200 netmask 255.255.255.255 up
    route add -host 192.168.0.200 dev lo:0
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  • 配置Keepalived虚拟路由和VIP

    • 修改配置文件 分别在192.168.0.191和192.168.0.192上,创建并编辑配置文件/etc/keepalived/keepalived.conf 内容如下:

      # 全局配置
      global_defs {
      router_id LVS_YDISK
      }

      #同步组
      vrrp_sync_group VG_YDISK {
      group {
      VI_YDISK
      }
      }

      #虚拟路由实例配置
      vrrp_instance VI_YDISK {
      # 初始状态,MASTER|BACKUP
      state MASTER
      # 网络接口
      interface enp0s3
      # 相同的ID属于同一个多播组
      virtual_router_id 200
      # 优先级,最高的会被选举为MASTER
      priority 100
      # 虚拟IP列表
      virtual_ipaddress {
      192.168.0.200
      }
      }
      #虚拟服务配置,通过将此配置用来管理LVS
      virtual_server 192.168.0.200 3306 {
      # 检查健康检查间隔,以秒为单位
      delay_loop 5
      # 负载均衡模式 DR|NAT|TUN
      lb_kind DR
      # 负载均衡算法 rr|wrr|lc|wlc|lblc|sh|dh
      lb_algo rr
      # 转发协议 TCP|UDP
      protocol TCP

      # 真实服务配置
      real_server 192.168.0.201 3306 {
      # 负载权重,权重值越大,优先级越高
      weight 1
      # 存活检查
      TCP_CHECK {
      # 超时时间,以秒为单位
      connect_timeout 3
      }
      }
      real_server 192.168.0.202 3306 {
      weight 1
      TCP_CHECK {
      connect_timeout 3
      }
      }
      real_server 192.168.0.203 3306 {
      weight 1
      TCP_CHECK {
      connect_timeout 3
      }
      }
      }
    • 重启Keepalived 分别在192.168.0.191和192.168.0.192上重启Keepalived

      systemctl restart keepalived

验证

  • 验证MGR

    • 通过虚拟IP(192.168.0.200)访问数据库服务

      mysql -uroot -p123456 -h 192.168.0.200 -P3306
    • 查看组复制成员状态

      select * from performance_schema.replication_group_members;

      img

  • 验证负载均衡

    • 可通过ipvsadm命令查看LVS状态

    • 可通过tcpdump抓包来验证负载均衡

相关教程

集群版用户故事

部署Ceph对象存储服务

部署悦库服务集群