Redis 群集---实战
Redis群集模式一、前期准备准备3台linux 机器每台服务 部署2个redis 实例共6个节点二、验收标准① 集群状态正常3 主 3 从。② 数据能够正常写入、读取。③ 主节点故障后集群能够自动进行故障转移。④ 编写部署文档记录配置步骤、关键命令及测试结果。三、实战要求1、安装 Redis 并配置 6 个实例1. 三台机器10.8.0.25 实例 A:7001实例 B:700210.8.0.26 实例 C:7003实例 D:700410.8.0.27 实例 E:7005实例 F:7006一共 6 个实例每台机器 2 个最后做成 3 主 3 从Redis 会自动跨机分配从节点不会同一台机器一主一从高可用要求主从不同宿主机2. 前置环境三台 CentOS7 全部执行# 关闭防火墙实验环境 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config # 确认redis已经编译好redis-server、redis-cli在PATH # 依赖如果之前没装 yum install -y gcc tclCluster 需要开放实例端口7001~7006 端口 10000集群总线端口比如 17001防火墙不关就必须放行这一批端口3. 安装redisyum install -y gcc gcc-c make#下载wget -p /opt http://download.redis.io/releases/redis-5.0.7.tar.gztar zxvf redis-5.0.7.tar.gz -C /opt/cd /opt/redis-5.0.7/makemake PREFIX/usr/local/redis installcd /opt/redis-5.0.7/utils./install_server.sh......Please select the redis executable path [/usr/local/bin/redis-server]/usr/local/redis/bin/redis-serverln -s /usr/local/redis/bin/* /usr/local/bin/2、单台机器部署 2 个 Redis 实例以 10.8.0.25 举例另外两台照抄只改端口一台机器两个实例两套独立配置文件、独立数据目录、不同端口2.1 创建目录10.8.0.25mkdir -p /usr/local/redis-cluster/{7001,7002}/{conf,data,logs}7001 实例、7002 实例2.2 写 7001 的配置vim /usr/local/redis-cluster/7001/conf/redis.confport 7001 bind 0.0.0.0 daemonize yes pidfile /usr/local/redis-cluster/7001/redis_7001.pid logfile /usr/local/redis-cluster/7001/logs/redis.log dir /usr/local/redis-cluster/7001/data # 集群核心开关必须打开 cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 15000 # 关闭保护模式 protected-mode no # 如果要加密码统一requirepass、masterauth后面创建集群要带-a # requirepass 123456 # masterauth 1234562.3 写 7002 的配置vim /usr/local/redis-cluster/7002/conf/redis.conf只改端口、pid、log、dir、cluster-config-file其余一模一样port 7002 bind 0.0.0.0 daemonize yes pidfile /usr/local/redis-cluster/7002/redis_7002.pid logfile /usr/local/redis-cluster/7002/logs/redis.log dir /usr/local/redis-cluster/7002/data cluster-enabled yes cluster-config-file nodes-7002.conf cluster-node-timeout 15000 protected-mode no✅ 然后 10.8.0.26 机器创建 7003、7004 两个实例同上模板 ✅ 10.8.0.27 机器创建 7005、7006 两个实例同上模板10.8.0.2610.8.0.272.4 启动实例全部 6 个实例配置完成后分别启动每一个实例三台机器都启动# 10.8.0.25上启动 redis-server /usr/local/redis-cluster/7001/conf/redis.conf redis-server /usr/local/redis-cluster/7002/conf/redis.conf # 10.8.0.26上启动 redis-server /usr/local/redis-cluster/7003/conf/redis.conf redis-server /usr/local/redis-cluster/7004/conf/redis.conf # 10.8.0.27上启动 redis-server /usr/local/redis-cluster/7005/conf/redis.conf redis-server /usr/local/redis-cluster/7006/conf/redis.conf10.8.0.2510.8.0.2610.8.0.272.5 检查进程ps -ef | grep redis-server看到 6 个进程端口 7001~7006全部正常后台运行。10.8.0.2510.8.0.2610.8.0.273、搭建 Redis Cluster 集群实现 3 主 3 从。创建 Redis Cluster 集群任意一台机器执行推荐 10.8.0.25--cluster-replicas 1含义每个主节点分配 1 个从节点正好 3 主 3 从Redisredis-cli --cluster create \ 10.8.0.25:7001 10.8.0.25:7002 \ 10.8.0.26:7003 10.8.0.26:7004 \ 10.8.0.27:7005 10.8.0.27:7006 \ --cluster-replicas 1如果设置了密码末尾加上-a 123456执行后Redis 会输出分配方案输入 yes 确认⚠️ 它自动分配主从默认会把从节点放到不同机器实现高可用不会一台机器一主一从这是正常的 你之前想 “一台一主一从” 这个思路不适合生产 ClusterCluster 官方推荐主从跨宿主机防止整机宕机全部挂掉。成功提示[OK] All 16384 slots covered4、验证集群状态、主从关系及数据读写。4.1 查看集群整体状态redis-cli -c -h 10.8.0.25 -p 7001 # 进入客户端后执行 CLUSTER NODES CLUSTER INFOCLUSTER NODES输出里标记master是主slave是从能看到从对应的主 IDcluster_state:ok→ 集群状态正常验收①连接集群客户端一定要加-c开启集群跳转否则直接写 key 会报错MOVED这张CLUSTER NODES的主从对应关系1.master10.8.0.25:7001myself,master槽 0-5460从节点10.8.0.26:70042.master10.8.0.26:7003槽 5461-10922从节点10.8.0.27:70063.master10.8.0.27:7005槽 10923-16383从节点10.8.0.25:7002 正好3 主 3 从6 个节点全部 connected16384 槽全部分配状态 ok ✔ 而且 Redis 自动把从节点放到别的机器高可用布局是规范的。4.2 读写测试验收②# -c 必须带 redis-cli -c -h 10.8.0.25 -p 7001 set name zhangsan get name set age 20 get age可以看到客户端自动跳转到对应槽位的主节点读写正常。5、模拟主节点故障验证从节点能否自动提升为主节点。5.1 模拟主节点宕机故障转移测试验收③先用CLUSTER NODES找到其中一个 master比如10.8.0.25:7001 是主节点到 10.8.0.25 机器杀掉这个主进程pkill -f redis-server.*7001等待约 15scluster-node-timeout 默认 15000ms反复执行CLUSTER NODES原来的从节点自动变成 master原来的主标记为 fail集群cluster_state仍然是 ok数据可正常读写 ✅ 代表自动故障转移成功验收③5.2 把宕机的 7001 重新启动redis-server /usr/local/redis-cluster/7001/conf/redis.conf它会自动加入集群变成新主的从节点