Codis-集群部署

背景

关于Redis的高可用除了只身的SentinelCluster之外,还有一个用的比较多的是Codis,由于公司的Redis大部分都使用Codis,本文就针对Codis进行相关的安装部署进行说明,来好好的认识Codis

介绍

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

环境

image.png

Codis 组件说明


Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档[redis 的修改](https://github.com/CodisLabs/codis/blob/release3.2/doc/redis_change_zh.md)。

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

对于同一个业务集群而言,可以同时部署多个 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 可自行扩展。

各个组件之间的关系:

image

客户端通过zk提供的信息访问Proxy,Proxy是无状态的,按照需要可以部署多个。通过Proxy访问多个Group(Server),Server的HA通过Sentinel来保证。更多的信息可以参考官方文档

Codis主要由以下特点

可以无缝迁移到codis,自带迁移工具

可以动态扩容和缩容

多业务完全透明,业务不知道运行的是codis

支持多核心CPU,twemproxy只能单核

codis是中心基于proxy的设计,是客户端像连接单机一样操作proxy

有部分命令不能支持,比如keys *等

支持group划分,组内可以设置一个主多个从,通过sentinel 监控redis主从,当主down了自动将从切换为主

设置的进程要最大等于CPU的核心,不能超过CPU的核心数

其依赖于zookeeper,里面保存的key是redis主机位置,因此zookeeper要做高可用

监控可以使用接口和dashboard

下载安装

安装包下载:


go:wgethttps://dl.google.com/go/go1.10.3.linux-amd64.tar.gz#zookeeper:wgethttp://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz#codis:

git clone https://github.com/CodisLabs/codis.git -b release3.2

安装:

安装依赖包:

CentOS : apt-get install gcc make autoconf libtool automake
Ubuntu: yum install gcc make autoconf libtool automake

1)[zookeeper安装]:

zookeeper依赖JDK,需要先安装JDK:


1:解压:tar-xf zookeeper-3.4.12.tar.gz mvzookeeper-3.4.12/usr/local/zookeeper2:编辑配置文件:

cd /usr/local/zookeeper/confcp zoo_sample.cfg zoo.cfg

配置文件(zoo.cfg)见下面

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.

# donot use /tmpforstorage, /tmp here is just

# example sakes.

dataDir=/tmp/zookeeper

# the port at which the clients will connect

clientPort=2181# the maximum number of client connections.

# increase this ifyou need to handlemore clients

#maxClientCnxns=60#

# 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

配置文件说明:

tickTime: ZooKeeper 中使用的基本时间单元, 以毫秒为单位, 默认值是 2000。它用来调节心跳和超时。例如, 默认的会话超时时间是两倍的 tickTime。

initLimit: 默认值是 10, 即 tickTime 属性值的 10 倍。它用于配置允许 followers 连接并同步到 leader 的最大时间。如果 ZooKeeper 管理的数据量很大的话可以增加这个值。

syncLimit: 默认值是 5, 即 tickTime 属性值的 5 倍。它用于配置leader 和 followers 间进行心跳检测的最大延迟时间。如果在设置的时间内 followers 无法与 leader 进行通信, 那么 followers 将会被丢弃。

dataDir: ZooKeeper 用来存储内存数据库快照的目录, 并且除非指定其它目录, 否则数据库更新的事务日志也将会存储在该目录下。建议配置 dataLogDir 参数来指定 ZooKeeper 事务日志的存储目录。

dataLogDir:log目录,不设置则默认和数据目录相同

clientPort: 服务器监听客户端连接的端口, 也即客户端尝试连接的端口, 默认值是 2181。

maxClientCnxns: 在 socket 级别限制单个客户端与单台服务器之前的并发连接数量, 可以通过 IP 地址来区分不同的客户端。它用来防止某种类型的 DoS 攻击, 包括文件描述符耗尽。默认值是 60。将其设置为 0 将完全移除并发连接数的限制。

autopurge.snapRetainCount: 配置 ZooKeeper 在自动清理的时候需要保留的数据文件快照的数量和对应的事务日志文件, 默认值是 3。

autopurge.purgeInterval: 和参数 autopurge.snapRetainCount 配套使用, 用于配置 ZooKeeper 自动清理文件的频率, 默认值是 1, 即默认开启自动清理功能, 设置为 0 则表示禁用自动清理功能。

创建需要的目录:

mkdir-p /data/zookeeper/datamkdir-p /data/zookeeper/log

设置环境变量:

vim /etc/profile

添加

export ZOOKEEPER_HOME=/usr/local/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

应用环境变量

source /etc/profile

① 单机模式

zoo.cfg配置文件:

tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/data

dataLogDir=/data/zookeeper/log

clientPort=2181

**启动:zkServer.sh start**

root@test1:~#**zkServer.sh**** start**ZooKeeper JMX enabled by defaultUsing config:/usr/local/zookeeper/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

查看状态:zkServer.sh status

root@test1:~#**zkServer.sh**** status**ZooKeeper JMX enabled by defaultUsing config:/usr/local/zookeeper/bin/../conf/zoo.cfgMode:**standalone**

