一、介绍

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;
    #查看同步状态

  执行结果

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

## 四、创建归档表

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

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](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230111842282.png)

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



## 五、配置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](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230113143037.png)

* 在两个节点上安装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](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230151221303.png) 测试数据的时间为2019年11月21日 ![image-20191230151355909](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230151355909.png) ## 七、执行数据归档 pt-archiver用途: - 导出线上数据,到线下数据作处理 - 清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器 * 安装pt-archiver ```shell yum install -y percona-toolkit ``` * 查看版本 ```shell $ pt-archiver --version pt-archiver 3.1.0 ``` * 执行数据归档 `--bulk-delete --bulk-insert`表示对源库批量删除,对归档库批量导入,该归档过程包含事务,故不会导致数据丢失 ```shell 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](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230153643068.png) 查询源库,记录已全部迁移 ![image-20191230153720046](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230153720046.png) 查询归档库 ![image-20191230153804168](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230153804168.png)
Last modification:December 30th, 2019 at 03:49 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment

🎲
``` 使用Java程序导入10万条测试数据,由mycat路由到两个分片中 ![image-20191230151221303](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230151221303.png) 测试数据的时间为2019年11月21日 ![image-20191230151355909](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230151355909.png) ## 七、执行数据归档 pt-archiver用途: - 导出线上数据,到线下数据作处理 - 清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器 * 安装pt-archiver ```shell yum install -y percona-toolkit ``` * 查看版本 ```shell $ pt-archiver --version pt-archiver 3.1.0 ``` * 执行数据归档 `--bulk-delete --bulk-insert`表示对源库批量删除,对归档库批量导入,该归档过程包含事务,故不会导致数据丢失 ```shell 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](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230153643068.png) 查询源库,记录已全部迁移 ![image-20191230153720046](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230153720046.png) 查询归档库 ![image-20191230153804168](https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191230153804168.png)