0.内容概览
>> wget https://github.com/redis/redis/archive/7.2.4.tar.gz
>> tar -zxvf 7.2.4.tar.gz && mv redis-7.2.4 redis && cd redis
>> make -j 8 && sudo make install
>> redis-server redis.conf
>> cp redis.conf redis7001.conf
>> vim redis7001.conf
port 7001 //端口7001,7002,7003
bind 0.0.0.0 //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7001.pid //pidfile文件对应7001,7002,7003
logfile "redis7001.log"
dbfilename dump7001.rdb
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
appendfilename "appendonly7001.aof"
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7001,7002,7003 把注释#去掉
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置 把注释#去掉
按照相同的方法修改得到redis7001.conf,redis7002.conf,可以使用下面的命令来生成redis7002.conf文件
>> sed 's/7001/7002/g' redis7001.conf > redis7002.conf
>> vim start-all-redis.sh
#! /bin/bash
redis-server /home/mirror/software/redis-7.2.4/redis7001.conf
redis-server /home/mirror/software/redis-7.2.4/redis7002.conf
redis-server /home/mirror/software/redis-7.2.4/redis7003.conf
redis-server /home/mirror/software/redis-7.2.4/redis7004.conf
redis-server /home/mirror/software/redis-7.2.4/redis7005.conf
redis-server /home/mirror/software/redis-7.2.4/redis7006.conf
>> chmod +x start-all-redis.sh
>> sh start-all-redis.sh
>> ps aux | grep redis
3.1 原生集群步骤
(1) cluster-enable yes
(2) cluster-config-file nodes_7001.conf
[2] meet:cluster meet ip port
[3] 指派槽位:
(1) 通过命令计算key的槽位:cluster keyslot key
- (a) 3主:16384 / 3,每个主机分配槽位范围0-5462, 5462-10923, 10923-16384
- (b) 4主:16384 / 4, 每个主机槽位4096
(2) cluster addslots slot(槽位下标)
[4] 分配主从:cluster replicate node-id
3.2 最新配置方式
redis5.0后,可以直接使用redis-cli来进行集群配置。
[1] 查看redis-cli的帮助参数:
>> redis-cli --cluster help
>> redis-cli --cluster create --cluster-replicas 1 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 127.0.0.1:7006
其中 --cluster-replicas 1
参数数字是分配主从节点数量比例:
1:一主一从;
2:一主两从;
>> redis-cli -c -p 7001
-c
表示以集群的形式访问 7001
端口,-p 7001
表示端口为7001。
>> set name laosun
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
>> get name
"laoshi"
>> exit
>> redis-cli -c -p 7006
>> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"laoshi"
可以看到7006获取name值,会自动跳转到7002获取值,这也是redis cluster的特点,它去中心化 ,每个节点都是对等的,连接哪个节点都可以获取和设置数据。
>> sed 's/7001/7007/g' redis7001.conf > redis7007.conf
>> sed 's/7001/7008/g' redis7001.conf > redis7008.conf
>> redis-server redis7007.conf
>> redis-server redis7008.conf
# redis-cli --cluster add-node new_host: new_port exist_host:exist_port --cluster-slave(以集群从节点身份加入) --cluster-master-id <arg>(跟随的主节点node-id)
# 默认为主节点
>> redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
# 以从节点身份加入
>> redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 --cluster-slave --cluster-master-id 2f1b662489c7be79b6470408d6b4f4bcf8c37ccb
7008跟随7007,此时集群虽然已经建立,但并未分配槽位,所以无法保存数据,从集群中分片出槽位:
>> redis-cli --cluster reshard 127.0.0.1:7001
槽位就分配来了,注意,槽位分配过来,槽位上数据也跟随过来。
[4] 缩容
(a) 移除槽位
# redis-cli --cluster reshard 集群任意节点 --cluster-from 7007的nodeid --cluster-to 7001的nodeid --cluster-slots 槽位数
>> redis-cli --cluster reshard 127.0.0.1:7001 --cluster-from 2f1b662489c7be79b6470408d6b4f4bcf8c37ccb --cluster-to 8f6b141770840b0e9607c8c395c9b3b68161e96f --cluster-slots 1000
# redis-cli --cluster del-node host:port node_id
>> redis-cli --cluster del-node 127.0.0.1:7008
afbdd25dadeda8a2de24323e207bdd4f5ec0d3d9
>> redis-cli --cluster del-node 127.0.0.1:7001
2f1b662489c7be79b6470408d6b4f4bcf8c37ccb
[1] Failed to write PID file:permision denied
# 1.查询pid文件读写路径
>> vim redis.conf
# 2.查询关键字
/pidfile
>> pidfile /home/mirror/software/redis/redis_6379.pid
# 3./var/run文件夹下创建redis_6379.pid文件,并给一下权限
>> sudo chmod 777 redis_6379.pid
[2] overcommit_memory is set to 0 Background save may fail under low memory condition
# 1.修改配置
>> sudo vim /etc/sysctl.conf
# 添加如下配置
vm.overcommit_memory = 1
# 2.使配置生效
>> sysctl -p