linux平台使用docker搭建redis-cluster集群,并用JedisCluster连接集群

准备工作:
1、载入本地镜像:cd 镜像所在目录,docker load -i 镜像文件名
2、载入的镜像docker images发现没有REPOSITORY与TAG,
docker tag 镜像id REPOSITORY : TAG

创建六个节点,三个master+三个slave,每个master有自己的slave。
一、以redis_6381为例,conf修改:
#bind 127.0.0.1 -::1 (注释掉)
protected-mode no
port 6381
daemonize no (非守护运行,否则与docker run 冲突)
#pidfile /var/run/redis_6379.pid (注释掉,当服务器非守护运行时,不会创建pid文件)
logfile /opt/docker/redis_cluster/redis_6381/redis_6381.log(默认为"",会导致没有log文件)
dbfilename dump_6381.rdb
dir /opt/docker/redis_cluster/redis_6381/ (非常重要,rdb与log等文件挂载的目录)
masterauth 6379
requirepass 6379(masterauth与requirepass应一致,因为主从角色会切换)
<–cluster部分–>
cluster-enabled yes
cluster-announce-ip 192.168.91.131 (宿主ip)
cluster-announce-port 6381
cluster-announce-bus-port 16381 (节点之间通信的总线端口,用6381+10000得到)
cluster-config-file nodes-6381.conf

二、将redis_6381.conf与空的redis_6381.log放进 /redis/redis_6381/,与dir一致,并将redis_6381文件夹与log文件chmod 777(chmod 777 -R 可授权文件夹下文件及子文件夹)。

三、运行容器,注意映射两个端口,一个对外,一个总线端口节点之间通信:
docker run --name redis_6381 --net zoonet --ip 172.18.5.11 -p 6381:6381 -p 16381:16381 -v /opt/docker/redis_cluster/redis_6381/:/opt/docker/redis_cluster/redis_6381/ --restart always --privileged=true -d redis redis-server /opt/docker/redis_cluster/redis_6381/redis_6381.conf
(–net zoonet指定网桥,–restart alway是docker重启后容器也自动重启)

四、开放6381与16381端口:
firewall-cmd --zone=public --add-port=6381/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reload

五、创建集群:
docker run --rm=true --name cluster-create --net zoonet -it redis redis-cli --cluster-replicas 1 --cluster create 172.18.5.11:6381 172.18.5.12:6382 172.18.5.13:6383 172.18.5.14:6384 172.18.5.15:6385 172.18.5.16:6386 --pass 6379
(注意,创建集群也是个容器,需要和redis容器在同一个网桥,否则会提示Could not connect to Redis at ip:端口: Connection timed out)
(cluster-replicas 1指一个master有一个slave,172.17.0.2是容器ip,查看6381容器的ip,用docker inspect 容器id,最下面的IPAddress就是)
(redis有密码就在结尾加上–pass 密码)

JedisCluster源码解析:https://segmentfault.com/a/1190000013535955
JedisCluster的使用:
JedisPoolConfig config=new JedisPoolConfig();
Set nodes=new HashSet();
nodes.add(new HostAndPort(“192.168.91.131”, 6381));
nodes.add(new HostAndPort(“192.168.91.131”, 6382));
nodes.add(new HostAndPort(“192.168.91.131”, 6383));
nodes.add(new HostAndPort(“192.168.91.131”, 6384));
nodes.add(new HostAndPort(“192.168.91.131”, 6385));
nodes.add(new HostAndPort(“192.168.91.131”, 6386));
JedisCluster cluster=new JedisCluster(nodes, 10000, 10000, 10, password, config);
(因为redis设置了密码,构造方法需要有密码的构造方法,Set jedisClusterNode, int connectionTimeout, int soTimeout,
int maxAttempts, String password, final GenericObjectPoolConfig poolConfig,connectionTimeout是连接超时时间,soTimeout是读取数据超时时间,maxAttempts是重试次数)
cluster.set(“cluster”, “connect success”);
System.out.println(cluster.get(“cluster”));
//cluster.close();JedisCluster不需要手动close,否则会导致redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster异常

集群测试:
1、当把一对master-slave全部停掉,整个集群无法使用,必须启动这对master-slave中的master集群才能恢复正常,即使启动slave也没用。

单点redis的数据迁移到redis cluster

参考:https://blog.csdn.net/cxu123321/article/details/93922055?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163046411416780255227612%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163046411416780255227612&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-93922055.pc_search_result_hbase_insert&utm_term=redis+%E5%8D%95%E7%82%B9+%E8%BF%81%E7%A7%BB+%E9%9B%86%E7%BE%A4&spm=1018.2226.3001.4187

1、将cluster的所有slots迁移到一个master节点
以将6383的slots迁移到6381为例:
docker exec -it 容器id redis-cli --pass 容器密码 --cluster reshard 172.18.5.13:6383
How many slots do you want to move (from 1 to 16384)? 5361(想迁走的slot数量)
What is the receiving node ID? 6381的集群id
Source node #1: 6383的集群id
Source node #2: done
Do you want to proceed with the proposed reshard plan (yes/no)? yes
2、将redis所有节点停掉,把6381的rdb文件换成想要迁移的,然后重启所有节点
3、将集中到6381的slot再次均分:docker exec -it 容器id redis-cli --pass 6379 --cluster rebalance --cluster-use-empty-masters 172.18.5.11:6381
注意:集群之前的数据不会丢失,会和迁来的数据汇合在一起

集群运维操作

清空数据:需要docker exec各个master,执行FLUSHALL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值