Redis集群

概念

  • 分布式高可用内存数据库集群

工作原理

在这里插入图片描述

hash slots(哈希槽)

  • 16384个(0-16383)
  • 决定数据存储在哪个主服务器
  • 只有主服务器拥有hash slots
  • 不以hash slots决定能存多少数据,它决定数据存储在一台服务器上的几率有多大
  • 存数据时,对key使用CRC16算法计算hash值,使用该值对16384取余,余数对应的hash slots在哪台服务器占用的hash slots范围内,就存在哪台服务器,取数据同理

环境准备

主机名(角色) ip
client 192.168.4.50
MGM(management) 192.168.4.57
redisA 192.168.4.51
redisB 192.168.4.52
redisC 192.168.4.53
redisD 192.168.4.54
redisE 192.168.4.55
redisF 192.168.4.56
redisG(向集群添加服务器时使用) 192.168.4.58
redisH(向集群添加服务器时使用) 192.168.4.59
  • 各个节点部署Redis,不要设置密码,数据库中不能有数据!
  • 确认redis节点的服务运行是否正常:(ip和端口)
[root@mgm57] pssh -h ip.redis -i ss -antup |grep :63
tcp    LISTEN     0      128    192.168.4.53:6353                  *:*                   users:(("redis-server",pid=861,fd=6))
tcp    LISTEN     0      128    192.168.4.54:6354                  *:*                   users:(("redis-server",pid=861,fd=6))
tcp    LISTEN     0      128    192.168.4.52:6352                  *:*                   users:(("redis-server",pid=866,fd=6))
tcp    LISTEN     0      128    192.168.4.55:6355                  *:*                   users:(("redis-server",pid=859,fd=6))
tcp    LISTEN     0      128    192.168.4.51:6351                  *:*                   users:(("redis-server",pid=861,fd=6))
tcp    LISTEN     0      128    192.168.4.56:6356                  *:*                   users:(("redis-server",pid=844,fd=6))

创建集群

1)部署管理主机MGM57

也可以部署在一台redis节点上

  • 部署ruby脚本运行环境
  • 创建管理集群脚本redis-trib.rb(开发者提供)
[root@mgm57] yum -y install rubygems
[root@mgm57] gem install redis-3.2.1.gem  #提供管理集群的命令,redis-trib.rb脚本中使用的命令
[root@mgm57] tar -zxvf /root/redis-4.0.8.tar.gz -C /root
[root@mgm57] cp /root/redis-4.0.8/src/redis-trib.rb /root/bin
[root@mgm57] redis-trib.rb help  #查看使用方法
  • redis-trib.rb使用方法:
] redis-trib.rb <command> <options> <arguments...>
COMMAND 说明
create 创建集群
check 检查集群
info 查看集群信息
reshard 重新分片
del-node 删除主机
add-node --slave 添加slave主机
add-node 添加master主机
rebalance 平均分配hash slots

2)配置redis节点

[root@redisA-F ~]vim /etc/redis/6379.conf
815  cluster-enabled yes  #启用集群功能
823  cluster-config-file node-6379.conf  #存储集群信息的文件
829  cluster-node-timeout 5000  #超时时间(毫秒)

使用脚本批量执行:

[root@mgm57] vim redis_cluster.sh
#!/bin/bash
# Need SSH 'no password' login
for i in {51..56}
do
        ssh 192.168.4.$i "sed -ri '815s/#//' /etc/redis/6379.conf"
        ssh 192.168.4.$i "sed -ri '823s/#//' /etc/redis/6379.conf"
        ssh 192.168.4.$i "sed -ri '829s/#//' /etc/redis/6379.conf"
        ssh 192.168.4.$i "sed -ri '829s/15000/5000/' /etc/redis/6379.conf"
        ssh 192.168.4.$i "redis-cli -h 192.168.4.$i -p 63$i shutdown"
        ssh 192.168.4.$i "/etc/init.d/redis_6379 start" 
        ssh 192.168.4.$i "ss -antup |grep :163"     
done
[root@mgm57] bash redis_cluster.sh  #执行后的输出,服务端口+10000为集群端口
tcp    LISTEN     0      128    192.168.4.51:16351                 *:*                   users:(("redis-server",pid=1670,fd=8))
tcp    LISTEN     0      128    192.168.4.53:16353                 *:*                   users:(("redis-server",pid=1411,fd=8))
tcp    LISTEN     0      128    192.168.4.52:16352                 *:*                   users:(("redis-server",pid=1466,fd=8))
tcp    LISTEN     0      128    192.168.4.56:16356                 *:*                   users:(("redis-server",pid=1367,fd=8))
tcp    LISTEN     0      128    192.168.4.54:16354                 *:*                   users:(("redis-server",pid=1413,fd=8))
tcp    LISTEN     0      128    192.168.4.55:16355                 *:*                   users:(("redis-server",pid=1472,fd=8))

3)创建集群

--replicas 1: 指定从服务器数量,1代表每一台主服务器拥有一台从服务器,默认会选举3台主服务器

[root@mgm57] redis-trib.rb create --replicas 1 \   
> 192.168.4.51:6351 192.168.4.52:6352 \
> 192.168.4.53:6353 192.168.4.54:6354 \
> 192.168.4.55:6355 192.168.4.56:6356
....
Can I set the above configuration? (type 'yes' to accept): yes    #输入yes
....
[OK] All 16384 slots covered.     #正确输出

