五,主从复制
1.redis主从复制
为解决单点故障把数据复制到一个或多个副本副本服务器(从服务器),实现故障恢复和负载均衡
2.开启第二台服务器,安装redis
(1)把第一台服务器的redis安装目录,scp到第二台服务器上
scp -rp /opt/redis_cluster/ root@192.168.8.20:/opt
(2)在第二台服务器上,make install安装redis
cd /opt/redis_cluster/redis make install vim /opt/redis_cluster/redis_6379/conf/6379.conf 修改: bind 127.0.0.1 192.168.2.2 slaveof 192.168.2.1 6379 保存退出
(3)启动服务
redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
(4)主服务器上新建键值,测试从服务器自动同步
(5)从服务器在同步过程中,只能复制主数据库的数据,不能手动添加修改数据;
如果从服务器非要修改数据,需要断开同步:
redis-cli slaveof no one
六,redis集群
一,redis集群的概念
Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。
Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的错误。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
redis集群提供了以下两个好处:
将数据自动切分到多个节点的能力
当集群中的一部分节点失灵或无法进行通信,仍然可以继续处理命令请求能力
二,集群redis部署
环境:
redis1-2:192.168.2.1
redis2-3:192.168.2.2
redis3-4:192.168.2.3
实现环境:
一,安装redis
1.redis1部署
1.安装redis
[root@localhost ~]# tar -xf /mnt/redis-5.0.7.tar.gz -C /opt/ [root@localhost ~]# /opt/redis-5.0.7 [root@localhost redis-5.0.7]# make && make install [root@localhost ~]# ln -s /opt/redis-5.0.7/ /opt/redis #做一个软链接,方便以后更新
注意(当make编译时出现问题,大多数原因是缺少gcc编译器):[root@localhost redis-5.0.7]# yum -y install gcc gcc-c++
2.创建配置文件存放位置
[root@localhost ~]# mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid} [root@localhost ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
3.编写redis配置文件
[root@localhost ~]# cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF bind 192.168.2.1 port 6380 daemonize yes pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid" logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log" dbfilename "redis_6380.rdb" dir "/data/redis_cluster/redis_6380/" cluster-enabled yes cluster-config-file nodes_6380.conf cluster-node-timeout 15000 EOF
4.创建6381端口的redis
[root@localhost ~]# cd /opt/redis_cluster/ [root@localhost redis_cluster]# cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf [root@localhost redis_cluster]# sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf
5.启动redis
[root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf [root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
6.传递redis
[root@localhost opt]# scp -rp /opt/redis*/ root@192.168.2.2:/opt [root@localhost opt]# scp -rp /opt/redis*/ root@192.168.2.3:/opt
2.redis2部署
1.重新安装一下redis
[root@localhost ~]# cd /opt/redis [root@localhost redis]# make install
2.更改配置文件中的IP地址
[root@localhost redis]# find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "s#192.168.2.1#192.168.2.2#g"
3.创建存放数据的目录
[root@localhost redis]# mkdir -p /data/redis_cluster/redis_{6380,6381}
4.开启redis服务器
[root@localhost redis]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf [root@localhost redis]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
3.redis3部署(同redis2除IP外)
二,手动配置节点发现
节点发现使用命令: CLUSTER MEET {IP} {PORT}
提示:在集群内任意一台机器执行此命令就可以
1.添加节点在192.168.2.1:6380
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.1 6381 OK [root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6380 OK [root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6381 OK [root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6380 OK [root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6381 OK [root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678676225000 4 connected dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 master - 0 1678676226000 0 connected 693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 master - 0 1678676226199 5 connected 961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 master - 0 1678676224000 1 connected 9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678676223000 2 connected d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678676227207 3 connected
2.redis cluster通信流程
redis 集群采用 Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。
通信过程:
1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,防火墙放行(端口号+10000).
2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息
3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,
只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。
通讯消息类型:
Gossip
Gossip 协议职责就是信息交换,信息交换的载体就是节点间彼此发送Gossip 消息。
常见 Gossip 消息分为:ping、 pong、 meet、 fail 等
meet
meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换
ping
ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。
pong
Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。
- fail
fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。
3.redis cluster手动分配槽位
注意:虽然节点之间已经互相发现了,但是此时集群还是不可用的状态,因为并没有给节点分配槽位,而且必须是所有的槽位都分配完毕后整个集群才是可用的状态。 反之,也就是说只要有一个槽位没有分配,那么整个集群就是不可用的.
[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster addslots {0..5460} OK [root@localhost ~]# redis-cli -h 192.168.2.2 -p 6380 cluster addslots {5461..10922} OK [root@localhost ~]# redis-cli -h 192.168.2.3 -p 6380 cluster addslots {10923..16383} OK
查看:
[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678677991468 4 connected 10923-16383 dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 master - 0 1678677992477 0 connected 693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 master - 0 1678677990459 5 connected 961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 master - 0 1678677991000 1 connected 9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678677992000 2 connected 0-5460 d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678677993485 3 connected 5461-10922
4.手动分配集群高可用
[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6381 cluster replicate d9ea4f26b2221a5497d78326a7c1aff828e98426 #输入第二台6380的ID OK [root@localhost ~]# redis-cli -h 192.168.2.2 -p 6381 cluster replicate b6f47e859ad6a3b9b238778d1cf0df4f95710a1f #输入第三台6380的ID OK [root@localhost ~]# redis-cli -h 192.168.2.3 -p 6381 cluster replicate 9f48a4262474744dc22524b28096ccba111d236d #输入第一台6380的ID OK
5.redis cluster ASK路由介绍
在集群模式下,Redis接受任何键相关命令时首先会计算键对应的槽,再根据槽找出所对应的节点
如果节点是自身,则处理键命令;
否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为Mover重定向.
知道了ask路由后,我们使用-c选项批量插入一些数据
1.编写创建键值对脚本
[root@localhost ~]# vi input_key.sh #!/bin/bash for i in $(seq 1 10000) do redis-cli -c -h 192.168.2.1 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok" done #保存退出 #运行测试 bash input_key.sh
测试
[root@localhost ~]# redis-cli -c -h 192.168.2.1 -p 6380 192.168.2.1:6380> get k_10000 -> Redirected to slot [12695] located at 192.168.2.3:6380 #存放到了2.3上的第12695槽位 "v_10000" 192.168.2.3:6380> get k_1000 -> Redirected to slot [79] located at 192.168.2.1:6380 #存放到了2.1上的第79槽位 "v_1000"