Redis 哨兵高模式搭建及Java代码配置
Redis的下载和安装及遇到问题的解决
准备配置文件
#配置文件进行了精简,完整配置可自行和官方提供的完整conf文件进行对照。端口号自行对应修改 #后台启动的意思 daemonizeyes #端口号 port6380 #IP绑定,redis不建议对公网开放,直接绑定0.0.0.0没毛病 bind0.0.0.0 #redis数据文件存放的目录 dir/usr/local/redis/data #开启AOF appendonlyyes #开启集群 cluster-enabledyes #会自动生成在上面配置的dir目录下 cluster-config-filenodes-6381.conf cluster-node-timeout5000 #这个文件会自动生成 pidfile/var/run/redis_6381.pid
分别准备三个server的配置文件
[root@hadoop-masterconf]#ll|grepredis|grep-v6379 -rw-r--r--1rootroot4897月2814:49redis-6380.conf -rw-r--r--1rootroot5717月2818:09redis-6381.conf -rw-r--r--1rootroot6007月2818:09redis-6382.conf
启动三个server
#使用redis-server命令,并指定配置文件 /mnt/redis/bin/redis-server/mnt/redis/conf/redis-6380.conf /mnt/redis/bin/redis-server/mnt/redis/conf/redis-6381.conf /mnt/redis/bin/redis-server/mnt/redis/conf/redis-6382.conf
配置主从
#通过redis-cli客户端命令将指定端口下的服务作为指定ip端口下的从属节点 /mnt/redis/bin/redis-cli-p6381192.168.16.406380 /mnt/redis/bin/redis-cli-p6382192.168.16.406380 #此时6380为主节点其他节点为从属节点
检查集群是否已经就绪
#此命令可查看redis集群中的server/Clients/memory/persistence/stats #replication/cpu/modules/cluster/keyspace等信息 /mnt/redis/bin/redis-cli-p6380info #通过指定replication获取集群信息 /mnt/redis/bin/redis-cli-p6380inforeplication
redis-cliinfo命令各数值含义对照
#Server redis_version:3.2.0#redis版本 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:85def9ed04ebeee4 redis_mode:cluster#运行模式(standalone,cluster) os:Linux3.0.13-0.27-defaultx86_64#运行系统内核版本 arch_bits:64#字长 multiplexing_api:epoll#Redis使用的事件处理机制 gcc_version:4.3.4#编译Redis时所使用的GCC版本 process_id:26327#Redis进程PID run_id:e833bf79e98daa5b5917c510b4d9f056cfc5059c#Redis服务器的编号(用于集群) tcp_port:7001#监听的端口 uptime_in_seconds:587882#已运行秒数 uptime_in_days:6#已运行天数 hz:10#用于执行后台任务的函数被调用的频率 lru_clock:10570417#用于LRU管理的计时器,单位为分钟 executable:/home/rediscluster/7001/redis/./bin/redis-server#bin文件位置 config_file:/home/rediscluster/7001/redis/./config/redis.conf#配置文件位置 #Clients connected_clients:1#连接的客户端数 client_longest_output_list:0#当前客户端连接中最长的输出列表 client_biggest_input_buf:0#当前客户端连接中最大的输入缓存 blocked_clients:0#阻塞的客户端数 #Memory used_memory:2421816#消耗的内存 used_memory_human:2.31M used_memory_rss:3973120#操作系统分配给Redis的内存 used_memory_rss_human:3.79M used_memory_peak:2421816#内存消耗的峰值 used_memory_peak_human:2.31M total_system_memory:8250241024#系统总内存 total_system_memory_human:7.68G used_memory_lua:37888#Lua脚本消耗的内存 used_memory_lua_human:37.00K maxmemory:0#内存使用限制 maxmemory_human:0B maxmemory_policy:noeviction#超出内存限制时的行为 mem_fragmentation_ratio:1.64#内存碎片率(=used_memory_rss/used_memory) mem_allocator:jemalloc-4.0.3#内存分配器 #Persistence loading:0#是否正在载入持久化文件 rdb_changes_since_last_save:0#上次持久化以来修改的键值数 rdb_bgsave_in_progress:0#是否正在后台保存RDB文件 rdb_last_save_time:1469670746#上次RDB持久化的时间戳 rdb_last_bgsave_status:ok#上次RDB持久化的结果 rdb_last_bgsave_time_sec:0#上次创建RDB文件消耗的秒数 rdb_current_bgsave_time_sec:-1#如果正在创建RDB文件,记录已经消耗了多少时间 aof_enabled:1#是否启用AOF持久化 aof_rewrite_in_progress:0#是否正在重写AOF文件 aof_rewrite_scheduled:0#是否将要重写AOF文件 aof_last_rewrite_time_sec:-1#上次AOF重写消耗的时间 aof_current_rewrite_time_sec:-1#当前AOF重写已消耗的时间 aof_last_bgrewrite_status:ok#上次重写AOF文件的结果 aof_last_write_status:ok#上次写入AOF文件的结果 aof_current_size:54#当前AOF文件的大小 aof_base_size:0#上一个AOF文件的大小 aof_pending_rewrite:0#是否有AOF重写操作在等待RDB文件的创建 aof_buffer_length:0#AOF写入缓冲区大小 aof_rewrite_buffer_length:0#AOF重写缓冲区大小 aof_pending_bio_fsync:0#正在I/O队列中等待的fsync()的数量 aof_delayed_fsync:0#被延迟执行的fsync()的数量 #Stats total_connections_received:9#服务器已接受的连接请求数 total_commands_processed:586729#服务器已经执行的命令数量 instantaneous_ops_per_sec:1#当前每秒执行的命令数量 total_net_input_bytes:22855989#接受的数据包总大小 total_net_output_bytes:849760#发送的数据包总大小 instantaneous_input_kbps:0.05#当前下行速率 instantaneous_output_kbps:0.01#当前上行速率 rejected_connections:0#被拒绝的连接请求数 sync_full:1#主从同步状态 sync_partial_ok:0 sync_partial_err:0 expired_keys:0#过期的键数 evicted_keys:0#因内存达到上限被剔除的键数 keyspace_hits:0#命中key的次数 keyspace_misses:0#未命中的次数 pubsub_channels:0#当前被订阅的频道和模式数 pubsub_patterns:0 latest_fork_usec:640#最后一次fork()消耗的毫秒数 migrate_cached_sockets:0#为节点迁移缓存的TCP连接数 #Replication role:master#主节点还是从节点 connected_slaves:1#已连接的从节点数 slave0:ip=127.0.0.1,port=7004,state=online,offset=821435,lag=1#从节点信息ip端口数据新度等 master_repl_offset:821435#主节点数据新度 repl_backlog_active:1#是否为主从同步启用积压空间 repl_backlog_size:1048576#积压空间大小 repl_backlog_first_byte_offset:2#积压空间开头的数据新度 repl_backlog_histlen:821434#积压空间当前数据量 #CPU used_cpu_sys:255.39#核心态CPU时间 used_cpu_user:257.42#用户态CPU时间 used_cpu_sys_children:0.00#子进程核心态CPU时间 used_cpu_user_children:0.00#子进程用户态CPU时间 #Cluster cluster_enabled:1#是否启用集群 #Keyspace db0:keys=1,expires=0,avg_ttl=0#各数据库的键数、过期键数、数据库中键的平均过期时间戳估测值
准备哨兵配置文件(3个节点)
#配置文件:sentinel.conf,在sentinel运行期间是会被动态修改的 #sentinel如果重启时,根据这个配置来恢复其之前所监控的redis集群的状态 #绑定IP bind0.0.0.0 #后台运行 daemonizeyes #默认yes,没指定密码或者指定IP的情况下,外网无法访问 protected-modeno #哨兵的端口,客户端通过这个端口来发现redis port26380 #哨兵自己的IP,手动设定也可自动发现,用于与其他哨兵通信 #sentinelannounce-ip #临时文件夹 dir"/tmp" #日志 logfile"/mnt/redis/logs/sentinel-26380.log" #sentinel监控的master的名字叫做mymaster,初始地址为192.168.16.406380,2代表两个及以上哨兵认定为死亡,才认为是真的死亡 sentinelmyidfa62676c970da6800e30b28b9cc732e2cee85952 #发送心跳PING来确认master是否存活 #如果master在“一定时间范围”内不回应PONG或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了 sentineldeny-scripts-reconfigyes #如果在该时间(ms)内未能完成failover操作,则认为该failover失败 sentinelmonitormymaster192.168.16.4063812 #指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长 sentineldown-after-millisecondsmymaster1000
增加三个配置文件
[root@hadoop-masterconf]#ll|grepsentinel -rw-r--r--1rootroot19897月2818:09sentinel-26380.conf -rw-r--r--1rootroot19897月2818:09sentinel-26381.conf -rw-r--r--1rootroot19897月2818:09sentinel-26382.conf
启动哨兵节点
#可使用redis-server+sentinel参数启动 /mnt/redis/bin/redis-server/mnt/redis/conf/sentinel-26380.conf--sentinel /mnt/redis/bin/redis-server/mnt/redis/conf/sentinel-26381.conf--sentinel /mnt/redis/bin/redis-server/mnt/redis/conf/sentinel-26382.conf--sentinel #直接使用redis-sentinel启动 /mnt/redis/bin/redis-sentinel/mnt/redis/conf/sentinel-26380.conf /mnt/redis/bin/redis-sentinel/mnt/redis/conf/sentinel-26381.conf /mnt/redis/bin/redis-sentinel/mnt/redis/conf/sentinel-26382.conf
#停掉master,主从切换过程
启动哨兵(客户端通过哨兵发现Redis实例信息)
哨兵通过连接master发现主从集群内的所有实例信息
哨兵监控redis实例的健康状况
哨兵一旦发现master不能正常提供服务,则通知给其他哨兵
当一定数量的哨兵都认为master挂了
选举一个哨兵作为故障转移的执行者
执行者在slave中选取一个作为新的master
将其他slave重新设定为新master的从属
#因为6380的端口是主节点 [root@hadoop-masterbin]#ps-ef|grepredis|grep6380 root303251019:09?00:00:00/mnt/redis/bin/redis-server0.0.0.0:6380 root304151019:10?00:00:01/mnt/redis/bin/redis-sentinel0.0.0.0:26380[sentinel] [root@hadoop-masterbin]#kill-930325
从日志中分析哨兵间的通信及新mater的生成
####################################启动日志####################################### 31551:X28Jul202019:35:23.289#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo 31551:X28Jul202019:35:23.289#Redisversion=6.0.5,bits=64,commit=00000000,modified=0,pid=31551,juststarted 31551:X28Jul202019:35:23.289#Configurationloaded 31552:X28Jul202019:35:23.293*Runningmode=sentinel,port=26380. 31552:X28Jul202019:35:23.293#WARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/somaxconnissettothelowervalueof128. 31552:X28Jul202019:35:23.294#SentinelIDisfa62676c970da6800e30b28b9cc732e2cee85952 31552:X28Jul202019:35:23.294#+monitormastermymaster192.168.16.406380quorum2 31552:X28Jul202019:35:24.344#+sdownsentinel4cabf69629c1401289b6d3d239eba18b45da0041192.168.16.4026381@mymaster192.168.16.406380 31552:X28Jul202019:35:24.345#+sdownsentinel20d8240e06a10cd887b752026c00de0318761eb8192.168.16.4026382@mymaster192.168.16.406380 31552:X28Jul202019:35:26.471#-sdownsentinel4cabf69629c1401289b6d3d239eba18b45da0041192.168.16.4026381@mymaster192.168.16.406380 31552:X28Jul202019:35:29.621#-sdownsentinel20d8240e06a10cd887b752026c00de0318761eb8192.168.16.4026382@mymaster192.168.16.406380 ####################################杀掉主节点之后日志1################################### 31552:X28Jul202019:37:42.950#+sdownmastermymaster192.168.16.406380 31552:X28Jul202019:37:43.018#+new-epoch3 31552:X28Jul202019:37:43.019#+vote-for-leader4cabf69629c1401289b6d3d239eba18b45da00413 31552:X28Jul202019:37:44.023#+odownmastermymaster192.168.16.406380#quorum3/2 31552:X28Jul202019:37:44.023#Nextfailoverdelay:IwillnotstartafailoverbeforeTueJul2819:37:492020 31552:X28Jul202019:37:44.098#+config-update-fromsentinel4cabf69629c1401289b6d3d239eba18b45da0041192.168.16.4026381@mymaster192.168.16.406380 31552:X28Jul202019:37:44.098#+switch-mastermymaster192.168.16.406380192.168.16.406381 31552:X28Jul202019:37:44.098*+slaveslave192.168.16.40:6382192.168.16.406382@mymaster192.168.16.406381 31552:X28Jul202019:37:44.098*+slaveslave192.168.16.40:6380192.168.16.406380@mymaster192.168.16.406381 31552:X28Jul202019:37:45.169#+sdownslave192.168.16.40:6380192.168.16.406380@mymaster192.168.16.406381 ####################################杀掉主节点之后日志2################################### 31557:X28Jul202019:37:42.952#+sdownmastermymaster192.168.16.406380 31557:X28Jul202019:37:43.014#+odownmastermymaster192.168.16.406380#quorum2/2 31557:X28Jul202019:37:43.014#+new-epoch3 31557:X28Jul202019:37:43.014#+try-failovermastermymaster192.168.16.406380 31557:X28Jul202019:37:43.016#+vote-for-leader4cabf69629c1401289b6d3d239eba18b45da00413 31557:X28Jul202019:37:43.019#fa62676c970da6800e30b28b9cc732e2cee85952votedfor4cabf69629c1401289b6d3d239eba18b45da00413 31557:X28Jul202019:37:43.019#20d8240e06a10cd887b752026c00de0318761eb8votedfor4cabf69629c1401289b6d3d239eba18b45da00413 31557:X28Jul202019:37:43.087#+elected-leadermastermymaster192.168.16.406380 31557:X28Jul202019:37:43.087#+failover-state-select-slavemastermymaster192.168.16.406380 31557:X28Jul202019:37:43.140#+selected-slaveslave192.168.16.40:6381192.168.16.406381@mymaster192.168.16.406380 31557:X28Jul202019:37:43.140*+failover-state-send-slaveof-nooneslave192.168.16.40:6381192.168.16.406381@mymaster192.168.16.406380 31557:X28Jul202019:37:43.216*+failover-state-wait-promotionslave192.168.16.40:6381192.168.16.406381@mymaster192.168.16.406380 31557:X28Jul202019:37:44.023#+promoted-slaveslave192.168.16.40:6381192.168.16.406381@mymaster192.168.16.406380 31557:X28Jul202019:37:44.023#+failover-state-reconf-slavesmastermymaster192.168.16.406380 31557:X28Jul202019:37:44.097*+slave-reconf-sentslave192.168.16.40:6382192.168.16.406382@mymaster192.168.16.406380 31557:X28Jul202019:37:45.095*+slave-reconf-inprogslave192.168.16.40:6382192.168.16.406382@mymaster192.168.16.406380 31557:X28Jul202019:37:45.095*+slave-reconf-doneslave192.168.16.40:6382192.168.16.406382@mymaster192.168.16.406380 31557:X28Jul202019:37:45.172#-odownmastermymaster192.168.16.406380 31557:X28Jul202019:37:45.172#+failover-endmastermymaster192.168.16.406380 31557:X28Jul202019:37:45.172#+switch-mastermymaster192.168.16.406380192.168.16.406381 31557:X28Jul202019:37:45.172*+slaveslave192.168.16.40:6382192.168.16.406382@mymaster192.168.16.406381 31557:X28Jul202019:37:45.172*+slaveslave192.168.16.40:6380192.168.16.406380@mymaster192.168.16.406381 31557:X28Jul202019:37:46.226#+sdownslave192.168.16.40:6380192.168.16.406380@mymaster192.168.16.406381 ####################################杀掉主节点之后日志3################################### 31563:X28Jul202019:37:42.970#+sdownmastermymaster192.168.16.406380 31563:X28Jul202019:37:43.018#+new-epoch3 31563:X28Jul202019:37:43.019#+vote-for-leader4cabf69629c1401289b6d3d239eba18b45da00413 31563:X28Jul202019:37:43.023#+odownmastermymaster192.168.16.406380#quorum3/2 31563:X28Jul202019:37:43.023#Nextfailoverdelay:IwillnotstartafailoverbeforeTueJul2819:37:492020 31563:X28Jul202019:37:44.098#+config-update-fromsentinel4cabf69629c1401289b6d3d239eba18b45da0041192.168.16.4026381@mymaster192.168.16.406380 31563:X28Jul202019:37:44.098#+switch-mastermymaster192.168.16.406380192.168.16.406381 31563:X28Jul202019:37:44.098*+slaveslave192.168.16.40:6382192.168.16.406382@mymaster192.168.16.406381 31563:X28Jul202019:37:44.098*+slaveslave192.168.16.40:6380192.168.16.406380@mymaster192.168.16.406381 31563:X28Jul202019:37:45.124#+sdownslave192.168.16.40:6380192.168.16.406380@mymaster192.168.16.406381
哨兵同步pubsub机制发出来的消息
#https://redis.io/topics/sentinel#pubsub-messages +reset-master--当master被重置时. +slave --当检测到一个slave并添加进slave列表时. +failover-state-reconf-slaves --Failover状态变为reconf-slaves状态时 +failover-detected --当failover发生时 +slave-reconf-sent --sentinel发送SLAVEOF命令把它重新配置时 +slave-reconf-inprog --slave被重新配置为另外一个master的slave,但数据复制还未发生时。 +slave-reconf-done --slave被重新配置为另外一个master的slave并且数据复制已经与master同步时。 -dup-sentinel --删除指定master上的冗余sentinel时(当一个sentinel重新启动时,可能会发生这个事件). +sentinel --当master增加了一个sentinel时。 +sdown --进入SDOWN状态时; -sdown --离开SDOWN状态时。 +odown --进入ODOWN状态时。 -odown --离开ODOWN状态时。 +new-epoch --当前配置版本被更新时。 +try-failover --达到failover条件,正等待其他sentinel的选举。 +elected-leader --被选举为去执行failover的时候。 +failover-state-select-slave --开始要选择一个slave当选新master时。 +no-good-slave --没有合适的slave来担当新master +selected-slave --找到了一个适合的slave来担当新master +promoted-slave--确认成功 +failover-state-reconf-slaves--开始对slaves进行reconfig操作 +slave-reconf-sent--向指定的slave发送“slaveof”指令,告知此slave跟随新的master +slave-reconf-inprog--此slave正在执行slaveof+SYNC过程,slave收到“+slave-reconf-sent”之后将会执行slaveof操作 +slave-reconf-done--此slave同步完成,此后leader可以继续下一个slave的reconfig操作 failover-state-send-slaveof-noone --当把选择为新master的slave的身份进行切换的时候。 failover-end-for-timeout --failover由于超时而失败时。 failover-end --failover成功完成,故障转移结束 switch-master --当master的地址发生变化时。通常这是客户端最感兴趣的消息了。 +tilt--进入Tilt模式。
至此,Redis哨兵模式基本上可以健壮运行了。
Java使用哨兵模式
@Configuration publicclassSentinelRedisAppConfig{ @Bean publicLettuceConnectionFactoryredisConnectionFactory(){ System.out.println("使用哨兵版本"); RedisSentinelConfigurationsentinelConfig=newRedisSentinelConfiguration() .master("mymaster") //哨兵地址 .sentinel("192.168.16.40",26380) .sentinel("192.168.16.40",26381) .sentinel("192.168.16.40",26381); returnnewLettuceConnectionFactory(sentinelConfig); } }
到此这篇关于Redis哨兵高模式搭建及Java代码配置的文章就介绍到这了,更多相关Redis哨兵高模式搭建内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!