当前位置: 首页 > news >正文

redis的一主二从三哨兵配置

redis安装脚本

参考了:https://yunweiba.com/163.html

https://download.redis.io/releases/

在上面链接选择合适的版本

wget -P "/opt" https://download.redis.io/releases/redis-7.0.0.tar.gz

安装脚本如下:

#!/bin/bash
# 安装redis,配置设置,该脚本默认安装文件已存在,安装版本是redis-7.0.0,请自行替换对应版本
# wget -P "/opt" https://download.redis.io/releases/redis-7.0.0.tar.gz# 检查gcc是否已安装
if ! command -v gcc &> /dev/null; thenecho "gcc未安装,将使用yum安装"# 使用yum安装gccsudo yum install -y gcc
elseecho "gcc已安装"
fi# 解压Redis安装文件
tar -xzf /opt/redis-7.0.0.tar.gz -C /opt# 进入Redis目录
# shellcheck disable=SC2164
cd /opt/redis-7.0.0# 编译并安装Redis
make
sudo make install PREFIX=/usr/local/redis# 创建配置文件
#Redis基础配置,配置文件保存在 /etc/redis.conf
grep -E -v "^$|^#" /opt/redis-7.0.0/redis.conf > /etc/redis.conf
sed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis.conf
sed -i "s/protected-mode yes/protected-mode no/g" /etc/redis.conf
sed -i "s/daemonize no/daemonize yes/g" /etc/redis.conf
sed -i 's/logfile \"\"/logfile \"\/var\/log\/redis.log\"/g' /etc/redis.conf#PATH配置
echo "export PATH=\$PATH:/usr/local/redis/bin" >>/etc/profile
source /etc/profile#启动redis服务,配置开机启动
cp /opt/redis-7.0.0/utils/redis_init_script /etc/init.d/redis
sed -i 's/\/usr\/local\/bin\/redis-server/\/usr\/local\/redis\/bin\/redis-server/g' /etc/init.d/redis
sed -i 's/CLIEXEC=\/usr\/local\/bin\/redis-cli/CLIEXEC=\/usr\/local\/redis\/bin\/redis-cli/g' /etc/init.d/redis
# shellcheck disable=SC2016
sed -i 's/\/etc\/redis\/\${REDISPORT}.conf/\/etc\/redis.conf/g' /etc/init.d/redis
chkconfig redis on
/etc/init.d/redis start#查看redis监听端口
netstat -anlp|grep redis# 以下为可选配置
# sed -i "s/pidfile \/var\/run\/redis_6379.pid/pidfile \/usr\/local\/redis\/run\/redis_6379.pid/g
# dir指定数据目录
# sed -i "s/dir \.\//dir \/usr\/local\/redis\/data/g" /opt/redis-7.0.0/conf/redis_6379.conf
# 指定log文件目录
# sed -i "s/logfile \"\"/logfile \"\/opt\/local\/redis\/logs\/redis.log\"/g" /usr/local/redis/redis.conf
# 设置密码
# sed -i "s/^# masterauth.*/masterauth ${passwd}/" /usr/local/redis/redis.conf

我们再用一个脚本,来在目标主机上批量安装

#!/bin/bash
#将redis安装脚本和安装文件发送到指定机器然后安装# 目标主机 IP 范围
network="192.168.32"
start_ip=22
end_ip=23# 获取当前日期和时间
current_date=$(date +%Y%m%d)
current_time=$(date +%H%M)# 日志文件名
log_file="${current_date}_${current_time}_redis安装.log"# 发送文件并记录结果到日志文件
function send_file() {local target_ip=$1local file_path=$2scp "$file_path" root@"$target_ip":/opt/ &>> "$log_file"# 检查发送结果并记录到日志文件if [ $? -eq 0 ]; thenecho "${file_path}文件发送成功到${target_ip}"echo "${file_path}文件发送成功到${target_ip}" >> "$log_file"elseecho "${file_path}文件发送失败到${target_ip}"echo "${file_path}文件发送失败到${target_ip}" >> "$log_file"fi
}for ip in $(seq ${start_ip} ${end_ip})
dotarget_ip=${network}.${ip}echo "正在复制文件到 ${target_ip}..."send_file "$target_ip" "/opt/redis.sh"send_file "$target_ip" "/opt/redis-7.0.0.tar.gz" &if [ $? -eq 0 ]; thenecho "文件复制成功到 ${target_ip}"elseecho "文件复制失败到 ${target_ip}"fi
done# 执行脚本,并行执行
for ip in $(seq ${start_ip} ${end_ip})
dotarget_ip=${network}.${ip}ssh root@"$target_ip" "source /opt/redis.sh" >> "$log_file" 2>&1 &
done
waitecho "运行完成。请查看日志文件 ${log_file} 获取详细结果。"

