问题
容量不够了, Redis如何扩容?
并发写操作, Redis如何分摊?
论是什么模式, 主服务器炸了, 导致了ip地址发生变化, 应用程序中配置需要修改对应的主机地址,端口等信息, 之前要通过代理主机来解决, 但是redis3.0开始提供了解决方案: 无中心化集群配置.
无中心化集群中任何一台服务器都可以作为集群的入口, 它们直接互相连通.
什么是集群
Redis集群实现了水平扩容, 即启动N个redis节点, 将整个数据库分布存储到N个节点中, 每个节点存储1/N数据.
Redis集群通过分区来提供一定程度的可用性, 即使集群中有一部分节点失效或无法进行通信, 集群也可以继续处理命令
搭建集群
- 删除rdb,aof文件.
- 制作6个实例.
redisXXXX.conf后追加以下内容:
1 | cluster-enabled yes |
- 启动6个服务.
- 将6个节点合成一个集群
下面是一行命令, 写服务器ip和设定的端口号, 不能写127.0.0.11
2
3
4
5
6
7redis-cli --cluster create --cluster-replicas 1
192.168.xxx.xxx:6379
192.168.xxx.xxx:6380
192.168.xxx.xxx:6381
192.168.xxx.xxx:6389
192.168.xxx.xxx:6390
192.168.xxx.xxx:6391
- 测试
连接集群. 用集群中的任一端口均可.redis-cli -c -p 6379
cluster nodes
: 查看集群中节点信息.
主从自动设置. 一个集群至少要有三个主节点.--cluster-replicas 1
表示从库最小分配.
分配原则: 尽量保证每个主数据库运行在不同的IP地址, 每个从库和主库不在一个IP地址上.
- 什么是slots
slots译为插槽.
一个redis集群包含16384个插槽, 数据库中的每个键都属于这16384个插槽中的一个.
集群使用公式CRC16(key) % 16384 来计算key属于哪个槽, 其CRC16(key)语句用于计算key的CRC16校验和.
集群中的一个节点负责一些插槽.
如图所示, 0-5460, 5461-10922, 10923-16383.
也就是说, 我们这个集群, 不论从那个入口进入, key插入位置都要经过计算slot后才插入. 那么一个问题来了, 如果我们用批量插入命令呢?
报错了!
我们想要批量插入就要这么写:
1 | mset name{user} lucy age{user} 20 |
其他基本命令
cluster keyslot KEY
: 返回KEY的slot槽值cluster countkeysinslot SLOT
: 返回插槽中键的数量, 注意只能看本服务器负责的插槽的值.cluster getkeysinslot SLOT COUNT
: 返回count个slot槽中的键.
故障恢复
某一个主机挂了, 其他从机立刻升级为主机, 当挂掉的主机重启, 它变为了从机.
如果某一段插槽的主从节点都宕机了, redis服务是否还能继续?
配置文件参数:cluster-require-full-coverge
.
如果是yes, 那么整个集群都挂了.
如果是no, 那么只有那一段不能用.
集群的Jedis开发
emmmmmm.
真没什么特别的.