背景

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

介绍

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

  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

环境

机器

服务

端口

端口说明

依赖

192.168.163.131/132/133(Ubuntu 16.04)

Codis

7021/7022

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:https://golang.org/doc/install

  1. #go:
  2. wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
  3.  
  4. #zookeeper:
  5. wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
  6.  
  7. #codis:
  8. git clone https://github.com/CodisLabs/codis.git -b release3.2

安装:

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

1)zookeeper安装

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

  1. #jdk:
  2. sudo add-apt-repository ppa:webupd8team/java
  3. sudo apt-get update
  4. sudo apt-get install oracle-java8-installer
  1. :解压:
  2. tar -xf zookeeper-3.4..tar.gz
  3. mv zookeeper-3.4. /usr/local/zookeeper
  4.  
  5. :编辑配置文件:
  6. cd /usr/local/zookeeper/conf
  7. cp zoo_sample.cfg zoo.cfg
  8.  
  9. 配置文件(zoo.cfg)见下面

zoo.cfg:

  1. # The number of milliseconds of each tick
  2. tickTime=
  3. # The number of ticks that the initial
  4. # synchronization phase can take
  5. initLimit=
  6. # The number of ticks that can pass between
  7. # sending a request and getting an acknowledgement
  8. syncLimit=
  9. # the directory where the snapshot is stored.
  10. # do not use /tmp for storage, /tmp here is just
  11. # example sakes.
  12. dataDir=/tmp/zookeeper
  13. # the port at which the clients will connect
  14. clientPort=
  15. # the maximum number of client connections.
  16. # increase this if you need to handle more clients
  17. #maxClientCnxns=
  18. #
  19. # Be sure to read the maintenance section of the
  20. # administrator guide before turning on autopurge.
  21. #
  22. # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
  23. #
  24. # The number of snapshots to retain in dataDir
  25. #autopurge.snapRetainCount=
  26. # Purge task interval in hours
  27. # Set to "" to disable auto purge feature
  28. #autopurge.purgeInterval=

配置文件说明:

  • 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 则表示禁用自动清理功能。

创建需要的目录:

  1. mkdir -p /data/zookeeper/data
  2. mkdir -p /data/zookeeper/log

设置环境变量:

  1. vim /etc/profile
  2. #添加
  3. # ZooKeeper Env
  4. export ZOOKEEPER_HOME=/usr/local/zookeeper
  5. export PATH=$PATH:$ZOOKEEPER_HOME/bin
  6.  
  7. #应用环境变量
  8. source /etc/profile

① 单机模式

zoo.cfg配置文件:

  1. tickTime=
  2. initLimit=
  3. syncLimit=
  4. dataDir=/data/zookeeper/data
  5. dataLogDir=/data/zookeeper/log
  6. clientPort=

启动:zkServer.sh start

  1. root@test1:~# zkServer.sh start
  2. ZooKeeper JMX enabled by default
  3. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  4. Starting zookeeper ... STARTED

查看状态:zkServer.sh status

  1. root@test1:~# zkServer.sh status
  2. ZooKeeper JMX enabled by default
  3. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  4. Mode: standalone

关闭:zkServer.sh stop

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

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

② 集群模式(3台)

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

  1. tickTime=
  2. initLimit=
  3. syncLimit=
  4. dataDir=/data/zookeeper/data
  5. dataLogDir=/data/zookeeper/log
  6. clientPort=
  1. #要是一台装三个zk,可以按照端口区分:192.168.163.131:2887:3887/192.168.163.132:2887:3887/192.168.163.133:2887:3887
  2. server.=192.168.163.131::
  3. server.=192.168.163.132::
  4. server.=192.168.163.133::

注意: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. #在第1台zookeeper(192.168.163.131)上设置id=
  2.  
  3. echo "" >/data/zookeeper/data/myid
  4.  
  5. #在第2台zookeeper(192.168.163.132)上设置id=
  6.  
  7. echo "" >/data/zookeeper/data/myid
  8.  
  9. #在第3台zookeeper(192.168.163.133)上设置id=
  10.  
  11. echo "" >/data/zookeeper/data/myid

三台启动:zkServer.sh start

  1. root@test1:~# zkServer.sh start
  2. ZooKeeper JMX enabled by default
  3. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  4. Starting zookeeper ... STARTED

三台查看状态:zkServer.sh status

  1. root@test1:~# zkServer.sh status
  2. ZooKeeper JMX enabled by default
  3. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  4. Mode: leader
  5.  
  6. root@test2:~# zkServer.sh status
  7. ZooKeeper JMX enabled by default
  8. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  9. Mode: follower
  10.  
  11. root@test3:~# zkServer.sh status
  12. ZooKeeper JMX enabled by default
  13. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  14. Mode: follower

关闭:zkServer.sh stop

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

到此Zookeeper安装完毕。

2)Codis安装:

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

  1. #解压:
  2. sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
  3. 设置环境变量:
  4. vim /etc/profile
  5. 添加:
  6. ##go
  7. export GOROOT=/usr/local/go
  8. export PATH=$PATH:$GOROOT/bin
  9. #用于安装codis的目录
  10. export GOPATH=/opt/gowork ##mkdir -p /opt/gowork
  11.  
  12. 生效环境变量:
  13. source /etc/profile
  14.  
  15. 验证:
  16. root@test2:~# go version
  17. go version go1.10.3 linux/amd64

