作者:Teo

RocketMQ 搭建




RocketMQ 搭建


RocketMQ  二进制包安装  单机部署

    # unzip rocketmq-all-4.7.1-bin-release.zip
    # mv rocketmq-all-4.7.1-bin-release /usr/local/rocketmq
    # mkdir -p /usr/local/rocketmq/store
    # mkdir -p /usr/local/rocketmq/store/commitlog
    # mkdir -p /usr/local/rocketmq/store/consumequeue
    # mkdir -p /usr/local/rocketmq/store/index
    # export ROCKETMQ_HOME=/usr/local/rocketmq
    # export NAMESRV_ADDR=192.168.10.13:9876
    # cd /usr/local/rocketmq/conf
    # vim default-broker.properties               \\ 创建配置文件
        namesrvAddr=192.168.10.13:9876;
        messageIndexSafe=true
        autoCreateTopicEnable=true
        waitTimeMillsInSendQueue=5000
        sendMessageThreadPoolNums=64
        useReentrantLockWhenPutMessage=true
        defaultReadQueueNums = 16
        defaultWriteQueueNums = 16
        brokerIP1=192.168.10.13
        brokerClusterName=clusterName
        brokerName=localhost.localdomain
        brokerId=0
        deleteWhen=04
        fileReservedTime=48
        brokerRole=ASYNC_MASTER
        flushDiskType=ASYNC_FLUSH
        listenPort=port
        storePathRootDir=/usr/local/rocketmq/store
        storePathCommitLog= /usr/local/rocketmq/store/commitlog
        storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
        storePathIndex=/usr/local/rocketmq/store/index
    # cd /usr/local/rocketmq/bin
    # vim runbroker.sh
        JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
    # vim runserver.sh
        JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
    # /usr/local/rocketmq/bin/mqnamesrv &          \\ 启动 9876被监听
    # /usr/local/rocketmq/bin/mqbroker &            \\ 启动 10911 10912被监听

    rocketmq-externals       RocketMQ监控平台部署
        # cd /usr/local
        # git clone https://github.com/apache/rocketmq-externals.git
        # cd /usr/local/rocketmq-externals/rocketmq-console/src/main/resources
        # vim application.properties
            server.port=8080
            rocketmq.config.namesrvAddr=192.168.10.13:9876
            rocketmq.config.dataPath=/usr/local/rocketmq-console/data
        # cd /usr/local/rocketmq-externals/rocketmq-console
        # java -jar /usr/local/rocketmq-externals/rocketmq-console/target/rocketmq-console-ng-2.0.0.jar &  \\ 8080被监听

        http://192.168.10.13:8080/                  \\ 浏览器访问

    注:
        下载地址http://rocketmq.apache.org/dowloading/releases/




Redis 非关系型数据库




Redis 非关系型数据库



yum 安装 reids 任意版本

    # yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm    // 安装 remi redis 源
    # yum --enablerepo=remi list redis --showduplicates | sort -r                // 查看 redis 版本
    # yum --enablerepo=remi install redis-6.0.6                                  // 安装 指定版本
    # systemctl enable redis.service
    # systemctl restart redis


