• codis3.2 环境部署


    下载codis3.2

    https://objects.githubusercontent.com/github-production-release-asset-2e65be/25804514/2ab8d92e-053f-11e8-967e-3c733701c706?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220316%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220316T034348Z&X-Amz-Expires=300&X-Amz-Signature=72d710fc55a3c57addea38c24f86658dbc0bd16759f4be27dca8b2b54aa025f8&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=25804514&response-content-disposition=attachment%3B%20filename%3Dcodis3.2.2-go1.9.2-linux.tar.gz&response-content-type=application%2Foctet-stream

    Codis3.x有如下特点:

    最新 release 版本为 codis-3.2,codis-server 基于 redis-3.2.8
    支持 slot 同步迁移、异步迁移和并发迁移,对 key 大小无任何限制,迁移性能大幅度提升
    相比 2.0:重构了整个集群组件通信方式,codis-proxy 与 zookeeper 实现了解耦,废弃了codis-config 等
    元数据存储支持 etcd/zookeeper/filesystem 等,可自行扩展支持新的存储,集群正常运行期间,即便元存储故障也不再影响 codis 集群,大大提升 codis-proxy 稳定性
    对 codis-proxy 进行了大量性能优化,通过控制GC频率、减少对象创建、内存预分配、引入 cgo、jemalloc 等,使其吞吐还是延迟,都已达到 codis 项目中最佳
    proxy 实现 select 命令,支持多 DB
    proxy 支持读写分离、优先读同 IP/同 DC 下副本功能
    基于 redis-sentinel 实现主备自动切换
    实现动态 pipeline 缓存区(减少内存分配以及所引起的 GC 问题)
    proxy 支持通过 HTTP 请求实时获取 runtime metrics,便于监控、运维
    支持通过 influxdb 和 statsd 采集 proxy metrics
    slot auto rebalance 算法从 2.0 的基于 max memory policy 变更成基于 group 下 slot 数量
    提供了更加友好的 dashboard 和 fe 界面,新增了很多按钮、跳转链接、错误状态等,有利于快速发现、处理集群故障
    新增 SLOTSSCAN 指令,便于获取集群各个 slot 下的所有 key
    codis-proxy 与 codis-dashbaord 支持 docker 部署

    总体架构

    Codis组件介绍

    Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
    Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
    对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
    不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
    Redis sentinel:Redis官方推荐的高可用性(HA)解决方案。它可以实现对Redis的监控、通知、自动故障转移。如果Master不能工作,则会自动启动故障转移进程,将其中的一个Slave提升为Master,其他的Slave重新设置新的Master服务。
    Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
    对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
    所有对集群的修改都必须通过 codis-dashboard 完成。
    Codis Admin:集群管理的命令行工具。
    可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
    Codis FE:集群管理界面。
    多个集群实例共享可以共享同一个前端展示页面;
    通过配置文件管理后端codis-dashboard列表,配置文件可自动更新。
    Storage:为集群状态提供外部存储。
    提供namespace概念,不同集群的会按照不同product name进行组织;
    目前仅提供了zookeeper、etcd、filesystem三种实现,但是提供了抽象的 interface 可自行扩展。

    服务器资源规划

    哨兵模式

    安装zookeeper 

     忽略 ,https://www.cnblogs.com/fengjian2016/p/14618788.html

    codis-server 配置

    [root@codis-server1 ~]# cat /etc/redis/6379.conf 
    bind 0.0.0.0
    protected-mode no
    port 6379
    tcp-backlog 511
    timeout 0
    tcp-keepalive 300
    daemonize yes
    supervised no
    pidfile "/var/run/redis_6379.pid"
    loglevel notice
    logfile "/data/redis/log/redis_6379.log"
    databases 16
    #always-show-logo yes
    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/6379"
    #replica-serve-stale-data yes
    #replica-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    #replica-priority 100
    #lazyfree-lazy-eviction no
    #lazyfree-lazy-expire no
    #lazyfree-lazy-server-del no
    #replica-lazy-flush no
    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
    #aof-use-rdb-preamble 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-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    #stream-node-max-bytes 4096
    #stream-node-max-entries 100
    activerehashing yes
    #client-output-buffer-limit normal 0 0 0
    #client-output-buffer-limit replica 64mb 32mb 60
    #client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    #dynamic-hz yes
    aof-rewrite-incremental-fsync yes
    #rdb-save-incremental-fsync yes
    requirepass "123456"
    masterauth "123456"
    # Generated by CONFIG REWRITE
    #slaveof 192.168.96.163 6379

    sentinel 配置

    [root@codis-server1 ~]# cat /etc/redis/sentinel.conf 
    
    bind 0.0.0.0
    protected-mode no
    
    # 是否后台启动
    daemonize yes
    
    protected-mode no
    
    # pid文件路径
    pidfile "/var/run/redis-sentinel.pid"
    
    # 日志文件路径
    logfile "/data/redis/log/sentinel.log"
    
    # 定义工作目录
    dir "/data/redis/sentinel"
    
    sentinel monitor mymaster1 192.168.96.161 6379 1
    
    #设置密码
    sentinel auth-pass mymaster1 123456
    
    # 如果mymaster 30秒内没有响应,则认为其主观失效
    sentinel down-after-milliseconds mymaster1 30000
    
    # 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,
      但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
    sentinel parallel-syncs mymaster1 1
    
    # 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
    sentinel failover-timeout mymaster1 180000
    
    
    
    sentinel monitor mymaster2 192.168.96.163 6379 1
    sentinel auth-pass mymaster2 123456
    sentinel down-after-milliseconds mymaster2 30000
    sentinel parallel-syncs mymaster2 1
    sentinel failover-timeout mymaster2 180000
    
    
    
    sentinel monitor mymaster3 192.168.96.165 6379 1
    sentinel auth-pass mymaster3 123456
    sentinel down-after-milliseconds mymaster3 30000
    sentinel parallel-syncs mymaster3 1
    sentinel failover-timeout mymaster3 180000

    配置go环境

    下载go

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

    在/usr/local/路径下创建go目录,mkdir /usr/local/go,然后执行解压命令

    tar -zxvf /home/go/go1.9.2.linux-amd64.tar.gz -C /usr/local/go

    创建GO工作目录:mkdir $HOME/godir

    配置环境变量,修改/etc/profile,添加如下语句:
    
    #GO相关环境变量
    export GOROOT=/usr/local/go
    export GOPATH=$HOME/godir
    export PATH=$PATH:$GOPATH/bin:$GOROOT/bin

    安装Codis-dashboard

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

    1.对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
    2.所有对集群的修改都必须通过 codis-dashboard 完成。

    生成配置文件

    [root@codis-dashboard tools]# tar -zcvf codis3.2.2-go1.9.2-linux.tar.gz 
    [root@codis-dashboard tools]# cp codis3.2.2-go1.9.2-linux/codis-dashboard /usr/local/bin/
    [root@codis-dashboard tools]# cp codis3.2.2-go1.9.2-linux/codis-admin /usr/local/bin/

    [root@codis-dashboard tools]# mkdir /data/codis/config/ -p

    [root@codis-dashboard tools]# cd /data/codis/config/
    生成配置文件
    [root@codis-dashboard config]# /usr/local/bin/codis-dashboard  --default-config | tee /data/codis/config/dashboard.conf
     
    [root@codis-dashboard config]#cat  /data/codis/config/dashboard.conf

    coordinator_name = "zookeeper"
    coordinator_addr = "codis-proxy1:2181,codis-proxy2:2181,codis-proxy3:2181"
    coordinator_auth = ""

    product_name = "codis-superman"
    product_auth = "123456"

    admin_addr = "0.0.0.0:18080"

    migration_method = "semi-async"
    migration_parallel_slots = 100
    migration_async_maxbulks = 200
    migration_async_maxbytes = "32mb"
    migration_async_numkeys = 500
    migration_timeout = "30s"

    sentinel_client_timeout = "10s"
    sentinel_quorum = 2
    sentinel_parallel_syncs = 1
    sentinel_down_after = "30s"
    sentinel_failover_timeout = "5m"
    sentinel_notification_script = ""
    sentinel_client_reconfig_script = ""

    启动codis-dashboard

    [root@codis-dashboard config]# nohup codis-dashboard --ncpu=1 --config=/data/codis/config/dashboard.conf  --log=/data/codis/logs/dashboard.log --log-level=WARN &
    #--ncpu=24表示dashboard可以使用的CPU个数
    #--config表示dashboard使用的配置文件

    关闭codis-dashboard

    [root@codis-dashboard ~]# codis-admin --dashboard=192.168.96.170:18080 --shutdown

    安装Codis-proxy
    作用:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
    1.对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
    2.不同 codis-proxy 之间由 codis-dashboard 保证状态同步。

    [root@codis-proxy1 tools]# cp codis3.2.2-go1.9.2-linux/codis-proxy  /usr/local/bin/

    [root@codis-proxy1 tools]# mkdir /data/codis/config/ -p

    生成配置文件

    [root@codis-proxy1 config]# codis-proxy  --default-config | tee /data/codis/config/proxy.conf

    修改配置文件

    # Set Codis Product Name/Auth.
    product_name = "codis-superman"  #设置项目名,与codis-dashboard相同
    product_auth = "123456"  # 设置登录dashboard的密码(注意:与redis中requirepass一致)
    
    # Set auth for client session
    #   1. product_auth is used for auth validation among codis-dashboard,
    #      codis-proxy and codis-server.
    #   2. session_auth is different from product_auth, it requires clients
    #      to issue AUTH <PASSWORD> before processing any other commands.
    session_auth = "superman123456"  # codis客户端通过codis-proxy登录密码
    
    # Set bind address for admin(rpc), tcp only.
    admin_addr = "0.0.0.0:11080"
    
    # Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
    proto_type = "tcp4"
    proxy_addr = "0.0.0.0:19000"
    
    # Set jodis address & session timeout
    #   1. jodis_name is short for jodis_coordinator_name, only accept "zookeeper" & "etcd".
    #   2. jodis_addr is short for jodis_coordinator_addr
    #   3. jodis_auth is short for jodis_coordinator_auth, for zookeeper/etcd, "user:password" is accepted.
    #   4. proxy will be registered as node:
    #        if jodis_compatible = true (not suggested):
    #          /zk/codis/db_{PRODUCT_NAME}/proxy-{HASHID} (compatible with Codis2.0)
    #        or else
    #          /jodis/{PRODUCT_NAME}/proxy-{HASHID}
    jodis_name = "zookeeper"
    jodis_addr = "codis-proxy1:2181,codis-proxy2:2181,codis-proxy3:2181"
    jodis_auth = ""
    jodis_timeout = "20s"
    jodis_compatible = false
    
    # Set session recv buffer size & timeout.
    session_recv_timeout = "0s" #如果不为0可能导致应用程序出现”write: broken pipe”的问题

    启动codis-proxy

    nohup codis-proxy --ncpu=1 --config=/data/codis/config/proxy.conf --log=/data/codis/logs/proxy.log --log-level=WARN &

    程序codis-proxy启动后,仍然处于waiting状态,虽然侦听了proxy_addr端口,但是不会accept连接请求。只有将codis-proxy加入到集群并完成集群状态的同步,才能将状态改为online。最终才能accept连接请求。

    安装Codis-fe

    作用:集群管理界面。
    1.多个集群实例共享可以共享同一个前端展示页面;
    2.通过配置文件管理后端codis-dashboard列表,配置文件可自动更新。

    [root@codis-fe config]# cp /data/tools/codis3.2.2-go1.9.2-linux/codis-fe /usr/local/bin/
    [root@codis-fe config]# cp /data/tools/codis3.2.2-go1.9.2-linux/codis-admin /usr/local/bin/

    生成配置配置文件

    [root@codis-fe config]# codis-admin --dashboard-list --zookeeper=codis-proxy1:2181 | tee /data/codis/config/codis-fe.json

    查看

    [root@codis-fe config]# cat /data/codis/config/codis-fe.json 
    [
        {
            "name": "codis-superman",
            "dashboard": "codis-dashboard:18080"
        }
    ]

    拷贝codis-fe 静态文件

    [root@codis-fe config]# mv /data/tools/codis3.2.2-go1.9.2-linux/assets/ /data/codis/config/

    启动codis-fe

    nohup codis-fe --ncpu=1 --log=/data/codis/logs/fe.log --log-level=WARN --dashboard-list=/data/codis/config/codis-fe.json --listen=0.0.0.0:80 & 

    使用Codis-fe的WEB界面配置集群

    添加codis-server

    找到Group菜单栏,首先输入group ID,并点击New Group按钮,就可以新建一个group。

    然后在下面输入redis-server的地址与端口,以及要加入哪个Group,点击Add Server按钮即可。

    每个group加入的第一个server将成为主节点,其他server会作为从节点。为了防止出现单点问题,主从节点建议按照类似下图中的交错方式来分配。

    server加入完毕后,点击上面绿色的Replica(s): Enable All按钮,就可以启用所有主从配置。

    配置sentinel

    初始化slot分配
    Codis预置了1024个数据分片(即slot),通过crc32(key) % 1024的规则确定数据应该被放在哪个slot中。每个slot的数据都有且仅有一个codis-group来持有。

    集群创建时,所有slot都处于Offline状态。我们可以手动指定哪些slot分配到哪些group上,但如果是第一次安装,最简单的方法就是直接点击下面的“Rebalance All Slots”按钮,等待所有slot从Migrating变成Default状态,Codis就自动将slot分配好了。

    性能测试


    用自带的redis-benchmark来压测性能,模拟500个并发和100万个请求.注意区分好登录的地址和端口,还有密码
    压测codis-proxy的性能

    /usr/local/bin/redis-benchmark -h codis-proxy1 -p 19000 -a "superman123456" -c 500 -n 1000000 -q


    压测单节点的性能

    /usr/local/bin/redis-benchmark -h redis1 -p 6379 -a "123456" -c 500 -n 1000000 -q



    redis-benchmark参数解析:
    -h ip地址
    -p redis端口
    -a 认证密码
    -c 设定多少个并发连接
    -n 总共多少个请求
    -q 显示模式:简要模式

    测试结果示例:

    Codis-admin的使用

    1. 查看Proxy的配置、model、状态、slots信息:具体的信息可以运行该命令

    codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|slots]
     
    # codis-admin --proxy=192.168.96.168:11080 config
    查看到proxy.toml的内容,如:proxy、zk、连接数等等
    
    # codis-admin --proxy=192.168.96.168:11080 model
    查看注册到ZK的信息:Proxy的地址,进群名称、主机名等等
    
    # codis-admin --proxy=192.168.96.168:11080 stats
    查看Proxy是否在线、sentinel信息、ops、qps、内存信息等等
    
    # codis-admin --proxy=192.168.96.168:11080 slots
    查看Slots信息:slot在哪个group,后端Redis Server地址

    2. 开启关闭Proxy:这里的开启是值进入online状态。按照上面介绍的,开启codis-proxy 启动后,处于 waiting online 状态的,需要改成online状态进入zk(jodis)

    codis-admin [-v] --proxy=ADDR [--auth=AUTH] --start/--shutdown

    
    
    # codis-admin --proxy=192.168.96.168:11080 --auth=123456 --shutdown
    日志里记录关闭Proxy再把信息从zk里删除,最后再退出, 进程退出
    API call /api/proxy/shutdown/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.168:52428 []
    admin shutdown
    proxy shutdown
    jodis remove node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530
    proxy is exiting ...

    #启动codis-proxy进程

    nohup codis-proxy --ncpu=1 --config=/data/codis/config/proxy.conf --log=/data/codis/logs/proxy.log --log-level=WARN 

    # codis-admin --proxy=192.168.96.168:11080 --auth=123456 --start 

    日志中 proxy waiting online ... 会变成 proxy is working ...

    并且注册到zk的jodis目录里:

    API call /api/proxy/start/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.168:52426 []

    jodis create node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530

    codis-fe 页面再次添加codis-proxy

    3. proxy 动态设置日志等级

    codis-admin [-v] --proxy=ADDR [--auth=AUTH] --log-level=LEVEL

    [root@codis-proxy2 logs]#   codis-admin --proxy=192.168.96.168:11080 --auth=123456 --log-level=DEBUG
      

    4. 清除Proxy状态

    codis-admin [-v] --proxy=ADDR [--auth=AUTH] --reset-stats

    [root@codis-proxy2 logs]#   codis-admin --proxy=192.168.96.168:11080 --auth=123456 --reset-stats
    清除Proxy的QPS、OPS、Fail、Errors等Commands信息

    5. 强制清理Proxy内存

    [root@codis-proxy2 logs]#   codis-admin --proxy=192.168.96.168:11080 --auth=123456 --forcegc
    释放Proxy内存

    6. 查看dashboard的配置、model、状态、slots、组和proxy信息:

    codis-admin [-v] --dashboard=ADDR [config|model|stats|slots|group|proxy]

    # codis-admin --dashboard=192.168.96.170:18080 config
    查看dashboard的配置,即dashboard.toml配置的信息
    # codis-admin --dashboard=192.168.96.170:18080 model
    查看model信息
    
    
    # codis-admin --dashboard=192.168.96.170:18080 stats
    包括slot和group的对应信息,group信息(group后端的server以及server的配置),proxy信息(sentinel信息、server信息、server主信息以及proxy CPU和内存使用情况),
    slots信息(迁移间隔、迁移状态),sentine信息(配置、状态),主server信息
    
    # codis-admin --dashboard=192.168.96.170:18080 slots
    slot和group的对应信息
    
    # codis-admin --dashboard=192.168.96.170:18080 group
    组信息,组下server的配置信息


    # codis
    -admin --dashboard=192.168.96.170:18080 proxy proxy信息,包括sentinel、server信息以及proxy cpu和内存使用情况,ops、qps等commands信息、连接数(session)等

    7. 关闭和重新加载dashboard

    codis-admin [-v] --dashboard=ADDR --shutdown/--reload

    # codis-admin --dashboard=192.168.96.170:18080 --shutdown
    关闭dashboard,清除zk里的topom
    API call /api/topom/shutdown/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.96.170:42772 []
    admin exit on error
    
    # codis-admin --dashboard=192.168.96.170:18080 --reload
    修改dashboard之后,重新加载配置
    API call /api/topom/reload/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.96.170:42778 []

    8. dashboard动态设置日志等级

    codis-admin [-v] --dashboard=ADDR --log-level=LEVEL

    # codis-admin --dashboard=192.168.96.170:18080 --log-level=info
    
    API call /api/topom/loglevel/4c0ca749efb5aad2b20b8d84b1bb6905/INFO from 192.168.163.132:42780 []
    set loglevel to INFO

    9. proxy加入到dashboard,并online

    codis-admin [-v] --dashboard=ADDR --create-proxy --addr=ADDR
    # codis-admin --dashboard=192.168.96.170:18080 --create-proxy --addr=192.168.96.172:11080
    
    proxy加入到dashboard中
    [WARN] [0xc4202d17a0]  API call /api/topom/proxy/create/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.96.172:11080 from 192.168.96.170:42824 []
    [WARN] create proxy-[1d24e313bee99f26174110c009714530]
    ...

    10. proxy online初始化1024个槽,codis-admin [-v] --dashboard=ADDR --online-proxy --addr=ADDR

    # codis-admin --dashboard=192.168.96.170:18080 --online-proxy --addr=192.168.96.168:11080
    
    #proxy online
    [WARN] [0xc4200be790] API call /api/proxy/start/f6eadfec468df5b262af66e292a27699 from 192.16896.168:57976 []
    [WARN] [0xc4200be790] API call /api/proxy/sentinels/f6eadfec468df5b262af66e292a27699 from 192.168.96.168:57976 []
    [WARN] [0xc4200be790] set sentinels = []

    11. 查看proxy 列表,codis-admin [-v] --dashboard=ADDR --list-proxy

    [root@codis-dashboard codis]#  codis-admin --dashboard=192.168.96.170:18080 --list-proxy

    12. 移除proxy,codis-admin [-v] --dashboard=ADDR --remove-proxy (--addr=ADDR|--token=TOKEN|--pid=ID) [--force]

    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --remove-proxy --addr=192.168.96.168:11081 --force

    14 .获取proxy的信息:管理、代理端口。

    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --proxy-status
    [ ] proxy-1 [T] 7f7c5703f6557b97c3aa904594646d48 [A] codis-proxy1:11080 [P] codis-proxy1:19000
    [ ] proxy-3 [T] 953a653e459b825eb3aa1bb886544b29 [A] codis-proxy3:11080 [P] codis-proxy3:19000
    [ ] proxy-4 [T] 4001cfd3877b79fb2a3e688aad58b8d1 [A] codis-proxy2:11080 [P] codis-proxy2:19000

    15. 查看group列表。codis-admin [-v] --dashboard=ADDR --list-group

    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --list-group

     16. 创建group。codis-admin [-v] --dashboard=ADDR --create-group --gid=ID

    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --create-group --gid=12

    17. 移除group。codis-admin [-v] --dashboard=ADDR --remove-group --gid=ID

    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --remove-group --gid=12

     18. group里添加server。codis-admin [-v] --dashboard=ADDR --group-add --gid=ID --addr=ADDR [--datacenter=DATACENTER]

    group1里添加一个redis-server
    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --group-add --gid=11 --add=192.168.69.96.164:6379
    
    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --group-add --gid=11 --add=192.168.69.96.165:6379
    
    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --group-add --gid=11 --add=192.168.69.96.166:6379

    19.  group里删除server。codis-admin [-v] --dashboard=ADDR --group-del --gid=ID --addr=ADDR [--datacenter=DATACENTER]

    [root@codis-dashboard codis]# codis-admin --dashboard=192.168.96.170:18080 --group-del --gid=11 --add=192.168.69.96.164:6379

    20.每个group是一个M-S结构的集群,设置每个group的复制关系:codis-admin [-v] --dashboard=ADDR --replica-groups --gid=ID --addr=ADDR (--enable|--disable)

    # codis-admin --dashboard=192.168.96.170:18080 --replica-groups --gid=13 --addr=192.168.96.164:6379 --enable
    # codis-admin --dashboard=192.168.96.170:18080 --replica-groups --gid=13 --addr=192.168.96.164:6379 --enable

    21. 把组里面的第2个server做为从,形成主从关系:codis-admin [-v] --dashboard=ADDR --sync-action --create --addr=ADDR

    # codis-admin --dashboard=192.168.96.170:18080 --sync-action --create --addr=192.168.96.164:6379

    22. 查看group状态:codis-admin [-v] --dashboard=ADDR --group-status

    #查看主从复制关系

    [root@codis-dashboard logs]# codis-admin --dashboard=192.168.96.170:18080 --group-status
    [ ] group-11 [0] 192.168.96.163:6379      ==> NO:ONE
    [ ] group-11 [1] 192.168.96.162:6379      ==> 192.168.96.163:6379:up
    [ ] group-11 [2] 192.168.96.161:6379      ==> 192.168.96.163:6379:up

    23. 提升组里的一个从作为主:codis-admin [-v] --dashboard=ADDR --promote-server --gid=ID --addr=ADDR

    # codis-admin --dashboard=192.168.96.170:18080 --promote-server --gid=13 --addr=192.168.96.133:6379
    让组13的服务器作为一个从库
    
    # codis-admin --dashboard=192.168.96.170:18080 --group-status
    [ ] group-11 [0] 192.168.96.131:6379      ==> NO:ONE
    [ ] group-11 [1] 192.168.96.131:6379      ==> 192.168.96.131:6379:up
    [ ] group-12 [0] 192.168.96.132:6379      ==> NO:ONE
    [ ] group-12 [1] 192.168.96.132:6379      ==> 192.168.96.132:6379:up
    [ ] group-13 [0] 192.168.96.133:6379      ==> NO:ONE
    [X] group-13 [1] 192.168.96.133:6379      ==> NO:ONE
    [WARN] group-[13] resync to prepared
    
    提升了之后,老主需要手动执行,执行命令和21一样:
    --sync-action --create

    24.分配slot(单个slot),codis-admin [-v] --dashboard=ADDR --slot-action --create --sid=ID --gid=ID

    # codis-admin --dashboard=192.168.96.170:18080 --slot-action --create --sid=0 --gid=11
    分配slot0 到group11中
    [WARN] [0xc4202d17a0] API call /api/topom/slots/action/create/4c0ca749efb5aad2b20b8d84b1bb6905/0/11 from 192.168.96.170:43524 []
    [WARN] update slot-[0]:
    pending -> preparing ->prepared ->migrating -> finished

    25. 移除slot(单个slot),codis-admin [-v] --dashboard=ADDR --slot-action --remove --sid=ID

    codis-admin --dashboard=192.168.96.170:18080 --slot-action --remove --sid=1

    26. . 迁移某一段范围的slots到指定的group,codis-admin [-v] --dashboard=ADDR --slot-action --create-range --beg=ID --end=ID --gid=ID

    # codis-admin --dashboard=192.168.96.170:18080 --slot-action --create-range --beg=5 --end=100 --gid=11

    27. 停止slots迁移:codis-admin [-v] --dashboard=ADDR --slot-action --disabled=VALUE

     codis-admin --dashboard=192.168.96.170:18080 --slot-action --disabled=1

    28. 开启slots迁移:codis-admin [-v] --dashboard=ADDR --slot-action --disabled=VALUE

    codis-admin --dashboard=192.168.96.170:18080 --slot-action --disabled=0

    29. 平均分配slots,各个Group平均分配1024个slots。

    codis-admin --dashboard=192.168.96.170:18080 --rebalance --confirm

    30. slots迁移的时间间隔

    codis-admin --dashboard=192.168.96.170:18080 --slot-action  --interval=1000

    31. 添加sentinel,保证高可用。codis-admin [-v] --dashboard=ADDR --sentinel-add --addr=ADDR

    # codis-admin --dashboard=192.168.96.170:18080 --sentinel-add --addr=192.168.96.161:26379
    
    # codis-admin --dashboard=192.168.96.170:18080 --sentinel-add --addr=192.168.96.162:26379
    
    # codis-admin --dashboard=192.168.96.170:18080 --sentinel-add --addr=192.168.96.163:26379

    32. 删除sentinel,codis-admin [-v] --dashboard=ADDR --sentinel-del --addr=ADDR [--force]

    # codis-admin --dashboard=192.168.96.170:18080 --sentinel-del --addr=192.168.96.161:26379

    33. 重新同步,codis-admin [-v] --dashboard=ADDR --sentinel-resync

    # codis-admin --dashboard=192.168.96.170:18080 --sentinel-resync

    34. 从ZooKeeper或则其他外部存储里里获取dashboard信息

    # codis-admin --dashboard-list --zookeeper=1192.168.96.169:2181

    35. 从ZooKeeper或则外部存储里获取集群的信息

    # codis-admin --config-dump --product=codis-superman --zookeeper=192.168.96.169:2181

     codis 扩容 codis-server节点

    1.关闭第一个 redis-sentinel 节点

    [root@codis-server1 ~]# redis-cli -p 26379
    127.0.0.1:26379> shutdown
    not connected> exit
    
    vim /etc/redis/sentinel.conf
    末尾添加:
    
    sentinel monitor mymaster3 192.168.96.165 6379 1
    sentinel auth-pass mymaster3 123456
    sentinel down-after-milliseconds mymaster3 30000
    sentinel parallel-syncs mymaster3 1
    sentinel failover-timeout mymaster3 180000

    启动sentinel
    [root@codis-server1 ~]# redis-sentinel /etc/redis/sentinel.conf

     2 .关闭第二个redis-sentinel 节点, 操作如上

     3 .关闭第三个redis-sentinel 节点, 操作如上

    4. 查看sentinel  第三组master加入情况

    5. codis-fe页面 新建group,并且把codis-server 加入到组中

     6. codis-fe 页面 迁移slot, 把0~1023 平均分到三组

     slot 351 - 750  分配到group12

     slot 751 - 1023  分配到group13

    slot 迁移完成

    参考:https://blog.csdn.net/nazeniwaresakini/article/details/104220249
    https://blog.csdn.net/screamPY/article/details/103136027

    报错解决

    {
        "Cause": "ERR unknown command 'SLOTSINFO'",
        "Stack": [
            {
                "Name": "github.com/CodisLabs/codis/pkg/utils/redis.(*Client).Do",
                "File": "/home/travis/gopath/src/github.com/CodisLabs/codis/pkg/utils/redis/client.go",
                "Line": 58
            },
            {
                "Name": "github.com/CodisLabs/codis/pkg/utils/redis.(*Client).SlotsInfo",
                "File": "/home/travis/gopath/src/github.com/CodisLabs/codis/pkg/utils/redis/client.go",
                "Line": 250
            },
            {
                "Name": "github.com/CodisLabs/codis/pkg/topom.(*apiServer).GroupAddServer",
                "File": "/home/travis/gopath/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go",
                "Line": 375
            },
            {
                "Name": "github.com/CodisLabs/codis/pkg/topom.(*apiServer).GroupAddServer-fm",
                "File": "/home/travis/gopath/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go",
                "Line": 91
            }
        ]
    }

    codis-server 是打过 patch 的 redis。为了支持 slot 迁移以及异步迁移。而你用的是官方的 redis,所以不支持。

    codis-dashboard 以及 codis-server 强制关机后, lock

    sentinel_client_reconfig_script = ""
    2022/03/18 16:02:30 zkclient.go:23: [INFO] zookeeper - Connected to 192.168.96.168:2181
    2022/03/18 16:02:30 zkclient.go:23: [INFO] zookeeper - Authenticated: id=144116480260964354, timeout=60000
    2022/03/18 16:02:30 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect
    2022/03/18 16:02:30 topom.go:189: [ERROR] store: acquire lock of codis-superman failed
    [error]: zk: node already exists
        6   /home/travis/gopath/src/github.com/CodisLabs/codis/pkg/models/zk/zkclient.go:247
                github.com/CodisLabs/codis/pkg/models/zk.(*Client).create
        5   /home/travis/gopath/src/github.com/CodisLabs/codis/pkg/models/zk/zkclient.go:196
                github.com/CodisLabs/codis/pkg/models/zk.(*Client).Create.func1
        4   /home/travis/gopath/src/github.com/CodisLabs/codis/pkg/models/zk/zkclient.go:129
                github.com/CodisLabs/codis/pkg/models/zk.(*Client).shell
        3   /home/travis/gopath/src/github.com/CodisLabs/codis/pkg/models/zk/zkclient.go:195
                github.com/CodisLabs/codis/pkg/models/zk.(*Client).Create
        2   /home/travis/gopath/src/github.com/CodisLabs/codis/pkg/models/store.go:119
                github.com/CodisLabs/codis/pkg/models.(*Store).Acquire
        1   /home/travis/gopath/src/github.com/CodisLabs/codis/pkg/topom/topom.go:188
                github.com/CodisLabs/codis/pkg/topom.(*Topom).Start
        0   /home/travis/gopath/src/github.com/CodisLabs/codis/cmd/dashboard/main.go:169
                main.main

    解决办法
     codis-admin --remove-lock --product=codis-superman --zookeeper=192.168.96.168:2181

    初始化slot 给 Group11, 出现报错

    codis-proxy 进程退出, 重启多次codis-proxy 才能完成.

  • 相关阅读:
    java中float内存存储原理
    java生产者消费者模式代码示例
    数据库死锁解决方案
    eclipse插件FindBugs使用笔记
    cmd查看环境变量
    springsECURITYDemo依赖
    2.27上课使用页面
    激活idea
    麻蛋 居然在jdk 问题上弱智
    Erek
  • 原文地址:https://www.cnblogs.com/fengjian2016/p/16018036.html
Copyright © 2020-2023  润新知