redis集群-docker环境
* redis5.0 系列 cluster 集群部署
# 规划:(三主六从)
104: 6391 6392 6393 105: 6394 6395 6396 110: 6397 6398 6399
# 搭建:(192.168.104 192.168.1.105 192.168.1.110)
# 创建本地目录
mkdir -p /usr/local/redis-cluster/6391 &&
cd /usr/local/redis-cluster/6391 &&
mkdir -p data conf &&
........
# 创建文件夹复制多份 /usr/local/redis-cluster/6391/conf/redis.conf
# 修改 redis.conf:
bind # ip 地址
port # 端口
pidfile # pid文件
dir /data # 数据文件
cluster-enabled yes # 开启 cluster
cluster-config-file # 集群配置文件
cluster-node-timeout 15000 # 节点超时时间
已修改附件:redis-集群.conf
# 开放端口:(6391-6399 16391-16399)
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 6391:6399 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 16391:16399 -j ACCEPT
# 创建容器:(data 中要有 RDB 文件,若无则清空 data 重新创建(数据持久化))
docker run -d -t --name redis-1-6381 --restart=always --net=host -v /usr/local/redis-cluster/6381/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/redis-cluster/6381/data:/data redis:5.0.3 /bin/bash -c "redis-server /etc/redis/redis.conf; /bin/bash"
...........
# 创建集群主节点
docker run --rm -it redis:5.0.3 redis-cli --cluster create 192.168.1.104:6393 192.168.1.105:6396 192.168.1.110:6399
# 添加集群从节点(前从后主)——(注意:应手动指定主从)
# docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 从节点 主节点 --cluster-slave
docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 192.168.1.104:6391 192.168.1.104:6393 --cluster-slave
docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 192.168.1.104:6392 192.168.1.104:6393 --cluster-slave
docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 192.168.1.105:6394 192.168.1.105:6396 --cluster-slave
docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 192.168.1.105:6395 192.168.1.105:6396 --cluster-slave
docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 192.168.1.110:6397 192.168.1.110:6399 --cluster-slave
docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 192.168.1.110:6398 192.168.1.110:6399 --cluster-slave
# 集群主从对应情况
master 104:6393 : slave 104:6391 、slave 104:6392
master 105:6396 : slave 105:6394 、slave 105:6395
master 110:6399 : slave 110:6397 、slave 110:6398
# 指令笔记:
# 登录集群 docker run --rm -it redis:5.0.3 redis-cli -c -h 192.168.1.104 -p 6391
# 查看信息 cluster info
# 查看节点 cluster nodes
# 清除缓存 flushall (若要清除全部缓存,只需清除三个主节点即可)
# 其他
set kkk 111 创建一个 key
get kkk 得到一个 key
del kkk 删除一个 key
keys * 查看所有 key
# 将当前节点设置为 node_id 指定的节点的从节点(重新指定主节点) CLUSTER REPLICATE <node_id>
# 查看当前节点信息(可直观易读看主从情况) info
# 删除并重新添加集群节点
登录集群任意节点
redis-cli -c -h 10.11.0.41 -p 7001 --cluster-replicas 1 -a xxxxxxxx
获取旧节点(从节点)ID,及其对应的主节点ID
CLUSTER NODES
移除从节点
CLUSTER FORGET <旧节点ID>
启动新节点后,将新节点加入集群
CLUSTER MEET <新节点IP> <新节点端口>
配置主从关系,首先登录新节点
redis-cli -c -h <新节点IP> -p <新节点端口> -a xxxxxxxxxx
CLUSTER REPLICATE <主节点ID>
验证集群
CLUSTER NODES
# 若需要更换的节点是主节点,则只需手动执行故障转移即可:
1.登录主节点对应的某个从节点
2.在从节点上执行故障转移,其将升为主节点:CLUSTER FAILOVER
# 添加集群新的从节点
(1)开放端口 6381 16381
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 6381 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 16381 -j ACCEPT
service iptables save &&
service iptables restart &&
service docker restart
(2)创建容器:
cd /usr/local/redis-cluster/
cp -r 6391 6381
# 删除 data 内数据文件
# 修改配置文件:bind - 替换 IP 地址 + 一键替换所有端口为 6381
docker run -d -t --name redis-2-6381 --restart=always --net=host -v /usr/local/redis-cluster/6381/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/redis-cluster/6381/data:/data redis:5.0.3 /bin/bash -c "redis-server /etc/redis/redis.conf; /bin/bash"
(3)添加从节点:
docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 从节点 主节点 --cluster-slave
例如:docker run --rm -it redis:5.0.3 redis-cli --cluster add-node 192.168.1.104:6381 192.168.1.105:6394 --cluster-slave
# 测试总结:
* 三个主节点分配等量的槽,依据此存储不同数据。
* 集群中的主从节点,客户端无论连接到哪个都能直接进行完整的读写操作,不需要连接所有的节点(从任意一个节点存储数据,都会根据数据的 key 找到相应的槽,存入相应的主节点)
* 若某一从节点挂掉,不影响数据的存取(且重启后自动加入集群)
* 若某一主节点挂掉,则会从其对应的两个从节点中自动推举一个从节点变成主节点,具备读写功能,且原有数据依然存在于该新主节点(注意:重启挂掉的主节点后,原主节点会作为从节点加入集群,成为新主节点的从节点)
* 集群挂掉的两种情况:1. 某个主节点挂掉后没有对应的从节点替换;2. 超过半数以上的主节点挂掉;
即若集群5主5从,则若主节点挂2个,或者从节点挂5个,两种情况都不会破坏集群,但若挂了3个主节点,或者挂了相对应的一主一从两节点,则集群整体失效。因此,部署时注意部署位置。
* 部署单体 docker-redis:
mkdir -p /usr/local/redis/conf &&
mkdir -p /usr/local/redis/data
vi /usr/local/redis/conf/redis.conf
附件:redis-单体.conf
# 注意1:修改bind,同时使用内网IP 192.168.1.84和回环地址127.0.0.1,表示redis可同时接受本机及其他内网服务器访问。
# 注意2:修改密码选项,注释即为关闭:requirepass
# 注意3:redis容器的网络模式必须选择host,否则其与bind之间是冲突的,导致redis无法监听到内网IP。
docker run -d --name redis --restart=always --net=host -v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data redis:5.0.3 redis-server /etc/redis/redis.conf
# 开放端口,登录本地连接
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
service iptables save &&
service iptables restart &&
service docker restart
docker exec -it redis redis-cli
# 鉴权命令,成功则表示密码设置并登陆成功
auth Hefu8Personnel666
quit
* windows下搭建redis集群:
附件:redis-windows集群.txt
# 文件所在位置:C:\rediscluster
* redis集群图形化管理工具
# mysql中创建数据库:(192.168.1.110:3306)
create database redis_manager;
# 创建工具,连接 mysql ( 8182 )
docker run -d -t --restart=always --net=host --name redis-manager -e DATASOURCE_DATABASE='redis_manager' -e DATASOURCE_URL='jdbc:mysql://192.168.1.110:3306/redis_manager?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8' -e DATASOURCE_USERNAME='root' -e DATASOURCE_PASSWORD='hefu123' reasonduan/redis-manager
# 登录
http://192.168.1.172:8182 admin admin
# 导入集群
1、点击 Import Cluster 按钮
2、Cluster Name:集群名称
3、Address:填入集群节点{IP}:{PORT},如需填入多个,请点击 New Node,示例:192.168.1.79:6391
4、Redis Password:Redis 集群密码,如果未设置密码,请不要填写
5、Environment:集群安装环境