注:redis-cluster最少需要三主三从
修改redis配置文件
每台机器上redis都需要配置
//绑定服务器IP地址(多个用空格分开,如果是本机启用多个redis,则用默认配置就好,如果是多台服务器,就必须指定ip)
bind 192.168.127.130 127.0.0.1
//绑定端口号,必须修改,以此来区分Redis实例
port 7000
//后台运行
daemonize yes
//密码
requirepass 123456
//修改pid进程文件名
pidfile /var/run/redis-1.pid
//修改日志文件名称(必须指定绝对路径)
logfile /root/application/program/redis-cluster/node1/redis.log
//修改数据文件存放地址
dir /root/application/program/redis-cluster/node1/
//启用集群
cluster-enabled yes
//配置每个节点的配置文件,同样以端口号为名称
cluster-config-file nodes-1.conf
//配置集群节点的超时时间,可改可不改
cluster-node-timeout 15000
//启动AOF增量持久化策略
appendonly yes
//发生改变就记录日志
appendfsync always
配置文件更改完之后,分别启动所有redis
./redis-server [指定配置文件 /**/redis.conf]
开放redis服务端口
#开放端口
firewall-cmd --zone=public --add-port=6379/tcp –permanent
#多台redis服务器做通信的时候会需要10000 + 端口号(原因百度,我不记得了,但是必须配置)
firewall-cmd --zone=public --add-port=16379/tcp –permanent
#重启防火墙服务:
systemctl restart firewalld.service
#其他命令
#关闭端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
# 查看所有永久开放的端口(默认为空)
firewall-cmd --list-ports --permanent
#查看Linux某端口的情况
netstat -tunlp | grep 6379
自动创建集群,(当然也可以手动)
在启动好的随便一台redis机器上运行
./redis-cli --cluster create [ip]:[port] [ip]:[port]….[有密码的话需要指定 –a 123456] --cluster-replicas 1
--cluster-replicas 1这个表示为每台 主 设置几个 从
然后后他会自己创建集群
这时候注意,如果是本机堕胎redis的集群,那么它会自动创建完
如果是不同服务器之间他会卡在
redis****集群环境卡在****Waiting for the cluster to join..
,这个时候需要去其他redis的cli命令去 加入到集群中,
CLUSTER MEET ip port
这个时候在创建集群的地方可能会出现错误
warning 1 nodes(s) may unreachable
cluster bus ports must be reachable by every node.
remeber that cluster bus ports are different form standard instance ports
这是因为两台服务器之间的通信没有打通,去看看是不是之前防火墙端口没开,还有配置文件bind是否指定了ip
使用cluster meet加入进去后,看到
[OK] All 16384 slots covered
则表示集群创建成功
然后去set get测试
这个时候如果不是集群模式连接会报错redis集群报错:
(error) MOVED
需要用集群模式去连接
./redis-cli -a xxxx -c
其他问题:
could not connect to redis at xxxx cannot assign requestd address
Redis:Cannot assign requested address的解决办法
客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即“Cannot assign requestedaddress”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。
执行命令修改如下2个内核参数(需要root权限)
//开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_timestamps=1
//表示开启TCP连接中TIME-WAIT sockets的快速回收
sysctl -w net.ipv4.tcp_tw_recycle=1