zoukankan      html  css  js  c++  java
  • redis的分布式解决方式--codis

    codis是豌豆荚开源的分布式server。眼下处于稳定阶段。

    原文地址:https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md

    Codis 是一个分布式 Redis 解决方式, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的差别 (不支持的命令列表), 上层应用能够像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 全部后边的一切事情, 对于前面的client来说是透明的, 能够简单的觉得后边连接的是一个内存无限大的 Redis 服务.

    基本框架例如以下:

    Codis 由四部分组成:

    Codis Proxy (codis-proxy)
    Codis Manager (codis-config)
    Codis Redis (codis-server)
    ZooKeeper

    codis-proxy 是client连接的 Redis 代理服务, codis-proxy 本身实现了 Redis 协议, 表现得和一个原生的 Redis 没什么差别 (就像 Twemproxy), 对于一个业务来说, 能够部署多个 codis-proxy, codis-proxy 本身是无状态的.

    codis-config 是 Codis 的管理工具, 支持包含, 加入/删除 Redis 节点, 加入/删除 Proxy 节点, 发起数据迁移等操作. codis-config 本身还自带了一个 http server, 会启动一个 dashboard, 用户能够直接在浏览器上观察 Codis 集群的执行状态.

    codis-server 是 Codis 项目维护的一个 Redis 分支, 基于 2.8.13 开发, 增加了 slot 的支持和原子的数据迁移指令. Codis 上层的 codis-proxy 和 codis-config 仅仅能和这个版本号的 Redis 交互才干正常执行.

    ZooKeeper(下面简称ZK)是一个分布式协调服务框架。能够做到各节点之间的数据强一致性。简单的理解就是在一个节点改动某个变量的值后。在其它节点能够最新的变化。这样的变化是事务性的。

    通过在ZK节点上注冊监听器,就能够获得数据的变化。

    Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.

    注:1.codis新版本号支持redis到2.8.21

    2.codis-group实现redis的水平扩展

    以下我们来部署环境:

    10.80.80.124       zookeeper_1 codis-configcodis-server-master,slave codis_proxy_1

    10.80.80.126       zookeeper_2 codis-server-master,slavecodis _proxy_2

    10.80.80.123       zookeeper_3 codis-serve-master,slavecodis _proxy_3

    说明:

    1.为了确保zookeeper的稳定性与可靠性。我们在124、126、123上搭建zookeeper集群来对外提供服务;

    2.codis-cofig作为分布式redis的管理工具。在整个分布式server中仅仅须要一个就能够完毕管理任务。

    3.codis-server和codis-proxy在3台服务器提供redis和代理服务。


    一.部署zookeeper集群

    1.配置hosts(在3台server上)

    10.80.80.124 codis1
    10.80.80.126 codis2
    10.80.80.123 codis3

    2.配置java环境(在3台server上)

    vim /etc/profile
    ##JAVA###
    export JAVA_HOME=/usr/local/jdk1.7.0_71
    export JRE_HOME=/usr/local/jdk1.7.0_71/jre
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    
    source /etc/profile
    3.安装zookeeper(在3台server上)

    cd /usr/local/src
    wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
    tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local
    4.配置环境变量(在3台server上)

    vim /etc/profile
    #zookeeper
    ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    
    source /etc/profile
    5.改动zookeeper配置文件(在3台server上)

    #创建zookeeper的数据文件夹和日志文件夹
    mkdir -p /data/zookeeper/zk1/{data,log}
    cd /usr/local/zookeeper-3.4.6/conf
    cp zoo_sample.cfg zoo.cfg
    vim /etc/zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper/zk1/data
    dataLogDir=/data/zookeeper/zk1/log
    clientPort=2181
    server.1=codis1:2888:3888
    server.2=codis2:2888:3888
    server.3=codis3:2888:3888
    6.在dataDir下创建myid文件。相应节点id(在3台服务器上)

    #在124上 
    cd /data/zookeeper/zk1/data
    echo 1 > myid
    #在126上 
    cd /data/zookeeper/zk1/data
    echo 2 > myid
    #在123上 
    cd /data/zookeeper/zk1/data
    echo 3 > myid
    7.启动zookeeper服务(在3台server上)

    /usr/local/zookeeper-3.4.6/bin/zkServer.sh start
    注:在你所在的当前文件夹下会生成一个zookeeper.out的日志文件,里面记录了启动过程中的具体信息;因为集群没有所有信息,会报“myid 2或myid 3 未启动”的信息,当集群所有启动后就会正常,我们能够忽略。

    8.查看zookeeper全部节点的状态(在3台server上)

    #124
    /usr/local/zookeeper-3.4.6/bin/zkServer.sh status
    JMX enabled by default
    Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Mode: leader
    #126
    /usr/local/zookeeper-3.4.6/bin/zkServer.sh status
    JMX enabled by default
    Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Mode: follower
    #123
    /usr/local/zookeeper-3.4.6/bin/zkServer.sh status
    JMX enabled by default
    Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Mode: follower


    二.部署codis集群

    1.安装go语言(在3台server上)

    tar -zxvf go1.4.2.linux-amd64.tar.gz -C /usr/local/
    2.加入go环境变量(在3台server上)

    vim /etc/profile
    #go
    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=/usr/local/codis
    
    source /etc/profile
    3.安装codis(在3台server上)

    go get github.com/wandoulabs/codis
    cd $GOPATH/src/github.com/wandoulabs/codis
    #运行编译測试脚本,编译go和reids。

    ./bootstrap.sh make gotest #将编译好后,把bin文件夹和一些脚本复制过去/usr/local/codis文件夹下 mkdir -p /usr/local/codis/{conf,redis_conf,scripts} cp -rf bin /usr/local/codis/ cp sample/config.ini /usr/local/codis/conf/ cp -rf sample/redis_conf /usr/local/codis cp -rf sample/* /usr/local/codis/scripts

    4.配置codis-proxy(在3台server上。在此以124为例)

    #124
    cd /usr/local/codis/conf
    vim config.ini
    zk=codis1:2181,codis2:2181,codis3:2181
    product=codis
    #此处配置图形化界面的dashboard。注意codis集群仅仅要一个就可以,因此所有指向10.80.80.124:18087
    dashboard_addr=192.168.3.124:18087
    coordinator=zookeeper
    backend_ping_period=5
    session_max_timeout=1800
    session_max_bufsize=131072
    session_max_pipeline=128
    proxy_id=codis_proxy_1
    #126
    cd /usr/local/codis/conf
    vim config.ini
    zk=codis1:2181,codis2:2181,codis3:2181
    product=codis
    #此处配置图形化界面的dashboard,注意codis集群仅仅要一个就可以,因此所有指向10.80.80.124:18087
    dashboard_addr=192.168.3.124:18087
    coordinator=zookeeper
    backend_ping_period=5
    session_max_timeout=1800
    session_max_bufsize=131072
    session_max_pipeline=128
    proxy_id=codis_proxy_2
    #123
    cd /usr/local/codis/conf
    vim config.ini
    zk=codis1:2181,codis2:2181,codis3:2181
    product=codis
    #此处配置图形化界面的dashboard,注意codis集群仅仅要一个就可以,因此所有指向10.80.80.124:18087
    dashboard_addr=192.168.3.124:18087
    coordinator=zookeeper
    backend_ping_period=5
    session_max_timeout=1800
    session_max_bufsize=131072
    session_max_pipeline=128
    proxy_id=codis_proxy_3
    5.改动codis-server的配置文件(在3台服务器上)

    #创建codis-server的数据文件夹和日志文件夹
    mkdir -p /data/codis/codis-server/{data,logs}
    cd /usr/local/codis/redis_conf
    #主库
    vim 6380.conf
    daemonize yes
    pidfile /var/run/redis_6380.pid
    port 6379
    logfile "/data/codis_server/logs/codis_6380.log"
    save 900 1
    save 300 10
    save 60 10000
    dbfilename 6380.rdb
    dir /data/codis_server/data
    #从库
    cp 6380.conf 6381.conf
    sed -i 's/6380/6381/g' 6381.conf
    6.加入内核參数

    echo "vm.overcommit_memory = 1" >>  /etc/sysctl.conf
    sysctl -p
    7.依照启动流程启动

    cat /usr/loca/codis/scripts/usage.md
    0. start zookeeper 
    1. change config items in config.ini 
    2. ./start_dashboard.sh 
    3. ./start_redis.sh 
    4. ./add_group.sh 
    5. ./initslot.sh 
    6. ./start_proxy.sh 
    7. ./set_proxy_online.sh 
    8. open browser to http://localhost:18087/admin
    尽管scripts文件夹以下有对应启动脚本,也能够用startall.sh所有启动。但刚開始建议手动启动,以熟悉codis启动过程。

    因为之前zookeeper已经启动,以下我们来启动其它项目。

    注:1.在启动过程中须要指定相关日志文件夹或配置文件文件夹,为便于统一管理。我们都放在/data/codis下;

    2.dashboard在codis集群中仅仅须要在一台server上启动就可以,此处在124上启动;凡是用codis_config的命令都是在124上操作,其它启动项须要在3台server上操作。

    相关命令例如以下:

    /usr/local/codis/bin/codis-config -h
    usage: codis-config  [-c <config_file>] [-L <log_file>] [--log-level=<loglevel>]
    		<command> [<args>...]
    options:
       -c	set config file
       -L	set output log file, default is stdout
       --log-level=<loglevel>	set log level: info, warn, error, debug [default: info]
    
    commands:
    	server
    	slot
    	dashboard
    	action
    	proxy


    (1)启动dashboard(在124上启动)

    #dashboard的日志文件夹和訪问文件夹
    mkdir -p /data/codis/codis_dashboard/logs
    codis_home=/usr/local/codis
    log_path=/data/codis/codis_dashboard/logs
    nohup $codis_home/bin/codis-config -c $codis_home/conf/config.ini -L $log_path/dashboard.log dashboard --addr=:18087 --http-log=$log_path/requests.log &>/dev/null &

    通过10.80.80.124:18087就可以訪问图形管理界面


    (2)启动codis-server(在3台服务器上)

    /usr/local/codis/bin/codis-server /data/codis_server/conf/6380.conf
    /usr/local/codis/bin/codis-server /data/codis_server/conf/6381.conf
    (3)加入 Redis Server Group(124上)

    注意:每个 Server Group 作为一个 Redis server组存在, 仅仅同意有一个 master, 能够有多个 slave, group id 仅支持大于等于1的整数

    眼下我们在3台server上分了3组,因此我们须要加入3组。每组由一主一从构成

    #相关命令	
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server
    usage:
    	codis-config server list
    	codis-config server add <group_id> <redis_addr> <role>
    	codis-config server remove <group_id> <redis_addr>
    	codis-config server promote <group_id> <redis_addr>
    	codis-config server add-group <group_id>
    	codis-config server remove-group <group_id>
    #group 1
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 1 10.80.80.124:6380 master
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 1 10.80.80.124:6381 slave
    #group 2
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 2 10.80.80.126:6380 master
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 2 10.80.80.126:6381 slave
    #group 3
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 3 10.80.80.123:6380 master
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 3 10.80.80.123:6381 slave

    注意:1.点击“Promote to Master”就会将slave的redis提升为master,而原来的master会自己主动下线。

        2./usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 能够加入机器到对应组中。也能够更新redis的主/从角色。

        3.若为新机器,此处的keys应该为空

    (4) 设置 server group 服务的 slot 范围(124上)

    #相关命令
    /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini slot
    usage:
    	codis-config slot init [-f]
    	codis-config slot info <slot_id>
    	codis-config slot set <slot_id> <group_id> <status>
    	codis-config slot range-set <slot_from> <slot_to> <group_id> <status>
    	codis-config slot migrate <slot_from> <slot_to> <group_id> [--delay=<delay_time_in_ms>]
    	codis-config slot rebalance [--delay=<delay_time_in_ms>]
    	
    #Codis 採用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过下面公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每个 slot 都会有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供。

    我们在此将1024个slot分为三段,分配例如以下: /usr/local/codis/bin/codis-config -c conf/config.ini slot range-set 0 340 1 online /usr/local/codis/bin/codis-config -c conf/config.ini slot range-set 341 681 2 online /usr/local/codis/bin/codis-config -c conf/config.ini slot range-set 682 1023 3 online

    (5)启动codis-proxy(在3台服务器上)

    #codis_proxy的日志文件夹
    mkdir -p /data/codis/codis_proxy/logs
    codis_home=/usr/local/codis
    log_path=/data/codis/codis_proxy/logs
    nohup $codis_home/bin/codis-proxy --log-level warn -c $codis_home/conf/config.ini -L $log_path/codis_proxy_1.log  --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 > $log_path/nohup.out 2>&1 &

    黑线处:codis读取server的主机名。

    注意:若client相关訪问proxy,须要在client加入hosts

    (6)上线codis-proxy

    codis_home=/usr/local/codis
    log_path=/data/codis/codis_proxy/logs
    nohup $codis_home/bin/codis-proxy --log-level warn -c $codis_home/conf/config.ini -L $log_path/codis_proxy_1.log  --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 > $log_path/nohup.out 2>&1 &

    注:启动codis_proxy后。proxy此时处于offline状态。无法对外提供服务,必须将其上线后才干对外提供服务。


    ok,至此codis已经能够对外提供服务了。


    三.HA

    codis的ha分为前端proxy的ha以及后端codis-server的ha,在此简单说下proxy的ha。

    对于上层proxy来说,尤其是javaclient来,codis提供jodis(改动过的jedis)来实现proxy的ha。

    它会通过监控zk上的注冊信息来实时获得当前可用的proxy列表,既能够保证高可用性。也能够通过轮流请求全部的proxy实现负载均衡;支持proxy的自己主动上线和下线。



  • 相关阅读:
    Codeforces 177G2 Fibonacci Strings KMP 矩阵
    Codeforces Gym100187C Very Spacious Office 贪心 堆
    Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
    AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5199019.html
Copyright © 2011-2022 走看看