【Redis 集群的原理】

  • Post author:
  • Post category:其他




一致性哈希

节点的增加和减少,大部分节点的 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 主要的功能是进行 集群之间的通信。

  1. 当某个节点被推选出 主节点后,需要将信息转发给其副的节点,在转发的过程中涉及到cluster的池化

    在这里插入图片描述
  2. go-commons-pool比较好使用的go的池化工具
  3. 各种命令方式
4. ping 不需要转发
5. get/set 通过一致性hash 转发到其他节点
6. flushdb: 全发方式 所有节点数据清空



版权声明:本文为qq_27217017原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。