Redis集群是一个由多个主从节点组成的高可用集群,它具备复制、高可用和分片等特性html
3台主机分别是:node
192.168.160.146redis
192.168.160.152算法
192.168.160.153数据库
每台服务器1主1从,共3主3从vim
相关安装包存储路径:/usr/local/redis-5.0.2缓存
① Redis安装详见Redis系列(一):Redis简介ruby
② 进入redis-5.0.2 cd /usr/local/redis-5.0.2服务器
③ 建立集群配置文件夹 mkdir redis-cluster网络
④ (1)cd redis-cluster (2) mkdir 7001 和 mkdir 7002
⑤ (1)cp /usr/local/redis-5.0.2/redis.conf 7001/ (2) cd 7001
⑥ 编辑redis配置文件 vim redis.conf 修改内容以下:
daemonize yes port 7001 dir /usr/local/redis-5.0.2/redis-cluster/7001/ 这里只是demo,正式环境把数据跟redis安装包分开 cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 5000 #bind 127.0.0.1 protected-mode no appendonly yes
修改完后,cp redis.conf ../7002/ 而后 cd /usr/local/redis-5.0.2/redis-cluster/7002 并修改的配置把全部的7001改为7002
⑦ (1) scp -r /usr/local/redis-5.0.2 root@192.168.160.152:/usr/local/ (2) scp -r /usr/local/redis-5.0.2 root@192.168.160.153:/usr/local/ 将redis拷贝到其余2台主机上去,(3)分别进到 192.168.160.152 cd /usr/local 和192.168.160.153 cd /usr/local 以下:
⑧ 分别启动6个redis实例,而后检查是否启动成功 (1)/usr/local/redis-5.0.2/bin/redis-server /usr/local/redis-5.0.2/redis-cluster/700*/redis.conf (2)ps -ef | grep redis 查看是否启动成功
⑨ 用redis-cli建立整个redis集群(redis5之前的版本集群是依靠ruby脚本redis-trib.rb实现) /usr/local/redis-5.0.2/bin/redis-cli --cluster create --cluster-replicas 1 192.168.160.146:7001 192.168.160.152:7001 192.168.160.153:7001 192.168.160.146:7002 192.168.160.152:7002 192.168.160.153:7002
⑩ 验证集群: (1)链接任意一个客户端便可:./redis-cli -c -h -p (-a访问服务端密码,-c表示集群模式,指定ip地址和端口号)如:/usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* (2)进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表) (3)进行数据操做验证 (4)关闭集群则须要逐个进行关闭,使用命令: /usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* shutdown
其中cluster nodes信息以下:
9f71f69f061d9e811161d6be8a93f81f53304aed 192.168.160.152:7001@17001 master - 0 1575046303552 2 connected 5461-10922 a5447a0de83b33c028a9374372aa5602a869602e 192.168.160.152:7002@17002 slave dd939a72e405bf1dbd6fd538bc4383642435298e 0 1575046301531 5 connected e7f80ba80749904838b6d779a0646e7f22313624 192.168.160.146:7001@17001 myself,master - 0 1575046303000 1 connected 0-5460 35582c86fc41f67d0089da2e21e99d9c66164dd3 192.168.160.153:7002@17002 slave e7f80ba80749904838b6d779a0646e7f22313624 0 1575046302443 6 connected dd939a72e405bf1dbd6fd538bc4383642435298e 192.168.160.153:7001@17001 master - 0 1575046303956 3 connected 10923-16383 eddc783d11a4b46cebf157b5a6488c4346aec541 192.168.160.146:7002@17002 slave 9f71f69f061d9e811161d6be8a93f81f53304aed 0 1575046303452 4 connected #含义# #节点ID #IP:端口:集群端口 #标志: master, slave, myself, fail #若是是从节点这里是他对应的主节点ID #集群最近一次向节点发送PING 命令以后,过去了多长时间还没接到回复 #节点最近一次返回PONG回复的时间 #本节点的网络链接状况 #节点目前包含的槽:例如 192.168.160.146:7001目前包含0-5460个哈希槽(master)
至此Redis集群搭建完成!!!!!
Redis Cluster没有单机的那种16个数据库(0-15)的概念,而是分红了16384个slots(槽位),每一个节点负责其中一部分槽位,槽位的信息存储于每一个节点中;当客户端来链接集群时,它先获得一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个key时,能够直接定位到目标节点。同时由于槽位的信息可能会存在客户端与服务器不一致的状况,还须要纠正机制来实现槽位信息的校验调整。
Redis Cluster默认会对key值使用CRC16算法进行hash获得一个整数值,而后用这个整数值对16384进行取模来获得具体槽位。HASH_SLOT = CRC16(key) mod 16384
当客户端向一个错误的节点发出了指令,该节点会发现指令的key所在的槽位并不归本身管理,这时它会向客户端发送一个特殊的跳转指令携带目标操做的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操做,还会同步更新纠正本地的槽位映射表缓存,后续全部key将使用新的槽位映射表。