• cache + redis(一)


    一、缓存的概念

    1、Buffer,Cache的区别:

    buffer: 一般用于写操作,写缓冲。
    cache:  一般用于读操作,读缓存。
    它们都是解决速度不一致的问题,都设计到IO操作。

    2、Cache的重点关注点:

    1.存放位置(多级cache):
        客户端(浏览器缓存)
        内存(本地或者远程服务器)
        硬盘(本地或者远程服务器)       
    2.过期时间: TTL 
    3.强制失效
    4.Cache的命中率(重点): 一个完全没有命中率的cache没有意义。

    二、浏览器缓存

    1、缓存协商的定义

    浏览器和web服务器进行缓存的对话。

    2、浏览器缓存的几种方式

    Last-Modified: 文件最后修改时间
    Etag: MD5
    Expires: 过期时间
    
        Nginx设置方法:
            location ~ .*.(js|css){
                expires 1h; #1小时过期
            }
            (如果在过期前发现js错了,需要改名或者加时间123.js变成123.js?201610)
    Cache-Control: 解决客户端时间不对的问题

    3、浏览器几种刷新方式的区别:

    在地址栏敲击Enter键: 只要没有过期的直接使用缓存,所有缓存机制都生效。
    F5或者刷新按钮: Expires不受影响,其他缓存机制都失效。
    Ctrl+F5:   强制刷新,所有缓存机制都失效,相当于第一次访问网页。

    三、CDN相关

    1、CDN主要解决以下问题:

    不同运营商的互联问题,BGP又贵。
    用户和服务器之间网络传输距离长的问题。
    现有服务器带宽有限。
    提高用户的响应速度和成功率。
    百度CDN:https://cloud.baidu.com/product/cdn.html
    阿里CDN:https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n
    腾讯CDN:https://www.qcloud.com/product/cdn

    2、CDN的核心技术

    1.内容调度 - 智能dns(根据你的localDNS的Ip来判断)
    2.监测系统 - 监测各个节点的链路状态和健康状态
    3.内容分发 - 预缓存
    4.过期刷新 - 缓存刷新
    5.数据存储 - 文件的存储
    6.用户配置中心 - saltstack ansible
    7.计费系统
    8.数据可视化 - 日志分析,日志下载
    9.防攻击 - WAF

    四、Nginx反向代理缓存配置

    1、配置nginx反向代理缓存

    # vim /usr/local/nginx/conf/proxy.conf
    #cdn
      proxy_temp_path  /data/cdn_cache/proxy_temp_dir;     #缓存的临时目录
      proxy_cache_path /data/cdn_cache/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1d  max_size=1g;   
      #缓存的目录,缓存级别1:2,缓存名称cache_one,内存缓存大小50M,自动清除1天没访问的文件,硬盘缓存大小1G
      proxy_connect_timeout 5;
      proxy_send_timeout 60;
      proxy_read_timeout 5;
      proxy_buffer_size 16k;
      proxy_buffers 4 64k;
      proxy_busy_buffers_size 128k;
      proxy_temp_file_write_size 128k;
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;  
    #后端服务器出现500,502等异常后,可以分配到下一台服务器程序继续处理,提高平台访问成功率 # vim
    /usr/local/nginx/conf/vhost/bbs.conf location ~ .*.(gif|jpg|png|bmp)$ {   proxy_pass http://image; #Use Proxy Cache  proxy_cache cache_one; #匹配上面的缓存配置  proxy_cache_key "$host$request_uri";  add_header Cache "$upstream_cache_status"; #增加header头  proxy_cache_valid 200 304 301 302 8h;  proxy_cache_valid 404 1m;  proxy_cache_valid any 2d;    } # mkdir -p /data/cdn_cache/proxy_cache_dir/ # mkdir -p /data/cdn_cache/proxy_temp_dir

     2、如何根据URL来删除缓存文件

    先查看缓存文件的头部信息: 
    # head /data/cdn_cache/proxy_cache_dir/c/7c/9857f1ea1acafc1697b2121f36f7f7cc
    
    KEY: bbs.wmj.com/b.gif               #这个是Key值,根据上面定义格式来生成的"$host$request_uri"
    HTTP/1.1 200 OK
    Date: Wed, 05 Jul 2017 07:59:18 GMT
    Server: Apache/2.2.15 (CentOS)
    Last-Modified: Wed, 05 Jul 2017 04:15:35 GMT
    ETag: "2009e8-26ec-5538a40711f72"
    Accept-Ranges: bytes
    Content-Length: 9964
    Connection: close
     
    缓存文件名就是根据KEY值的MD5计算而来。
    # echo -n "bbs.wmj.com/b.gif" |md5sum
    9857f1ea1acafc1697b2121f36f7f7cc  -
     
    文件路径”c/7c”分别是md5的最后一位和倒数2-3位来生成。 
    通过这个来定义“levels=1:2

     3、删除nginx缓存文件的脚本

    #!/bin/bash
    #######################################################
    #说明:
    #  1.本脚本用于清除nginx缓存文件
    #  2.查看你的nginx是根据什么作为key来hash的,我的设置是 proxy_cache_key $host$request_uri;
    #  因此nginx会根据$host$request_uri作为key进行hash,因此可以模拟nginx对一个key进行再
    #  hash找到相应的文件路径,删除(具体可随意找个缓存文件 more 一下看看)
    #  3.缓存设置 proxy_cache_path /data/cdn_cache/proxy_cache_dir/ levels=1:2 keys_zone=cache_one:6000m inactive=15d max_size=200g;
    #  根据相应的配置,请做相应修改测试
    #  4.uri格式请按照同级目录下rm_apk_list.txt中填写
    #####################################################
    
    while read -r line
    do
      md5uri=`echo -n $line | md5sum | awk '{ print $1 }'`
      filepath=`echo "$md5uri" | awk '{print "/data/cdn_cache/proxy_cache_dir/"substr($0,length($0),1)"/"substr($0,length($0)-2,2)"/"$0}'`
      rm -rf $filepath
    done
     
    /root/rm_apk.sh < rm_apk_list.txt #脚本执行命令

    五、PHP的缓存机制

    1、安装php的opcache

    参考资料:http://php.net/manual/zh/book.opcache.php
    
    安装的时候: –enable-opcache 
    php.ini
    zend_extension=opache.so
    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60
    opcache.fast_shutdown=1
    opcache.enable_cli=1

    2、PHP本地缓存

    php-yac

    六、其他缓存

    1、RAID卡的基本命令

    1、查看当前RAID卡缓存策略
    MegaCli64 -LDinfo -Lall -aAll
      Default Cache Policy: WriteThrough,ReadAheadNone,Direct,No Write Cache if Bad BBU
      Current Cache Policy: WriteThrough,ReadAheadNone,Direct,No Write Cache if Bad BBU
    
    2、缓存策略说明
    1) 写策略
    WriteBack: 写缓存策略,
    WriteThrough: 直接写入磁盘,不使用RAID卡缓存
    2) 预读策略
    ReadAheadNone: 不开启预读
    ReadAhead: 开启预读,在读时,预先把后面顺序的数据载入raid卡缓存,在顺序读,有良好的性能,在随机读,性能下降(适合文件系统,不适合数据库系统)
    ReadAdaptive: 自适应预读,在缓存和I/O空闲时选择预读,默认策略
    3) 读策略
    Direct: 读操作,不缓存到RAID卡缓存
    Cached: 读操作,缓存到RAID卡缓存
    4) 电池策略
    No Write Cache if Bad BBU: 如果BBU(电池)出问题,不使用写缓存(从WriteBack自动切换到WriteThrough,默认)
    Write Cache OK if Bad BBU: 如果BBU(电池)出问题,使用写缓存(有UPS或者双电源的情况)
    
    3、RAID卡策略更改
    1) 修改WriteBack
    MegaCli64 -LDSetProp -WB -Lall -aAll
    2) 修改WriteThrough
    MegaCli64 -LDSetProp -WT -Lall -aAll
    3) 修改No Write Cache if Bad BBU
    MegaCli64 -LDSetProp -NoCachedBadBBU -Lall -aAll
    4) 修改Write Cache OK if Bad BBU:
    MegaCli64 -LDSetProp -CachedBadBBU -Lall -aAll

    2、其它相关命令

    # dmidecode | grep"Product"                                                 #查看机器型号
    # dmidecode| grep "Manufacturer"                                            #查看厂商 
    # dmidecode | grep "Serial Number"                                          #查看序列号 
    # dmidecode | grep "CPU"                                                    #查看CPU信息 
    # dmidecode | grep "Socket Designation: CPU" |wc –l                         #查看CPU个数
    # dmidecode | grep"Date"                                                    #查看出厂日期 
    # MegaCli64 -AdpBbuCmd-GetBbuStatus -aALL |grep "Charger Status"            #查看充电状态 
    # MegaCli64 -AdpBbuCmd-GetBbuStatus –aALL                                   #显示BBU状态信息 
    # MegaCli64 -AdpBbuCmd-GetBbuCapacityInfo –aALL                             #显示BBU容量信息
    # MegaCli64 -AdpBbuCmd-GetBbuDesignInfo –aALL                               #显示BBU设计参数 
    # MegaCli64 -AdpBbuCmd-GetBbuProperties –aALL                               #显示当前BBU属性 
    # MegaCli64 -AdpBbuCmd-GetBbuStatus -aALL |grep "Relative State of Charge"  #查看充电进度百分比
    # MegaCli64 -cfgdsply -aALL|grep "Number of DISK GROUPS:"                   #查询Raid阵列数 
    # MegaCli64-cfgdsply –aALL                                                  #显示Raid卡型号,Raid设置,Disk相关信息 
    # MegaCli64 -PDList-aALL                                                    #显示所有物理信息 
    # MegaCli64 -LDInfo -LALL–aAll                                              #显示所有逻辑磁盘组信息
    # MegaCli64 -PDRbld-ShowProg -PhysDrv [1:5] -a0                             #查看物理磁盘重建进度(重要) 
    # MegaCli64 –adpCount                                                       #查看适配器个数 
    # MegaCli64 -AdpGetTime–aALL                                                #查看适配器时间 
    # MegaCli64 -AdpAllInfo–aAll                                                #显示所有适配器信息
    # MegaCli64 -cfgdsply -aALL|grep Polic                                      #查看Cache 策略设置 

    七、Redis

    1、Redis与Memcached对比

    Memcached: 不支持持久化,纯set或get性能高过redis,简单易用,支持类型单一,没有验证。
    Redis: 支持持久化,易用,支持多种数据类型,支持集群,有基础验证。
    SSDB: 兼容redis,支持存储分级

    2、Redis的安装

    1、编译安装
    # wget http://download.redis.io/releases/redis-3.0.7.tar.gz
    # tar zxvf redis-3.0.7.tar.gz
    # cd redis-3.0.7
    # make PREFIX=/usr/local/redis/ install
    # cp utils/redis_init_script /etc/init.d/redis   
    # chmod +x /etc/init.d/redis
    # mkdir /etc/redis
    # cp redis.conf /etc/redis/6379.conf
     
    2、修改启动脚本 
    # vim /etc/init.d/redis                        
      EXEC=/usr/local/redis/bin/redis-server
      CLIEXEC=/usr/local/redis/bin/redis-cli
      $CLIEXEC -h 10.1.1.11 -p $REDISPORT -a 123456 shutdown    #停止脚本要加IP和密码
    
    3、修改配置文件
    # vim /etc/redis/6379.conf
      daemonize yes                                             #开启后台启动
      pidfile /var/run/redis_6379.pid
      bind 172.16.1.211                                     
      logfile "/var/log/redis_6379.log"                         #日志目录
      dir /var/lib/redis_6379/                                  #持久化目录
      requirepass 123456                                        #设置密码 
    # mkdir /var/lib/redis_6379
    
    4、启动Redis
    /etc/init.d/redis start
    
    5、修复启动时的告警信息
    # less /var/log/redis_6379.log                              #查看告警
    # vim /etc/sysctl.conf                                  
      vm.overcommit_memory = 1                                  #内存分配策略
    # vim /etc/rc.local                        
      echo never > /sys/kernel/mm/transparent_hugepage/enabled  #禁用大页内存
      echo 1024 > /proc/sys/net/core/somaxconn                  #系统的baklog大小 
    
    vm.overcommit_memory(内存分配策略)        
    0: 内核会检查是否有可用内存使用,若有,分配给应用,否则不分配,并返回错误给应用
    1: 内核允许分配所有的物理内存,不管内存的状态
    2: 内核允许分配超过所有物理内存和交换空间总和的内存 

    3、Redis的数据类型

    参考资料:http://doc.redisfans.com
    1、Redis基础命令
    # redis-cli -h 172.16.1.211 -a 123456                   #登陆Redis
    6379> auth 123456                                       #登录密码
    6379> set name linux                                    #新建一个key值
    6379> get name                                          #获取一个Key值
    6379> keys *                                            #查看所有key值,生产不要用
    6379> EXISTS name                                       #查看一个key值是否存在
    6379> del name                                          #删除一个Key值
    6379> type name                                         #查看Key的类型
    
    2、字符串
    6379> SET page_view 20
    6379> INCR page_view                                    #将 key 的值自增1
    6379> DECR page_view                                    #将 key 的值自减1
    6379> DECRBY page_view 2                                #将 key 的值自减2
    
    3、哈希(hash)
    6379> HSET car price 20000
    6379> HSET car name BMW                                 #新建哈希表car并设置key和值
    6379> HGETALL car                                       #获取哈希表所有key和值
        1) "price"
        2) "20000"
        3) "name"
        4) "BMW"
    6379> HGET car price                                    #获取哈希表指定key的值
    6379> HDEL car name                                     #删除哈希表指定key
    6379> HKEYS car
        1) "price"
        2) "name"
    6379> HLEN car                                          #获取哈希值长度
    
    4、列表(list)
    6379> llen number                                       #查看列表长度
    6379> LPUSH number 1                                    #从列表左侧插入
    6379> RPUSH number 5                                    #从列表右侧插入
    6379> LRANGE number 0 -1                                #获取所有列表值
    6379> LPOP number                                       #从左侧删除列表值
                        
    5、集合(Set)                 
    6379> sadd a 1                                          #创建集合
    6379> SMEMBERS a                                        #获取集合
    6379> SISMEMBER a 1                                     #判断1是否在集合a中
    6379> SDIFF a b                                         #查看a和b集合的差集
    6379> SINTER a b                                        #查看a和b集合的交集
    6379> SUNION a b                                        #查看a和b集合的并集

    4、Redis的持久化

    1、Redis的持久化介绍
    RDB: 在指定的时间间隔内,生成快照
    AOF: 记录所有执行写操作命令,在服务器启动时,通过重新执行命令来还原数据,支持AOF文件的重写(rewrite) 
    ##生产环境两种同时用
    参考资料:http://doc.redisfans.com/topic/persistence.html
    
    2、开启RDB快照
    1) 修改配置文件
    # vim /etc/redis/6379.conf
      save 900 1                        #900秒内有1个KEY改变,就保存一次
      save 300 10                       #300秒内有10个KEY改变,就保存一次
      save 60 10000                     #60秒内有10000个KEY改变,就保存一次
      dbfilename dump_6379.rdb          #快照名
      dir /var/lib/redis_6379/          #快照目录
      rdbcompression yes                #开启快照压缩(消耗cpu)
    
    3、开启AOF
    1) 修改配置文件
    # vim /etc/redis/6379.conf
      appendonly yes                      #是否开启AOF,默认关闭(no)
      appendfilename appendonly.aof       #指定 AOF 文件名  
      appendfsync everysec 
      no-appendfsync-on-rewrite yes 
      auto-aof-rewrite-percentage 100
      auto-aof-rewrite-min-size 64mb
    如果同时开启rdb和aof,会采用aof方式 
    
    2) Redis刷写模式  
    appendfsync always                    #每次收到写命令立即写入磁盘,安全性高,速度慢 
    appendfsync everysec                  #每秒写入磁盘,在性能和安全做了折中(推荐)  
    appendfsync no                        #完全依赖OS的写入,性能好,安全性低,(linux默认是30秒一次,不推荐)  
    
    3) Redis的rewrite
    no-appendfsync-on-rewrite yes          #yes: 重写期间对新写操作不fsync,暂时存在内存中,等重写完再写入
    auto-aof-rewrite-percentage 100         #当前aof文件大小是上次的2倍时,自动开启重写
    auto-aof-rewrite-min-size 64mb          #当aof文件达到64m,自动开启重写

    5、Redis的主从复制

    1、Redis的复制介绍
    1) Redis 使用异步复制,从以每秒一次的频率,向主报告复制流
    2) 一个主可有多个从,一个从也可有多个从,主从复制不会阻塞主和从
    3) 关闭主的持久化,设置主从复制,开启从的持久化,主的性能会提升
    参考资料:http://doc.redisfans.com/topic/replication.html
    
    2、开启主从复制
    6379> slaveof 192.168.1.1 6379

    八、Redis的集群

    1、redis的几种集群方案

    1.客户端分片
    2.代理分片
    3.Redis-Cluster: 案例少,专用客户端,故障多
    4.Codis: 案例多,dashboard,有迁移工具,需要zookeeper或者etctd

    2、软件相关

    java软件                jdk-8u151-linux-x64.tar.gz
    zookeeper              zookeeper-3.4.10.tar.gz
    go软件                  go1.8.linux-amd64.tar.gz
    codis                  codis-3.2.11

    3、端口相关

    zookeeper               2181(客户端连接的端口)
                            2888(集群通讯端口)
                            3888(集群选举端口)
    codis-dashboard         18080(dashboard接口端口)
    codis-proxy             19000(proxy端口)
    codis-fe                9090(集群管理面板FE)

    4、安装部署Zookeeper集群

    1、安装Java
    旧版本Java: https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html # cd
    /usr/local/src/ # wget https://download.oracle.com/otn/java/jdk/8u151-b12/f6dcbf/jre-8u151-linux-x64.tar.gz --no-check-certificate # tar -zxvf jdk-8u151-linux-x64.tar.gz # mv jdk1.8.0_151 /usr/local/ # cd /usr/local/ # ln -sv jdk1.8.0_151 jdk # vim /etc/profile export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar # source /etc/profile # java -version 2、安装Zookeeper 方法1 ① 下载并解压 # wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz # tar -zxvf zookeeper-3.4.10.tar.gz # mv zookeeper-3.4.10 /usr/local/ # ln -s /usr/local/zookeeper-3.4.10/ /usr/local/zookeeper ② 创建数据目录和id # mkdir -p /data/zk1 /data/zk2 /data/zk3 # echo "1" >/data/zk1/myid #服务id,不能相同 # echo "2" >/data/zk2/myid # echo "3" >/data/zk3/myid ③ 修改配置文件 # cd /usr/local/zookeeper/conf # grep '^[a-z]' zoo.cfg tickTime=2000 #心跳间隔,单位毫秒,2000毫秒=2秒 initLimit=10 #选举时间间隔,10*2000=20秒 syncLimit=5 #集群通讯时间间隔,5*2000=10秒 dataDir=/data/zk1 #数据目录 clientPort=2181 #客户端连接端口 server.1=172.16.1.211:3181:4181 #1=服务id,ip:集群通讯端口:集群选举端口 server.2=172.16.1.211:3182:4182 server.3=172.16.1.211:3183:4183 # cp zoo.cfg zk1.cfg # cp zoo.cfg zk2.cfg # cp zoo.cfg zk3.cfg # sed -i 's/zk1/zk2/g' zk2.cfg # sed -i 's/zk1/zk3/g' zk3.cfg #数据目录 # sed -i 's/2181/2182/g' zk2.cfg #端口 # sed -i 's/2181/2183/g' zk3.cfg ④ 启动3个Zookeeper # /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk1.cfg # /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk2.cfg # /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk3.cfg ⑤ 连接上zookeeper # /usr/local/zookeeper/bin/zkCli.sh -server 172.16.1.211:2181
    ⑥ 查看集群节点状态
    # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk1.cfg
    Mode: follower #备用节点
    # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg
    Mode: leader                                          #主节点
    # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg
    Mode: follower                                        #备用节点
    方法2 ① 下载并解压 # cd
    /usr/local/src/ # wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/zookeeper-3.4.10.tar.gz # tar -zxvf zookeeper-3.4.10.tar.gz # mv zookeeper-3.4.10 /usr/local/ # cd /usr/local/ # ln -sv zookeeper-3.4.10 zookeeper ② 创建数据目录和id # mkdir /data/zookeeper/data -p ③ 修改配置文件(所有节点) # cd /usr/local/zookeeper/conf/ # cp zoo_sample.cfg zoo.cfg # vim zoo.cfg dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/log clientPort=2181 server.1=192.168.10.5:2888:3888 server.2=192.268.10.6:2888:3888 server.3=192.268.10.7:2888:3888 # vim /etc/profile export PATH=$PATH:/usr/local/zookeeper/bin # source /etc/profile ④ 创建服务ID(node01) # echo "1" > /data/zookeeper/data/myid ⑤ 创建服务ID(node02) # echo "2" > /data/zookeeper/data/myid ⑥ 创建服务ID(node03) # echo "3" > /data/zookeeper/data/myid ⑦ zookeeper的启动、停止 # /usr/local/zookeeper/bin/zkServer.sh start #启动 # /usr/local/zookeeper/bin/zkServer.sh stop #停止 # /usr/local/zookeeper/bin/zkServer.sh status #状态 ⑧ zookeeper查看状态 # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zoo.cfg ⑨ zk管理 # /usr/local/zookeeper/bin/zkCli.sh -server 192.168.10.5:2181 help ls / ls /zookeeper rmr /zk/codis/db_xiao/dasbboarsh #删除(慎用)

    5、安装Codis

    方法1
    ① 安装依赖包和GO环境
    # yum install gcc glibc gcc-c++ make git
    # wget  https://storage.googleapis.com/golang/go1.6.1.linux-amd64.tar.gz --no-check-certificate
    # tar -zxvf go1.6.1.linux-amd64.tar.gz
    # mv go /usr/local/
    
    ② 创建GOPATH:
    # mkdir /usr/local/go/work
    # vim /etc/profile>>
      export GOROOT=/usr/local/go
      export GOPATH=/usr/local/go/work
      export PATH=$JAVA_HOME/bin:$PATH:$GOROOT/bin:$GOPATH/bin
    # source /etc/profile
    # go version
    
    ③ 下载Codis源码并编译
    # go get -u -d github.com/CodisLabs/codis               #下载codis
    # go get github.com/tools/godep                         #下载godep工具
    # cd $GOPATH/src/github.com/tools/godep
    # go install ./                                         #安装godep
    # cd $GOPATH/src/github.com/CodisLabs/codis
    # make && make gotest                                   #安装codis
    
    方法2
    ① 安装go环境
    # cd /usr/local/src
    # wget https://redirector.gvt1.com/edgedl/go/go1.8.5.linux-amd64.tar.gz --no-check-certificate
    # tar -zxvf go1.8.5.linux-amd64.tar.gz
    # mv go /usr/local
    
    ② 创建GOPATH
    # mkdir /usr/local/go/work
    # vim /etc/profile
      export GOARCH=amd64
      export GOOS=linux
      export GOROOT=/usr/local/go
      export GOPATH=/usr/local/go/work
      export PATH=$PATH:$GOROOT/bin:$GOPATH/bin 
    # source /etc/profile 
    # go version
    
    ③ 下载Codis源码并编译
    # yum install gcc glibc gcc-c++ make git autoconf -y
    # mkdir $GOPATH/src/github.com/CodisLabs -p
    # cd $GOPATH/src/github.com/CodisLabs
    # git clone https://github.com/CodisLabs/codis.git -b release3.2
    # cd codis
    # make
    
    ④ 创建codis数据和日志目录
    # mkdir /usr/local/codis/{data,log} -p
    # cp -ar  /usr/local/go/work/src/github.com/CodisLabs/codis/bin /usr/local/codis/
    # cp -ar  /usr/local/go/work/src/github.com/CodisLabs/codis/config /usr/local/codis/
    # cp -ar  /usr/local/go/work/src/github.com/CodisLabs/codis/admin /usr/local/codis/
     
    ⑤ 修改环境变量
    # vim /etc/profile
      export PATH=$PATH:/usr/local/codis/bin
    # source /etc/profile

    6、codis-dashboard 部署

    1、修改配置文件
    # cd /usr/local/codis/config/ # grep -Ev '^#|^$' dashboard.toml coordinator_name = "zookeeper" #外部存储类型 coordinator_addr = "192.168.10.5:2181,192.168.10.6:2181,192.168.10.7:2181" #外部存储地址 product_name = "codis-ph" #集群名 product_auth = "" #集群密码,默认是空 admin_addr = "0.0.0.0:18080" #api端口 migration_method = "semi-async" migration_parallel_slots = 100 migration_async_maxbulks = 200 migration_async_maxbytes = "32mb" migration_async_numkeys = 500 migration_timeout = "30s" sentinel_quorum = 2 sentinel_parallel_syncs = 1 sentinel_down_after = "30s" sentinel_failover_timeout = "5m" sentinel_notification_script = "" sentinel_client_reconfig_script = "" 2、启动、停止codis-dashboard服务
    方法1
    # /usr/local/codis/admin/codis-dashboard-admin.sh start #启动 # /usr/local/codis/admin/codis-dashboard-admin.sh stop #停止 方法2
    # nohup
    /usr/local/codis/bin/codis-dashboard --ncpu=2 -c /usr/local/codis/config/dashboard.toml
    --log=/usr/local/codis/log/dashboard.log --log-level=WARN & #启动
    --ncpu                  最大CPU 个数
    -c,--config             指定配置文件
    -l,--log                设置日志文件
    --log-level             设置日志级别(INFO,WARN,DEBUG,ERROR,默认INFO,推荐WARN) #
    /usr/local/codis/bin/codis-admin --dashboard=192.168.10.5:18080 --shutdown #停止

     7、codis-porxy 部署(本机启动了dashboard时)

    1、修改配置文件
    # cd /usr/local/codis/config/ # grep -Ev '^#|^$' proxy.toml product_name = "codis-ph" #集群名 product_auth = "" #集群密码 session_auth = "" admin_addr = "0.0.0.0:11080" #api地址 proto_type = "tcp4" #redis端口类型(tcp/tcp4/tcp6/unix/unixpacket) proxy_addr = "0.0.0.0:19000" #Redis端口地址 jodis_name = "zookeeper" #注册zookeeper地址 jodis_addr = "192.168.10.5:2181,192.168.10.6:2181,192.168.10.7:2181" jodis_timeout = "20s" #注册session timeout时间,单位秒 jodis_compatible = false #注册zookeeper的路径 proxy_datacenter = "" proxy_max_clients = 1000 proxy_max_offheap_size = "1024mb" proxy_heap_placeholder = "256mb" backend_ping_period = "5s" #与codis-server的ping间隔,单位是秒,0:禁止 backend_recv_bufsize = "128kb" backend_recv_timeout = "30s" backend_send_bufsize = "128kb" backend_send_timeout = "30s" backend_max_pipeline = 1024 backend_primary_only = false backend_primary_parallel = 1 backend_replica_parallel = 1 backend_keepalive_period = "75s" backend_number_databases = 16 session_recv_bufsize = "128kb" session_recv_timeout = "30m" session_send_bufsize = "64kb" session_send_timeout = "30s"
    session_max_timeout #与client连接超时时间,单位是秒,0:禁止
    session_max_bufsize #与client连接缓冲区大小,单位:byte(字节) session_max_pipeline
    = 10000 #与client连接最大的pipeline大小 session_keepalive_period = "75s" #与client的tcp keepalive周期,仅tcp有效,0:禁止 session_break_on_failure = false metrics_report_server = "" metrics_report_period = "1s" metrics_report_influxdb_server = "" metrics_report_influxdb_period = "1s" metrics_report_influxdb_username = "" metrics_report_influxdb_password = "" metrics_report_influxdb_database = "" metrics_report_statsd_server = "" metrics_report_statsd_period = "1s" metrics_report_statsd_prefix = "" 2、启动codis-proxy服务,关闭
    方法1 #
    /usr/local/codis/admin/codis-proxy-admin.sh start #启动 # /usr/local/codis/admin/codis-proxy-admin.sh stop #停止 方法2 # nohup /usr/local/codis/bin/codis-proxy --ncpu=2 --config=/usr/local/codis/config/proxy.toml
    --log=/usr/local/codis/log/proxy.log --log-level=WARN & #启动 # /usr/local/codis/bin/codis-admin --proxy=192.168.10.5:11080 --shutdown #停止 # /usr/local/codis/bin/codis-admin --proxy=192.168.10.5:11080 --auth="xxx" --shutdown #有密码关闭

    3、添加到集群
    1) 命令添加
    # /usr/local/codis/bin/codis-admin --dashboard=192.168.10.5:18080 --create-proxy -x 192.168.10.5:11080
                                         dashboard地址                  proxy的admin_addr地址
    2) web界面添加
    通过codis-fe添加,点击Add Proxy按钮,填写IP地址和端口(192.168.10.5:11080),加入到集群中

    8、codis-porxy 部署(本机没有启动了dashboard时)

    1、修改配置文件
    # cd /usr/local/codis/config/ # grep -Ev '^#|^$' proxy.toml product_name = "codis-ph" product_auth = "" session_auth = "" admin_addr = "0.0.0.0:11080" proto_type = "tcp4" proxy_addr = "0.0.0.0:19000" jodis_name = "zookeeper" jodis_addr = "192.168.10.5:2181,192.168.10.6:2181,192.168.10.7:2181" jodis_timeout = "20s" jodis_compatible = false proxy_datacenter = "" proxy_max_clients = 1000 proxy_max_offheap_size = "1024mb" proxy_heap_placeholder = "256mb" backend_ping_period = "5s" backend_recv_bufsize = "128kb" backend_recv_timeout = "30s" backend_send_bufsize = "128kb" backend_send_timeout = "30s" backend_max_pipeline = 1024 backend_primary_only = false backend_primary_parallel = 1 backend_replica_parallel = 1 backend_keepalive_period = "75s" backend_number_databases = 16 session_recv_bufsize = "128kb" session_recv_timeout = "30m" session_send_bufsize = "64kb" session_send_timeout = "30s" session_max_pipeline = 10000 session_keepalive_period = "75s" session_break_on_failure = false metrics_report_server = "" metrics_report_period = "1s" metrics_report_influxdb_server = "" metrics_report_influxdb_period = "1s" metrics_report_influxdb_username = "" metrics_report_influxdb_password = "" metrics_report_influxdb_database = "" metrics_report_statsd_server = "" metrics_report_statsd_period = "1s" metrics_report_statsd_prefix = ""
    2、修改管理脚本 # vim
    /usr/local/codis/admin/codis-proxy-admin.sh CODIS_DASHBOARD_ADDR="172.16.1.10:18080" #指向dashborad服务器 3、启动codis-proxy服务,关闭 方法1
    /usr/local/codis/admin/codis-proxy-admin.sh start #启动 /usr/local/codis/admin/codis-proxy-admin.sh stop #关闭 方法2 # nohup /usr/local/codis/bin/codis-proxy --ncpu=2 --config=/usr/local/codis/config/proxy.toml
    --log=/usr/local/codis/log/proxy.log --log-level=WARN & #启动 # /usr/local/codis/bin/codis-admin --proxy=192.168.10.6:11080 --shutdown #关闭 # /usr/local/codis/bin/codis-admin --proxy=192.168.10.6:11080 --auth="xxx" --shutdown #有密码关闭

    4、添加到集群
    1) 命令添加
    # /usr/local/codis/bin/codis-admin --dashboard=192.168.10.5:18080 --create-proxy -x 192.168.10.6:11080
                                         dashboard地址                   proxy的admin_addr地址
    2) web界面添加
    通过codis-fe添加,点击Add Proxy按钮,填写IP地址和端口(192.168.10.6:11080),加入到集群中

    9、codis-fe 部署

    1、修改配置文件
    # cd /usr/local/codis/config
    # vim codis-fe.json
      [
        {
            "name": "codis-pinhui",
            "dashboard": "192.169.10.5:18080"
        }
      ]
    配置文件codis-fe.json可手动编辑,也可用codis-admin从外部存储中拉取
    # /usr/local/codis/bin/codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee codis.json
      [
          {
              "name": "codis-demo",
              "dashboard": "127.0.0.1:18080"
          },
          {
              "name": "codis-demo2",
              "dashboard": "127.0.0.1:28080"
          }
      ]
    2、修改启动脚本 # vim /usr/local/codis/admin/codis-fe-admin.sh nohup "$CODIS_FE_BIN" "--dashboard-list=/usr/local/codis/config/codis-fe.json" 3、启动codis-fe服务,停止 # /usr/local/codis/admin/codis-fe-admin.sh start # /usr/local/codis/admin/codis-fe-admin.sh stop 4、启动codis-fe服务 # nohup /usr/local/codis/bin/codis-fe --ncpu=2 --log=/codis/log/codis-fe.log --log-level=WARN
    --dashboard-list=/codis/config/codis-fe.json --listen=0.0.0.0:9090 &
    -d,--dashboard-list                     配置文件,能够自动刷新
    --listen                                HTTP 服务端口
    # 关闭服务: kill 进程 5、访问codis-fe http://192.168.10.5:9090/#codis-pinhui

    10、codis-server 部署

    1、配置codis-server文件
    # cd /usr/local/codis/config/
    # grep -Ev "^$|^#" redis.conf
      bind 127.0.0.1 192.168.10.5
      protected-mode yes
      port 6379
      maxmemory 1g                                      #设置最大内存,否则codis无法使用
      tcp-backlog 511
      timeout 0
      tcp-keepalive 300
      daemonize yes
      supervised no
      pidfile /usr/local/codis/log/redis_6379.pid
      loglevel notice
      logfile "/usr/local/codis/log/redis_6379.log"
      databases 16
      save 900 1
      save 300 10
      save 60 10000
      stop-writes-on-bgsave-error yes
      rdbcompression yes
      rdbchecksum yes
      dbfilename dump.rdb
      dir /usr/local/codis/data/
      appendonly no
      appendfilename "appendonly.aof"
       
    2、配置codis-server启动脚本
    # vim /usr/local/codis/admin/codis-server-admin.sh
      CODIS_SERVER_BIN=$CODIS_BIN_DIR/codis-server
      CODIS_SERVER_PID_FILE=/usr/local/codis/log/redis_6379.pid
      CODIS_SERVER_LOG_FILE=/usr/local/codis/log/redis_6379.log
      CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server.out
     
    3、启动codis-server
    # /usr/local/codis/admin/codis-server-admin.sh  start
    # /usr/local/codis/admin/codis-server-admin.sh  stop
    
    4、配置多实例codis-server
    1) 修改配置文件
    # cp redis.conf       redis_6381.conf
    # cp redis_6381.conf  redis_6382.conf 
    # cp redis_6381.conf  redis_6383.conf 
    # cp redis_6381.conf  redis_6384.conf
    # sed -i 's/6381/6382/g'  redis_6382.conf
    # sed -i 's/6381/6383/g'  redis_6383.conf
    # sed -i 's/6381/6384/g'  redis_6384.conf
    2) 启动
    # ./bin/codis-server  ./redis_6381.conf 
    # ./bin/codis-server  ./redis_6382.conf 
    # ./bin/codis-server  ./redis_6383.conf 
    # ./bin/codis-server  ./redis_6384.conf

    11、codis-server sentinel 部署

    1、修改sentinel配置文件
    # cd /usr/local/codis/config/
    # vim sentinel.conf
      bind 127.0.0.1 192.168.10.5
      port 26379
      daemonize yes
      logfile "/usr/local/codis/log/sentinel.log"
      pidfile "/usr/local/codis/log/sentinel.pid" 
     
    2、启动sentinel服务
    # /usr/local/codis/bin/redis-sentinel  /usr/local/codis/config/sentinel.conf

    12、codis-admin命令工具

    1、codis-dashboard 异常退出的修复
      codis-dashboard 启动时,数据在外部存储上,安全退出,会自动删除数据,异常退出,lock未删除,重启会失败
    1) 确认codis-dashboard进程已经退出(很重要)
    # ps -ef | grep codis-dashboard
    2) 运行codis-admin删除 LOCK
    # ./bin/codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181
    
    2、codis-proxy异常退出的修复
      codis-proxy的移除: codis-dashboard向codis-proxy发送offline指令,成功后将proxy信息从外部存储中移除
    1) 确认 codis-proxy 进程已经退出(很重要)
    # ps -ef | grep codis-proxy
    2) 运行 codis-admin 删除 proxy
    # ./bin/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy --addr=127.0.0.1:11080 --force

    13、codis集群管理界面

    ① 通过fe添加group

    访问192.168.10.5:9090,点击 NEW GROUP,输入1(组ID),再点击 NEW GROUP,添加完成

    ② 添加实例(后端的codis-server)

    在新组id是1,点击Add Server,输入codis-server地址,后再点击 Add Server,添加完成

    ③ 对slots进行分片

    如图所示,输入分组的slots的起和止的范围,然后输入组ID,点击后面按钮即可

    ④ 添加管理proxy

    在proxy管理界面,输入proxy的ip和端口,点击Add proxy即可

    ⑤ 通过codis-proxy连接codis-server进行测试

    # redis-cli -h 192.168.10.6 -p 11080 set name tom
    # redis-cli -h 192.168.10.6 -p 11080 set name jack
    # redis-cli -h 192.168.10.6 -p 11080 set age 11
    web界面验证key是否添加完成

    ⑥ 在zookeeper查看codis相关信息(group,slots,proxy)

    # /usr/local/zookeeper/bin/zkCli.sh  -server

           

  • 相关阅读:
    Windows Phone 的控件倾斜效果
    在framework4.0 3.5中反序列化 解析JSON
    PhpStorm2.0、3.0,5.0注册码到2112年
    Windows Phone(wp7)系统长按的秘密
    配置ethereal编译环境
    复习C++:引用的一些用法
    转载
    Stay hungry,Stay foolish
    C++:继承的一点注意事项
    纯虚函数
  • 原文地址:https://www.cnblogs.com/wuhg/p/11752099.html
Copyright © 2020-2023  润新知