• 千亿级数据平滑扩容之MySQL+Keepalived数据库双主同步与高可用实现


    1. 扩容之前的部署架构
    为便于测试,这里假设有两台数据库节点Server1和Server2。

    2. MariaDB服务安装
    切换阿里云镜像服务(YUM安装过慢可以切换)
    yum install -y wget
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
    yum clean all && yum makecache

    配置YUM源
    vim /etc/yum.repos.d/mariadb-10.2.repo
    [mariadb]
    name = MariaDB
    baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1

    执行安装
    yum -y install mariadb mariadb-server MariaDB-client MariaDB-common

    如果之前已经安装,需要先删除(如果之前没有安装, 可以忽略此步骤)
    停止Mariadb服务
    [root@localhost yum.repos.d]# ps -elf | grep -v grep | grep mysql
    root 1954 1 0 Oct04 ? 00:05:43 /usr/sbin/mysqld --wsrep-new-cluster --user=root
    [root@localhost yum.repos.d]# kill 1954

    卸载Mariadb服务
    yum -y remove Mariadb

    删除数据与配置:
    rm -rf /var/lib/mysql/*
    rm -rf /etc/my.cnf.d/
    rm -rf /etc/my.cnf

    初始化配置
    systemctl start mariadb
    mysql_secure_installation

    开启用户远程连接权限
    将连接用户root开启远程连接权限;
    mysql -h127.0.0.1 -u root -p mysql

    进入MySQL服务,执行以下操作:
    use mysql;
    delete from user;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysql' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

    3. MariaDB双主同步
    在Server1增加配置:
    在/etc/my.cnf中添加以下配置:

    vim /etc/my.cnf
    [mysqld]
    server-id = 1
    log-bin=mysql-bin
    relay-log = mysql-relay-bin
    replicate-wild-ignore-table=mysql.%
    replicate-wild-ignore-table=information_schema.%
    log-slave-updates=on
    slave-skip-errors=all
    auto-increment-offset=1
    auto-increment-increment=2
    binlog_format=mixed
    expire_logs_days=10
    注意,Server1自增为奇数位:
    auto-increment-offset=1 主键自增基数,从1开始。
    auto-increment-increment=2 主键自增偏移量每次为2。

    在Server2增加配置:
    修改/etc/my.cnf:
    [mysqld]
    server-id = 2
    log-bin=mysql-bin
    relay-log = mysql-relay-bin
    replicate-wild-ignore-table=mysql.%
    replicate-wild-ignore-table=information_schema.%
    log-slave-updates=on
    slave-skip-errors=all
    auto-increment-offset=2
    auto-increment-increment=2
    binlog_format=mixed
    expire_logs_days=10
    Server2自增为偶数位:
    auto-increment-offset=2 主键自增基数,从2开始。
    auto-increment-increment=2 主键自增偏移量每次为2。
    配置修改完成后,重启数据库。

    systemctl restart mysqld

    同步授权配置
    在Server1创建repl用于主从同步的用户:
    MariaDB [(none)]> grant replication slave,replication client on *.* to 'repl'@'%' identified by 'mysql';
    mysql> flush privileges;

    查询日志文件与偏移量,开启同步时需使用:
    MariaDB [(none)]> show master status;

    同样,在Server2创建repl用于主从同步的用户:
    MariaDB [(none)]> grant replication slave,replication client on *.* to 'repl'@'%' identified by 'mysql';
    mysql> flush privileges;

    查询日志文件与偏移量:
    MariaDB [(none)]> show master status;

    配置主从同步信息
    在Server1中执行:
    MariaDB [(none)]> change master to master_host='10.10.20.126',master_user='repl',master_password='mysql',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=663,master_connect_retry=30;

    在Server2中执行:
    MariaDB [(none)]> change master to master_host='10.10.20.125',master_user='repl',master_password='mysql',master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=663,master_connect_retry=30;

    开启双主同步
    在Server1和Server2中分别执行:
    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.00 sec)

    在Server1查询同步信息:
    MariaDB [(none)]> show slave statusG;
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 10.10.20.126
    Master_User: replica
    Master_Port: 3306
    Connect_Retry: 30
    Master_Log_File: mysql-bin.000001
    Read_Master_Log_Pos: 663
    Relay_Log_File: mysql-relay-bin.000002
    Relay_Log_Pos: 555
    Relay_Master_Log_File: mysql-bin.000001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    ...

    在Server2查询同步信息:
    MariaDB [(none)]> show slave statusG;
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 10.10.20.125
    Master_User: replica
    Master_Port: 3306
    Connect_Retry: 30
    Master_Log_File: mysql-bin.000001
    Read_Master_Log_Pos: 663
    Relay_Log_File: mysql-relay-bin.000002
    Relay_Log_Pos: 555
    Relay_Master_Log_File: mysql-bin.000001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    ...
    Slave_IO_Running和Slave_SQL_Running 都是Yes,说明双主同步配置成功。

    4. KeepAlived安装与高可用配置
    在Server1与Server2两台节点安装keepalived:
    yum -y install keepalived

    关闭防火墙
    systemctl stop firewalld && systemctl disable firewalld

    设置主机名称:
    Server1节点:
    hostnamectl set-hostname vip1

    Server2节点:
    hostnamectl set-hostname vip2

    Server1节点配置
    vim /etc/keepalived/keepalived.conf:
    global_defs {
    router_id vip1 # 机器标识,和主机名保持一致
    }
    vrrp_instance VI_1 { #vrrp实例定义
    state BACKUP #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
    interface ens33 #绑定对外访问的网卡
    virtual_router_id 111 #虚拟路由标示,同一个vrrp实例采用唯一标示
    priority 100 #优先级,100代表最大优先级, 数字越大优先级越高
    advert_int 1 #master与backup节点同步检查的时间间隔,单位是秒
    authentication { #设置验证信息
    auth_type PASS #有PASS和AH两种
    auth_pass 6666 #验证密码,BACKUP密码须相同
    }
    virtual_ipaddress { #KeepAlived虚拟的IP地址
    10.10.20.130
    }
    }
    virtual_server 10.10.20.130 3306 { #配置虚拟服务器IP与访问端口
    delay_loop 6 #健康检查时间
    lb_algo rr #负载均衡调度算法, rr代表轮询
    lb_kind DR #负载均衡转发规则
    persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
    protocol TCP #转发协议类型,支持TCP和UDP
    real_server 10.10.20.125 3306 { #配置服务器节点VIP1
    notify_down /usr/local/shell/mariadb.sh #当服务挂掉时, 会执行此脚本,结束keepalived进程
    weight 1 #设置权重,越大权重越高
    TCP_CHECK { #r状态监测设置
    connect_timeout 10 #超时配置, 单位秒
    retry 3 #重试次数
    delay_before_retry 3 #重试间隔
    connect_port 3306 #连接端口, 和上面保持一致
    }
    }

    }

    创建关闭脚本mariadb.sh
    vim /usr/local/shell/mariadb.sh
    pkill keepalived

    加入执行权限:
    chmod a+x mariadb.sh

    Server2节点配置:
    global_defs {
    router_id vip2 # 机器标识,和主机名保持一致
    }
    vrrp_instance VI_1 { #vrrp实例定义
    state BACKUP #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
    interface ens33 #绑定对外访问的网卡
    virtual_router_id 111 #虚拟路由标示,同一个vrrp实例采用唯一标示
    priority 98 #优先级,100代表最大优先级, 数字越大优先级越高
    advert_int 1 #master与backup节点同步检查的时间间隔,单位是秒
    authentication { #设置验证信息
    auth_type PASS #有PASS和AH两种
    auth_pass 6666 #验证密码,BACKUP密码须相同
    }
    virtual_ipaddress { #KeepAlived虚拟的IP地址
    10.10.20.130
    }
    }
    virtual_server 10.10.20.130 3306 { #配置虚拟服务器IP与访问端口
    delay_loop 6 #健康检查时间
    lb_algo rr #负载均衡调度算法, rr代表轮询, 可以关闭
    lb_kind DR #负载均衡转发规则, 可以关闭
    persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
    protocol TCP #转发协议类型,支持TCP和UDP
    real_server 10.10.20.126 3306{ #配置服务器节点VIP2
    notify_down /usr/local/shell/mariadb.sh #当服务挂掉时, 会执行此脚本,结束keepalived进程
    weight 1 #设置权重,越大权重越高
    TCP_CHECK { #r状态监测设置
    connect_timeout 10 #超时配置, 单位秒
    retry 3 #重试次数
    delay_before_retry 3 #重试间隔
    connect_port 3306 #连接端口, 和上面保持一致
    }
    }

    }
    和Server1的差异项:
    router_id vip2 # 机器标识,和主机名保持一致
    priority 98 #优先级,100代表最大优先级, 数字越大优先级越高
    real_server 10.10.20.126 3306 #配置服务器节点VIP2
    注意, 两台节点都设为BACKUP
    virtual_router_id 111 #同一个vrrp实例采用唯一标示
    state BACKUP
    如果不想重启后, 争夺备用节点的VIP, 可以设置此项
    nopreempt #不主动抢占资源

    验证高可用
    停止主节点MariaDB服务,验证是否能够实现自动切换。

  • 相关阅读:
    前端使用canvas生成盲水印的加密解密
    html2canvas使用心得
    前端开发超好用的截图、取色工具——snipaste
    js识别中英文字符的字节长度并进行裁切
    运用CSS3媒体查询判断iPhoneX、iPhoneXR、iPhoneXS MAX及横竖屏
    webpack4学习笔记
    VUE打包发布后无法访问js、css资源
    IOS微信6.7.4输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置
    移动端浏览器预览word、excel、ppt
    js为页面元素添加水印
  • 原文地址:https://www.cnblogs.com/OrcinusOrca/p/14746446.html
Copyright © 2020-2023  润新知