05. Redis 环境搭建-高可用集群(HA)

在生产环境中,Redis 架构使用最多的就是Sentinel主从架构, 因为单点容易产生故障, 分片集群又过于复杂. 笔者尝试在一台服务器上搭建一个一主两从, 三个哨兵监听的Redis 集群架构。由于哨兵也可能发生单点故障,所以笔者也使用了三个哨兵来监听. 对于学习而言,搭建一个伪集群即可.

1. 配置模板

笔者创建一个redis的配置模板文件: template-redis.conf,一个sentinel的配置模板: template-sentinel.conf, 用于复制配置.

1.1 创建Redis配置文件模板

  • 从Redis 源码目录复制一个redis.conf 文件到/usr/local/etc/redis目录
  • 创建redis 配置模板文件: /usr/local/etc/redis/template-redis.conf
  • 复制模板时, 只需要替换配置文件中端口号即可,即只需要全局替换6379就可以把配置文件中端口号, 日志文件,pid文件等全部替换.
# 引入原配置
include /usr/local/etc/redis/redis.conf

######################################## 自定义配置 ########################################

# 修改绑定ip
bind 127.0.0.1

# 设置关闭保护模式
protected-mode no

# 设置端口号为6379
port 6379

# 设置后台启动为yes
daemonize yes

# 设置pid文件
pidfile /logs/redis/redis.pid.6379

# 设置日志文件
logfile /logs/redis/redis.log.6379

# 设置RDB dum文件名
dbfilename dump.rdb.6379

# 设置dump文件存放目录
dir /data/redis

# 设置主节点密码
masterauth 123456

# 设置从节点只读
replica-read-only yes

# 设置当前节点访问密码为
requirepass 123456

# 设置客户端最多连接数
maxclients 1000

# 设置最大内存
maxmemory 2GB

# 设置达到最大内存后策略,报错
maxmemory-policy noeviction

# 启动AOF持久化模式
appendonly yes

# 设置AOF文件名
appendfilename "appendonly.aof.6379"

# 设置AOF写入磁盘策略, 每秒写入一次
appendfsync everysec

1.2 创建sentinel 配置模板

  • 从源码目录复制一个sentinel.conf配置文件, 或者新创建一个文件也行, 因为sentinel配置项比较少. 命名为: template-sentinel.conf
  • 复制模板时, 只需要替换配置文件中端口号即可,即只需要全局替换6379就可以把配置文件中端口号, 日志文件,pid文件等全部替换.
# 设置ip
bind 127.0.0.1

# 绑定端口号
port 26379

# 设置后台运行
daemonize yes

# 指定pid文件
pidfile /logs/redis/sentinel.pid.26379

# 指定日志文件
logfile /logs/redis/sentinel.log.26379

# 指定启动目录
dir /tmp

# 监听
sentinel monitor redis.localhost 127.0.0.1 6480 2

# redis 密码
sentinel auth-pass redis.localhost 123456

# 指定sentinel认为redis宕机所需毫秒数, 指定为10秒
sentinel down-after-milliseconds redis.localhost 10000

# 指定故障转移时,最多多少个从节点向主节点进行数据同步
sentinel parallel-syncs redis.localhost 1

# 指定故障转移总耗时最多多少毫秒, 默认
sentinel failover-timeout redis.localhost 180000

# 故障转移时, 不能修改脚本配置
sentinel deny-scripts-reconfig yes

2. 创建配置文件

1.1 创建目录

创建配置之前应先创建相关目录, 笔者的目录规划如下:

  • /usr/local/etc/redis: 存储相关配置文件
  • /logs/redis: 存储redis 日志和pid文件
  • /data/redis: redis 数据库RDB文件,AOF文件存储目录
mkdir -p /usr/local/etc/redis /logs/redis /data/redis 

2.1 复制三份redis配置

使用redis配置模板创建三份redis 配置文件

# 复制三份新的配置文件
cp template-redis.conf /usr/local/etc/redis/redis.conf.6480
cp template-redis.conf /usr/local/etc/redis/redis.conf.6481
cp template-redis.conf /usr/local/etc/redis/redis.conf.6482

2.2 替换相关配置

使用sed命令, 将配置文件中所有需要区分的项(日志, 文件名等)进行全局替换

