大数据归档-冷热数据分离

冷不防 2021-11-29 14:58 516阅读 0赞

1. 什么是TokuDB?

TokuDB 是一个支持事务的“新”引擎,有着出色的数据压缩功能,由美国 TokuTek 公司(现在已经被 Percona 公司收购)研发。拥有出色的数据压缩功能,如果您的数据写多读少,而且数据量比较大,强烈建议您使用TokuDB,以节省空间成本,并大幅度降低存储使用量和IOPS开销,不过相应的会增加 CPU 的压力。

1.1 TokuDB的特性

  • 高压缩比,高写入性能
  • 在线创建索引和字段
  • 支持事务
  • 支持主从同步

2. TokuDB安装步骤

2.1 准备两台mysql数据库

在之前的博客中单独安装过percona数据库,我们在这篇博客中不再重新安装数据库。安装Percona数据库教程链接在本篇博客中的数据归档也是主从复制的方式,所以准备好两台mysql服务器节点。

2.2 安装jemalloc库

  1. yum install -y jemalloc

2.3 修改my.cnf

  1. vi /etc/my.cnf

修改my.cnf文件添加以下内容

  1. [mysqld_safe]
  2. malloc-lib=/usr/lib64/libjemalloc.so.1

修改完之后重新启动mysql

  1. systemctl restart mysqld

2.4 关闭 Transparent huge pages

为了保证TokuDB的写入性能,我们需要关闭linux系统的大页内存管理,默认情况下linux的大页内存管理是在系统启动时预先分配内存,系统运行时不再改变了。

  1. echo never > /sys/kernel/mm/transparent_hugepage/enabled
  2. echo never > /sys/kernel/mm/transparent_hugepage/defrag

2.5 安装tokudb

版本必须和Percona的版本一致,我们前面安装的是Percona5.7,所以此处也需要安装toku5.7,否则提示版本冲突。

  1. yum install -y Percona-Server-tokudb-57.x86_64

3. TokuDB引擎启动

输入Mysql的root帐号密码,完成启动。

  1. ps_tokudb_admin --enable -uroot -p

启动完成之后重启一下mysql

  1. systemctl restart mysqld

重启之后再激活一次tokudb,重新执行一下命令

  1. ps_tokudb_admin --enable -uroot -p

4. 查看TokuDB引擎是否安装成功

  1. mysql -u root -p

进入mysql控制台,执行show engines;

  1. show engines;

在这里插入图片描述

5. 使用TokuDB引擎

如果是sql语句建表,只需要在语句的结尾加上ENGINE = TokuDB就可以

  1. CREATE TABLE student(
  2. .........
  3. ) ENGINE = TokuDB;

有些人习惯用navicat来创建表,这个对tokuDB引擎行不通的,通过navicat指定tokuDB引擎也不会好用

6. 归档库的双击热备

我们这篇博客选用两个Percona数据库节点组成Replication集群,这两个节点配置成双向同步,因为Replication集群的主从同步是单向的,如果配置成单向的主从同步,主库挂掉以后,我们可以像从库写入数据,但是主库恢复之后主库是不会像从库那同步数据的,所以两个节点的数据不一致,如果我们配置成双向同步,无论哪一个节点宕机了,在上线的时候他都会从其他的节点同步数据。这就可以保证每一个节点的数据是一致的。当然这个一致性是弱一致性,跟PXC集群的强一致性有本质区别的。

下边的图片是一个冷数据备份的数据库集群方案,但是我们由于资源有限,只搭建一台的Haproxy+2台的数据库节点,图中画蓝色线的模块。
在这里插入图片描述

7. 配置Replication集群

7.1 Replication集群同步原理

当我们在Master节点写入数据,Master会把这次操作会记录到binlog日志里边,Slave节点会有专门的线程去请求Master发送binlog日志,然后Slave节点上的线程会把收到的Master日志记录在本地realy_log日志文件中,slave节点通过执行realy_log日志来实现数据的同步,最后把执行过的操作写到本地的binlog日志里
在这里插入图片描述
通过图片我们能总结出Replication集群的数据同步是单向的,我们在Master上写入数据,在slave上可以同步到这些数据,但是反过来却不行,所以要实现双向同步,两个数据库节点互为主从关系才行
在这里插入图片描述

7.2 创建同步账户

因为slave节点要从master节点同步数据,必须要登录Master节点,之前我们创建的admin账户和root账户的权限过大,由于我们只做同步数据,我们再给两个节点的数据库都创建上一个同步数据的账户

  1. CREATE USER 'backup'@'%' IDENTIFIED BY 'Abc_123456';
  2. GRANT super, reload, replication slave ON *.* TO 'backup'@'%';
  3. FLUSH PRIVILEGES;

在这里插入图片描述

7.3 修改配置文件

由于mysql数据库默认没有开启binlog日志,我们需要设置一下开启binlog

  1. vi /etc/my.cnf

两个节点的serverid需要不一样

  1. server_id = 111
  2. log_bin = mysql_bin
  3. relay_log = relay_bin
  4. server_id = 113
  5. log_bin = mysql_bin
  6. relay_log = relay_bin

修改完之后重启mysql

  1. systemctl restart mysqld

7.4 配置主从同步

因为我们要配置双向同步,我们要配置两变主从同步

7.4.1 A节点为MasterB节点为Slave

在这里插入图片描述

我们在B节点的mysql上关闭主从同步的服务

  1. stop slave;

然后再指定要同步的Master节点

  1. change master to master_host="192.168.1.111",master_port=3306,master_user="backup",master_password="Abc_123456";

启动同步服务

  1. start slave;

查看主从同步状态信息

  1. show slave status;

Slave_IO_Running和Slave_SQL_RUNNING都是YES时配置成功
在这里插入图片描述

7.4.3 B节点为MasterA节点为Slave

因为是双向同步,接下里我们要以B节点为Master,A节点作为slave设置主从同步,我们需要在A节点上执行刚才的所有操作,具体步骤就不在下边描述
在这里插入图片描述

7.5 创建归档表

因为是双向同步,我们在哪一个节点创建归档表,另一个节点都会同步到数据

  1. CREATE DATABASE test;
  2. USE test;
  3. CREATE TABLE t_purchase_201907 (
  4. id INT UNSIGNED PRIMARY KEY,
  5. purchase_price DECIMAL(10,2) NOT NULL,
  6. purchase_num INT UNSIGNED NOT NULL,
  7. purchase_sum DECIMAL (10,2) NOT NULL,
  8. purchase_buyer INT UNSIGNED NOT NULL,
  9. purchase_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  10. company_id INT UNSIGNED NOT NULL,
  11. goods_id INT UNSIGNED NOT NULL,
  12. KEY idx_company_id(company_id),
  13. KEY idx_goods_id(goods_id)
  14. )engine=TokuDB;

在这里插入图片描述
在这里插入图片描述
这样我们就创建好了两个mysql节点相互同步

7.6 搭建haproxy

在之前的博客中博主搭建过haproxy,在这篇文章就不再重复搭建,不会搭建的伙伴可以看博主往期博客,这篇博客只贴出haproxy的配置文件

  1. global
  2. log 127.0.0.1 local2
  3. chroot /var/lib/haproxy
  4. pidfile /var/run/haproxy.pid
  5. maxconn 4000
  6. user haproxy
  7. group haproxy
  8. daemon
  9. # turn on stats unix socket
  10. stats socket /var/lib/haproxy/stats
  11. defaults
  12. mode http
  13. log global
  14. option httplog
  15. option dontlognull
  16. option http-server-close
  17. option forwardfor except 127.0.0.0/8
  18. option redispatch
  19. retries 3
  20. timeout http-request 10s
  21. timeout queue 1m
  22. timeout connect 10s
  23. timeout client 1m
  24. timeout server 1m
  25. timeout http-keep-alive 10s
  26. timeout check 10s
  27. maxconn 3000
  28. listen admin_stats
  29. bind 0.0.0.0:4001 #监控界面访问的ip和端口
  30. mode http #访问协议
  31. stats uri /dbs #URI相对地址
  32. stats realm Global\ statistics #统计报告格式
  33. stats auth admin:abc123456 #登录账号信息
  34. listen proxy-mysql
  35. bind 0.0.0.0:3306
  36. mode tcp
  37. balance roundrobin
  38. option tcplog #日志格式
  39. server backup111 192.168.1.111:3306 check port 3306 weight 1 maxconn 2000
  40. server backup113 192.168.1.113:3306 check port 3306 weight 1 maxconn 2000

修改完haproxy.cfg文件启动haproxy

  1. service haproxy start

我们登陆haproxy的监控画面,说明搭建成功
在这里插入图片描述

7.7 创建进货表

