• codis原理及部署_01


    一.codis介绍

    • Codis是一个分布式Redis解决方案,对于上层的应用来说,连接到Codis Proxy和连接原生的RedisServer没有明显的区别,有部分命令不支持
    • Codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的Redis服务.
    • Codis由四部分组成
      • Codis-proxy:实现redis协议,由于本身是无状态的,因此可以部署很多个节点
      • Codis-config :是codis的管理工具,包括添加/删除redis节点添加删除proxy节点,发起数据迁移等操作,自带httpserver,支持管理后台方式管理配置
      • Codis-server :是codis维护的redis分支,基于2.8.21分支,加入了slot的支持和原子的数据迁移指令; codis-proxy和codis-config只能和这个版本的redis交互才能正常运行
      • Zookeeper,用于codis集群元数据的存储,维护codis集群节点

    image

    二.Codis优缺点

    优点
    • 对客户端透明,与codis交互方式和redis本身交互一样
    • 支持在线数据迁移,迁移过程对客户端透明有简单的管理和监控界面
    • 支持高可用,无论是redis数据存储还是代理节点
    • 自动进行数据的均衡分配
    • 最大支持1024个redis实例,存储容量海量
    • 高性能
    缺点
    • 采用自有的redis分支,不能与原版的redis保持同步
    • 如果codis的proxy只有一个的情况下, redis的性能会下降20%左右
    • 某些命令不支持,比如事务命令muti
    • 国内开源产品,活跃度相对弱一些

    三.部署codis,并写代码访问codis

    3.1 zookeeper
    • 1.三集群节点
    172.16.10.142   zoo1
    172.16.10.143   zoo2
    172.16.10.144   zoo3
    # 确保每个节点hostname -i返回的是正确IP地址
    
    • 2.获取安装软件
    wget http://apache.fayea.com/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
    scp -rp zookeeper-3.4.12 172.16.10.143:/usr/local
    scp -rp zookeeper-3.4.12 172.16.10.144:/usr/local
    mv zookeeper-3.4.12 /usr/local/zookeeper-3.4.12/
    
    • 3.设置环境变量
    export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.12/
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    
    • 4.单机环境配置文件
    cd /usr/local/zookeeper-3.4.12/conf
    cp -rp zoo_sample.cfg zoo.cfg
    vi zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/usr/local/zookeeper/data
    dataLogDir=/usr/local/zookeeper/log
    clientPort=2181
    # tickTime : 服务器与客户端之间交互的基本时间单元(ms# dataDir : 保存zookeeper数据路径
    # dataLogDir : 保存zookeeper日志路径,当此配置不存在时默认路径与dataDir一致
    # clientPort : 客户端访问zookeeper时经过服务器端时的端口号
    
    • 5.集群环境配置文件
    cd /usr/local/zookeeper-3.4.12/conf
    cp -rp zoo_sample.cfg zoo.cfg
    vi zoo.cfg
    tickTime=2000
    # tickTime : 服务器与客户端之间交互的基本时间单元(msinitLimit=10
    # initLimit : 此配置表示允许follower连接并同步到leader的初始化时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败。
    syncLimit=5
    # syncLimit : Leader服务器与follower服务器之间信息同步允许的最大时间间隔,如果超过次间隔,默认follower服务器与leader服务器之间断开链接。
    dataDir=/usr/local/zookeeper/data
    # dataDir : 保存zookeeper数据路径
    dataLogDir=/usr/local/zookeeper/log/tran_logs
    # dataLogDir : 保存zookeeper日志路径,当此配置不存在时默认路径与dataDir一致,事务日志,会产生version2目录
    clientPort=2181
    # clientPort : 客户端访问zookeeper时经过服务器端时的端口号
    maxClientCnxns=60
    # maxClientCnxns : 限制连接到zookeeper服务器客户端的数量。
    server.1=zoo1:2888:3888
    server.2=zoo2:2888:3888
    server.3=zoo3:2888:3888
    # server.id=host:port:port : 表示了不同的zookeeper服务器的自身标识,作为集群的一部分,每一台服务器应该知道其他服务器的信息。用户可以从“server.id=host:port:port中读取到相关信息。在服务器的data(dataDir参数所指定的目录)下创建一个文件名为myid的文件,这个文件的内容只有一行,指定的是自身的id值。比如,服务器“1”应该在myid文件中写入“1”。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。这一样配置中,zoo1代表第一台服务器的IP地址。第一个端口号(port)是从follower连接到leader机器的端口,第二个端口是用来进行leader选举时所用的端口。所以,在集群配置过程中有三个非常重要的端口:clientPort:2181、port:2888、port:3888
    • 5.写id到文件
    ssh 172.16.10.142 "echo '1' > /usr/local/zookeeper-3.4.12/data/myid"
    ssh 172.16.10.143 "echo '2' > /usr/local/zookeeper-3.4.12/data/myid"
    ssh 172.16.10.144 "echo '3' > /usr/local/zookeeper-3.4.12/data/myid"
    
    • 6.更改日志输出
    
    /usr/local/zookeeper-3.4.12/conf/log4j.properties
    #zookeeper.root.logger=INFO, CONSOLE
    zookeeper.root.logger=INFO, ROLLINGFILE
    #log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
    log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
    #log4j.appender.ROLLINGFILE.MaxFileSize=10MB
    # 更改app应用的日志输出
    vi zkEnv.sh
    if [ "x${ZOO_LOG_DIR}" = "x" ]
    then
        ZOO_LOG_DIR="/usr/local/zookeeper/log/app_logs/"
    fi
    
    if [ "x${ZOO_LOG4J_PROP}" = "x" ]
    then
        ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
    fi
    
    3.2 go

    https://www.golangtc.com/download

    • 1.下载
    wget https://www.golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz
    tar -zxvf go1.9.2.linux-amd64.tar.gz -C /usr/local
    
    • 2.配置环境变量
    export GOROOT=/usr/local/go //后面的值指向go解压的目录
    export GOPATH=/usr/local/go/gowork //go环境境的扩展包目录,所有go环境境共用,工作目录
    PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    
    # go命令依赖一个重要的环境变量:$GOPATH 
    # GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号;,Linux系统是冒号: 
    # 当有多个GOPATH时默认将go get获取的包存放在第一个目录下 
    # $GOPATH目录约定有三个子目录
    # - src存放源代码(比如:.go .c .h .s等)
    # - pkg编译时生成的中间文件(比如:.a# - bin编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目录)
    
    • 3.查看版本
    [root@slave01 go]# go version
    go version go1.8.3 linux/amd64
    
    3.3 CodsLabs

    https://github.com/CodisLabs/codis

    • 1.下载
    go get github.com/wandoulabs/codis
    # cd .; git clone https://github.com/wandoulabs/codis /usr/local/go/gowork/src/github.com/wandoulabs/codis
    Cloning into '/usr/local/go/gowork/src/github.com/wandoulabs/codis'...
    fatal: unable to access 'https://github.com/wandoulabs/codis/': Peer reports incompatible or unsupported protocol version.
    
    yum update nss curl git
    
    mkdir -p $GOPATH/src/github.com/CodisLabs
    cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
    

    1.linux二进制 https://github.com/CodisLabs/codis/releases 2.或者直接下载zip包

    • 2.安装
    cd $GOPATH/src/github.com/CodisLabs/codis
    $ make
    
    • 3.提取有用程序
    # 进入源码目录
    mkdir /usr/local/codis
    cp -rp bin admin config /usr/local/codis/
    

    http://blog.51cto.com/brucewang/2159131

    3.4 部署codis-dashboard
    • 1.修改配置文件
    vi /usr/local/codis/config/dashboard.toml
    #coordinator_name = "filesystem"
    #coordinator_addr = "/tmp/codis"
    coordinator_name = "zookeeper"
    coordinator_addr = "172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"
    
    • 2.启动dashboard
    cd /usr/local/codis
    ./admin/codis-dashboard-admin.sh start
    ss -tpnl |grep  18080
    # 可以查看log确认状态 /usr/local/codis/log/codis-dashboard.log.
    
    • 3.dashboard地址
    admin_addr = "0.0.0.0:18080"
    
    3.5 部署codis-fe管理后台
    • 1.修改启动文件
    vi /usr/local/codis/admin/codis-fe-admin.sh
    #COORDINATOR_NAME="filesystem"
    #COORDINATOR_ADDR="/tmp/codis"
    COORDINATOR_NAME="zookeeper"
    COORDINATOR_ADDR="172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"
    
    • 2.启动fe
    cd /usr/local/codis
    ./admin/codis-fe-admin.sh start
    ss -tpnl|grep 9090
    # 可以查看log确认状态 /usr/local/codis/log/codis-fe.log.
    
    • 3.后台管理地址
    CODIS_FE_ADDR="0.0.0.0:9090"
    
    3.6 部署codis-server加入集群

    部署4个节点的server 172.16.10.142/143/144/154

    • 1.所有server机器启动codis-server
    /usr/local/codis/admin/codis-server-admin.sh start
    
    • 2.redis.conf修改了如下参数(仅用于测试)
    protected-mode no
    port 6369
    pidfile /usr/local/codis/log/redis_6369.pid
    logfile "/usr/local/codis/log/redis_6369.log"
    dbfilename dump_6369.rdb
    dir /usr/local/codis/log/
    appendfilename "appendonly.aof"
    
    • 3.fe管理后台添加2个group,每个group分配2个机器 imageimage

    • 4.点击分配槽位 imageimage

    3.7 部署codis-proxy代理服务

    部署3个节点的server 172.16.10.142/143/144

    • 1.修改配置文件proxy.toml,zookeeper地址
    vi /usr/local/codis/config/proxy.toml
    #jodis_name = ""
    #jodis_addr = ""
    jodis_name = "zookeeper"
    jodis_addr = "172.16.10.142:2181,172.16.10.143:2181,172.16.10.144:2181"
    
    • 2.修改启动文件并启动,指向dashboard IP:PORT
    vi /usr/local/codis/admin/codis-proxy-admin.sh
    #CODIS_DASHBOARD_ADDR="127.0.0.1:18080"
    CODIS_DASHBOARD_ADDR="172.16.10.154:18080"
    
    /usr/local/codis/admin/codis-proxy-admin.sh  start
    ss -tpnl |grep 19000
    
    • 3.proxy启动默认会自动注册到dashboard中,也可以在fe中手动添加 image
    3.8 部署redis-sentinel实现集群HA

    部署3个节点的server 172.16.10.142/143/144

    • 1.修改配置文件
    vi /usr/local/codis/config/sentinel.conf
    port 26379
    dir "/tmp"
    protected-mode no
    
    • 2启动sentinel
    #sentinel部署官方脚本,是根据codis-server启动脚本进行修改
    # 源文件目录:./ansible/roles/redis-sentinel/templates/redis-sentinel-admin.sh
    /usr/local/codis/admin/codis-sentinel-admin.sh start
    ss -tpnl |grep 26379
    
    • 3.fe界面添加Sentinels imageimageimage
  • 相关阅读:
    eclipse 批量 查询 替换
    Hibernate包及相关工具包下载地址
    逻辑运算符&& 用法解释
    主流数据库查找前几条数据的区别
    .propertie文件注释
    java.io.EOFException java.io.ObjectInputStream$PeekInputStream.readFully 错误
    数据库的名称尽量要以英文开头,如果全部输数字的话可能会出错的
    **和*的区别
    puTTY与SecureCRT的比较
    Windows下Redis的安装使用
  • 原文地址:https://www.cnblogs.com/jenvid/p/10184516.html
Copyright © 2020-2023  润新知