**关闭:zkServer.sh stop**

root@test1:~#**zkServer.sh**** stop**ZooKeeper JMX enabled by defaultUsing config:/usr/local/zookeeper/bin/../conf/zoo.cfg

Stopping zookeeper ... STOPPED

注意:在单机模式中, Mode 的值是 "standalone"。

② 集群模式(3台)

zoo.cfg配置文件:对比单机模式多了server.ID

tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/data

dataLogDir=/data/zookeeper/log

clientPort=2181

#要是一台装三个zk,可以按照端口区分:192.168.163.131:2887:3887/192.168.163.132:2887:3887/192.168.163.133:2887:3887

server.1=192.168.163.131:2888:3888server.2=192.168.163.132:2888:3888server.3=192.168.163.133:2888:3888

**注意:**2888表示zookeeper监听端口,3888表示zookeeper选举通信端口;以上server.1 server.2 server.3都要配置到三台zookeeper的zoo.cfg文件。

配置说明:

集群模式中, 集群中的每台机器都需要感知其它机器, 在 zoo.cfg 配置文件中, 可以按照如下格式进行配置, 每一行代表一台服务器配置:**server.id=host:port:port**

id 被称为 Server ID, 用来标识服务器在集群中的序号。同时每台 ZooKeeper 服务器上, 都需要在数据目录(即 dataDir 指定的目录) 下创建一个 myid 文件, 该文件只有一行内容, 即对应于每台服务器的Server ID。

ZooKeeper 集群中, 每台服务器上的 zoo.cfg 配置文件内容一致。

server.1 的 myid 文件内容就是 "1"。每个服务器的 myid 内容都不同, 且需要保证和自己的 zoo.cfg 配置文件中 "server.id=host:port:port" 的 id 值一致。

id 的范围是 1 ~ 255。

创建myid文件:设置zookeeper的id,和server.ID对应。

在 dataDir 指定的目录下 (即 /data/zookeeper/data 目录) 创建名为 myid 的文件, 文件内容和 zoo.cfg 中当前机器的 id 一致。根据上述配置, master 的 myid 文件内容为 1。

按照相同步骤, 为 132 和 133 配置 zoo.cfg 和 myid 文件。zoo.cfg文件内容相同, 132 的 myid 文件内容为 2, 133 的 myid 文件内容为 3。

#在第1台zookeeper(192.168.163.131)上设置id=1echo"1">/data/zookeeper/data/myid

#在第2台zookeeper(192.168.163.132)上设置id=2echo"2">/data/zookeeper/data/myid

#在第3台zookeeper(192.168.163.133)上设置id=3echo"3">/data/zookeeper/data/myid

三台启动:zkServer.sh start

root@test1:~# zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

三台查看状态:zkServer.sh status

root@test1:~# zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode:**leader**root@test2:~# zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode:**follower**root@test3:~# zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode:**follower**

关闭:zkServer.sh stop

root@test2:~#**zkServer.sh**** stop**ZooKeeper JMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfg

Stopping zookeeper ... STOPPED

**到此Zookeeper安装完毕。**

2)Codis安装:

安装go环境,codis基于go开发:

解压:

sudo tar-C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

设置环境变量:

vim /etc/profile

添加:

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

用于安装codis的目录

export GOPATH=/opt/gowork 
mkdir-p /opt/gowork

生效环境变量:

source /etc/profile

验证:

root@test2:~# go version

go version go1.10.3linux/amd64

创建需要的文件目录:

mkdir/opt/gowork

以上go的依赖环境已经安装完毕,开始安装Codis。

#创建目录
mkdir -p /opt/gowork/src/github.com/CodisLabs
#git clone迁移
mv codis /opt/gowork/src/github.com/CodisLabs/
#进入目录
cd /opt/gowork/src/github.com/CodisLabs/codis

编译

make
make gotest

编译安装完毕之后先设置一个软连接:

ln-s /opt/gowork/src/github.com/CodisLabs/codis/ /usr/local/codis

再设置环境变量:

vim /etc/profile

# Codis
export CODIS_HOME=/usr/local/codis
export PATH=$PATH:$CODIS_HOME/bin

应用环境变量

source /etc/profile

配置启动Codis

① 新建目录专门存放codis的配置(包括在一台上安装(131)dashboard、proxy、fe等相关服务进程的配置)
mkdir-p /etc/codis/codis-dashboard
mkdir-p /etc/codis/codis-proxy (三台)
mkdir-p /etc/codis/codis-server (一台)
mkdir-p /etc/codis/codis-fe
mkdir–p /etc/codis/codis-ha

② 新建codis-server(redis):三台上都安装

cp/usr/local/codis/extern/redis-3.2.11/redis.conf /etc/codis/codis-server/redis7021.conf

修改redis7021.conf:

# bind  127.0.0.1

**protected-mode no**port7021daemonize yes

pidfile /var/lib/redis_7021/redis_7021.pid

logfile "/var/lib/redis_7021/redis_7021.log"dbfilename 7021dump.rdbdir/var/lib/redis_7021/appendfilename "7021appendonly.aof"

###创建配置文件里所需的目录:

mkdir/var/lib/redis_7021

再新建一个codis-server:

cd /etc/codis/codis-server
cp redis7021.conf redis7022.conf 
sed-i"s/7021/7022/g" redis7022.conf 
mkdir/var/lib/redis_7022

开启codis-server:

codis-server /etc/codis/codis-server/redis7021.conf
codis-server /etc/codis/codis-server/redis7022.conf
说明:每台机器上有2个codis-server实例,端口为:7021、7022,没有做主从。为了防止单点的问题,可以交错的设置主从,防止一台服务器挂掉,codis-server不可用。

Group主从


1192.168.163.131:7021192.168.163.132:7022

2192.168.163.132:7021192.168.163.133:7022

3192.168.163.133:7021192.168.163.131:7022

通过codis-fe添加各个Group节点:需要先开启codis-dashboard和codis-fe,在之后操作。

③ 配置[codis-dashboard](一台)

cd /etc/codis/codis-dashboard/
cp/usr/local/codis/config/dashboard.toml  /etc/codis/codis-dashboard/

修改配置:vim /etc/codis/codis-dashboard/dashboard.toml

##################################################
#                                                #
#          Codis-Dashboard          #
#                                                #
##################################################

# Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".
# for zookeeper/etcd, coorinator_auth accept "user:password" 
# Quick Start
#coordinator_name = "filesystem"
#coordinator_addr = "/tmp/codis"
coordinator_name = "zookeeper"
coordinator_addr = "192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181"  #zk地址,多个逗号隔开
#coordinator_auth = ""

# Set Codis Product Name/Auth.
product_name = "codis-testX" #集群名称
product_auth = ""  #集群密码

# Set bind address for admin(rpc), tcp only.
admin_addr = "192.168.163.131:18080" restful api地址,

# Set arguments for data migration (only accept 'sync' & 'semi-async').
migration_method = "semi-async"
migration_parallel_slots = 100
migration_async_maxbulks = 200
migration_async_maxbytes = "32mb"
migration_async_numkeys = 500
migration_timeout = "30s"

# Set configs for redis sentinel.
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 = ""

参数说明

coordinator_name外部存储类型,接受 zookeeper/etcd

coordinator_addr外部存储地址

product_name集群名称,满足正则\w[\w\.\-]*

product_auth集群密码,默认为空

admin_addrRESTful API 端口

创建codis日志目录(存放codis所有log):

mkdir/usr/local/codis/logs

[启动] codis-dashboard服务:(一台)

codis-dashboard --ncpu=1--config=/etc/codis/codis-dashboard/dashboard.toml --log=/usr/local/codis/logs/dashboard.log --log-level=warn &
参数说明:

##--ncpu=N 最大使用 CPU 个数;

##-c  CONF, --config=CONF 指定启动配置文件;

##-l  FILE, --log=FILE 设置 log 输出文件;

##--log-level=LEVEL 设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN;

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

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

**关闭**codis-dashboard服务:

codis-admin --dashboard=192.168.163.131:18080--shutdown

④:配置[codis-proxy](三台):每台配置一个Proxy,也可以一台配置多个Proxy。

注意参数:proxy_max_clients

cd /etc/codis/codis-proxy/cp/usr/local/codis/config/proxy.toml /etc/codis/codis-proxy/

修改配置:vim /etc/codis/codis-proxy/proxy.toml

##################################################
#                                                #
#                  Codis-Proxy                   #
#                                                #
##################################################

# Set Codis Product Name/Auth.
product_name = "codis-testX"  #和dashboard对应
product_auth = ""

# 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 = ""

# Set bind address for admin(rpc), tcp only.
admin_addr = "192.168.163.131:11080"  #同一台服务器可以根据端口创建多个Proxy

# Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
proto_type = "tcp4"
proxy_addr = "192.168.163.131:19000"  #同一台服务器可以根据端口创建多个Proxy

# 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 = "192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181"
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = false


...

参数说明:


product_name集群名称,参考 dashboard 参数说明

product_auth集群密码,默认为空

admin_addrRESTful API 端口

proto_typeRedis 端口类型,接受 tcp/tcp4/tcp6/unix/unixpacket

proxy_addrRedis 端口地址或者路径

jodis_addrJodis 注册 zookeeper 地址

jodis_timeoutJodis 注册 session timeout 时间,单位 second

jodis_compatibleJodis 注册 zookeeper 的路径

backend_ping_period与 codis-server 探活周期,单位 second,0 表示禁止

session_max_timeout与 client 连接最大读超时,单位 second,0 表示禁止

session_max_bufsize与 client 连接读写缓冲区大小,单位 byte

session_max_pipeline与 client 连接最大的 pipeline 大小

session_keepalive_period与 client 的 tcp keepalive 周期,仅 tcp 有效,0 表示禁止

