一、介绍

1. InnoDB写入慢的原因

采用BTREE索引,IO占用高

1577613664767

2. TokuDB优点

  • 高压缩比(1:12,是InnoDB的14倍),高写入性能(是InnoDB的10-20倍)
  • 在线创建索引和字段
  • 支持事物(写入性能是InnoDB的9-20倍)
  • 支持主从同步

3. 归档规划

  • 使用TokuDB引擎保存归档数据,拥有高速写入特性
  • 使用双机热备方案搭建归档库,具备高可用性
  • 使用pt-archiver执行数据归档,简便易行

二、 安装TokuDB

  • 安装jemlloc

    yum install -y jemalloc 
    
  • 编辑配置文件

    vi /etc/my.cnf
    
    ……
    [mysqld_safe]
    malloc-lib=/usr/lib64/libjemalloc.so.1
    ……
    
  • 重启MySQL

    systemctl restart mysqld
    
  • 开启Linux大页内存,同时开启内存碎片整理

    linux系统默认在系统启动时进行内存分配,后续将不再管理内存

    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    
  • 安装TokuDB

    yum install -y Percona-Server-tokudb-57.x86_64
    ps-admin --enable -uroot -p
    

    1577616788082

    重启数据库再次执行安装

    service mysqld restart
    ps-admin --enable -uroot -p
    

    提示引擎已经成功安装

    1577616885448

  • 查看安装结果

    show engines ;
    

    1577616943297

三、配置Replication集群

集群设计——双向同步Replication集群

原因:默认情况下Replication模式单向同步,若主库宕机,则向从库写入数据。若主库重新上线,则不会自动同步数据,导致数据不一致

架构图

1577617308745

replication集群同步原理

1577617631199

配置互为主从的replication集群

image-20191230105455876

  • 在两个TokuDB数据库上创建用户

    CREATE USER 'tokubackup'@'%' IDENTIFIED BY 'Abc_123456' ;
    
    GRANT super, reload, replication slave ON *.* TO 'tokubackup'@'%' ;
    
    FLUSH  PRIVILEGES ;
    
  • 修改两个TokuDB的配置文件/etc/my.cnf,如下:

    [mysqld]
    server_id = 101
    log_bin = mysql_bin
    relay_log = relay_bin
    ……
    
    [mysqld]
    server_id = 102
    log_bin = mysql_bin
    relay_log = relay_bin
    
  • 重新启动两个TokuDB节点

    service mysqld restart
    
  • 分别在两个TokuDB上执行下面4句SQL

    当前数据库架构,首先让B节点向A节点同步数据

    graph LR A节点-->B节点; subgraph Master A节点 end subgraph Slave B节点 end

    在B节点执行语句

    #关闭同步服务
    stop slave;
    #设置同步的Master节点
    change master to master_host="pxc1",master_port=3306,master_user="backup",
    master_password="Abc_123456";
    #启动同步服务
    start slave;
    #查看同步状态
    show slave status;
    

    执行结果

    image-20191230111321552

    当如下两个字段为yes,则说明主从同步已经开启

    image-20191230111411382

    在A节点启动主从同步

    #关闭同步服务
    stop slave;
    #设置同步的Master节点
    change master to master_host="pxc8",master_port=3306,master_user="backup",
    master_password="Abc_123456";
    #启动同步服务
    start slave;
    #查看同步状态
    show slave status;
    

  执行结果

  ![image-20191230111537571](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230111537571.png)

## 四、创建归档表

通常按年份定义归档表分表名称,选择任意一个节点执行即可,此处选择在PXC1节点上执行

