Redis主从复制和集群实验

来源:互联网 发布:js添加图片二维数组 编辑:程序博客网 时间:2024/06/05 01:53

什么是Redis(REmote DIctionary Server)

      redis是内存高速缓存的数据库,redis内部有多个数据库(在redis-conf文件中有配置,用户可以通过select 下标来选择数据库),它保存的数据模型为key-value,支持String/List/Set/Sorted/Zset等类型。redis可将数据从内存持久化到硬盘,保证了数据安全,最重要的是使用缓存减轻了数据库的负载。
      是典型的nosql 数据库服务器,采用KEY-VALUE存储结构,可以作为服务程序独立运行于自己的服务器主机,同时作为内存数据库,不用IO读取硬盘数据,能够快速响应请求。
      特点:支持持久化,支持多种数据库结构,支持主从复制、免费

redis和memcache比较

1、redis不仅仅支持简单的key/value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
2、redis支持master-slave(主-从)模式应用;
3、redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
4、redis单个vlaue的最大限制是1GB,memcached只能保存1MB的数据;

程序环境
      安装:yum -y install redis
      配置文件: /etc/redis.conf
      主程序:/usr/bin/redis-server
      端口: 6379/tcp
      客户端:/usr/bin/redis-cli
      数据目录:/var/lib/redis
redis-cli命令:
Usage: redis-cli [OPTIONS] [cmd [arg [arg …]]]
    -h HOST
    -p PORT
    -a PASSWORD
    -n DBID(0-15)
与Connection相关命令
    help @connection
    AUTH <password>
    ECHO <message>
    PING
    QUIT
    SELECT dbid
清空数据库:
    FLUSHDB:Remove all keys from the current database
    清空当前数据库;
    FLUSHALL:Remove all keys from all databases
    清空所有数据库;

配置和使用Redis:
    基本配置项
    网络配置项
    持久化相关配置
    复制相关的配置
    安全相关配置
    Limit相关的配置
    SlowLog相关的配置
    INCLUDES
    Advanced配置
通用配置项:
    daemonize, supervised, loglevel, pidfile, logfile,
    databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
    切换数据库的方法:
    SELECT <dbid>
网络配置项:
    bind IP
    port PORT
    &nbspprotected-mode
    tcp-backlog
    unixsocket
    timeout:连接的空闲超时时长;
安全配置:
requirepass <PASSWORD> 设置redis访问密码
密码连接方式 1: redis-cli -a 不推荐使用;
                     2: redis-cli 输入后 AUTH

Limits相关的配置:
        maxclients
        maxmemory <bytes>
        maxmemory-policy noeviction
           淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
        maxmemory-samples 5
            淘汰算法运行时的采样样本数;

SlowLog相关的配置:

slowlog-log-slower-than 10000   单位是微秒;
slowlog-max-len 128     SlowLog记录的日志最大条目;

ADVANCED配置:

hash-max-ziplist-entries 512hash-max-ziplist-value 64   

设置ziplist的键数量最大值,每个值的最大空间;

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60


Redis 主从复制实验

主节点
    node2  192.168.243.8
从节点
    node3  192.168.243.9
    node4  192.168.243.10
三台主机时间同步 都安装redis
在node3上修改主配置文件

[root@node3 ~]#vim /etc/redis.conf   配置完后保存重启服务61 #bind 127.0.0.162 bind 0.0.0.0   打开监听Ip265 # slaveof <masterip> <masterport>266 slaveof 192.168.243.8 6379  272 # masterauth <master-password>273 masterauth CENTOS    如果主节点密码认证(密码为CENTOS),需要在从节点开启此项

我们在主节点node2上可以查看到 从节点的连接

127.0.0.1:6379> SELECT 15127.0.0.1:6379[15]> CLIENT LIST127.0.0.1:6379[15]> info  replication   或者在node3上查看  192.168.243.9:6379[15]> info

在node4上修改主配置文件
用另外一种方法配置从节点

192.168.243.10:6379> SLAVEOF 192.168.243.8 6379192.168.243.10:6379> CONFIG SET masterauth CENTOS192.168.243.10:6379> INFO REPLICATION  查看状态

验证:
我们在主节点建个key

127.0.0.1:6379[15]> select 0127.0.0.1:6379> set testkey  "hi redis"