redis 6.08 单机部署

    # yum install gcc-c++ ruby rubygems
    # yum install centos-release-scl
    # yum install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils    // 需要升级gcc工具
    # scl enable devtoolset-9 bash
    # echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
    # gcc -v
    # wget http://download.redis.io/releases/redis-6.0.8.tar.gz
    # tar zxvf redis-6.0.8.tar.gz -C /usr/local/
    # cd /usr/local
    # mv redis-6.0.8/ redis
    # cd /usr/local/redis
    # make
    # make install PREFIX=/usr/local/redis
    # mkdir /usr/local/redis/{etc,data,run,logs}
    # mv redis.conf etc
    # vim /usr/local/redis/etc/redis.conf
        bind 192.168.10.13 127.0.0.1
        daemonize yes               // 可以设置redis 后台启动
        requirepass 123456          // redis 密码
        port 6379
        protected-mode yes          // 安全模式 只监听bind指定的ip   no为关闭状态 如果bing没绑定ip为监听所有ip
        dir /usr/local/redis/data                        // 指定 数据库 目录
        pidfile /usr/local/redis/run/redis_6379.pid      // 指定 pid 文件位置
        logfile '/usr/local/redis/logs/redis_6379.log'   // 指定 日志目录
        appendonly yes                                   // 打开 aof日志  AOF数据库存储  存储路径在上面配置的 dir目录下
        appendfsync everysec                             // 1秒存储一次  会丢失1秒的数据  appendonly.aof
    # vim /etc/rc.d/rc.local
        /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf  // 添加开机启动
    # chmod +x /etc/rc.d/rc.local                               // 需要给执行权限  默认是没有的 /etc/rc.local只是软链接
    # ln -sv /usr/local/redis/bin/redis-server /usr/local/bin/  // /usr/local/bin/ 目录是 $PATH中的 系统会默认去找寻此目录
    # ln -sv /usr/local/redis/bin/redis-cli /usr/local/bin/
    # /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf     // 启动redis
    # ss -tnl                       // 6379端口被监听
    # redis-cli
        auth 123456                 // 认证
        KEYS *
        exit
    # pkill redis                   // 关闭reids


Reids 简单测试使用
    # redis-cli -h 192.168.10.13 -p 6379 -a 123456   // 远程连接redis
    # redis-cli                                      // 本地连接redis
        auth 123456                   // 认证
        exit                          // 退出

        keys *                        // 查看所有的key 就是所有的数据
        set aa 123                    // 设置键值
        get aa                        // 查看某一个key的值
        flushdb                       // 清空当前数据库的所有key
        flushall                      // 清空所有数据库的所有key  删除所有数据库 
        select 2                      // 使用数据库2   默认使用0
        dbsize                        // 当前redis数据库的数据量
        keys sys_config:bw*           // 查找前缀为 sys_config:bw 的键值   进入redis 查询
        del key                       // 删除 单个 key  del + key的名字

        info replication              // 查看集群 状态
        config get requirepass        // 查看当前密码
            1) "requirepass"
            2) ""                     // 此为密码为空
        config set requirepass 123456 // 临时 设置密码

    # redis-cli KEYS "sys_config:bw*"                          // 查找前缀为 sys_config:bw 的键值   不进入redis 查询
    # redis-cli KEYS "sys_config:bw*" | xargs redis-cli DEL    // 删除多个key 查找前缀为 sys_config:bw 的键值  后 删除
    # redis-cli keys "*" > /data/redis_key.txt                 // 导出 所有键

    # pkill redis                                              // 关闭reids

    注:
        redis 连接工具Another-Redis-Desktop-Manager.1.4.2.exe   一般ip填写 127.0.0.1    使用ssh连接服务器 填写服务器ip
        下载地址 https://github.com/qishibo/AnotherRedisDesktopManager/releases


关于redis 数据库存储
    RDB持久化配置
        默认开启... Redis会将数据集的快照dump到dump. 会触发 save 中的规则进行数据存储 配置文件详解中会有关于此规则

    AOF持久化配置
        默认关闭... 在Redis的配置文件中存在三种同步方式,它们分别是:
        appendonly yes          // 打开 AOF持久化
        appendfsync always      // 每次有数据修改发生时都会写入AOF文件。
        appendfsync everysec    // 每秒钟同步一次,该策略为AOF的缺省策略。
        appendfsync no          // 从不同步。高效但是数据不会被持久化。

    最好两个都开启 如果同时使用RDB和AOF两种持久化机制 那么在redis重启的时候 会使用AOF来重新构建数据 因为AOF中的数据更加完整。


