首页 > 技术文章 > redis主从

uphold 2019-07-21 18:22 原文

一、文档参考引用

使用redis 安装配置.note安装redis后进行主从配置,在同一台主机上搭建

本文参考https://www.cnblogs.com/gossip/p/5992716.htmlhttps://www.cnblogs.com/think-in-java/p/5123884.html

二、主要配置情况

说明:当前是使用了同一个主机配置(实际环境中应该分部在多台主机上),所以都用了IP127.0.0.1

1、按照1主2从的结构搭建,即1个Master,2个Slaver节点

2、Redis配置文redis.conf改为带端口号名称以便识别redis端口号.conf的配置

3、Slaver连接Master:slaveof host:ip          (测试时使用slaveof手动连接master,正式环境使用配置文件)

4、查看主从信息:info Replication

 

 

daemonize

(后台运行)

pidfile

port

logfile(日志)

# slaveof <masterip> <masterport>

  (测试时使用slaveof手动连接master,正式环境使用配置文件)

 

Master

yes

/usr/local/dblog/redis/redis6379.pid

6379

"/usr/local/dblog/redis/redis6379.log"

slaveof no one

 

Slaver1

yes

/usr/local/dblog/redis/redis6381.pid

6381

"/usr/local/dblog/redis/redis6381.log"

slaveof 127.0.0.1 6379

 

Slaver2

yes

/usr/local/dblog/redis/redis6382.pid

6382

"/usr/local/dblog/redis/redis6382.log"

slaveof 127.0.0.1 6379

 

# mkdir -p /usr/local/dblog/redis

# mkdir -p /usr/local/dbdata/redis

# mkdir -p /usr/local/dbconf/redis

配置情况如下(其中6479端口号可以更改为对应的)

[root@localhost redis]# grep ^[^#] redis6379.conf

bind 127.0.0.1

protected-mode yes

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize yes

supervised no

pidfile /usr/local/dblog/redis/redis6379.pid

loglevel notice

logfile "/usr/local/dblog/redis/redis6379.log"

databases 16

always-show-logo yes

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump6379.rdb

dir /usr/local/dbdata/redis

# slaveof <masterip> <masterport> 指定主

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

slave-lazy-flush no

appendonly no

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble no

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

 

另两配置文件可直接复制后进行修改

# sed -i s/6379/6381/g redis6381.conf

# sed -i s/6379/6382/g redis6382.conf

三、开启实例手动测试

1、启动实例

# redis-server /usr/local/dbconf/redis/redis6379.conf

# redis-server /usr/local/dbconf/redis/redis6381.conf

# redis-server /usr/local/dbconf/redis/redis6382.conf

2、连接实例查看信息

1Replication信息,三个端口的基本一样,role都为master

# redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> info Replication

# Replication

role:master

connected_slaves:0

master_replid:9499d69fa68edd997118285e8d84db5471a169ef

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:0

second_repl_offset:-1

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

3)手动从指定主(在从上操作,两个从机操作方式一样,返回信息也一相同)

127.0.0.1:6381> slaveof 127.0.0.1 6379

OK

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:9

master_sync_in_progress:0

slave_repl_offset:0

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:e7bacd0fdeef91da69221a778370c5f3dc0f2170

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:0

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:0

指定后主的Replication信息

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:2

slave0:ip=127.0.0.1,port=6381,state=online,offset=34735,lag=1

slave1:ip=127.0.0.1,port=6382,state=online,offset=34735,lag=0

master_replid:7f9a262ec80944797499774fdd7a00043acebf9b

master_replid2:21a4e84ab69894128307bcd58c57e4d636b5c739

master_repl_offset:34867

second_repl_offset:30702

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:16296

repl_backlog_histlen:18572

 

4)主从同步测试

在主上执行

127.0.0.1:6379> set test 'I am test'

OK

在备上执行

127.0.0.1:6381> get test

"I am test"

127.0.0.1:6381> set aa bb

(error) READONLY You can't write against a read only slave. 可以发现从只读

5)手动操作测试主挂掉换主

在主上执行

127.0.0.1:6379> shutdown

not connected>

在从(6381)上执行

127.0.0.1:6381> slaveof no one

OK

在从(6382)上执行,将指定主127.0.0.1 6381

127.0.0.1:6382> slaveof 127.0.0.1 6381

OK

这样从(6381)就为当前主了

手动将6379拉起后指定主6381

# redis-server /usr/local/dbconf/redis/redis6379.conf

# redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> slaveof 127.0.0.1 6381

OK

127.0.0.1:6381> info Replication

# Replication

role:master

connected_slaves:2

slave0:ip=127.0.0.1,port=6382,state=online,offset=16309,lag=1

slave1:ip=127.0.0.1,port=6379,state=online,offset=16309,lag=1

master_replid:21a4e84ab69894128307bcd58c57e4d636b5c739

master_replid2:e7bacd0fdeef91da69221a778370c5f3dc0f2170

master_repl_offset:16309

second_repl_offset:2274

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:16309

四、配置哨兵从而实现自动主从切换

sentinel参考:http://doc.redisfans.com/topic/sentinel.html

1)修改配置文件,配置文件参考:https://www.jianshu.com/p/f0ea643f7825  https://www.cnblogs.com/zhoujinyi/p/5570024.html

# cp sentinel.conf sentinel26379.conf

# grep ^[^#] /usr/local/dbconf/redis/sentinel26379.conf 红色字体是自己修改的,其中有的配置会根据当前redis服务情况自动调整

port 26379

sentinel myid f6c05ea79855664688492388058f0568c8b02f14

dir "/tmp"

sentinel monitor mymaster 127.0.0.1 6382 2

sentinel config-epoch mymaster 5

sentinel leader-epoch mymaster 5

sentinel known-slave mymaster 127.0.0.1 6381

sentinel known-slave mymaster 127.0.0.1 6379

sentinel current-epoch 5

sentinel announce-ip 127.0.0.1 #这里如果是本机127.0.0.1可以不用配置

sentinel announce-port 6379

logfile "/usr/local/dblog/redis/sentinel26379.log"

daemonize yes

 

2)启动sentinel

# redis-server /usr/local/dbconf/redis/sentinel26379.conf --sentinel

另一种启动方式 # redis-sentinel /usr/local/dbconf/redis/sentinel26379.conf

 

3sentinel服务本身也不是万能的,也会宕机,所以我们还得部署sentinel集群,象我这样多启动几个sentinel。

关注这个配置:sentinel monitor mymaster 127.0.0.1 6382 2  这个后面的数字2,是指当有两个及以上的sentinel服务检测到master宕机,才会去执行主从切换的功能。

 

4)相关日志

 

推荐阅读