1、集群的概念

  • 集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上,redis集群主要是缓解单台服务器同一时间大量请求带来的的压力,就算集群中有服务器宕机,也不影响整体对外提供服务。
  • Redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中 的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保 证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
  • Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。
  • Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节 点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充当 master。

2、组织架构

3、环境准备(每个节点都执行)

#创建目录
mkdir -p /opt/{6380,6381}/{log,pid,etc} #添加配置文件
cat >/opt/6380/etc/redis.conf<<-EOF
bind 0.0.0.0
port 6380
daemonize yes
pidfile "/opt/6380/pid/redis.pid"
logfile "/opt/6380/log/redis.log"
dir /opt/6380/
dbfilename dump.rdb
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
EOF cp /opt/6380/etc/redis.conf /opt/6381/etc/
sed -i "s/6380/6381/g" /opt/6381/etc/redis.conf #启动
redis-server /opt/6380/etc/redis.conf
redis-server /opt/6381/etc/redis.conf #添加防火墙规则
#redis会在当前端口+10000的端口上进行集群节点间的数据交流。
firewall-cmd --permanent --add-port=6380/tcp
firewall-cmd --permanent --add-port=6381/tcp
firewall-cmd --permanent --add-port=16380/tcp
firewall-cmd --permanent --add-port=16381/tcp
firewall-cmd --reload

4、手动搭建redis集群

4.1、手动节点发现
redis-cli -h 192.168.20.161  -p 6380 CLUSTER MEET 192.168.20.162 6380
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.163 6380
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.161 6381
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.162 6381
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.163 6381
redis-cli -h 192.168.20.161 -p 6380 CLUSTER NODES

4.2、手动添加主从复制关系
redis-cli -h 192.168.20.161  -p 6381 CLUSTER REPLICATE 9bd06eadbaf32eff955a211a927fa6ab7dc4d56b
redis-cli -h 192.168.20.162 -p 6381 CLUSTER REPLICATE b1b2dfdea90fe6d833f5a83d77a7a8320bd7497b
redis-cli -h 192.168.20.163 -p 6381 CLUSTER REPLICATE d70d68d2b8557d753e2dcfd03b8aa707727adb11
redis-cli -h 192.168.20.161 -p 6380 CLUSTER NODES

4.2、手动分配槽位
#一共16384个槽位,只有当槽位全部分布完成后,集群才会正常工作,配置时使用的是槽位的序号,从0开始。
redis-cli -h 192.168.20.161 -p 6380 CLUSTER ADDSLOTS {0..5460}
redis-cli -h 192.168.20.162 -p 6380 CLUSTER ADDSLOTS {5461..10921}
redis-cli -h 192.168.20.163 -p 6380 CLUSTER ADDSLOTS {10922..16383}
redis-cli -h 192.168.20.161 -p 6380 CLUSTER NODES
redis-cli -h 192.168.20.161 -p 6380 CLUSTER INFO



5、验证集群的可用性

5.1、测试数据写入
[root@node01 ~]# cat set.sh
#!/bin/bash
for i in `seq -w 10000`;
do
redis-cli -h 192.168.20.161 -p 6380 -c set k_$i v_$i
done
bash set.sh
5.2、验证随机性
redis-cli -c -h 192.168.20.161 -p 6380 keys \* > keys_all.txt
cat keys_all.txt |awk -F "_" '{print $2}'|sort -n | head
5.3、检查集群是否健康
#key分布误差
redis-cli --cluster rebalance 192.168.20.161:6380
>>> Performing Cluster Check (using node 192.168.20.161:6380)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold. #key分布情况
redis-cli --cluster info 192.168.20.161:6380
192.168.20.161:6380 (d70d68d2...) -> 3314 keys | 5461 slots | 1 slaves.
192.168.20.162:6380 (9bd06ead...) -> 3348 keys | 5461 slots | 1 slaves.
192.168.20.163:6380 (b1b2dfde...) -> 3338 keys | 5462 slots | 1 slaves.
[OK] 10000 keys in 3 masters.
0.61 keys per slot on average.

6、调整槽位分配错误

6.1、使用工具重新分配槽位
#重新分配槽位
redis-cli --cluster reshard 192.168.20.161:6380 #第一次交互:输入迁出的槽的数量
How many slots do you want to move (from 1 to 16384)? 5461 #第二次交互:输入接受的ID
What is the receiving node ID? cluster2的6380的ID #第三次交互:输入发送者的ID
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: cluster1的6380的ID
Source node #2: done #第四次交互:YES! #重复上面的操作,将槽位正确分配给 192.168.20.162:6380,192.168.20.16:6380 节点
6.2、pipline
前提条件:
1.了解aof格式
2.了解新版本redis默认是开启混合模式的
3.需要修改为普通的aof格式并重启
4.恢复时使用-c参数无效,需要在每一个节点都执行 命令:
redis-cli -c -h 192.168.20.161 -p 6380 --pipe < redis.aof
redis-cli -c -h 192.168.20.162 -p 6380 --pipe < redis.aof
redis-cli -c -h 192.168.20.163 -p 6380 --pipe < redis.aof

