Redis重要概念Master-Slave、Sentinel、Partition、Cluster

本文探讨了Redis在企业级应用中的高可用性和性能优化方案,包括主从复制解决读性能问题,哨兵机制保障高可用,以及通过数据分片和集群机制解决写性能和存储限制。

前言:一个企业级系统最重要的指标就是“高可用性”和“高性能”

如果数据量不大,直接用一个Redis实例即可,读写均走Master

如果数据量很大,为了减轻单个Redis实例压力,采取写到Master、读走Slave,前提是Slave会同步Master全量数据。Master-Slave(主从复制)解决了“读”性能问题,并没有解决“写”性能问题,也没用解决“高可用性”问题

为了保证高可用,引入了Sentinel(哨兵)监视Master-Slave,当Master挂掉之后,自动将Slave选举为新的Master,保证服务可用。哨兵是Redis官方提供高可用方案,解决了“读”性能问题和“高可用性”问题

为了解决“写”性能和单个Redis实例存储限制,引入了数据分片(Partition)和集群机制(Cluster),在Redis集群中,可以有多个Master(一般3个Master3个Slave),key经过算法计算之后分散到不同Master中存储,Redis Cluster解决了“读”性能、“写”性能和“高可用性”问题

^C[root@k8smaster 2]# kubectl -n redis-server get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES redis-master-966f8c49b-cfk65 0/1 Running 2 5m1s 10.244.0.13 k8smaster <none> <none> redis-slave1-547f7f4df5-7llz8 0/1 Running 2 5m1s 10.244.1.44 k8snode1 <none> <none> redis-slave2-88d55ddb9-n2mlj 0/1 Running 0 5m1s 10.244.2.26 k8snode2 <none> <none> [root@k8smaster 2]# kubectl -n redis-server get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/mysql-master-pv 10Gi RWO Retain Bound mysql-server/mysql-master-pvc 3h7m persistentvolume/mysql-slave1-pv 10Gi RWO Retain Bound mysql-server/mysql-slave1-pvc 3h7m persistentvolume/mysql-slave2-pv 10Gi RWO Retain Bound mysql-server/mysql-slave2-pvc 3h7m persistentvolume/redis-master-pv 1Gi RWO Retain Bound redis-server/redis-master-pvc 5m13s persistentvolume/redis-slave1-pv 1Gi RWO Retain Bound redis-server/redis-slave1-pvc 5m13s persistentvolume/redis-slave2-pv 1Gi RWO Retain Bound redis-server/redis-slave2-pvc 5m13s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/redis-master-pvc Bound redis-master-pv 1Gi RWO 5m13s persistentvolumeclaim/redis-slave1-pvc Bound redis-slave1-pv 1Gi RWO 5m13s persistentvolumeclaim/redis-slave2-pvc Bound redis-slave2-pv 1Gi RWO 5m13s [root@k8smaster 2]# kubectl -n redis-server exec -it redis-master-7d5f8d5f76-2xq4z -- redis-cli -a redispass Error from server (NotFound): pods "redis-master-7d5f8d5f76-2xq4z" not found [root@k8smaster 2]# kubectl -n redis-server exec -it redis-master-966f8c49b-cfk65 -- redis-cli -a redispass Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. AUTH failed: ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct? 127.0.0.1:6379> SET testkey "hello redis" OK 127.0.0.1:6379> exit [root@k8smaster 2]# kubectl -n redis-server exec -it redis-slave1-547f7f4df5-7llz8 -- redis-cli -a redispass GET testkey Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. Could not connect to Redis at 127.0.0.1:6379: Connection refused command terminated with exit code 1
最新发布
10-15
<think>我们之前提供了MySQL和Redis的部署YAML以及检查方法。现在用户遇到了具体问题:在执行kubectl命令时遇到找不到Pod、AUTH失败、连接拒绝等错误,需要判断部署是否成功并解决这些问题。 根据用户提供的信息,我们分步骤进行: ### 1. 检查Pod状态 首先,使用`kubectl get pods`命令查看Pod的运行状态。如果Pod状态不是`Running`,则部署可能未成功。 **命令:** ```bash kubectl -n mysql-server get pods -o wide kubectl -n redis-server get pods -o wide ``` **可能的问题及解决:** - **Pending状态**:可能是资源不足或节点选择问题。检查节点资源(CPU、内存)和节点标签(如`kubernetes.io/hostname`)是否正确。 - **CrashLoopBackOff**:查看日志定位原因,例如: ```bash kubectl -n mysql-server logs <pod_name> ``` ### 2. 解决kubectl exec时找不到Pod的问题 如果执行`kubectl exec`时提示“找不到Pod”,可能是以下原因: - **Pod名称错误**:使用`kubectl get pods`确认正确的Pod名称。 - **命名空间错误**:确保指定了正确的命名空间(如`-n mysql-server`或`-n redis-server`)。 **正确命令示例:** ```bash # 连接MySQL主库 kubectl -n mysql-server exec -it mysql-master-xxxxxx -- mysql -uroot -proot ``` ### 3. 解决AUTH失败问题 在MySQL或Redis连接时出现认证失败,可能是密码错误或未正确设置环境变量。 **MySQL检查:** - 确认部署YAML中设置的密码(如`MYSQL_ROOT_PASSWORD: root`)与连接命令一致。 - 如果使用复制用户,检查从库初始化脚本中设置的`MASTER_USER`和`MASTER_PASSWORD`是否与主库创建的复制用户一致。 **Redis检查:** -Redis部署中,确认`redis.conf`或环境变量中设置的密码(如`requirepass`)与客户端连接时使用的密码一致。 ### 4. 解决连接拒绝问题 如果出现连接拒绝(如`Connection refused`),可能原因包括: - **服务未监听**:Pod内的服务未在指定端口启动。 - **网络策略限制**:检查NetworkPolicy是否允许访问。 - **服务配置错误**:检查Service的selector是否匹配Pod的标签。 **诊断步骤:** - 进入Pod内部检查服务状态: ```bash kubectl -n mysql-server exec -it <pod_name> -- netstat -tuln | grep 3306 kubectl -n redis-server exec -it <pod_name> -- netstat -tuln | grep 6379 ``` - 检查Service的Endpoint是否正常: ```bash kubectl -n mysql-server get endpoints kubectl -n redis-server get endpoints ``` ### 5. 验证MySQL主从复制 在MySQL部署中,验证主从复制是否成功: **主库执行:** ```bash kubectl -n mysql-server exec -it mysql-master-xxxxxx -- mysql -uroot -proot -e "SHOW MASTER STATUS;" ``` **从库执行:** ```bash kubectl -n mysql-server exec -it mysql-slave1-xxxxxx -- mysql -uroot -proot -e "SHOW SLAVE STATUS\G" ``` 检查输出中的`Slave_IO_Running`和`Slave_SQL_Running`是否为`Yes`。 ### 6. 验证Redis主从复制 在Redis部署中,验证主从复制: **主节点执行:** ```bash kubectl -n redis-server exec -it redis-master-xxxxxx -- redis-cli -a <password> INFO replication ``` 检查`connected_slaves`数量是否正确。 **从节点执行:** ```bash kubectl -n redis-server exec -it redis-slave-xxxxxx -- redis-cli -a <password> INFO replication ``` 检查`role`是否为`slave`且`master_link_status`为`up`。 ### 常见错误汇总: | 错误现象 | 可能原因 | 解决方案 | |---------|---------|---------| | Pod状态Pending | 节点资源不足或调度失败 | 检查节点资源,调整PV路径权限 | | 认证失败 | 密码错误 | 检查环境变量和配置文件中的密码 | | 连接拒绝 | 服务未启动或端口错误 | 进入Pod检查服务状态,检查Service配置 | | 复制中断 | 主从配置错误 | 检查主从日志,重新配置复制 | ### 示例:检查MySQL从库初始化日志 如果从库未正确复制,查看初始化脚本日志: ```bash kubectl -n mysql-server logs mysql-slave1-xxxxxx ``` 检查是否有错误信息,如主库连接失败或复制命令执行失败。 > **注意**:在初始化脚本中,我们使用`until`循环等待主库就绪,但如果主库启动过慢,可能需要增加重试次数或等待时间。 §§相关问题§§ 1. Kubernetes中如何诊断Pod启动失败的原因? 2. MySQL主从复制延迟过高应如何优化? 3. Redis在Kubernetes中如何实现持久化数据的自动备份? 4. 如何扩展Redis从节点以提高读取性能? </think>### 判断 Kubernetes 中 MySQL 和 Redis 部署是否成功的完整指南 #### 一、部署状态诊断(解决 Pod 找不到问题) 1. **检查 Pod 状态** ```bash # MySQL 命名空间 kubectl -n mysql-server get pods -o wide # Redis 命名空间 kubectl -n redis-server get pods -o wide ``` **异常状态处理:** - `Pending`:检查节点资源或 PV 绑定问题[^1] - `CrashLoopBackOff`:查看日志定位原因 ```bash kubectl -n mysql-server logs <pod_name> --tail=50 ``` 2. **验证 Pod 调度位置** ```bash # 检查 MySQL 主库是否在 k8smaster 节点 kubectl -n mysql-server describe pod mysql-master-xxx | grep Node: # 检查 Redis 从库是否在预期节点 kubectl -n redis-server describe pod redis-slave1-xxx | grep Node: ``` #### 二、认证问题排查(解决 AUTH 失败) 1. **MySQL 认证失败处理** ```bash # 检查环境变量是否注入 kubectl -n mysql-server exec mysql-master-xxx -- env | grep MYSQL_ROOT_PASSWORD # 临时进入容器调试 kubectl -n mysql-server exec -it mysql-master-xxx -- mysql -uroot -p # 输入环境变量中的密码(如 "root") ``` 2. **Redis 认证失败处理** ```bash # 验证配置文件中的 requirepass 设置 kubectl -n redis-server exec redis-master-xxx -- cat /usr/local/etc/redis/redis.conf | grep requirepass # 使用重定向避免密码泄露警告 kubectl -n redis-server exec redis-master-xxx -- redis-cli -a $REDIS_PASSWORD <<< "PING" ``` #### 三、连接拒绝问题排查 1. **服务连通性测试** ```bash # MySQL 内部服务测试 kubectl -n mysql-server run test-mysql --rm -it --image=mysql:5.7 -- \ mysql -h mysql-master.mysql-server -uroot -proot -e "SELECT 1" # Redis 内部服务测试 kubectl -n redis-server run test-redis --rm -it --image=redis:6.2 -- \ redis-cli -h redis-master.redis-server -a $REDIS_PASSWORD PING ``` 2. **端口监听验证** ```bash # 在 MySQL Pod 内检查端口监听 kubectl -n mysql-server exec mysql-master-xxx -- netstat -tuln | grep 3306 # 在 Redis Pod 内检查端口监听 kubectl -n redis-server exec redis-master-xxx -- netstat -tuln | grep 6379 ``` #### 四、部署成功验证标准 1. **MySQL 主从复制验证** ```bash # 主库执行 kubectl -n mysql-server exec mysql-master-xxx -- mysql -uroot -proot -e "SHOW MASTER STATUS\G" # 从库执行(替换 pod 名称) kubectl -n mysql-server exec mysql-slave1-xxx -- mysql -uroot -proot -e "SHOW SLAVE STATUS\G" | grep Running ``` **成功标志:** ``` Slave_IO_Running: Yes Slave_SQL_Running: Yes ``` 2. **Redis 主从复制验证** ```bash # 主节点执行 kubectl -n redis-server exec redis-master-xxx -- redis-cli -a $REDIS_PASSWORD INFO replication | grep connected_slaves # 从节点执行 kubectl -n redis-server exec redis-slave1-xxx -- redis-cli -a $REDIS_PASSWORD INFO replication | grep master_link_status ``` **成功标志:** ``` connected_slaves:2 # 从节点数量 master_link_status:up # 从节点状态 ``` #### 五、数据持久化验证 ```bash # 检查 PV/PVC 绑定状态 kubectl -n mysql-server get pv,pvc kubectl -n redis-server get pv,pvc # 验证 MySQL 数据写入持久化 kubectl -n mysql-server exec mysql-master-xxx -- mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test_persist;" kubectl delete pod -n mysql-server mysql-master-xxx kubectl -n mysql-server exec new-master-pod -- mysql -uroot -proot -e "SHOW DATABASES;" | grep test_persist ``` #### 六、典型问题解决方案 | 问题现象 | 原因分析 | 解决方案 | |---------|---------|---------| | `No such pod` | Pod 未启动或命名空间错误 | 检查 `kubectl get pods -A` 确认命名空间 | | `AUTH failed` | 密码不匹配或未注入 | 检查部署 YAML 的环境变量设置 | | `Connection refused` | 服务未监听端口 | 检查 Pod 内进程状态和防火墙规则 | | 持久化数据丢失 | PV 路径权限不足 | 在节点执行 `chmod 777 /root/mysql_k8s/*` | | 主从复制中断 | 二进制日志位置错误 | 在从库执行 `STOP SLAVE; RESET SLAVE;` 后重新配置 | > **重要提示**:MySQL 从库初始化脚本中的复制配置依赖主库完全启动。若遇到复制问题,可手动执行脚本: > ```bash > kubectl -n mysql-server exec mysql-slave1-xxx -- /docker-entrypoint-initdb.d/init-slave.sh > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值