redis主从配置

如上我们已经在4台虚拟机上安装了redis,计划按照如下进行1主2从3哨兵的配置

IP角色
192.168.32.21Master1
192.168.32.22Sentinel哨兵
192.168.32.23Slave1
192.168.32.24Slave2
192.168.32.25哨兵2
192.168.32.25哨兵3

参考了该链接:https://cloud.tencent.com/developer/article/2124382

主机配置192.168.32.21


#!/bin/bash
#redis主从配置master_ip="192.168.32.21"
master_pwd="Abc@1234"
start_ip=23
end_ip=24
network="192.168.32"
redis_port=6379# 配置主节点
echo "requirepass $master_pwd" >> /etc/redis.conf
echo "masterauth $master_pwd" >> /etc/redis.conf
systemctl restart redis# 开启6379端口
firewall-cmd --zone=public --add-port=$redis_port/tcp --permanent
# 重启一下防火墙服务
firewall-cmd --reload# 需要关闭防火墙,否则在哨兵模式下,切换主从会失败
systemctl stop firewalld
systemctl disable firewalld# 配置从节点
for ip in $(seq ${start_ip} ${end_ip})
dotarget_ip=${network}.${ip}echo "正在进行 ${target_ip} 的redis设置..."ssh root@"$target_ip" << EOFecho "replicaof $master_ip $redis_port" >> /etc/redis.confecho "requirepass $master_pwd" >> /etc/redis.confecho "masterauth $master_pwd" >> /etc/redis.confredis-cli -a Abc@1234 shutdown/etc/init.d/redis startsystemctl stop firewalldsystemctl disable firewalld
EOF
done

查看master状态,并set一个key值

[root@node21 ~]# redis-cli
127.0.0.1:6379> auth Abc@1234
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.32.23,port=6379,state=online,offset=210,lag=0
slave1:ip=192.168.32.24,port=6379,state=online,offset=210,lag=1
master_failover_state:no-failover
master_replid:0717a944c0adb0a6a290b2f9ae4d242f44b288f3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
127.0.0.1:6379> set myname kayotin
OK

查看salve状态,在salve上成功get到了key值,说明同步成功了。

[root@node23 ~]# redis-cli
127.0.0.1:6379> auth Abc@1234
OK
127.0.0.1:6379> get myname
"kayotin"

redis哨兵配置

简单来说哨兵就是用来监控各机器的状态,如果master挂掉了,就在哨兵中选举一个当做新的master。redis的哨兵,最少需要配置3台。我们在25,26ip的两台机器上用同样方式配置了哨兵。

哨兵配置脚本如下:

#!/bin/bash
#redis哨兵配置master_ip="192.168.32.21"
sentinel_ip="192.168.32.22"
redis_port=6379
sentinel_port=26379
redis_password="Abc@1234"# 在哨兵节点上配置sentinel
ssh root@$sentinel_ip << EOF# 安装redis时默认设置了开机启动,所以先关闭服务chkconfig redis offredis-cli shutdown# 将哨兵的配置文件复制一份在/etc下面grep -E -v "^$|^#" /opt/redis-7.0.0/sentinel.conf > /etc/sentinel.conf# 修改配置文件# 后台启动服务sed -i "s/daemonize no/daemonize yes/g" /etc/sentinel.conf# 设置logsed -i "s/logfile \"\"/logfile \/var\/log\/sentinel.log/g" /etc/sentinel.conf# 指定监控的mater 的ip,默认2是指有2台哨兵认为master死了就切换sed -i "s/monitor mymaster 127.0.0.1 6379 2/monitor mymaster $master_ip $redis_port 2/g" /etc/sentinel.conf# 默认是30000ms无响应,就认为挂了,我们设置为10s,方便测试sed -i "s/down-after-milliseconds mymaster 30000/down-after-milliseconds mymaster 10000/g" /etc/sentinel.conf# 设置密码echo "sentinel auth-pass mymaster $redis_password" >> /etc/sentinel.conf#echo "bind 0.0.0.0" >> /etc/sentinel.conf# 防火墙开放端口firewall-cmd --zone=public --add-port=$sentinel_port/tcp --permanentfirewall-cmd --reload# 启动哨兵redis-sentinel /etc/sentinel.confEOFecho "Redis哨兵配置完成"

