Redis集群原理详细分析
作者:上后左爱
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。Redis集群通过分区来提供一定程度的可用,即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求
一致性哈希
节点的增加和减少,大部分节点的 Hash一致
package consistenthash import ( "hash/crc32" "sort" ) // HashFunc defines function to generate hash code type HashFunc func(data []byte) uint32 // NodeMap consistent hash hashFunc and you can pick node form NodeMap type NodeMap struct { hashFUnc HashFunc nodeHashs []int // sorted nodehashMap map[int]string // 通过节点 找到具体的hash 值 } func NewNodeMap(fn HashFunc) *NodeMap { nodeMap := &NodeMap{ hashFUnc: fn, nodehashMap: make(map[int]string), } // default func if nodeMap.hashFUnc == nil { nodeMap.hashFUnc = crc32.ChecksumIEEE } return nodeMap } func (m *NodeMap) IsEmpty() bool { return len(m.nodeHashs) == 0 } func (m *NodeMap) AddNode(keys ...string) { for _, key := range keys { if key == "" { continue } hash := int(m.hashFUnc([]byte(key))) m.nodeHashs = append(m.nodeHashs, hash) m.nodehashMap[hash] = key } sort.Ints(m.nodeHashs) } func (m *NodeMap) PickNode(key string) string { if m.IsEmpty() { return "" } hash := int(m.hashFUnc([]byte(key))) // Binary Search sorted hash idx := sort.Search(len(m.nodeHashs), func(i int) bool { return m.nodeHashs[i] >= hash }) if idx == len(m.nodeHashs) { idx = 0 } return m.nodehashMap[m.nodeHashs[idx]] }
Redis 集群
每个单机版本redis 有 standalone_database, 在其上在封装一个 cluster_database ,cluster_database 主要的功能是进行 集群之间的通信。
当某个节点被推选出 主节点后,需要将信息转发给其副的节点,在转发的过程中涉及到cluster的池化
go-commons-pool比较好使用的go的池化工具
各种命令方式
ping 不需要转发
get/set 通过一致性hash 转发到其他节点
flushdb: 全发方式 所有节点数据清空
到此这篇关于Redis集群原理详细分析的文章就介绍到这了,更多相关Redis集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!