关于 redis 数据 备份                               // reids 为非关系行数据库 一般数据库不用备份
    # vim /usr/local/redis/data/rdb_bak.sh        // 备份脚本 如有需求 可选择使用
        #!/bin/bash
        # 备份redis rdb数据 每小时备份一次 保留7天的备份
        # crontab -e --> 1 */1 * * * sh /usr/local/redis/data/rdb_bak.sh
        n_date=`date +%Y%m%d`
        cur_date=`date +%Y%m%d%k%M`
        mkdir -p /usr/local/redis/data/rdb_bak/$n_date
        cp /usr/local/redis/data/dump.rdb /usr/local/redis/data/rdb_bak/$n_date/dump_$cur_date.rdb
        find /usr/local/redis/data/rdb_bak/ -name '*.rdb' -mtime +7 -exec rm -f {} \;

    注:
        redis 连接工具Another-Redis-Desktop-Manager.1.4.2.exe
        下载地址 https://github.com/qishibo/AnotherRedisDesktopManager/releases


Redis集群

    Redis有三种集群模式,分别是:
        1. 主从 模式
            主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)
            主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
            从数据库一般都是只读的,并且接收主数据库同步过来的数据
            一个master可以拥有多个slave,但是一个slave只能对应一个master
            slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
            master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
            master挂了以后,不会在slave节点中重新选一个master

        2. Sentinel 哨兵 模式
            主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。
            sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
            当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,
            其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
            当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
            sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
            多sentinel配置的时候,sentinel之间也会自动监控
            当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
            一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
            sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂
            每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令 
            如一个实例距离最后一次有效回复 PING时间超过 down-after-milliseconds 选项所指定的值则会被sentinel标记为主观下线 
            如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
            当有足够数量的sentinel在指定的时间范围内确认master的确进入了主观下线状态 则master会被标记为客观下线 
            在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令 
            当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10秒一次改为1秒一次 
            若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
            若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除

            当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,
            由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后sentinel就会感知并将新的master节点提供给使用者

        3. Cluster 模式
            cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话
            就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容

            多个redis节点网络互联,数据共享
            所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
            不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,
            并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
            支持在线增加、删除节点
            客户端可以连接任何一个主节点进行读写


主从模式 配置

    # yum install gcc-c++ ruby rubygems
    # yum -y install centos-release-scl
    # yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
    # scl enable devtoolset-9 bash
    # echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
    # gcc -v
    # wget http://download.redis.io/releases/redis-6.0.8.tar.gz
    # tar zxvf redis-6.0.8.tar.gz -C /usr/local/
    # cd /usr/local
    # mv redis-6.0.8/ redis
    # cd /usr/local/redis
    # make
    # make install PREFIX=/usr/local/redis
    # mkdir -p /usr/local/redis/{etc/{7001,7002,7003},logs,data,run}
    # ln -sv /usr/local/redis/bin/redis-server /usr/local/bin/
    # ln -sv /usr/local/redis/bin/redis-cli /usr/local/bin/
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    # sysctl -p
    # cp redis.conf etc/7001/redis.conf
    # cd /usr/local/redis/etc/7001/
    # redis.conf                             // 主节点
        bind 192.168.10.13 127.0.0.1
        daemonize yes                        // 可以设置redis 后台启动
        requirepass 123456                   // redis 密码
        port 7001                            // 此为测试环境都在一台机器上配置  在生产环境需要每个一台 端口都使用6379就可以
        protected-mode yes                   // 安全模式 只监听bind指定的ip   no为关闭状态 如果bing没绑定ip为监听所有ip
        dir /usr/local/redis/data                        // 指定 数据库 目录
        pidfile /usr/local/redis/run/redis_7001.pid      // 指定 pid 文件位置
        logfile '/usr/local/redis/logs/redis_7001.log'   // 指定 日志目录
        appendfilename "appendonly_7001.aof"             // 保存AOF数据 的名字
        dbfilename dump_7001.rdb                         // 保存RDB数据库 的名字
        appendonly yes                                   // 打开 aof日志  AOF数据库存储  存储路径在上面配置的 dir目录下
        appendfsync everysec                             // 1秒存储一次  会丢失1秒的数据  appendonly.aof
    # cp redis.conf ../7002/
    # cp redis.conf ../7003/
    # vim /usr/local/redis/etc/7002/redis.conf           // 从节点1
        bind 192.168.10.13 127.0.0.1
        daemonize yes
        requirepass 123456
        port 7002
        protected-mode yes
        dir /usr/local/redis/data
        pidfile /usr/local/redis/run/redis_7002.pid
        logfile '/usr/local/redis/logs/redis_7002.log'
        appendfilename "appendonly_7002.aof"
        dbfilename dump_7002.rdb
        appendonly yes
        appendfsync everysec
        slaveof 127.0.0.1 7001      // 此节点为从节点  后跟主几点ip 端口  老版本为 replicaof 127.0.0.1 7001
        masterauth 123456           // 从节点 连接master密码,master可省略

    # vim /usr/local/redis/etc/7003/reids.conf    // 从节点2  还有其他从节点 依次加即可
        bind 192.168.10.13 127.0.0.1
        daemonize yes
        requirepass 123456
        port 7003
        protected-mode yes
        dir /usr/local/redis/data
        pidfile /usr/local/redis/run/redis_7003.pid
        logfile '/usr/local/redis/logs/redis_7003.log'
        appendfilename "appendonly_7002.aof"
        dbfilename dump_7002.rdb
        appendonly yes
        appendfsync everysec
        replicaof 127.0.0.1 7001
        masterauth 123456
    # vim /etc/rc.d/rc.local
        redis-server /usr/local/redis/etc/7001/redis.conf 
        redis-server /usr/local/redis/etc/7002/redis.conf 
        redis-server /usr/local/redis/etc/7003/redis.conf
    # chmod +x /etc/rc.d/rc.local                         // 需要给执行权限  默认是没有的 /etc/rc.local只是软链接
    # redis-server /usr/local/redis/etc/7001/redis.conf 
    # redis-server /usr/local/redis/etc/7002/redis.conf 
    # redis-server /usr/local/redis/etc/7003/redis.conf
    # redis-cli -h 127.0.0.1 -p 7002 -a 123456 info replication   // 在命令行上  直接查看集群状态
    # redis-cli -h 172.21.34.204 -p 7001
        auth 123456
        info replication                   // 查看集群 状态

        keys *                             // 创建键值 以验证
        set key1 100
        set key2 200
        keys *
    # redis-cli -h 127.0.0.1 -p 7002       // 进入从节点 查看
        keys *
        get key1
        set key3 300                       // 会提示 从节点 无法写入数据  从节点只能读取