创建需要的文件:

  1. mkdir /opt/gowork

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

  1. #创建目录
  2. mkdir -p /opt/gowork/src/github.com/CodisLabs
  3. #git clone迁移
  4. mv codis /opt/gowork/src/github.com/CodisLabs/
  5. #进入目录
  6. cd /opt/gowork/src/github.com/CodisLabs/codis
  7.  
  8. #编译
  9. make
  10. make gotest

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

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

再设置环境变量:

  1. vim /etc/profile
  2. #添加
  3. # Codis
  4. export CODIS_HOME=/usr/local/codis
  5. export PATH=$PATH:$CODIS_HOME/bin
  6.  
  7. #应用环境变量
  8. source /etc/profile

配置启动Codis

① 新建目录专门存放codis的配置(包括在一台上安装(131)dashboard、proxy、fe等相关服务进程的配置)

  1. mkdir -p /etc/codis/codis-dashboard
  2.  
  3. mkdir -p /etc/codis/codis-proxy (三台)
  4.  
  5. mkdir -p /etc/codis/codis-server (一台)
  6.  
  7. mkdir -p /etc/codis/codis-fe
  8.  
  9. mkdir p /etc/codis/codis-ha

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

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

修改redis7021.conf:

  1. # bind 127.0.0.1
    protected-mode no
  2. port
  3. daemonize yes
  4. pidfile /var/lib/redis_7021/redis_7021.pid
  5. logfile "/var/lib/redis_7021/redis_7021.log"
  6. dbfilename 7021dump.rdb
  7. dir /var/lib/redis_7021/
  8. appendfilename "7021appendonly.aof"

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

  1. mkdir /var/lib/redis_7021

再新建一个codis-server:

  1. cd /etc/codis/codis-server
  2.  
  3. cp redis7021.conf redis7022.conf
  4.  
  5. sed -i "s/7021/7022/g" redis7022.conf
  6.  
  7. mkdir /var/lib/redis_7022

开启codis-server:

  1. codis-server /etc/codis/codis-server/redis7021.conf
  2. codis-server /etc/codis/codis-server/redis7022.conf

说明:每台机器上有2个codis-server实例,端口为:7021、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(一台)

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

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

  1. ##################################################
  2. # #
  3. # Codis-Dashboard #
  4. # #
  5. ##################################################
  6.  
  7. # Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".
  8. # for zookeeper/etcd, coorinator_auth accept "user:password"
  9. # Quick Start
  10. #coordinator_name = "filesystem"
  11. #coordinator_addr = "/tmp/codis"
  12. coordinator_name = "zookeeper"
  13. coordinator_addr = "192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181" #zk地址,多个逗号隔开
  14. #coordinator_auth = ""
  15.  
  16. # Set Codis Product Name/Auth.
  17. product_name = "codis-testX" #集群名称
  18. product_auth = "" #集群密码
  19.  
  20. # Set bind address for admin(rpc), tcp only.
  21. admin_addr = "192.168.163.131:18080" restful api地址,
  22.  
  23. # Set arguments for data migration (only accept 'sync' & 'semi-async').
  24. migration_method = "semi-async"
  25. migration_parallel_slots =
  26. migration_async_maxbulks =
  27. migration_async_maxbytes = "32mb"
  28. migration_async_numkeys =
  29. migration_timeout = "30s"
  30.  
  31. # Set configs for redis sentinel.
  32. sentinel_client_timeout = "10s"
  33. sentinel_quorum =
  34. sentinel_parallel_syncs =
  35. sentinel_down_after = "30s"
  36. sentinel_failover_timeout = "5m"
  37. sentinel_notification_script = ""
  38. sentinel_client_reconfig_script = ""

参数说明

参数 说明
coordinator_name 外部存储类型,接受 zookeeper/etcd
coordinator_addr 外部存储地址
product_name 集群名称,满足正则 \w[\w\.\-]*
product_auth 集群密码,默认为空
admin_addr RESTful API 端口

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

  1. mkdir /usr/local/codis/logs

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

  1. codis-dashboard --ncpu= --config=/etc/codis/codis-dashboard/dashboard.toml --log=/usr/local/codis/logs/dashboard.log --log-level=warn &参数说明:
  2. ##--ncpu=N 最大使用 CPU 个数;
  3.  
  4. ##-c CONF, --config=CONF 指定启动配置文件;
  5.  
  6. ##-l FILE, --log=FILE 设置 log 输出文件;
  7.  
  8. ##--log-level=LEVEL 设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN;
  9.  
  10. ##对于同一个业务集群而言,可以同时部署多个codis-proxy 实例;
  11.  
  12. ##不同 codis-proxy 之间由 codis-dashboard 保证状态同步。

关闭codis-dashboard服务:

  1. codis-admin --dashboard=192.168.163.131: --shutdown

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

