先说说单个redis的缺点:
1、单个redis具有不稳定性。当redis服务死机了或者redis服务被kill掉了,就没有可用的redis服务了。
2、单个redis的读写能力是有限的。
再根据单个redis服务的缺点谈谈redis集群的优点:
搭建redis集群一般都基于redis主从复制,即有一到多台Master服务、一到多台Slave服务。当redis服务死机了或者redis服务被kill掉了,Slave服务就会顶替原来的Master服务继续照常运行,并且数据不会丢失。
因为redis集群使得redis服务变多了,所以也提高了redis的读写能力。
#创建redis网卡,后面配置redis集群的时候可以指定配置IP(不创建网卡系统会自动分配IP 不会产生影响)
docker network create redis --subnet 172.12.0.0/16
[root@study home]# docker pull redis
[root@study home]# docker images
因为是6个redis服务,单个配起来的话很麻烦,所以我选择使用shell脚本进行配置,脚本代码如下:
#!/bin/bash
for port in $(seq 1 6); \
do \
mkdir -p /home/redis/node0${port}/conf
touch /home/redis/node0${port}/conf/redis.conf
cat << EOF >/home/redis/node0${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file node.conf
cluster-node-timeout 5000
cluster-announce-ip 172.12.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
cluster-enabled yes 开启集群功能
cluster-node-timeout 集群节点的超时时限
cluster-announce-ip 集群节点IP
cluster-announce-port 集群节点映射端口
cluster-announce-bus-port 集群节点总线端口
同上启动的话也是使用shell脚本来完成,脚本如下:
#!/bin/bash
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /home/redis/node0${port}/data:/data \
-v /home/redis/node0${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.12.0.1${port} redis redis-server /etc/redis/redis.conf
done
-p 端口映射
-v 数据卷挂载
-d 后台运行
–net 指定网络
redis-server /etc/redis/redis.conf redis-server指向配置文件启动
(1)首先随便进入一个redis容器
[root@study home]# docker exec -it redis-1 sh
(2)启动集群服务
# redis-cli --cluster create 172.12.0.11:6379 172.12.0.12:6379 172.12.0.13:6379 172.12.0.14:6379 172.12.0.15:6379 172.12.0.16:6379 --cluster-replicas 1
#redis-cli -c 为使用集群 不加-c则是单个redis服务
redis-cli -c
#查看nodes
127.0.0.1:6379> cluster nodes
使用get set测试
发现是由172.12.0.12处理的get set 命令也就是redis-2,此时我将redis-2容器停止,看从服务器是否能顶替redis-2。
发现依然返回home,但此次是由172.12.0.16执行的get命令,再查看nodes。
此时发现redis-2节点已经fail ,原来的redis-6节点也从slave变成了master。证实了集群的高可用性!!!