Redis哨兵模式集群(一主两从)

0.说明

IP地址主机名别名说明
192.168.1.117主机
192.168.1.119从机
192.168.1.121从机

1.准备:

  • 添加用户权限
# 创建一个gid为246的redis用户组
groupadd -g 246 redis
# 创建一个uid为246,gid为246的redis 用户
useradd -u 246 -g 246 redis
passwd redis [password]
# 查看用户uid
id redis
# 删除用户组
# userdel -rf redis
# 查看用户列表
# cut -d : -f 1 /etc/passwd
  • 设置文件夹权限
chown -R redis redis-5.0.3
chgrp -R redis redis-5.0.3
  • 安装gcc环境

由于redis是用C写的, 所以要有gcc环境

#查看是否安装gcc
rpm -qa | grep gcc
#若无安装,则进行安装
yum install gcc

2.安装

#安装redis
cd /opt
tar xzf redis-5.0.3.tar.gz
cd redis-5.0.3
make
#报错则用:
make MALLOC=libc
1.配置redis.conf

主节点

vi /opt/redis-5.0.3/redis.conf
bind 0.0.0.0
# 禁止外网访问redis,启用,则只能够通过lookback ip(127.0.0.1)访问Redis
protected-mode no
# 开启守护进程模式
daemonize yes
# 默认/var/run只有root用户有权限写入,所以改成/var/tmp所有用户有权限写入
pidfile /var/tmp/redis_6379.pid
# 日志文件目录
logfile "/opt/redis-5.0.3/redis_6379.log"
# 生成数据文件目录
dir /opt/redis-5.0.3
# 设置密码
requirepass [password]
# 主节点密码
masterauth [password]

从节点

vi /opt/redis-5.0.3/redis.conf
bind 0.0.0.0
# 禁止外网访问redis,启用,则只能够通过lookback ip(127.0.0.1)访问Redis
protected-mode no
# 开启守护进程模式
daemonize yes
# 默认/var/run只有root用户有权限写入,所以改成/var/tmp所有用户有权限写入
pidfile /var/tmp/redis_6379.pid
# 日志文件目录
logfile "/opt/redis-5.0.3/redis.log"
# 生成数据文件目录
dir /opt/redis-5.0.3
# 设置密码
requirepass [password]
# 主节点认证密码
masterauth [password]
slaveof 192.168.1.117 6379
2.配置sentinel.conf

主节点和从节点

vi /opt/redis-5.0.3/sentinel.conf
daemonize yes
pidfile "/var/tmp/redis-sentinel.pid"
logfile "/opt/redis-5.0.3/redis-sentinel.log"
dir "/opt/redis-5.0.3"
# sentinel监控的master的名字叫做mymaster,地址为192.168.1.117 6379
# 1代表,当集群中有1个sentinel认为master死了时,才能真正认为该master已经不可用了
# 注:必须放在其他配置上面
sentinel monitor mymaster 192.168.1.117 6379 1
sentinel auth-pass mymaster [password]
# sentinel会向master发送心跳超时时间
sentinel down-after-milliseconds mymaster 10000
# failover主从切换时,最多可以有多少个slave同时对新的master进行同步
sentinel parallel-syncs mymaster 1
# 执行failover等待时间
sentinel failover-timeout mymaster 10000

3.设置自启动

1.设置redis自启动
# 复制官方自启动脚本到系统执行目录
cp /opt/redis-5.0.3/utils/redis_init_script /etc/init.d/redis

修改redis自启动配置:

vi /etc/init.d/redis

配置如下:

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

REDISPORT=6379
# 设置执行工具路径
EXEC=/opt/redis-5.0.3/src/redis-server
# 设置cli执行工具路径
CLIEXEC=/opt/redis-5.0.3/src/redis-cli
# 修改pid为其他用户可写目录
PIDFILE=/var/tmp/redis_${REDISPORT}.pid
# 指定配置文件目录
CONF="/opt/redis-5.0.3/redis.conf"

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                # 使用redis用户执行
                sudo -u redis $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                # 使用redis用户加密码shutdown
                sudo -u redis $CLIEXEC -a "[password]" -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
	 # 加重启命令
   	 restart|force-reload)  
        ${0} stop  
        ${0} start  
        ;; 
    *)
        echo "Please use start or stop as first argument"
        ;;
esac
  • 加入自启动:
chkconfig --add redis

服务器意外宕机,pid文件未删除,还是无法自启动

  • 启动redis服务:
# 修改配置以后只能root用户操作,但进程属于redis用户
service redis start
ps aux | grep redis
service redis stop
2.设置sentinel自启动
# 复制官方自启动脚本到系统执行目录
cp /opt/redis-5.0.3/utils/redis_init_script /etc/init.d/redis-sentinel

修改redis-sentinel自启动配置:

vi /etc/init.d/redis-sentinel

配置如下:

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

REDISPORT=6379
# 设置哨兵执行工具路径
EXEC=/opt/redis-5.0.3/src/redis-sentinel
# 设置cli执行工具路径
CLIEXEC=/opt/redis-5.0.3/src/redis-cli

# 修改pid为其他用户可写目录
PIDFILE=/var/tmp/redis-sentinel.pid
# 指定配置文件目录
CONF="/opt/redis-5.0.3/sentinel.conf"

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                sudo -u redis $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                # 直接杀掉进程,删掉进程ID文件
                kill -9 $(cat ${PIDFILE}) && rm -f ${PIDFILE}
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac
  • 加入自启动:
chkconfig --add redis-sentinel

服务器意外宕机,pid文件未删除,还是无法自启动

  • 启动redis-sentinel服务
# 修改配置以后只能root用户操作,以redis用户启动redis-sentinel
service redis-sentinel start
ps aux | grep redis
service redis-sentinel stop

4.查询同步状态

cd /opt/redis-5.0.3/src
./redis-cli -h 192.168.1.117 -p 6379
> info replication
> auth [password]
> exit

5.测试集群

./redis-cli -h 192.168.1.117 -c -p 6379 
set hello world 

./redis-cli -h 192.168.1.119 -c -p 6379 
./redis-cli -h 192.168.1.121 -c -p 6379
get hello

6.集群操作

# 查询redis允许的最大连接数
config get maxclients
# 当前的redis连接数
info clients
# 获取客户端列表
client list
# 设置当前连接点redis的名称
client setname [name]    
# 查看当前连接的名称
client getname    
# 杀死指定连接
client kill ip:port    
# 查看client的IP
./redis-cli -h 192.168.1.117 -p 6379 -a [password] client list | awk '{print $2}'| cut -d = -f 2| cut -d : -f 1 | sort | uniq -c | sort -rn  
### 设置 Redis 哨兵模式实现从架构 #### 配置环境准备 为了构建个稳定可靠的Redis高可用方案,需要配置三个哨兵实例和三个Redis服务器实例(从),确保这些实例能够在同网络环境中相互通信。 #### 启动 Redis 从服务 首先,在每台机器上安装相同版本的Redis软件包。接着按照下面的方式分别创建并编辑各个节点的`redis.conf`文件: 对于节点: ```bash port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis_6379.log" dir /var/lib/redis/6379/ appendonly yes ``` 对于第个从节点: ```bash port 6380 daemonize yes pidfile /var/run/redis_6380.pid logfile "/var/log/redis_6380.log" dir /var/lib/redis/6380/ slaveof 127.0.0.1 6379 # 将此IP地址替换为机的实际IP地址 appendonly yes ``` 对于第二个从节点: ```bash port 6381 daemonize yes pidfile /var/run/redis_6381.pid logfile "/var/log/redis_6381.log" dir /var/lib/redis/6381/ slaveof 127.0.0.1 6379 # 将此IP地址替换为机的实际IP地址 appendonly yes ``` 启动所有的Redis实例之后,可以使用`ps aux | grep redis-server`命令验证它们是否正常运行[^1]。 #### 创建 Sentinel 配置文件 为每个Sentinel实例单独编写配置文件sentinel.conf: ```ini # sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/var/log/redis/sentinel.log" # 监控名为mymaster的数据库, IP 和端口应指向实际部署位置 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1 ``` 这里的关键参数解释如下: - `monitor`: 定义要监视的目标Master名称及其连接信息;最后个数字表示至少有多少个Sentine同意才能触发自动故障转移操作。 - `down-after-milliseconds`: 当超过指定毫秒数未收到回复,则认为该实例已下线。 - `failover-timeout`: 设定整个Failover过程的最大超时时间。 - `parallel-syncs`: 控制新选举出来的Slave同步数据的速度限制[^2]. #### 启动 Sentinel 实例 完成上述配置后,可以在不同机或容器内通过以下方式启动多个Sentinel进程: ```bash redis-sentinel /path/to/sentinel.conf ``` 此时,如果切顺利的话,你应该能够观察到各组件之间的交互日志记录,并且当库发生异常时,其余成员会共同决定选出新的领导者继续提供服务[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值