文章目录
- Redis 安装配置
- Redis基本操作
- Redis 持久化
- Redis 主从复制
- 在本机创建slave
- 在其他主机创建slave
- Redis的Sentinel系统
- Redis集群
- Twemproxy与Codis
- 使用Twemproxy搭建集群
- 安装Twemproxy
- 配置
- 弊端
- Redis集群
- Redis集群配置
- 添加集群节点
Redis 安装配置
官网下载
安装
解压 tar xzf redis-5.0.9.tar.gz
cd redis-5.0.9
make && make install
cd ./utils/
./install_server.sh
选择默认选项 一路回车
修改/etc/redis/6379.conf
重启生效
[root@server1 bin]# netstat -antlup | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 3596/redis-server 0
Redis基本操作
- 1 查看配置 CONFIG GET *
- 2 SELECT 选择数据库
从0-15 16个数据库 - 3 FLUSHDB 清空当前数据库
- 4 FLUSHALL 清空所有数据库
- 5 SET key 1 设置key
- 6 DEL key 删除key
- 7 RENAME oldkey newkey 重命名oldkey
- 8 EXPIRE key 10 设置过期时间
- 9 PERSIST key 移除生存时间 设置持久化
-1 代表 永久 - 10 KEYS pattern 查询 pattern
- 11 EXISTS 查询是否存在
Redis 持久化
- SAVE 和 BGSAVE
SAVE 保存
BGSAVE 后台保存
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
Redis 主从复制
在本机创建slave
[root@server1 ~]# redis-server --port 6380 --replicationof 127.0.0.1 6379
在其他主机创建slave
修改 /etc/redis/6379.conf
69 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
70 bind 0.0.0.0
71 slaveof 172.25.254.101 6379
重启
此时slave 是readonly状态 并且刷掉了之前所有数据
Redis的Sentinel系统
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
环境: master:server1 slave : server2 server3
在redis安装目录下拷贝sentinel配置文件
[root@server1 ~]# cd ~/pkgs/
nginx-1.18.0/ php-7.4.6/ redis-5.0.9/
[root@server1 ~]# cd ~/pkgs/redis-5.0.9/
[root@server1 redis-5.0.9]# ls
00-RELEASENOTES BUGS CONTRIBUTING COPYING deps INSTALL Makefile MANIFESTO README.md redis.conf runtest runtest-cluster runtest-moduleapi runtest-sentinel sentinel.conf src tests utils
[root@server1 redis-5.0.9]# cp sentinel.conf /etc/redis/
[root@server1 redis-5.0.9]# vim /etc/redis/sentinel.conf
[root@server1 redis-5.0.9]# scp /etc/redis/sentinel.conf server2:/etc/redis/
[root@server1 redis-5.0.9]# scp /etc/redis/sentinel.conf server3:/etc/redis/
编辑配置文件
17 protected-mode no
26 daemonize no
84 sentinel monitor mymaster 172.25.254.101 6379 2
113 sentinel down-after-milliseconds mymaster 10000
启动server2 server3 Sentinel 服务
测试
关掉server1 redis
Redis集群
Twemproxy与Codis
Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。
Codis由豌豆荚于2014年11月开源,基于Go和C开发,是近期涌现的、国人开发的优秀开源软件之一。
使用Twemproxy搭建集群
安装Twemproxy
git clone git@github.com:twitter/twemproxy.git
解压
[root@server4 twemproxy-master]# ls
ChangeLog configure.ac LICENSE Makefile.am notes README.md src travis.sh
conf contrib m4 man NOTICE scripts tests
安装 autoreconf automake libtool
[root@server4 twemproxy-master]# yum install autoreconf automake libtool -y
autoreconf -fvi
./configure && make && make install
安装成功
配置
新建 /etc/twemproxy.yml
[root@server4 ~]# netstat -antulp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 172.25.254.104:22121 0.0.0.0:* LISTEN 9899/nutcracker
tcp 0 0 0.0.0.0:22222 0.0.0.0:* LISTEN 9899/nutcracker
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3136/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3230/master
tcp 0 0 172.25.254.104:22 172.25.254.100:45852 ESTABLISHED 3393/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 3136/sshd
tcp6 0 0 ::1:25 :::* LISTEN 3230/master
[root@server4 ~]# cat /etc/twemproxy.yml
alpha:
listen: 172.25.254.104:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 172.25.254.101:6379:1
- 172.25.254.102:6379:1
- 172.25.254.103:6379:1
启动
[root@server4 ~]# nutcracker -d -c /etc/twemproxy.yml
使用server4的22121端口
172.25.254.104:22121> set user haha
OK
数据只有server1 有
再次写入
此时存储数据的是server2
弊端
实际上twemproxy只存储在某一个节点 下面是server1挂掉的情况
Redis集群
Redis集群配置
编写脚本创建集群
[root@server1 redis-cluster]# cat cluster.sh
#!/bin/bash
for i in $(seq 0 $1)
do
mkdir 700$i
cat>./700$i/redis.conf<<EOF
port 700$i
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
EOF
cd ./700$i
redis-server ./redis.conf
cd ..
done
在确保6个node开启的情况下 开启集群
[root@server1 redis-cluster]# redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 348e7cf8dd2b72c8f1f39161eeae92b553906b81 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
M: 44e66f478963ce8dd3915047bdc3442dba7a0d6b 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
M: 058128e49b06144d97b08374074502f04c6d35f7 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
S: d82d5a383e9a35a50856da19ad861a56b9638ba5 127.0.0.1:7003
replicates 44e66f478963ce8dd3915047bdc3442dba7a0d6b
S: d0beab208dfd063d7b71554ca65c0cf3c0c68834 127.0.0.1:7004
replicates 058128e49b06144d97b08374074502f04c6d35f7
S: aca23d8f2ee927ee66eea7a8262077e4c4a1a7d0 127.0.0.1:7005
replicates 348e7cf8dd2b72c8f1f39161eeae92b553906b81
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 348e7cf8dd2b72c8f1f39161eeae92b553906b81 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: d0beab208dfd063d7b71554ca65c0cf3c0c68834 127.0.0.1:7004
slots: (0 slots) slave
replicates 058128e49b06144d97b08374074502f04c6d35f7
S: aca23d8f2ee927ee66eea7a8262077e4c4a1a7d0 127.0.0.1:7005
slots: (0 slots) slave
replicates 348e7cf8dd2b72c8f1f39161eeae92b553906b81
S: d82d5a383e9a35a50856da19ad861a56b9638ba5 127.0.0.1:7003
slots: (0 slots) slave
replicates 44e66f478963ce8dd3915047bdc3442dba7a0d6b
M: 058128e49b06144d97b08374074502f04c6d35f7 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 44e66f478963ce8dd3915047bdc3442dba7a0d6b 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
使用
cluster 是通过hash槽来确定数据 k1 放在了12706的slot上 访问k1 只能到12706的slot上取
cluster实现了master和slave的自动切换和数据的读写分离(slave只能读)
将7000和7005重新启动
添加集群节点
添加新的节点的基本过程就是添加一个空的节点然后移动一些数据给它,有两种情况,添加一个主节点和添加一个从节点(添加从节点时需要将这个新的节点设置为集群中某个节点的复制)
添加节点
添加进集群
[root@server1 redis-cluster]# redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
[root@server1 redis-cluster]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 42674ea6e226849f3790dc3287db7edc56e26684 ##7006的id
给7006分配slot
[root@server1 redis-cluster]# redis-cli --cluster reshard 127.0.0.1:7005 --cluster-from aca23d8f2ee927ee66eea7a8262077e4c4a1a7d0 --cluster-to 42674ea6e226849f3790dc3287db7edc56e26684 --cluster-slots 1000 --cluster-yes