注意参数:proxy_max_clients

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

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

  1. ##################################################
  2. # #
  3. # Codis-Proxy #
  4. # #
  5. ##################################################
  6.  
  7. # Set Codis Product Name/Auth.
  8. product_name = "codis-testX" #和dashboard对应
  9. product_auth = ""
  10.  
  11. # Set auth for client session
  12. # . product_auth is used for auth validation among codis-dashboard,
  13. # codis-proxy and codis-server.
  14. # . session_auth is different from product_auth, it requires clients
  15. # to issue AUTH <PASSWORD> before processing any other commands.
  16. session_auth = ""
  17.  
  18. # Set bind address for admin(rpc), tcp only.
  19. admin_addr = "192.168.163.131:11080" #同一台服务器可以根据端口创建多个Proxy
  20.  
  21. # Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
  22. proto_type = "tcp4"
  23. proxy_addr = "192.168.163.131:19000" #同一台服务器可以根据端口创建多个Proxy
  24.  
  25. # Set jodis address & session timeout
  26. # . jodis_name is short for jodis_coordinator_name, only accept "zookeeper" & "etcd".
  27. # . jodis_addr is short for jodis_coordinator_addr
  28. # . jodis_auth is short for jodis_coordinator_auth, for zookeeper/etcd, "user:password" is accepted.
  29. # . proxy will be registered as node:
  30. # if jodis_compatible = true (not suggested):
  31. # /zk/codis/db_{PRODUCT_NAME}/proxy-{HASHID} (compatible with Codis2.)
  32. # or else
  33. # /jodis/{PRODUCT_NAME}/proxy-{HASHID}
  34. jodis_name = "zookeeper"
  35. jodis_addr = "192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181"
  36. jodis_auth = ""
  37. jodis_timeout = "20s"
  38. jodis_compatible = false
  39.  
  40. ...
  41. ...

参数说明:

参数 说明
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服务(三台):

  1. codis-proxy --ncpu= --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 命令行工具添加,方法如下:
    1. codis-admin --dashboard=192.168.163.131: --create-proxy -x 192.168.163.131:

其中 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服务:

  1. codis-admin --proxy=192.168.163.131: --shutdown

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

⑤:配置codis-fe(一台)

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

  1. cd /etc/codis/codis-fe/
  2.  
  3. codis-admin --dashboard-list --zookeeper=192.168.163.131: | tee codis.json

启动codis-fe:

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

关闭codis-fe:

  1. 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信息,日志如下:

  1. fill slot , backend.addr = 192.168.163.133:, locked = false
  2. fill slot , backend.addr = 192.168.163.133:, locked = false
  3. fill slot , backend.addr = 192.168.163.133:, locked = false
  4. fill slot , backend.addr = 192.168.163.133:, locked = false
  5. ...
  6. ...

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进行查询:

  1. codis-admin --dashboard=192.168.163.131: --slots-status

迁移Slots:

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

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

  1. // :: zkclient.go:: [DEBUG] zkclient update node /codis3/codis-testX/slots/slot-
  2. // :: zkclient.go:: [DEBUG] zkclient update OK

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

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

  1. root@test1:~# redis-cli -h 192.168.163.132 -p #随便连一个Proxy
  2. 192.168.163.133:> get age
  3. (error) ERR handle response, backend conn reset

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

⑥:配置启动codis-ha

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

注意: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集群会自动添加。

建立所需的目录:

  1. 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

  1. port
  2.  
  3. dir "/var/lib/sentinel"
  4.  
  5. logfile "/var/lib/sentinel/sentinel.log"
  6.  
  7. daemonize yes
  8.  
  9. protected-mode no

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

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

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

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

  1. codis-admin --dashboard=192.168.163.131: --sentinel-add --addr=192.168.163.131:
  2.  
  3. codis-admin --dashboard=192.168.163.131: --sentinel-add --addr=192.168.163.132:
  4.  
  5. codis-admin --dashboard=192.168.163.131: --sentinel-add --addr=192.168.163.133:

通过codis-fe添加:

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

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

  1. 192.168.163.131:> get age
  2. (error) ERR handle response, backend conn reset
  3. 192.168.163.131:> get age
  4. ""

