服务部署(进阶重点)

部署时要特别注意细节(尤其是配置文件的修改)

部署相关命令

ROLE

# 返回主从实例所属的角色
127.0.0.1:6379> ROLE
1) "master"
2) (integer) 0
3) (empty list or set)

SLAVEOF

# 将当前服务器转变从节点(slave server)
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK

# 将当前服务器转变为主节点
127.0.0.1:6380> SLAVEOF NO ONE
OK

SYNC

# 用于从主节点进行一次全量复制
127.0.0.1:6380> SYNC
Entering slave output mode...  (press Ctrl-C to quit)
SYNC with master, discarding 183 bytes of bulk transfer...
SYNC done. Logging commands from master.
"PING"
^C
[root@cloudhost ~]# redis-cli -p 6380

CLUSTER SLOTS

# CLUSTER SLOTS	获取集群节点的映射数组

主从复制

特点

主从复制是指将一台redis-server中的数据复制到其他redis-server中。前者被称为主节点,后者被称为从节点。主节点只能有一个,从节点可以有任意个(通常至少有两个)

默认情况下每台服务器都是主节点

默认情况下主节点可以读写,从节点只读。借助redisson等中间件可以实现读写分离(自动路由)

从机启动时,通过全量复制进行数据同步

从机运行中,主机中进行的写入操作会通过增量复制进行数据同步

用途:冗余备份,读写分离,手动故障转移

配置

# 在同一台主机上配置一主二从,模拟生产环境
# 实际生产中通常布置在不同主机上

# 复制配置文件
[root@cloudhost ~]# cd /etc/
[root@cloudhost etc]# ls | grep redis
redis.conf
redis-sentinel.conf
[root@cloudhost etc]# cp redis.conf redis-79.conf
[root@cloudhost etc]# cp redis.conf redis-80.conf
[root@cloudhost etc]# cp redis.conf redis-81.conf
[root@cloudhost etc]# ls | grep redis
redis-79.conf
redis-80.conf
redis-81.conf
redis.conf
redis-sentinel.conf

# 编辑配置文件
# 开启守护运行
# 修改端口号分别为6379、6380、6381
# 修改pid文件为redis_6379、redis_6380、redis_6381
# 修改log文件为redis-6379、redis-6380、redis-6381
# 修改rdb文件为dump-6379、dump-6380、dump-6381
# 如果开启了aof还需要修改aof文件
# 配置主从机(后面采用redis命令进行临时配置)
# 如果主机有密码,需要修改配置文件或CONFIG SET masterauth yourmasterpassword
# 其他如需配置自行进行

[root@cloudhost ~]# cd /usr/bin
[root@cloudhost bin]# ls | grep redis
redis-benchmark
redis-check-aof
redis-check-rdb
redis-cli
redis-sentinel
redis-server

# 根据指定配置文件启动redis
[root@cloudhost bin]# redis-server /etc/redis-79.conf 
[root@cloudhost bin]# redis-server /etc/redis-80.conf 
[root@cloudhost bin]# redis-server /etc/redis-81.conf 

# 查看启动情况
[root@cloudhost bin]# ps -ef | grep redis
root      9419     1  0 00:49 ?        00:00:00 redis-server 127.0.0.1:6379
root      9427     1  0 00:49 ?        00:00:00 redis-server 127.0.0.1:6380
root      9433     1  0 00:49 ?        00:00:00 redis-server 127.0.0.1:6381
root      9440  7415  0 00:49 pts/0    00:00:00 grep --color=auto redis

# 在Xshell不同窗口下分别进入三台服务器对应的客户端
[root@cloudhost ~]# redis-cli -p 6379
[root@cloudhost ~]# redis-cli -p 6380
[root@cloudhost ~]# redis-cli -p 6381

# 配置从节点

# 6380这个客户端执行命令,配置后该主机不能再进行写入操作
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> ROLE
1) "slave"
2) "127.0.0.1"
3) (integer) 6379
4) "connected"
5) (integer) 1122
127.0.0.1:6380> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:926
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> SET name ssydx
(error) READONLY You can't write against a read only slave.

# 6381同理
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> ROLE
1) "slave"
2) "127.0.0.1"
3) (integer) 6379
4) "connected"
5) (integer) 1136
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:996
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> SET name ssydx
(error) READONLY You can't write against a read only slave.

# 查看6379这个客户端的从机信息,发现存在两个从机,说明主从复制设置成功
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=29,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=29,lag=1
master_repl_offset:29
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:28
127.0.0.1:6379> ROLE
1) "master"
2) (integer) 1136
3) 1) 1) "127.0.0.1"
      2) "6380"
      3) "1136"
   2) 1) "127.0.0.1"
      2) "6381"
      3) "1136"
# 写入操作成功
127.0.0.1:6379> SET name ssydx
OK
# 读取操作成功
127.0.0.1:6379> GET name
"ssydx"

# 两个从机读取也成功
127.0.0.1:6380> GET name
"ssydx"
127.0.0.1:6381> GET name
"ssydx"

