zoukankan      html  css  js  c++  java
  • Codis+redis 集群测试

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

    组件说明:

    Codis 3.x 由以下组件组成:

    Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。

    Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。

    对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;

    不同 codis-proxy 之间由 codis-dashboard 保证状态同步。

    Codis Dashboard:集群管理工具,支持 codis-proxycodis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。

    redis-sentinel:可以实现对Redis的监控、通知、自动故障转移。如果Master不能工作,则会自动启动故障转移进程,将其中的一个Slave提升为Master,其他的Slave重新设置新的Master服务。Sentinel的配置由 codis-dashboard和zookeeper一起控制,不需要手工填写.

    codis-fe:集群web管理界面。

    对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;

    所有对集群的修改都必须通过 codis-dashboard 完成。

    Codis Admin:集群管理的命令行工具。

    可用于控制 codis-proxycodis-dashboard 状态以及访问外部存储。

    Codis FE:集群管理界面。

    多个集群实例共享可以共享同一个前端展示页面;

    通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。

    Storage:为集群状态提供外部存储。

    提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;

    目前仅提供了 ZookeeperEtcdFs 三种实现,但是提供了抽象的 interface 可自行扩展。

     整体架构 如下

    1、测试环境如下
    zookeeper-3.4.10 第一台部署两个 zookeeper,第二台部署一台
    Codis-3.2
    Centos6.8

    2、安装go运行环境

    yum install -y gcc glibc gcc-c++ make git mercurial

    wget https://dl.google.com/go/go1.9.2.linux-amd64.tar.gz  

    3、设置编译环境

    tar xf go1.9.2.linux-amd64.tar.gz

    mv go /usr/local/

    [root@open-falcon-server tools]# mv go /usr/local/

    [root@open-falcon-server tools]#  mkdir /usr/local/go/work

    [root@open-falcon-server tools]# vim /root/.bash_profile

    PATH=$PATH:$HOME/bin

    export PATH=$PATH:/usr/local/go/bin

    export GOROOT=/usr/local/go

    export GOPATH=/usr/local/go/work

    path=$PATH:$HOME/bin:$GOROOT/bin:$GOPATH/bin

    [root@open-falcon-server tools]# source /root/.bash_profile

    [root@open-falcon-server tools]# echo $GOPATH

    /usr/local/go/work

    [root@open-falcon-server tools]# go version

    go version go1.9.4 linux/amd64

     4、设置java环境变量

    [root@open-falcon-server tools]# tar xf jdk-8u171-linux-x64.tar.gz

    [root@open-falcon-server tools]# mv jdk1.8.0_171/  /usr/local/

    [root@open-falcon-server appadmin]# source /etc/profile

    [root@open-falcon-server appadmin]# tail -2 /etc/profile

    export JAVA_HOME=/usr/local/jdk1.8.0_171

    export PATH=$JAVA_HOME/bin:$PATH

    [root@open-falcon-server appadmin]# java -version

    java version "1.8.0_171"

    Java(TM) SE Runtime Environment (build 1.8.0_171-b11)

    Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

    5、部署zookeeper

    
    [root@open-falcon-server tools]# wget  http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz 
    [root@open-falcon-server tools]# tar xf zookeeper-3.4.10.tar.gz 
    [root@open-falcon-server tools]# mv zookeeper-3.4.10 /usr/local/
    [root@open-falcon-server tools]# ln -s /usr/local/zookeeper-3.4.10/ /usr/local/zookeeper
    
    [root@open-falcon-server data]# cd /data/
    [root@open-falcon-server data]# mkdir zk1 zk2 
    [root@open-falcon-server data]# echo 1 >zk1/myid
    [root@open-falcon-server data]# echo 2>zk2/myid
    cp /usr/local/zookeeper-3.4.10/conf/zoo_sample.cfg /data/zk1/zk1.cfg
    [root@open-falcon-server zk1]# grep "^[a-z]" zk1.cfg 
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zk1
    clientPort=2181
    server.1=10.8.18.120:2887:3887
    server.2=10.8.18.120:2888:3888
    server.3=10.8.18.121:2889:3889
    
    [root@open-falcon-server zk1]# grep "^[a-z]" ../zk2/zk2.cfg 
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zk2
    clientPort=2182
    server.1=10.8.18.120:2887:3887
    server.2=10.8.18.120:2888:3888
    server.3=10.8.18.121:2889:3889
    
    
    #第二台
    [root@Yeahka-6 tools]# cd /data/
    [root@Yeahka-6 data]# ll
    总用量 0
    [root@Yeahka-6 data]# mkdir zk3
    [root@Yeahka-6 data]# echo 3 > zk3/myid
    [root@codis-2 data]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /data/zk3/zk3.cfg
    [root@codis-2 data]# grep "^[a-z]" zk3/zk3.cfg 
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zk3
    clientPort=2183
    server.1=10.8.18.120:2887:3887
    server.2=10.8.18.120:2888:3888
    server.3=10.8.18.121:2889:3889

    6、启动两台机器的zookeeper

    [root@open-falcon-server zk1]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk1/zk1.cfg

    ZooKeeper JMX enabled by default

    Using config: /data/zk1/zk1.cfg

    Starting zookeeper ... STARTED

    [root@open-falcon-server zk1]#

    [root@open-falcon-server zk1]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk2/zk2.cfg

    [root@codis-2 data]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk3/

    
    

    3.2查看状态

    [root@codis-2 data]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk3/zk3.cfg

    
    

    ZooKeeper JMX enabled by default

    
    

    Using config: /data/zk3/zk3.cfg

    
    

    Mode: leader

    
    

    [root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk1/zk1.cfg

    
    

    ZooKeeper JMX enabled by default

    
    

    Using config: /data/zk1/zk1.cfg

    
    

    Mode: follower

    
    

    [root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk2/zk2.cfg

    
    

    ZooKeeper JMX enabled by default

    
    

    Using config: /data/zk2/zk2.cfg

    
    

    Mode: follower

     

    7、测试连接到zookeeper节点

    [root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkCli.sh -server 10.8.18.121:2183

    8、部署codis3.2

    
    [root@open-falcon-server appadmin]# mkdir -p $GOPATH/src/github.com/CodisLabs
    [root@open-falcon-server appadmin]# cd  /usr/local/go/work/src/github.com/CodisLabs
    [root@open-falcon-server CodisLabs]# git clone https://github.com/CodisLabs/codis.git -b release3.2
    [root@open-falcon-server CodisLabs]# cd $GOPATH/src/github.com/CodisLabs/codis
    [root@open-falcon-server codis]# pwd
    /usr/local/go/work/src/github.com/CodisLabs/codis
    
    [root@open-falcon-server codis]#yum install autoconf automake libtool -y
    [root@open-falcon-server codis]# make
    [root@open-falcon-server codis]# make
    make -j4 -C extern/redis-3.2.11/
    make[1]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11'
    cd src && make all
    make[2]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11/src'
    
    Hint: It's a good idea to run 'make test' ;)
    
    make[2]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11/src'
    make[1]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11'
    go build -i -o bin/codis-dashboard ./cmd/dashboard
    go build -i -tags "cgo_jemalloc" -o bin/codis-proxy ./cmd/proxy
    go build -i -o bin/codis-admin ./cmd/admin
    go build -i -o bin/codis-ha ./cmd/ha
    go build -i -o bin/codis-fe ./cmd/fe

    9、配置dashboard
    
    [root@codis-2 codis]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/config/
    [root@codis-2 config]# cp dashboard.toml dashboard.toml.ori
    [root@codis-2 config]# vim dashboard.toml
    coordinator_name = "zookeeper"
    coordinator_addr = "10.8.18.120:2181,10.8.18.120:2182,10.8.18.121:2183"
    product_auth = "hello123"
    
    启动dashboard
    ./admin/codis-dashboard-admin.sh start
    
    启动proxy
    [root@codis-2 codis]# ./admin/codis-proxy-admin.sh start
    
    Proxy
    product_name = "codis-fengkong"
    product_auth = "hello123"
    
    jodis_name = "zookeeper"
    jodis_addr = "192.168.11.225:2181,192.168.11.225:2182,192.168.11.226:2183"
    jodis_timeout = "20s"
    jodis_compatible = true
    42 部署redis
    [root@open-falcon-server codis]#  mkdir -pv /var/lib/redis_638{1..2}
    [root@codis-2 codis]#  mkdir -pv /var/lib/redis_638{3..4}
    
    [root@open-falcon-server codis]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.11/
    [root@open-falcon-server redis-3.2.11]# cp redis.conf /usr/local/go/work/src/github.com/CodisLabs/codis/
    [root@open-falcon-server redis-3.2.11]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/
    
    修改redis.conf
    pidfile /var/run/redis_6381.pid
    port 6381
    bind 10.8.18.120
    requirepass hello123
    dbfilename dump_6381.rdb
    dir /var/lib/redis_6381
    logfile "/tmp/redis_6381.log"
    maxmemory 256M
    [root@open-falcon-server codis]# cp redis.conf redis_6381.conf
    [root@open-falcon-server codis]# cp redis_6381.conf redis_6382.conf 
    [root@open-falcon-server codis]# vim redis_6382.conf 
    [root@open-falcon-server codis]# sed -i 's/6381/6382/g' redis_6382.conf
    
    
    [root@open-falcon-server codis]# ./bin/codis-server ./redis_6381.conf 
    [root@open-falcon-server codis]# ./bin/codis-server ./redis_6382.conf 

    [root@codis-2 codis]# cp redis_6381.conf redis_6383.conf 
    [root@codis-2 codis]# cp redis_6381.conf redis_6384.conf 
    [root@codis-2 codis]# sed -i 's/6381/6383/g' redis_6383.conf
    [root@codis-2 codis]#  sed -i 's/6381/6384/g' redis_6384.conf
    
    [root@codis-2 codis]# ./bin/codis-server ./redis_6383.conf 
    [root@codis-2 codis]# ./bin/codis-server ./redis_6384.conf 

    启动codis-fe,Listen监听端口不要为8080,指定8090
    [root@codis-2 codis]# nohup ./bin/codis-fe --ncpu=1 --log=fe.log --log-level=WARN --zookeeper=10.8.18.121:2183 --listen=10.8.18.121:8090 &
    通过网页访问:http://10.8.18.121:8090 可以看到codis的管理页面

     

    通过fe添加group

    通过web浏览器访问集群管理页面(fe地址:10.8.18.121:8090) 选择我们刚搭建的集群 codis-demo,在 Proxy 栏可看到我们已经启动的 Proxy, 但是 Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加 NEW GROUPNEW GROUP 行输入 1,再点击 NEW GROUP 即可 添加 Codis Server

    slots进行分组

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

    通过proxy 连接redis测试

    Web界面查看key是否添加成功

    生产环境下,为了使整体架构更加完整  我们在codis-proxy前面 加个 haproxy+keepalived  ,codis-server(即redis)  我们采用 redis-sentinel  来进行组内的主备切换

    10、haproxy+keepalived

    ###haproxy  配置  主上面配置
    global
         log 127.0.0.1     local0
         maxconn 40960 
         #chroot /usr/share/haproxy
         user haproxy
         group haproxy
         nbproc 4
         daemon
         pidfile /var/run/haproxy.pid
         #debug
         #quiet
    
    defaults
         log     global
         mode     tcp
         option     tcplog
         retries    3
         #maxconn     2000
         timeout connect 10s
         timeout client 20s
         timeout server 30s
         timeout check 5s
    #martin add 20180831
    listen channel_posp_socket_1 0.0.0.0:10000
        balance roundrobin
        server codis_proxy_server_1 192.168.11.225:19000 weight 50 check
        server codis_proxy_server_2 192.168.11.226:19000 weight 50 check

    ###keepalived 配置

    [root@ config]# cat /etc/keepalived/keepalived.conf
    global_defs {
    notification_email {
    martin@qq.com
    }
    notification_email_from keepalived@domain.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    }

    #LAN virtual IP
    vrrp_instance VI_12 {
    state MASTER
    interface bond0
    virtual_router_id 111
    mcast_src_ip 192.168.11.226
    priority 101
    advert_int 5
    authentication {
    auth_type PASS
    auth_pass 1210
    }
    virtual_ipaddress {
    192.168.11.8/24 dev bond0 scope global
    }
    }

    从上面配置

    global
    log 127.0.0.1 local0
    maxconn 40960
    #chroot /usr/share/haproxy
    user haproxy
    group haproxy
    nbproc 4
    daemon
    pidfile /var/run/haproxy.pid
    #debug
    #quiet

    defaults
    log global
    mode tcp
    option tcplog
    retries 3
    #maxconn 2000
    timeout connect 10s
    timeout client 20s
    timeout server 30s
    timeout check 5s


    #martin add 20180831
    listen channel_posp_socket_1 0.0.0.0:10000
    balance roundrobin
    server codis_proxy_server_1 192.168.11.225:19000 weight 50 check
    server codis_proxy_server_2 192.168.11.226:19000 weight 50 check

    #keepalived

    global_defs {
    notification_email {
    martin@qq.com
    }
    notification_email_from keepalived@domain.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    }

    #LAN virtual IP
    vrrp_instance VI_12 {
    state BACKUP
    interface bond0
    virtual_router_id 111
    mcast_src_ip 192.168.11.225
    priority 110
    advert_int 5
    authentication {
    auth_type PASS
    auth_pass 1210
    }
    virtual_ipaddress {
    192.168.11.8/24 dev bond0 scope global
    }
    }

    11、redis-sentinel 配置如下

    正确来说,redis-sentinel是要配置主从架构才能生效,但是在codis集群中并不一样,因为他的配置由zookeeper来维护,所以,这里codis使用的redis-sentinel只需要配置一些基本配置就可以了.
    
    bind 0.0.0.0
    protected-mode no
    port 26379
    dir "/var/lib/redis_sentinel"

    pidfile "/var/run/redis_sentinel_26379.pid"
    logfile "/tmp/redis_sentinel_26379.log"
    daemonize yes

    
    #然后就可以启动了
    /usr/local/codis/redis-sentinel sentinel.conf
    #验证一下
    redis-cli -p 26379 -c info Sentinel

    # Sentinel
    sentinel_masters:8
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    sentinel_simulate_failure_flags:0
    master0:name=codis-fengkong-8,status=ok,address=192.168.11.226:6370,slaves=1,sentinels=2
    master1:name=codis-fengkong-3,status=ok,address=192.168.11.225:6385,slaves=1,sentinels=2
    master2:name=codis-fengkong-5,status=ok,address=192.168.11.226:6387,slaves=1,sentinels=2
    master3:name=codis-fengkong-4,status=ok,address=192.168.11.226:6386,slaves=1,sentinels=2
    master4:name=codis-fengkong-2,status=ok,address=192.168.11.226:6384,slaves=1,sentinels=2
    master5:name=codis-fengkong-7,status=ok,address=192.168.11.226:6389,slaves=1,sentinels=2
    master6:name=codis-fengkong-6,status=ok,address=192.168.11.226:6388,slaves=1,sentinels=2
    master7:name=codis-fengkong-1,status=ok,address=192.168.11.225:6383,slaves=1,sentinels=2

     

     

  • 相关阅读:
    为什么Java的main方法必须是public static void?
    2. 直接插入、折半插入、希尔排序及其比较(插入类排序)
    1. 冒泡与选择排序及其比较
    0.排序介绍与性能度量
    (十)更快的排序算法(归并、快排、基数)
    (九)排序(选择、插入、希尔)
    (八)递归
    (七)栈的三种实现
    (六)栈的规则及应用
    (五)如何写测试类
  • 原文地址:https://www.cnblogs.com/hellojackyleon/p/9566492.html
Copyright © 2011-2022 走看看