目录

codis分布式集群

如果有存储海量数据的需求,同步会非常缓慢,所以我们应该把一个主从结构变成多个,把存储的key分摊到各个主从结构中来分担压力。

就像这样,代理通过一种算法把要操作的key经过计算后分配到各个组中,这个过程叫做分片.

业内常用开源代理方案:

Twtter开源的Twemproxy

豌豆荚开源的Codis

Twemproxy,是推特开源的,它最大的缺点就是无法平滑的扩缩容,而Codis解决了Twemproxy扩缩容的问题,而且兼容了Twemproxy,它是由豌豆荚开源的,和Twemproxy都是代理模式。

简述

客户端发送请求到一个代理组件,代理解析客户端数据,并将请求转发到正确的节点,最后将结果回复给客户端。
特征

透明接入,业务程序不用关心后端Redis实例,切换成本低。

Proxy 的逻辑和存储的逻辑是隔离的。

代理层多了一次转发,性能有所损耗。

逻辑架构

访问层:访问方式可以是类似keepalived集群的vip方式,或者是通过java代码调用jodis控件再连接上zookeeper集群,然后查找到可用的proxy端,进而连接调用不同的codis-proxy地址来实现高可用的LVS和HA功能.

代理层:中间层由codis-proxy和zookeeper处理数据走向和分配,通过crc32算法,把key平均分配在不同redis的某一个slot中.实现类似raid0的条带化,在旧版本的codis中,slot需要手工分配,在codis3.2之后,只要点一个按钮slot会自动分配,相当方便,但是也可以手动分配,需要另外调用codis-admin命令.

数据层:最后codis-proxy把数据存进真实的redis-server主服务器上,由于codis的作者黄东旭相当注重数据一致性,不允许有数据延时造成的数据不一致,所以架构从一开始就没考虑主从读写分离.从服务器仅仅是作为故障切换的冗余架构,由codis-dashboard监控各服务的状态,然后通过改写zookeeper数据和调用redis-sentinel实现故障切换功能.


什么是Codis?

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

Codis3.x新特性

1.需要手动配置主从

2.支持 slot 同步迁移、异步迁移和并发迁移,对 key 大小无任何限制,迁移性能大幅度提升

3.相比 2.0:重构了整个集群组件通信方式,codis-proxy 与 zookeeper 实现了解耦,废弃了codis-config 等

4.元数据存储支持 etcd/zookeeper/filesystem 等,可自行扩展支持新的存储,集群正常运行期间,即便元存储故障也不再影响 codis 集群,大大提升 codis-proxy 稳定性

5.对 codis-proxy 进行了大量性能优化,通过控制GC频率、减少对象创建、内存预分配、引入 cgo、jemalloc 等,使其吞吐还是延迟,都已达到 codis 项目中最佳

6.proxy 实现 select 命令,支持多 DB

7.proxy 支持读写分离、优先读同 IP/同 DC 下副本功能

8.基于 redis-sentinel 实现主备自动切换

9.实现动态 pipeline 缓存区(减少内存分配以及所引起的 GC 问题)

10.proxy 支持通过 HTTP 请求实时获取 runtime metrics,便于监控、运维

11.支持通过 influxdb 和 statsd 采集 proxy metrics

slot auto rebalance 算法从 2.0 的基于 max memory policy 变更成基于 group 下 slot 数量

12.提供了更加友好的 dashboard 和 fe 界面,新增了很多按钮、跳转链接、错误状态等,有利于快速发现、处理集群故障

13.新增 SLOTSSCAN 指令,便于获取集群各个 slot 下的所有 key

14.codis-proxy 与 codis-dashbaord 支持 docker 部署

Codis3.x组件
Codis server:基于redis-3.2.8分支开发。增加了额外的数据结构,支持slot有关的操作以及数据迁移指令。

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

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

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

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、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。

Codis的优缺点

1)优点

对客户端透明,与codis交互方式和redis本身交互一样

支持在线数据迁移,迁移过程对客户端透明有简单的管理和监控界面

支持高可用,无论是redis数据存储还是代理节点

自动进行数据的均衡分配

最大支持1024个redis实例,存储容量海量

高性能

2)缺点

采用自有的redis分支,不能与原版的redis保持同步

如果codis的proxy只有一个的情况下, redis的性能会下降20%左右

某些命令不支持,比如事务命令muti


基础环境

1,jdk

bash 复制代码
wget http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.rpm?AuthParam=1521617060_4b299c3f89ebfbd1f04a2c29b511b5c3
rpm -ivh jdk-8u161-linux-x64.rpm

输入java执行,有正常提示信息即为安装成功

注意,下载连接可能会不同,请到下面连接找下载地址

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

或使用yum安装jdk1.8(推荐)

bash 复制代码
yum install java-1.8.0-openjdk* -y

2,zookeeper

历史版本下载地址:http://archive.apache.org/dist/zookeeper/

bash 复制代码
wget http://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar xzf zookeeper-3.4.14.tar.gz
mv zookeeper-3.4.14 /usr/local/zookeeper
mkdir -p /usr/local/zookeeper/{data,logs}
useradd -s /sbin/nologin -M -U zookeeper && chown -R zookeeper:zookeeper /usr/local/zookeeper/

复制配置模板并修改内容:

bash 复制代码
$ cp -a /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
范例如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
maxClientCnxns=600
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888

修改/usr/local/zookeeper/conf/zoo.cfg datadir为/data/zookeeper/data

/data/zookeeper/data目录下分别创建myid文件,并分别添加内容0、1、2

到/usr/local/zookeeper/bin 执行 zkServer.sh start或者编写systemd服务来启动

bash 复制代码
检查,执行zkCli.sh
输入  ls /
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
执行 sh zkServer.sh  status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

出现以上字样表示安装启动成功

