启动:
redis-server /data/redis/redis.conf &
基础命令:
字符串
定义一个 key value
127.0.0.1:6379> set k1 v1
查看一个key 值
127.0.0.1:6379> get k1
"v1"
查看一个键的类型
127.0.0.1:6379> set k2 10
OK
127.0.0.1:6379> TYPE k2
string
批量定义、获取键值
127.0.0.1:6379> mset k1 tt k2 yy k3 uu
OK
127.0.0.1:6379> mget k1 k2 k3
- "tt"
- "yy"
- "uu"
RDB持久化:
不要kill -9
shutdown 时,会执行BGSAVE
AOF RDB 文件同时存在,优先读AOF
主从复制:
流程
1.从库发起同步请求
2.主库收到请求后执行bgsave保存当前内存里的数据到磁盘
3.主库将持久化的数据发送给从库的数据目录
4.从库收到主库的持久化数据之后,先清空自己当前内存中的所有数据
5.从库将主库发送过来的持久化文件加载到自己的内存里
局限性:
1.执行主从复制之前,现将数据备份一份
2.建议将主从复制写入到配置文件中
3.在业务低峰期做主从复制,
4.拷贝数据时候会占用带宽
5.不能自动完成主从切换,需要人工介入
哨兵
redis01 192.168.0.51
redis02 192.168.0.52
redis03 192.168.0.53
redis-cli -h 192.168.0.52 shutdown
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install
vim /opt/redis_cluster/redis_6379/conf/redis_6379.com
redis普通节点配置文件
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 192.168.0.51
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
其他两个节点更改bind IP
哨兵配置文件
mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 192.168.0.51
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 192.168.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
其他两个节点把bind ip 改成自己的ip
启动
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
进入redis
redis-cli -h 192.168.0.51
redis-cli -h 192.168.0.52
redis-cli -h 192.168.0.53
建立主从复制
192.168.0.52:6379> SLAVEOF 192.168.0.51 6379
192.168.0.53:6379> SLAVEOF 192.168.0.51 6379
启动哨兵:
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
哨兵工作原理:
集群
DB01 上操作
mkdir -p /data/redis_cluster/redis_6380
mkdir -p /data/redis_cluster/redis_6381
mkdir -p /opt/redis_cluster/redis_6380/{conf,logs,pid}
mkdir -p /opt/redis_cluster/redis_6381/{conf,logs,pid}
cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 192.168.0.51
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
cd /opt/redis_cluster/
cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf
rsync -avz /opt/redis_cluster/redis_638* 192.168.0.52:/opt/redis_cluster/
rsync -avz /opt/redis_cluster/redis_638* 192.168.0.53:/opt/redis_cluster/
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
DB02 修改配置文件的bindIP
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#52#g"
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
DB03修改配置文件的bindIP
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#53#g"
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
查看节点上的集群状态
[root@redis01 redis_cluster]# ps -ef |grep redis
root 2507 1 0 15:36 ? 00:00:01 redis-server 192.168.0.51:6380 [cluster]
root 2509 1 0 15:36 ? 00:00:01 redis-server 192.168.0.51:6381 [cluster]
登录redis-cli -h 192.168.0.51 -p 6380
查看集群节点信息
192.168.0.51:6380> CLUSTER NODES
b268ccb89f407fb59c8317760a622bb29c481f92 192.168.0.51:6380 myself,master - 0 0 1 connected
添加其他节点到集群
192.168.0.51:6380> CLUSTER MEET 192.168.0.52 6380
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.53 6380
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.51 6381
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.52 6381
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.53 6381
OK
192.168.0.51:6380> CLUSTER NODES
4190cd752395598714cfb709cb56bf51fd315d3f 192.168.0.53:6380 master - 0 1599898003964 2 connected
e0ce93415280f8ae5fbc37bd35da034b0c97f07a 192.168.0.52:6380 master - 0 1599898004371 0 connected
7dfba04b4e0e956a8c63c88235b4900fe49282e9 192.168.0.53:6381 master - 0 1599898002941 3 connected
b268ccb89f407fb59c8317760a622bb29c481f92 192.168.0.51:6380 myself,master - 0 0 1 connected
5b77253f8acda8ccce6e95a717b67412bd417b35 192.168.0.51:6381 master - 0 1599897999865 5 connected
618ab877a1235c31034fc5b260252b4df90e59b4 192.168.0.52:6381 master - 0 1599898001916 4 connected
查看端口信息,发现多了两个端口
[root@redis01 redis_cluster]# netstat -luntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.0.51:16380 0.0.0.0:* LISTEN 2582/redis-server 1
tcp 0 0 192.168.0.51:16381 0.0.0.0:* LISTEN 2593/redis-server 1
tcp 0 0 192.168.0.51:6380 0.0.0.0:* LISTEN 2582/redis-server 1
tcp 0 0 192.168.0.51:6381 0.0.0.0:* LISTEN 2593/redis-server 1
这是集群的通信端口
在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障灯状态信息,redis 集群采用 Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。
通信过程:
1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,通信端口在基础端口上家10000.
2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息
3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。
通讯消息类型:
Gossip
Gossip 协议职责就是信息交换,信息交换的载体就是节点间彼此发送Gossip 消息。
常见 Gossip 消息分为:ping、 pong、 meet、 fail 等
meet
meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换
ping
ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。
pong
Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。
fail
fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。
作者:被运维耽误的厨子
链接:https://www.jianshu.com/p/2f93bb771469
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
分配槽位
集群中一共有16384(0-16383)个槽位,只要有一个槽位有问题或者没有分配整个集群都不能使用
redis-cli -h 192.168.0.51 -p 6380 cluster addslots {0..5461}
redis-cli -h 192.168.0.52 -p 6380 cluster addslots {5462..10922}
redis-cli -h 192.168.0.53 -p 6380 cluster addslots {10923..16383}
查看集群状态
192.168.0.51:6380> CLUSTER INFO
cluster_state:ok
构建集群高可用
51的 6381 作为52 6380的从节点
192.168.0.51:6381>
CLUSTER REPLICATE 91345d27dfc7814e5a450e187bf1d091691fead1
52 6381 作为53 6380的从节点
192.168.0.52:6381
CLUSTER REPLICATE b12acd3ee7ce1cd3e19462e8a4ca6dd43a964f79
53 6381 作为51 6380的从节点
192.168.0.53:6381>
CLUSTER REPLICATE 7cd8f4a8d9d135f6238dc8f56d1d4e5d9900b4dd

插入数据测试
[root@redis01 ~]# redis-cli -h 192.168.0.51 -p 6380
192.168.0.51:6380>
192.168.0.51:6380>
192.168.0.51:6380> set k1 ffff
(error) MOVED 12706 192.168.0.53:6380
192.168.0.51:6380>
发现报错了,让我们移动到 53上
Redis Cluster ASK路由介绍
在集群模式下,Redis接受任何键相关命令时首先会计算键对应的槽,再根据槽找出所对应的节点
如果节点是自身,则处理键命令;
否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为Mover重定向.
知道了ask路由后,我们使用-c选项批量插入一些数据
cat set.sh
#!/bin/bash
for i in {1..1000}
do
redis-cli -c -h 192.168.0.51 -p 6380 set k${i} $i
echo "$i"
done
模拟故障转移
把redis03主节点停掉,正常情况 redis02上的6381从节点会成为主节点
关闭redis03主节点前的集群状态:


关闭之后

