redis的哨兵以及redis cluster的搭建等
一、RDB和AOF的优缺点
1、RDB的优缺点:
RDB 模式优点:
RDB快照保存了某个时间点的数据,可以通过脚本执行redis指令bgsave(非阻塞,后台执行)或者save(会阻塞写操作,不推荐)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本,很适合备份,并且此文件格式也支持有不少第三方工具可以进行后续的数据分析
比如: 可以在最近的24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一个
ROB文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
RDB可以最大化Redis的性能,父进程在保存 RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘工/0操作。
RDB在大量数据,比如几个G的数据,恢复的速度比AOF的快
RDB 模式缺点:
不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据
如果你需要尽量避免在服务器故障时丢失数据,那么RDB不适合你。虽然Redis允许你设置不同的保存点(save point)来控制保存RDB文件的频率,但是,因为ROB文件需要保存整个数据集的状态,所以它并不是一个轻松的操作。因此你可能会至少5分钟才保存一次RDB文件。在这种情况下,一旦发生故障停机,你就可能会丢失好几分钟的数据。
当数据量非常大的时候,从父进程fork子进程进行保存至RDB文件时需要一点时间,可能是毫秒或者秒,取决于磁盘IO性能
在数据集比较庞大时,fork()可能会非常耗时,造成服务器在一定时间内停止处理客户端﹔如果数据集非常巨大,并且CPU时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒或更久。虽然 AOF重写也需要进行fork(),但无论AOF重写的执行间隔有多长,数据的持久性都不会有任何损失。
2、AOF的优缺点:
AOF 模式优点:
数据安全性相对较高,根据所使用的fsync策略(fsync是同步内存中redis所有已经修改的文件到存储设备),默认是appendfsync everysec,即每秒执行一次 fsync,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync会在后台线程执行,所以主线程可以继续努力地处理命令请求)
由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中不需要seek, 即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,可以通过 redis-check-aof 工具来解决数据一致性的问题
Redis可以在 AOF文件体积变得过大时,自动地在后台对AOF进行重写:重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为Redis在创建新 AOF文件的过程中,append模式不断的将修改数据追加到现有的 AOF文件里面,即使重写过程中发生停机,现有的 AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新AOF文件,并开始对新AOF文件进行追加操作。
AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建
AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此 AOF文件的内容非常容易被人读懂,对文件进行分析(parse)也很轻松。导出(export)AOF文件也非常简单:举个例子,如果你不小心执行了FLUSHALL.命令,但只要AOF文件未被重写,那么只要停止服务器,移除 AOF文件末尾的FLUSHAL命令,并重启Redis ,就可以将数据集恢复到 FLUSHALL执行之前的状态。
AOF 模式缺点:
即使有些操作是重复的也会全部记录,AOF 的文件大小要大于 RDB 格式的文件
AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢
根据fsync策略不同,AOF速度可能会慢于RDB
bug 出现的可能性更多
二、master和slave的同步过程
具体主从同步过程如下:
1)从服务器连接主服务器,发送PSYNC命令
2)主服务器接收到PSYNC命令后,开始执行BGSAVE命令生成RDB快照文件并使用缓冲区记录此后执行的所有写命令
3)主服务器BGSAVE执行完后,向所有从服务器发送RDB快照文件,并在发送期间继续记录被执行的写命令
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照至内存
5)主服务器快照发送完毕后,开始向从服务器发送缓冲区中的写命令
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
7)后期同步会先发送自己slave_repl_offset位置,只同步新增加的数据,不再全量同步
三、哨兵的使用和实现机制
1、redis sentinel的实现机制
哨兵(Sentinel) 是一个分布式系统,可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossip protocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master
每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则暂时认为对方已离线,也就是所谓的”主观认为宕机” (主观:是每个成员都具有的独自的而且可能相同也可能不同的意识),英文名称:Subjective Down,简称SDOWN
有主观宕机,对应的有客观宕机。当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN的判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”(客观:是不依赖于某种意识而已经实际存在的一切事物)
通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改相关配置,并开启故障转移(failover)
2、哨兵的实现:
本实验采用了三台机器,这三台机器同时是redis的主从架构,又是哨兵,首先先在这三台机器上”yum install -y redis“,然后进行接下来的试验
[root@MC12-8m ~]# sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 's/^# masterauth .*/masterauth 123456/' -e 's/^# requirepass .*/requirepass 123456/' /etc/redis.conf #所有的节点都要这样子修改配置文件,从节点还要有下面的额外配置修改 [root@MC12-8m ~]# echo "replicaof 10.0.0.26 6379" >> /etc/redis.conf #添加主节点信息 [root@M9-8m ~]# systemctl restart redis #修改完配置文件所有节点全部重启服务 [root@M9-8m ~]# redis-cli -a 123456 info Replication #重启完后主节点就可以这样子看见从节点是否被添加进来了 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:2 #这里的2就表示有两台机器连接进来了,是从节点 slave0:ip=10.0.0.27,port=6379,state=online,offset=126,lag=1 #slave的0和1都表示从节点 slave1:ip=10.0.0.38,port=6379,state=online,offset=126,lag=1 master_replid:b76738c08e2f06b71d587b9ea8fba367ad94a63d master_replid2:0000000000000000000000000000000000000000 master_repl_offset:126 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:126
主从同步到这里就搭建好了,要是不放心可以添加一个key” redis-cli -a 123456 set k1 v1”然后再查看一下是不是同步了” redis-cli -a 123456 info Keyspace”,接下来就是哨兵的搭建了
哨兵是在yum redis的时候就已经被下载来了,如果是二进制安装,那么它会存在于解压的目录下中,它的配置文件为” /etc/sentinel.conf”
Sentinel实际上是一个特殊的redis服务器,有些redis指令支持,但很多指令并不支持.默认监听在26379/tcp端口. 哨兵可以不和Redis服务器部署在一起,但一般部署在一起,因为哨兵服务是随着redis一起下载的,所有redis节点使用相同的以下示例的配置文件
[root@M9-8m ~]# vim /etc/sentinel.conf #配置文件单独改,别scp不然会有哨兵id冲突 sentinel monitor mymaster 10.0.0.26 6379 2 #这一行必须是要在下一行之前,有前后顺序 sentinel auth-pass 10.0.0.8 123456 #这一行默认是注释掉的,需要手动设置 sentinel down-after-milliseconds mymaster 3000 #设置为3秒 [root@M9-8m ~]# grep -vE "^#|^$" /etc/sentinel.conf #这是修改之后的样子 port 26379 daemonize no #编译安装要把这一项改为yes pidfile /var/run/redis-sentinel.pid logfile "redis-sentinel.log" #这个是哨兵的日志,这两项为可选,这里是做了 dir /data/redis/log #这个是哨兵日志的保存位置 sentinel monitor mymaster 10.0.0.26 6379 2 #只要修改这一项和下面一项,其他无所谓 sentinel auth-pass mymaster 123456 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes [root@M9-8m ~]# systemctl enable --now redis-sentinel.service #接下来在所有节点上启动哨兵服务,systemctl是yum安装的,编译安装的话要使用” /data/redis/bin/redis-sentinel /data/redis/etc/sentinel.conf”来启动哨兵服务,切记” daemonize yes”这一项必须为yes,不然就会卡到当前页面上,可以查看一下端口”26379”是否打开了 [root@M9-8m ~]# ss -nutl Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port ...... tcp LISTEN 0 511 0.0.0.0:26379 0.0.0.0:* tcp LISTEN 0 511 0.0.0.0:6379 0.0.0.0:* tcp LISTEN 0 511 [::]:26379 [::]:* [root@M9-8m ~]# redis-cli -a 123456 info Replication #查看哨兵状态 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:2 slave0:ip=10.0.0.27,port=6379,state=online,offset=1878820,lag=0 slave1:ip=10.0.0.38,port=6379,state=online,offset=1878673,lag=1 master_replid:b76738c08e2f06b71d587b9ea8fba367ad94a63d #注意每个哨兵独有,都不一样,别用scp来拷贝配置文件,不然会导致这个id起冲突 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1878820 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:830245 repl_backlog_histlen:1048576 [root@M9-8m ~]# redis-cli -a 123456 -p 26379 #查看哨兵节点信息 # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=10.0.0.26:6379,slaves=2,sentinels=3 #三个哨兵
当可以观察到这三个哨兵的时候,哨兵的搭建就成功了
四、redis cluster集群创建和使用
这里原生命令手动部署redis cluster
[root@MC48 ~]# yum install -y redis #恢复干净快照,在所有机器上将redis下载下来
[root@MC48 ~]# grep "cluster" /etc/redis.conf #接下来要更改配置文件,下面是说明
......
# cluster-enabled yes #这一项位启用集群,默认是注释掉的
......
# cluster-config-file nodes-6379.conf #这一项是将来集群形成之后,会生成的记录,包括集群中的机器有那些,谁是主谁是从,都有多少槽位
......
# cluster-require-full-coverage yes #这一项与集群的安全有关,当集群中任意一个主节点以及它的从节点宕机了,那么集群中的这些槽位就用不了了,会导致整个集群不能工作,这一项的开启,能够确保剩下集群还是可以正常工作,即不影响其他机器的使用,这一项要改为no,默认为yes
......
#接下来是修改配置文件了:(后面有一条命令修改这些配置文件的)
[root@MC58m ~]# sed -in 's/bind 127.0.0.1/bind 0.0.0.0/' /etc/redis.conf
[root@MC58m ~]# sed -in 's/\# masterauth .*/masterauth 123456/' /etc/redis.conf
[root@MC58m ~]# sed -in 's/\# requirepass .*/requirepass 123456/' /etc/redis.conf
[root@MC58m ~]# sed -in 's/\# cluster-enabled yes/cluster-enabled yes/' /etc/redis.conf
[root@MC58m ~]# sed -in 's/\# cluster-config-file nodes-6379.conf/cluster-config-file nodes-6379.conf/' /etc/redis.conf
[root@MC58m ~]# sed -in 's/\# cluster-require-full-coverage yes/cluster-require-full-coverage no/' /etc/redis.conf
#或者使用下面这个命令一条替换
sed -in -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 's/\# masterauth .*/masterauth 123456/' -e 's/\# requirepass foobared/requirepass 123456/' -e 's/\# cluster-enabled yes/cluster-enabled yes/' -e 's/\# cluster-config-file nodes-6379.conf/cluster-config-file nodes-6379.conf/' -e 's/\# cluster-require-full-coverage yes/cluster-require-full-coverage no/' /etc/redis.conf
[root@MC58m ~]# systemctl enable --now redis
[root@MC58m ~]# ss -nutl
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:16379 0.0.0.0:* #集群的端口被打开了
tcp LISTEN 0 128 0.0.0.0:6379 0.0.0.0:*
......
[root@MC58m ~]# ps aux|grep redis
redis 1930 0.1 1.1 53520 5212 ? Ssl 11:13 0:00 /usr/bin/redis-server 0.0.0.0:6379 [cluster] #可以看见和平常的redis不一样了,后面有集群
root 1967 0.0 0.2 12108 1048 pts/0 R+ 11:26 0:00 grep --color=auto redis
#在这种情况下,只是打开了集群,但是redis是无法正常使用的,因为还没有分配槽位等,无法存放数据,不能单机使用
#查看集群的状态信息可以↓(因为还没配集群,所以只有自己本身一个节点的信息)
[root@MC58m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
8baf689a158ee36c79483009c3514de4c6117414 :6379@16379 myself,master - 0 0 0 connected
接下来就是开始使用meet来认识其他集群节点了(meet在任何一个节点上使用都可以,因为这一步只是相互认识,并没有设置主从关系,主从关系在后面有设置)
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.27 6379
OK #这个是在10.0.0.26的机器上做的操作,去meet10.0.0.27
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
020d957d40d3519040c21cb33e78ec4dc59a0738 10.0.0.27:6379@16379 master - 0 1603596870692 1 connected
c744aa43960b3ab479b259b9ffd671580e1922ec 10.0.0.26:6379@16379 myself,master - 0 0 0 connected
#10.0.0.26meet了27的时候,27也会自动的认识了26,如下
[root@MC12-8m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
c744aa43960b3ab479b259b9ffd671580e1922ec 10.0.0.26:6379@16379 master - 0 1603596873245 0 connected
020d957d40d3519040c21cb33e78ec4dc59a0738 10.0.0.27:6379@16379 myself,master - 0 0 1 connected
#接下来只需要重复这个meet操作,当一台节点meet了其他所有节点的时候,其他节点也就会自动的全部都认识了
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.38 6379
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.48 6379
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.58 6379
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.68 6379
#当meet完所有节点之后,去任意一个节点上去查看一下,这个节点是否认识了其他所有的节点(在任意节点都可以看见如下信息)
[root@MC58m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
d4d4dee565b83bc07a79e9229407379abc48bc42 10.0.0.68:6379@16379 master - 0 1603597202000 5 connected
8baf689a158ee36c79483009c3514de4c6117414 10.0.0.58:6379@16379 myself,master - 0 1603597201000 4 connected
020d957d40d3519040c21cb33e78ec4dc59a0738 10.0.0.27:6379@16379 master - 0 1603597203416 1 connected
4080138f7398b06d819ff6e1e14d81052e06d5fd 10.0.0.38:6379@16379 master - 0 1603597200367 2 connected
eccd688b2d93f7a3429890deb9257345c70f39ac 10.0.0.48:6379@16379 master - 0 1603597202409 0 connected
c744aa43960b3ab479b259b9ffd671580e1922ec 10.0.0.26:6379@16379 master - 0 1603597201401 3 connected
#查看节点信息
[root@MC58m ~]# redis-cli -a 123456 --no-auth-warning cluster info
cluster_state:fail #目前的状态为失败状态,因为没有槽位
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6 #可以看见有6个节点
cluster_size:0 #可以看见槽位的分配情况
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_ping_sent:615
cluster_stats_messages_pong_sent:620
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:1236
cluster_stats_messages_ping_received:616
cluster_stats_messages_pong_received:616
cluster_stats_messages_meet_received:4
cluster_stats_messages_received:1236
#集群节点直接相互认识了之后就可以开始分配槽位了。槽位一共有16364个,从0~16363,要分配这么多槽位用原生命令一个槽位一个槽位分配很麻烦,就用脚本来实现(这个脚本中host指定了机器,因此,这个脚本在任意一台机器上都可以执行)
[root@MC58m ~]# vim addslot.sh
#!/bin/bash
host=$1
port=$2
start=$3
end=$4
pass=123456
for slot in `seq ${start} ${end}`;do
echo slot:$slot
redis-cli -h ${host} -p $port -a ${pass} --no-auth-warning cluster addslots ${slot}
done
[root@MC58m ~]# bash addslot.sh 10.0.0.26 6379 0 5460
#分配好第一次槽位之后,到任意一个节点上查看一下槽位的分配情况
[root@MC38m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
020d957d40d3519040c21cb33e78ec4dc59a0738 10.0.0.27:6379@16379 master - 0 1603598652676 1 connected
4080138f7398b06d819ff6e1e14d81052e06d5fd 10.0.0.38:6379@16379 myself,master - 0 1603598650000 2 connected
d4d4dee565b83bc07a79e9229407379abc48bc42 10.0.0.68:6379@16379 master - 0 1603598648647 5 connected
8baf689a158ee36c79483009c3514de4c6117414 10.0.0.58:6379@16379 master - 0 1603598649000 4 connected
eccd688b2d93f7a3429890deb9257345c70f39ac 10.0.0.48:6379@16379 master - 0 1603598649654 0 connected
c744aa43960b3ab479b259b9ffd671580e1922ec 10.0.0.26:6379@16379 master - 0 1603598651667 3 connected 0-5460 #在这里10.0.0.26的槽位就有分配好
[root@MC38m ~]# redis-cli -a 123456 --no-auth-warning cluster info
cluster_state:ok #且这个时候状态就变成ok了,表示已经可以使用了
cluster_slots_assigned:5461
cluster_slots_ok:5461
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:1 #当分配好第一台机器的槽位之后这个地方的数值就变了,说明有一台机器有槽位了
...
#在这里在说一个日志,当槽位分配好了之后,就会自动生成一个日志,这个日志记录的东西就和” redis-cli -a 123456 --no-auth-warning cluster nodes”看到的东西一模一样
[root@MC38m ~]# cat /var/lib/redis/nodes-6379.conf
......
#然后继续分配槽位
[root@MC58m ~]# bash addslot.sh 10.0.0.27 6379 5461 10922
[root@MC58m ~]# bash addslot.sh 10.0.0.38 6379 10923 16383
#槽位分配好了之后就剩最后一步了,设置主从关系。虽然这个时候就已经可以使用服务器了,但是不推荐在这个时候使用服务器
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes #查看节点信息
020d957d40d3519040c21cb33e78ec4dc59a0738 10.0.0.27:6379@16379 master - 0 1603599627000 1 connected 5461-10922
4080138f7398b06d819ff6e1e14d81052e06d5fd 10.0.0.38:6379@16379 master - 0 1603599627623 2 connected 10923-16383
c744aa43960b3ab479b259b9ffd671580e1922ec 10.0.0.26:6379@16379 myself,master - 0 1603599626000 3 connected 0-5460
8baf689a158ee36c79483009c3514de4c6117414 10.0.0.58:6379@16379 master - 0 1603599626616 4 connected
d4d4dee565b83bc07a79e9229407379abc48bc42 10.0.0.68:6379@16379 master - 0 1603599628632 5 connected
eccd688b2d93f7a3429890deb9257345c70f39ac 10.0.0.48:6379@16379 master - 0 1603599626000 0 connected
#在任意一台机器上都能做,登录某一台机器,然后将某个机器的变为自己的主
[root@M9-8m ~]# redis-cli -h 10.0.0.48 -a 123456 --no-auth-warning cluster replicate c744aa43960b3ab479b259b9ffd671580e1922ec
#这个地方注意不是机器的ip地址。接下来再去查看的时候,48的机器就变成从了
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
020d957d40d3519040c21cb33e78ec4dc59a0738 10.0.0.27:6379@16379 master - 0 1603599942217 1 connected 5461-10922
4080138f7398b06d819ff6e1e14d81052e06d5fd 10.0.0.38:6379@16379 master - 0 1603599941209 2 connected 10923-16383
c744aa43960b3ab479b259b9ffd671580e1922ec 10.0.0.26:6379@16379 myself,master - 0 1603599940000 3 connected 0-5460
8baf689a158ee36c79483009c3514de4c6117414 10.0.0.58:6379@16379 master - 0 1603599939193 4 connected
d4d4dee565b83bc07a79e9229407379abc48bc42 10.0.0.68:6379@16379 master - 0 1603599940000 5 connected
eccd688b2d93f7a3429890deb9257345c70f39ac 10.0.0.48:6379@16379 slave c744aa43960b3ab479b259b9ffd671580e1922ec 0 1603599940201 3 connected
#接下来只需要重复两遍这个操作即可
[root@M9-8m ~]# redis-cli -h 10.0.0.58 -a 123456 --no-auth-warning cluster replicate 020d957d40d3519040c21cb33e78ec4dc59a0738
OK
[root@M9-8m ~]# redis-cli -h 10.0.0.68 -a 123456 --no-auth-warning cluster replicate 4080138f7398b06d819ff6e1e14d81052e06d5fd
OK
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
020d957d40d3519040c21cb33e78ec4dc59a0738 10.0.0.27:6379@16379 master - 0 1603600140065 1 connected 5461-10922
4080138f7398b06d819ff6e1e14d81052e06d5fd 10.0.0.38:6379@16379 master - 0 1603600138047 2 connected 10923-16383
c744aa43960b3ab479b259b9ffd671580e1922ec 10.0.0.26:6379@16379 myself,master - 0 1603600138000 3 connected 0-5460
8baf689a158ee36c79483009c3514de4c6117414 10.0.0.58:6379@16379 slave 020d957d40d3519040c21cb33e78ec4dc59a0738 0 1603600137039 4 connected
d4d4dee565b83bc07a79e9229407379abc48bc42 10.0.0.68:6379@16379 slave 4080138f7398b06d819ff6e1e14d81052e06d5fd 0 1603600139054 5 connected
eccd688b2d93f7a3429890deb9257345c70f39ac 10.0.0.48:6379@16379 slave c744aa43960b3ab479b259b9ffd671580e1922ec 0 1603600141071 3 connected
到这里redis cluster就搭建成功了,接下来就可以开始写东西了,写东西时注意使用方式:
[root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning set k1 v1 (error) MOVED 12706 10.0.0.38:6379
#并非错误,而是让你去10.0.0.38的机器上去写入这个数据,因为槽位的问题,根据数据存储到槽位的方式是根据,采用哈希槽 (hash slot)的方式来分配16384个slot 的,因此,这里的报错只是该槽位不在当前机器上,只要去相应的机器上即可。当然,太麻烦了,还是让它自己来帮我们写,如下↓
[root@M9-8m ~]# redis-cli -c -a 123456 --no-auth-warning set k1 v1 OK #查看槽位也是一样的,必须加-c才好 [root@M9-8m ~]# redis-cli -a 123456 --no-auth-warning get k1 (error) MOVED 12706 10.0.0.38:6379 [root@M9-8m ~]# redis-cli -c -a 123456 --no-auth-warning get k1 "v1"
接下来测试一下使用python来往redis中写入key
[root@M9-8m ~]# yum install -y python3
[root@M9-8m ~]# pip3 install redis-py-cluster
[root@M9-8m ~]# vim redis_cluster_test.py #往集群中写入1000个key
#!/usr/bin/env python3
from rediscluster import RedisCluster
startup_nodes = [
{"host":"10.0.0.26", "port":6379},
{"host":"10.0.0.27", "port":6379},
{"host":"10.0.0.38", "port":6379},
{"host":"10.0.0.68", "port":6379},
{"host":"10.0.0.48", "port":6379},
{"host":"10.0.0.58", "port":6379}
]
redis_conn= RedisCluster(startup_nodes=startup_nodes,password='123456', decode_responses=True)
for i in range(0, 10000):
redis_conn.set('key'+str(i),'value'+str(i))
print('key'+str(i)+':',redis_conn.get('key'+str(i)))
[root@M9-8m ~]# chmod +x redis_cluster_test.py
[root@M9-8m ~]# ./redis_cluster_test.py

浙公网安备 33010602011771号