目錄
一、背景
二、步驟
0.理論支持
1、獲取數(shù)據(jù)
2、結(jié)果
3、分析數(shù)據(jù)并評(píng)估大小
三、關(guān)于repl-backlog-size
一、背景
repl-backlog-size控制這個(gè)環(huán)形緩沖區(qū).
?
主從斷開之后會(huì)發(fā)生什么?環(huán)形隊(duì)列被覆蓋會(huì)發(fā)生什么?
如果從庫的讀取速度比較慢,就有可能導(dǎo)致從庫還未讀取的操作被主庫新寫的操作覆蓋了,這會(huì)導(dǎo)致主從庫間的數(shù)據(jù)不一致。
?
repl_backlog_buffer 是一個(gè)環(huán)形緩沖區(qū),主庫會(huì)記錄自己寫到的位置,從庫則會(huì)記錄自己 已經(jīng)讀到的位置。
?
主從庫的連接恢復(fù)之后,從庫首先會(huì)給主庫發(fā)送 psync 命令,并把自己當(dāng)前的 slave_repl_offset 發(fā)給主庫,主庫會(huì)判斷自己的 master_repl_offset 和 slave_repl_offset 之間的差距。
在不影響正常業(yè)務(wù)的情況下redis主從同步時(shí)總會(huì)出現(xiàn)timeout,部分同步失敗的情況。需要評(píng)估一下repl-backlog-size的大小,來避免復(fù)制時(shí)出現(xiàn)異常
二、步驟
0.理論支持
這個(gè)參數(shù)和所需的緩沖空間大小有關(guān)。緩沖空間的計(jì)算公式是:緩沖空間大小 = 主庫 寫入命令速度 * 操作大小 - 主從庫間網(wǎng)絡(luò)傳輸命令速度 * 操作大小。在實(shí)際應(yīng)用中,考慮 到可能存在一些突發(fā)的請求壓力,我們通常需要把這個(gè)緩沖空間擴(kuò)大一倍,
即 repl_backlog_size = 緩沖空間大小 * 2,這也就是 repl_backlog_size 的最終值。
如果主庫每秒寫入 2000 個(gè)操作,每個(gè)操作的大小為 2KB,網(wǎng)絡(luò)每秒能傳輸 1000 個(gè)操作,那么,有 1000 個(gè)操作需要緩沖起來,這就至少需要 2MB 的緩沖空間。否 則,新寫的命令就會(huì)覆蓋掉舊操作了。為了應(yīng)對可能的突發(fā)壓力,我們最終把 repl_backlog_size 設(shè)為 4MB。
1、獲取數(shù)據(jù)
借助redis-cli 、info replication..收集master_repl_offset每一分鐘前后的數(shù)據(jù),其中使用了sed 和awk命令對數(shù)據(jù)進(jìn)行處理,為后期分析提供便利。
腳本如下
#!/bin/bash
# @date: 2020-07-02
# @author: ninesun
# @parm : null
# @desc: save master_repl_offset by mins
echo "start!"
for((i=6379; i<6387; i++))
do
redis-cli -p $i info replication|grep master_repl_offset|sed 's/:/|/g'|awk '{print strftime("%Y-%m-%d %H:%M:%S"),$0}'|sed 's/ /|/g'|sed 's/|/ /'|sed '
s/^/'$i|'/' >> /home/scripts/redis/redisParm.csv
echo "port $i save successful!"
done
echo "end!"
2、結(jié)果
?
3、分析數(shù)據(jù)并評(píng)估大小
將格式化號(hào)的數(shù)據(jù)借助GP的gpfdist裝載到數(shù)據(jù)庫中。
3.1 建表
create table sor.redisparam_info
( port character varying( 50 ), evt_timestamp timestamp( 0 ) without time zone,
param character varying( 200 ),param_value character varying( 200 ),
CONSTRAINT redisparam_info_pkey PRIMARY KEY (evt_timestamp,port))
DISTRIBUTED by( evt_timestamp )
partition by range( evt_timestamp )( partition p202004 start( '2020-04-01'::date )
end( '2020-04-30'::date ), partition p202005 start( '2020-05-01'::date )
end( '2020-05-31'::date ), partition p202006 start( '2020-06-01'::date )
end( '2020-06-30'::date ), partition p202007 start( '2020-07-01'::date )
end( '2020-07-31'::date ), partition p202008 start( '2020-08-01'::date )
end( '2020-08-31'::date ), partition p202009 start( '2020-09-01'::date )
end( '2020-09-30'::date ), partition p202010 start( '2020-10-01'::date )
end( '2020-10-31'::date ), partition p202011 start( '2020-11-01'::date )
end( '2020-11-30'::date ), partition p202012 start( '2020-12-01'::date )
end( '2020-12-31'::date ));
drop external table ext_redisparam_info
CREATE EXTERNAL TABLE ext_redisparam_info (like sor.redisparam_info) LOCATION (
'gpfdist://******:8100/redisParm.csv'
) FORMAT 'text' (delimiter E'|' null E'\N' escape E'\')
SEGMENT REJECT LIMIT 1000 ROWS
3.2 使用表數(shù)據(jù)分析。
開啟gpfdist后,如果不需要存入堆表,可直接在外部表上進(jìn)行分析。
分析sql如下,邏輯為by 時(shí)間排序,計(jì)算前后兩者差距。使用
select *,round(t.diff/1024.0,2) as kb,round(t.diff/1024.0/1024.0,2) mb
from( select *, param_value::bigint -( lead( param_value::bigint ) over(
order by evt_timestamp desc )) as diff
from sor.redisparam_info
where port = '6384'
) t
結(jié)果
?
3.3 最終分析結(jié)果
取8個(gè)node的平均值,最終得到一個(gè)估計(jì)結(jié)果。
?
?
三、關(guān)于repl-backlog-size
這個(gè)參數(shù)官方的解釋。
# Set the replication backlog size. The backlog is a buffer that accumulates
# slave data when slaves are disconnected for some time, so that when a slave
# wants to reconnect again, often a full resync is not needed, but a partial
# resync is enough, just passing the portion of data the slave missed while
# disconnected.
#
# The bigger the replication backlog, the longer the time the slave can be
# disconnected and later be able to perform a partial resynchronization.
#
# The backlog is only allocated once there is at least a slave connected.
#
# repl-backlog-size 1mb
我的疑問
redis 2.8 psync · Issue #1400 · redis/redis · GitHub