zoukankan      html  css  js  c++  java
  • redis相关笔记(二.集群配置及使用)

    1. redis笔记一
    2. redis笔记二
    3. redis笔记三

    1.配置:在原redis-sentinel文件夹中添加{8337,8338,8339,8340}文件夹,且复制原8333中的配置

    在上述8333配置文件上添加集群相关配置

                #============================================自定义配置开始========================================
                #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
                daemonize yes
                #当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
                Pidfile /var/run/redis_8340.pid
                #指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
                port 8340
                #绑定的主机地址
                bind 192.168.37.134
                #日志记录方式,默认为标准输出,日志输出至指定日志文件
                logfile "./redis-8340.log"
                #指定本地数据库存放目录
                dir "/usr/local/redis-sentinel/8340"
                #当master服务设置了密码保护时,slave服务连接master的密码
                masterauth admin.1231
                #设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
                requirepass admin.1231
                #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段
                时间内的数据丢失。
                #因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no(开启AOF持>久化)
                appendonly yes
                ##集群开关,默认是不开启集群模式。
                cluster-enabled yes
                #集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置>文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
                cluster-config-file nodes_8340.conf
                #节点互连超时的阀值。集群节点超时毫秒数
                cluster-node-timeout 10100
                #============================================自定义配置结束========================================

    2.全部启动

                [root@localhost redis-sentinel]# redis-server 8337/redis-8337.conf 
                [root@localhost redis-sentinel]# redis-server 8338/redis-8338.conf 
                [root@localhost redis-sentinel]# redis-server 8339/redis-8339.conf 
                [root@localhost redis-sentinel]# redis-server 8340/redis-8340.conf 

    查看结果

                [root@localhost redis-sentinel]# ps -ef | grep redis
                root      44355      1  0 10:10 ?        00:00:00 redis-server 192.168.37.134:8337 [cluster]
                root      44368      1  0 10:11 ?        00:00:00 redis-server 192.168.37.134:8338 [cluster]
                root      44372      1  0 10:11 ?        00:00:00 redis-server 192.168.37.134:8339 [cluster]
                root      44376      1  0 10:11 ?        00:00:00 redis-server 192.168.37.134:8340 [cluster]

    3.连接且并指派槽(16484个)

    (可以使用redis官方工具redis-trib.rb 来实现(集群加从服务器:Redis Cluster requires at least 3 master nodes,At least 6 nodes are required.This is not possible with 4 nodes and 1 replicas per node.))

    1.连接组成集群

    [root@localhost redis-sentinel]# redis-cli -c -h 192.168.37.134 -p 8337 -a admin.1231

    #现在只有一个

    192.168.37.134:8337> cluster nodes
    1cc4d5687c9f75cfe6cda8a0f22120b9ef652ca5 :8337 myself,master - 0 0 0 connected

    #和8338端口的连接起来

    192.168.37.134:8337> cluster meet 192.168.37.134 8338
    OK

    同样依次连接8339,8340
    此时redis集群时下线状态无法使用, CLUSTERDOWN Hash slot not served,槽未指派

    2.指派槽

    写个shell脚本,内容如下,内容是指将端口为8337的节点指派(0-4999)的槽,其他节点也以此分配,总共16484个分配至四个节点中

                    #! /bin/bash
                    for((i=0; i<5000; i++))
                    do
                      redis-cli -c -h 192.168.37.134 -p 8337 -a admin.1231 cluster addslots $i
                      echo $i" 次添加完毕"
                    done

    3.连接后查询可以看出cluster_slot16384个已全部ok

                    192.168.37.134:8337> cluster info
                    cluster_state:ok
                    cluster_slots_assigned:16384
                    cluster_slots_ok:16384
                    cluster_slots_pfail:0
                    cluster_slots_fail:0
                    cluster_known_nodes:4
                    cluster_size:4
                    cluster_current_epoch:3
                    cluster_my_epoch:1
                    cluster_stats_messages_sent:9053
                    cluster_stats_messages_received:9053
                    #设置值时可以看到此值是放入8340节点的15495槽中
                    192.168.37.134:8337> set a b
                    -> Redirected to slot [15495] located at 192.168.37.134:8340
                    OK

    redis的使用

        public static void main(String [] args) throws IOException {
            //建立连接
            Socket socket = new Socket("192.168.37.134", 6379);
            OutputStream outputStream = socket.getOutputStream();
            InputStream inputStream = socket.getInputStream();
            
            /**
            *    resp协议:https://redis.io/topics/protocol
            *    单行回复:回复的第一个字节是 "+",如表示成功 +OK
            *    错误信息:回复的第一个字节是 "-",如表示错误 -ERR unknown command 'xxx'
            *    整形数字:回复的第一个字节是 ":"
            *    多行字符串:回复的第一个字节是 "$"
            *    数组:回复的第一个字节是 "*"
            */
            
            
            /*     遵循resp协议发送消息:
                *3   数组包含3个元素,分别是SET、eat、I want to eat
                $3   是一个字符串,且字符串长度为3
                SET  字符串的内容
                $3   是一个字符串,且字符串长度为3
                aaa  字符串的内容
                $6  是一个字符串,且字符串长度为13
                bbbbbb 字符串的内容
            * */
            outputStream.write("*3".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("$3".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("SET".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("$3".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("aaa".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("$6".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("bbbbbb".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.flush();
    
            //接收消息
            byte [] result = new byte[2048];
            inputStream.read(result);
            System.out.println("接收到响应:"+new String(result));
        }

    结果===>接收到响应:+OK

  • 相关阅读:
    思念
    空白
    curl json string with variable All In One
    virtual scroll list All In One
    corejs & RegExp error All In One
    socket.io All In One
    vue camelCase vs PascalCase vs kebabcase All In One
    element ui 表单校验,非必填字段校验 All In One
    github 定时任务 UTC 时间不准确 bug All In One
    input range & color picker All In One
  • 原文地址:https://www.cnblogs.com/lantuanqing/p/11577169.html
Copyright © 2011-2022 走看看