单机安装redis
docker run -d -p 6379:6379 --name redis-node-1 -v /data/redis/share/redis-node-1:/data --privileged=true redis
1亿条数据怎么做缓存?
可以使用多主多从;
哈希取余分区:使用hash(key)/机器数,但是有个缺点,有一台机器挂了,他还是按照之前的机器数去算的;
一致性哈希算法分区:这里按照2的32次方取余,构成一个hash环,有一台机器挂了,也不会受影响,对哈希取余分区,进行了优化,缺点是如果机器少了,就会造成资源倾斜;
哈希槽分区:哈希槽就是一个数组, redis通过crc16算法对key得出一个结果,然后对16384取余,得出在0-16383之间的一个值,然后放入对应的机器上,减少资源倾斜;
而我们的多主多从就是使用的哈希槽分区;
为啥redis使用16384个哈希槽?
因为16384个槽,在1000台内的机器就够用了,超过1000台机器就会造成网络拥堵,所以redis的作者,不建议超过1000台机器。
创建redis集群
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:latest --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:latest --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:latest --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:latest --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:latest --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:latest --cluster-enabled yes --appendonly yes --port 6386
命令解释
--net host 使用宿主机的IP和端口,默认
--privileged=true 获取宿主机root用户权限
--cluster-enabled yes 开启redis集群
--appendonly yes 开启aof持久化
进入容器redis-node-1并为6台机器构建集群关系
docker exec -it redis-node-1 /bin/bash
构建主从关系
redis-cli --cluster create 192.168.184.134:6381 192.168.184.134:6382 192.168.184.134:6383 192.168.184.134:6384 192.168.184.134:6385 192.168.184.134:6386 --cluster-replicas 1
--cluster-replicas 1表示为每一个master节点 ,创建一个slave节点
我们在6381端口这个节点,进入redis
redis-cli -p 6381
查看集群状态
cluster info
查看节点状态
cluster nodes
我们先插入一条数据看看好不好使
可以看到,插入bb的时候,报错了
为啥呢?因为bb这个槽是8620,在5461-10922之间,所以插入不到
那么我们要想插入怎么办呢?
使用-c 优化路由,重新执行一下
redis-cli -p 6381 -c
可以看到,插入bb的时候,自动重定向到了6382这个端口
接下来我们查看下集群信息
redis-cli --cluster check 192.168.184.134:6381
我们可以看到,6381是master,6385是slave
那么接下来,我们停掉master看看slave会不会变成master
docker stop redis-node-1
我们在6385这个端口号对应的机器上查看下节点状态
docker exec -it redis-node-5 /bin/bash
redis-cli -p 6385 -c
cluster nodes
可以看到6381挂掉了,6385成为了master
我们这时候在恢复下6381
docker start redis-node-1
再次查看下节点状态,可以看到6381变成了slave
cluster nodes
接下来,我们看下扩容
新建6387和6388两个端口
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:latest --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:latest --cluster-enabled yes --appendonly yes --port 6388
docker ps
进入6387的容器
docker exec -it redis-node-7 /bin/bash
将新增的6387作为master节点加入集群
redis-cli --cluster add-node 192.168.184.134:6387 192.168.184.134:6381
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于找到组织加入集群
检查集群情况
redis-cli --cluster check 192.168.184.134:6381
6387暂时没有槽号
接下来重新分配槽号
redis-cli --cluster reshard 192.168.184.134:6381
这里的4096是16384/4台master算出来的
下面的node ID就是6387 M:后面的数据
Source node :填写all
这里输入yes
再次检查下集群情况
redis-cli --cluster check 192.168.184.134:6381
可以看到,从3个master各自匀出来一些,分配到了6387
接下来,我们为6387master ,分配salve节点
命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
redis-cli --cluster add-node 192.168.184.134:6388 192.168.184.134:6387 --cluster-slave --cluster-master-id a39055f975a05b2b2f66e9f44b7081295726d970
再次检查下集群情况
redis-cli --cluster check 192.168.184.134:6381
可以看到我们现在的集群就是4主4从
接下来我们在看下缩容,把6387和6388移除掉
先来看下集群情况
redis-cli --cluster check 192.168.184.134:6381
找到从机的id
将6388删除 从集群中将4号从节点6388删除
命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.184.134:6388 26f8a991f11a4fb5d57a9956c88ed714d4928802
在来看下集群情况
redis-cli --cluster check 192.168.184.134:6381
从机已经被删除了
接下来将6387的槽号清空,重新分配
redis-cli --cluster reshard 192.168.184.134:6381
在这里随便选择一个master节点的id ,来接手6387的槽
这里的资源节点就是6387的id
接下来输入done
输入yes
在来看下集群情况
redis-cli --cluster check 192.168.184.134:6381
6387的槽已经变空了,由6385接手了
接下来将6387删除
命令:redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 192.168.184.134:6387 a39055f975a05b2b2f66e9f44b7081295726d970
在来看下集群情况
redis-cli --cluster check 192.168.184.134:6381
可以看到已经变成了3主3从