[启动]codis-proxy服务(三台):

codis-proxy --ncpu=1--config=/etc/codis/codis-proxy/proxy.toml --log=/usr/local/codis/logs/proxy.log --log-level=warn &

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

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

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

codis-admin --dashboard=192.168.163.131:18080--create-proxy -x192.168.163.131:11080

其中192.168.163.131:18080以及192.168.163.131:11080分别为 dashboard 和 proxy 的admin_addr地址;可以在后面的codis-fe里看到

添加过程中,dashboard 会完成如下一系列动作:

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

同步 slots 状态;

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

停止codis-proxy服务:

codis-admin --proxy=192.168.163.131:11080--shutdown

注意:直接kill Proxy进程zk的codis3里会有残留数据,建议codis-admin方式停codis-proxy服务

⑤:配置codis-fe(一台)

配置文件 codis.json 可以手动编辑,也可以通过 codis-admin 从外部存储中拉取:

cd /etc/codis/codis-fe/codis-admin --dashboard-list --zookeeper=192.168.163.131:2181|teecodis.json

启动codis-fe:

codis-fe --ncpu=1--dashboard-list=/etc/codis/codis-fe/codis.json --listen=192.168.163.131:18090--log=/usr/local/codis/logs/fe.log --log-level=warn --assets-dir=/usr/local/codis/bin/assets/ &

关闭codis-fe:

ps -ef|grep codis-fe|grep -v grep|awk  '{print $2}' |xargs kill

通过codis-fe进行web操作管理:注意在fe上添加的时候需要保证这些进程存在,fe不会自动开启,只是对这些已有进程进行相关操作。

1)添加proxy:地址是配置文件中配置的admin_addr信息,需要先开启codis-proxy(处于waiting online)。

image

其中SYNC表示:更新同步Proxy中的Slots信息,日志如下:

fill slot 0000, backend.addr = 192.168.163.133:7021, locked = false
fill slot 0001, backend.addr = 192.168.163.133:7021, locked = false
fill slot 0002, backend.addr = 192.168.163.133:7021, locked = false
fill slot 0003, backend.addr = 192.168.163.133:7021, locked = false

...

2)添加Group:本文说明的Group就是一主一从的环境,当然也可以一主多从。在上面介绍codis-server中,只是开启了实例,没有做主从关系。现在通过codis-fe来进行主从关系的创建,添加group:

Group主从

1192.168.163.131:7021192.168.163.132:7022

需要注意的是在fe上添加,组内默认第一个Server是master

image

注意:点了PROMOTE之后,slave会被提升为master,但是老的master需要手动点

才能对新主进行同步。

按照上面继续添加GROUP 2和3,最终图的结果为:

image

通过codis-fe已经把codis-server(redis)已经添加并自动做了主从复制。

3)初始化Slots:进行到这步的时候整个codis集群已经搭建完毕,最后只需要把Slots初始和分配下就可以使用了。

image

把0 - 300的slots分配给Group1,301 - 800的slots分配给Group2,801 - 1023的slots分配给Group3,最终结果图如下:

image

上面的图可以看到slots的分布信息,也可以通过condis-admin进行查询:

codis-admin --dashboard=192.168.163.131:18080--slots-status

迁移Slots:

image

从Group1迁移10个slots到Group3,操作完之后的结果图:

image

在迁移Slots时候的zk的操作信息如下:

2018/07/03 12:54:09 zkclient.go:272: [DEBUG] zkclient update node /codis3/codis-testX/slots/slot-0008
2018/07/03 12:54:09 zkclient.go:280: [DEBUG] zkclient update OK

到这里,codis的集群安装和初始化完毕,可以正常提供服务器了,不过这里还有个情况就是主Codis-Server挂了:

模拟Group1的主挂掉,通过Proxy连上去看看查询到整个Group的Slots会怎么样:
root@test1:~# redis-cli -h192.168.163.132-p19000 #随便连一个Proxy192.168.163.133:19000>get age(error)**ERR handle response**, backend conn reset

HA如何保证?那就继续HA的部署说明。

⑥:配置启动codis-ha

codis-ha --log=/usr/local/codis/logs/ha.log --log-level=warn --dashboard=192.168.163.131:18080&

注意:codis-ha启动之后,主挂掉虽然可以把从切换成主,但是老主再次启动会被codis-ha关闭(开不起来,除非关掉codis-ha),关闭掉codis-ha之后,还需要重新在codis-fe上添加这个老主进行同步,这个对于主从非常不友好,不推荐使用。还是使用Sentinel来替代codis-ha。

⑦:配置Sentinel 3个节点(三台都安装),来替换codis-ha。sentinel的说明可以参考Redis 复制、Sentinel的搭建和原理说明

注意:codis是通过sentinel来保证每个group下的Redis主从高可用,并且在codis-fe上配置的Sentinel是监控所有主机的,不需要单独配置监控的主,codis集群会自动添加。

建立所需的目录:

mkdir-p /var/lib/sentinel

修改配置文件:

cp /usr/local/codis/extern/redis-3.2.11/sentinel.conf /etc/codis/codis-server/

vim /etc/codis/codis-server/sentinel.conf
port 10086

dir "/var/lib/sentinel"

logfile "/var/lib/sentinel/sentinel.log"

daemonize yes

protected-mode no

不需要启用其他的Sentinel开头的这些参数,codis-fe会自动发现处理。

开启Sentinel,三台保持一致即可:

codis-server /etc/codis/codis-server/sentinel.conf --sentinel

添加到集群(dashboard):命令行模式

codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.131:10086

codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.132:10086

codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.133:10086

通过codis-fe添加:

image

该3个节点的Sentinel,监听着三组Group,即三个主从。最后一列表示从codis-fe上删除。添加完毕之后,在codis-fe上的Group中可以看到状态发生了改变:主上多了一个[HA]标识。

image

模拟Group1的主挂掉,通过Proxy连上去看看查询到整个Group的Slots会怎么样:

192.168.163.131:19000> get age

(error) ERR handle response, backend conn reset192.168.163.131:19000> get age"1233"

说明:当Group1的主被shutdown之后,Sentinel经过选举,选择新主(选举时间可配置)提供服务,选举期间该Group不可访问。老主启动后,Sentinel会自动的把老主slaveof 到新的主,形式主从集群,codis-fe不需要做主从同步的操作。最后出现“OUT OF SYNC”的标志,只需要手动SYNC下就可以了。另外说明下,如果codis-server添加了密码,则需要在codis相关组件的配置文件中的auth相关参数里添加密码

扩容:如果Group1集群内存不足,需要扩容,则添加一个Group2集群,对指定数量的slots进行数据迁移,如:

image

迁移过程中,正在迁移的key可以访问(通过Proxy进行访问),不影响业务使用。

Codis-admin的使用

上面介绍的都是基于fe的web管理界面操作的,那如何通过命令行来实现呢?这时可以看下Codis-admin就派上用场了:

root@test1:~# 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

现在来逐一查看codis-admin实现的功能:

1. 查看Proxy的配置、model、状态、slots信息:具体的信息可以运行该命令
# codis-admin --proxy=192.168.163.132:11080 config
查看到proxy.toml的内容,如:proxy、zk、连接数等等

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

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

# codis-admin --proxy=192.168.163.132:11080 slots
查看Slots信息:slot在哪个group,后端Redis Server地址
2. 开启关闭Proxy:这里的开启是值进入online状态。按照上面介绍的,开启codis-proxy 启动后,处于waitingonline 状态的,需要改成online状态进入zk(jodis)

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


# codis-admin --proxy=192.168.163.132:11080 --start 
日志中 proxy waiting online ... 会变成 proxy is working ...
并且注册到zk的jodis目录里:
API call /api/proxy/start/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.132:52426 []
jodis create node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530

# codis-admin --proxy=192.168.163.132:11080 --shutdown
日志里记录关闭Proxy再把信息从zk里删除,最后再退出。
API call /api/proxy/shutdown/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.132: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.163.132:11080 --log-level=info
日志里记录:
API call /api/proxy/loglevel/003acf3b450ebe66f56b8af4cc9c7d2d/INFO from 192.168.163.132:52432 []
set loglevel to INFO
4. 清除Proxy状态
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --reset-stats

# codis-admin --proxy=192.168.163.132:11080 --reset-stats
 API call /api/proxy/stats/reset/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.133:57436 []
清除Proxy的QPS、OPS、Fail、Errors等Commands信息
5. 强制清理Proxy内存
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc

# codis-admin --proxy=192.168.163.132:11080 --forcegc
 API call /api/proxy/forcegc/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.133:57437 []
控制Proxy内存的释放
6. 查看dashboard的配置、model、状态、slots、组和proxy信息:
codis-admin [-v] --dashboard=ADDR [config|model|stats|slots|group|proxy]

# codis-admin --dashboard=192.168.163.131:18080 config

查看dashboard的配置,即dashboard.toml配置的信息

# codis-admin --dashboard=192.168.163.131:18080 model

查看model信息   

# codis-admin --dashboard=192.168.163.131:18080stats包括slot和group的对应信息,group信息(group后端的server以及server的配置),proxy信息(sentinel信息、server信息、server主信息以及proxy CPU和内存使用情况),

slots信息(迁移间隔、迁移状态),sentine信息(配置、状态),主server信息# codis

-admin --dashboard=192.168.163.131:18080 slots

slot和group的对应信息

# codis-admin --dashboard=192.168.163.131:18080 group

组信息,组下server的配置信息

# codis-admin --dashboard=192.168.163.131: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.163.131:18080--shutdown

关闭dashboard,清除zk里的topom

API call /api/topom/shutdown/4c0ca749efb5aad2b20b8d84b1bb6905 from192.168.163.132:42772 []

admin exit on error

# codis-admin --dashboard=192.168.163.131:18080--reload

修改dashboard之后,重新加载配置

API call /api/topom/reload/4c0ca749efb5aad2b20b8d84b1bb6905 from192.168.163.132:42778[]
8. dashboard动态设置日志等级
codis-admin [-v] --dashboard=ADDR --log-level=LEVEL

# codis-admin --dashboard=192.168.163.131:18080--log-level=infoAPI call /api/topom/loglevel/4c0ca749efb5aad2b20b8d84b1bb6905/INFO from192.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.163.131:18080--create-proxy --addr=192.168.163.131:11080proxy加入到dashboard中

[WARN] [0xc4202d17a0]  API call /api/topom/proxy/create/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131:11080from192.168.163.132:42824 []

[WARN] create proxy-[1d24e313bee99f26174110c009714530]

...
10. proxy online初始化1024个槽,codis-admin [-v] --dashboard=ADDR --online-proxy --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080--online-proxy --addr=192.168.163.133:11080#proxy online

[WARN] [0xc4200be790] API call /api/proxy/start/f6eadfec468df5b262af66e292a27699 from192.168.163.131:57976 []

[WARN] [0xc4200be790] API call /api/proxy/sentinels/f6eadfec468df5b262af66e292a27699 from192.168.163.131:57976 []

[WARN] [0xc4200be790] set sentinels = []
11. 查看proxy 列表,codis-admin [-v] --dashboard=ADDR --list-proxy
# codis-admin --dashboard=192.168.163.131:18080--list-proxy

查看该dashboard下的proxy列表和信息
12. 移除proxy,codis-admin [-v] --dashboard=ADDR --remove-proxy (--addr=ADDR|--token=TOKEN|--pid=ID) [--force]
# codis-admin --dashboard=192.168.163.131:18080--remove-proxy --addr=192.168.163.133:11081

根据相关信息:ip、token、pid等移除proxy

[WARN] [0xc4200be790] API call /api/proxy/shutdown/f6eadfec468df5b262af66e292a27699 from192.168.163.131:58144 []

[WARN] [0xc4200be790] proxy shutdown

[WARN] [0xc4200be790] admin shutdown

[WARN] jodis remove node /jodis/codis-testX/proxy-697e01c6c8b8aaf399599992e7108d35

[WARN] [0xc4200be790] proxy is exiting ...
13. reinit proxy:codis-admin [-v] --dashboard=ADDR --reinit-proxy (--addr=ADDR|--token=TOKEN|--pid=ID|--all) [--force]
# codis-admin --dashboard=192.168.163.131:18080--reinit-proxy --addr=192.168.163.132:11080初始化slots(1024)

[WARN] [0xc4200c68f0] API call /api/proxy/start/00d4e51e15eb811441ad228e44550b81 from192.168.163.131:59242 []

[WARN] [0xc4200c68f0] API call /api/proxy/sentinels/00d4e51e15eb811441ad228e44550b81 from192.168.163.131:59242 []

[WARN] [0xc4200c68f0] set sentinels = []
14 .获取proxy的信息:管理、代理端口。
# codis-admin --dashboard=192.168.163.131:18080--proxy-status

[ ] proxy-1[T] 4f07158ae347d67b1af825fd8e84b2f9 [A]192.168.163.131:11080[P]192.168.163.131:19000[ ] proxy-2[T] 1d24e313bee99f26174110c009714530 [A]192.168.163.132:11080[P]192.168.163.132:19000[ ] proxy-3[T] cfa02d4002da74e6b1f3b51f1416aa1d [A]192.168.163.133:11080[P]192.168.163.133:19000
15. 查看group列表。codis-admin [-v] --dashboard=ADDR --list-group
# codis-admin --dashboard=192.168.163.131:18080--list-group

查看group列表
16. 创建group。codis-admin [-v] --dashboard=ADDR --create-group --gid=ID
# codis-admin --dashboard=192.168.163.131:18080--create-group --gid=1创建一个group

[WARN] [0xc4202d17a0] API call /api/topom/group/create/4c0ca749efb5aad2b20b8d84b1bb6905/1from192.168.163.132:43114 []

[WARN] create group-[1]:

{

    "id":1,

    "servers": [],

    "promoting": {},

    "out_of_sync":false}
17. 移除group。codis-admin [-v] --dashboard=ADDR --remove-group --gid=ID
# codis-admin --dashboard=192.168.163.131:18080--remove-group --gid=1删除一个group

[WARN] [0xc4202d17a0] API call /api/topom/group/remove/4c0ca749efb5aad2b20b8d84b1bb6905/1from192.168.163.132:43116 []

[WARN] remove group-[1]:

{

    "id":1,

    "servers": [],

    "promoting": {},

    "out_of_sync":false}

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

# codis-admin --dashboard=192.168.163.131:18080--group-add --gid=1--addr=192.168.163.131:7021group1里添加一个redis-server

[WARN] [0xc4202d17a0] API call /api/topom/group/add/4c0ca749efb5aad2b20b8d84b1bb6905/1/192.168.163.131:7021from192.168.163.132:43130 []

[WARN] update group-[1]:

