REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
# 删除旧的,避免配置干扰 rm -rf 7001 7002 7003 # 创建目录 mkdir 7001 7002 7003 8001 8002 8003
准备一个新的redis.conf文件,内容如下:
port 6379 # 开启集群功能 cluster-enabled yes # 集群的配置文件名称,不需要我们创建,由redis自己维护 cluster-config-file /root/redis/6379/nodes.conf # 节点心跳失败的超时时间 cluster-node-timeout 5000 # 持久化文件存放目录 dir /root/redis/6379 # 绑定地址 bind 0.0.0.0 # 让redis后台运行 daemonize yes # 注册的实例ip replica-announce-ip 192.168.3.22 # 保护模式 protected-mode no # 数据库数量 databases 1 # 日志 logfile /root/redis/6379/run.log
将这个文件拷贝到每个目录下:
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
启动服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server /root/redis/{}/redis.conf ps -ef | grep redis
关闭所有进程,可以执行命令:
ps -ef | grep redis | awk '{print $2}' | xargs kill # 或者(推荐这种方式) printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown
Redis5.0以后,集群管理以及集成到了redis-cli中,格式如下:
redis-cli --cluster create --cluster-replicas 1 192.168.3.22:7001 192.168.3.22:7002 192.168.3.22:7003 192.168.3.22:8001 192.168.3.22:8002 192.168.3.22:8003
命令说明:
- `redis-cli --cluster`:代表集群操作命令
- `create`:代表是创建集群
- `--replicas 1`或者`--cluster-replicas 1` :指定集群中每个master的副本个数为1,此时`节点总数 ÷ (replicas + 1)` 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master。
输出内容为redis即将分配的节点信息,输入yes进行下一步
>>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.3.22:8002 to 192.168.3.22:7001 Adding replica 192.168.3.22:8003 to 192.168.3.22:7002 Adding replica 192.168.3.22:8001 to 192.168.3.22:7003 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: e332154d4c091ebe757e32931e03d11c3005a342 192.168.3.22:7001 slots:[0-5460] (5461 slots) master M: 454222018bec479ffc33209296287ad95cbd8f30 192.168.3.22:7002 slots:[5461-10922] (5462 slots) master M: 248616ebb7959cda67dc975282ee81c56eb26d18 192.168.3.22:7003 slots:[10923-16383] (5461 slots) master S: 0e4edb04379ca7fd152c89de72229ebb77030673 192.168.3.22:8001 replicates e332154d4c091ebe757e32931e03d11c3005a342 S: c757128a130008a4d92a47322b48ca9745613ecb 192.168.3.22:8002 replicates 454222018bec479ffc33209296287ad95cbd8f30 S: 431d6bc41d9a105720d338dec227835d556d22b2 192.168.3.22:8003 replicates 248616ebb7959cda67dc975282ee81c56eb26d18 Can I set the above configuration? (type 'yes' to accept):
然后看到redis的插槽分配情况
>>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join . >>> Performing Cluster Check (using node 192.168.3.22:7001) M: e332154d4c091ebe757e32931e03d11c3005a342 192.168.3.22:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 431d6bc41d9a105720d338dec227835d556d22b2 192.168.3.22:8003 slots: (0 slots) slave replicates 248616ebb7959cda67dc975282ee81c56eb26d18 M: 454222018bec479ffc33209296287ad95cbd8f30 192.168.3.22:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: c757128a130008a4d92a47322b48ca9745613ecb 192.168.3.22:8002 slots: (0 slots) slave replicates 454222018bec479ffc33209296287ad95cbd8f30 S: 0e4edb04379ca7fd152c89de72229ebb77030673 192.168.3.22:8001 slots: (0 slots) slave replicates e332154d4c091ebe757e32931e03d11c3005a342 M: 248616ebb7959cda67dc975282ee81c56eb26d18 192.168.3.22:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
查看集群状态
redis-cli -p 7001 cluster nodes
输出:
431d6bc41d9a105720d338dec227835d556d22b2 192.168.3.22:8003@18003 slave 248616ebb7959cda67dc975282ee81c56eb26d18 0 1643112653189 3 connected e332154d4c091ebe757e32931e03d11c3005a342 192.168.3.22:7001@17001 myself,master - 0 1643112651000 1 connected 0-5460 454222018bec479ffc33209296287ad95cbd8f30 192.168.3.22:7002@17002 master - 0 1643112653081 2 connected 5461-10922 c757128a130008a4d92a47322b48ca9745613ecb 192.168.3.22:8002@18002 slave 454222018bec479ffc33209296287ad95cbd8f30 0 1643112654273 2 connected 0e4edb04379ca7fd152c89de72229ebb77030673 192.168.3.22:8001@18001 slave e332154d4c091ebe757e32931e03d11c3005a342 0 1643112652111 1 connected 248616ebb7959cda67dc975282ee81c56eb26d18 192.168.3.22:7003@17003 master - 0 1643112653000 3 connected 10923-16383
集群操作时,需要给`redis-cli`加上`-c`参数才可以
redis-cli -c -p 7001
当我们放入一个值时,控制台会自动切换到存放值的节点,比如:
[root@localhost redis]# redis-cli -c -p 7001 127.0.0.1:7001> set z z -> Redirected to slot [8157] located at 192.168.3.22:7002 OK 192.168.3.22:7002>
可以看到因为这个值放入到7002了,所以控制台也跟着进行了切换。
集群时无需再进行配置哨兵模式,集群会进行自动故障转移
如下7002停机时8002上升为master,7002启动后自动添加为8002的从节点
监控节点状态:
watch redis-cli -p 7001 cluster nodes
新开窗口执行7002的停机和重新启动
Java小强
未曾清贫难成人,不经打击老天真。
自古英雄出炼狱,从来富贵入凡尘。
发表评论: