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
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(推荐)
yum install java-1.8.0-openjdk* -y
2,zookeeper
历史版本下载地址:http://archive.apache.org/dist/zookeeper/
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/
复制配置模板并修改内容:
$ 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服务来启动
检查,执行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环境作为底层
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 设置环境变量
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源码:
创建目录
$ 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
注意:目录不对编译会出错
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
[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/
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。
[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查看
[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数据进行解锁。
./codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181
codis-fe(192.168.110.128)
前端页面展示
1.修改启动文件
# 修改存储文件成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
[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没有太大区别,不支持一些指令.优化需要另作修改
[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(从)
[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(从)
[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 命令行工具添加,方法如下:
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地址
[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
[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.修改配置文件
[root@redis1 ~]# vim /usr/local/codis/config/sentinel.conf
#修改为如下内容
port 26379
dir "/tmp"
protected-mode no
daemonize yes
2.启动Sentinel
sentinel部署官方脚本,是根据codis-server启动脚本进行修改
/usr/local/codis/admin/codis-sentinel-admin.sh start
# ss -tpnl |grep 26379
192.168.110.129
1.修改配置文件
[root@redis2~]# vim /usr/local/codis/config/sentinel.conf
#修改为如下内容
port 26379
dir "/tmp"
protected-mode no
daemonize yes
2.启动Sentinel
sentinel部署官方脚本,是根据codis-server启动脚本进行修改
/usr/local/codis/admin/codis-sentinel-admin.sh start
# ss -tpnl |grep 26379
192.168.110.130
1.修改配置文件
[root@redis3 ~]# vim /usr/local/codis/config/sentinel.conf
#修改为如下内容
port 26379
dir "/tmp"
protected-mode no
daemonize yes
2.启动Sentinel
sentinel部署官方脚本,是根据codis-server启动脚本进行修改
/usr/local/codis/admin/codis-sentinel-admin.sh start
# ss -tpnl |grep 26379
fe界面添加sentinel
点下SYNC,这样配置文件会自动添加如下内容
# 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宕机后是否进行主从切换
[root@redis1 ~]# /usr/local/codis/admin/codis-server-admin.sh stop
/usr/local/codis/admin/../config/redis.conf
stopping codis-server ...
STOPPED
可以看到切换成功了!
[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
[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
[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的性能
/usr/local/codis/redis-benchmark -h 10.0.2.5 -p 19000 -a 123456 -c 500 -n 1000000 -q
再压测单节点的性能
/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信息。
#先登入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命令详解
$ /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信息:具体的信息可以运行该命令
# 查看到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)
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 动态设置日志等级
#codis-admin [-v] --proxy=ADDR [--auth=AUTH] --log-level=LEVEL
codis-admin --proxy=192.168.110.128:11080 --log-level=info
4, 清除Proxy状态
#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内存
#codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc
#控制Proxy内存的释放
codis-admin --proxy=192.168.110.128:11080 --forcegc
6.查看dashboard的配置、model、状态、slots、组和proxy信息:
#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
#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动态设置日志等级
#codis-admin [-v] --dashboard=ADDR --log-level=LEVEL
codis-admin --dashboard=192.168.110.128:18080 --log-level=infoAPI
9,proxy加入到dashboard,并online
#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
#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
#查看该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]
#根据相关信息: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启动后启动。