摘要
redis单节点、主从、哨兵、集群的构建过程,及其配置文件的说明
本文基于redis-5.0.14
redis安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 wget https://download.redis.io/releases/redis-5.0.14.tar.gz tar -zxvf redis-5.0.14.tar.gz sudo yum install gcc cd redis-5.0.14make mv redis.conf redis-6379.confvim redis-6379.conf mkdir -p /usr/local/soft/dir-redis5/6379src/redis-server redis-6379.conf export PATH=$PATH :/usr/local/soft/redis-5.0.14/srcalias redis-start="redis-server /usr/local/soft/redis-5.0.14/redis-6379.conf" alias redis-stop="pkill redis-server"
config命令设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 127.0.0.1:6379> config get slow* 1) "slowlog-log-slower-than" 2) "10000" 3) "slowlog-max-len" 4) "128" 127.0.0.1:6379> config set slowlog-max-len 1024 OK 127.0.0.1:6379> config rewrite OK
单节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 port 6379 daemonize yes protected-mode no dir /usr/local/soft/dir-redis5/6379appendonly yes appendfilename "6379-appendonly.aof" appendfsync everysec auto-aof-rewrite-min-size 64mb auto-aof-rewrite-percentage 100 aof-use-rdb-preamble yes pidfile /usr/local/soft/dir-redis5/6379/redis_6379.pid logfile "6379.log" maxmemory 4294967296 maxmemory-policy volatile-lru slowlog-log-slower-than 10000 slowlog-max-len 1024 requirepass "password" masterauth "password"
单节点优点
单节点缺点
不保证数据的可靠性,不适用于数据可靠性要求高的场景
单点故障导致无法提供服务,或者硬盘损坏导致数据丢失
redis单节点最大qps为10w(取决于单核cpu的处理能力),超过这个qps就需要做前端限流
主从
1 2 3 4 5 6 7 8 9 10 11 12 13 14 port 6380 pidfile /usr/local/soft/dir-redis5/6380/redis_6380.pid logfile "6380.log" dir /usr/local/soft/dir-redis5/6380appendfilename "6380-appendonly.aof"
1 2 3 4 5 6 7 8 replicaof 10.250.0.103 6379 replica-read-only yes masterauth "password"
此时启动从节点src/redis-server redis-6379.conf
,会自动从主节点同步数据,同步前如果从节点已经有数据,则会先清除原有数据再进行同步
主节点接收到从节点的同步请求后,会通过bgsave将内存数据dump到rdb文件中并传递给从节点
主节点生成rdb文件并传递给从节点期间会继续处理客户端的请求,并将这部分数据缓存到内存中,待从节点接收到主节点发过来的rdb文件并完成内存加载后,主节点会将这部分缓存在内存中的数据发送给从节点
从节点相当于主节点的备份,主节点挂了,从节点不能自动切换为主节点,如果需要自动切换,可以使用哨兵或者集群部署方式
此时登录redis执行info
命令可以在Replication
中查看到主从配置信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 master: role:master connected_slaves:1 slave0:ip=10.250.0.217,port=6379,state=online,offset=770728,lag=1 master_replid:23d3f04c39a91dbef52f03c57179932b6d189719 master_replid2:0af821e669f22c03e624d91f6bb88671c9085591 master_repl_offset:770728 second_repl_offset:147042 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:114822 repl_backlog_histlen:655907 slave: role:slave master_host:10.250.0.103 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:788994 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:23d3f04c39a91dbef52f03c57179932b6d189719 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:788994 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:149845 repl_backlog_histlen:639150
主从优点
对请求进行读写分离,提高处理效率
可以提供多个副本,提高数据安全性
主从缺点
哨兵
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 port 26379 daemonize yes pidfile /usr/local/soft/dir-redis5/redis-sentinel.pid logfile "sentinel.log" dir /usr/local/soft/dir-redissentinel monitor mymaster 10.250.0.103 6379 2 sentinel auth-pass mymaster "password"
1 2 3 4 5 6 7 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.250.0.103:6379,slaves=1,sentinels=2
1 2 3 sentinel known-replica mymaster 10.250.0.217 6379 sentinel known-sentinel mymaster 10.250.0.189 26379 228936dfc6bb7a0fafb6a1503330887a94fff478 sentinel known-sentinel mymaster 10.250.0.190 26379 228936dfc6bb7a0fafb6a1503330887a94fff478
哨兵优点
哨兵缺点
集群
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 port 6379 dir /usr/local/soft/dir-redis5/6379requirepass "password" masterauth "password" cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 min-replicas-to-write 1 cluster-require-full-coverage yes
1 src/redis-server redis.conf
1 redis-cli -a password --cluster create --cluster-replicas 1 10.250.0.67:6379 10.250.0.170:6379 10.250.0.114:6379 10.250.0.110:6379 10.250.0.244:6379 10.250.0.206:6379
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 10.250.0.244:6379 to 10.250.0.67:6379 Adding replica 10.250.0.206:6379 to 10.250.0.170:6379 Adding replica 10.250.0.110:6379 to 10.250.0.114:6379 M: df05843701533a368831b4d414a867e8350e8ad6 10.250.0.67:6379 slots:[0-5460] (5461 slots) master M: 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 10.250.0.170:6379 slots:[5461-10922] (5462 slots) master M: 35ca216e53df5fac37c3996059b19b443ed19e78 10.250.0.114:6379 slots:[10923-16383] (5461 slots) master S: 87509b2809a6c1645416ba03f54ee8a61293bac9 10.250.0.110:6379 replicates 35ca216e53df5fac37c3996059b19b443ed19e78 S: 812b99df229ca9143ae72c4447ab4e889f1af113 10.250.0.244:6379 replicates df05843701533a368831b4d414a867e8350e8ad6 S: 80e8dcb95905a2c25d8bbb0290e77aa0ca37aa56 10.250.0.206:6379 replicates 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b Can I set the above configuration? (type 'yes' to accept): yes >>> 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 10.250.0.67:6379) M: df05843701533a368831b4d414a867e8350e8ad6 10.250.0.67:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 10.250.0.170:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 80e8dcb95905a2c25d8bbb0290e77aa0ca37aa56 10.250.0.206:6379 slots: (0 slots) slave replicates 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b M: 35ca216e53df5fac37c3996059b19b443ed19e78 10.250.0.114:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 812b99df229ca9143ae72c4447ab4e889f1af113 10.250.0.244:6379 slots: (0 slots) slave replicates df05843701533a368831b4d414a867e8350e8ad6 S: 87509b2809a6c1645416ba03f54ee8a61293bac9 10.250.0.110:6379 slots: (0 slots) slave replicates 35ca216e53df5fac37c3996059b19b443ed19e78 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
1 2 src/redis-cli -c -h 10.250.0.67 -p 6379 -a password
cluster info
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:147 cluster_stats_messages_pong_sent:156 cluster_stats_messages_sent:303 cluster_stats_messages_ping_received:151 cluster_stats_messages_pong_received:147 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:303
cluster nodes
1 2 3 4 5 6 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 10.250.0.170:6379@16379 master - 0 1662724614912 2 connected 5461-10922 80e8dcb95905a2c25d8bbb0290e77aa0ca37aa56 10.250.0.206:6379@16379 slave 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 0 1662724615000 6 connected 35ca216e53df5fac37c3996059b19b443ed19e78 10.250.0.114:6379@16379 master - 0 1662724613000 3 connected 10923-16383 df05843701533a368831b4d414a867e8350e8ad6 10.250.0.67:6379@16379 myself,master - 0 1662724614000 1 connected 0-5460 812b99df229ca9143ae72c4447ab4e889f1af113 10.250.0.244:6379@16379 slave df05843701533a368831b4d414a867e8350e8ad6 0 1662724613910 5 connected 87509b2809a6c1645416ba03f54ee8a61293bac9 10.250.0.110:6379@16379 slave 35ca216e53df5fac37c3996059b19b443ed19e78 0 1662724615914 4 connected
此时查看nodes-6379.conf
也会看到和上面一样的节点信息
1 2 3 4 5 6 7 10.250.0.206:6379> cluster nodes 87509b2809a6c1645416ba03f54ee8a61293bac9 10.250.0.110:6379@16379 slave 35ca216e53df5fac37c3996059b19b443ed19e78 0 1662780661815 4 connected 80e8dcb95905a2c25d8bbb0290e77aa0ca37aa56 10.250.0.206:6379@16379 myself,slave 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 0 1662780661000 6 connected df05843701533a368831b4d414a867e8350e8ad6 10.250.0.67:6379@16379 master,fail - 1662780649679 1662780648000 1 connected 812b99df229ca9143ae72c4447ab4e889f1af113 10.250.0.244:6379@16379 master - 0 1662780661000 7 connected 0-5460 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 10.250.0.170:6379@16379 master - 0 1662780661000 2 connected 5461-10922 35ca216e53df5fac37c3996059b19b443ed19e78 10.250.0.114:6379@16379 master - 0 1662780662000 3 connected 10923-16383
1 2 3 4 5 6 7 10.250.0.206:6379> cluster nodes 87509b2809a6c1645416ba03f54ee8a61293bac9 10.250.0.110:6379@16379 slave 35ca216e53df5fac37c3996059b19b443ed19e78 0 1662781012000 4 connected 80e8dcb95905a2c25d8bbb0290e77aa0ca37aa56 10.250.0.206:6379@16379 myself,slave 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 0 1662781012000 6 connected df05843701533a368831b4d414a867e8350e8ad6 10.250.0.67:6379@16379 slave 812b99df229ca9143ae72c4447ab4e889f1af113 0 1662781013708 7 connected 812b99df229ca9143ae72c4447ab4e889f1af113 10.250.0.244:6379@16379 master - 0 1662781011000 7 connected 0-5460 0beec83cd2788e35f3b373aad8c60fb5f0f17a3b 10.250.0.170:6379@16379 master - 0 1662781012706 2 connected 5461-10922 35ca216e53df5fac37c3996059b19b443ed19e78 10.250.0.114:6379@16379 master - 0 1662781012000 3 connected 10923-16383
1 2 3 4 5 6 HASH_SLOT=CRC16(key) mod 16384 10.250.0.206:6379> set name zhangsan -> Redirected to slot [5798] located at 10.250.0.170:6379 OK
1 src/redis-cli -c -h 10.250.0.67 -p 6379 -a password shutdown
1 src/redis-server redis.conf
1 2 3 4 5 6 7 8 9 10 10.250.0.170:6379> mset name1 lisi name2 wangwu (error) CROSSSLOT Keys in request don't hash to the same slot 10.250.0.170:6379> mset {user}:name1 lisi {user}:name2 wangwu OK 10.250.0.206:6379> mget {user}:name1 {user}:name2 -> Redirected to slot [5474] located at 10.250.0.170:6379 1) "lisi" 2) "wangwu"
集群推举新的master时要求至少一半的master同意,所以一个集群至少需要3个master,官方推荐master节点数为奇数,比如3个和4个master节点,都至多允许一个master节点挂掉时进行选主,但是3个master可以节省资源
集群通过10000+port
这个端口号进行集群间通信,所以除了要开放prot
这个端口,还要开放10000+port
这个端口
有关redis集群及其水平扩展的进一步说明,可以参看Redis集群
集群优点
集群缺点
数据通过异步复制,不保证数据的强一致性
不支持多数据库空间,单机下的redis可以支持到16个数据库,集群模式下只能使用1个数据库空间,即db 0
不支持跨slot操作,如使用mset、mget目前只支持具有相同slot值的Key执行批量操作
Key作为数据分区的最小粒度,不能将一个很大的键值对象如hash、list等映射到不同的节点
Key事务操作支持有限,只支持多key在同一节点上的事务操作,当多个Key分布于不同的节点上时无法使用事务功能
不建议使用pipeline和multi-keys操作