Pika作为完全兼容redis协议,以RocksDB为存储引擎的的大容量、高性能、多租户、数据可持久化的弹性KV数据存储方案,经由两年的持续改进与开发,已经从3.0版本升级到3.5.4版本。在这个过程中,Pika不仅优化了机能与稳定性,还引入了很多新特性和增强功能。本篇文章将结合我们当前线上进级经验,具体先容Pika在版本升级中的注意事项、操作步骤,以便大家能更加利便的进行版本升级,整体大纲如下
新版本先容在先容版本升级之前先粗略的总结下迭代的版本中提供的新特性,假如想要了解更多的特性,请查看文章结尾的参考文档。
Pika新特性1.Rsync移除与全新同步方案变化:Pika在3.5版本中移除了Rsync工具,取而代之的是自研的全量同步方案。新方案支持断点续传和动态调节传输限速,极大进步了同步过程的可靠性和稳定性,避免了因Rsync导致的同步失败问题。
2.Redis命令兼容性增强变化:Pika在3.5版本中扩展了对Redis命令的兼容性,支持更多的Redis命令,如UNLINK、INFOCOMMANDSTATS、HELLO、SETNAME、BLPOP、BRPOP等。这使得Pika与Redis生态系统的集成更加顺畅,用户能够更轻松地迁移或混合使用两者。
3.RocksDB进级与分级压缩变化:Pika对底层的RocksDB引擎进行了进级,并引入了分级压缩功能。分级压缩优化了数据在不同存储级别的治理,使得磁盘空间利用率更高,数据访问效率更佳。此外,RocksDB的持续优化使得Pika在处理大规模数据集时更加不乱和高效,当前使用RocksDB8.7.3版本。
4.支持BlobDB和Codis集群模式变化:Pika引入了BlobDB支持,实现了KV存储层的分离,这在处理大对象时能明显晋升存储效率。此外,Pika还集成了Codis集群模式,支持智能化的slot迁移和治理,合用于大规模分布式环境,提供了更强的集群治理能力。
5.容器化与跨平台支持变化:Pika在3.5.x版本中通过pika-operator支持了在Kubernetes平台上的快速部署,实现了单实例服务的容器化,并加强了对MacOS、CentOS和Ubuntu等平台的跨平台支持。用户可以在不同操作系统和容器环境中平稳运行Pika。
6.可观测性与自动化工具变化:Pika引入了pika_exporter等工具,晋升了系统的可观测性。新增的监控指标包括网络I/O流量、命令统计耗时、碎片率分析等,使得用户可以更全面地监控和分析Pika的运行状态,确保系统的高效和不乱运行。
7.机能与可靠性改进变化:Pika通过一系列优化措施晋升了系统机能和稳定性,如合并Flush和Compaction线程以进步资源利用率,优化主从复制机制,改进RocksDB的压缩和缓存治理,确保数据一致性和系统可靠性。
8.新增Redis事务支持变化:Pika增加了对Redis事务的支持,确保在一系列命令执行中数据的一致性和可靠性。这对于需要保证操纵原子性的应用场景尤为重要,晋升了数据操纵的安全性。
9.ACL支持与快慢命令分离变化:Pika在3.5.x版本中引入了ACL功能,增强了系统的安全性,支持多租户场景。同时实现了快慢命令的分离,避免慢命令壅塞快命令的执行,优化了系统的整体机能。
10.动态配置与限速功能变化:Pika增加了全量同步和磁盘IO限速参数的动态调整功能。用户可以根据实际运行环境灵活调整同步和限速参数,确保在复杂网络或硬件环境下的稳定性,晋升运维效率。
11.缓存功能变化:Pika上层增加缓存层实现冷热数据分离,晋升读机能进级方案通过原地替代二进制启动文件进行进级,进级简朴快捷,但无法原地回滚,所以进级前需要预备好回滚方案(请务必阅读完下面的回滚方案再进行操纵),以下为进级方案步骤。
进级步骤备份配置文件和service文件将Pika实例的配置文件、service文件备份cp/path/pika.conf/path/pika6379.conf.bakcp/etc/systemd/system/pika6379.service/etc/systemd/system/pika6379.service.bak住手Pika服务住手命令示例:redis-cli-p6379-aPASSWORDshutdown#或者systemctlstoppika6379解除从库的主从关系在进级完成后,解除从库与主库的同步关系,以确保从库不再依靠旧的主库。
命令示例:redis-cli-h10.xxx-p6379-aPASSWORDslaveofnoone更新配置文件及service文件修改Pika配置文件,根据当前的CPU和内存配置,调整线程数、缓存大小、同步线程数等参数。修改service文件中pika启动路径(假如没通过service启动则忽略)配置示例:以下为3.5版本部门需要关注的参数,详细完整的配置文件示例请参考配置文件说明#pika是多线程的,该参数能够配置pika的线程数目,cpu的一半thread-num:1#处理命令用户哀求命令线程池的大小,cputhread-pool-size:8#sync主从同步时候从库执行主库传递过来命令的线程数目,cpu的1/3-1/2sync-thread-num:6#指定后台flush线程数目,默认为1,范围为[1,4],一般设置为cpu的1/4max-background-flushes:1#指定后台压缩线程数目,默认为1,范围为[1,4],一般设置为cpu的1/4max-background-compactions:1#千兆网卡45MB/s万兆网卡:100-200M/sthrottle-bytes-per-second:45200000#2核4G为14核8G为18核为2其余为4max-rsync-parallel-num:1cache-num:16#cache-model0:cache_none1:cache_readcache-model:1#cache-type:string,set,zset,list,hash,bitcache-type:string,set,zset,list,hash,bitzset-cache-field-num-per-key:512zset-cache-start-direction:0#2核4G为2G4核8G为4G8核16G为4Gcache-maxmemory:2147483648#cache-maxmemory-policy#0:volatile-lru->EvictusingapproximatedLRUamongthekeyswithanexpireset.#1:allkeys-lru->EvictanykeyusingapproximatedLRU.#2:volatile-lfu->EvictusingapproximatedLFUamongthekeyswithanexpireset.#3:allkeys-lfu->EvictanykeyusingapproximatedLFU.#4:volatile-random->Removearandomkeyamongtheoneswithanexpireset.#5:allkeys-random->Removearandomkey,anykey.#6:volatile-ttl->Removethekeywiththenearestexpiretime(minorTTL)#7:noeviction->Don/"tevictanything,justreturnanerroronwriteoperations.cache-maxmemory-policy:1#cache-maxmemory-samplescache-maxmemory-samples:5#千兆网卡为80M万兆网卡为800Mrate-limiter-bandwidth:80200000#cache-lfu-decay-timecache-lfu-decay-time:1#2核4G设置为0.5G4核8G为1G8核16G为4Gblock-cache:524288000启动Pika服务在完成配置更新后,启动Pika服务,确保实例正常运行。假如启动失败,需要执行回滚操纵。
启动命令示例:/path/pika353/bin/pika-c/path/pika6379.conf#或者systemctlstartpika6379数据同步(可选)通过binlog_sender保存增量,详细同步可参考下面Binlog_sender先容使用binlog_sender工具从指定的binlog文件开始同步数据。该工具支持从指定的起始编号开始,逐步导入数据。
回滚方案因为pika大版本之间变动较多,进级大版本后无法通过原地替代二进制包来进行回滚,旧版本与新版本之间也无法直接进行主从同步。提供两种回滚方案,第一种扩容从库,通过binlog_sender工具将新版本的binlog同步到旧版本,以此保证回滚,此种方式不会丢失增量数据,回滚相对比较丝滑,对业务影响较小。第二种,进级之前进行全备,回滚通过全备进行恢复,以此保证回滚,此种方案会丢失增量数据。
方案一、从库回滚(保存增量)
进级前预备扩容一个旧版本的pika从库,并等待从库完全追上主库,保证数据一致主库进级后从库通过binlog_sender保证数据同步(可参考后面binlog_sender先容内的脚本进行数据同步)以下为回滚步骤住手新版本实例,保证新版本不再产生binlog确认binlog_sender已经将新版本的binlog同步至保存的旧版本后,将业务切换到保存的旧版本实例方案二、全备回滚(舍弃增量)进级前预备通过bgsave执行全量备份回滚通过备份恢复新数据#执行BGSAVE命令进行备份redis-cli-p6379-aPASSWORDBGSAVE#根据info信息中的is_bgsaving指标判定是否备份完成,确认完成后进入dump目录进行打包备份cd/path/pika/#备份配置文件cp-fpika6379.confdump#备份cd/path/pika/dumptar-cvf-pika6379-20240820pika6379.conf#将打包好的tar包存储到其他位置mv-xvfpika6379-20240820.tar/path/以下为回滚步骤将tar包进行解压#将tar包解压并移到pika目录下tar-xvfpika6379-20240820.tar#将目录改为db目录mvpika6379-20240820db#检查pika6379.conf配置文件和service文件启动pika实例/usr/local/pika32/bin/pika-c/path/pika6379.conf#或者systemctlstartpika6379将业务切换到恢复的实例上Binlog_sender先容binlog_sender是pika本身自带的工具,可以实现将二进制日志应用到pika实例,位置在下载的pika包中的tools路径下,binlog_sender无法持续将binlog进行同步,所以假如需要进行数据同步的话,需要通过脚本轮回拉取binlog。
使用说明Usage:Binlog_senderreadsfrompika/"sbinlogandsendtopika/redisserverYoucanbuildanewpikabacktoanytimepointwiththistool-h--displaysthishelpinformationandexits-n--inputbinlogpath-i--ipofthepikaserver-p--portofthepikaserver-f--filestosend,default=0-o--theoffsetthatthefirstfilestartssending-s--starttime,default:/"2001-00-0000:59:01/"-e--endtime,default:/"2100-01-3024:00:01/"-a--passwordofthepikaserverexample1:./binlog_sender-n./log-i127.0.0.1-p9221-f526-o8749409example2:./binlog_sender-n./log-i127.0.0.1-p9221-f526-530-s/"2001-10-1111:11:11/"-e/"2020-12-1111:11:11/"脚本示例下面为一个简朴的轮回使用binlog_sender进行同步的脚本#!/bin/bash#解析参数whilegetopts/":n:i:p:a:t:f:/"opt;docase${opt}inn)BINLOG_PATH=$OPTARG;;i)REMOTE_IP=$OPTARG;;p)REMOTE_PORT=$OPTARG;;a)PASSWORD=$OPTARG;;t)INTERVAL=$OPTARG;;f)START_BINLOG_NUM=$OPTARG;;?)echo/"Usage:cmd-nbinlog_path-iip-pport-apassword-tinterval-fstart_binlog_num/"echo/"./pika_sync.sh-n/data1/pika6379/log/log_db0/-i10.11.165.16-p6379-f0-aPASSWORD-t100/"exit1;;esacdone#默认值设置INTERVAL=${INTERVAL:-300}#检测间隔时间,默认为5分钟(300秒)LAST_BINLOG_NUM_FILE=/"/tmp/last_binlog_num.txt/"#获取当前目录中最旧的binlog文件编号get_first_binlog_num(){ls/"$BINLOG_PATH/"|grep-oP/"(?<=write2file)[0-9]+/"|sort-n|head-1}#获取当前目录中最新的binlog文件编号get_latest_binlog_num(){ls/"$BINLOG_PATH/"|grep-oP/"(?<=write2file)[0-9]+/"|sort-n|tail-1}#获取最后处理的binlog文件编号get_last_binlog_num(){if[-n/"$START_BINLOG_NUM/"];thenecho/"$START_BINLOG_NUM/"elif[-f/"$LAST_BINLOG_NUM_FILE/"];thencat/"$LAST_BINLOG_NUM_FILE/"elseget_first_binlog_numfi}#留存最后处理的binlog文件编号save_last_binlog_num(){echo/"$1/">/"$LAST_BINLOG_NUM_FILE/
未经允许不得转载:头条资讯网_今日热点_娱乐才是你关心的时事 » Pika版本升级线上最佳实践