Redis Codis 部署安装

背景

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

介绍

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

  Codis Twemproxy Redis Cluster
resharding without restarting cluster Yes No Yes
pipeline Yes Yes No
hash tags for multi-key operations Yes Yes Yes
multi-key operations while resharding Yes - No(details)
Redis clients supporting Any clients Any clients Clients have to support cluster protocol


环境

机器前端

服务java

端口node

端口说明linux

依赖git

192.168.163.131/132/133(Ubuntu 16.04)github

Codisweb

7021/7022redis

server端口:主/从(三台)

GO

11080

proxy管理端口(三台)

18080

dashboard管理端口(一台)

10890

fe管理端口(一台)

192.168.163.131/132/133(Ubuntu 16.04)

zookeeper

2181

zk客户端监听端口(三台)

JDK

2888

zk内部通信端口(三台)

3888

zk选举端口(三台)

Codis 组件说明

  • Codis Server:基于 redis-3.2.8 分支开发。增长了额外的数据结构,以支持 slot 有关的操做以及数据迁移指令。具体的修改能够参考文档 redis 的修改

  • 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 可自行扩展。

 各个组件之间的关系:

客户端经过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: wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
 #zookeeper: wget http://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

安装:

安装依赖包:apt-get install gcc make autoconf libtool automake

1)zookeeper安装

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

#jdk: sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
1:解压: tar -xf zookeeper-3.4.12.tar.gz mv zookeeper-3.4.12 /usr/local/zookeeper 2:编辑配置文件: cd /usr/local/zookeeper/conf cp 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. # do not use /tmp for storage, /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 if you need to handle more 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
View Code

配置文件说明:

  • 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/data mkdir -p /data/zookeeper/log

设置环境变量:

vim /etc/profile #添加 # ZooKeeper Env export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin #应用环境变量 source /etc/profile

① 单机模式

zoo.cfg配置文件:

tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/log clientPort=2181

启动: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.cfg Mode: standalone

关闭:zkServer.sh stop

root@test1:~# zkServer.sh stop ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Stopping zookeeper ... STOPPED

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

② 集群模式(3台)

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

tickTime=2000 initLimit=10 syncLimit=5 dataDir=/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:3888 server.2=192.168.163.132:2888:3888 server.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=1

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

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

echo "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.cfg Mode: leader root@test2:~# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower root@test3:~# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower

关闭:zkServer.sh stop

root@test2:~# zkServer.sh stop ZooKeeper JMX enabled by default Using 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 添加: ##go 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.3 linux/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 port 7021 daemonize yes pidfile /var/lib/redis_7021/redis_7021.pid logfile "/var/lib/redis_7021/redis_7021.log" dbfilename 7021dump.rdb dir /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实例,端口为:702一、7022,没有作主从。为了防止单点的问题,能够交错的设置主从,防止一台服务器挂掉,codis-server不可用。

Group
1 192.168.163.131:7021 192.168.163.132:7022
2 192.168.163.132:7021 192.168.163.133:7022
3 192.168.163.133:7021 192.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_addr RESTful 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_addr RESTful API 端口
proto_type Redis 端口类型,接受 tcp/tcp4/tcp6/unix/unixpacket
proxy_addr Redis 端口地址或者路径
jodis_addr Jodis 注册 zookeeper 地址
jodis_timeout Jodis 注册 session timeout 时间,单位 second
jodis_compatible Jodis 注册 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 启动后,处于 waiting online 状态(日志查询),监听 proxy_addr 地址,可是不会 accept 链接,添加到集群并完成集群状态的同步,才能改变状态为 online。添加的方法有如下两种:

  • 经过 codis-fe 添加:经过 Add Proxy 按钮,将 admin_addr 加入到集群中;⑤以后。
  • 经过 codis-admin 命令行工具添加,方法以下:
    codis-admin --dashboard=192.168.163.131:18080 --create-proxy -x 192.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 | tee codis.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)。



其中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
1 192.168.163.131:7021 192.168.163.132:7022

 

 

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

注意:点了PROMOTE以后,slave会被提高为master,可是老的master须要手动点才能对新主进行同步。

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

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

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

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

上面的图能够看到slots的分布信息,也能够经过condis-admin进行查询:

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

迁移Slots:

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

在迁移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 -h 192.168.163.132 -p 19000 #随便连一个Proxy 192.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添加:

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

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

192.168.163.131:19000> get age (error) ERR handle response, backend conn reset 192.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进行数据迁移,如:

迁移过程当中,正在迁移的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
View Code

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

1. 查看Proxy的配置、model、状态、slots信息:具体的信息能够运行该命令
codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|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 启动后,处于 waiting online 状态的,须要改为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:18080 stats 包括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 from 192.168.163.132:42772 [] admin exit on error # codis-admin --dashboard=192.168.163.131:18080 --reload 修改dashboard以后,从新加载配置 API call /api/topom/reload/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132:42778 []

8. dashboard动态设置日志等级

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

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

9. proxy加入到dashboard,并online

codis-admin [-v] --dashboard=ADDR --create-proxy --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080 --create-proxy --addr=192.168.163.131:11080 proxy加入到dashboard中 [WARN] [0xc4202d17a0]  API call /api/topom/proxy/create/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131:11080 from 192.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 from 192.168.163.131:57976 [] [WARN] [0xc4200be790] API call /api/proxy/sentinels/f6eadfec468df5b262af66e292a27699 from 192.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 from 192.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 from 192.168.163.131:59242 [] [WARN] [0xc4200c68f0] API call /api/proxy/sentinels/00d4e51e15eb811441ad228e44550b81 from 192.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/1 from 192.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/1 from 192.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:7021 group1里添加一个redis-server [WARN] [0xc4202d17a0] API call /api/topom/group/add/4c0ca749efb5aad2b20b8d84b1bb6905/1/192.168.163.131:7021 from 192.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:7021 from 192.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/1 from 192.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/0 from 192.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/11 from 192.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/0 from 192.168.163.132:43936 [] [WARN] set action disabled = false 开启slots迁移 [WARN] [0xc4202d17a0] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/1 from 192.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] => 12
done # 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:10086 from 192.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/0 from 192.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 from 192.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:10086 192.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:2181
2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:2181
2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - Connected to 127.0.0.1:2181
2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - Authenticated: id=144120780119670793, timeout=40000
2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect [ { "name": "codis-testX", "dashboard": "192.168.163.131:18080" } ] 2018/11/12 17:36:15 zkclient.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:2181

2018/11/12 17:40:34 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:2181
2018/11/12 17:40:34 zkclient.go:23: [INFO] zookeeper - Connected to 127.0.0.1:2181
2018/11/12 17:40:34 zkclient.go:23: [INFO] zookeeper - Authenticated: id=144120780119670794, timeout=40000
2018/11/12 17:40:34 zkclient.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 | tee codis_v3.0.json 该命令会将 Codis 2.x 版本的配置文件中有效信息提取出来,并转成 Codis 3.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:2181
2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:2181
2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Connected to 127.0.0.1:2181
2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Authenticated: id=216173149807312897, timeout=40000
2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect 2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Recv loop terminated: err=EOF 

总结

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

相关文章
相关标签/搜索