Sentinel 哨兵 模式 配置     // 需 基于 主从模式 接上面的配置 接着配置即可   哨兵就是监控主节点是否挂掉 挂掉后再选个主节点

    # ln -sv /usr/local/redis/bin/redis-sentinel /usr/local/bin/
    # mkdir -p /usr/local/redis/sentinel
    # mkdir -p /usr/local/redis/etc/sentinel/{27001,27002,27003}
    # vim /usr/local/redis/etc/sentinel/27001/sentinel.conf
        bind 127.0.0.1 172.21.34.204
        port 27001                    // 此为测试环境都在一台机器上配置  在生产环境需要每个一台 端口都使用26379就可以
        daemonize yes
        logfile "/usr/local/redis/logs/sentine_27001.log"
        pidfile /usr/local/redis/run/sentine_27001.pid
        dir /usr/local/redis/sentinel                   // 哨兵的工作目录          建议设置为n/2+1,n为sentinel个数
        sentinel monitor mymaster 127.0.0.1 7001 2      // ip 端口为主节点的 判断master失效至少需要2个sentinel同意
        sentinel auth-pass mymaster 123456 \\ 主节点的密码 要在上一条的下面否则启动会报错No such master with specified name.
        sentinel down-after-milliseconds mymaster 30000   // 此为30秒  判断master主观下线时间 默认30秒

    # vim /usr/local/redis/etc/sentinel/27002/sentinel.conf
        bind 127.0.0.1 172.21.34.204
        port 27002
        daemonize yes
        logfile "/usr/local/redis/logs/sentine_27002.log"
        pidfile /usr/local/redis/run/sentine_27002.pid
        dir /usr/local/redis/sentinel
        sentinel monitor mymaster 127.0.0.1 7001 2
        sentinel auth-pass mymaster 123456
        sentinel down-after-milliseconds mymaster 30000

    # vim /usr/local/redis/etc/sentinel/27003/sentinel.conf
        bind 127.0.0.1 172.21.34.204
        port 27003
        daemonize yes
        logfile "/usr/local/redis/logs/sentine_27003.log"
        pidfile /usr/local/redis/run/sentine_27003.pid
        dir /usr/local/redis/sentinel
        sentinel monitor mymaster 127.0.0.1 7001 2
        sentinel auth-pass mymaster 123456
        sentinel down-after-milliseconds mymaster 30000

    # redis-sentinel /usr/local/redis/etc/sentinel/27001/sentinel.conf    // 启动哨兵
    # redis-sentinel /usr/local/redis/etc/sentinel/27002/sentinel.conf
    # redis-sentinel /usr/local/redis/etc/sentinel/27003/sentinel.conf
    # ss -tnl                                                             // 27001被监听
    # tail -f /usr/local/redis/logs/sentine_27001.log                     // 哨兵日志文件

    # ss -tnlp                          // 测试 主节点 挂掉后
    # kill 32087                        // 杀掉 主节点 可看哨兵日志sentine_27001.log  有相关
    # redis-cli -h 127.0.0.1 -p 7003
        auth 123456
        info replication                // 可看到 主节点已经更换

    注: 
      sentinel 哨兵 日志 详解
        +reset-master :主服务器已被重置。
        +slave :一个新的从服务器已经被 Sentinel 识别并关联。
        +failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
        +failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
        +slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了命令,为实例设置新的主服务器。
        +slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
        +slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
        -dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 S重启的时候,就会出现这种情况
        +sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
        +sdown :给定的实例现在处于主观下线状态。
        -sdown :给定的实例已经不再处于主观下线状态。
        +odown :给定的实例现在处于客观下线状态。
        -odown :给定的实例已经不再处于客观下线状态。
        +new-epoch :当前的纪元(epoch)已经被更新。
        +try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
        +elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
        +failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器
        no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。会在一段时间之后再次尝试寻找合适的从服务器来进行升级
        selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
        failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
        failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器
        failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
        +switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
        +tilt :进入 tilt 模式。
        -tilt :退出 tilt 模式。


