redis不仅支持主从复制,而且支持数据分片存储的方式(详见关于数据库)
主从复制只能减轻读压力,而数据分片存储可以同时减轻读写压力
mysql的主从复制和redis的主从复制
mysql的主从复制先做一个完整备份然后传输给从节点并记录二进制日志的位置,然后从该位置进行复制
redis的主从复制是将快照传输给从节点,此后每一个写操作同时会传输给从节点
如果redis主从节点连接断开一段时间,重新连接时主节点会重新拍快照传输给从节点,而不是从断开处恢复
redis主从复制
特点
一个Master可以有多个slave主机,支持链式复制
Master以非阻塞方式同步数据至slave主机
配置主从复制
开启bind,主从也需配置登录密码,密码一般需要相同(从提升为主的情况)
方法一:命令行
SLAVEOF <MASTER_IP> <MASTER_PORT>
CONFIG SET masterauth <PASSWORD>
CONFIG REWRITE ###将命令写入到配置文件,可在配置文件末尾处看到写入的命令
方法二:配置文件
slaveof
masterauth
主从配置简单实现示例
1,主从全部设置监听所有ip,并设置相同密码
################################## NETWORK #####################################
bind 0.0.0.0
################################## SECURITY ###################################
requirepass 123.com
2,从服务器上指定主服务器是谁,以及认证密码
################################# REPLICATION #################################
slaveof 192.168.39.11 6379
masterauth 123.com
3,重启redis服务后在主服务器上查看
[root@localhost ~]# redis-cli -a 123.com
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.39.12,port=6379,state=online,offset=946,lag=1
slave1:ip=192.168.39.13,port=6379,state=online,offset=946,lag=1
master_repl_offset:946
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:945
配置参数
slaveof
masterauth
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
no, Disk-backed, Diskless
新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style:
Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点
Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段
repl-diskless-sync-delay 5
repl-ping-slave-period 10
repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
slave-priority 100
复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举
min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作
min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作
redis运维相关的命令
CLIENT GETNAME
CLIENT KILL ###杀死某个redis客户端
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
CLIENT LIST ###列出redis客户端
CLIENT PAUSE
CLIENT PAUSE timeout
CLIENT REPLY
CLIENT SETNAME:Set the current connection name
SHUTDOWN [NOSAVE|SAVE]
配置参数可运行时修改
CONFIG GET
CONFIG RESETSTAT
CONFIG REWRITE ###将命令写入到配置文件
CONFIG SET
INFO:服务器状态信息查看;分为多个secion
INFO [section]
sentinel
主要完成三个功能:监控、通知、自动故障转移
选举:流言协议、投票协议
配置文件redis-sentinel.conf
配置项
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障
s_down: subjectively down
o_down: objectively down
sentinel down-after-milliseconds <master-name> <milliseconds>
监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”
sentinel parallel-syncs <master-name> <numslaves>
指在failover过程中,能够被sentinel并行配置的从节点的数量
sentinel failover-timeout <master-name> <milliseconds>
sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败
sentinel notification-script <master-name> <script-path>
通知脚本,此脚本被自动传递多个参数;
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
sentinel简单实现示例
port 26379
bind 0.0.0.0
sentinel monitor mymaster 192.168.39.11 6379 2
sentinel auth-pass mymaster 123.com
systemctl start redis-sentinel
cluster
redis的集群技术
- 客户端分片:有较大缺陷,如增加客户端压力,耦合性太强,节点改变会导致客户端和实际不匹配
- 代理分片:
twitter:twemproxy(缺点较多,单核模式、无法平滑扩展、无后台界面等)
豌豆荚:codis(相比下优点明显,但内部无paxos类的协调机制需借助第三方zookeeper等来协调) - redis官方:redis cluster
启用cluster一般客户端就不行了,需要用专用的cluster智能客户端,如果想用一般的客户端就需要cerberus代理
CLuster配置
cluster-enabled 是否开启集群配置
cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
cluster-node-timeout 集群节点互连超时的阈值,单位毫秒
cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长
cluster简单实现示例
1,配置
cluster-enabled
cluster-config-file
2,分片
CLUSTER ADDSLOTS(改命令可添加分片,但要一个打出来,所以就不进去redis以命令的形式添加)
如
redis-cli -c -h 192.168.39.11 -p 6379 cluster addslots {0…5499}
redis-cli -c -h 192.168.39.11 -p 6379 cluster addslots {5500…10999}
redis-cli -c -h 192.168.39.11 -p 6379 cluster addslots {11000…16383}
3,设定集群成员
CLUSTE MEET ip port
4,获取集群状态
CLUSTER INFO
CLUSTER NODES
一个完整的reids集群
先用cluster做集群,在为每个节点做主从,sentinel做主从的故障转移