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

箕水豹
• 阅读 1656

1. 扩容之前的部署架构

为便于测试, 这里假设有两台数据库节点Server1和Server2。

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

2. MariaDB服务安装

  1. 切换阿里云镜像服务(YUM安装过慢可以切换)

    yum -y install 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
  2. 配置YUM源

    vi /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
  3. 执行安装

    yum -y install mariadb mariadb-server MariaDB-client  MariaDB-common
  4. 如果之前已经安装, 需要先删除(如果之前没有安装, 可以忽略此步骤)

    • 停止Mariadb服务

      [root@localhost yum.repos.d]# ps -ef | grep mysql
      root       1954      1  0 Oct04 ?        00:05:43 /usr/sbin/mysqld --wsrep-new-cluster --user=root
      root      89521  81403  0 07:40 pts/0    00:00:00 grep --color=auto mysql
      [root@localhost yum.repos.d]# kill 1954
    • 卸载Mariadb服务

      yum -y remove Maria*
    • 删除数据与配置:

      rm -rf /var/lib/mysql/*
      rm -rf /etc/my.cnf.d/
      rm -rf /etc/my.cnf
  5. 初始化配置

    systemctl  start mariadb
    mysql_secure_installation
  6. 开启用户远程连接权限

    将连接用户root开启远程连接权限;

    mysql -uroot -p654321

    进入MySQL服务, 执行以下操作:

    use mysql;
    delete from user;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '654321' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

3. MariaDB双主同步

  1. 在Server1增加配置:

    在/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。

  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。

    配置修改完成后, 重启数据库。

  3. 同步授权配置

    在Server1创建replica用于主从同步的用户:

    MariaDB [(none)]> grant replication slave, replication client on *.* to 'replica'@'%' identified by 'replica';
    mysql> flush privileges;

    查询日志文件与偏移量,开启同步时需使用:

    MariaDB [(none)]> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      663 |              |                  |
    +------------------+----------+--------------+------------------+
    

    同样, 在Server2创建replica用于主从同步的用户:

    MariaDB [(none)]> grant replication slave, replication client on *.* to 'replica'@'%' identified by 'replica';
    mysql> flush privileges;

    查询日志文件与偏移量:

    MariaDB [(none)]> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      663 |              |                  |
    +------------------+----------+--------------+------------------+
  4. 配置主从同步信息

    在Server1中执行:

    MariaDB [(none)]> change master to master_host='10.10.20.126',master_user='replica', master_password='replica', 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='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=663, master_connect_retry=30;
    
  5. 开启双主同步

    在Server1和Server2中分别执行:

    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.00 sec)

    在Server1查询同步信息:

    MariaDB [(none)]>  show slave status\G;
    *************************** 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 status\G;
    *************************** 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安装与高可用配置

  1. 在Server1与Server2两台节点安装keepalived:

    yum -y install keepalived
  2. 关闭防火墙

    systemctl stop firewalld
    systemctl disable firewalld
  3. 设置主机名称:

    Server1节点:

    hostnamectl set-hostname vip1

    Server2节点:

    hostnamectl set-hostname vip2
  4. Server1节点配置

    /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

    /usr/local/shell/mariadb.sh:

    pkill keepalived

    加入执行权限:

    chmod a+x mariadb.sh
  5. 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 #不主动抢占资源
  6. 验证高可用

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

    • *

本文由mirson创作分享,如需进一步交流,请加QQ群:19310171或访问www.softart.cn

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
阿里P8面试官都说太详细了,你值得拥有
阿里P8级架构师第九篇:千亿流量高并发高可用分布式系统之数据治理篇阿里P8级架构师第十篇:千亿流量高并发高可用分布式系统之人工智能加成篇数据融合模块1.构建画像模块2.召回策略模块3.排序模型模块ctr预估4.微服务模块5.ABTest模块6.Spark调优模块7.推荐系统落地实践阿里P8级架构师第十一篇:千亿流量高并发高
灯灯灯灯 灯灯灯灯
4年前
年后腾讯二面,第一个问MySQL主从结构,给我整不会了
一、MySQL一主一从数据库服务器192.168.4.51配置为主数据库服务器数据库服务器192.168.4.52配置为从数据库服务器客户端192.168.4.50测试配置其中192.168.4.51是主服务器,另一台192.168.4.52作为从服务器,通过调取主服务器上的binlog日志,在本地重做对应的库、表,实现与主服务器的数据同步
Wesley13 Wesley13
3年前
mysql基础之mysql双主(主主)架构
一、概念在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能
Wesley13 Wesley13
3年前
Canal+Otter
数据库同步中间件CanalOtter前日篇(2)MySQLInnoDB架构体系!这里写图片描述(https://static.oschina.net/uploads/img/201712/13102527_0Qct.jpg)MySQL体系前
Easter79 Easter79
3年前
TiDB 压力测试报告
TiDB压力测试报告(转载自公众号DBATech)一、测试环境1、tidb集群架构:测试使用最基本的TiDB架构。即3个tidbserver节点3个tikv节点3个pd节点。2、tidb集群的部署环境(混合部署):192.168.xx.A1\server1\PD1\tikv192.
Stella981 Stella981
3年前
MongoDB 定位 oplog 必须全表扫描吗?
MongoDBoplog(类似于MySQLbinlog)记录数据库的所有修改操作,除了用于主备同步;oplog还能玩出很多花样,比如1.全量备份增量备份所有的oplog,就能实现MongoDB恢复到任意时间点的功能2.通过oplog,除了实现到备节点的同步,也可以额外再往单独的集群同步数据(甚至是异构的数据库),实现容
可莉 可莉
3年前
13_ redis数据库高可用
数据库高可用1.1数据库高可用说明当数据库的主库宕机之后.如果没有高可用机制,则可能导致整个服务全部不能正常的使用.解决策略:双主模式(双机热备)1.2数据库双机热备实现1.2.1双机热备的说明将2台数据库设置为双主模式.互为主从的结构.其中任意的数据库服务器既是主机.也是从机.!在这里插入图
Wesley13 Wesley13
3年前
MySQL高可用之MHA
背景介绍高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。本文是对MySQL数据库的高可用方案中,基于主从复制的MHA软件理论部分进行梳理和小结。MHA软件介绍1.MHA软件是由MHAManager(管理节点)和MHANode(数据节点)组成2.MHAManager可以单独部署
Stella981 Stella981
3年前
Redis 高可用及分片集群,说了你也不懂
Redis简介Memcached:优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高Redis:优点:高性能读写、多数据类型
3A网络 3A网络
2年前
容器化 | 在 Kubernetes 上部署 RadonDB MySQL 集群
容器化|在Kubernetes上部署RadonDBMySQL集群RadonDBMySQL是一款基于MySQL的开源、高可用、云原生集群解决方案。支持一主多从高可用架构,并具备安全、自动备份、监控告警、自动扩容等全套管理功能。目前已经在生产环境中大规模的使用,包含银行、保险、传统大企业等。RadonDBMySQLKubernetes