Loading

Redis--Cluster

Redis集群简介

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。(官网详解

redis集群的架构图:

image

在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。

插槽(slot)可以理解为是一个可以存储两个数值的一个变量这个变量的取值范围是:0-16383。当存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

image

1、集群是如何判断是否有某个节点挂掉

首先要说的是,每一个节点都存有这个集群所有主节点以及从节点的信息。它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。

2、集群进入fail状态的必要条件

  • 某个主节点和所有从节点全部挂掉,我们集群就进入faill状态
  • 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态
  • 如果集群任意master挂掉,且当前master没有slave集群进入fail状态

Redis的投票机制,具体原理如下:

投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。

选举slave的依据依次是:网络连接正常->5秒内回复过INFO命令->10*down-after-milliseconds内与主连接过的->从服务器优先级->复制偏移量->运行id较小的。选出之后通过slaveif no ont将该从服务器升为新主服务器。

通过slaveof ip port命令让其他从服务器复制该信主服务器。最后当旧主重新连接后将其变为新主的从服务器。注意如果客户端与旧主服务器分隔在一起,写入的数据在恢复后由于旧主会复制新主的数据会造成数据丢失。

Redis集群搭建

两台服务器的节点端口分配:10.224.192.194(app1):7001、7002、7003,10.224.192.206(app2):7004、7005、7006

配置文件redis.conf:

port 7001			#修改端口号,从7001到7006
daemonize yes			#后台启动
pidfile /home/redis/redis-cluster/data1/redis-7001.pid		#集成PID文件存放
loglevel notice				#日志等级
logfile "/home/redis/redis-cluster/data1/redis.log"			#日志文件
appendonly yes				#持久化方式
cluster-enabled yes				#开启cluster,去掉注释
cluster-config-file nodes-7001.conf				#自动生成
cluster-node-timeout 15000				#节点通信时间

启动每个redis节点:

[root@app1 src]# ./redis-server /home/redis/redis-cluster/data1/redis.conf

启动redis节点后:

[root@app1 src]# netstat -tlnp |grep redis
tcp        0      0 0.0.0.0:17001               0.0.0.0:*                   LISTEN      7191/./redis-server
tcp        0      0 0.0.0.0:17002               0.0.0.0:*                   LISTEN      7196/./redis-server
tcp        0      0 0.0.0.0:17003               0.0.0.0:*                   LISTEN      7201/./redis-server
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      7191/./redis-server
tcp        0      0 0.0.0.0:7002                0.0.0.0:*                   LISTEN      7196/./redis-server
tcp        0      0 0.0.0.0:7003                0.0.0.0:*                   LISTEN      7201/./redis-server

[root@app2 src]# netstat -tulnp |grep redis
tcp        0      0 0.0.0.0:17004               0.0.0.0:*                   LISTEN      16099/./redis-serve
tcp        0      0 0.0.0.0:17005               0.0.0.0:*                   LISTEN      16104/./redis-serve
tcp        0      0 0.0.0.0:17006               0.0.0.0:*                   LISTEN      16145/./redis-serve
tcp        0      0 0.0.0.0:7004                0.0.0.0:*                   LISTEN      16099/./redis-serve
tcp        0      0 0.0.0.0:7005                0.0.0.0:*                   LISTEN      16104/./redis-serve
tcp        0      0 0.0.0.0:7006                0.0.0.0:*                   LISTEN      16145/./redis-serve

将节点加入redis-cluster:

[root@app1 src]# ./redis-cli --cluster create 10.224.192.194:7001 10.224.192.194:7002 10.224.192.194:7003 10.224.192.206:7004 10.224.192.206:7005 10.224.192.206:7006 --cluster-replicas 1

或者采用其它的方式:

#创建redis集群(只有三个master节点)
[root@app1 src]# ./redis-cli --cluster create 10.224.192.194:7001 10.224.192.194:7002 10.224.192.194:7003

#将10.224.192.194:7004节点加入到10.224.192.194:7001集群中,作为此master id(dc2af674448729219678cd0a97f07441178958a2)节点的从节点,如果不加master id,则随机分配。
[root@app1 src]# ./redis-cli --cluster add-node 10.224.192.194:7004 10.224.192.194:7001 --cluster-slave --cluster-master-id dc2af674448729219678cd0a97f07441178958a2

连接到app1的7001节点:

[root@app1 src]# ./redis-cli -h 10.224.192.194 -p 7001 -a qwer
10.224.192.194:7001> INFO [section]

Redis INFO:

# Server
redis_version:5.0.9											#redis 版本
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:c2153235e2964534
redis_mode:cluster
os:Linux 2.6.32-696.el6.x86_64 x86_64						#运行系统内核版本
arch_bits:64												#系统
multiplexing_api:epoll										#redis的事件循环机制
atomicvar_api:sync-builtin
gcc_version:4.4.7											#GCC版本号
process_id:7191												#redis当前进程号
run_id:3f465afebb6c6cb7f3745e5e3fe01474544bfdc4
tcp_port:7001
uptime_in_seconds:605372									#运行时间(秒)
uptime_in_days:7											#运行时间(天)
hz:10
configured_hz:10
lru_clock:8115510
executable:/home/redis/src/./redis-server
config_file:/home/redis/redis-cluster/data1/redis.conf		#配置文件路径
# Clients
connected_clients:1					#客户端连接数
client_recent_max_input_buffer:2			#当前客户端最大输出列表
client_recent_max_output_buffer:0			#当前客户端最大输入列表
blocked_clients:0				#被阻塞的客户端数
# Memory
used_memory:1578296				#使用内存B
used_memory_human:1.51M					#使用内存MB
used_memory_rss:3833856					#使用内存总量(包括碎片)
used_memory_rss_human:3.66M
used_memory_peak:2690160				#使用内存最高峰B
used_memory_peak_human:2.57M			#使用内存最高峰MB
used_memory_peak_perc:58.67%
used_memory_overhead:1499640
used_memory_startup:1449760
used_memory_dataset:78656
used_memory_dataset_perc:61.19%
allocator_allocated:1642792
allocator_active:1859584
allocator_resident:5398528
total_system_memory:16858718208
total_system_memory_human:15.70G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.13
allocator_frag_bytes:216792
allocator_rss_ratio:2.90
allocator_rss_bytes:3538944
rss_overhead_ratio:0.71
rss_overhead_bytes:-1564672
mem_fragmentation_ratio:2.50
mem_fragmentation_bytes:2297808
mem_not_counted_for_evict:114
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:114
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0
# Stats
total_connections_received:494226			#总计连接请求
total_commands_processed:107427				#总结执行命令
instantaneous_ops_per_sec:0				#每秒执行个数
total_net_input_bytes:82256300
total_net_output_bytes:84286476
instantaneous_input_kbps:0.19
instantaneous_output_kbps:0.21
rejected_connections:0					#因最大客户端限制而被拒绝连接的个数
sync_full:1
sync_partial_ok:0
sync_partial_err:1
expired_keys:0				#总过期key数量
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:1
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:337
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
# Replication
role:master					#角色,这里为master
connected_slaves:0				#有几个连接的slvae
master_replid:2a1fce68790a3f90a934f11523b52fcfc8f3d6fe		#master副本ID
master_replid2:0000000000000000000000000000000000000000		#master只有一个副本
master_repl_offset:150459
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:150459

# CPU
used_cpu_sys:364.685559				#redis server的sys cpu使用率
used_cpu_user:451.414374			#redis server的user cpu使用率
used_cpu_sys_children:0.001999				#后台进程的sys cpu使用率
used_cpu_user_children:0.000000					#后台进程的user cpu使用率

# Cluster
cluster_enabled:1				#集群enabled

# Keyspace
db0:keys=1,expires=0,avg_ttl=0				#db0数据库,一共有多少个key,过期key,带生存期的key数量
posted @ 2021-08-20 17:17  Fong777  阅读(170)  评论(0)    收藏  举报