redis5.* 手动构建集群的更多相关文章

  1. 分布式搜索ElasticSearch构建集群与简单搜索实例应用

    分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...

  2. memcached构建集群分析之一

    memcached本身是不支持集群的,集群所关注的容灾.容错.宕机恢复机制统统都没有,实战中需要自己实现容灾机制. memcached集群相比memcached的优势: 巨量数据分布到集群的多台应用主 ...

  3. 使用Akka构建集群(二)

    前言 在<使用Akka构建集群(一)>一文中通过简单集群监听器的例子演示了如何使用Akka搭建一个简单的集群,但是这个例子“也许”离我们的实际业务场景太远,你基本不太可能去做这样的工作,除 ...

  4. 使用Akka构建集群(一)

    概述 Akka提供的非常吸引人的特性之一就是轻松构建自定义集群,这也是我要选择Akka的最基本原因之一.如果你不想敲太多代码,也可以通过简单的配置构建一个非常简单的集群.本文为说明Akka集群构建的学 ...

  5. Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈

    目录 Docker 构建集群/服务/Compose/分布式服务栈 集群 初始化集群服务 安装docker-machine 管理节点和工作节点 docker集群构建完成 集群中部署应用 集群服务访问特性 ...

  6. 如何通过云效Flow完成自动化构建—构建集群

    如何通过云效Flow完成自动化构建-构建集群,云效流水线Flow是持续交付的载体,通过构建自动化.集成自动化.验证自动化.部署自动化,完成从开发到上线过程的持续交付.通过持续向团队提供及时反馈,让交付 ...

  7. KingbaseES R6 通过脚本构建集群案例

      案例说明: KingbaseES V8R6部署一般可采用图形化方式快速部署,但在生产一线,有的服务器系统未启用图形化环境,所以对于KingbaseES V8R6的集群需采用手工字符界面方式部署,本 ...

  8. k8s笔记0528-基于KUBERNETES构建企业容器云手动部署集群记录-2

    三.ETCD集群部署 类似于走zookeeper集群分布式协调服务,可做以key v形式存储在ETCD中. 官方链接:https://github.com/coreos/etcd 分布式kv存储,为分 ...

  9. k8s笔记0528-基于KUBERNETES构建企业容器云手动部署集群记录-4

    部署kubelet 1.二进制包准备 将软件包从linux-node1复制到linux-node2中去. [root@linux-node1 ~]# cd /usr/local/src/kuberne ...

随机推荐

  1. RESTFul应用分析

    Restful API 近年来应用越来越广泛,各大互联网公司纷纷推出了自己的 Restful API 服务. 本文将从实际应用出发,从 REST 到 Restful 再到 Restful API ,逐 ...

  2. gcc选项 笔记

    gcc –E hello.c –o hello.i   使用gcc的选项"-E" 让gcc在预处理结束后停止编译过程. gcc –S hello.i –o hello.s   &q ...

  3. zabbix监控设备结果异常问题

    1.现象描述 paloalto防火墙升级后发现zabbix监控其CPU.风扇等硬件信息和端口流量数据错误. 2.现象分析 由于zabbix并没有做过任何调整,防火墙也只是升级.根据现象并不好排查.但是 ...

  4. Codeforces Round #594 (Div. 2) D1 - The World Is Just a Programming Task (贪心)

    思路:枚举换的位置i,j 然后我们要先判断改序列能否完全匹配 如果可以 那我们就需要把差值最大的位置换过来 然后直接判断就行

  5. CCPC2019网络赛总结

    比赛那会过了两道题,哇贼激动,然后后面就没有然后了... 1003我想到用$kmp$,于是不会$kmp$的我开始找板子套,结果$TLE$,就觉得应该是优化不行,优化后AC妥妥$TLE$,就放弃了. 钓 ...

  6. HDU-6704 K-th occurrence(后缀数组+主席树)

    题意 给一个长度为n的字符串,Q次询问,每次询问\((l,r,k)\) , 回答子串\(s_ls_{l+1}\cdots s_r\) 第\(k\) 次出现的位置,若不存在输出-1.\(n\le 1e5 ...

  7. GPLT L2-007 家庭房产 (并查集)

    题意: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 思路: 输入和输出各构造一个结构体,利用并查集归并输入,枚举编号进行输出. #include &l ...

  8. Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)

    题目链接:https://codeforces.com/contest/1359/problem/A 题意 $n$ 张牌可以刚好被平分给 $k$ 个人,其中有 $m$ 张 joker,当一个人手中的 ...

  9. CodeForces - 1140C

    题意: 给你n首歌,每首歌有一个长度ti和一个愉悦度bi,你最多可以从中挑选出来k首歌.那么你挑选出来这首歌会为你增加sum歌愉悦度,sum的求法就是:挑选出来所有歌的长度之和,乘与挑选出来所有歌中愉 ...

  10. Codeforces Round #540 (Div. 3) C. Palindromic Matrix (大模拟)

    题意:给你\(n\)个数,判断是否能构成一个\(n\)X\(n\)的回文矩阵,若可以,输出\(YES\)和矩阵,否则输出\(NO\). 题解:如果这个矩阵的行/列元素是偶数的话,很好办,所有出现的数一 ...