• codis配置


    codis集群配置

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

    Codis 由四部分组成:

    1. Codis Proxy (codis-proxy)
    2. Codis Dashboard (codis-config)
    3. Codis Redis (codis-server)
    4. ZooKeeper/Etcd
    5. codis-proxy : 是客户端连接的Redis代理服务,codis-proxy 本身实现了Redis协议,表现得和一个原生的Redis没什么区别(就像Twemproxy),对于一个业务来说,可以部署多个codis-proxy,codis-proxy本身是没状态的。
    6. codis-config :是Codis的管理工具,支持包括,添加/删除Redis节点,添加/删除Proxy节点,发起数据迁移等操作,codis-config本身还自带了一个http server,会启动一个dashboard,用户可以直接在浏览器上观察Codis集群的状态。
    7. codis-server:是Codis项目维护的一个Redis分支,基于2.8.13开发,加入了slot的支持和原子的数据迁移指令,Codis上层的codis-proxy和codis-config只能和这个版本的Redis交互才能正常运行。
    8. ZooKeeper :用来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过ZooKeeper同步到各个存活的codis-proxy

     

    a)         在codisproxy1 上部署编译环境

    codis集群

     

       

    codisproxy1:19000
    codis_config

    192.168.20.157

    codisproxy1

    codisproxy2

    192.168.20.158

    codisproxy2

    redis1:6379

    192.168.20.159

    redis1

    redis2:6379

    192.168.20.160

    redis2

    redis3:6379

    192.168.20.163

    redis3

    redis4:6379

    192.168.20.164

    redis4

    [root@codisproxy1~]# wget https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz

    [root@codisproxy1~]# tar -zxvf go1.6.2.linux-amd64.tar.gz

    [root@codisproxy1~]# mv go /usr/local/

    [root@codisproxy1~]# vim /etc/profile

    在/etc/profile 文件中加入go的环境变量

    export GOROOT=/usr/local/go
    export GOPATH=/data/gopath
    export PATH=$GOROOT/bin:$PATH
    export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

    [root@codisproxy1~]# source /etc/profile

    [root@codisproxy1 ~]# go get -u -d github.com/CodisLabs/codis

    [root@codisproxy1 ~]# go get github.com/tools/godep


    切换到$GOPATH/src/github.com/CodisLabs/codis目录执行make命令编译代码,并执行make gotest来跑测试

    [root@codisproxy1~]#  cd /data/gopath/src/github.com/CodisLabs/codis

    [root@codisproxy1 codis]# ls

     

    [root@codisproxy1~]# make

    [root@codisproxy1~]# make gotest

    [root@codisproxy1~]# cd  bin

    执行全部指令后,会在 bin 文件夹内生成 codis-config、codis-proxy、codis-server三个可执行文件。另外, bin/assets 文件夹是 codis-config 
    的 dashboard http 服务需要的前端资源, 需要和 codis-config 放置在同一文件夹下)



    对codis.tar.gz 目录进行打包,拷贝到其他服务器上

    [root@codisproxy1 CodisLabs]# tar -zcvf codis.tar.gz codis/

    [root@codisproxy1 CodisLabs]# scp codis.tar.gz  codis_config:/data/

    [root@codisproxy1 CodisLabs]# scp codis.tar.gz  codisproxy1:/data/

    [root@codisproxy1 CodisLabs]# scp codis.tar.gz  codisproxy1:/data/

    [root@codisproxy1 CodisLabs]# scp codis.tar.gz  redis1:/data/

    [root@codisproxy1 CodisLabs]# scp codis.tar.gz  redis2:/data/

    [root@codisproxy1 CodisLabs]# scp codis.tar.gz  redis3:/data/

    [root@codisproxy1 CodisLabs]# scp codis.tar.gz  redis4:/data/

    配置启动redis服务器192.168.20.159、160、163、164

    b)          [root@redis1 data]# tar -zxvf codis.tar.gz

    [root@redis1 extern]# cd /data/codis/extern/redis-2.8.21

    [root@redis1 redis-2.8.21]# make PREFIX=/data/redis install

    [root@redis1 redis-2.8.21]# mkdir /etc/redis/

    [root@redis1 redis-2.8.21]# cp redis.conf /etc/redis/

    [root@redis1 redis-2.8.21]# cp utils/redis_init_script /etc/init.d/redis

    [root@redis1 redis-2.8.21]# chmod +x /etc/init.d/redis

    修改/etc/init.d/redis 文件

     

    [root@redis1 redis-2.8.21]# mkdir /data/redis/run

    [root@redis1 redis-2.8.21]# mkdir /data/redis/data/

    [root@redis1 redis-2.8.21]# grep ^[a-z] /etc/redis/redis.conf

    daemonize yes

    pidfile /data/redis/run/redis.pid

    maxmemory 2048mb 设置maxmeory可以在管理页面进行自动平衡。

    port 6379

    tcp-backlog 511

    bind 0.0.0.0

    timeout 0

    tcp-keepalive 0

    loglevel notice

    logfile "/data/redis/logs"

    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 /data/redis/data

    slave-serve-stale-data yes

    slave-read-only yes

    repl-diskless-sync no

    repl-diskless-sync-delay 5

    repl-disable-tcp-nodelay no

    slave-priority 100

    appendonly no

    appendfilename "appendonly.aof"

    appendfsync everysec

    no-appendfsync-on-rewrite no

    auto-aof-rewrite-percentage 100

    auto-aof-rewrite-min-size 64mb

    aof-load-truncated yes

    lua-time-limit 5000

    slowlog-log-slower-than 10000

    slowlog-max-len 128

    latency-monitor-threshold 0

    notify-keyspace-events ""

    hash-max-ziplist-entries 512

    hash-max-ziplist-value 64

    list-max-ziplist-entries 512

    list-max-ziplist-value 64

    set-max-intset-entries 512

    zset-max-ziplist-entries 128

    zset-max-ziplist-value 64

    hll-sparse-max-bytes 3000

    activerehashing yes

    client-output-buffer-limit normal 0 0 0

    client-output-buffer-limit slave 256mb 64mb 60

    client-output-buffer-limit pubsub 32mb 8mb 60

    hz 10

    aof-rewrite-incremental-fsync yes

    [root@redis1 redis-2.8.21]# /etc/init.d/redis start

    c)         condis_config服务配置,并启动dashboard

    1. [root@codis_config ~ ]# cd /data
    2. [root@codis_config data]# tar -zxvf codis.tar.gz
    3. [root@codis_config data]# cd codis
    4. 修改config.ini 配置文件

    [root@codis_config codis]# grep ^[a-z] config.ini

    coordinator=zookeeper

    zk=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181

    product=test

    dashboard_addr=192.168.20.130:18087

    password=

    backend_ping_period=5

    session_max_timeout=1800

    session_max_bufsize=131072

    session_max_pipeline=1024

    zk_session_timeout=30000

    proxy_id=proxy_1

    启动codis-config dashboard,

    [root@codis_config bin]# ./codis-config -c ../config.ini dashboard

     

    2015/12/11 16:49:10 dashboard.go:160: [INFO] dashboard listening on addr: :18087

    2015/12/11 16:49:10 dashboard.go:234: [PANIC] create zk node failed

    [error]: dashboard already exists: {"addr": "172.31.16.30:18087", "pid": 7762}

    解决办法:

    这种问题是由于使用了kill -9导致了dashboard服务异常终止,而退出服务的时候没有在zk上清除自已的信息,所以就出现了这种问题。

    所以我们在停止codis集群的任何服务的时候都不要轻易使用kill -9,可以使用kill.

    如果使用kill,那么服务在终止的时候也会自动的到zk上清除自已的信息,下次再启动的时候会立刻注册。

     

    临时性的解决办法就是:

    登录到zookeeper服务器上

    [root@zookeeper1 ~]# /data/zookeeper/bin/zkCli.sh

    [zk: localhost:2181(CONNECTED) 3] ls /

    [zk, zookeeper]

    # rmr /zk/codis/db_codis_proxy_test/dashboard

     

    访问地址为:http://192.168.20.130:18087/admin/

    初始化 slots,该命令会在zookeeper上创建slot相关信息

    [root@codis_config bin]# ./codis-config -c ../config.ini slot init

     

    添加redis server group

    每一个 Server Group 作为一个 Redis 服务器组存在, 只允许有一个 master, 可以有多个 slave, group id 仅支持大于等于1的整数

    $ bin/codis-config -c ../config.ini server -h                                                                                                                                                                                                                   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>

     添加两个 server group, 每个 group 有两个 redis 实例,group的id分别为1和2, redis实例为一主一从。

    添加一个group,group的id为1, 并添加一个redis master到该group

    添加一个redis slave到该group

    类似的,再添加group,group的id为2

    把192.168.20.159 redis1 添加到 组id为1中,并设置为master

    [root@codis_config bin]# ./codis-config -c ../config.ini server add 1 192.168.20.158:6379 master

    把192.168.20.153 redis3 添加到 组id为1中,并设置为slave

    [root@codis_config bin]# ./codis-config -c ../config.ini server add 1 192.168.20.163:6379 slave

    把192.168.20.160 redis2 添加到 组id为2中,并设置为master

    [root@codis_config bin]# ./codis-config -c ../config.ini server add 2 192.168.20.160:6379 master

    把192.168.20.164 redis4 添加到 组id为2中,并设置为slave

    [root@codis_config bin]# ./codis-config -c ../config.ini server add 2 192.168.20.164:6379 slave

    查看group为1的内容

    [root@codis_config bin]# ./codis-config -c ../config.ini server list

     

    设置 server group 服务的 slot 范围

    Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.

    设置编号为[0, 511]的 slot 由 server group 1 提供服务

    [root@codis_config bin]# ./codis-config -c ../config.ini slot range-set 0 511 1 online
    {
      "msg": "OK",
      "ret": 0
    }
    [root@codis_config  bin]# ./codis-config -c  config.ini slot range-set 512 1023 2 online

     

    启动 codis-proxy

    [root@codisproxy1 bin]# nohup ./codis-proxy -c ../config.ini --log-level=info -L ../log/proxy.log --cpu=4 --add=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
     
    [root@codisproxy2 bin]# nohup ./codis-proxy -c ../config.ini --log-level=info -L ../log/proxy.log --cpu=4 --add=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
     

    
    
     
     
    

    codisproxy1     proxy_id = proxy_1

    codisproxy2     proxy_id = proxy_2

    刚启动的 codis-proxy 默认是处于 offline状态的, 然后设置 proxy 为 online 状态, 只有处于 online 状态的 proxy 才会对外提供服务

    在 codisproxy1 192.168.20.157服务器上让proxy 启动,注意每给proxy 的 proxy_id不同

    [root@codisproxy1 bin]# ./codis-config -c ../config.ini proxy on proxy_1

    [root@codisproxy1 bin]# ./codis-config -c ../config.ini proxy on proxy_2

    查看使用的codis_proxy代理列表

    [root@codis_config bin]# ./codis-config -c ../config.ini proxy list

     

    数据迁移


    安全和透明的数据迁移是 Codis 提供的一个重要的功能, 也是 Codis 区别于 Twemproxy 等静态的分布式 Redis 解决方案的地方。

    数据迁移的最小单位是 key, 我们在 codis redis 中添加了一些指令, 实现基于key的迁移, 如 SLOTSMGRT等 (命令列表), 每次会将特定 slot 一个随机的 key 发送给另外一个 codis redis 实例, 这个命令会确认对方已经接收, 同时删除本地的这个 k-v 键值, 返回这个 slot 的剩余 key 的数量, 整个操作是原子的.

    在 codis-config 管理工具中, 每次迁移任务的最小单位是 slot

    如: 将slot id 为 [0-511] 的slot的数据, 迁移到 server group 2上, --delay 参数表示每迁移一个 key 后 sleep 的毫秒数, 默认是 0, 用于限速.

    $ bin/codis-config slot migrate 0 511 2 --delay=10

    迁移的过程对于上层业务来说是安全且透明的, 数据不会丢失, 上层不会中止服务.

    注意, 迁移的过程中打断是可以的, 但是如果中断了一个正在迁移某个slot的任务, 下次需要先迁移掉正处于迁移状态的 slot, 否则无法继续 (即迁移程序会检查同一时刻只能有一个 slot 处于迁移状态).

    Auto Rebalance

    Codis 支持动态的根据实例内存, 自动对slot进行迁移, 以均衡数据分布.

    $ bin/codis-config slot rebalance

    要求:

    • 所有的codis-server都必须设置了maxmemory参数
    • 所有的 slots 都应该处于 online 状态, 即没有迁移任务正在执行
    • 所有 server group 都必须有 Master

    HA

    六、codis-server的HA

    codis-ha实现codis-server的主从切换,codis-server主库挂了会提升一个从库为主库,从库挂了会设置这个从库从集群下线

    1、安装

    export GOPATH=/root/workspace
    /go get github.com/ngaut/codis-ha
    cd  /root/workspace/src/github.com/ngaut/codis-ha
    go build
    cp codis-ha /data/codis/bin/
    使用方法:
    codis-ha --codis-config=192.168.20.157:18087(dashboard地址:18087) --productName=test(集群项目名称)

    2、使用supervisord管理codis-ha进程

    yum -y install supervisord
    /etc/supervisord.conf中添加如下内容:
    [program:codis-ha]
    autorestart = True
    stopwaitsecs = 10
    startsecs = 1
    stopsignal = QUIT
    command = /data/codis/bin/codis-ha --codis-config=192.168.20.157:18087 --productName=test
    user = root
    startretries = 3
    autostart = True
    exitcodes = 0,2

    3、启动 supervisord服务

    systemctl start supervisord.service
    systemctl enable supervisord.service

    此时,ps -ef |grep codis-ha 你回发现codis-ha进程已经启动,这个时候你去停掉一个codis-server的master,看看slave会不会提升为master呢

  • 相关阅读:
    SQL基本之增删查改操作
    【转】C++静态库与动态库
    使用日志记录功能查看PHP扩展的执行过程
    写一个打印日志的函数
    写一个CGI程序并运行
    gcc及其选项详解 【转载】
    Linux下gcc编译生成动态链接库*.so文件并调用它【转载】
    Laravel框架开发规范-修订版
    Laravel框架开发规范-修订前期版
    基本语句优化10个原则
  • 原文地址:https://www.cnblogs.com/fengjian2016/p/5891890.html
Copyright © 2020-2023  润新知