Cluster 分片集群 搭建

    # yum install gcc-c++ ruby rubygems
    # yum -y install centos-release-scl
    # yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
    # scl enable devtoolset-9 bash
    # echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
    # gcc -v
    # wget http://download.redis.io/releases/redis-6.0.8.tar.gz
    # tar zxvf redis-6.0.8.tar.gz -C /usr/local/
    # cd /usr/local
    # mv redis-6.0.8/ redis
    # cd /usr/local/redis
    # make
    # make install PREFIX=/usr/local/redis
    # mkdir -p /usr/local/redis/{etc/{7001,7002,7003,7004,7005,7006},logs,data,run}
    # ln -sv /usr/local/redis/bin/redis-server /usr/local/bin/
    # ln -sv /usr/local/redis/bin/redis-cli /usr/local/bin/
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    # sysctl -p
    # cp redis.conf etc/7001/redis.conf
    # cd /usr/local/redis/etc/7001/
    # vim redis.conf                  // 六台机器的配置文件基本一样 本次在一台上跑六个实例 
        bind 192.168.10.13 127.0.0.1
        daemonize yes
        requirepass 123456
        masterauth 123456
        port 7001
        protected-mode yes
        dir /usr/local/redis/data
        pidfile /usr/local/redis/run/redis_7001.pid
        logfile '/usr/local/redis/logs/redis_7001.log'
        appendfilename "appendonly_7001.aof"
        dbfilename dump_7001.rdb
        appendonly yes
        appendfsync everysec
        cluster-enabled yes                        // 开启 分片集群 cluste 模式
        cluster-config-file nodes_7001.conf        // cluster 配置文件
        cluster-node-timeout 15000                 // 超时 时间
    # cd /usr/local/redis/etc
    # find ./ -maxdepth 1 -type d -exec cp -r ./7001/redis.conf {} \; && rm -f redis.conf  // 复制配置文件到其他文件夹
    # for ((i=7001; i<=7006; i++)); do sed -i "s/7001/$i/g" ./$i/redis.conf; done          // 统一修改配置文件

    # redis-server /usr/local/redis/etc/7001/redis.conf
    # redis-server /usr/local/redis/etc/7002/redis.conf
    # redis-server /usr/local/redis/etc/7003/redis.conf
    # redis-server /usr/local/redis/etc/7004/redis.conf
    # redis-server /usr/local/redis/etc/7005/redis.conf
    # redis-server /usr/local/redis/etc/7006/redis.conf                    
    # redis-cli -a 123456 --cluster create 172.21.34.204:7001 172.21.34.204:7002 172.21.34.204:7003 172.21.34.204:7004 172.21.34.204:7005 172.21.34.204:7006 --cluster-replicas 1
    # ss -tnl // 集群启动命令 如报错 [ERR] Node *** is not empty... 删除 所有数据文件 redis/data/* 在重新启动

    # chmod +x /etc/rc.d/rc.local                       // 需要给执行权限  默认是没有的 /etc/rc.local只是软链接
    # redis-cli -c -h 172.21.34.204 -p 7001 -a 123456   // -c,使用集群方式登录  如不用使用 -a 总提示要验证
        auth 123456 
        cluster info      // 查看集群 信息
        cluster nodes     // 列出 节点信息  这里 与 data/nodes.conf 文件内容相同
        set key111 aaa    // 会分别 存储 不同的服务器
        set key222 bbb    // 其中 slave节点根本不提供服务  只是作为对应master节点的一个备份。
        set key333 ccc
        get key222        // 会提示记录在哪一个 服务器上 -> Redirected to slot [7472] located at 127.0.0.1:7002 "ccc"


