1.redis主从+哨兵的原理
首先,我们要知道一致性哈希算法,这个算法原理是,当我们通过哈希算法计算出key的值,会通过顺时针方向,将数据存储到最近的redis服务器,也有可能算出来的 哈希值正好是redis服务器的地址值. reids主从+哨兵的实现,是通过我们将数据发送给哨兵,由于哨兵有主服务器的信息,哨兵将会把我们的数据发送至主服务器.如果我们直接将数据发送至主服务器,如果主服务器宕机,哨兵将会再次选举出一个主服务器,比如我们刚开始连接7000端口的主服务器,主服务器宕机后哨兵选举出的主服务器可能是7001.这时我们就需要反复修改我们的代码,非常的麻烦.
2.准备一个主服务器和两个从服务器
我们这里以一主两从为例
启动主服务器
docker run -d --name redis6379 --net=host --restart=always redis
docker exec -it redis6379 redis-cli
> info replication
启动两个从服务器
docker run -d --name redis6380 --net=host --restart=always redis \
redis-server --port 6380 --slaveof 192.168.64.150 6379
docker run -d --name redis6381 --net=host --restart=always redis \
redis-server --port 6381 --slaveof 192.168.64.150 6379
docker exec -it redis6379 redis-cli
> info replication
docker exec -it redis6380 redis-cli -p 6380
> info replication
docker exec -it redis6381 redis-cli -p 6381
> info replication
3.启动三个哨兵
我们这里用三个哨兵,如果主服务器6379宕机,我们通过三个哨兵中的2个来选举新的主服务器,比如有两个哨兵都选举6380服务器为主服务器,那6380服务器将被选举为新的主服务器,若之前宕机的6379服务器重新启动,则变为从服务器.
哨兵的配置文件
mkdir /opt/sentinel/
cd /opt/sentinel/
cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
启动三个哨兵
docker run -d --name sentinel5000 \
-v /opt/sentinel/5000.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5001 \
-v /opt/sentinel/5001.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5002 \
-v /opt/sentinel/5002.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf
docker exec -it sentinel5000 redis-cli -p 5000
> sentinel master mymaster
> sentinel slaves mymaster
> sentinel sentinels mymaster
停止主服务器6379,测试哨兵重新选举新的主服务器
docker stop redis6379
docker logs sentinel5000
docker exec -it redis6380 redis-cli -p 6380
> info replication
docker exec -it redis6381 redis-cli -p 6381
> info replication
这里我们看到,主服务器6379重启后,则只能作为从服务器.
客户端通过哨兵存储数据
public class Test2 {
public static void main(String[] args) {
Set<String> list = new HashSet<String>();
list.add("192.168.64.150:5000");
list.add("192.168.64.150:5001");
list.add("192.168.64.150:5002");
JedisPoolConfig conf = new JedisPoolConfig();
JedisSentinelPool p =
new JedisSentinelPool("mymaster", list, conf);
Jedis j = p.getResource();
j.set("k1","v1");
}
}
|