如果出现启动失败无法连接客户端情况,请检查防火墙是否有限制3888端口

telnet zookeeper1 3888 (检查3台机器3888端口是否互通)

3,codis

3.1 go环境

codis需要go环境作为底层

bash 复制代码
wget https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz
tar xzvf -C go1.5.2.linux-amd64.tar.gz /usr/local

3.2 设置环境变量

bash 复制代码
export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$GOROOT/bin:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$GOPATH/bin
source /etc/profile

3.3 下载codis源码并安装

codis下载地址:https://github.com/CodisLabs/codis/releases

zip包下载地址:https://codeload.github.com/CodisLabs/codis/zip/release3.2

源码包解压后放到/usr/local/codis/src/github.com/CodisLabs目录下(需创建),改名为codis后再进行编译,否则会出错

下载codis源码:

创建目录

bash 复制代码
$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ 
#需翻墙,或者git clone https://github.com/CodisLabs/codis.git -b release3.2
$ wget https://github.com/CodisLabs/codis/archive/refs/tags/3.2.2.zip
$ mv codis-3.2.2/ codis
$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make

注意:目录不对编译会出错

bash 复制代码
 JEMALLOC_PREFIX    : je_
JEMALLOC_PRIVATE_NAMESPACE
                   : je_
install_suffix     : 
malloc_conf        : 
autogen            : 1
cc-silence         : 1
debug              : 0
code-coverage      : 0
stats              : 1
prof               : 0
prof-libunwind     : 0
prof-libgcc        : 0
prof-gcc           : 0
tcache             : 1
fill               : 1
utrace             : 0
valgrind           : 0
xmalloc            : 0
munmap             : 0
lazy_lock          : 0
tls                : 1
cache-oblivious    : 1
===============================================================================
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
[root@redis1 codis]# echo $?
0
bash 复制代码
[root@redis1 codis]# cat bin/version 
version = unknown version
compile = 2021-06-20 15:37:50 +0800 by go version go1.5.2 linux/amd64

编译过程直接make即可,完成后复制bin及config目录到/usr/local/codis/

bash 复制代码
cp -a bin /usr/local/codis/ && cp -a config /usr/local/codis/ && cp -a admin /usr/local/codis/

(注意绝对路径为/usr/local/codis/src/github.com/CodisLabs/codis)

4,组件部署配置
codis-dashboard(192.168.110.128)

核心点:集群管理服务端口(用于proxy和fe等共计连接),zookeeper地址,只能有一个.

默认为filesystem的Storage,修改成使用zookeeper。

bash 复制代码
[root@redis1 ~]# cd /usr/local/codis/config/
[root@redis1 config]# vim dashboard.toml
#修改如下内容:
#coordinator_name = "filesystem"
#coordinator_addr = "/tmp/codis"
#外部配置存储类型,我们用的就是zookeeper,当然也是还有其他可以支持,
coordinator_name = "zookeeper"
#配置zookeeper的连接地址,这里是三台就填三台
coordinator_addr = "192.168.110.128:2181,192.168.110.129:2181,192.168.110.130:2181"
#项目名称,会登记在zookeeper里,如果你想一套zookeeper管理多套codis,建议和项目名称类似
product_name = "codis-demo"
#所有redis的登录密码(与真实redis中requirepass一致),因为要登录进去修改数据
product_auth = ""
#codis-dashboard的通信端口,0.0.0.0表示对所有开放,最好使用内网地址
admin_addr = "0.0.0.0:18080"
#如果想要在codis集群在故障切换功能上执行一些脚本,可以配置以下两个配置
sentinel_notification_script = ""
sentinel_client_reconfig_script = ""
#启动dashboard
[root@redis1 codis]# /usr/local/codis/admin/codis-dashboard-admin.sh start
/usr/local/codis/admin/../config/dashboard.toml
starting codis-dashboard ... 
[root@redis1 codis]# ss -tpnl | grep 18080
LISTEN     0      128         :::18080                   :::*                   users:(("codis-dashboard",pid=9953,fd=5))
#启动参数
--ncpu    指定使用多少个cpu
--config    指定配置文件
--log    指定输出日志文件
--log-level    指定日志等级,有INFO,WARN,DEBUG,ERROR

zookeeper-leader查看

bash 复制代码
[root@redis2 codis]# zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /                       
[codis3, zookeeper]
[zk: localhost:2181(CONNECTED) 1] get /codis3/codis-demo/topom 
{
    "token": "299c723d87fc8f58e2f4f36a99351f19",
    "start_time": "2021-06-20 16:01:51.147929857 +0800 CST",
    "admin_addr": "redis1:18080",
    "product_name": "codis-demo",
    "pid": 9953,
    "pwd": "/usr/local/codis",
    "sys": "Linux redis1 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux"
}
cZxid = 0x200000004
ctime = Sun Jun 20 16:01:53 CST 2021
mZxid = 0x200000004
mtime = Sun Jun 20 16:01:53 CST 2021
pZxid = 0x200000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 344
numChildren = 0

日志文件位置:/usr/local/codis/log/

注意,如果dashboard是非正常退出,要执行下面命令对zookeeper数据进行解锁。

bash 复制代码
./codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181

codis-fe(192.168.110.128)

前端页面展示

1.修改启动文件

bash 复制代码
# 修改存储文件成zookeeper方式
# vim /usr/local/codis/admin/codis-fe-admin.sh
#COORDINATOR_NAME="filesystem"
#COORDINATOR_ADDR="/tmp/codis"
COORDINATOR_NAME="zookeeper"
COORDINATOR_ADDR="192.168.110.128:2181,192.168.110.129:2181,192.168.110.130:2181"
CODIS_FE_ADDR="0.0.0.0:9090"

2.启动fe

