一、Redis主从复制

1.Redis单台服务器时的缺点
如果持久化,单台数据有丢失风险
读写压力都集中在一台上

2.Redis的主从复制概念
Redis的主从就是多台Redis数据一致
主服务器可用来写入和读取,从服务器仅用来读取,可以通过读写分离,降低写服务器的压力

3.Redis的主从搭建

redis的配置:
# vim /etc/redis.conf
除了默认配置外,需要确定一下下面的配置:
bind 0.0.0.0
port 6379
dir "/data/redis"
requirepass "redispwd"
pidfile "redis.pid"
logfile "redis.log"
daemonize yes

从redis的配置:
# vim /etc/redis.conf
除了默认配置外,需要确定一下下面的配置:
bind 0.0.0.0
port 6379
dir "/data/redis"
requirepass "redispwd"                   #从redis自己的密码,一般也和主设置的相同
pidfile "redis.pid"
logfile "redis.log"
daemonize yes
                                                      #注意:从redis需要增加下面这两项:
slaveof 192.168.27.128 6379              #指定主redis的ip和端口        
masterauth "redispwd"                      #指定主redis的密码

主从redis的启动:

启动主redis:  # redis-server /etc/redis.conf
启动从redis:  # redis-server /etc/redis.conf

4.查看主从状态信息

在主redis上登录查看:  (192.168.27.128)
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.27.129,port=6379,state=online,offset=3216,lag=1
slave1:ip=192.168.27.130,port=6379,state=online,offset=3216,lag=1
master_failover_state:no-failover
master_replid:915141a4f68f3c12235c59bfc120b6041c9148a5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3216
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3216

在从1redis上登录查看:(192.168.27.129)
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.27.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:3300
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:915141a4f68f3c12235c59bfc120b6041c9148a5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3300
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:897
repl_backlog_histlen:2404

在从2redis上登录查看:(192.168.27.130)
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.27.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:3454
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:915141a4f68f3c12235c59bfc120b6041c9148a5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3454
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2839
repl_backlog_histlen:616

二、.哨兵Sentinel实现主从自动切换

主从自动切换
Redis主从配置后,当主挂掉后,业务会有异常
Redis提供Sentinel工具实现主从自动切换,实现redis的高可用
Sentinel的启动和观察
# redis-sentinel /etc/sentinel.conf
主挂掉后,从库自动提升为主库主恢复后,自动转为从库,预防来回切换。
要求主从都需要设置masterauth 连接主redis的密码
因为是高可用模式,主也有可能宕机,当它宕机后,即使再恢复后也是作为从角色,为了防止作为从角色时候,
连接主时候认证不了,需要提前加上连接主服务器的认证密码

1.哨兵Sentinel高可用模式搭建(1主2从3哨兵)
为了防止哨兵的单节点故障,一般哨兵也做成高可用形式,即多个哨兵同时监控redis的状态,当其中一个哨兵故障时候,其他哨兵也能继续监控。
为了方便哨兵的选举,一般哨兵也是设置成奇数个。一般3个哨兵就没问题。
注意:一般哨兵的部署尽量不要和redis部署在同一台,防止这一台机器挂了后,redis和哨兵同时挂掉,哨兵起不到哨兵的作用了。当然多台机器,
多个哨兵时候也不影响,一台哨兵挂了,还有其它哨兵。
规划:
192.168.27.128 主redis 哨兵1
192.168.27.129 从1redis 哨兵2
192.168.27.130 从2redis 哨兵3

1.先搭建redis的主从(参考上面文档)

# 在主redis上登录查看:  (192.168.27.128)
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.27.129,port=6379,state=online,offset=3216,lag=1
slave1:ip=192.168.27.130,port=6379,state=online,offset=3216,lag=1
# 在从1redis上登录查看:(192.168.27.129)
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.27.128
master_port:6379
# 在从2redis上登录查看:(192.168.27.130)
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.27.128
master_port:6379

注意:主redis上配置文件中也需要加上下面配置:因为是高可用模式,主也有可能宕机,当它宕机后,即使再恢复后也是作为从角色
                                       为了防止作为从角色时候,连接主时候认证不了,需要提前加上连接主服务器的认证密码
vim /etc/redis.conf     
masterauth "redispwd"                      #指定主redis的密码

2.配置3哨兵