说明:当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就派上用场了:

  1. root@test1:~# codis-admin --help
  2. Usage:
  3. codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|slots]
  4. codis-admin [-v] --proxy=ADDR [--auth=AUTH] --start
  5. codis-admin [-v] --proxy=ADDR [--auth=AUTH] --shutdown
  6. codis-admin [-v] --proxy=ADDR [--auth=AUTH] --log-level=LEVEL
  7. codis-admin [-v] --proxy=ADDR [--auth=AUTH] --fillslots=FILE [--locked]
  8. codis-admin [-v] --proxy=ADDR [--auth=AUTH] --reset-stats
  9. codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc
  10. codis-admin [-v] --dashboard=ADDR [config|model|stats|slots|group|proxy]
  11. codis-admin [-v] --dashboard=ADDR --shutdown
  12. codis-admin [-v] --dashboard=ADDR --reload
  13. codis-admin [-v] --dashboard=ADDR --log-level=LEVEL
  14. codis-admin [-v] --dashboard=ADDR --slots-assign --beg=ID --end=ID (--gid=ID|--offline) [--confirm]
  15. codis-admin [-v] --dashboard=ADDR --slots-status
  16. codis-admin [-v] --dashboard=ADDR --list-proxy
  17. codis-admin [-v] --dashboard=ADDR --create-proxy --addr=ADDR
  18. codis-admin [-v] --dashboard=ADDR --online-proxy --addr=ADDR
  19. codis-admin [-v] --dashboard=ADDR --remove-proxy (--addr=ADDR|--token=TOKEN|--pid=ID) [--force]
  20. codis-admin [-v] --dashboard=ADDR --reinit-proxy (--addr=ADDR|--token=TOKEN|--pid=ID|--all) [--force]
  21. codis-admin [-v] --dashboard=ADDR --proxy-status
  22. codis-admin [-v] --dashboard=ADDR --list-group
  23. codis-admin [-v] --dashboard=ADDR --create-group --gid=ID
  24. codis-admin [-v] --dashboard=ADDR --remove-group --gid=ID
  25. codis-admin [-v] --dashboard=ADDR --resync-group [--gid=ID | --all]
  26. codis-admin [-v] --dashboard=ADDR --group-add --gid=ID --addr=ADDR [--datacenter=DATACENTER]
  27. codis-admin [-v] --dashboard=ADDR --group-del --gid=ID --addr=ADDR
  28. codis-admin [-v] --dashboard=ADDR --group-status
  29. codis-admin [-v] --dashboard=ADDR --replica-groups --gid=ID --addr=ADDR (--enable|--disable)
  30. codis-admin [-v] --dashboard=ADDR --promote-server --gid=ID --addr=ADDR
  31. codis-admin [-v] --dashboard=ADDR --sync-action --create --addr=ADDR
  32. codis-admin [-v] --dashboard=ADDR --sync-action --remove --addr=ADDR
  33. codis-admin [-v] --dashboard=ADDR --slot-action --create --sid=ID --gid=ID
  34. codis-admin [-v] --dashboard=ADDR --slot-action --remove --sid=ID
  35. codis-admin [-v] --dashboard=ADDR --slot-action --create-some --gid-from=ID --gid-to=ID --num-slots=N
  36. codis-admin [-v] --dashboard=ADDR --slot-action --create-range --beg=ID --end=ID --gid=ID
  37. codis-admin [-v] --dashboard=ADDR --slot-action --interval=VALUE
  38. codis-admin [-v] --dashboard=ADDR --slot-action --disabled=VALUE
  39. codis-admin [-v] --dashboard=ADDR --rebalance [--confirm]
  40. codis-admin [-v] --dashboard=ADDR --sentinel-add --addr=ADDR
  41. codis-admin [-v] --dashboard=ADDR --sentinel-del --addr=ADDR [--force]
  42. codis-admin [-v] --dashboard=ADDR --sentinel-resync
  43. codis-admin [-v] --remove-lock --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
  44. codis-admin [-v] --config-dump --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [-]
  45. codis-admin [-v] --config-convert=FILE
  46. codis-admin [-v] --config-restore=FILE --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [--confirm]
  47. codis-admin [-v] --dashboard-list (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
  48.  
  49. Options:
  50. -a AUTH, --auth=AUTH
  51. -x ADDR, --addr=ADDR
  52. -t TOKEN, --token=TOKEN
  53. -g ID, --gid=ID

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

1. 查看Proxy的配置、model、状态、slots信息:具体的信息可以运行该命令
codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|slots]
  1. # codis-admin --proxy=192.168.163.132: config
  2. 查看到proxy.toml的内容,如:proxyzk、连接数等等
  3.  
  4. # codis-admin --proxy=192.168.163.132: model
  5. 查看注册到ZK的信息:Proxy的地址,进群名称、主机名等等
  6.  
  7. # codis-admin --proxy=192.168.163.132: stats
  8. 查看Proxy是否在线、sentinel信息、opsqps、内存信息等等
  9.  
  10. # codis-admin --proxy=192.168.163.132: slots
  11. 查看Slots信息:slot在哪个group,后端Redis Server地址

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

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

  1. # codis-admin --proxy=192.168.163.132: --start
  2. 日志中 proxy waiting online ... 会变成 proxy is working ...
  3. 并且注册到zkjodis目录里:
  4. API call /api/proxy/start/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.132: []
  5. jodis create node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530
  6.  
  7. # codis-admin --proxy=192.168.163.132: --shutdown
  8. 日志里记录关闭Proxy再把信息从zk里删除,最后再退出。
  9. API call /api/proxy/shutdown/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.132: []
  10. admin shutdown
  11. proxy shutdown
  12. jodis remove node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530
  13. proxy is exiting ...

3. proxy 动态设置日志等级

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

  1. # codis-admin --proxy=192.168.163.132: --log-level=info
  2. 日志里记录:
  3. API call /api/proxy/loglevel/003acf3b450ebe66f56b8af4cc9c7d2d/INFO from 192.168.163.132: []
  4. set loglevel to INFO

4. 清除Proxy状态

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

  1. # codis-admin --proxy=192.168.163.132: --reset-stats
  2. API call /api/proxy/stats/reset/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.133: []
  3. 清除ProxyQPSOPSFailErrorsCommands信息

5. 强制清理Proxy内存

codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc

  1. # codis-admin --proxy=192.168.163.132: --forcegc
  2. API call /api/proxy/forcegc/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.133: []
  3. 控制Proxy内存的释放

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

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

  1. # codis-admin --dashboard=192.168.163.131: config
  2. 查看dashboard的配置,即dashboard.toml配置的信息
  3.  
  4. # codis-admin --dashboard=192.168.163.131: model
  5. 查看model信息
  6.  
  7. # codis-admin --dashboard=192.168.163.131: stats
  8. 包括slotgroup的对应信息,group信息(group后端的server以及server的配置),proxy信息(sentinel信息、server信息、server主信息以及proxy CPU和内存使用情况),
    slots信息(迁移间隔、迁移状态),sentine信息(配置、状态),主server信息
  9.  
  10. # codis-admin --dashboard=192.168.163.131: slots
  11. slotgroup的对应信息
  12.  
  13. # codis-admin --dashboard=192.168.163.131: group
  14. 组信息,组下server的配置信息
  15.  
  16. # codis-admin --dashboard=192.168.163.131: proxy
  17. proxy信息,包括sentinelserver信息以及proxy cpu和内存使用情况,opsqpscommands信息、连接数(session)等

7. 关闭和重新加载dashboard

codis-admin [-v] --dashboard=ADDR --shutdown/--reload
  1. # codis-admin --dashboard=192.168.163.131: --shutdown
  2. 关闭dashboard,清除zk里的topom
  3. API call /api/topom/shutdown/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132: []
  4. admin exit on error
  5.  
  6. # codis-admin --dashboard=192.168.163.131: --reload
  7. 修改dashboard之后,重新加载配置
  8. API call /api/topom/reload/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132: []

8. dashboard动态设置日志等级

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

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

9. proxy加入到dashboard,并online

codis-admin [-v] --dashboard=ADDR --create-proxy --addr=ADDR
  1. # codis-admin --dashboard=192.168.163.131: --create-proxy --addr=192.168.163.131:
  2.  
  3. proxy加入到dashboard
  4. [WARN] [0xc4202d17a0] API call /api/topom/proxy/create/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131: from 192.168.163.132: []
  5. [WARN] create proxy-[1d24e313bee99f26174110c009714530]
  6. ...

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

  1. # codis-admin --dashboard=192.168.163.131: --online-proxy --addr=192.168.163.133:
  2.  
  3. #proxy online
  4. [WARN] [0xc4200be790] API call /api/proxy/start/f6eadfec468df5b262af66e292a27699 from 192.168.163.131: []
  5. [WARN] [0xc4200be790] API call /api/proxy/sentinels/f6eadfec468df5b262af66e292a27699 from 192.168.163.131: []
  6. [WARN] [0xc4200be790] set sentinels = []

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

  1. # codis-admin --dashboard=192.168.163.131: --list-proxy
  2.  
  3. 查看该dashboard下的proxy列表和信息

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

  1. # codis-admin --dashboard=192.168.163.131: --remove-proxy --addr=192.168.163.133:
  2.  
  3. 根据相关信息:iptokenpid等移除proxy
  4. [WARN] [0xc4200be790] API call /api/proxy/shutdown/f6eadfec468df5b262af66e292a27699 from 192.168.163.131: []
  5. [WARN] [0xc4200be790] proxy shutdown
  6. [WARN] [0xc4200be790] admin shutdown
  7. [WARN] jodis remove node /jodis/codis-testX/proxy-697e01c6c8b8aaf399599992e7108d35
  8. [WARN] [0xc4200be790] proxy is exiting ...

13. reinit proxy:codis-admin [-v] --dashboard=ADDR --reinit-proxy (--addr=ADDR|--token=TOKEN|--pid=ID|--all) [--force]

  1. # codis-admin --dashboard=192.168.163.131: --reinit-proxy --addr=192.168.163.132:
  2. 初始化slots()
  3. [WARN] [0xc4200c68f0] API call /api/proxy/start/00d4e51e15eb811441ad228e44550b81 from 192.168.163.131: []
  4. [WARN] [0xc4200c68f0] API call /api/proxy/sentinels/00d4e51e15eb811441ad228e44550b81 from 192.168.163.131: []
  5. [WARN] [0xc4200c68f0] set sentinels = []

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

  1. # codis-admin --dashboard=192.168.163.131: --proxy-status
  2. [ ] proxy- [T] 4f07158ae347d67b1af825fd8e84b2f9 [A] 192.168.163.131: [P] 192.168.163.131:
  3. [ ] proxy- [T] 1d24e313bee99f26174110c009714530 [A] 192.168.163.132: [P] 192.168.163.132:
  4. [ ] proxy- [T] cfa02d4002da74e6b1f3b51f1416aa1d [A] 192.168.163.133: [P] 192.168.163.133:

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

  1. # codis-admin --dashboard=192.168.163.131: --list-group
  2. 查看group列表

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

  1. # codis-admin --dashboard=192.168.163.131: --create-group --gid=
  2. 创建一个group
  3. [WARN] [0xc4202d17a0] API call /api/topom/group/create/4c0ca749efb5aad2b20b8d84b1bb6905/ from 192.168.163.132: []
  4. [WARN] create group-[]:
  5. {
  6. "id": ,
  7. "servers": [],
  8. "promoting": {},
  9. "out_of_sync": false
  10. }

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

  1. # codis-admin --dashboard=192.168.163.131: --remove-group --gid=
  2. 删除一个group
  3. [WARN] [0xc4202d17a0] API call /api/topom/group/remove/4c0ca749efb5aad2b20b8d84b1bb6905/ from 192.168.163.132: []
  4. [WARN] remove group-[]:
  5. {
  6. "id": ,
  7. "servers": [],
  8. "promoting": {},
  9. "out_of_sync": false
  10. }

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

  1. # codis-admin --dashboard=192.168.163.131: --group-add --gid= --addr=192.168.163.131:
  2. group1里添加一个redis-server
  3. [WARN] [0xc4202d17a0] API call /api/topom/group/add/4c0ca749efb5aad2b20b8d84b1bb6905//192.168.163.131: from 192.168.163.132: []
  4. [WARN] update group-[]:
  5. {
  6. "id": ,
  7. "servers": [
  8. {
  9. "server": "192.168.163.131:7021",
  10. "datacenter": "",
  11. "action": {},
  12. "replica_group": false
  13. }
  14. ],
  15. "promoting": {},
  16. "out_of_sync": false
  17. }

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

  1. # codis-admin --dashboard=192.168.163.131: --group-del --gid= --addr=192.168.163.132:
  2.  
  3. 删除group里的server
  4. [WARN] [0xc4202d17a0] API call /api/topom/group/del/4c0ca749efb5aad2b20b8d84b1bb6905//192.168.163.132: from 192.168.163.132: []
  5. [WARN] update group-[]:
  6. {
  7. "id": ,
  8. "servers": [
  9. {
  10. "server": "192.168.163.131:7021",
  11. "datacenter": "",
  12. "action": {},
  13. "replica_group": false
  14. }
  15. ],
  16. "promoting": {},
  17. "out_of_sync": false
  18. }

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

  1. # codis-admin --dashboard=192.168.163.131: --replica-groups --gid= --addr=192.168.163.133: --enable
  2. # codis-admin --dashboard=192.168.163.131: --replica-groups --gid= --addr=192.168.163.133: --enable
  3. 同一个group2sever加入复制关系。
  4.  
  5. [WARN] [0xc4202d17a0] API call /api/topom/group/replica-groups/4c0ca749efb5aad2b20b8d84b1bb6905//192.168.163.133:/ from 192.168.163.132: []
  6. [WARN] update group-[]:
  7. {
  8. "id": ,
  9. "servers": [
  10. {
  11. "server": "192.168.163.133:7021",
  12. "datacenter": "",
  13. "action": {},
  14. "replica_group": true
  15. },
  16. {
  17. "server": "192.168.163.133:7022",
  18. "datacenter": "",
  19. "action": {},
  20. "replica_group": true
  21. }
  22. ],
  23. "promoting": {},
  24. "out_of_sync": false
  25. }

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

  1. # codis-admin --dashboard=192.168.163.131: --sync-action --create --addr=192.168.163.133:
  2. 让组内的第2server作为从
  3.  
  4. [WARN] [0xc4202d17a0] API call /api/topom/group/replica-groups/4c0ca749efb5aad2b20b8d84b1bb6905//192.168.163.133:/ from 192.168.163.131: [192.168.163.1]
  5. [WARN] update group-[]:
  6. {
  7. "id": ,
  8. "servers": [
  9. {
  10. "server": "192.168.163.133:7021",
  11. "datacenter": "",
  12. "action": {},
  13. "replica_group": false
  14. },
  15. {
  16. "server": "192.168.163.133:7022",
  17. "datacenter": "",
  18. "action": {
  19. "state": "synced"
  20. },
  21. "replica_group": true
  22. }
  23. ],
  24. "promoting": {},
  25. "out_of_sync": false
  26. }

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

  1. # codis-admin --dashboard=192.168.163.131: --group-status
  2. 查看主从复制的关系
  3. [ ] group- [] 192.168.163.131: ==> NO:ONE
  4. [ ] group- [] 192.168.163.131: ==> 192.168.163.131::up
  5. [ ] group- [] 192.168.163.132: ==> NO:ONE
  6. [ ] group- [] 192.168.163.132: ==> 192.168.163.132::up
  7. [ ] group- [] 192.168.163.133: ==> NO:ONE
  8. [ ] group- [] 192.168.163.133: ==> 192.168.163.133::up

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

  1. # codis-admin --dashboard=192.168.163.131: --promote-server --gid= --addr=192.168.163.133:
  2. 让组13的服务器作为一个从库
  3.  
  4. # codis-admin --dashboard=192.168.163.131: --group-status
  5. [ ] group- [] 192.168.163.131: ==> NO:ONE
  6. [ ] group- [] 192.168.163.131: ==> 192.168.163.131::up
  7. [ ] group- [] 192.168.163.132: ==> NO:ONE
  8. [ ] group- [] 192.168.163.132: ==> 192.168.163.132::up
  9. [ ] group- [] 192.168.163.133: ==> NO:ONE
  10. [X] group- [] 192.168.163.133: ==> NO:ONE
  11. [WARN] group-[] resync to prepared
  12.  
  13. 提升了之后,老主需要手动执行,执行命令和21一样:
  14. --sync-action --create

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

  1. # codis-admin --dashboard=192.168.163.131: --slot-action --create --sid= --gid=
  2. 分配slot0 group11
  3. [WARN] [0xc4202d17a0] API call /api/topom/slots/action/create/4c0ca749efb5aad2b20b8d84b1bb6905// from 192.168.163.132: []
  4. [WARN] update slot-[]:
  5. pending -> preparing ->prepared ->migrating -> finished

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

  1. # codis-admin --dashboard=192.168.163.131: --slot-action --remove --sid=

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

  1. # codis-admin --dashboard=192.168.163.131: --slot-action --create-range --beg= --end= --gid=

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

  1. # codis-admin --dashboard=192.168.163.131: --slot-action --disabled=
  2. 停止slots迁移
  3. [WARN] [0xc4202d17a0] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/ from 192.168.163.132: []
  4. [WARN] set action disabled = false
  5.  
  6. 开启slots迁移
  7. [WARN] [0xc4202d17a0] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/ from 192.168.163.132: []
  8. [WARN] set action disabled = true

28. 平衡slots,各group平分slots,codis-admin [-v] --dashboard=ADDR --rebalance [--confirm]

  1. # codis-admin --dashboard=192.168.163.131: --rebalance
  2. [,] =>
  3. done
  4.  
  5. # codis-admin --dashboard=192.168.163.131: --rebalance
  6. nothing changes

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

  1. # codis-admin --dashboard=192.168.163.131: --sentinel-add --addr=192.168.163.131:
  2. 添加一台sentinel
  3.  
  4. [WARN] [0xc4202d17a0] API call /api/topom/sentinels/add/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131: from 192.168.163.132: []
  5. [WARN] update sentinel:
  6. {
  7. "servers": [
  8. "192.168.163.131:10086"
  9. ],
  10. "out_of_sync": true
  11. }

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

  1. # codis-admin --dashboard=192.168.163.131: --sentinel-del --addr=192.168.163.133:
  2.  
  3. [WARN] [0xc4202d17a0] API call /api/topom/sentinels/del/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.133:/ from 192.168.163.132: []
  4. [WARN] update sentinel:
  5. {
  6. "servers": [
  7. "192.168.163.131:10086",
  8. "192.168.163.132:10086",
  9. "192.168.163.133:10086"
  10. ],
  11. "out_of_sync": true
  12. }
  13. [WARN] update sentinel:
  14. {
  15. "servers": [
  16. "192.168.163.131:10086",
  17. "192.168.163.132:10086"
  18. ],
  19. "out_of_sync": true
  20. }

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

  1. # codis-admin --dashboard=192.168.163.131: --sentinel-resync
  2.  
  3. 如果出现异常,可以尝试resync
  4.  
  5. [WARN] [0xc4202d17a0] API call /api/topom/sentinels/resync-all/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132: []
  6. [WARN] update sentinel:
  7. {
  8. "servers": [
  9. "192.168.163.131:10086",
  10. "192.168.163.132:10086"
  11. ],
  12. "out_of_sync": true
  13. }
  14. [WARN] rewatch sentinels = [192.168.163.131: 192.168.163.132:]
  15. [WARN] update sentinel:
  16. {
  17. "servers": [
  18. "192.168.163.131:10086",
  19. "192.168.163.132:10086"
  20. ],
  21. "out_of_sync": false
  22. }

32. 从ZooKeeper或则其他外部存储里里获取dashboard信息,codis-admin [-v] --dashboard-list (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)

  1. # codis-admin --dashboard-list --zookeeper=127.0.0.1:
  2. // :: zkclient.go:: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:
  3. // :: zkclient.go:: [INFO] zookeeper - Connected to 127.0.0.1:
  4. // :: zkclient.go:: [INFO] zookeeper - Authenticated: id=, timeout=
  5. // :: zkclient.go:: [INFO] zookeeper - Re-submitting `` credentials after reconnect
  6. [
  7. {
  8. "name": "codis-testX",
  9. "dashboard": "192.168.163.131:18080"
  10. }
  11. ]
  12. // :: zkclient.go:: [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]

  1. # codis-admin --config-dump --product=codis-testX --zookeeper=127.0.0.1:
  2.  
  3. // :: zkclient.go:: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:
  4. // :: zkclient.go:: [INFO] zookeeper - Connected to 127.0.0.1:
  5. // :: zkclient.go:: [INFO] zookeeper - Authenticated: id=, timeout=
  6. // :: zkclient.go:: [INFO] zookeeper - Re-submitting `` credentials after reconnect
  7. {
  8. slots:
  9. proxy:
  10. groups:
  11. }

34. 转换配置文件,codis-admin [-v] --config-convert=FILE

  1. # codis-admin --config-convert codis_v2..json | tee codis_v3..json
  2. 该命令会将 Codis .x 版本的配置文件中有效信息提取出来,并转成 Codis .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]

  1. codis-admin --config-restore=codis_v3..json --product=codis_v3. --zookeeper=127.0.0.1: --confirm
  2. 该命令会将 Codis .x 版本的配置文件提交到 /codis3/codis_v3. 目录下。
  3. 选项 --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)

  1. # codis-admin --remove-lock --product=codis-testX --zookeeper=127.0.0.1:
  2. // :: zkclient.go:: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:
  3. // :: zkclient.go:: [INFO] zookeeper - Connected to 127.0.0.1:
  4. // :: zkclient.go:: [INFO] zookeeper - Authenticated: id=, timeout=
  5. // :: zkclient.go:: [INFO] zookeeper - Re-submitting `` credentials after reconnect
  6. // :: zkclient.go:: [INFO] zookeeper - Recv loop terminated: err=EOF 

