1.结构:
3主3从,hash槽算法负载均衡
2.端口:
3主:7000、7001、7002 3从: 7003、7004、7005
3.配置文件:
redis.conf
最小配置方案:(官网)
port xxx cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
配置流程:
/opt/redis /7000/redis.conf /7001/redis.conf /7002/redis.conf /7003/redis.conf /7004/redis.conf /7005/redis.conf
mkdir /opt/redis cd /opt/redis mkdir 7000 7001 7002 7003 7004 7005 cat <<EOF >7000/redis.conf port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF
4.启动6个redis实例:
--net=host: 让docker容器直接使用宿主机的指定端口,不需要端口映射 redis-server /redis.conf:让redis服务以配置文件的配置方式运行
docker run -d --name redis7000 \ -v /opt/redis/7000/redis.conf:/redis.conf \ --net=host \ --restart=always \ redis \ redis-server /redis.conf
5.开启集群配置:
--cluster-replicas x:配置一台主机分配x台从机
在其中一个docker容器中执行:
docker exec -it redis7000 \ redis-cli --cluster create 192.168.64.150:7000 192.168.64.150:7001 \ 192.168.64.150:7002 192.168.64.150:7003 192.168.64.150:7004 192.168.64.150:7005 \ --cluster-replicas 1
执行完成后,显示16384个哈希槽被覆盖:
6.查看集群信息:
命令参数:-c:以集群方式访问 ; -p 指定redis的访问端口(不指定默认的为6379) cluster info:查看集群信息 cluster nodes:查看集群节点信息
docker exec -it redis7000 redis-cli -c -p 7000 cluster info cluster nodes
7.测试集群:
存数据:观察存放数据时,节点的切换存储 – 查询和存储会进行redis重定向
docker exec -it redis7000 redis-cli -c -p 7000 set a 1111111 set b 222222222 set c 333333333
8.Java API 测试 Redis集群(Spring封装的API):
使用Spring Data提供的Spring Data Redis工具类
yml配置:
spring: redis: cluster: nodes: - 192.168.64.150:7000 - 192.168.64.150:7001 - 192.168.64.150:7002 - 192.168.64.150:7003 - 192.168.64.150:7004 - 192.168.64.150:7005
JAVA实现:
Redis Cluster Connection(API): ConnectionFactory - RedisClusterConnection - CRUD operation
@SpringBootApplication public class Application { /* * 测试redis集群 * */ @Autowired private RedisConnectionFactory factory; public static void main(String[] args) { SpringApplication.run(Application.class, args); } /* * spring执行流程: * 扫描 --> 创建实例 --> 依赖注入 --> @PostConstruct(用于执行一些自定义初始化操作) * */ @PostConstruct public void test() { RedisClusterConnection cluster = factory.getClusterConnection(); for (int i = 0; i < 100; i++) { String k = "k"+i; String v = "v"+i; cluster.set(k.getBytes(),v.getBytes()); } } }