redis集群搭建:
1、环境准备
redis的实例是通过redis.conf启动的,一个redis服务中复制多个redis.conf就可以启动多个实例,本机使用三台虚拟机、六个redis实例进行集群搭建;
在三台机器上个复制两个redis.conf文件,修改如下,每个文件的端口不一样:
(1)daemonize yes (后台启动)
(2)port 6380(分别对每个机器的端口号进行设置)
(3)pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件
(4)dir /usr/local/redis‐cluster/6380/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
(5)cluster‐enabled yes(启动集群模式)
(6)cluster‐config‐file nodes‐6380.conf(集群节点信息文件,这里800x最好和port对应上)
(7)cluster‐node‐timeout 10000
(8)# bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
(9)protected‐mode no (关闭保护模式)
(10)appendonly yes
(11) requirepass 123456(设置redis访问密码)
(12) masterauth redis(设置集群节点间访问密码,跟上面一致)
2、启动集群节点:
1、启动6个节点:在redis目录下执行 src/redis-server /usr/local/redis-5.0.3/cluster/redis-6380.conf
2、创建集群:待6个节点都启动成功后在其中一台服务器的/usr/local/redis-5.0.3/ 目录下执行创建集群命令(命令中的1是一个主节点有一个从节点,六个实例就是三个主节点、三个从节点,-a 后面的是配置文件中masterauth配置的登录密码):
src/redis-cli -a redis --cluster create --cluster-replicas 1 192.168.60.158:6380 192.168.60.158:6381 192.168.60.159:6382 192.168.60.159:6383 192.168.60.156:6384 192.168.60.156:6385
tips:创建集群的redis节点是不能有数据的,否则集群会创建不成功,如果redis节点中有数据可以参照下面链接将数据清空:[ERR] Node 192.168.0.161:6380 is not empty. Either the node already knows other nodes (check with CL_node 192.168.163.130:6387 is not empty. either the_水煮胡萝卜的博客-CSDN博客
创建集群时报错连不上其他节点可以关闭防火墙:
关闭防火墙 systemctl stop firewalld 查看防火墙状态: systemctl status firewalld
创建成功的输出如下,16384个槽分配到三个主节点上,主从节点的关系不是按上面命令的节点先后顺序,而是随机分配,这样一个主节点挂了其他机器上的从节点可以成为主节点,可以避免一台服务器挂了后集群不可用;
集群搭建成功后随机登录一个节点(redis目录下执行 src/redis-cli -a redis -p 6080,执行src目录下的redis-cli文件,-a指定登录密码、-p指定端口 )进行验证,
1、cluster info(查看集群信息)、cluster nodes(查看节点列表)
2、set的时候根据key的hash值分配到对应的redis节点
关闭集群则需要逐个进行关闭,使用命令:
/usr/local/redis-5.0.3/src/redis-cli -a redis -c -h 192.168.60.158 -p 6380 shutdown
下次启动集群直接将所有集群节点启动即可,不要再重新创建集群
Redis的集群选举:
(1)、当master节点挂了以后,slave节点发现master节点的状态是fail时,广播FAILOVER_AUTH_REQUEST 给所有的节点,其他的节点收到消息后只有master节点返回FAILOVER_AUTH_ACK,当这个slave节点收到超过半数master的返回ack,则此slave节点变成master节点(所有redis集群最少需要3个master,如果只有两个master,其中一个挂了后另一个不能选举成功);
(2)、从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票;
(3)、理论上持有最新数据的slave将会首先发起选举;
集群是否完整才能对外提供服务:
当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用,如果为yes则集群不可用。
为no时,表示当前节点对应的插槽范围无法读写数据,其他节点及插槽可正常使用;
为yes时,表示需要集群完整才能对外提供服务,所以此时所有master节点都将不可用;
详细课件见附件03:链接:https://pan.baidu.com/s/1-HQdi5exXHr2vYDiXt72iQ?pwd=fj7j
下面demo用两种方式访问redis集群,用的jdk8、idea、maven3.8.4:
链接:https://pan.baidu.com/s/19roIZ6Iw1cQ6rJuUFfsFVg?pwd=nqaa