文章目录

  • 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

redis beat 是稳定版么 redis tw_Redis


重启生效

redis beat 是稳定版么 redis tw_nosql_02

[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存储的数据生成快照并存储到磁盘等介质上;

redis beat 是稳定版么 redis tw_redis beat 是稳定版么_03


AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

Redis 主从复制

在本机创建slave
[root@server1 ~]# redis-server --port 6380 --replicationof 127.0.0.1 6379

redis beat 是稳定版么 redis tw_redis_04


redis beat 是稳定版么 redis tw_redis_05


redis beat 是稳定版么 redis tw_redis beat 是稳定版么_06

在其他主机创建slave

修改 /etc/redis/6379.conf

69 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  70 bind 0.0.0.0
  71 slaveof 172.25.254.101 6379

重启

redis beat 是稳定版么 redis tw_redis_07


此时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 服务

redis beat 是稳定版么 redis tw_nosql_08


测试

关掉server1 redis

redis beat 是稳定版么 redis tw_负载均衡_09

Redis集群

Twemproxy与Codis

Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。
Codis由豌豆荚于2014年11月开源,基于Go和C开发,是近期涌现的、国人开发的优秀开源软件之一。

使用Twemproxy搭建集群
安装Twemproxy

官方git

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

redis beat 是稳定版么 redis tw_nosql_10


安装成功

配置

新建 /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 有

redis beat 是稳定版么 redis tw_redis_11


再次写入

redis beat 是稳定版么 redis tw_Redis_12


此时存储数据的是server2

弊端

实际上twemproxy只存储在某一个节点 下面是server1挂掉的情况

redis beat 是稳定版么 redis tw_Redis_13

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

redis beat 是稳定版么 redis tw_redis_14


在确保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.

redis beat 是稳定版么 redis tw_redis_15


使用

redis beat 是稳定版么 redis tw_Redis_16


cluster 是通过hash槽来确定数据 k1 放在了12706的slot上 访问k1 只能到12706的slot上取

cluster实现了master和slave的自动切换和数据的读写分离(slave只能读)

将7000和7005重新启动

redis beat 是稳定版么 redis tw_nosql_17

添加集群节点

添加新的节点的基本过程就是添加一个空的节点然后移动一些数据给它,有两种情况,添加一个主节点和添加一个从节点(添加从节点时需要将这个新的节点设置为集群中某个节点的复制)

添加节点

redis beat 是稳定版么 redis tw_负载均衡_18


添加进集群

[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

redis beat 是稳定版么 redis tw_redis beat 是稳定版么_19


给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

redis beat 是稳定版么 redis tw_redis beat 是稳定版么_20