1、原理redis
Redis的主从复制功能很是强大,一个master能够拥有多个slave,而一个slave又能够拥有多个slave,如此下去,造成了强大的多级服务器集群架构。下面是关于redis主从复制的一些特色:数据库
1.master能够有多个slave。vim
2.除了多个slave连到相同的master外,slave也能够链接其余slave造成图状结构。缓存
3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master能够继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。bash
4.主从复制能够用来提升系统的可伸缩性,咱们能够用多个slave 专门用于client的读请求,好比sort操做可使用slave来处理。也能够用来作简单的数据冗余。服务器
5.能够在master禁用数据持久化,只须要注释掉master 配置文件中的全部save配置,而后只在slave上配置数据持久化。架构
2、主从复制过程
app
当设置好slave服务器后,slave会创建和master的链接,而后发送sync命令。不管是第一次同步创建的链接仍是链接断开后的从新连 接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完成写文件 后,master就发送文件给slave,slave将文件保存到磁盘上,而后加载到内存恢复数据库快照到slave上。接着master就会把缓存的命 令转发给slave。并且后续master收到的写命令都会经过开始创建的链接发送给slave。从master到slave的同步数据的命令和从 client发送的命令使用相同的协议格式。当master和slave的链接断开时slave能够自动从新创建链接。若是master同时收到多个 slave发来的同步链接命令,只会使用启动一个进程来写数据库镜像,而后发送给全部slave。ide
3、配置与应用lua
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,所以从节点处于只读状态,没法对数据库进行操做和更改.