执行命令报错解决办法:

#!/bin/bash
for i in {51..56}
do
	ssh 192.168.4.$i redis-cli -h 192.168.4.$i -p 63$i shutdown
	ssh 192.168.4.$i rm -rf /var/lib/redis/6379/*
	ssh 192.168.4.$i /etc/init.d/redis_6379 start
done

再重新执行创建命令

4)查看集群状态信息

  • 管理主机查看
] redis-trib.rb info 192.168.4.51:6351 #查看集群信息
192.168.4.51:6351 (6b6c979e...) -> 0 keys | 5461 slots | 1 slaves.
192.168.4.52:6352 (6f59a5dd...) -> 0 keys | 5462 slots | 1 slaves.
192.168.4.53:6353 (b65ab75b...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

] redis-trib.rb check 192.168.4.51:6351 #检测集群(详细信息)
  • redis节点查看
] redis-cli -h 192.168.4.51 -p 6351  #连接redis
>cluster info   #查看集群信息
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6   #集群中的节点数量
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:3058
cluster_stats_messages_pong_sent:3852
cluster_stats_messages_sent:6910
cluster_stats_messages_ping_received:3847
cluster_stats_messages_pong_received:3058
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:6910

>cluster nodes  #查看节点

客户端访问集群

  • 访问集群中的任何服务器都可以,存取数据会自动到master服务器执行
[root@client] redis-cli -c -h 192.168.4.51 -p 6351  #-c代表访问集群
192.168.4.51:6351> KEYS *
(empty list or set)
192.168.4.51:6351> set x 1
-> Redirected to slot [16287] located at 192.168.4.53:6353  #保存到了53服务器上
OK
192.168.4.53:6353> KEYS *
1) "x"
192.168.4.53:6353> set y 2
OK
192.168.4.53:6353> set z 3
-> Redirected to slot [8157] located at 192.168.4.52:6352  #保存到了52服务器上
OK
192.168.4.52:6352> KEYS *
1) "z"
192.168.4.52:6352> get x
-> Redirected to slot [16287] located at 192.168.4.53:6353
"1"

高可用测试

  • 手动停止51的redis服务,51的slave服务器会自动升级为master,再次启动51,51会做为新master的slave
  • 一对主从服务器不能同时损坏

管理集群

1)向集群添加服务器

  • 在新服务器上运行redis并启用集群配置(需要2台,一主一从)
  • 添加master服务器58到集群
[root@mgm57] redis-trib.rb add-node 192.168.4.58:6358 192.168.4.51:6351  #58为新服务器,不指定主机角色时,默认为master,51可以写集群中的任意一台服务器
  • 给58服务器分配hash slots
[root@mgm57] redis-trib.rb reshard 192.168.4.51:6351  #重新分片
....
How many slots do you want to move (from 1 to 16384)? 4096   #分配多少个hash slots, 16384/4=4096
What is the receiving node ID? 723e2632c3397044da5d91200e10fae81e10fc1e   #hash slots分配给谁,写新服务器的ID
Please enter all the source node IDs.
....
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:all   #从哪个节点取出hash slots,all代表所有节点,也可以写一个节点编号
....
Do you want to proceed with the proposed reshard plan (yes/no)? yes  #yes
....
  • 给58服务器添加slave服务器59
[root@mgm57] redis-trib.rb add-node --slave [--master-id ID] 192.168.4.59:6359 192.168.4.51:6351
#不指定master-id时,会分配给slave最少的master

2)从集群移除服务器

  • 移除slave
    slave不占用slots,直接移除
[root@mgm57] redis-trib.rb del-node 192.168.4.51:6351 4f13432acb046444d66c8bde6e45fea1cad205d5  #指定服务器ID
>>> Removing node 4f13432acb046444d66c8bde6e45fea1cad205d5 from cluster 192.168.4.51:6351
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.  #移除主机会停止主机的redis服务
  • 移除master
    首先释放hash slots,再移除
[root@mgm57] redis-trib.rb reshard 192.168.4.51:6351
....
How many slots do you want to move (from 1 to 16384)? 4096  #移除的slots数量
What is the receiving node ID? b65ab75b537ccace1cfb294300ebff04c2de5e51   #slots给谁
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6f59a5dd69459d333525272caa4dfcd5b62f0de6  #写要移除的master服务器ID
Source node #2:done  #done表示不写了
Do you want to proceed with the proposed reshard plan (yes/no)? yes  #yes
....
[root@mgm57] redis-trib.rb del-node 192.168.4.51:6351 6f59a5dd69459d333525272caa4dfcd5b62f0de6  #移除

3)如何把移除的服务器再添加回去

[root@redis52] rm -rf /var/lib/redis/6379nodes-6379.conf
[root@redis52] /etc/init.d/redis_6379 start

[root@mgm57] redis-trib.rb add-node 192.168.4.52:6352 192.168.4.51:6351

或者:

[root@redis52] /etc/init.d/redis_6379 start
[root@redis52] redis-cli -h 192.168.4.52 -p 6352
>cluster reset   #重置cluster配置

[root@mgm57] redis-trib.rb add-node 192.168.4.52:6352 192.168.4.51:6351
发布了90 篇原创文章 · 获赞 7 · 访问量 3458
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览