{

    "id":1,

    "servers": [

        {

            "server":"192.168.163.131:7021",

            "datacenter":"",

            "action": {},

            "replica_group":false        }

    ],

    "promoting": {},

    "out_of_sync":false}
19. group里删除server。codis-admin [-v] --dashboard=ADDR --group-del --gid=ID --addr=ADDR [--datacenter=DATACENTER]
# codis-admin --dashboard=192.168.163.131:18080--group-del --gid=1--addr=192.168.163.132:7021删除group里的server

[WARN] [0xc4202d17a0] API call /api/topom/group/del/4c0ca749efb5aad2b20b8d84b1bb6905/1/192.168.163.132:7021from192.168.163.132:43140 []

[WARN] update group-[1]:

{

    "id":1,

    "servers": [

        {

            "server":"192.168.163.131:7021",

            "datacenter":"",

            "action": {},

            "replica_group":false        }

    ],

    "promoting": {},

    "out_of_sync":false}
20. 每个group事一个M-S结构的集群,设置每个group的复制关系:codis-admin [-v] --dashboard=ADDR --replica-groups --gid=ID --addr=ADDR (--enable|--disable)
# codis-admin --dashboard=192.168.163.131:18080--replica-groups--gid=13--addr=192.168.163.133:7021--enable

# codis-admin --dashboard=192.168.163.131:18080--replica-groups--gid=13--addr=192.168.163.133:7022--enable

同一个group的2个sever加入复制关系。

[WARN] [0xc4202d17a0] API call /api/topom/group/replica-groups/4c0ca749efb5aad2b20b8d84b1bb6905/13/192.168.163.133:7022/1from192.168.163.132:43440 []

[WARN] update group-[13]:

{

    "id":13,

    "servers": [

        {

            "server":"192.168.163.133:7021",

            "datacenter":"",

            "action": {},

            "replica_group":true        },

        {

            "server":"192.168.163.133:7022",

            "datacenter":"",

            "action": {},

            "replica_group":true        }

    ],

    "promoting": {},

    "out_of_sync":false}
21. 把组里面的第2个server做为从,形成主从关系:codis-admin [-v] --dashboard=ADDR --sync-action --create --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080--sync-action --create --addr=192.168.163.133:7022让组内的第2个server作为从

[WARN] [0xc4202d17a0] API call /api/topom/group/replica-groups/4c0ca749efb5aad2b20b8d84b1bb6905/13/192.168.163.133:7021/0from192.168.163.131:41954[192.168.163.1]

[WARN] update group-[13]:

{

    "id":13,

    "servers": [

        {

            "server":"192.168.163.133:7021",

            "datacenter":"",

            "action": {},

            "replica_group":false        },

        {

            "server":"192.168.163.133:7022",

            "datacenter":"",

            "action": {

                "state":"synced"            },

            "replica_group":true        }

    ],

    "promoting": {},

    "out_of_sync":false}
22. 查看group状态:codis-admin [-v] --dashboard=ADDR --group-status
# codis-admin --dashboard=192.168.163.131:18080--group-status

查看主从复制的关系

[ ] group-11[0]192.168.163.131:7022==> NO:ONE

[ ] group-11[1]192.168.163.131:7021==>192.168.163.131:7022:up

[ ] group-12[0]192.168.163.132:7021==> NO:ONE

[ ] group-12[1]192.168.163.132:7022==>192.168.163.132:7021:up

[ ] group-13[0]192.168.163.133:7021==> NO:ONE

[ ] group-13[1]192.168.163.133:7022==>192.168.163.133:7021:up
23. 提升组里的一个从作为主:codis-admin [-v] --dashboard=ADDR --promote-server --gid=ID --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080--promote-server --gid=13--addr=192.168.163.133:7022让组13的服务器作为一个从库

# codis-admin --dashboard=192.168.163.131:18080--group-status

[ ] group-11[0]192.168.163.131:7022==> NO:ONE

[ ] group-11[1]192.168.163.131:7021==>192.168.163.131:7022:up

[ ] group-12[0]192.168.163.132:7021==> NO:ONE

[ ] group-12[1]192.168.163.132:7022==>192.168.163.132:7021:up

[ ] group-13[0]192.168.163.133:7022==> NO:ONE

[X] group-13[1]192.168.163.133:7021==> 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.163.131:18080--slot-action --create --sid=0--gid=11分配slot0 到group11中

[WARN] [0xc4202d17a0] API call /api/topom/slots/action/create/4c0ca749efb5aad2b20b8d84b1bb6905/0/11from192.168.163.132: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.163.131: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.163.131: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.163.131:18080--slot-action --disabled=0停止slots迁移

[WARN] [0xc4202d17a0] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/0from192.168.163.132:43936 []

[WARN] set action disabled =false开启slots迁移

[WARN] [0xc4202d17a0] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/1from192.168.163.132:43938 []

[WARN] set action disabled =true
28. 平衡slots,各group平分slots,codis-admin [-v] --dashboard=ADDR --rebalance [--confirm]
# codis-admin --dashboard=192.168.163.131:18080--rebalance