vim /etc/sentinel.conf                #3个哨兵机器配置都一样
bind 0.0.0.0
daemonize yes
port 26379
dir "/tmp"
logfile "sentinel.log"
sentinel monitor testmaster 192.168.27.128 6379 2
sentinel auth-pass testmaster redispwd
sentinel down-after-milliseconds testmaster 5000
sentinel failover-timeout testmaster 18000

配置文件说明:
#port 26379  哨兵的一个端口
#testmaster是随便起的一个名字,连接的主redis的是:192.168.27.128, 2是代表有2个哨兵认为master有问题才会切换
#redispwd 是连接主redis的密码,      5000 是5秒没响应认为主挂了
#18000 是从提升为主的超时时间18s(可适当调大)

3.启动3哨兵

redis-sentinel /etc/sentinel.conf      3台都是指定配置文件启动
ps -ef |grep sentinel                     3台查看进程
root       1742      1  0 11:32 ?        00:00:00 redis-sentinel 0.0.0.0:26379 [sentinel]

4.验证哨兵实现的高可用redis

a).停止主redis服务              192.168.27.128机器停止主redis
# systemctl stop redis            

b).查看其他两个从redis,其中一个已经提升为主
查看从1redis 192.168.27.129
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.27.130,port=6379,state=online,offset=62664,lag=1
master_failover_state:no-failover
master_replid:7ffd1c6815695fef04fce6a7b1ff705f7b8a368e
master_replid2:77a0b5765c4fa9d2f0575a2c0cc093c5ad4c121a
master_repl_offset:62809
second_repl_offset:14629
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:62809

查看从2redis 192.168.27.130
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.27.129
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:71130
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:7ffd1c6815695fef04fce6a7b1ff705f7b8a368e
master_replid2:77a0b5765c4fa9d2f0575a2c0cc093c5ad4c121a
master_repl_offset:71130
second_repl_offset:14629
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:71116

并且查看从2redis的配置文件也自动修改成了指定了新主的ip
# tail -2 /etc/redis.conf              #slaveof和replicaof是一样的
replicaof 192.168.27.129 6379
masterauth "redispwd"

c).当主redis恢复,自动作为从服务器,指向新的主redis
# systemctl start redis
# redis-cli -a redispwd
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.27.129
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:151421
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:7ffd1c6815695fef04fce6a7b1ff705f7b8a368e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:151421
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:143078
repl_backlog_histlen:8344

查看原主的配置文件,也进行了修改,重新指定的新的主redis
# tail -2 /etc/redis.conf 
masterauth "redispwd"
replicaof 192.168.27.129 6379

5.验证一下哨兵的高可用性:

a).在原主(192.168.27.128)那台机器上,杀死一个哨兵,模式一个哨兵服务挂掉
# ps -ef |grep sen
root       1742      1  0 11:32 ?        00:00:03 redis-sentinel 0.0.0.0:26379 [sentinel]
root       1779   1362  0 11:47 pts/0    00:00:00 grep --color=auto sen
# kill 1742
# ps -ef |grep sen
root       1781   1362  0 11:47 pts/0    00:00:00 grep --color=auto sen

b).新主redis服务停止:(192.168.27.129)
# systemctl stop redis

c).其他两个从redis查看主从状态(192.168.27.128和192.168.27.130)
192.168.27.128(原主)查看:     可以查看到自己是从,又重新选出了一个新主130机器
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.27.130
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:221763
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:56cd835f2f4f8eee9eb1dc711f8b8e57a8b06db7
master_replid2:7ffd1c6815695fef04fce6a7b1ff705f7b8a368e
master_repl_offset:221763
second_repl_offset:210754
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:143078
repl_backlog_histlen:78686
192.168.27.130(原从2)上查看:       自己已经变成了主
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.27.128,port=6379,state=online,offset=244883,lag=1
master_failover_state:no-failover
master_replid:56cd835f2f4f8eee9eb1dc711f8b8e57a8b06db7
master_replid2:7ffd1c6815695fef04fce6a7b1ff705f7b8a368e
master_repl_offset:244883
second_repl_offset:210754
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:244869

通过这个案例,我们可以看到当其中一个哨兵挂掉后,其他哨兵照样可以监控监控redis,实现redis的高可用性
多哨兵模式也是为了加强哨兵服务的健壮性