redis 梳理笔记(二)
一.redis 分布式
redis+keepalived (虚ip漂移)

- redis 100秒平均写入并发 3.6w (写入与keepalived监控程序无关)
- .redis 数据库内存已占有80% 100秒平均写入并发 2.6w
- 6g的redis 数据库 执行一次bgsave需要 32s 内存消耗 3g 期望内存至少预留4g
- .6g的redis 数据库 执行一次bgrewriteaof 需要 13-20秒, 1g 用完 期望预留4g
- .测试主备切换时间花费及服务可用性,数据量为6g(A 为主库, B为备库,C为从库)
A库 手动kill (13:32)keepalived 切换 服务到B库(13:35)B库备份数据库到 *.rdb, cpu 飙升 ,开始执行主从同步(13:36)B库rdb 执行完成花费37秒 开始传输*.rdb到c 库 (14:13)C库接受完毕*.rdb传输,传输花费34秒 (14:47秒)C库执行load *.rdb到内存中 (花费47秒)次秒从库数据库不可用 (15:34)主库挂掉 到完全服务可用 花费122秒
- 带宽:最大峰值 805Mb/s,约100MB/s (6g)
总结:在此过程:写3秒不可用;读 47秒不可用;切换到完全可用近2分钟
sentinel

twemproxy(vips之前架构)

- 优点
- sharding逻辑对开发透明,读写方式跟单个redis一致
- 可以作为cache和storage的proxy
- 缺点
- 架构复杂,层次多 包含lvs、twemproxy、redis、sentinel
- 管理成本跟硬件成本很高
- 流量高的系统、proxy节点数和redis个数接近
- redis层仍然扩容能力差,预分配足够的redis存储节点
crc32 katema 网卡流量
二、redis 几种数据结构
hash

