centos 7.6——redis-Cluster——主从复制

redis-Cluster——主从复制

redis详解

1. 单节点Redis服务器带来的问题

  • 单点故障,服务不可用
  • 无法处理大量的并发数据请求
  • 数据丢失—大灾难

1.1 解决方法

  • 搭建Redis集群

2. Redis集群介绍

  • Redis集群是一个提供在多个Redis间节点间共享数据的程序集
  • Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
  • Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

3. Redis集群的优势

  • 自动分割数据到不同的节点上
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令

4. Redis集群的实现方法

  • 有客户端分片
  • 代理分片
  • 服务器端分片

5. Redis-Cluster数据分片

  • Redis 集群没有使用一致性hash, 而是引入了 哈希槽概念
  • Redis 集群有16384个哈希槽
  • 每个key通过CRC16校验后对16384取模来决定放置槽
  • 集群的每个节点负责一部分哈希槽
  • 以3个节点组成的集群为例
  • 节点 A 包含 0 到 5500号哈希槽
  • 节点 B 包含5501 到 11000 号哈希槽
  • 节点 C 包含11001 到 16384号哈希槽

支持添加或者删除节点
添加删除节点无需停止服务

例如

  • 如果想新添加个节点D, 需要移动节点 A, B, C中的部分槽到D上
  • 如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除

6. Redis-Cluster的主从复制模型

  • 集群中具有A,B,C三个节点,如果节点B失败了,整个集群就会因缺少5501-11000这个范围的槽而不可用;
  • 为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1为新的主节点继续服务 当B和B1都失败后,集群将不可用;

7.实验: redis—Cluster 主从复制

7.1 实验环境

  • 组件六台虚拟机:3个master节点3个slave节点
  • 主——master1:192.168.75.134 (需要安装ruby)
  • master2:192.168.75.155
  • master3:192.168.75.200
  • slave1:192.168.75.144
  • slave2:192.168.75.131
  • slave3:192.168.75.132

7.2实验描述

  • 设置网络参数、关闭防火墙和selinux(所有节点)
  • 下载并安装Redis(所有节点)
  • 修改Redis配置文件(所有节点)
  • 创建Redis集群(master1节点)
  • 导入key文件并安装rvm
  • 执行环境变量让其生效
  • 安装Ruby2.4.1版本
  • 安装redis客户端
  • 创建redis集群
  • 所有节点部署Redis服务器

7.3 实验步骤

1、创建集群:redis-cli --cluster create --cluster-replicas 1 节点IP地址1:端口… 节点IP地址n:端口

2、远程登录redis数据库:redis-cli -h 192.168.233.100 -p 6379 -c
-c:连接集群结点时使用,此选项可防止moved和ask异常

3、查看集群信息:可登陆redis数据库中,输入cluster info查询集群状态,也可使用命令 redis-cli --cluster info 节点ip:6379

7.3.1 所有节点服务器部署redis服务


 yum -y install gcc gcc-c++ make

 tar zxvf redis-5.0.7.tar.gz 

 cd redis-5.0.7/

make

 make PREFIX=/usr/local/redis install

cd /usr/local/redis/
 