```mysql
CREATE DATABASE test;
USE test;
CREATE TABLE t_purchase_20191230 (
	id INT UNSIGNED PRIMARY KEY,
	purchase_price DECIMAL(10,2) NOT NULL,
	purchase_num INT UNSIGNED NOT NULL,
	purchase_sum DECIMAL (10,2) NOT NULL,
	purchase_buyer INT UNSIGNED NOT NULL,
	purchase_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	company_id INT UNSIGNED NOT NULL,
	goods_id INT UNSIGNED NOT NULL,
	KEY idx_company_id(company_id),
	KEY idx_goods_id(goods_id)
)engine=TokuDB;

在PXC8节点上也看到了新增的数据表

image-20191230111842282

image-20191230111852563

五、配置Haproxy+Keepalived双机热备

  • 在两个节点上安装Haproxy,此处使用之前搭建的两个节点Haproxy

    yum install -y haproxy
    
  • 修改配置文件

    vi /etc/haproxy/haproxy.cfg
    
    global
        log         127.0.0.1 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
    
        stats socket /var/lib/haproxy/stats
    
    defaults
        mode                    http
        log                     global
        option                  httplog
        option                  dontlognull
        option http-server-close
        option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000
    
    listen   admin_stats  
        bind    0.0.0.0:4001
        mode  http
        stats uri       /dbs
        stats realm  Global\ statistics
        stats auth    admin:Abc%6870
    
    listen   proxy_mysql
        bind    0.0.0.0:13306  
        mode  tcp 
        balance  roundrobin
        option  tcplog
        server   mycat_1  192.168.1.33:8066  check  port  8066 weight 1 maxconn  2000  
        server   mycat_2  192.168.1.36:8066  check  port  8066 weight 1 maxconn  2000  
        option  tcpka
    # 新增配置    
    listen   proxy_mysql_backup
        bind    0.0.0.0:13307  
        mode  tcp 
        balance  roundrobin
        option  tcplog       #日志格式
        server   backup_1  pxc1:3306  check  port  3306  maxconn  2000  
        server   backup_2  pxc8:3306  check  port  3306  maxconn  2000  
        option  tcpka        #使用keepalive检测死链
    
  • 重启Haproxy

  • 开启防火墙的VRRP协议

    firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT
    
    firewall-cmd --reload
    

    查看配置结果

    image-20191230113143037

  • 在两个节点上安装Keepalived,此处复用之前的Keepalived

六、准备归档数据

  • 在两个PXC分片上创建进货表,默认是InnoDB引擎

    CREATE TABLE t_purchase (
    	id INT UNSIGNED PRIMARY KEY,
    	purchase_price DECIMAL(10,2) NOT NULL,
    	purchase_num INT UNSIGNED NOT NULL,
    	purchase_sum DECIMAL (10,2) NOT NULL,
    	purchase_buyer INT UNSIGNED NOT NULL,
    	purchase_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    	company_id INT UNSIGNED NOT NULL,
    	goods_id INT UNSIGNED NOT NULL,
    	KEY idx_company_id(company_id),
    	KEY idx_goods_id(goods_id)
    )
    
  • 配置MyCat的schema.xml文件,并重启MyCat

    使用Java程序导入10万条测试数据,由mycat路由到两个分片中

    image-20191230151221303

    测试数据的时间为2019年11月21日

    image-20191230151355909

    七、执行数据归档

    pt-archiver用途:

    • 导出线上数据,到线下数据作处理

    • 清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器

    • 安装pt-archiver

      yum install -y percona-toolkit
      
    • 查看版本

      $ pt-archiver --version
      pt-archiver 3.1.0
      
    • 执行数据归档

      --bulk-delete --bulk-insert表示对源库批量删除,对归档库批量导入,该归档过程包含事务,故不会导致数据丢失

      pt-archiver --source h=192.168.1.9,P=13306,u=admin,p='password',D=test,t=t_purchase --dest h=192.168.1.9,P=13307,u=admin,p='password',D=test,t=t_purchase_20191230 --no-check-charset --where 'purchase_date<"2019-11-30 00:00:00"' --progress 5000 --bulk-delete --bulk-insert --limit=10000 --statistics
      

      迁移结果

      image-20191230153643068

      查询源库,记录已全部迁移

      image-20191230153720046

      查询归档库

      image-20191230153804168

    最后修改:2019 年 12 月 30 日
    如果觉得我的文章对你有用,请随意赞赏

    发表评论
    使用cookie技术保留您的个人信息以便您下次快速评论,继续评论表示您已同意该条款

    🎲