注:
    关于 新增节点 未总结 待续
        # redis-server /usr/local/redis/etc/7007/redis.conf  // 新加节点7007  需准备配置文件即可  步骤同上 已经省略
        # redis-cli -c -h 172.21.34.204 -p 7001 -a 123456
            cluster meet 127.0.0.1 7007                      // 新加入节点
            cluster nodes                                    // 会看到 新节点都是 以 master 加入的
            cluster replicate 2f73efdb6dcaa5313c1e528ca296b9fcce519b0d   // 更改节点身份

    关于 老版本 redis 需要使用 redis-trib.rb 命令 
        # ln -sv /usr/local/redis/src/redis-trib.rb /usr/local/bin/
        # redis-trib.rb create --replicas 1 172.21.34.204:7001 172.21.34.204:7002 172.21.34.204:7003 172.21.34.204:7004 172.21.34.204:7005 172.21.34.204:7006


........................................................................................................................


配置文件详解
    bind 0.0.0.0               // 地址监听 可以用空格隔开后多个监听ip
    protected-mode yes         // 安全模式 在没有设置bind ip时候 只允许127.0.0.1:6379访问
    tcp-backlog 511            // 三次握手的时候server端收到client ack确认号之后的队列值
    timeout 0                  // 客户端(程序) 连接redis 的超时时间
    tcp-keepalive 300          // tcp会话保持时间  减少三次握手消耗的时间
    daemonize no               // 是否开启 pid 以守护进程方式进行  yes开启
    supervised systemd                             // 可以使用systemd管理redis守护进程 上面以及使用了 这改不改都可以
    pidfile /usr/local/redis/run/redis_6379.pid    // 指定 pid 文件位置 
    loglevel notice                                // 日志级别
    logfile '/usr/local/redis/logs/redis_6379.log' // 日志 存放目录
    databases 16                                   // 数据库数目16 默认从0-15
    always-show-log yes
    always-show-logo yes                           // 是否在日志中 记录redis图标
    save ""                     // 开启此选项 禁用下面三个选项 会禁用持久化功能 reids只用于缓存
    save 900 1                  // 快照  在900秒内有1个变化 就会做快照 把数据 写入到磁盘
    save 300 10
    save 60 10000
    stop-writes-onbgsave-error yes       // 快照出错时 是否禁止redis 写入操作
    rdbcompression yes                   // 持久化到RDB文件时 是否压缩 yes为压缩
    rdbchecksum yes                      // 是否开心RC64效验 默认是开启
    dbfilename dump_6379.rdb             // 快照的文件名称
    dir /usr/local/redis/data            // 快照的存储路径 redis数据的存储路径
    slaveof 192.168.10.10 6379           // 此节点为 从节点 主机为10.10端口6379
    masterauth 123456                    // 主节点的密码 为123456 
    replica-serve-stale-data yes         // 当从库与主库失去连接或复制数据时候 yes从库会继续响应客户读请求 默认yes
                                         // no除去指定的命令之外的任何请求都会返回错误 'SYNC with master in progress'
    replica-read-only yes                // 从库 设为 只读
    repl-diskless-sync no // 第一次slave连接时需要做全量数据同步 no为通过文件传输磁盘快使用 yes通过内存传输网络快磁盘慢使用
    repl-diskless-sync-delay 5           // 上面选项为no时 延迟时间 一旦有另一个新的slave连接 会一起发送文件
    repl-ping-replica-period 10          // 监测slave存活的时间 主节点 对 slave 的ping监测时间 
    repl-timeout 60                      // 复制连接的超时时间 需要大于 repl-ping-slave-period的时间 否则会报超时 
    repl-disable-tcp-nodelay no          // 在使用内存传输时 等待小报文的合并 no不延迟直接发不做报文合并
    repl-backlog-size 1mb                // 复制缓冲区内存大小  只有在slave连接后才分配内存 默认 1MB
    repl-backlog-ttl 3600                // 多次实践master没有slave连接 就清空backlog缓冲区内存
    replica-priority 100  // 当master不可用 sentinel哨兵会根据slave的优先级选举master 选最低的为master 配置0永远不会被选举
    requirepass foobared                 // 设置redis连接密码
    rename-command                       // 重命名一些 高危命令
    rename-command FLUSHALL "linux39"    // 把 FULSHALL命令 重命名为 linux39
    maxclients 10000                     // 最大客户端连接数
    maxmemory 3221225472       // redis使用多少内存 最好是分系统内存的一半默认为不限制内存使用 此为字节数 2G*1024*1024*1024
    appendonly yes             // aof持久化 默认为关闭 aof日志记录 二进制日志文件 文件会放到 上面设置的dir目录
    appendfsync everysec       // aof配置 everysec 1秒钟写入磁盘一次可能丢1秒的数据 no有操作系统保证数据同步到磁盘
                               // always表示每次写入都执行不丢数据浪费磁盘io
    auto-aof-rewrite-min-size 64mb    // 到64m aof会重写一些 添加又删除的命令 已经减少空间
    auto-aof-rewrite-percentage 100   // 当aof log 超过指定百分比时候 重写aof文件 0时候不自动重写aof日志
    no-appendfsync-on-rewrite no      // 在aof 重写期间是否对aof新记录的append暂缓使用文件同步策略 yes为暂缓30秒 no为立即同步
    aof-load-truncated yes            // 是否加载由于其他原因导致的末尾异常的aof文件 断电等
    aof-use-rdb-preamble no           // 是否开启  rdb-aof 混合持久化格式
    lua-time-limit 5000               // lua脚本的最大执行时间 单位毫秒
    cluster-enabled yes                   // 是否开启集群模式  模式是单机模式
    cluster-node-file nodes_6379.conf     // 由node节点自动生成的及集群配置文件 指定名称即可
    cluster-node-timeout 15000            // 集群中node节点连接超时时间 单位毫秒
    cluster-replica-validity-factor 10    // 超过多少秒未和主节点同步 从节点就不会被选举成主节点 单位秒
    cluster-migration-barrier 1           // 一个主节点至少有用 多少个 正常的从节点 如果从节点故障后 
                                          // 会从多余的从节点分配到当前的主机诶单成为新的从节点
    cluster-require-full-coverage no      // 如果16384个槽位不全 是否停止工作  no为继续工作 yes不工作
    slow log-slower-than 10000            // 慢日志 超过多长时间认为是慢日志 单位微妙
    slowlog-max-len 128                   // 慢日志 记录条数