redis主从同步与读写分离
admin
2023-06-05 19:01:26
0

一、原理

Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构。下面是关于redis主从复制的一些特点:

1.master可以有多个slave。

2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构。

3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。

4.主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余。

5.可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。

二、主从复制过程

当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连 接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完成写文件 后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。接着master就会把缓存的命 令转发给slave。而且后续master收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从 client发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自动重新建立连接。如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。

三、配置与应用

1)redis安装

(1)下载redis

# wget http://download.redis.io/releases/redis-3.0.7.tar.gz

(2)解压安装

# tar zxvf redis-3.0.7.tar.gz
# cd redis-3.0.7
# make PREFIX=/data/server/redis install

(3)配置redis

①:创建redis配置文件目录并拷贝配置文件至此目录

# mkdir -p /data/server/redis/etc
# cp redis.conf  /data/server/redis/etc

②:设置redis运行方式为后台运行

# sed -i 's/daemonize no/daemonize yes/g' /data/server/redis/etc/redis.conf

③:下载redis init 启动文件至 init.d 目录下,并赋予权限.

# wget -c http://soft.vpser.net/lnmp/ext/init.d.redis -O /etc/init.d/redis
# chmod 755 /etc/init.d/redis

④:创建redis日志目录及日志存放文件

# mkdir /data/server/redis/logs
# touch /data/server/redis/logs/redis.log

⑤:创建pid目录与数据存储目录

# mkdir /data/server/redis/run
# mkdir /data/server/redis/db

⑥:修改 vim /etc/init.d/redis 启动文件中文件path


2)redis主从同步配置

(1)Master服务器端:

# grep -v '^#' redis.conf |grep -v '^$'                      
daemonize yes 
pidfile /data/server/redis/run/redis.pid
#定义端口
port 1234
#绑定IP
bind 10.10.10.2
timeout 300 
loglevel notice
#指定日志目录
logfile /data/server/redis/logs/redis.log
databases 16
#配置持久化(rdb模式)
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
#定义数据文件和目录
dbfilename master.rdb
dir /data/server/redis/db
slave-serve-stale-data yes
slave-read-only yes
slave-priority 100
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb60
client-output-buffer-limit pubsub 32mb 8mb 60

(2)slave服务器端

# grep -v '^#' redis.conf |grep -v '^$' 
daemonize yes 
pidfile /data/server/redis/run/redis.pid
port 1234 
bind 10.10.10.3
timeout 300 
loglevel notice
logfile /data/server/redis/logs/redis.log 
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename slave.rdb
dir /data/server/redis/db 
slaveof 10.10.10.2 1234         #指定master的地址
slave-serve-stale-data yes
slave-read-only yes
slave-priority 100
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb60
client-output-buffer-limit pubsub 32mb 8mb 60

(3)启动redis服务

Master:

# /data/server/redis/bin/redis-server /data/server/redis/etc/redis.conf
# tail -fn100 /data/server/redis/logs/redis.log  //检查日志是否有报错

Slave:

# /data/server/redis/bin/redis-server /data/server/redis/etc/redis.conf
# tail -fn100 /data/server/redis/logs/redis.log  //检查日志是否有报错

(4)检查redis主从同步

master:

redis-m > set data zhangsan
redis-m > get data

slave:

redis-s > get data

注:由于在配置文件中配置了slave-read-only yes,因此从节点处于只读状态,无法对数据库进行操作和更改.

附件:http://down.51cto.com/data/2368174

相关内容

热门资讯

真实感,AI时代写作的生命力所... AI时代,对于许多人来说,因为有了各种智能工具的加持,写作似乎变得容易了。通过提出命题、投喂内容,无...
一个以科技为名的节日,在一座深... 5月23日,2026年上海科技节在上海科技馆正式开幕,同日还将举办第五届上海科技传播大会,并见证上海...
原创 靠... 谁能想到,一笔眼看能让90后创始人躺赚140亿的AI公司收购案,会被商务部一记重拳紧急喊停。 江西小...
特朗普称美伊协议基本谈成 美东时间23日下午,美国总统特朗普在社交媒体发文,称美国与伊朗已经基本谈成一份协议。(央视记者 刘骁...
以媒:美伊协议或“非常不利”,... 新华社耶路撒冷5月23日电(记者陈君清 庞昕熠)以色列媒体23日报道,以总理内塔尼亚胡当晚召集执政联...
独属于AI时代的故事|新华走笔 来源:5月22日《新华每日电讯》 作者:孙正好 AI浪潮激荡,总会在那些平凡而普通的个体生命中,惊起...
原创 i... 2026年5月20日,iQOO带来了全新旗舰机型iQOO 15T,同时一口气上新iQOO Pad6 ...
巴基斯坦消息人士:美伊接近达成... 新华社伊斯兰堡5月23日电(记者杨恺)巴基斯坦官方消息人士23日告诉新华社记者,美国与伊朗接近达成一...
特朗普又说美伊“越来越接近”达... 新华社华盛顿5月23日电(记者黄强 徐剑梅)美国总统特朗普23日说,美国与伊朗的谈判“越来越接近”达...