# 关闭主机
127.0.0.1:6379> SHUTDOWN SAVE
not connected> QUIT
# 查看从机,依然是从机,只是与主机断联
127.0.0.1:6380> ROLE
1) "slave"
2) "127.0.0.1"
3) (integer) 6379
4) "connect"
5) (integer) -1
127.0.0.1:6381> ROLE
1) "slave"
2) "127.0.0.1"
3) (integer) 6379
4) "connect"
5) (integer) -1

# 如果主机恢复,从机自动连接,可自行测试

# 一个节点B除了是从节点,也可以是其他节点C的主节点,这就是链式节点
# 当节点B的主节点A没有出现故障时,B仍然是只读的,C则基于B进行同步
# 当节点A宕机时,可以手动把B的父节点设置为空:SLAVEOF no one,从而使B成为主节点,C继续基于B进行同步
# 当节点A回归时,可以手动将其父节点设置为B,注意:切不可重新让B成为A的从节点,会造成A节点宕机期间的数据丢失
# 以上为手动的故障转移,不够灵活,哨兵模式可解决这个问题

哨兵配置文件

# 哨兵绑定的网址,默认只能通过本机访问
# bind 127.0.0.1 192.168.1.1

# 是否启用保护模式
# protected-mode no

# 哨兵监听的端口
port 26379

# 哨兵的id,通常删除,让哨兵启动时自动生成
sentinel myid c0111f20747e5d48513af52f763605c9ce82cbb7

# 主从节点的密码认证设置
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

# 下线阈值,超过这个时间则认为下线
# sentinel down-after-milliseconds <master-name> <milliseconds>

# 核心配置,确定监视的初始主节点的名称(仅用于哨兵)、ip、端口、多少哨兵同意才确认下线
sentinel monitor mymaster 127.0.0.1 6379 2

# 切换时最多有多少从节点可以同时从新主节点上获取最新数据,值越小整个同步过程越长但同时不可读的从节点也越少,反之亦然
# 同步时从节点是不可读的
# sentinel parallel-syncs <master-name> <numslaves>

# 故障转移的最大等待时间(毫秒),超时后将强制完成切换
# sentinel failover-timeout <master-name> <milliseconds>

# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> 这些参数会被传递给脚本
# 通知脚本
# sentinel notification-script <master-name> <script-path>
# 客户端重配置脚本
# sentinel client-reconfig-script <master-name> <script-path>

# 日志文件路径
logfile "/var/log/redis/sentinel.log"

哨兵模式

特点

哨兵模式是基于主从复制的,哨兵会对各个节点进行监视,哨兵之间也会进行监视,哨兵应该具有奇数个以避免脑裂(实际往往是三个)

每个哨兵都会独立地进行主节点是否宕机的判断,当认为主节点宕机的哨兵过半时就把主节点视为宕机(这么设计是为了避免网络波动等造成单个哨兵的误判)

已经判断主节点宕机后,哨兵之间会进行投票(1.基于配置文件中的slaver-priority非0最小值 2.基于复制进度 3.基于run_id字典序最小)选择一个从节点作为主节点,投票完成后由其中一个哨兵通过发布订阅机制进行公布,其他哨兵也将自己监视的主节点更新为新选出的主节点

单哨兵的下线判断称为主观下线,过半哨兵的下线判断称为客观下线

用途:读写分离,冗余备份,自动故障转移

配置

# 前置条件,在同一台主机上配置一主二从,模拟生产环境,参考主从复制的配置

# 在同一台主机上配置三个哨兵,模拟生产环境

# 复制配置文件
[root@cloudhost etc]# cp redis-sentinel.conf redis-sentinel-79.conf 
[root@cloudhost etc]# cp redis-sentinel.conf redis-sentinel-80.conf 
[root@cloudhost etc]# cp redis-sentinel.conf redis-sentinel-81.conf 
[root@cloudhost etc]# ls | grep redis
redis-79.conf
redis-80.conf
redis-81.conf
redis.conf
redis.conf_bark
redis-sentinel-79.conf
redis-sentinel-80.conf
redis-sentinel-81.conf
redis-sentinel_bark.conf
redis-sentinel.conf

# 编辑配置文件
# 如果存在形如 sentinel myid c0111f20747e5d48513af52f763605c9ce82cbb7 的行,将其删除或者对不同配置文件值设置不同的值
# sentinel monitor mymaster 127.0.0.1 6380 2
# mymaster为主节点的名称(不重要,自行设置),127.0.0.1 6380为初始的主节点的IP及端口,2指的是至少2个哨兵同意才视为整体同意
# 修改端口号分别为26379、26380、26381
# 修改log文件为sentinel-26379.log、sentinel-26380.log、sentinel-26381.log
# 如果服务器有密码(请保证主从节点密码相同),修改配置文件sentinel auth-pass mymaster masterpassword
# 其他如需配置自行进行