//单向链表结构
typedef struct dictEntry {
void *key;//key值指针
union {//
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;//单向链表下个元素指针
} dictEntry;
//hash表类型
typedef struct dictType {
unsigned int (*hashFunction)(const void *key);//哈希计算方法,返回整形变量 time33
//hash*33+hash+ord(1)
void *(*keyDup)(void *privdata, const void *key);//对key进行拷贝
void *(*valDup)(void *privdata, const void *obj);//对value进行拷贝
int (*keyCompare)(void *privdata, const void *key1, const void *key2);//key比较器
void (*keyDestructor)(void *privdata, void *key);//销毁key,析构函数
void (*valDestructor)(void *privdata, void *obj);//销毁value,析构函数
} dictType;
/* This is our hash table structure. Every dictionary has two of this as we
* implement incremental rehashing, for the old to the new table. */
//hash表结构
typedef struct dictht {
dictEntry **table; //hash 表中如果出现hash 碰撞 就用单向连表保存数据结构
unsigned long size;//桶个数
unsigned long sizemask;//size-1,方便定位
unsigned long used;//实际保存的元素数
} dictht;
//hash表主表
typedef struct dict {
dictType *type;//hash表类型
void *privdata;
dictht ht[];//新旧两张hash 表
long rehashidx; /* rehashing not in progress if rehashidx == -1 */
int iterators; /* number of iterators currently running */
} dict;
//迭代器
typedef struct dictIterator {
dict *d; //当前hash 字典
long index;//当前索引
int table, safe;//
dictEntry *entry, *nextEntry;//循环结构体 以及下一个dictEntry * 结构体
/* unsafe iterator fingerprint for misuse detection. */
long long fingerprint;
} dictIterator;
#当发生hash碰撞时,dict_can_resize会变成真 当bgsave(快照)&© on write(aof)也会强制变成真 rehash
# use "activerehashing yes" if you don't have such hard requirements but
# want to free memory asap when possible.
# 每100毫秒,redis将用1毫秒的时间对Hash表进行重新Hash。
# 采用懒惰Hash方式:操作Hash越多,则重新Hash的可能越多,若根本就不操作Hash,则不会重新Hash
# 默认每秒10次重新hash主字典,释放可能释放的内存
# 重新hash会造成延迟,如果对延迟要求较高,则设为no,禁止重新hash。但可能会浪费很多内存
activerehashing yes
list

typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
typedef struct listIter {
listNode *next;
int direction;
} listIter;
typedef struct list {
listNode *head;
listNode *tail;
void *(*dup)(void *ptr);
void (*free)(void *ptr);
int (*match)(void *ptr, void *key);
unsigned long len;
} list;
三、一些建议
- Master最好不要做任何持久化工作(AOF日志文件),特别是不要启用内存快照做持久化。(一旦主库挂了或者不可用,没啥毛用)
- 如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
- 为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。
- 尽量避免在压力较大的主库上增加从库
- 为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<--Slave1<-- Slave2<--Slave3.......,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,如果Master 挂了,可以立马启用Slave1做Master,其他不变(现在看来也是然并卵)。
如果问题,欢迎指教
redis 梳理笔记(二)的更多相关文章
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
- redis相关笔记(二.集群配置及使用)
redis笔记一 redis笔记二 redis笔记三 1.配置:在原redis-sentinel文件夹中添加{8337,8338,8339,8340}文件夹,且复制原8333中的配置 在上述8333配 ...
- redis 学习笔记二 (简单动态字符串)
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...
- redis 梳理笔记(一)
一 redis 数据格式 短连接 长连接pconnect tcp协议 交互数据格式 交互采用特殊的格式 \r\n 1."+"号开头表示单行字符串的回复 set aa aa ...
- StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...
- redis 学习笔记二
redis启动: 直接 redis-server.exe 启动服务,是按照redis默认配置启动的,如果想按照自己的配置文件启动,要加上 redis-server.exe redis.windows ...
- Redis学习笔记二
学习Redis添加Object时,由于Redis只能存取字符串String,对于其它数据类型形容:Int,long,double,Date等不提供支持,因而需要设计到对象的序列化和反序列化.java序 ...
- Redis学习笔记二:单机数据库的实现
1. 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个r ...
- Redis入门笔记(二)-配置及运行
转自: http://gly199.iteye.com/blog/1056424 1.redis基本参数 redis的配置文件中的常见参数如下: daemonize 是否以后台进程运行,默认为no ...
随机推荐
- Kotlin——最详细的控制语句使用
在前面 的章节中讲解了Kotlin语言中的数据类型.变量与常量的定义.不了解请参见前面的内容: Kotlin从无到有系列之数据类型介绍. Kotlin从无到有系列之变量.常量.注释的使用. 下面详细为 ...
- LINUX 笔记-read命令
作用:读入值给变量 1.read 从键盘读入字符到name变量 2.read -p 'msg' var... 输入提示 3.read -s vars 隐藏输入 4.read读取文件时,每次调用会读取 ...
- LeetCode 1. Two Sum (两数之和)
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Java多线程高并发学习笔记——阻塞队列
在探讨可重入锁之后,接下来学习阻塞队列,这边篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...
- js 获取多少天前
getBeforeDate: function(day, str) { var now = new Date().getTime(); //获取毫秒数 var before = new Date(no ...
- 服务端事件EventSource揭秘
服务端推 服务端推,指的是由服务器主动的向客户端发送消息(响应).在应用层的HTTP协议实现中,"请求-响应"是一个round trip,它的起点来自客户端,因此在应用层之上无法实 ...
- Spring、SpringMVC、SpringData + JPA 整合详解
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7759874.html ------------------------------------ ...
- Path.Combine 合并两个路径字符串,会出现的问题
Path.Combine(path1,path2) 1.如果path2字符串,以 \ 或 / 开头,则直接返回 path2
- PAT-甲级-1002
1.来,先看题,https://www.patest.cn/contests/pat-a-practise/1002. 2.需要注意的地方只有一个:两个多项式相加之后,系数可能为零,这些项不应该出现在 ...
- IOS学习——iphone X的适配
说实话,对于一个刚入门iOS两个月的新手而言,在拿到这个任务的时候整个人都是懵逼的,怎么做适配?哪些地方需要适配?该怎么做?一个个问题搞得头都大了. 首先,啥都不管,先在iPhone X上运行起来看看 ...