redis之分布式架构
背景:
1.ubuntu16.04
2.docker容器
为何使用分布式?
1.当数据量较大时,单台节点无法满足业务时。需要将数据水平切分。
2.redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。每个节点拥有一部分hash槽。
3.若新增节点时,redis内部会重新分配16384哈希槽,只需将部分哈希槽迁移到新增节点即可完成水平扩展。
缺点?
1.因为key是根据CRC16取模后分配到不同的hash槽。因此集群环境下不支持多key操作。
2.网上说多key场景可以用hash tag处理,可以尝试下。
使用docker-compose.yml创建3个容器
redis节点ip和端口如下:
172.20.0.4:7001
172.20.0.2:7002
172.20.0.3:7003
version: '2'
services:
redis7001:
image: registry.cn-hangzhou.aliyuncs.com/xylink/redis:3.2_v1
container_name: redis7001
restart: always
ports:
- 7001:7001
volumes:
- '/app/redis/7001/redis.conf:/etc/redis/redis.conf'
- '/app/redis/redis-trib.rb:/etc/redis/redis-trib.rb'
command: redis-server /etc/redis/redis.conf
redis7002:
image: registry.cn-hangzhou.aliyuncs.com/xylink/redis:3.2_v1
container_name: redis7002
restart: always
ports:
- 7002:7002
volumes:
- '/app/redis/7002/redis.conf:/etc/redis/redis.conf'
- '/app/redis/redis-trib.rb:/etc/redis/redis-trib.rb'
command: redis-server /etc/redis/redis.conf
redis7003:
image: registry.cn-hangzhou.aliyuncs.com/xylink/redis:3.2_v1
container_name: redis7003
restart: always
ports:
- 7003:7003
volumes:
- '/app/redis/7003/redis.conf:/etc/redis/redis.conf'
- '/app/redis/redis-trib.rb:/etc/redis/redis-trib.rb'
command: redis-server /etc/redis/redis.conf
/app/redis/7001/redis.conf文件内容:
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
/app/redis/7002/redis.conf文件内容:
port 7002
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 5000
appendonly yes
/app/redis/7003/redis.conf文件内容:
port 7003
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 5000
appendonly yes
启动容器:
docker-compose up -d
查看容器 docker-compose ps
上面启动完redis容器后,并没有加入到集群中,需要使用官方提供的redis-trib.rb工具创建集群。
另外这个工具是ruby开发的,先按照以下ruby环境
#更新一下源
apt-get update
#安装ruby环境
apt-get install ruby
#安装wget
apt install wget
#下载gen包
wget http://rubygems.org/downloads/redis-3.3.0.gem
#安装ruby-redis插件
gem install -l redis-3.3.0.gem
gem install redis
创建集群
./redis-trib.rb create --replicas 0 172.20.0.4:7001 172.20.0.2:7002 172.20.0.3:7003
说明:
–replicas 0表示只创建master节点,不创建slave备份节点。replicas后面的0表示创建几个slave备份节点,这里我们只创建3个master节点。
输入 yes
到此,分布式集群创建完毕!
下面验证一下
./redis-trib.rb check 172.20.0.4:7001
我们随便登录一台机器
/usr/local/bin/redis-cli -c -h 172.20.0.4 -p 7001
这里我们登录 172.20.0.4 节点。设置hello1值,发现自动重定向到了172.20.0.3节点。
因为这里我们创建3个master节点,那么时候集群会down机呢?
1.若集群中任意master节点down机,并且没有slave节点,集群不可用。
2.如果超过半数的master节点down机,就算有slave节点,那么集群也不可用。
集群不可用错误:(error) CLUSTERDOWN The cluster is down
因此集群环境一定要创建slave节点,否则任意master节点fail就导致业务中断。
注:后面探讨集群环境下分布式+主从高可用架构。