0%

redis的主从和哨兵

准备不同端口的文件夹

把bin复制成3份,并用端口命名即可

1
2
3
drwxr-xr-x. 2 root root  168 3月  23 16:37 6377
drwxr-xr-x. 2 root root 168 3月 23 16:39 6378
drwxr-xr-x. 2 root root 233 3月 23 17:15 6379

编写开启redis服务端的脚本

redis-start.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
# author: wuyilong
# description: 开启redis服务器

for i in "$@";do
if test -d ./$i
then
cd $i
echo "$i-----"
./redis-server redis.conf
cd ..
echo "开启成功,当前所在目录:$(pwd)"
else
echo "${i}目录不存在"
fi
done
1
2
// 脚本启动
[root@localhost redis]# ./redis-start.sh 6377 6378 6379

编写关闭redis服务端的脚本

redis-stop.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
# author: wuyilong
# description: 关闭redis服务器

for i in "$@";do
if test -d ./$i
then
cd $i
./redis-cli -p $i shutdown
cd ..
echo "关闭成功,当前的目录:$(pwd)"
else
echo "${i}目录不存在"
fi
done
1
2
// 脚本关闭
[root@localhost redis]# ./redis-stop.sh 6377 6378 6379

sentinel.conf的脚本编写

ps:其实和redis.conf差不多,你可以放到不同的文件夹,也可以在同一个文件夹,在这我就就累赘了。

redis.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 端口
port 6379

// 所有的机器上的地址都可以访问到redis
bind 0.0.0.0

// 保护模式,默认开启,开启了要设置密码
protected-mode yes

// 后台启动,默认no
daemonize yes

// 设置密码
requirepass "123456"

// 设置数据库的存储路径
dir "/home/wuyilong/redis_slaver1"

---------------------------------------slave单独设置-----------------------------
// 设置本机为slave服务(只在slave中设置,master不用)
slaveof 192.168.1.114 6379
作用:自动同步master的数据

// 设置slave只有读的操作,默认yes
slave-read-only yes
ps: 就算改为no也没用,在slave写入的数据不用同步到master上,

// 当master设置了密码保护时,slave连接master的密码
masterauth "123456"

sentinel.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 端口
port 26379

// 监听master,不要用(127.0.0.1)
sentinel monitor mymaster 192.168.1.114 6379 2
ps: 如果在redis-cli上可以用127.0.0.1去测试下,如果用语言连接,比如java,则连不了,必须用真的ip.

// 设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。
sentinel auth-pass mymaster 123456

// 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。

sentinel parallel-syncs mymaster 1

// 这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒
sentinel down-after-milliseconds mymaster 30000

// failover-timeout 可以用在以下这些方面: 

      1. 同一个sentinel对同一个master两次failover之间的间隔时间。

      2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。

      3.当想要取消一个正在进行的failover所需要的时间。  

      4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。

sentinel failover-timeout mymaster 20000

// sentinel唯一的标识
sentinel myid 77f2e3c07806986f0cf1348ab55ef63cb837805c
ps: 在部署多个sentinel时要设置不同的myid,只有这样后面的故障转移才能生效

测试时出现的神奇之处

  • 如果slave在master出现故障时,自己升为master,那么,slaveof 则会自动消失,
    并且 sentinel monitor mymaster 192.168.1.114 6379 2中的ip会变成slave的IP地址,

会在sentinel.conf 自动生成一些配置

1
2
3
4
5
6
# Generated by CONFIG REWRITE
sentinel known-replica mymaster 127.0.0.1 6377
sentinel known-replica mymaster 127.0.0.1 6379
sentinel known-sentinel mymaster 127.0.0.1 26378 77f2e3c07806986f0cf1348ab55ef63cb837805b
sentinel known-sentinel mymaster 127.0.0.1 26377 77f2e3c07806986f0cf1348ab55ef63cb837805a
sentinel current-epoch 2

-------------本文结束感谢你的阅读---------