1.从官网下载配置文件:http://download.redis.io/redis-stable/redis.conf
2.挂载配置文件的宿主机目录
#配置文件,需要将官网下载的redis.conf拷贝到这个路径下
mkdir -p /data/service/redis/conf
#redis的data
mkdir -p /data/service/redis/data
3.修改bind ip地址
bind 127.0.0.1 改为
bind 0.0.0.0
4.守护进程yes改成no
5.requirepass和masterauth设置密码
和
6.开启集群信息
其中,cluster-config-file要一个节点一个配置
7.以上配置改好之后,下载镜像
docker search redis
8.pull镜像
docker pull redis:5.0.7
9.启动镜像
docker run -p 7000:6379 --name redis-node-7000 -v /data/service/redis/conf/redis_7000.conf:/etc/redis/redis.conf -v /data/service/redis/data:/data -d redis:5.0.7 redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
docker run -p 7001:6379 --name redis-node-7001 -v /data/service/redis/conf/redis_7001.conf:/etc/redis/redis.conf -v /data/service/redis/data:/data -d redis:5.0.7 redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
docker run -p 7002:6379 --name redis-node-7002 -v /data/service/redis/conf/redis_7002.conf:/etc/redis/redis.conf -v /data/service/redis/data:/data -d redis:5.0.7 redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
docker run -p 7003:6379 --name redis-node-7003 -v /data/service/redis/conf/redis_7003.conf:/etc/redis/redis.conf -v /data/service/redis/data:/data -d redis:5.0.7 redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
docker run -p 7004:6379 --name redis-node-7004 -v /data/service/redis/conf/redis_7004.conf:/etc/redis/redis.conf -v /data/service/redis/data:/data -d redis:5.0.7 redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
docker run -p 7005:6379 --name redis-node-7005 -v /data/service/redis/conf/redis_7005.conf:/etc/redis/redis.conf -v /data/service/redis/data:/data -d redis:5.0.7 redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
命令解释说明:
-p 7000:6379 #端口映射:前表示主机部分,:后表示容器部分。
--name redis-node-7000 # 指定该容器名称,查看和进行操作都比较方便。
-v #挂载目录,规则与端口映射相同。
为什么需要挂载目录:个人认为docker是个沙箱隔离级别的容器,这个是它的特点及安全机制,不能随便访问外部(主机)资源目录,所以需要这个挂载目录机制。
-d redis:5.0.7 #表示后台启动redis
redis-server /etc/redis/redis.conf # 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/data/service/redis/conf/redis_7000.conf,一个节点一个配置
--appendonly yes #开启redis持久化
--requirepass "123456" #指定密码
提示:可以将命令写入.sh的文件中批量启动
10.集群配置
找到容器ip
docker inspect 94e22a7f417e 531ecb77ffc8 c98f5a95cebd 57aca11a8ccb d1f25c86f0ac f22fb3089bf0 IpAddress
或用以下命令找ip
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
添加节点
CLUSTER MEET 172.17.0.2 6379
如果redis-cli -p 7000 没有生效可以自行在宿主机下载一个redis如:
yum -y install redis
然后再连接
11.分配slave
vim add_slave.sh
#CLUSTER REPLICATE后面跟的是172.17.0.5:6379的集群ID
redis-cli -h 127.0.0.1 -p 7000 -a 123456 CLUSTER REPLICATE c8b32b56ef01ecf46529850cb92b32f7a27f4f7f
#CLUSTER REPLICATE后面跟的是172.17.0.6:6379的集群ID
redis-cli -h 127.0.0.1 -p 7001 -a 123456 CLUSTER REPLICATE beb33efaa910850ecdedc2cdbba6c4857ac58c15
#CLUSTER REPLICATE后面跟的是172.17.0.7:6379的集群ID
redis-cli -h 127.0.0.1 -p 7002 -a 123456 CLUSTER REPLICATE 2f95fd3749e36a173d19abb66703657ce0a1e841
执行sh add_slave.sh
12.分配槽:
分配槽的脚本:
vim addslots.sh
#!/bin/bash
#将0-5461的槽点配置在172.17.0.4:6379(宿主机127.0.0.1:7000)的redis上
n=0
for ((i=n;i<=5461;i++))
do
redis-cli -h 127.0.0.1 -p 7000 -a 123456 CLUSTER ADDSLOTS $i
done
#将5462-10922的槽点配置在172.17.0.5:6379(宿主机127.0.0.1:7001)的redis上
n=5462
for ((i=n;i<=10922;i++))
do
redis-cli -h 127.0.0.1 -p 7001 -a 123456 CLUSTER ADDSLOTS $i
done
#将10923-16383的槽点配置在172.17.0.6:6379(宿主机127.0.0.1:7002)的redis上
n=10923
for ((i=n;i<=16383;i++))
do
redis-cli -h 127.0.0.1 -p 7002 -a 123456 CLUSTER ADDSLOTS $i
done
执行脚本:
sh addslots.sh
查看机群状态
坑还是不少的,但是大致的流程是这样子的,如有疑问可以留言一起讨论。
附录:集群常用命令
集群
cluster info #打印集群的信息
cluster nodes #列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet <ip> <port> # 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> # 从集群中移除 node_id 指定的节点。
cluster replicate <master_node_id> # 将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
cluster saveconfig # 将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots <slot> [slot ...] # 将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] # 移除一个或多个槽对当前节点的指派。
cluster flushslots # 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> # 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> # 将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> # 从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable # 取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot <key> # 计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> # 返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> # 返回 count 个 slot 槽中的键