bash 复制代码
[root@redis1 ~]# /usr/local/codis/admin/codis-fe-admin.sh start
starting codis-fe ... 
[root@redis1 ~]# ss -tpnl |grep 9090
LISTEN     0      128         :::9090                    :::*                   users:(("codis-fe",pid=10159,fd=6))
#启动参数
--ncpu    指定使用多少个cpu
--log    指定输出日志文件
--log-level    指定日志等级,有INFO,WARN,DEBUG,ERROR
--dashboard-list    指定dashboard的地址和项目名称,这里因为生成了文件,所以就指定成文件了
--listen    指定codis-fe的web登录端口,也就是我们通过8090来访问这个管理端了,0.0.0.0即对来访IP无限制,其实最好是限制内网

codis-server(192.168.110.128,192.168.110.129,192.168.110.130)

和原生redis没有太大区别,不支持一些指令.优化需要另作修改

bash 复制代码
[root@redis1 ~]# vim /usr/local/codis/config/redis.conf 
#修改为如下内容:
#绑定登录IP,安全考虑,最好是内网
bind 0.0.0.0
protected-mode yes
#允许后台运行
daemonize yes
#设置端口,最好是非默认端口
port 6379
tcp-backlog 511
#命名并指定当前redis的PID路径,用以区分多个redis
pidfile /tmp/redis_6379.pid
#命名并指定当前redis日志文件路径
logfile "/tmp/redis_6379.log"
#指定RDB文件名,用以备份数据到硬盘并区分不同redis,当使用内存超过可用内存的45%时触发快照功能
dbfilename "dump_6379.rdb"
#指定当前redis的根目录,用来存放RDB/AOF文件
dir "./"
#当前redis的认证密钥,redis运行速度非常快,这个密码要足够强大,
#所有codis-proxy集群相关的redis-server认证密码必须全部一致
#requirepass "123"
#当前redis的最大容量限制,建议设置为可用内存的45%内,最高能设置为系统可用内存的95%,
#可用config set maxmemory 去在线修改,但重启失效,需要使用config rewrite命令去刷新配置文件
#注意,使用codis集群,必须配置容量大小限制,不然无法启动
#maxmemory 100000kb
#LRU的策略,有四种,看情况选择
#maxmemory-policy allkeys-lru
#如果做故障切换,不论主从节点都要填写密码且要保持一致
#masterauth "123"
[root@redis1 ~]# /usr/local/codis/admin/codis-server-admin.sh start
/usr/local/codis/admin/../config/redis.conf
starting codis-server ... 
[root@redis1 ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.110.130,port=6379,state=online,offset=14981,lag=0
slave1:ip=192.168.110.129,port=6379,state=online,offset=14681,lag=1
master_repl_offset:14981
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14980

192.168.110.129(从)

bash 复制代码
[root@redis1 ~]# vim /usr/local/codis/config/redis.conf 
#修改为如下内容:
#绑定登录IP,安全考虑,最好是内网
bind 0.0.0.0
protected-mode yes
#允许后台运行
daemonize yes
#设置端口,最好是非默认端口
port 6379
tcp-backlog 511
#命名并指定当前redis的PID路径,用以区分多个redis
pidfile /tmp/redis_6379.pid
#命名并指定当前redis日志文件路径
logfile "/tmp/redis_6379.log"
#指定RDB文件名,用以备份数据到硬盘并区分不同redis,当使用内存超过可用内存的45%时触发快照功能
dbfilename "dump_6379.rdb"
#指定当前redis的根目录,用来存放RDB/AOF文件
dir "./"
#当前redis的认证密钥,redis运行速度非常快,这个密码要足够强大,
#所有codis-proxy集群相关的redis-server认证密码必须全部一致
#requirepass "123"
#当前redis的最大容量限制,建议设置为可用内存的45%内,最高能设置为系统可用内存的95%,
#可用config set maxmemory 去在线修改,但重启失效,需要使用config rewrite命令去刷新配置文件
#注意,使用codis集群,必须配置容量大小限制,不然无法启动
#maxmemory 100000kb
#LRU的策略,有四种,看情况选择
#maxmemory-policy allkeys-lru
#如果做故障切换,不论主从节点都要填写密码且要保持一致
#masterauth "123"
#配置主节点信息
slaveof 192.168.110.128 6379
[root@redis2 ~]# /usr/local/codis/admin/codis-server-admin.sh start
/usr/local/codis/admin/../config/redis.conf
starting codis-server ... 
[root@redis2 ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.110.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:20109
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

192.168.110.130(从)

bash 复制代码
[root@redis1 ~]# vim /usr/local/codis/config/redis.conf 
#修改为如下内容:
#绑定登录IP,安全考虑,最好是内网
bind 0.0.0.0
protected-mode yes
#允许后台运行
daemonize yes
#设置端口,最好是非默认端口
port 6379
tcp-backlog 511
#命名并指定当前redis的PID路径,用以区分多个redis
pidfile /tmp/redis_6379.pid
#命名并指定当前redis日志文件路径
logfile "/tmp/redis_6379.log"
#指定RDB文件名,用以备份数据到硬盘并区分不同redis,当使用内存超过可用内存的45%时触发快照功能
dbfilename "dump_6379.rdb"
#指定当前redis的根目录,用来存放RDB/AOF文件
dir "./"
#当前redis的认证密钥,redis运行速度非常快,这个密码要足够强大,
#所有codis-proxy集群相关的redis-server认证密码必须全部一致
#requirepass "123"
#当前redis的最大容量限制,建议设置为可用内存的45%内,最高能设置为系统可用内存的95%,
#可用config set maxmemory 去在线修改,但重启失效,需要使用config rewrite命令去刷新配置文件
#注意,使用codis集群,必须配置容量大小限制,不然无法启动
#maxmemory 100000kb
#LRU的策略,有四种,看情况选择
#maxmemory-policy allkeys-lru
#如果做故障切换,不论主从节点都要填写密码且要保持一致
#masterauth "123"
#配置主节点信息
slaveof 192.168.110.128 6379
[root@redis3 ~]# /usr/local/codis/admin/codis-server-admin.sh start
/usr/local/codis/admin/../config/redis.conf
starting codis-server ... 
[root@redis3 ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.110.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:27365
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

不开启AOF持久化模式的原因:

第一:因为codis定位是高并发缓存系统,当主从都健康时,RDB的操作频率是会被降低,甚至不做,这样性能就更高,但是也并不很影响故障切换.

第二:AOF持久化会耗费大量磁盘资源,对于提高codis负载没什么帮助,通过压测也证明开启AOF后的性能会有20%左右的下降.

1.在fe后台添加两个Group,每个group分配两个机器

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

2.利用fe自动分配插槽slot

新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group ),而初始化最快的方法可通过 fe 提供的 rebalance all slots 按钮来做,如下图所示,点击此按钮,我们即快速完成了一个集群的搭建。



分片算法

CRC全称是循环冗余校验,主要在数据存储和通信领域保证数据正确性的校验手段。

在Codis里面,它把所有的key分为1024个槽,每一个槽位都对应了一个分组,具体槽位的分配,可以进行自定义,现在如果有一个key进来,首先要根据CRC32算法,针对key算出32位的哈希值,然后除以1024取余,然后就能算出这个KEY属于哪个槽,然后根据槽与分组的映射关系,就能去对应的分组当中处理数据了。

codis-proxy(192.168.110.128,192.168.110.129,192.168.110.130)
注意:redis槽位的映射关系是保存在proxy里面的,不同proxy之间是通过Zookeeper来保存映射关系,由proxy上来同步配置信息。

启动proxy后会处于waitingonline 状态(日志查询),监听proxy_addr地址,但是不会accept连接,添加到集群并完成集群状态的同步,才能改变状态为online。添加的方法有以下两种:

通过 codis-fe 添加:通过Add Proxy按钮,将admin_addr加入到集群中;⑤之后。

通过 codis-admin 命令行工具添加,方法如下:

bash 复制代码
codis-admin --dashboard=192.168.110.128:18080--create-proxy -x192.168.110.128:11080

其中192.168.110.128:18080以及192.168.110.128:11080分别为 dashboard 和 proxy 的admin_addr地址;可以在后面的codis-fe里看到
添加过程中,dashboard 会完成如下一系列动作:

1.获取 proxy 信息,对集群 name 以及 auth 进行验证,并将其信息写入到外部存储(zookeeper);

2.同步 slots 状态;

3.标记 proxy 状态为online,此后 proxy 开始accept连接并开始提供服务;

1.修改配置文件proxy.toml,修改为zookeeper的jodis地址

bash 复制代码
[root@redis1 ~]# vim /usr/local/codis/config/proxy.toml
修改为如下内容:
#项目名称,会登记在zookeeper里,如果你想一套zookeeper管理多套codis,就必须区分好
product_name = "codis-demo"
# 设置登录dashboard的密码(与真实redis中requirepass一致)
product_auth = ""
#客户端(redis-cli)的登录密码(与真实redis中requirepass不一致),是登录codis的密码
session_auth = ""
#管理的端口,0.0.0.0即对所有ip开放,基于安全考虑,可以限制内网
admin_addr = "0.0.0.0:11080"
#用那种方式通信,假如你的网络支持tcp6的话就可以设别的
proto_type = "tcp4"
#客户端(redis-cli)访问代理的端口,0.0.0.0即对所有ip开放
proxy_addr = "0.0.0.0:19000"
#外部配置存储类型,我们用的就是zookeeper,当然也是还有其他可以支持,
jodis_name = "zookeeper"
#配置zookeeper的连接地址,这里是三台就填三台
jodis_addr = "192.168.110.128:2181,192.168.110.129:2181,192.168.110.130:2181"
#zookeeper的密码,假如有的话
jodis_auth = ""
#codis代理的最大连接数,默认是1000,并发大要调大
proxy_max_clients = 100000
#假如并发太大,你可能需要调这个pipeline参数,大多数情况默认10000就够了
session_max_pipeline = 100000
#并发大也可以改以下参数
backend_max_pipeline = 204800
session_recv_bufsize = "256kb"
session_recv_timeout = "0s"
#其他两台proxy只需要修改如下内容或者于redis1一致即可
[root@redis2 ~]# vim /usr/local/codis/config/proxy.toml
修改为如下内容:
jodis_name = "zookeeper"
jodis_addr = "192.168.110.128:2181,192.168.110.129:2181,192.168.110.130:2181"
[root@redis3 ~]# vim /usr/local/codis/config/proxy.toml
修改为如下内容:
jodis_name = "zookeeper"
jodis_addr = "192.168.110.128:2181,192.168.110.129:2181,192.168.110.130:2181"

2.修改配置文件启动codis-proxy

bash 复制代码
[root@redis1 ~]# vim /usr/local/codis/admin/codis-proxy-admin.sh
#修改为如下内容,因为codis-proxy要连接dashboard服务端所以不能是本地地址
CODIS_DASHBOARD_ADDR="192.168.110.128:18080"
[root@redis2 ~]# vim /usr/local/codis/admin/codis-proxy-admin.sh
#修改为如下内容,因为codis-proxy要连接dashboard服务端所以不能是本地地址
CODIS_DASHBOARD_ADDR="192.168.110.128:18080"
[root@redis3 ~]# vim /usr/local/codis/admin/codis-proxy-admin.sh
#修改为如下内容,因为codis-proxy要连接dashboard服务端所以不能是本地地址
CODIS_DASHBOARD_ADDR="192.168.110.128:18080"
#启动codis-proxy
$ /usr/local/codis/admin/codis-proxy-admin.sh start
$ ss -tpnl |grep 19000
LISTEN     0      128          *:19000                    *:*                   users:(("codis-proxy",pid=10625,fd=4))
#启动参数
--ncpu    指定使用多少个cpu,我的是虚拟机,所以就1了,如果你是多核,那就填多个
--config    指定配置文件,就是刚才的配置文件
--log    指定输出日志文件
#停止codis-proxy服务:
codis-admin --proxy=192.168.110.128:11080--shutdown

1.在FE界面查看codis-proxy

proxy启动默认会自动注册到dashboard中,也可以在fe中手动添加

部署redis-sentinel实现集群HA

建议使用codis-HA来实现集群高可用,因为sentinel在实际应用当中问题很多,尤其是主从切换和数据一致性问题。

192.168.110.128

1.修改配置文件

bash 复制代码
[root@redis1 ~]# vim /usr/local/codis/config/sentinel.conf
#修改为如下内容
port 26379
dir "/tmp"
protected-mode no
daemonize yes

2.启动Sentinel

bash 复制代码
sentinel部署官方脚本,是根据codis-server启动脚本进行修改
/usr/local/codis/admin/codis-sentinel-admin.sh start
# ss -tpnl |grep 26379

192.168.110.129

1.修改配置文件

bash 复制代码
[root@redis2~]# vim /usr/local/codis/config/sentinel.conf
#修改为如下内容
port 26379
dir "/tmp"
protected-mode no
daemonize yes

2.启动Sentinel

bash 复制代码
sentinel部署官方脚本,是根据codis-server启动脚本进行修改
/usr/local/codis/admin/codis-sentinel-admin.sh start
# ss -tpnl |grep 26379

192.168.110.130

1.修改配置文件

bash 复制代码
[root@redis3 ~]# vim /usr/local/codis/config/sentinel.conf
#修改为如下内容
port 26379
dir "/tmp"
protected-mode no
daemonize yes

2.启动Sentinel

bash 复制代码
sentinel部署官方脚本,是根据codis-server启动脚本进行修改
/usr/local/codis/admin/codis-sentinel-admin.sh start
# ss -tpnl |grep 26379

fe界面添加sentinel

点下SYNC,这样配置文件会自动添加如下内容

bash 复制代码
# Generated by CONFIG REWRITE
sentinel myid 473d3ade407e02a73f6f3dcfa030722eaf216c6a	# 当前 Sentinel 实例的唯一标识符,用于在 Sentinel 集群中区分不同的 Sentinel 实例
sentinel monitor codis-demo-3 192.168.110.130 6379 2	# 配置 Sentinel 监控的主 Redis 实例,名称为 codis-demo-3,地址为 192.168.110.130,端口为 6379,quorum 值为 2(表示至少需要 2 个 Sentinel 同意才能进行故障转移)
sentinel failover-timeout codis-demo-3 300000		# 设置故障转移的超时时间,单位为毫秒,这里设置为 300000 毫秒(5 分钟)
sentinel config-epoch codis-demo-3 0			# 配置 epoch 值,用于在故障转移过程中确保配置的一致性,初始值为 0
sentinel leader-epoch codis-demo-3 0			# 当前 Sentinel 实例作为领导者进行故障转移的 epoch 值,初始值为 0
sentinel known-sentinel codis-demo-3 192.168.110.130 26379 76994c0997955f0a32f9dba6662aa9b4f829631d	# 配置已知的 Sentinel 实例,属于 codis-demo-3 集群,地址为 192.168.110.130,端口为 26379,ID 为 769...
sentinel known-sentinel codis-demo-3 192.168.110.129 26379 1d18fdcdc072182b8a1bf069ea7b061d9532ab19	# 配置另一个已知的 Sentinel 实例,属于 codis-demo-3 集群,地址为 192.168.110.129,端口为 26379,ID 为 1d1...
sentinel monitor codis-demo-2 192.168.110.129 6379 2
sentinel failover-timeout codis-demo-2 300000
sentinel config-epoch codis-demo-2 0
sentinel leader-epoch codis-demo-2 0
sentinel known-sentinel codis-demo-2 192.168.110.130 26379 76994c0997955f0a32f9dba6662aa9b4f829631d
sentinel known-sentinel codis-demo-2 192.168.110.129 26379 1d18fdcdc072182b8a1bf069ea7b061d9532ab19
sentinel monitor codis-demo-1 192.168.110.128 6379 2
sentinel failover-timeout codis-demo-1 300000
sentinel config-epoch codis-demo-1 0
sentinel leader-epoch codis-demo-1 0
sentinel known-sentinel codis-demo-1 192.168.110.130 26379 76994c0997955f0a32f9dba6662aa9b4f829631d
sentinel known-sentinel codis-demo-1 192.168.110.129 26379 1d18fdcdc072182b8a1bf069ea7b061d9532ab19
sentinel current-epoch 0	# 当前 Sentinel 集群的全局 epoch 值,用于确保配置的一致性

测试将redis-master宕机后是否进行主从切换

bash 复制代码
[root@redis1 ~]# /usr/local/codis/admin/codis-server-admin.sh stop
/usr/local/codis/admin/../config/redis.conf
stopping codis-server ... 
STOPPED

可以看到切换成功了!

bash 复制代码
[root@redis2 ~]# redis-cli -p 6379   
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.110.130
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:58556
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

重新启动redis1

bash 复制代码
[root@redis1 log]# /usr/local/codis/admin/codis-server-admin.sh start
/usr/local/codis/admin/../config/redis.conf
starting codis-server ... 
#哨兵日志查看
11583:X 20 Jun 23:59:07.843 # -sdown slave 192.168.110.128:6379 192.168.110.128 6379 @ codis-demo-1 192.168.110.130 6379
11583:X 20 Jun 23:59:18.793 * +slave slave 192.168.110.128:6379 192.168.110.128 6379 @ codis-demo-3 192.168.110.130 6379


注意:codis集群使用sentinel,是把每个主机组当做一个监控的组,相当于每台codis-server节点都是master,这会导致从节点主从同步问题,从节点可能会同步其他group中的主节点,导致数据不一致。

在redis-sentinel故障切换期间,整个codis集群不会关闭对此故障redis-server的连接,所以codis-proxy依然会发送数据给当前故障的redis-server,显然此时的redis-server是无法存储数据的,这就造成了丢key现象,如果整个主从挂了,就会丢掉所有发送到此redis-server的key了,除非手动剔除故障节点。

部署codis-HA实现集群HA

codis-ha在codis架构中没有办法直接操作代理服务,因为所有的代理和服务的操作都要经过dashboard处理。所以部署的时候会利用k8s的亲和力将codis-ha和dashboard部署在同一个节点上。

这个软件是有缺陷,他会自动连接上dashboard检测各主从结构的健康信息,检测间隔很快(默认3秒,可修改参数--interval),检测到故障后,会将故障主库或者从库强制下线并删除在dashboard登记的信息.

虽然切换速度非常快,只会有很少的丢key现象(3秒还是会丢一些),但是后面会把故障旧主库强制下线,需要手动修改配置并重新启动redis-server(codis-server),还要再在codis-fe界面添加配置才行.

192.168.110.128

bash 复制代码
[root@redis1 ~]# /usr/local/codis/bin/codis-ha --dashboard=192.168.110.128:18080 --log=/usr/local/codis/log/codis-ha.log --log-level=WARN &
#--dashboard    指定dashboard的地址和端口
#--log    指定日志文件
#--log-level    指定日志等级,有INFO,WARN,DEBUG,ERROR

虽然说丢key现象少了,但依然还是会有并且在主从切换情况下该组内其他slave实例是不会自动改变状态的,这些slave仍将试图从旧的master上同步数据,会导致组内新的master和其他slave之间的数据不一致。因为当出现主从切换的时候,需要管理员手动创建新的sync action来完成新master和slave之间的数据同步,这样增加了工作量,应该根据实际应用场景来选择是codis-ha还是sentinel

压力测试

压力测试codis同样提供了原生redis的redis-benchmark命令来进行压测

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

bash 复制代码
/usr/local/codis/redis-benchmark -h 10.0.2.5 -p 19000 -a 123456 -c 500 -n 1000000 -q

再压测单节点的性能

bash 复制代码
/usr/local/codis/redis-benchmark -h 10.0.2.5 -p 6379 -a 123 -c 500 -n 1000000 -q

redis-benchmark参数解析:

-h ip地址

-p redis端口

-a 认证密码

-c 设定多少个并发连接

-n 总共多少个请求

-q 显示模式:简要模式

实时添加删除节点

codis的另一个卖点就是可以在线添加/删除redis-server(codis-server)节点,做到实时扩容和更换问题节点,对于单点redis而言优势明显,不用重启服务就能有更大的空间,也可以在线切换掉有问题的节点.不过要注意,可以实时扩容和故障切换,并不代表没有性能损耗,真的要做也是要注意线上压力,避免性能压力导致的服务不可用.

实现的原理是因为codis集群把各个redis-server节点都用规则分成了多个slots数据块(总共1024个).需要扩容只要把新的节点添加完成后,在把这些slots信息从新分配就可以达到扩容效果,需要故障切换则把问题redis-server节点的slots迁移走,然后就可以把这个节点下架了,对于线上环境可以说是几乎没感知,试验过程中也没发现有丢key现象,就是性能有所下降,但是我测试的环境下性能下降还能接受,大概只有10%-30%的性能损耗.

1.添加一个节点,等于是扩容,

第一步,和之前差不多,先创建一个新组,点击按钮确认添加

第二步,把新地址添加到新的组,点击按钮确认添加

第三步,确认新的地址已成功添加进去

第四步,点击按钮,从新分配所有slots数据块

这里唯一问题就是最后一步,重新分配会耗费一定资源,codis会自动平衡数据块的分布,所以会有数据迁移过程,但是据我测试的结果来看,并不很严重,大概在20%左右.

根据它自带的监控来看的话,

可以看到之前正常情况的qps接近1500,刚点重新平衡下降比较严重一些,后面就大概有20%的性能损耗那样子,最后迁移完毕就恢复正常了.当然这是数据量少的情况,如果数据量多,这个迁移时间就恐怕不是那么简单了.

2.切换一个节点,并下架

正常下架只需要点击这个按钮

但是因为里面还有数据,是不允许直接下架的

所以我们要先迁移数据,如下所示:

第一步,确认一个需要迁移的组的数据块的编号,例如这里499-512的块是数据组4的,我现在要迁移组4,就选定这个

第二步,把刚才获取到的信息填进去,就是把500这个编号的数据块从组4迁移到组5,点击按钮执行

然后你就会看到,

显然组4的信息消失了,codis把组4的数据块都迁移到了组5去了,

这个时候,这个redis-server节点就可以删除了

至于还需不需要重新填补,这个问题则需要自身考虑.如果不需要填补,最好再点一下重新平衡slots比较好.

2.codis-proxy异常退出导致无法删除

通常codis-proxy都是通过codis-dashboard进行移除,移除过程中codis-dashboard为了安全会向codis-proxy发送offline指令,成功后才会将proxy信息从外部存储(zookeeper)中移除。如果codis-proxy异常退出,该操作会失败。此时需要手动删除zookeeper信息。

bash 复制代码
#先登入zookeeper进行操作
/usr/local/zookeeper/bin/zkCli.sh -server
#确认有问题的codis-proxy地址对应在zookeeper上的信息
[zk: localhost:2181(CONNECTED) 6] get  /codis3/codis-zyyhj1/proxy/proxy-80722e128c6e8fc3d0da44983343a843
{
    "id": 1,
    "token": "80722e128c6e8fc3d0da44983343a843",
    "start_time": "2018-06-16 23:30:57.44436209 +0800 CST",
    "admin_addr": "10.21.1.140:11080",
    "proto_type": "tcp4",
    "proxy_addr": "10.21.1.140:19000",
    "jodis_path": "/jodis/codis-zyyhj1/proxy-80722e128c6e8fc3d0da44983343a843",
    "product_name": "codis-zyyhj1",
    "pid": 26493,
    "pwd": "/root",
    "sys": "Linux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux",
    "hostname": "localhost.localdomain",
    "datacenter": ""
}
cZxid = 0x100001c7b
ctime = Fri Jun 15 21:02:22 CST 2018
mZxid = 0x1000038ae
mtime = Sat Jun 16 23:30:57 CST 2018
pZxid = 0x100001c7b
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 576
numChildren = 0
#确认完毕,删除
[zk: localhost:2181(CONNECTED) 7] rmr /codis3/codis-zyyhj1/proxy/proxy-80722e128c6e8fc3d0da44983343a843
#删除完毕,还需要重载一下dashboard,不然信息也是不会更新的
/usr/local/codis/codis-admin  --dashboard=10.21.1.124:18081 --reload

Codis-admin命令详解

bash 复制代码
$ /usr/local/codis/bin/codis-admin --help
Usage:
        codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|slots]
        codis-admin [-v] --proxy=ADDR [--auth=AUTH]  --start
        codis-admin [-v] --proxy=ADDR [--auth=AUTH]  --shutdown
        codis-admin [-v] --proxy=ADDR [--auth=AUTH]  --log-level=LEVEL
        codis-admin [-v] --proxy=ADDR [--auth=AUTH]  --fillslots=FILE [--locked]
        codis-admin [-v] --proxy=ADDR [--auth=AUTH]  --reset-stats
        codis-admin [-v] --proxy=ADDR [--auth=AUTH]  --forcegc
        codis-admin [-v] --dashboard=ADDR           [config|model|stats|slots|group|proxy]
        codis-admin [-v] --dashboard=ADDR            --shutdown
        codis-admin [-v] --dashboard=ADDR            --reload
        codis-admin [-v] --dashboard=ADDR            --log-level=LEVEL
        codis-admin [-v] --dashboard=ADDR            --slots-assign   --beg=ID --end=ID (--gid=ID|--offline) [--confirm]
        codis-admin [-v] --dashboard=ADDR            --slots-status
        codis-admin [-v] --dashboard=ADDR            --list-proxy
        codis-admin [-v] --dashboard=ADDR            --create-proxy   --addr=ADDR
        codis-admin [-v] --dashboard=ADDR            --online-proxy   --addr=ADDR
        codis-admin [-v] --dashboard=ADDR            --remove-proxy  (--addr=ADDR|--token=TOKEN|--pid=ID)       [--force]
        codis-admin [-v] --dashboard=ADDR            --reinit-proxy  (--addr=ADDR|--token=TOKEN|--pid=ID|--all) [--force]
        codis-admin [-v] --dashboard=ADDR            --proxy-status
        codis-admin [-v] --dashboard=ADDR            --list-group
        codis-admin [-v] --dashboard=ADDR            --create-group   --gid=ID
        codis-admin [-v] --dashboard=ADDR            --remove-group   --gid=ID
        codis-admin [-v] --dashboard=ADDR            --resync-group  [--gid=ID | --all]
        codis-admin [-v] --dashboard=ADDR            --group-add      --gid=ID --addr=ADDR [--datacenter=DATACENTER]
        codis-admin [-v] --dashboard=ADDR            --group-del      --gid=ID --addr=ADDR
        codis-admin [-v] --dashboard=ADDR            --group-status
        codis-admin [-v] --dashboard=ADDR            --replica-groups --gid=ID --addr=ADDR (--enable|--disable)
        codis-admin [-v] --dashboard=ADDR            --promote-server --gid=ID --addr=ADDR
        codis-admin [-v] --dashboard=ADDR            --sync-action    --create --addr=ADDR
        codis-admin [-v] --dashboard=ADDR            --sync-action    --remove --addr=ADDR
        codis-admin [-v] --dashboard=ADDR            --slot-action    --create --sid=ID --gid=ID
        codis-admin [-v] --dashboard=ADDR            --slot-action    --remove --sid=ID
        codis-admin [-v] --dashboard=ADDR            --slot-action    --create-some  --gid-from=ID --gid-to=ID --num-slots=N
        codis-admin [-v] --dashboard=ADDR            --slot-action    --create-range --beg=ID --end=ID --gid=ID
        codis-admin [-v] --dashboard=ADDR            --slot-action    --interval=VALUE
        codis-admin [-v] --dashboard=ADDR            --slot-action    --disabled=VALUE
        codis-admin [-v] --dashboard=ADDR            --rebalance     [--confirm]
        codis-admin [-v] --dashboard=ADDR            --sentinel-add   --addr=ADDR
        codis-admin [-v] --dashboard=ADDR            --sentinel-del   --addr=ADDR [--force]
        codis-admin [-v] --dashboard=ADDR            --sentinel-resync
        codis-admin [-v] --remove-lock               --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
        codis-admin [-v] --config-dump               --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [-1]
        codis-admin [-v] --config-convert=FILE
        codis-admin [-v] --config-restore=FILE       --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [--confirm]
        codis-admin [-v] --dashboard-list                           (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)

Options:
        -a AUTH, --auth=AUTH
        -x ADDR, --addr=ADDR
        -t TOKEN, --token=TOKEN
        -g ID, --gid=ID

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

bash 复制代码
# 查看到proxy.toml的内容,如:proxy、zk、连接数等等
codis-admin --proxy=192.168.110.128:11080 config

# 查看注册到ZK的信息:Proxy的地址,进群名称、主机名等等
codis-admin --proxy=192.168.110.128:11080 model

# 查看Proxy是否在线、sentinel信息、ops、qps、内存信息等等
codis-admin --proxy=192.168.110.128:11080 stats

# 查看Slots信息:slot在哪个group,后端Redis Server地址
codis-admin --proxy=192.168.110.128:11080 slots

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

bash 复制代码
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --start/--shutdown
# codis-admin --proxy=192.168.110.128:11080 --start 
日志中 proxy waiting online ... 会变成 proxy is working ...
并且注册到zk的jodis目录里:
API call /api/proxy/start/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.110.128:52426 []
jodis create node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530

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

3,. proxy 动态设置日志等级

bash 复制代码
#codis-admin [-v] --proxy=ADDR [--auth=AUTH] --log-level=LEVEL
codis-admin --proxy=192.168.110.128:11080 --log-level=info

4, 清除Proxy状态

bash 复制代码
#codis-admin [-v] --proxy=ADDR [--auth=AUTH] --reset-stats
#清除Proxy的QPS、OPS、Fail、Errors等Commands信息
codis-admin --proxy=192.168.110.128:11080 --reset-stats

5, 强制清理Proxy内存

bash 复制代码
#codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc
#控制Proxy内存的释放
codis-admin --proxy=192.168.110.128:11080 --forcegc

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

bash 复制代码
#codis-admin [-v] --dashboard=ADDR [config|model|stats|slots|group|proxy]
#查看dashboard的配置,即dashboard.toml配置的信息
codis-admin --dashboard=192.168.110.128:18080 config
#查看model信息   
codis-admin --dashboard=192.168.110.128:18080 model
#包括slot和group的对应信息,group信息(group后端的server以及server的配置),proxy信息(sentinel信息、server信息、server主信息以及proxy CPU和内存使用情况),
codis-admin --dashboard=192.168.110.128:18080 stats
#slot和group的对应信息
codis-admin --dashboard=192.168.110.128:18080 slots
#组信息,组下server的配置信息
codis-admin --dashboard=192.168.110.128:18080 group
#proxy信息,包括sentinel、server信息以及proxy cpu和内存使用情况,ops、qps等commands信息、连接数(session)等
codis-admin --dashboard=192.168.110.128:18080 proxy

7.关闭和重新加载dashboard

bash 复制代码
#codis-admin [-v] --dashboard=ADDR --shutdown/--reload
#关闭dashboard,清除zk里的topom
codis-admin --dashboard=192.168.110.128:18080 --shutdown

#修改dashboard之后,重新加载配置 
codis-admin --dashboard=192.168.110.128:18080 --reload

8, dashboard动态设置日志等级

bash 复制代码
#codis-admin [-v] --dashboard=ADDR --log-level=LEVEL
codis-admin --dashboard=192.168.110.128:18080 --log-level=infoAPI 

9,proxy加入到dashboard,并online

bash 复制代码
#codis-admin [-v] --dashboard=ADDR --create-proxy --addr=ADDR
#proxy加入到dashboard中
codis-admin --dashboard=192.168.110.128:18080 --create-proxy --addr=192.168.110.128:11080

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

bash 复制代码
#proxy online
codis-admin --dashboard=192.168.110.128:18080 --online-proxy --addr=192.168.110.128:11080

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

bash 复制代码
#查看该dashboard下的proxy列表和信息
codis-admin --dashboard=192.168.110.128:18080 --list-proxy

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

bash 复制代码
#根据相关信息:ip、token、pid等移除proxy
codis-admin --dashboard=192.168.110.128:18080 --remove-proxy --addr=192.168.110.128:11081

其他

启动顺序

codis的启动略麻烦一点,其核心概念如下:

zookeeper为集群配置的管理点,以及数据分片的维护点,所以zookeeper需要首先启动。

其次,dashboard用于管理整个集群,需要第二顺序启动。

然后启动proxy,依赖zookeeper数据来读取后端服务,并依赖dashboard访问zookeeper即集群对外服务的端口。

然后启动后端redis服务。

fe fe为集群的配置图形界面,可最后启动,也可以在dashboard启动后启动。

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
java1234_小锋7 小时前
Kafka中的消息是如何存储的?
分布式·kafka
老友@7 小时前
Kafka 深度解析:高性能设计、部署模式、容灾机制与 KRaft 新模式
分布式·kafka·kraft·高性能·容灾机制
余子桃7 小时前
Kafka的安装与使用(windows下python使用等)
分布式·kafka
java1234_小锋7 小时前
Kafka中的消息如何分配给不同的消费者?
分布式·kafka
小样vvv7 小时前
【Kafka】深入探讨 Kafka 如何保证一致性
分布式·kafka
快来卷java12 小时前
深入剖析雪花算法:分布式ID生成的核心方案
java·数据库·redis·分布式·算法·缓存·dreamweaver
2401_8712905813 小时前
Hadoop 集群的常用命令
大数据·hadoop·分布式
冰 河13 小时前
《Mycat核心技术》第21章:高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)
分布式·微服务·程序员·分布式数据库·mycat
小样vvv14 小时前
【分布式】深入剖析 Sentinel 限流:原理、实现
分布式·c#·sentinel
千航@abc14 小时前
zookeeper的作用介绍
分布式·zookeeper·云原生·云原生组件