# 替换各配置文件
sed -i "s/6379/6480/g" /usr/local/etc/redis/redis.conf.6480
sed -i "s/6379/6481/g" /usr/local/etc/redis/redis.conf.6481
sed -i "s/6379/6482/g" /usr/local/etc/redis/redis.conf.6482

2.3 复制三份sentinel 配置

使用redis配置模板创建三份sentinel 配置文件

cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26480
cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26481
cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26482

2.4 替换相关配置

使用sed命令, 将配置文件中所有需要区分的项(日志, 文件名等)进行全局替换

# 替换各配置文件
sed -i "s/6379/6480/g" /usr/local/etc/redis/sentinel.conf.26480
sed -i "s/6379/6481/g" /usr/local/etc/redis/sentinel.conf.26481
sed -i "s/6379/6482/g" /usr/local/etc/redis/sentinel.conf.26482

3. 启动集群

3.1 启动redis 集群

通过redis-server 命令依次启动redis服务器, 启动之后并未建立主从关系.

redis-server /usr/local/etc/redis/redis.conf.6480
redis-server /usr/local/etc/redis/redis.conf.6481
redis-server /usr/local/etc/redis/redis.conf.6482

3.2 设置主从关系

通过命令建立主从关系, 笔者认为这种方式比在配置文件中指定要更好一点儿.

redis-cli -p 6481 -a 123456 slaveof 127.0.0.1 6480
redis-cli -p 6482 -a 123456 slaveof 127.0.0.1 6480

3.3 启动sentinel 集群

使用redis-sentinel 依次启动sentinel集群, sentinel会自动建关系.

redis-sentinel /usr/local/etc/redis/sentinel.conf.26480
redis-sentinel /usr/local/etc/redis/sentinel.conf.26481
redis-sentinel /usr/local/etc/redis/sentinel.conf.26482

3.4 查看集群

  • 可以登录sentinel客户端来查看相关消息,也可以直接在命令行查看sentinel集群关系。从输出结果可以看出:
  • redis 集群名称: redis.localhost
  • 主节点状态: ok
  • 主节点地址:127.0.0.1:6480
  • 从节点个数: 2个
  • sentinel 个数: 3个
$ redis-cli -p 26481 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis.localhost,status=ok,address=127.0.0.1:6480,slaves=2,sentinels=3

4. 测试故障转移

4.1 关闭maste 服务器

$ redis-cli -a 123456 -p 6480 shutdown

4.2 通过sentinel查看集群状态

$ redis-cli -p 26481 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis.localhost,status=ok,address=127.0.0.1:6482,slaves=2,sentinels=3

4.3 查看sentinel 日志

5648:X 09 May 2019 10:52:10.288 # +sdown master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.340 # +odown master redis.localhost 127.0.0.1 6480 #quorum 3/2
5648:X 09 May 2019 10:52:10.340 # +new-epoch 1
5648:X 09 May 2019 10:52:10.340 # +try-failover master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.378 # +vote-for-leader e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.445 # 156e8a353eea2e78bf16230e144086956e5c7c8e voted for e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.445 # 2279bbefc80a9f66259f5d148a73638d92448653 voted for e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.507 # +elected-leader master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.507 # +failover-state-select-slave master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.608 # +selected-slave slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.608 * +failover-state-send-slaveof-noone slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.699 * +failover-state-wait-promotion slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.496 # +promoted-slave slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.496 # +failover-state-reconf-slaves master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.505 * +slave-reconf-sent slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 # -odown master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 * +slave-reconf-inprog slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 * +slave-reconf-done slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.615 # +failover-end master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.615 # +switch-master redis.localhost 127.0.0.1 6480 127.0.0.1 6482
5648:X 09 May 2019 10:52:12.616 * +slave slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6482
5648:X 09 May 2019 10:52:12.616 * +slave slave 127.0.0.1:6480 127.0.0.1 6480 @ redis.localhost 127.0.0.1 6482
5648:X 09 May 2019 10:52:22.666 # +sdown slave 127.0.0.1:6480 127.0.0.1 6480 @ redis.localhost 127.0.0.1 6482
上一篇:如何在NetScaler上设置高可用性


下一篇:模拟散列表