《Redis内存数据库》Redis集群
前言
随着业务并发量的不断扩张,redis内存数据库也会有处理不过来的情况,故redis也考虑集群来缓解并发的压力。
原理
Redis 集群原理图
1. Redis集群中总共了16384个Slot 用于存放redis的键值对。这个Slot会平均分配给每一组集群(图中3组就分配成5461,5461,5462)。
2. 键值对的键值 经过crc16哈希处理后再除以16384 取余数,然后放入对应编号的Slot中。
3. 应用程序连接任何一个主节点都能获取到键值对信息,并且如果写入操作,会自动告知应用你重连对应的节点去写入信息。
搭建
1. 环境准备linux, 安装ruby。
yum install ruby rubygems -y
设置:ali镜像
gem sources -a http://mirrors.aliyun.com/rubygems/ -- 加入ali源
gem sources --remove https://rubygems.org/ -- 删除国外源
查看源为ali源。
gem install redis -v 3.3.3 -- 安装ruby驱动
创建redis实例的目录
mkdir -p /home/redis/master-replica/700{0..5}/data mkdir -p /home/redis/master-replica/700{0..5}/log
设置6个实例的配置文件
cat > /home/redis/master-replica/7000/redis.conf <<EOF protected-mode no port 7000 daemonize yes pidfile /var/run/redis_7000.pid loglevel notice logfile "/home/redis/master-replica/7000/log/redis.log" databases 16 dbfilename dump.rdb dir /home/redis/master-replica/7000/data cluster-enabled yes -- 开启集群 cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat > /home/redis/master-replica/7001/redis.conf <<EOF protected-mode no port 7001 daemonize yes pidfile /var/run/redis_7001.pid loglevel notice logfile "/home/redis/master-replica/7001/log/redis.log" databases 16 dbfilename dump.rdb dir /home/redis/master-replica/7001/data cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat > /home/redis/master-replica/7002/redis.conf <<EOF protected-mode no port 7002 daemonize yes pidfile /var/run/redis_7002.pid loglevel notice logfile "/home/redis/master-replica/7002/log/redis.log" databases 16 dbfilename dump.rdb dir /home/redis/master-replica/7002/data cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat > /home/redis/master-replica/7003/redis.conf <<EOF protected-mode no port 7003 daemonize yes pidfile /var/run/redis_7003.pid loglevel notice logfile "/home/redis/master-replica/7003/log/redis.log" databases 16 dbfilename dump.rdb dir /home/redis/master-replica/7003/data cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat > /home/redis/master-replica/7004/redis.conf <<EOF protected-mode no port 7004 daemonize yes pidfile /var/run/redis_7004.pid loglevel notice logfile "/home/redis/master-replica/7004/log/redis.log" databases 16 dbfilename dump.rdb dir /home/redis/master-replica/7004/data cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat > /home/redis/master-replica/7005/redis.conf <<EOF protected-mode no port 7005 daemonize yes pidfile /var/run/redis_7005.pid loglevel notice logfile "/home/redis/master-replica/7005/log/redis.log" databases 16 dbfilename dump.rdb dir /home/redis/master-replica/7005/data cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF
启动六个实例
redis-server /home/redis/master-replica/7000/redis.conf redis-server /home/redis/master-replica/7001/redis.conf redis-server /home/redis/master-replica/7002/redis.conf redis-server /home/redis/master-replica/7003/redis.conf redis-server /home/redis/master-replica/7004/redis.conf redis-server /home/redis/master-replica/7005/redis.conf
查看六个实例是否启动
ps -ef | grep redis
最后构建集群
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
-- replicas 1 表示几个从库。 第一个节点会自动成为管理节点
查看集群情况
redis-cli -p 7000 cluster nodes | grep master -- 查看主节点 redis-cli -p 7000 cluster nodes | grep slave -- 查看从节点
管理
增加集群节点
新增两个实例(看上面实例新建方式),并且启动。
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 -- 添加7006节点到7000集群中。
重新分配Slot
redis-trib.rb reshard 127.0.0.1:7000
重新查询Slot分配情况:
重节点加入集群
redis-trib.rb add-node --slave --master-id bcf4285a50d51929c21340bc25a05b9e77db4f74 127.0.0.1:7007 127.0.0.1:7000
bcf4285a50d51929c21340bc25a05b9e77db4f74 是该从节点对应的主节点node_id。 查看从节点情况:
删除集群节点
第一步重新分配Slot节点(平均分配给剩余节点)
redis-trib.rb reshard 127.0.0.1:7000
按照平均分成3份分配回去
done 表结束。 重复三次以上操作。
删除集群节点
redis-trib.rb del-node 127.0.0.1:7006 bcf4285a50d51929c21340bc25a05b9e77db4f74 redis-trib.rb del-node 127.0.0.1:7007 19b771f682865b62c25818092fe82b4488dc26c5
ok 删除集群节点完成。 被删除的节点不能直接再加回去。
特别注意点:redis集群如果(redis.conf)设置上密码:
requirepass 123456
masterauth 123456
则需要修改如下配置才能构建集群:
vi /usr/local/share/gems/gems/redis-3.3.3/lib/redis/client.rb
总结
Redis 集群操作简单,可靠,故障恢复也是非常智能,推荐。
This moment will nap, you will have a dream; But this moment study,you will interpret a dream.