查看哨兵状态,可以看到已经监听到1台master和2个Slave,并且有3个哨兵。

[root@node25 ~]# redis-cli -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.32.21:6379,slaves=2,sentinels=3

容灾演练

我们已经配置了1个master加上2个salve,还有3个哨兵。现在模拟把21上的服务关掉,然后去哨兵那边查看状态,可以看到master的状态已经是down了

127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=odown,address=192.168.32.21:6379,slaves=2,sentinels=3

我们设置的是10s后切换,等待约15秒后,可以看到24已经被设定为新的master了。而且因为21挂掉了,这时只剩下一个Slave了。

# Replication
role:master
connected_slaves:1
slave0:ip=192.168.32.23,port=6379,state=online,offset=248180,lag=0
master_failover_state:no-failover
master_replid:a862378e4faf0017f0a51d8b817e02c26d33d91e
master_replid2:5f56d68aa8046f176bcdffe5b04cdc21c7bbedb2
master_repl_offset:248180
second_repl_offset:220622
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:102087
repl_backlog_histlen:146094

重新启动21上的redis,可以看到它已经变成一个slave了

[root@node21 ~]# /etc/init.d/redis start
Starting Redis server...
[root@node21 ~]# redis-cli -a Abc@1234
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.32.24
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:517881
slave_repl_offset:517881
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:a862378e4faf0017f0a51d8b817e02c26d33d91e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:517881
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:293313
repl_backlog_histlen:224569

哨兵的切换日志,可以参考该链接https://blog.csdn.net/miaomiao19971215/article/details/108567837

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于Java的SSM(Spring、Spring MVC、MyBatis)框架构建的远程诊断系统
  • 六种主流ETL工具的比较与Kettle的实践练习指南--MySQL、hive、hdfs等之间的数据迁移
  • AI修手有救了?在comfyui中使用Flux模型实现局部重绘案例
  • 新的 MathWorks 硬件支持包支持从 MATLAB 和 Simulink 模型到高通 Hexagon 神经处理单元架构的自动化代码生成
  • 动手学深度学习(pytorch土堆)-05-1神经网络
  • 【C++】模拟实现vector
  • Spark-ShuffleWriter-UnsafeShuffleWriter-钨丝内存分配
  • 所有用贪心的算法和所有用动态规划(dp)的算法合集
  • 深度学习的笔记
  • C++(C++的文件I/O)
  • OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)
  • 苹果macOS 15.0 Sequoia正式版发布:iPhone应用镜像玩、手机消息电脑知
  • 二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)
  • WPF自定义Dialog模板,内容用不同的Page填充
  • OJ题-合并K个已排序的链表
  • Angular4 模板式表单用法以及验证
  • CSS 提示工具(Tooltip)
  • Cumulo 的 ClojureScript 模块已经成型
  • Git学习与使用心得(1)—— 初始化
  • laravel5.5 视图共享数据
  • MQ框架的比较
  • node和express搭建代理服务器(源码)
  • Spring Cloud Feign的两种使用姿势
  • SQLServer之索引简介
  • webpack入门学习手记(二)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前嗅ForeSpider教程:创建模板
  • 通过git安装npm私有模块
  • No resource identifier found for attribute,RxJava之zip操作符
  • Mac 上flink的安装与启动
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​2020 年大前端技术趋势解读
  • (7)svelte 教程: Props(属性)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (阿里云万网)-域名注册购买实名流程
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (接口自动化)Python3操作MySQL数据库
  • (六)Flink 窗口计算
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (循环依赖问题)学习spring的第九天
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET 反射 Reflect
  • .net2005怎么读string形的xml,不是xml文件。
  • .net6+aspose.words导出word并转pdf
  • .NET建议使用的大小写命名原则
  • .NET与 java通用的3DES加密解密方法
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @PreAuthorize注解
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息