[root@cloudhost ~]# cd /usr/bin
[root@cloudhost bin]# ls | grep redis
redis-benchmark
redis-check-aof
redis-check-rdb
redis-cli
redis-sentinel
redis-server

# 根据指定配置文件运行并放入后台运行(注意&)
[root@cloudhost etc]# redis-sentinel /etc/redis-sentinel-79.conf &
[1] 19650
[root@cloudhost etc]# redis-sentinel /etc/redis-sentinel-80.conf &
[2] 19658
[root@cloudhost etc]# redis-sentinel /etc/redis-sentinel-81.conf &
[3] 19665

# 确认三个哨兵都已启动
[root@cloudhost etc]# redis-cli -p 26379 ping
PONG
[root@cloudhost etc]# redis-cli -p 26380 ping
PONG
[root@cloudhost etc]# redis-cli -p 26381 ping
PONG

# 确认三个哨兵可以互相发现
[root@cloudhost etc]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3
[root@cloudhost etc]# redis-cli -p 26380 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3
[root@cloudhost etc]# redis-cli -p 26381 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3

# 将主节点6379的服务器关闭
# 等待片刻,查看另外两个服务器的角色,有一位被切换为主节点,另一位则成为它的从节点
# 通过ROLE查看未更新时,可退出客户端重新进入或执行CONFIG RESTART,实在不行可进行数据写入判断哪个是主节点,或者查看哨兵日志

# 将6379节点重新上线,其自动成为从节点,无需手动干预

# 此时客户端,服务器,哨兵均有三个
[root@cloudhost etc]# ps -ef | grep redis
root     19537  7591  0 04:04 pts/2    00:00:00 redis-cli -p 6380
root     21409  7565  0 04:41 pts/1    00:00:00 redis-cli -p 6379
root     21773  7619  0 04:48 pts/3    00:00:00 redis-cli -p 6381
root     21378     1  0 04:41 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6379
root     21439     1  0 04:42 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6380
root     21445     1  0 04:42 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6381
root     19650  7415  0 04:06 pts/0    00:00:03 /usr/bin/redis-sentinel *:26379 [sentinel]
root     19658  7415  0 04:06 pts/0    00:00:03 /usr/bin/redis-sentinel *:26380 [sentinel]
root     19665  7415  0 04:07 pts/0    00:00:03 /usr/bin/redis-sentinel *:26381 [sentinel]
root     21801 16163  0 04:49 pts/4    00:00:00 grep --color=auto redis
# 强制关闭一个哨兵
[root@cloudhost etc]# kill 19650
[root@cloudhost etc]# ps -ef | grep redis
root     19537  7591  0 04:04 pts/2    00:00:00 redis-cli -p 6380
root     19658  7415  0 04:06 pts/0    00:00:03 /usr/bin/redis-sentinel *:26380 [sentinel]
root     19665  7415  0 04:07 pts/0    00:00:03 /usr/bin/redis-sentinel *:26381 [sentinel]
root     21378     1  0 04:41 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6379
root     21409  7565  0 04:41 pts/1    00:00:00 redis-cli -p 6379
root     21439     1  0 04:42 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6380
root     21445     1  0 04:42 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6381
root     21773  7619  0 04:48 pts/3    00:00:00 redis-cli -p 6381
root     21872 16163  0 04:50 pts/4    00:00:00 grep --color=auto redis

# 再次进行主节点下线测试,仍能正常进行故障转移
# 因为前面设置了只要两个哨兵同意即可
# 如果进一步关闭哨兵将无法再进行自动转移

集群模式

特点

集群模式是基于主从复制和哨兵模式的,内部已经封装好了故障检测和故障转移的逻辑,不需要单独设置哨兵,其自有一套配置方法

多个主节点会分别存储部分数据,这就是数据分片

从节点会在主节点宕机后通过投票选择其中一个升级为主节点

当执行写入操作或读取操作时会通过一致性哈希算法自动路由到对应的主从节点上

注意:其不能执行跨分区的命令,例如KEYS *

用途:读写分离,数据冗余,故障转移,数据分片(水平扩展)

配置

# 准备三主三从节点

# 对每个节点编写配置文件(还是基于redis.conf)
port 6379 # 每个节点的端口号需不同
# 开启集群模式
cluster-enabled yes
# 集群的配置文件名
cluster-config-file nodes.conf
# 节点超时时间
cluster-node-timeout 5000
# 最好开启aof以实现更好的数据一致性
appendonly yes

# 在任意一台主机上执行集群创建
redis-cli --cluster create \
172.0.0.1:7000 172.0.0.1:7002 172.0.0.1:7004 \
172.0.0.1:7001 172.0.0.1:7003 172.0.0.1:7005 \
--cluster-replicas 1

# 访问任意主机,在客户端内执行写入和读取操作均可,redis会自动进行路由

#redis##java#
Redis 文章被收录于专栏

此专栏由于更新观看不便,不会保持及时更新,最新更新见计算机合集专栏https://www.nowcoder.com/creation/manager/columnDetail/04yp33

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务