redis 高可用&集群部署方案
1. redis安装部署
redis安装建议采用源码编译安装,适用大部分linux系统
# 下载redis文件,建议在想安装的地方新建文件夹然后下载到文件夹内,可根据自己的需求选择版本号。
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
# 解压源码文件
tar -xzf redis-5.0.7.tar.gz
# 创建连接
ln -s redis-5.0.7 redis
# 编译(编译之前需要确认系统安装了gcc环境,如果没安装,centos可采用 sudo yum -y install gcc安装)
make
# 安装
make install
# 启动redis,建议采用配置文件的方式启动
# 启动路径有三个:当前安装目录、创建软连接的目录、/usr/local/bin
nohup ./redis-server /opt/redis/redis/redis.conf &
2. redis哨兵解决方案
2.1 配置前准备
本次模拟在本机部署了三台虚拟机作为部署准备,分别为:
- master:192.168.159.128
- slave-1:192.168.159.129
- salve-2:192.168.159.130
计划用一台作为主,两台作为从,三台服务器互为哨兵sentinel节点,实现主从复制,并不在人为干扰的情况下,实现故障自动迁移
架构图如下:
2.2 master主节点配置
logfile "redis.log" # 配置日志文件存放位置
port 6379 # 配置端口,此处使用默认端口即可
daemonize yes # 配置以守护进程的方式启动
dir /opt/redis/redis/data/ # 配置文件写入目录
bind 0.0.0.0 # 这个参数网上说法比较多,自己试了几次如果几个节点配置在同一台设备上,用端口号来区分的话,配置为127.0.0.1,否则配置为0.0.0.0
配置完成重启redis服务
2.3 slave 节点配置
logfile "redis.log" # 配置日志文件存放位置
port 6379 # 配置端口,此处使用默认端口即可
daemonize yes # 配置以守护进程的方式启动
dir /opt/redis/redis/data/ # 配置文件写入目录
bind 0.0.0.0 # 这个参数网上说法比较多,自己试了几次如果几个节点配置在同一台设备上,用端口号来区分的话,配置为127.0.0.1,否则配置为0.0.0.0
replicaof 192.168.159.128 6379 # 配置主节点的IP和端口,有的配置文件里面没有这一项,直接在配置文件里加入就可以;
masterauth 123 # 配置主节点redis的密码;如果密码为空,则可以省去这一项
2.4 验证
主节点视角
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.159.129,port=6379,state=online,offset=11335,lag=0
slave1:ip=192.168.159.130,port=6379,state=online,offset=11335,lag=1
master_replid:013734ec7f21c521d15d003f57165c290c88bdaf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:11335
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:11335
从节点视角
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:192.168.159.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:14583
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:013734ec7f21c521d15d003f57165c290c88bdaf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14583
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14583
主从复制验证
# 主节点生成键值对
127.0.0.1:6379> set redis best
OK
127.0.0.1:6379> get redis
"best"
# 从节点1验证复制
127.0.0.1:6379> get redis
"best"
# 从节点2验证复制
127.0.0.1:6379> get redis
"best"
到此为止,主从复制功能完成
2.5 此阶段踩过的坑
- 报错《ERROR CONDITION ON SOCKET FOR SYNC: NO ROUTE TO HOST》
发现通过telnet主节点ip:port也不通,检查原因为主节点服务器防火墙限制
解决方案:关闭主节点服务器防火墙(这种方式不建议,建议在主节点配置防火墙允许通过就好了)
2.6 哨兵sentinel配置
sentinel 最后会实现故障转移,转移时会随机选一台salve做为master
踩过的坑,以及解决方案
- 如果redis节点需要配置密码,则所有节点都需要配置同样的密码,以及配置要同步,主要体现在:
redis.conf–>masterquth xxx - 同样的,为了保证故障可以准确跳转,所有节点均需要注意防火墙设置(三个节点需要能互相正常访问)
sentinel.conf 配置:
sentinel.conf
# 配置端口,bind参数屏蔽了
port 26379
daemonize yes
logfile "redis-sentinel.log"
dir /opt/redis/redis/data
# 配置监听的redis主节点IP、端口、后面的2的意思为需要有两个及以上的哨兵同意才会认定主节点down掉并共同选举新的master节点
sentinel monitor mymaster 192.168.159.128 6379 2
# 后面三项配置为sentinel里面的默认配置
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
启动sentinel哨兵
./redis-sentinel sentinel.conf
当所有sentinel节点都起来之后,sentinel的配置文件会有所变化,变化如下:
# 除了主节点之外,寻找到两台从节点
sentinel known-replica mymaster 192.168.159.128 6379
sentinel known-replica mymaster 192.168.159.130 6379
# 另外两台哨兵节点
sentinel known-sentinel mymaster 192.168.159.129 26379 e3a68083cc8f7bb61f217e923963cadfb856ed40
sentinel known-sentinel mymaster 192.168.159.128 26379 9341e0e29c853e035bbfdcd02b0f0e6e79ad7dae
当发生如上变化之后,侧面证明所有哨兵节点均已经起来了;
模拟故障转移
- 没发生故障:
- 主节点故障
- 故障转移
- 原先down掉的主节点起来之后:
-
总结一下: - 安装redis建议采用源码安装
- 如果redis有密码、则所有redis节点都需要配置同样的密码,并且都需要配置masyerauth字段;
由于第一次部署,过程中还是遇到不少问题,没有一一记录下载,多看日志报错,基本问题不大。