[0517,1023] =>12done# codis-admin --dashboard=192.168.163.131:18080--rebalance

nothing changes
29. 添加sentinel,保证高可用。codis-admin [-v] --dashboard=ADDR --sentinel-add --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080--sentinel-add --addr=192.168.163.131:10086添加一台sentinel

[WARN] [0xc4202d17a0] API call /api/topom/sentinels/add/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131:10086from192.168.163.132:43950 []

[WARN] update sentinel:

{

    "servers": [

        "192.168.163.131:10086"    ],

    "out_of_sync":true}

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

# codis-admin --dashboard=192.168.163.131:18080--sentinel-del --addr=192.168.163.133:10086[WARN] [0xc4202d17a0] API call /api/topom/sentinels/del/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.133:10086/0from192.168.163.132:43956 [][WARN] update sentinel:

{

    "servers": [

        "192.168.163.131:10086",

        "192.168.163.132:10086",

        "192.168.163.133:10086"    ],

    "out_of_sync":true}[WARN] update sentinel:

{

    "servers": [

        "192.168.163.131:10086",

        "192.168.163.132:10086"    ],

    "out_of_sync":true}
31. 重新同步,codis-admin [-v] --dashboard=ADDR --sentinel-resync
# codis-admin --dashboard=192.168.163.131:18080--sentinel-resync

如果出现异常,可以尝试resync

[WARN] [0xc4202d17a0] API call /api/topom/sentinels/resync-all/4c0ca749efb5aad2b20b8d84b1bb6905 from192.168.163.132:43988 []

[WARN] update sentinel:

{

    "servers": [

        "192.168.163.131:10086",

        "192.168.163.132:10086"    ],

    "out_of_sync":true}

[WARN] rewatch sentinels = [192.168.163.131:10086192.168.163.132:10086]

[WARN] update sentinel:

{

    "servers": [

        "192.168.163.131:10086",

        "192.168.163.132:10086"    ],

    "out_of_sync":false}
32. 从ZooKeeper或则其他外部存储里里获取dashboard信息,codis-admin [-v] --dashboard-list (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
# codis-admin --dashboard-list --zookeeper=127.0.0.1:21812018/11/1217:36:14zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to127.0.0.1:21812018/11/1217:36:14zkclient.go:23: [INFO] zookeeper - Connected to127.0.0.1:21812018/11/1217:36:14zkclient.go:23: [INFO] zookeeper - Authenticated:id=144120780119670793, timeout=400002018/11/1217:36:14zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect

[

    {

        "name":"codis-testX",

        "dashboard":"192.168.163.131:18080"    }

]2018/11/1217:36:15zkclient.go:23: [INFO] zookeeper - Recv loop terminated: err=EOF
33. 从ZooKeeper或则外部存储里获取集群的信息:slots、proxy、group等。codis-admin [-v] --config-dump --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [-1]
# codis-admin --config-dump --product=codis-testX --zookeeper=127.0.0.1:21812018/11/1217:40:34zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to127.0.0.1:21812018/11/1217:40:34zkclient.go:23: [INFO] zookeeper - Connected to127.0.0.1:21812018/11/1217:40:34zkclient.go:23: [INFO] zookeeper - Authenticated:id=144120780119670794, timeout=400002018/11/1217:40:34zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect

{

slots:

proxy:groups:

}
34. 转换配置文件,codis-admin [-v] --config-convert=FILE
# codis-admin --config-convert codis_v2.0.json |teecodis_v3.0.json

该命令会将 Codis 2.x 版本的配置文件中有效信息提取出来,并转成 Codis3.x 版本的配置文件并输出
35. 应用配置文件,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 --config-restore=codis_v3.0.json --product=codis_v3.0--zookeeper=127.0.0.1:2181--confirm

该命令会将 Codis 3.x 版本的配置文件提交到 /codis3/codis_v3.0 目录下。

选项 --confirm 选项表示确认提交,缺省时该命令仅仅打印配置文件作为调试。
36. 清理残留信息,dashboard或proxy异常退出导致无法重新启动的情况下,可以使用--remove-lock清除zk里lock信息后再次尝试重启。
codis-admin [-v] --remove-lock --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)

# codis-admin --remove-lock --product=codis-testX --zookeeper=127.0.0.1:21812018/11/1218:00:25zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to127.0.0.1:21812018/11/1218:00:25zkclient.go:23: [INFO] zookeeper - Connected to127.0.0.1:21812018/11/1218:00:25zkclient.go:23: [INFO] zookeeper - Authenticated:id=216173149807312897, timeout=400002018/11/1218:00:25zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect2018/11/1218:00:25zkclient.go:23: [INFO] zookeeper - Recv loop terminated: err=EOF

总结

到这里,redis codis 的高可用集群已经搭建完毕,从文中的介绍说明来看,Codis实现了Redis的高可用、动态扩展、对业务层透明以及如何连接。后续进行相关的测试说明。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342