ln -s /usr/local/redis/bin/* /usr/local/bin/

cd /opt/redis-5.0.7/utils/

  ./install_server.sh 

一路回车

Please select the executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server  //手动输入



/etc/init.d/redis_6379 status

/etc/init.d/redis_6379 stop

/etc/init.d/redis_6379 start

 vim /etc/6379.conf

 redis-cli    //登录


修改配置文件所有节点

vim /etc/redis/6379.conf

89/  protected-mode no   //关闭保护模式

93/  port  6379

137/  daemonize yes   /以独立进程启动

833/  cluster-enabled yes    //开启群集功能

841/  cluster-config-file nodes-6379.conf   // 群集名称文件设置

847/  cluster-node-timeout 15000    //群集超时时间设置

700/  appendonly yes   //开启aof  持久化

#bind 127.0.0.1   //注释掉,允许所有节点访问


/etc/init.d/redis_6379 restart 

7.3.2 master0(192.168.75.134)节点配置

  • ruby服务并且使用 --cluster create建立群集关系
导入key文件

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

安装rvm  
curl -sSL https://get.rvm.io | bash -s stable不翻墙无法连接下载解决方向,用下面脚本文件执行

将rvm-installer.sh 放到虚拟机中

chmod +x  rvm-installer.sh

 
./rvm-installer.sh   //执行脚本

 source /etc/profile.d/rvm.sh      //执行环节变量
 
 rvm list known    //列出可执行ruby安装的版本


 rvm install 2.4.10   //安装rvm

 rvm use 2.4.10   //使用rvm

 ruby -v   //查看版本

 gem install redis   //再次安装Redis


所有节点关闭防火墙和核心防护

iptables -F

setenforce 0


建立Redis群集6组,三对,主从


redis-cli --cluster create 192.168.75.134:6379 \
192.168.75.155:6379 \
192.168.75.200:6379 \
192.168.75.144:6379 \
192.168.75.131:6379 \
192.168.75.132:6379 \
--cluster-replicas 1

Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.75.131:6379 to 192.168.75.134:6379
Adding replica 192.168.75.132:6379 to 192.168.75.155:6379
Adding replica 192.168.75.144:6379 to 192.168.75.200:6379
M: 2545e996e6a5bc9bd89498eab753195896c6f683 192.168.75.134:6379
   slots:[0-5460] (5461 slots) master
M: 0c6b70fd0e8fde5cd9a17234cacdec0f9745f8e5 192.168.75.155:6379
   slots:[5461-10922] (5462 slots) master
M: ed9b3be385920f7d1bd20bd0c58ef2b1c7448edf 192.168.75.200:6379
   slots:[10923-16383] (5461 slots) master
S: b58e8073edc1e72d15f44a2fcc8f228b64aa383d 192.168.75.144:6379
   replicates ed9b3be385920f7d1bd20bd0c58ef2b1c7448edf
S: 3d358490f7bdd68bd876e9dee0d03eb830ef2321 192.168.75.131:6379
   replicates 2545e996e6a5bc9bd89498eab753195896c6f683
S: 3b633f51937b54c5786b538b3f69faed5675d8ce 192.168.75.132:6379
   replicates 0c6b70fd0e8fde5cd9a17234cacdec0f9745f8e5
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 192.168.75.134:6379)
M: 2545e996e6a5bc9bd89498eab753195896c6f683 192.168.75.134:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 3b633f51937b54c5786b538b3f69faed5675d8ce 192.168.75.132:6379
   slots: (0 slots) slave
   replicates 0c6b70fd0e8fde5cd9a17234cacdec0f9745f8e5
M: 0c6b70fd0e8fde5cd9a17234cacdec0f9745f8e5 192.168.75.155:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: b58e8073edc1e72d15f44a2fcc8f228b64aa383d 192.168.75.144:6379
   slots: (0 slots) slave
   replicates ed9b3be385920f7d1bd20bd0c58ef2b1c7448edf
M: ed9b3be385920f7d1bd20bd0c58ef2b1c7448edf 192.168.75.200:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 3d358490f7bdd68bd876e9dee0d03eb830ef2321 192.168.75.131:6379
   slots: (0 slots) slave
   replicates 2545e996e6a5bc9bd89498eab753195896c6f683
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


7.3.3 哈希槽的分布


master0: Slots    0 - 5460             ——192.168.75.134:6379

master1: Slots    5461 - 10922         —— 192.168.75.155:6379

master2: Slots    10923 - 16383        ——192.168.75.200:6379

7.3.4 三组节点群集情况:


master0:192.168.75.134:6379  slave0:192.168.75.131:6379 

master1:192.168.75.155:6379  slave1:192.168.75.132:6379

master2:192.168.75.200:6379  slave2:192.168.75.144:6379

7.3.5 查看集群slave、slot、key分布信息情况


[root@localhost ~]# redis-cli --cluster info 192.168.75.134:6379
192.168.75.134:6379 (004fefa8...) -> 2 keys | 5461 slots | 1 slaves.
192.168.75.200:6379 (0ef7c436...) -> 1 keys | 5461 slots | 1 slaves.
192.168.75.155:6379 (6ecd5793...) -> 2 keys | 5462 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.
[root@localhost ~]# 

  • 在登录master0:192.168.75.134并且添加数据

[root@localhost 6379]# redis-cli -c -h 192.168.75.134   //登录
192.168.75.134:6379> use shcool
(error) ERR unknown command `use`, with args beginning with: `shcool`, 
192.168.75.134:6379> select 10  //群集模式不能切换库
(error) ERR SELECT is not allowed in cluster mode
192.168.75.134:6379> set name age //新建数据键值name
-> Redirected to slot [5798] located at 192.168.75.155:6379  //哈希槽5798属于master1 范围所以set的新数据就切换到节点master1上。
OK
192.168.75.155:6379> get name   //其他节点都可以查看
"age"
192.168.75.155:6379> set id 1  
OK
192.168.75.155:6379> 

7.3.6 redis扩容命令

1、将redis节点添加到集群:进入集群中一个节点添加
redis-cli --cluster add-node 新节点IP:端口号 当前集群中已存在的任意节点IP:端口号’


[root@master1 ~]# redis-cli --cluster add-node 192.168.75.47:6379 192.168.75.166:6379	'//redis-cli --cluster add-node 新节点IP:端口号 当前集群中已存在的任意节点IP:端口号'
    

2、删除节点:redis-cli --cluster del-node ip地址 节点id

在删除主节点时需要将数据哈希槽移到其他节点中然后移走或者删除节点
redis群集至少有三个master才能构建群集。如果有一组的主从节点都down。群集不存在。


[root@master1 ~] cd /var/lib/redis/6379/
[root@master1 6379] ls
appendonly.aof  dump.rdb  nodes-6379.conf
[root@master1 6379] rm -rf *

3、迁移redis槽位

   [root@master1 ~] redis-cli --cluster reshard 192.168.100.41:6379
    How many slots do you want to move (from 1 to 16384)? 4096  '//要迁移多少个槽'

    What is the receiving node ID? 99521b7fd126b694bcb9a22ffa5a490f31f66543  '//迁移到哪个节点,数据节点id'

    Please enter all the source node IDs.
      
    Type 'all' to use all the nodes as source nodes for the hash slots.
      
    Type 'done' once you entered all the source nodes IDs.

    '//要求输入源节点的id,这里因为原本有三个节点,输入done表示结束'
    Source node 1: 7f112f82bcf28a5d0627ea81b48cb76f4ea8605d
    Source node 2: df195a34a91d756157a0fda7c71e99d5bd8fad09
    Source node 3: a233a23541f431107fed79908318394d8bb30b51
    Source node 4: done

    '//最后会有一个迁移方案,输入yes表示同意,迁移开始。输入no表示不同意,重新设置迁移方案。'

    '//确认是否迁移成功'
    [root@master1 ~] redis-cli -h 192.168.100.41 -p 6379
    192.168.100.41:6379> cluster nodes
        ...省略内容

4、迁移后检测各个节点槽的均衡性


    [root@master1 ~] redis-cli --cluster rebalance 192.168.100.41:6379
    >>> Performing Cluster Check (using node 192.168.100.41:6379)
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    *** No rebalancing needed! All nodes are within the 2.00% threshold.
    可以看出,节点负责的槽数据差异在2%以内,因此槽分配均衡
      

5、为扩容的主节点添加从节点


[root@master1 ~] redis-cli -h 192.168.100.48 -p 6379	'//登陆redis数据库'
192.168.100.48:6379> cluster replicate 99521b7fd126b694bcb9a22ffa5a490f31f66543	'//添加从节点id'
OK
192.168.100.48:6379> cluster nodes	'//查看节点信息'
...省略内容

6、平衡各节点槽数量


   [root@master1 ~] redis-cli --cluster rebalance --cluster-threshold 1 192.168.100.41:6379
    >>> Performing Cluster Check (using node 192.168.100.41:6379)
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    *** No rebalancing needed! All nodes are within the 1.00% threshold.

八、 群集查询语句

  • cluster nodes:查看群集节点ID
  • info replication : 主/从复制信息
  • cluster info:查看群集的信息
  • redis-cli --cluster info 192.168.75.200:6379 //查看群集状态
  • role:查看节点角色和slave
  • Redis Client Slots 命令用于当前的集群状态,以数组形式展示。
192.168.75.134:6379> cluster slots
1) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "192.168.75.134"
      2) (integer) 6379
      3) "004fefa8639346e660c76c6026fb84a115962c61"
   4) 1) "192.168.75.144"
      2) (integer) 6379
      3) "f7f6e088652a935f84d87ff8d878bdfb8913217e"
2) 1) (integer) 5462
   2) (integer) 10922
   3) 1) "192.168.75.155"
      2) (integer) 6379
      3) "6ecd57933114d2bff21f495ea5ca8c20663fbaff"
   4) 1) "192.168.75.132"
      2) (integer) 6379
      3) "ea154447d0f7c3f73f303d66d43ecf4dc82b9a57"
3) 1) (integer) 0
   2) (integer) 5461
   3) 1) "192.168.75.200"
      2) (integer) 6379
      3) "cb882911b47e91e9b046bd564a1b016697aac9ff"
   4) 1) "192.168.75.131"
      2) (integer) 6379
      3) "edd600d6bdac1a5e20956e930b82ea8cd8f5ff81"
192.168.75.134:6379> 

  • Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。

Redis Config Resetstat 命令用于重置 INFO 命令中的某些统计数据,包括:

    Keyspace hits (键空间命中次数)
    Keyspace misses (键空间不命中次数)
    Number of commands processed (执行命令的次数)
    Number of connections received (连接服务器的次数)
    Number of expired keys (过期key的数量)
    Number of rejected connections (被拒绝的连接数量)
    Latest fork(2) time(最后执行 fork(2) 的时间)
    The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值)

语法

redis Config Resetstat 命令基本语法如下:

    redis 127.0.0.1:6379> CONFIG RESETSTAT
    
  • ping 命令
Redis Ping 命令使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG 。

通常用于测试与服务器的连接是否仍然生效,或者用于测量延迟值。
语法

redis Ping 命令基本语法如下:

    redis 127.0.0.1:6379> PING 

可用版本

>= 1.0.0
返回值

如果连接正常就返回一个 PONG ,否则返回一个连接错误。
实例

    # 客户端和服务器连接正常
     
    redis 127.0.0.1:6379> PING
    PONG
     
    # 客户端和服务器连接不正常(网络不正常或服务器未能正常运行)
     
    redis 127.0.0.1:6379> PING
    Could not connect to Redis at 127.0.0.1:6379: Connection refused

  • Redis Client Pause 命令 在指定时间内终止运行来自客户端的命令
  • Redis Debug Object 命令 获取 key 的调试信息
  • Redis Flushdb 命令 删除当前数据库的所有key
  • Redis Save 命令 异步保存数据到硬盘
  • Redis Showlog 命令 管理 redis 的慢日志
  • Redis Lastsave 命令 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
  • Redis Config Get 命令 获取指定配置参数的值
  • Redis Command 命令 获取 Redis 命令详情数组
  • Redis Slaveof 命令 将当前服务器转变为指定服务器的从属服务器(slave server)
  • Redis Debug Segfault 命令 让 Redis 服务崩溃
  • Redis Flushall 命令 删除所有数据库的所有key
  • Redis Dbsize 命令 返回当前数据库的 key 的数量
  • Redis Bgrewriteaof 命令 异步执行一个 AOF(AppendOnly File) 文件重写操作
  • Redis Cluster Slots 命令 获取集群节点的映射数组
  • Redis Config Set 命令 修改 redis 配置参数,无需重启
  • Redis Command Info 命令 获取指定 Redis 命令描述的数组
  • Redis Shutdown 命令 异步保存数据到硬盘,并关闭服务器
  • Redis Sync 命令 用于复制功能(replication)的内部命令
  • Redis Client Kill 命令 关闭客户端连接
  • Redis Role 命令 返回主从实例所属的角色
  • Redis Monitor 命令 实时打印出 Redis 服务器接收到的命令,调试用
  • Redis Command Getkeys 命令 获取给定命令的所有键
  • Redis Client Getname 命令 获取连接的名称
  • Redis Config Resetstat 命令 重置 INFO 命令中的某些统计数据
  • Redis Command Count 命令 获取 Redis 命令总数
  • Redis Time 命令 返回当前服务器时间
  • Redis Info 命令 获取 Redis 服务器的各种信息和统计数值
  • Redis Config rewrite 命令 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
  • Redis Client List 命令 获取连接到服务器的客户端连接列表
  • Redis Client Setname 命令 设置当前连接的名称
  • Redis Bgsave 命令 在后台异步保存当前数据库的数据到磁盘
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值