redis-cluster搭建
文章目录
1.安装redis-cluster
1.1环境介绍
- 共使用三台centos服务器,每台服务器各分部一台master节点,每台主节点都有其他主节点的从节点,保证了即使有两台服务器意外停止运行,redis-cluster也可以保证正常运行,不会丢失数据
1.2下载安装(分别在三台服务器上执行)
- redis官方集群在3.0之后才支持cluster部署,我们在这里使用3.2.12版本
- 下载地址:redis download
- 官方文档:英文版 ,中文文档
1.2.1安装ruby环境(redis-trib.rb使用ruby编写)
yum install rubygems
tar zxf ruby-2.4.4.tar.gz
cd ruby-2.4.4
./configure
make
make install
1.2.2安装redis
tar zxf redis-3.2.12.tar.gz
cd redis-3.2.12
make
make install PREFIX=/usr/local/redis-cluster
1.2.3安装redis gem
gem install redis
- 如果有低版本的ruby存在会提示安装失败,执行以下操作
mv /usr/bin/ruby /usr/bin/ruby_old
cp /usr/local/bin/ruby /usr/bin/
1.3配置redis服务(分别在三台服务器上执行)
cp /usr/local/src/redis-3.2.12/redis.conf /usr/local/redis-cluster/
#生成配置模板文件
cd /usr/local/
sed -i "s/^daemonize no/daemonize yes/" redis-cluster/redis.conf
sed -i "s/^appendonly no/appendonly yes/" redis-cluster/redis.conf
echo "cluster-enabled yes" >> redis-cluster/redis.conf
echo "cluster-config-file nodes.conf" >> redis-cluster/redis.conf
echo "cluster-node-timeout 5000" >> redis-cluster/redis.conf
cp -r redis-cluster redis_01
cp -r redis-cluster redis_02
cp -r redis-cluster redis_03
sed -i "s/^port 6379/port 7001/" redis_01/redis.conf
sed -i "s/^port 6379/port 7002/" redis_02/redis.conf
sed -i "s/^port 6379/port 7003/" redis_03/redis.conf
#启动
cd /usr/local/redis_01
./bin/redis-server ./redis.conf
cd /usr/local/redis_02
./bin/redis-server ./redis.conf
cd /usr/local/redis_03
./bin/redis-server ./redis.conf
1.3.1 配置redis-cluster(自动配置redis,从库是随机分配的,)
cp /usr/local/src/redis-3.2.12/src/redis-trib.rb /usr/local/redis-cluster/bin/
./redis-trib.rb create --replicas 2 192.168.1.124:7001 192.168.1.124:7002 192.168.1.124:7003 192.168.1.116:7001 192.168.1.116:7002 192.168.1.116:7003 192.168.1.234:7001 192.168.1.234:7002 192.168.1.234:7003
- –replicas :从库数量
2.redis-cluster相关操作
2.1修改从库所属master
因为从库是系统随机分配的,极大的几率出现主从在同一台服务器上,提升了使用风险
- 查询node节点信息
redis-cli -h <IP> -p <port> cluster nodes
redis-cli -h 192.168.1.124 -p 7002 cluster nodes
- 红色标记为主节点
- 绿色标记为主从生成到了同一台服务器上(存在风险)
- 我们需要把紫色标记的这两行记录的master-id进行重新赋值(如下)
192.168.1.234:7002 > d720995b15d5451fa1a2b6665bd249e90daa93b7
[[email protected] redis_03]# ./bin/redis-cli -h 192.168.1.234 -p 7002
192.168.1.234:7002> cluster replicate d720995b15d5451fa1a2b6665bd249e90daa93b7
OK
192.168.1.124:7003 > c5578947475750bd1df722abf001bd74f5c0af70
[[email protected] redis_01]# redis-cli -c -h 192.168.1.124 -p 7003
192.168.1.124:7003> cluster replicate c5578947475750bd1df722abf001bd74f5c0af70
OK
修改后再次查看
此时主从已经分布到不同的机器上
2.2 测试redis集群高可用
插入测试数据
[[email protected]_db_02 redis_03]# redis-cli -c -h 192.168.1.116 -p 7001
192.168.1.116:7001> set coco '001'
-> Redirected to slot [13924] located at 192.168.1.234:7001
OK
[[email protected]_db_02 redis_03]# redis-cli -c -h 192.168.1.234 -p 7001
192.168.1.124:7001> get coco
-> Redirected to slot [13924] located at 192.168.1.234:7001
"001"
停掉两个master节点
[[email protected]_db_02 redis_03]# redis-cli -h 192.168.1.234 -p 7001 debug segfault
Error: Server closed the connection
[[email protected]_db_02 redis_03]# redis-cli -h 192.168.1.116 -p 7001 debug segfault
Error: Server closed the connection
- 查看集群状态
此时116和234 7001端口状态已经为fail,另外两台从库重新选举升级为主库
- 测试集群是否正常
[[email protected]_db_02 redis_03]# redis-cli -c -h 192.168.1.124 -p 7002
192.168.1.124:7002> get coco
-> Redirected to slot [13924] located at 192.168.1.116:7003
"001"
数据获取正常
重新拉起116和234的7001端口(此时这两个端口为从库)
- 启动路径需要在nodes.conf同一级目录(可在配置文件中配置绝对路径)
/usr/local/redis_01
./bin/redis-server redis.conf
- 查看集群状态
重新将7001端口改为主库
[[email protected] redis_01]# redis-cli -c -h 192.168.1.234 -p 7001
192.168.1.234:7001> CLUSTER FAILOVER
OK
[[email protected] redis_01]# redis-cli -c -h 192.168.1.116 -p 7001
192.168.1.116:7001> CLUSTER FAILOVER
OK
- 查看集群状态
此时出现了主从处于统一服务器的状况,采用之前切换从库master-id方法可以解决,若想充分利用redis的特性需要开发修改代码