在任意从节点查看

192.168.243.9:6379> get testkey"hi redis"

sentinel:
主要完成三个功能:监控、通知、自动故障转移
选举:流言协议、投票协议

/etc/redis-sentinel.conf 主配置选项

sentinel monitor <master-name> <ip> <redis-port> <quorum>`<quorum>`表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;53 sentinel monitor mymaster 192.168.243.8 6379 2   
sentinel auth-pass <master-name> <password>73 sentinel auth-pass mymaster CENTOS
sentinel down-after-milliseconds <master-name> <milliseconds>监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;83 sentinel down-after-milliseconds mymaster 5000       5秒 默认为30
sentinel parallel-syncs <master-name> <numslaves>指在failover过程中,能够被sentinel并行配置的从节点的数量;91 sentinel parallel-syncs mymaster 3
sentinel failover-timeout <master-name> <milliseconds>sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;116 sentinel failover-timeout mymaster 180000   默认为3min
sentinel notification-script <master-name> <script-path>通知脚本,此脚本被自动传递多个参数;

我们在任意一个node节点按照以上步骤简单配置,然后scp 到其他节点上

[root@node2 ~]#scp /etc/redis-sentinel.conf node3:/etc/systemctl  restart redis-sentinel.service  

验证:
连接方式 [root@node2 ~]#redis-cli -h 192.168.243.8 -p 26379

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>

测试;
模拟把主节点宕了

[root@node2 ~]#systemctl  stop redis.service [root@node2 ~]#redis-cli -h 192.168.243.8 -p 26379
192.168.243.8:26379> SENTINEL masters   查看主节点查看到node2 从节点变为主节点了
192.168.243.8:26379> SENTINEL  slaves mymaster  查看从节点

如何修复宕机的原来的主节点node2?

[root@node2 ~]#vim /etc/redis.conf  265 # slaveof <masterip> <masterport> 266  slaveof 192.168.243.9 6379    指向新的主节点IP(这里新的主节点ip 是node3  192.168.243.9273 # masterauth <master-password> 274 masterauth CENTOS[root@node2 ~]#systemctl  restart redis.service 

CLuster:

为不受以上实验影响,先在node2、node3、node4这三个节点关闭
systemctl stop redis-sentinel.service
以及注释或者删除 273 #masterauth “CENTOS” 之后 restart redis.service
然后登陆检查各个节点 info,中replication 是否为master

[root@node3 ~]#redis-cli -a CENTOS127.0.0.1:6379> info127.0.0.1:6379> flushall

集群相关的配置:

cluster-enabled 是否开启集群配置
724 cluster-enabled yes

  • cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
    去掉注释
  • cluster-node-timeout 集群节点互连超时的阈值,单位毫秒
    去掉注释
  • cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。
[root@node2 ~]#vim /etc/redis.conf  按照以上配置设置,然后在node3和node4节点相同配置[root@node2 ~]#scp /etc/redis.conf node3:/etc/[root@node2 ~]#scp /etc/redis.conf node4:/etc/然后再这三个节点  systemctl restart redis.service 

配置过程:
(1) 设置配置文件,启用集群功能;
cluster-enabled yes
(2) 启动redis后为每个节点分配slots;
CLUSTER ADDSLOTS
注意:每个slot要独立创建;可用范围是0-16383,共16384个;
redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}

[root@node2 ~]#redis-cli  -a CENTOS  cluster addslots {0..5000}[root@node2 ~]#redis-cli  -a CENTOS  cluster INFO  查看[root@node2 ~]#redis-cli  -a CENTOS  -h 192.168.243.9 cluster addslots {5001..10923}[root@node2 ~]#redis-cli  -a CENTOS  -h 192.168.243.10 cluster addslots {10924..16383}

(3) 设定集群成员关系;
CLUSTE MEET

127.0.0.1:6379> CLUSTER MEET  192.168.243.9 6379127.0.0.1:6379> CLUSTER MEET  192.168.243.10 6379

验证;

当我们在node2 执行127.0.0.1:6379> set testkey1 hiOK127.0.0.1:6379> set testkey2 hello      (error) MOVED 14758 192.168.243.10:6379        根据提示,我们需要在node4(192.168.243.10)执行才行