redis主从复制--哨兵--集群
redis 主从复制配置架构
--https://www.cnblogs.com/pyyu/p/9718679.html
redis主从复制
-
通过redis.conf 支持多实例的数据库功能
-
创建多个配置文件 一主两从 架构
-
redis-6379.conf (主库)
port 6379 # 指定启动端口 daemonize yes # 后台运行
-
redis-6380.conf (从库)
port 6380 # 指定启动端口 daemonize yes # 后台运行 slaveof 127.0.0.1 6379 # 指定主库ip端口
-
redis-6381.conf (从库)
port 6381 # 指定启动端口 daemonize yes # 后台运行 slaveof 127.0.0.1 6379 # 指定主库ip端口
-
-
查看状态
- 主库
127.0.0.1:6379> INFO replication
[root@mrcarzy-pc redisconf]# redis-cli -p 6379 info replication
[root@mrcarzy-pc redisconf]# redis-cli -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=2242,lag=0 slave1:ip=127.0.0.1,port=6381,state=online,offset=2242,lag=0 master_replid:d59da86065ab4cbb450b12ca0e17eca09b3aa486 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2242 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2242
- 从库
[root@mrcarzy-pc redisconf]# redis-cli -p 6380 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:2368 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d59da86065ab4cbb450b12ca0e17eca09b3aa486 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2368 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2368
如果主从复制架构故障,master宕机
手动切换故障
- 命令杀死主库
kill -9
-
2个从库功能都还尚好,数据也在,第一步应该数据持久化,防止数据丢失
-
6380 6381 两个从库还活着,登录某一个数据,进行持久化,建立6380是主库,6381是新的从库
更改 6380 库为主库
save
SLAVEOF no one
[root@mrcarzy-pc redisconf]# redis-cli -p 6380
127.0.0.1:6380> save
OK
127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:48199a8324b6bc6a6645e86601e140221d44cf71
master_replid2:d59da86065ab4cbb450b12ca0e17eca09b3aa486
master_repl_offset:2872
second_repl_offset:2873
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2872
-
更改 6381 库为新的从库
SLAVEOF 127.0.0.1 6380
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK 127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:2886 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:48199a8324b6bc6a6645e86601e140221d44cf71 master_replid2:d59da86065ab4cbb450b12ca0e17eca09b3aa486 master_repl_offset:2886 second_repl_offset:2873 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2886
自动切换故障 sentinel ( 哨兵 )
Redis-Sentinel是redis官方推荐的高可用性解决方案,
当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能。
而redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群,
自动发现master宕机,进行自动切换slave > master。
-
sentinel主要功能如下:
- 不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识
- 如果被标识的是主节点,sentinel就会和其他的sentinel节点“协商”,如果其他节点也人为主节点不可达,就会选举一个sentinel节点来完成自动故障转义
- 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
-
环境准备,三个redis哨兵(保安)配置文件 ,3个redis数据库配置文件
三个redis数据库之间是端口的区分,和slaveof参数的区分 [root@mrcarzy-pc redisconf]# ll -rw-r--r-- 1 root root 28 Apr 20 19:52 redis-6379.conf -rw-r--r-- 1 root root 50 Apr 20 19:53 redis-6380.conf -rw-r--r-- 1 root root 51 Apr 20 19:54 redis-6381.conf 三个哨兵配置一模一样,仅仅是端口的区分 -rw-r--r-- 1 root root 0 Apr 20 19:51 redis-sentinel-26379.conf -rw-r--r-- 1 root root 0 Apr 20 19:51 redis-sentinel-26380.conf -rw-r--r-- 1 root root 0 Apr 20 19:51 redis-sentinel-26381.conf
写入配置文件
-
redis-6379.conf (主库)
port 6379 daemonize yes
redis-6380.conf (从库)
port 6380 daemonize yes slaveof 127.0.0.1 6379
redis-6381.conf (从库)
- 使用全局替换
[root@mrcarzy-pc redisconf]# sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf
port 6381 daemonize yes slaveof 127.0.0.1 6379
-
redis-sentinel-26379.conf配置文件写入如下信息
手动创建 数据文件夹
mkdir -p /var/redis/data/
// Sentinel节点的端口 port 26379 dir /var/redis/data/ logfile "26379.log" daemonize yes # 后台运行 // 当前Sentinel节点监控 192.168.119.10:6379 这个主节点 // 2代表判断主节点失败至少需要2个Sentinel节点节点同意 // mymaster是主节点的别名 sentinel monitor mymaster 127.0.0.1 6379 2 //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达 sentinel down-after-milliseconds mymaster 30000 //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点, 原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1 sentinel parallel-syncs mymaster 1 //故障转移超时时间为180000毫秒 sentinel failover-timeout mymaster 180000
-
redis-sentinel-26380.conf 配置文件
sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
-
redis-sentinel-26381.conf 配置文件
sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf [root@mrcarzy-pc redisconf]# cat redis-sentinel-26381.conf rt 26381 dir /var/redis/data/ logfile "26381.log" daemonize yes sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
运行三个 哨兵
[root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26379.conf [root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26380.conf [root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26381.conf
此时查看配置文件 是否成功
[root@mrcarzy-pc redisconf]# cat redis-sentinel-26379.conf port 26379 dir "/var/redis/data" logfile "26379.log" sentinel myid 53ac9e9a246c54c11d6c92aa862c58a5c9f5dcd8 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 daemonize yes # Generated by CONFIG REWRITE sentinel known-slave mymaster 127.0.0.1 6380 sentinel known-slave mymaster 127.0.0.1 6381 sentinel known-sentinel mymaster 127.0.0.1 26380 618de2b19912ba8e444ad6e587885c73c440b826 sentinel known-sentinel mymaster 127.0.0.1 26381 5d36281121910c88cc87f67719e0c75e6ef515d0 sentinel current-epoch 0
测试
- 演示故障 杀死主库
kill -9 主库PID
30秒后自动变化
[root@mrcarzy-pc redisconf]# cat redis-6381.conf port 6381 daemonize yes # Generated by CONFIG REWRITE dir "/opt/redisconf"
- 重新启动 6379 后
[root@mrcarzy-pc redisconf]# redis-cli -p 6381 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=138576,lag=0 slave1:ip=127.0.0.1,port=6379,state=online,offset=138310,lag=0 master_replid:96f2514d0e655f7121a4d58428e82c80b677672c master_replid2:1c92f73ca5eebf54f7a08a827d5370f88b99b120 master_repl_offset:138576 second_repl_offset:91379 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:138576
- 演示故障 杀死主库
-
redis 集群
环境准备
-
至少需要六个 redis 节点 六个配置文件
-
配置 在 /opt/rediscluster/ 目录下
[root@mrcarzy-pc rediscluster]# ll total 28 -rw-r--r--. 1 root root 181 May 10 22:30 redis-7000.conf -rw-r--r--. 1 root root 181 May 10 22:31 redis-7001.conf -rw-r--r--. 1 root root 181 May 10 22:31 redis-7002.conf -rw-r--r--. 1 root root 181 May 10 22:32 redis-7003.conf -rw-r--r--. 1 root root 181 May 10 22:32 redis-7004.conf -rw-r--r--. 1 root root 181 May 10 22:32 redis-7005.conf
配置如下 需要根据文件名更改对应的端口号
- 确保文件路径
mkdir -p /opt/redis/data
port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #开启集群模式 cluster-config-file nodes-7000.conf #集群内部的配置文件 cluster-require-full-coverage no #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
使用
sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf
命令快速创建文件 - 确保文件路径
-
启动 六个 redis 节点
[root@mrcarzy-pc rediscluster]# redis-server redis-7000.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7001.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7002.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7003.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7004.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7005.conf
准备 ruby 环境
-
安装ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz #安装ruby tar -xvf ruby-2.3.1.tar.gz ./configure --prefix=/opt/ruby231/ make && make install # 配置环境变量 vim /etc/profile source /etc/profile
-
安装ruby gem 包管理工具
wget http://rubygems.org/downloads/redis-3.3.0.gem [root@mrcarzy-pc opt]# gem install -l redis-3.3.0.gem #查看gem有哪些包 gem list -- check redis gem
-
安装 redis-trib.rb 脚本
[root@mrcarzy-pc opt]# find /opt/ -name redis-trib.rb /opt/redis-4.0.10/src/redis-trib.rb
-
开启集群
[root@mrcarzy-pc opt]# /opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 Adding replica 127.0.0.1:7004 to 127.0.0.1:7000 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7003 to 127.0.0.1:7002 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: fc017020a99e6af623b3c0718e2d402794b93a61 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: 83bea3b50fd3308ef80c33f132b9cd4331e7dbbe 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: 1cb509c18550215502cac929de166d5949acd2e0 127.0.0.1:7002 slots:10923-16383 (5461 slots) master S: ebb04c8a8cb8a04369da0292ef151160d3ad37d2 127.0.0.1:7003 replicates 83bea3b50fd3308ef80c33f132b9cd4331e7dbbe S: c90340015d1f2e53097ae35b7e40e54080767f85 127.0.0.1:7004 replicates 1cb509c18550215502cac929de166d5949acd2e0 S: 23436a5e09055815a08430ae22500c7474b5ddd8 127.0.0.1:7005 replicates fc017020a99e6af623b3c0718e2d402794b93a61 Can I set the above configuration? (type 'yes' to accept):
输入 yes
-
使用 (自动切换 -c 参数)
- 测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数
[root@mrcarzy-pc opt]# redis-cli -p 7000 -c 127.0.0.1:7000> set name zhangfei -> Redirected to slot [5798] located at 127.0.0.1:7001 OK 127.0.0.1:7001>
-
查看集群状态
[root@mrcarzy-pc opt]# redis-cli -p 7000 cluster info 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:569 cluster_stats_messages_pong_sent:551 cluster_stats_messages_sent:1120 cluster_stats_messages_ping_received:546 cluster_stats_messages_pong_received:569 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:1120
工作原理:
- redis客户端任意访问一个redis实例,如果数据不在该实例中,通过重定向引导客户端访问所需要的redis实例