总结

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

Redis Codis 部署安装的更多相关文章

  1. Redis 部署安装

    一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...

  2. Redis Windows下安装部署

    下载Redis 在Redis的官网下载页上有各种各样的版本,我这次是在windows上部署的,要去GitHub上下载.我下载的是2.8.12版的,相信大家百度一下就可以搜到,这就是我们需要的: 启动R ...

  3. windows下安装Redis并部署成服务

    windows下安装Redis并部署成服务 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 一:下载 下载地址: windows版本: http ...

  4. Docker+Redis镜像的原理以及部署安装(超详解附截图)

    文章来源:公众号-智能化IT系统. 一. DOCKER介绍 Docker简介 (1)Docker 是一个开源的应用容器引擎,基于 Go 语言,并遵从Apache2.0协议开源. (2)Docker 可 ...

  5. redis常用服务安装部署

    常用服务安装部署   学了前面的Linux基础,想必童鞋们是不是更感兴趣了?接下来就学习常用服务部署吧! 安装环境: centos7 + vmware + xshell 即将登场的是: mysql(m ...

  6. redis CentOS6.5安装及集群部署

    .下载redis source包 链接:https://pan.baidu.com/s/122ZCjNvjl9Jx6M2YsLrncw 密码:92ze 2.解压 tar -xzf redis-3.2. ...

  7. 部署Redis(脚本安装)

    部署Redis(脚本安装) #/bin/bash # DES:Redis Deploy # Author: will_xue # Email:linuxcto@aliyun.com # DATE : ...

  8. VMware虚拟机安装CentOS6.4、部署web项目全过程(设置固定IP、安装JDK、Tomcat、Redis、部署项目)

    概述:该篇随笔介绍了在VMware上安装centOS.在centOS上安装JDK.安装Tomcat.安装Redis并部署项目的全过程,虽然参考了很多优秀的文章,但实践.整理.补充都很用心,若要复制粘贴 ...

  9. Redis学习01_redis安装部署(centos)

    原文: http://www.cnblogs.com/herblog/p/9305668.html Redis学习(一):CentOS下redis安装和部署 1.基础知识  redis是用C语言开发的 ...

随机推荐

  1. vs2010 sp1 安装Silverlight5 语言版本不匹配的问题

    好久之前用silverlight写了个程序,今天心血来潮想给朋友看一下,朋友更新了sl5,但是运行不起来. 所以有点郁闷,于是打算更新项目到silverlight5. 装sp1后,下载silverli ...

  2. 整理SpringMVC

    Spring Web MVC核心架构图: 核心架构图流程如下: 1.首先用户发送请求------->DispatcherServlet(前端控制器),前端控制器收到请求后自己不进行处理,而是委托 ...

  3. SPP-Net理解

    文章没有看完,先挑几个点谈一下. 1. 动机 在上一篇文章的末尾提到,RCNN做了很多重复计算,SPP就是为了解决这个问题而提出的的一个方法----空间金字塔池化. 感觉这个问题本质上还是全连接层对r ...

  4. 微信小程序开发----微信开发者工具使用

    新建项目选择小程序项目,选择代码存放的硬盘路径,填入刚刚申请到的小程序的 AppID,给你的项目起一个好听的名字,最后,勾选 "创建 QuickStart 项目" (注意: 你要选 ...

  5. vue 值的更新

    用了vue开发了一段时间,基本上感觉都是比较好用的一个框架,刚开始还是会存在一些小坑的东西,这里先浅谈下值的更新问题. 1.本组件的一些变量,或者是主view(路由页面)一些值,是通过vuex 中st ...

  6. MySQL 数据库最优化设计原则

    规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过10 ...

  7. YOU种你来丨i春秋校园行第一站北京电子科技学院

    发通告啦 i春秋互联网安全校园行即将火爆开启,第一站我们将来到北京电子科技学院.对网络安全感兴趣的大学生们注意啦,我们将走进校园送福利,Are you ready? i春秋简介 i春秋拥有全国最大的网 ...

  8. [Swift]LeetCode266.回文全排列 $ Palindrome Permutation

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  9. 我们身边那些优秀的.NET开发者-

    我们身边那些优秀的.NET开发者----邹琼俊 初识大佬 非常有幸通过博客园认识了邹琼俊邹老师,他也是<ASP.NET企业级开发实战>这本书的作者,这本书的销量达到了将近九千本,在这个实体 ...

  10. HBase之CF持久化系列(续1)

    这一节本来打算讲解HRegion的初始化过程中一些比较复杂的流程.不过,考虑前面的博文做的铺垫并不够,因此,在这一节,我还是特意来介绍HBase的CF持久化.关于这个话题的整体流程性分析在博文< ...