1.无中心化集群
1.基本介绍
![image-20240503101226535](https://img-blog.csdnimg.cn/img_convert/41df0fe3b0cdeddff7f9d4f4e8180f99.png)
2.集群说明
![image-20240503101458363](https://img-blog.csdnimg.cn/img_convert/9b365719815b6996bdd96842b944fa33.png)
2.基本环境搭建
1.部署规划(6台服务器)
2.首先删除上次的rdb和aof文件(对之前的三台服务器都操作)
1.首先分别登录命令行,关闭redis
/usr/local/bin/redis-cli -p 7489 -a **** shutdown
2.清除/root/下的rdb和aof文件
cd && rm -rf appendonly.aof && rm -rf dump.rdb
![image-20240503112700757](https://img-blog.csdnimg.cn/img_convert/c3a18169b3749afba0d016dddb67bbc7.png)
3.把上次的哨兵也关闭
![image-20240503112840000](https://img-blog.csdnimg.cn/img_convert/3598679592c98bccf5b6cdb6a264eb6f.png)
3.对新增的三台机器Redis进行初始化
1.安装Redis
1.yum安装gcc
yum install gcc
2.查看gcc版本
gcc --version
![image-20240502134411561](https://img-blog.csdnimg.cn/img_convert/a988d00f8a78ae70265f440bab8dbe10.png)
3.将redis6.2.6上传到/opt目录下
![image-20240502134559769](https://img-blog.csdnimg.cn/img_convert/8cbb2cbb607920e6b4d0c57cd1295068.png)
4.进入/opt目录下然后解压
cd /opt && tar -zxvf redis-6.2.6.tar.gz
![image-20240502134704827](https://img-blog.csdnimg.cn/img_convert/db95d321a74c73e9920382f459768031.png)
5.进入 redis-6.2.6目录
cd redis-6.2.6
![image-20240502134745310](https://img-blog.csdnimg.cn/img_convert/907f324fe8abf80e86c2626fcbe365fe.png)
6.编译并安装
make && make install
![image-20240502134932117](https://img-blog.csdnimg.cn/img_convert/d2d922f859da2d8acf25e6775ae67158.png)
7.进入 /usr/local/bin 查看是否有redis的命令
cd /usr/local/bin && ll
![image-20240502135006749](https://img-blog.csdnimg.cn/img_convert/13313695e9cda54df2b596f39f07de43.png)
2.启动并使用Redis
1.进入 /opt/redis-6.2.6/
cd /opt/redis-6.2.6/
![image-20240502135103511](https://img-blog.csdnimg.cn/img_convert/ff1a6cdb11151192755cd7f25887460a.png)
2.将里面的redis.conf复制一份到/etc下
cp redis.conf /etc/redis.conf
![image-20240502135237138](https://img-blog.csdnimg.cn/img_convert/512ff3939e0693a9007601e4c148a3eb.png)
3.编辑 /etc/redis.conf,将daemonize no修改成daemonize yes即以守护进程的方式启动(后台启动)
vim /etc/redis.conf
![image-20240502135330240](https://img-blog.csdnimg.cn/img_convert/12117cf4c26ce8a4b6be8f4e46a0db00.png)
4.启动redis,指定刚才的配置文件
/usr/local/bin/redis-server /etc/redis.conf
5.查看redis进程
ps -aux | grep redis
![image-20240502135537103](https://img-blog.csdnimg.cn/img_convert/db6e8b0aea814b799f26865fa469a608.png)
3.Redis基本配置
编辑配置文件
vim /etc/redis.conf
1.修改端口为7489 port 6379
![image-20240502135741587](https://img-blog.csdnimg.cn/img_convert/564d4bd3eeb46a6bf9afc62b796c4ebc.png)
2.设置redis密码 requirepass foobared
![image-20240503115631730](https://img-blog.csdnimg.cn/img_convert/0071e0851e389fde7dced4b7620ded5d.png)
![image-20240503115724349](https://img-blog.csdnimg.cn/img_convert/6644dd3c9827af7c572145dd0c34d590.png)
3.设置redis节点连接其他redis的密码 masterauth(与requirepass 一致即可)
![image-20240503115843829](https://img-blog.csdnimg.cn/img_convert/434bc2ceebfda262d3cb5bd808daa4aa.png)
4.使redis支持远程访问 bind 127.0.0.1 -::1 和 protected-mode
![image-20240502140044483](https://img-blog.csdnimg.cn/img_convert/d4490c964cd718d8a0a930c5afc968a7.png)
![image-20240503120110957](https://img-blog.csdnimg.cn/img_convert/9dafdb57e0caf8c84461ed344fb09968.png)
5.登录redis的命令行,关闭redis(此时配置文件未生效,所以端口还是6379)
/usr/local/bin/redis-cli shutdown
![image-20240503120329286](https://img-blog.csdnimg.cn/img_convert/4030e977f58c2ba4ee86a5a592ce8473.png)
6.重新启动redis,使配置生效
/usr/local/bin/redis-server /etc/redis.conf && ps -aux | grep redis
![image-20240502140612286](https://img-blog.csdnimg.cn/img_convert/c45b34361a7a44a11bb215b2eccfbfc7.png)
4.开启7489端口
1.宝塔开启端口
systemctl start firewalld && firewall-cmd --permanent --add-port=7489/tcp && firewall-cmd --reload && firewall-cmd --query-port=7489/tcp
![image-20240502140719020](https://img-blog.csdnimg.cn/img_convert/b5db654a220291b92afa0729580423b7.png)
2.腾讯云开启端口(只允许本机ip访问,为了方便允许所有ipv4也行,因为配置了密码)
![image-20240502143052618](https://img-blog.csdnimg.cn/img_convert/33bf862b11da547d5cf694178c47ddbe.png)
5.Redis持久化配置
1.进入redis配置文件
vim /etc/redis.conf
2.dbfilename为redis持久化的文件名(一般不用改)
![image-20240502141741998](https://img-blog.csdnimg.cn/img_convert/0bf3a3ef49b100bcc52b2af7595cb17e.png)
3.dir ./ 修改为/root/则每次持久化的dump.rdb都会在/root/下,恢复时无论在哪里启动,都会读取这个文件进行恢复
![image-20240502141833925](https://img-blog.csdnimg.cn/img_convert/6640f8cd285fc016d2857b1bea3596b7.png)
4.开启AOF持久化配置,编辑配置文件找到appendonly,设置成yes
![image-20240502142032064](https://img-blog.csdnimg.cn/img_convert/f49673a2afd054c1aa047d9165027953.png)
5.进入命令行关闭redis,需要指定端口,密码,命令
/usr/local/bin/redis-cli -p 7489 -a **** shutdown
![image-20240502142252827](https://img-blog.csdnimg.cn/img_convert/0cc502009808eb38e594c0b3f45d31a8.png)
6.重新启动redis,使配置生效
/usr/local/bin/redis-server /etc/redis.conf && ps -aux | grep redis
![image-20240502142304676](https://img-blog.csdnimg.cn/img_convert/144172aa56d41a986c5fce28afcb9647.png)
7.发现/root/下面有个配置文件,如果没有dump.rdb是因为redis库中还没东西
![image-20240503120709268](https://img-blog.csdnimg.cn/img_convert/670b83b90da81f0894b4a3c1a473cbb3.png)
6.测试Java连接redis
1.引入jedis的jar包
![image-20240502143134966](https://img-blog.csdnimg.cn/img_convert/213cb901d31d02da5b078a968592a60c.png)
2.编写测试程序
public static void main(String[] args) {
Jedis jedis = new Jedis("你的redisip", 7489);
jedis.auth("******");
String ping = jedis.ping();
System.out.println(ping);
}
![image-20240503121018034](https://img-blog.csdnimg.cn/img_convert/52f1f04a069724526248b6150ea65346.png)
3.Redis无中心化集群搭建
1.前提条件
1.确保六台服务器都按照前面的要求初始化了
2.Redis集群单个节点配置(六个服务器都进行这个操作)
1.都进入redis配置文件
vim /etc/redis.conf
2.配置下面的三个东西,搜索 REDIS CLUSTER
![image-20240503141140709](https://img-blog.csdnimg.cn/img_convert/41036d1f22c8acdaf13faf07c45311f4.png)
3.配置解释
![image-20240503141256409](https://img-blog.csdnimg.cn/img_convert/d17c433033b4fd0d45002089ee27be91.png)
4.进行配置
![image-20240503141353150](https://img-blog.csdnimg.cn/img_convert/a945404f780cd00d36a05c5c6604b26a.png)
5.重启redis(在解决了下面的问题再重启)
/usr/local/bin/redis-cli -p 7489 -a **** shutdown && /usr/local/bin/redis-server /etc/redis.conf && ps -aux | grep redis
6.报错了(只有之前配置过了主从模式才会报错)
1.原因是之前的主从模式导致了这行在配置文件中持久化了,而集群模式会与这个冲突,删除即可
![](https://img-blog.csdnimg.cn/img_convert/9426b0e8c93847499f1c419ff2ad9732.png)
2.编辑配置文件,找到这行,删除即可
![](https://img-blog.csdnimg.cn/img_convert/33bd1e836b1ed06afb0e1616e66e7f11.png)
3.再次启动redis,发现以集群模式启动了
/usr/local/bin/redis-server /etc/redis.conf && ps -aux | grep redis
![image-20240503142933446](https://img-blog.csdnimg.cn/img_convert/533ee4f6a7bc1ca30059683d6afe71c4.png)
7.查看dir下是否生成对应节点文件
cd && ll
![image-20240503143123893](https://img-blog.csdnimg.cn/img_convert/e74746796929f26326176e354be980a9.png)
3.将六个节点合成一个集群
1.基本介绍
![image-20240503144146298](https://img-blog.csdnimg.cn/img_convert/9e1274b2d88c9d17c53f4ddb6c8383f0.png)
2.合成指令
/usr/local/bin/redis-cli --cluster create --cluster-replicas 1 *******
3.执行报错 [ERR] Node NOAUTH Authentication required.
4.添加一个–askpass参数,要求输入密码即可
/usr/local/bin/redis-cli --cluster create --cluster-replicas 1 --askpass **********
5.输入密码之后再输入yes
![](https://img-blog.csdnimg.cn/img_convert/10e86a0cf37d3581fbf6a08a73912cc6.png)
6.一直在连接,原因是还需要开放总线端口就是redis的端口 + 10000
![image-20240503151641489](https://img-blog.csdnimg.cn/img_convert/bdd35032bee34310722ccabb64496f1f.png)
7.六个服务器都要开放redis总线端口
1.在宝塔开启redis总线端口7489 + 10000 = 17489
firewall-cmd --permanent --add-port=17489/tcp && firewall-cmd --reload && firewall-cmd --query-port=17489/tcp
![image-20240503151939153](https://img-blog.csdnimg.cn/img_convert/495973b7f1ecdf21b35eb3af1e83a93c.png)
2.在腾讯云开放17489端口
![image-20240503152147774](https://img-blog.csdnimg.cn/img_convert/8f66bbe5876d154bdbd8390dffb41673.png)
8.重新执行命令创建集群,连接成功!如果想要查找是谁的从,就看replicates后面的字符跟Master对应
1.示意图
![](https://img-blog.csdnimg.cn/img_convert/95ab729ad39de175a24ba09d559e9b3a.png)
2.找出对应关系
9.所以小结一下,创建集群的方式
1.开放Redis的总线端口为 redis端口 + 10000
2.创建集群指令
/usr/local/bin/redis-cli --cluster create --cluster-replicas 1 --askpass *****************
4.集群方式登录
1.登录并验证
redis-cli -c -p 7489
![](https://img-blog.csdnimg.cn/img_convert/1909d1dc9baf616f2ea5ceabed929699.png)
2.查看节点关系
cluster nodes
3.注意事项
![image-20240503154050018](https://img-blog.csdnimg.cn/img_convert/58027bbcb31e023246494ce2363fe1c4.png)
5.Redis插槽机制
1.一个Redis集群中包含16384个插槽,编号为0-16383,
2.集群使用公式CRC16(key)% 16384来计算键key属于哪个插槽,从而将其存放到不同的主机上,其中CRC16(key)计算的是key的校验和
3.示意图
![image-20240503155044787](https://img-blog.csdnimg.cn/img_convert/411bd01784630599aa65a1bb75426eb0.png)
6.在集群录入值
1.首先确保登录时带的 -c参数实现自动重定向
1.关于密码,第一种方式是直接在连接时指定
redis-cli -c -p 7489 -a ****
2.第二种方式是连接后让他询问(推荐)
redis-cli -c -p 7489 --askpass
3.如果不对密码进行设置,则每次切换到其他服务时都要重新输入密码
![](https://img-blog.csdnimg.cn/img_convert/2c00d9f80adb94cae3dc870377b93423.png)
2.录入数据则会触发插槽机制
![](https://img-blog.csdnimg.cn/img_convert/a106195c27433a126c1659ea7983924d.png)
3.不在同一个slot下,是不能使用mget,mset等操作的
1.演示
![](https://img-blog.csdnimg.cn/img_convert/7ad6b957eb6f25d5413edfd8de0413d0.png)
2.解决方式:通过 {} 来定义组,从而使key中{}内相同内容的放到同一个slot中
![](https://img-blog.csdnimg.cn/img_convert/d160549502cf0688282e678d5e1a741f.png)
7.查询集群中的值
1.返回key对应的插槽值
cluster keyslot <key>
2.返回插槽中有多少个key,注意,只能在该节点管理的slot范围内查找,否则为0
cluster countkeysinslot <slotnum>
3.返回count个slot槽中的键
cluster getkeysinslot <slot> <count>
8.集群的故障恢复(注意15s超时,再观察)
1.如果主节点down掉了,从节点自动升级为主节点
1.关闭主节点
/usr/local/bin/redis-cli -p 7489 -a *** shutdown
2.查看节点状态,父节点down了,子节点自动升级
cluster nodes
2.如果主节点恢复了,就会降级为子节点
1.启动 主节点
/usr/local/bin/redis-server /etc/redis.conf && ps -aux | grep redis
![image-20240503162918117](https://img-blog.csdnimg.cn/img_convert/f298c26fcda5da4b39fe699769680928.png)
2.再次查看节点状态,已经被降级
cluster nodes
3.如果主从节点都挂掉了(概率很低),可以配置服务是否继续
![image-20240503163236187](https://img-blog.csdnimg.cn/img_convert/7cc42bfca455200820861b090e70c81b.png)
9.集群的Jedis开发
1.基本说明
![image-20240503163522983](https://img-blog.csdnimg.cn/img_convert/1faf1c1b61d31b8444897330c315624e.png)
2.引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
3.代码演示
public static void main(String[] args) {
Set<HostAndPort> hostAndPorts = new HashSet<HostAndPort>();
hostAndPorts.add(new HostAndPort("", 7489));
JedisPoolConfig poolConfig = new JedisPoolConfig();
String password = "";
redis.clients.jedis.JedisCluster jedisCluster = new redis.clients.jedis.JedisCluster(hostAndPorts, 2000, 2000, 5, password, poolConfig);
try {
jedisCluster.set("k1", "v1");
String k1 = jedisCluster.get("k1");
System.out.println("k1=" + k1);
} finally {
jedisCluster.close();
}
}
4.结果展示(没有做日志配置,所以会爆红)
![image-20240503165131818](https://img-blog.csdnimg.cn/img_convert/4f02367db0f3c2616ae5967345f7bd7d.png)
10.Redis集群的优缺点
1.优点
![image-20240503165354885](https://img-blog.csdnimg.cn/img_convert/f43cf08101e290f3785e2e0aa7d1f6f1.png)
2.缺点
![image-20240503165448419](https://img-blog.csdnimg.cn/img_convert/6609ff4562c8d4295749f1f9df4576a6.png)