本文已参与「新人创作礼」活动,一起开启掘金创作之路。
配置文件
redis.conf 按三主三从的规格配置6个实例:
port 6379
requirepass 123456 //设置密码
masterauth 123456 //如果requirepass设置了,masterauth也必须要保持一样,否则无法同步。
cluster-enabled yes //开启集群模式
cluster-config-file nodes-6379.conf //每台机器的集群配置文件,不需要人工修改,程序自动记录,这块名字可以根据端口号进行设置。
cluster-node-timeout 15000 //单位是毫秒,如果在15秒还没有响应,结点会被认为出了故障。
启动redis实例
这里写了一个脚本来执行,节点多了太麻烦了:
#!/bin/bash
echo '>>>>>>>>>>>>>>>>>>> docker stop:'
docker stop redis-node1
docker stop redis-node2
docker stop redis-node3
docker stop redis-node4
docker stop redis-node5
docker stop redis-node6
echo '>>>>>>>>>>>>>>>>>>> docker rm:'
docker rm redis-node1
docker rm redis-node2
docker rm redis-node3
docker rm redis-node4
docker rm redis-node5
docker rm redis-node6
echo '>>>>>>>>>>>>>>>>>> clear data':
rm -rf ./node1/data
rm -rf ./node2/data
rm -rf ./node3/data
rm -rf ./node4/data
rm -rf ./node5/data
rm -rf ./node6/data
echo '>>>>>>>>>>>>>>>>>> docker create:'
docker run -idt --net=host --name redis-node1 -p 6379:6379 -p 16379:16379 -v /usr/local/redis/node1/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node1/data:/data --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host --name redis-node2 -p 6380:6380 -p 16380:16380 -v /usr/local/redis/node2/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node2/data:/data --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host --name redis-node3 -p 6381:6381 -p 16381:16381 -v /usr/local/redis/node3/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node3/data:/data --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host --name redis-node4 -p 6382:6382 -p 16382:16382 -v /usr/local/redis/node4/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node4/data:/data --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host --name redis-node5 -p 6383:6383 -p 16383:16383 -v /usr/local/redis/node5/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node5/data:/data --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host --name redis-node6 -p 6384:6384 -p 16384:16384 -v /usr/local/redis/node6/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node6/data:/data --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
echo '>>>>>>>>>>>>>>>>> docker nodes status:'
ps aux |grep cluster |grep redis
注意:如果是自己搭来玩,用一台主机,则记得把
--net=host
加上,该参数的作用是让docker和宿主机使用同一个网卡驱动,若不配置,那么到时候redis集群就会用docker创建的虚拟网卡驱动,导致redis节点和宿主机不在同一个网段。
创建集群
[root@localhost redis]# docker exec -it redis-node1 /bin/bash
root@localhost:/data# redis-cli --cluster create 192.168.3.101:6379 192.168.3.101:6380 192.168.3.101:6381 192.168.3.101:6382 192.168.3.101:6383 192.168.3.101:6384 --cluster-replicas 1 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.3.101:6383 to 192.168.3.101:6379
Adding replica 192.168.3.101:6384 to 192.168.3.101:6380
Adding replica 192.168.3.101:6382 to 192.168.3.101:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a459cc9e605645cd5a3efa402a6472b36e7ebc65 192.168.3.101:6379
slots:[0-5460] (5461 slots) master
M: 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2 192.168.3.101:6380
slots:[5461-10922] (5462 slots) master
M: ec5fac133f0a4fcaff91e32fe1160e89d047ea44 192.168.3.101:6381
slots:[10923-16383] (5461 slots) master
S: ee6230d0a064296f46201ac72f3eb52f574af456 192.168.3.101:6382
replicates 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2
S: fc331235e462cc05462494d3b32ae95677f90e2c 192.168.3.101:6383
replicates ec5fac133f0a4fcaff91e32fe1160e89d047ea44
S: 635d0a39c21614b4af529ba45fbc7a381d5f0061 192.168.3.101:6384
replicates a459cc9e605645cd5a3efa402a6472b36e7ebc65
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check (using node 192.168.3.101:6379)
M: a459cc9e605645cd5a3efa402a6472b36e7ebc65 192.168.3.101:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: ee6230d0a064296f46201ac72f3eb52f574af456 192.168.3.101:6382
slots: (0 slots) slave
replicates 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2
M: 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2 192.168.3.101:6380
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: ec5fac133f0a4fcaff91e32fe1160e89d047ea44 192.168.3.101:6381
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: fc331235e462cc05462494d3b32ae95677f90e2c 192.168.3.101:6383
slots: (0 slots) slave
replicates ec5fac133f0a4fcaff91e32fe1160e89d047ea44
S: 635d0a39c21614b4af529ba45fbc7a381d5f0061 192.168.3.101:6384
slots: (0 slots) slave
replicates a459cc9e605645cd5a3efa402a6472b36e7ebc65
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
至此,一个redis集群搭建完毕了。
接入SpringBoot项目
创建一个maven项目,pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>WebProject</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
</project>
单节点配置
application.yml
server:
# 端口号
port: 8080
spring:
redis:
host: 192.168.3.101
port: 6379
password: 123456
测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
RedisTemplate redisTemplate;
@Test
public void t1(){
redisTemplate.opsForValue().set("k1","123");
Object k1 = redisTemplate.opsForValue().get("k1");
System.out.println(k1.toString());
}
}
>>>>>>123
看似很完美,but:
所以redis集群是没办法单节点运行的。还是需要进行集群配置。
集群配置
spring:
redis:
# host: 192.168.3.101
# port: 6379
password: 123456
cluster:
nodes: 192.168.3.101:6379,192.168.3.101:6380,192.168.3.101:6381,192.168.3.101:6382,192.168.3.101:6383,192.168.3.101:6384
完结撒花!