Skip to content

主从的原理就是 从节点向[主节点]发送一个syn请求 主节点收到请求 在后台创建一个rdb快照文件发送给从节点 ,再在暂存空间记录创建到发送完成这段时间的所有写命令,等rdb发送完成再发送写命令 从节...

redis高可用

主从的原理就是 从节点向[主节点]发送一个syn请求 主节点收到请求 在后台创建一个rdb快照文件发送给从节点 ,再在暂存空间记录创建到发送完成这段时间的所有写命令,等rdb发送完成再发送写命令 从节点加载rdb和写命令完成主从同步 

哨兵就是通过ping 如果通不了了 就会告知其他的哨兵 都发现ping不了了则标记下线 选举出新的主节点 !!

直接开整

首先最简单的

直接配置不用docker的操作
master192.168.85.128
slave1192.168.85.129
slave2192.168.85.130
1.安装redis
# yum install redis -y
2.更改配置文件
主
# ls /etc/redis*
/etc/redis.conf  /etc/redis-sentinel.conf
这是redis的配置 这是哨兵的配置文件

# cat /etc/redis.conf|grep -v "^#"|grep -v "^$"
bind 0.0.0.0

protected-mode no #关闭保护模式 这个很重要 不关闭不会同步

东西很多咱们只看需要修改的

从
# ls /etc/redis*
/etc/redis.conf  /etc/redis-sentinel.conf
这是redis的配置    这是哨兵的配置文件

# cat /etc/redis.conf|grep -v "^#"|grep -v "^$"

bind 0.0.0.0

protected-mode no  #关闭保护模式 这个很重要 不关闭不会同步

slaveof 192.168.85.128 6379  #从的配置文件里写上主的ip加端口
3.启动redis查看是否同步了
# systemctl start redis
# redis-cli  -h 192.168.85.130 info replication
# Replication

role:master

connected_slaves:2

slave0:ip=192.168.85.128,port=6379,state=online,offset=1615599,lag=1

slave1:ip=192.168.85.129,port=6379,state=online,offset=1615742,lag=1

master_repl_offset:1615742

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:567167

repl_backlog_histlen:1048576
4.配置哨兵监控redis
主从都一样配置 
# cat /etc/redis-sentinel.conf |grep -v "^#"|grep -v "^$" 
protected-mode no #一定要no 
dir "/tmp" #定义的这个目录要让哨兵有权限写进入 w写权限一定要 
sentinel monitor mymaster 192.168.85.128 6379 2 #主ip 从要有两个要不然就没意义了 
sentinel down-after-milliseconds mymaster 10000 
sentinel failover-timeout mymaster 30000
5.启动哨兵  测试是否成功
# systemctl start redis-sentinel 
# systemctl stop redis #主节点的 
[root@localhost redis]# redis-cli -h 192.168.85.130 info replication 
# Replication role:master connected_slaves:1 slave0:ip=192.168.85.129,port=6379,state=online,offset=1710180,lag=0 #128ip没了说明成功了 master_repl_offset:1710323 
repl_backlog_active:1 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:661748 
repl_backlog_histlen:1048576
6.附加 redis sub pub发布/订阅模式
SUBSCRIBE nb # 订阅者订阅nb这个信息

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "nb"

3) (integer)

PUBLISH nb "nihao"

(integer) 1

127.0.0.1:6379>

SUBSCRIBE nb

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "nb"

3) (integer) 1

1) "message"

2) "nb"

3) "nihao"
用docker-compose方式实现
# tree 
.

├── docker-compose.yml

├── docker-compose.yml_back

├── master

│   └── redis.conf

├── sentinel.conf

└── slave

└── redis.conf

2 directories, 5 files
1.编写docker-compose.yml

注意点:最好固定在一个ip上  command 使用&&可能会造成服务阻塞 用& exec代替

定义网络是networks 需要顶格写 

写完用docker-compose config 检验代码是否正确

# cat docker-compose.yml 

services:

redis-master:

image: 192.168.85.128/nb/redis:latest

container_name: redis-master

networks:

redis-network:

ipv4_address: 172.23.0.2

command: ["bash", "-c", "redis-server /etc/redis/redis.conf & exec redis-server /etc/redis/sentinel.conf --sentinel"]

volumes:

- ./master/redis.conf:/etc/redis/redis.conf

- ./sentinel.conf:/etc/redis/sentinel.conf

restart: always

ports:

- "6380:6379"

- "26380:26379"

redis-slave1:

image: 192.168.85.128/nb/redis:latest

container_name: redis-slave1

networks:

redis-network:

ipv4_address: 172.23.0.3

command: ["bash", "-c", "redis-server /etc/redis/redis.conf & exec redis-server /etc/redis/sentinel.conf --sentinel"]

volumes:

- ./slave/redis.conf:/etc/redis/redis.conf

- ./sentinel.conf:/etc/redis/sentinel.conf

ports:

- "6381:6379"

- "26381:26379"

depends_on: #运行在master之后

- redis-master

redis-slave2:

image: 192.168.85.128/nb/redis:latest

container_name: redis-slave2

networks:

redis-network:

ipv4_address: 172.23.0.4

command: ["bash", "-c", "redis-server /etc/redis/redis.conf & exec redis-server /etc/redis/sentinel.conf --sentinel"]

volumes:

- ./slave/redis.conf:/etc/redis/redis.conf

- ./sentinel.conf:/etc/redis/sentinel.conf

ports:

- "6382:6379"

- "26382:26379"

depends_on:

- redis-master

networks:

redis-network:

driver: bridge

ipam:

driver: default

config:

- subnet: 172.23.0.0/24
2.编写 master和slave文件 和哨兵
# cat master/redis.conf 

bind 0.0.0.0

protected-mode no

port 6379

appendonly yes

bind 0.0.0.0

protected-mode no

port 6379

appendonly yes

slaveof 172.23.0.2 6379

port 26379

sentinel monitor mymaster 172.23.0.2 6379 2

sentinel down-after-milliseconds mymaster 5000

sentinel failover-timeout mymaster 10000

sentinel parallel-syncs mymaster 1
3.测试停止redis-master
# redis-cli -p 6381 info replication
# Replication

role:master

connected_slaves:1

slave0:ip=172.23.0.4,port=6379,state=online,offset=78826,lag=0

master_failover_state:no-failover

master_replid:9f5b5a6d7cc115b658406a112116f5f4c7ee4b8f

master_replid2:f83e52939d733f9789838c7af50db30bbd041e71

master_repl_offset:78826

second_repl_offset:8631

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:834

repl_backlog_histlen:77993