一 概况
1 redis集群类型
在 Web 服务器中,高可用 是指服务器可以 正常访问 的时间,衡量的标准是在 多长时间 内可以提供正常服务(99.9%、99.99%、99.999% 等等)。在 Redis 层面,高可用 的含义要宽泛一些,除了保证提供 正常服务(如 主从分离、快速容灾技术 等),还需要考虑 数据容量扩展、数据安全 等等。
在 Redis 中,实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群,下面简单说明它们的作用,以及解决了什么样的问题:
1 持久化:持久化是 最简单的 高可用方法。它的主要作用是 数据备份,即将数据存储在 硬盘,保证数据不会因进程退出而丢失。
2 复制:复制是高可用 Redis 的基础,哨兵 和 集群 都是在 复制基础 上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。
3 哨兵:在复制的基础上,哨兵实现了 自动化 的 故障恢复。缺陷是 写操作 无法 负载均衡,存储能力 受到 单机 的限制。
4 集群:通过集群,Redis 解决了 写操作 无法 负载均衡 以及 存储能力 受到 单机限制 的问题,实现了较为 完善 的 高可用方案。
2 三种模式的区别
1.主从模式:读写分离,备份,一个Master可以有多个Slaves。
2.哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器。
3.集群:为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,可受益于分布式集群高扩展性。
二 安装redis
1. 需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。
2. 环境准备: redis版本5.0.3 两台centos7系统,三主三从,ip为192.168.10.227和192.168.6.220,如果在实际环境中,当然是6台机器最为完美了。
3. 安装redis 解压,make&&make install
三 配置redis集群
1 创建多个redis目录
#两台机器上面都需要创建这个目录,端口最好不要一样,(为了方便区分)
mkdir -p /home/yx/server/ redis_cluster{16379/log,16380/log,16381/log}
拷贝redis配置文件到各个目录下
├── 16379
│ ├── log
│ │ └── redis.log
│ └── redis.conf
├── 16380
│ ├── log
│ │ └── redis.log
│ └── redis.conf
└── 16381
├── log
│ └── redis.log
├── nodes-16381.conf
└── redis.conf
2 修改redis配置文件
port 16379 #//端口16379,16380,16381
bind 本机ip #/默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes #redis后台运行
pidfile /var/run/redis_16379.pid #pidfile文件对应16379,16380,16381
cluster-enabled yes #开启集群 把注释#去掉
cluster-config-file nodes_16379.conf #集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 #请求超时 默认15秒,可自行设置
appendonly yes #aof日志开启 有需要就开启,它会每次写操作都记录一条日志
logfile "/home/yx/server/redis_cluster/16379/log/redis.log" #默认是空,设置日志存放目录
3 启动redis
# 10.227
redis-server redis_cluster/16379/redis.conf
redis-server redis_cluster/16380/redis.conf
redis-server redis_cluster/16381/redis.conf
#6.220
redis-server redis_cluster/16382/redis.conf
redis-server redis_cluster/16383/redis.conf
redis-server redis_cluster/16384/redis.conf
四 创建集群
# 旧版创建集群,还需要安装ruby环境
redis-trib.rb create --replicas 1 192.168.10.227:16379 192.168.10.227:16380 192.168.10.227:16381 192.168.6.220:16382 192.168.6.220:16383 192.168.6.220:16384
# 新版
redis-cli --cluster create 192.168.10.227:16379 192.168.10.227:16380 192.168.10.227:16381 192.168.6.220:16382 192.168.6.220:16383 192.168.6.220:16384 --cluster-replicas 1
运行上面的命令如下图所示:
输入yes即可
出现下面信息即代表成功
五 验证集群
# 在10.227上面随便登陆一个redis
redis-cli -h 192.168.10.227 -c -p 16379 # 登陆集群用-c
192.168.10.227:16379> set hello world
OK
192.168.10.227:16379> keys *
1) "hello"
192.168.10.227:16379> keys
(error) ERR wrong number of arguments for 'keys' command
192.168.10.227:16379> get hello
"world"
###然后在另一台机器上面登陆一个redis,同样查询
[yx@localhost server]$ redis-cli -h 192.168.6.220 -c -p 16383
192.168.6.220:16383> get hello
-> Redirected to slot [866] located at 192.168.10.227:16379
"world"
六 查看集群情况
###########查看所有主从的情况
[yx@localhost redis_cluster]$ redis-cli -h 192.168.10.227 -c -p 16379
192.168.10.227:16379> CLUSTER nodes
dff73da0e9071afe5a13998ff24a03442386085c 192.168.6.220:16384@26384 slave 963cef978b20d22b4d3aef3baa598720a5869918 0 1561360856000 6 connected
943a534c273f6a75bab7154ac17a48066c3cee74 192.168.6.220:16382@26382 master - 0 1561360855855 4 connected 5461-10922
895f9058248c277909d9c337fd5cad180838e5e9 192.168.10.227:16381@26381 slave 943a534c273f6a75bab7154ac17a48066c3cee74 0 1561360857862 4 connected
963cef978b20d22b4d3aef3baa598720a5869918 192.168.10.227:16380@26380 master - 0 1561360857000 2 connected 10923-16383
d80910232150a3e64445393aeb8ae0eaca8632bf 192.168.6.220:16383@26383 slave 578b57a2cae8931c55da9f2cfa7762b0f2e7c0bb 0 1561360854853 5 connected
578b57a2cae8931c55da9f2cfa7762b0f2e7c0bb 192.168.10.227:16379@26379 myself,master - 0 1561360857000 1 connected 0-5460
############################集群信息
192.168.10.227:16379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.6.220,port=16383,state=online,offset=2284,lag=1
master_replid:7e91dbdb27f711da30d410f21ca9bb20fadf7ed3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2284
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2284
七 故障测试
1 故意停掉一个master
停掉之前,主从情况
运行这个命令,停掉16380这个redis
redis-cli -h 192.168.10.227 -p 16380 debug segfault
停掉之后,发现6.220上的16384变为mater了
然后重新启动那个16380,它现在变成slave了
2 我连续停掉两个master
当我把两个主都停掉之后,其中两个从,依然变成了主
得到的结果是,允许主最多坏两个,从最终剩一个!