我们在以前搭建的haproxy+pxc三节点集群的数据库集群中创建进货表,注意这里是三节点的pxc集群,不是在上边创建的haproxy+2个节点的mysql,这个集群是在以前的博客中创建的,不懂的同学可以看往期博客。
我们在系统表中创建一个test数据库,创建一个进货表,注意这里创建进货表时没指定tokuDB引擎。这个进货表不是按照时间分表的,所以不用像上边创建的归档表一样表名称还要包含年份和月份

  1. CREATE DATABASE test;
  2. USE test;
  3. CREATE TABLE t_purchase (
  4. id INT UNSIGNED PRIMARY KEY,
  5. purchase_price DECIMAL(10,2) NOT NULL,
  6. purchase_num INT UNSIGNED NOT NULL,
  7. purchase_sum DECIMAL (10,2) NOT NULL,
  8. purchase_buyer INT UNSIGNED NOT NULL,
  9. purchase_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  10. company_id INT UNSIGNED NOT NULL,
  11. goods_id INT UNSIGNED NOT NULL,
  12. KEY idx_company_id(company_id),
  13. KEY idx_goods_id(goods_id)
  14. )

7.8 准备测试数据

在haproxy+pxc三节点的mysql集群中创建归档数据,可以使用函数或者存储过程批量创建,创建方法自行百度。
我创建了140000条的数据
在这里插入图片描述

7.9 安装归档工具

Percona公司为我们提供了一套非常便捷的工具包Percona-Toolkit,这个工具包包含了用于数据归档的pt-archiver,用这个归档工具我们可以轻松的完成数据的归档。

pt-archiver的用途

  1. 导出线上数据,到线下数据作处理
  2. 清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器

7.9.1 安装依赖包

  1. yum install perl-DBI
  2. yum install perl-DBD-MySQL
  3. yum install perl-Time-HiRes
  4. yum install perl-IO-Socket-SSL

7.9.2 安装percona toolkit的包

  1. yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm

7.9.3 查看可以安装的包

  1. yum list | grep percona-toolkit

在这里插入图片描述

7.9.4 安装percona-toolkit工具包

  1. yum install percona-toolkit

查看pt-archiver的版本,如下图所示,安装成功

  1. pt-archiver --version

在这里插入图片描述

7.10 归档数据

  1. pt-archiver
  2. --source h=192.168.1.27,P=3306,u=admin,p=Abc_123456,D=test,t=t_purchase
  3. --dest h=192.168.1.114,P=3306,u=admin,p=Abc_123456,D=test,t=t_purchase_201907
  4. --no-check-charset --where 'purchase_date<"2019-08-01 0:0:0"'
  5. --progress 5000 --bulk-delete --bulk-insert --limit=10000 --statistics

–source h=192.168.1.27, P=3306, u=admin, p=Abc_123456, D=test, t=t_purchase 代表的是取哪个服务器的哪个数据库的哪张表的
–dest h=192.168.1.114, P=3306, u=admin, p=Abc_123456, D=test, t=t_purchase_201907 代表的是归档库的连接信息
–no-check-charset 代表的是归档过程中我们不检查数据的字符集
–where ‘purchase_date<“2019-08-01 0:0:0”’ 归档数据的判断条件
–progress 5000 每归档5000条数据往控制台打印一下状态信息
–bulk-delete 批量的删除归档数据
–bulk-insert 批量的新增归档数据
–limit=10000 批量一万条数据进行一次归档
–statistics 打印归档的统计信息
在这里插入图片描述

7.11 验证归档数据

我们先查看以下192.168.1.27这个节点是不是已经没有了数据
我们看到这个节点已经没有了数据
在这里插入图片描述
再看看192.168.1.114这个节点,数据归档成功
在这里插入图片描述

7.12 总结

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

发表评论

表情:
评论列表 (有 0 条评论,516人围观)

还没有评论,来说两句吧...

相关阅读

    相关 架构之冷热分离

    本文依据《从程序员到架构师》阅读有感,记录书中案例并且结合作者工作经历进行分析。 当数据量过大,业务查询慢甚至导致数据库服务器CPU飙升,导致数据库宕机,影响用户体验。 场

    相关 数据持久化层--冷热分离

    业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工

    相关 ES数据冷热分层

    前言 数据的价值是有实效性的,一般实时性越高的信息,参考价值越大。 所以数据在对外提供服务的时候,也不是等价的,比如最近3个月的交易记录,用户会查询的比较频繁,那么应