Codis 部署安装

背景

关于Redis的高可用除了只身的Sentinel和Cluster之外,还有一个用的比较多的是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 可自行扩展。

 各个组件之间的关系:

163084-20180703212324845-1586187945.png

客户端通过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.14/zookeeper-3.4.14.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:

sudo apt-get update
sudo apt-get install openjdk-8-jdk


# 或者jdk:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

1.1 解压文件

1:解压:
tar -xf zookeeper-3.4.14.tar.gz 
mv zookeeper-3.4.14 /usr/local/zookeeper

2:编辑配置文件:
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg

1.2 配置文件(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

配置文件说明:

  • 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.3 创建需要的目录:

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

1.4 设置环境变量

vim /etc/profile
#添加
# ZooKeeper Env
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

#应用环境变量
source /etc/profile

1.5 单机模式
zoo.cfg配置文件

cd /usr/local/zookeeper/conf
vim zoo.cfg

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

1.5.1 启动:zkServer.sh start

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

1.5.2 查看状态:zkServer.sh status

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

1.5.3 关闭:zkServer.sh stop

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

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

1.6.1 集群模式(3台)
zoo.cfg配置文件:对比单机模式多了server.ID

cd /usr/local/zookeeper/conf
vim zoo.cfg

# 内容
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
#要是一台装三个zk,可以按照端口区分
server.1=192.168.3.159:2888:3888
server.2=192.168.3.237:2888:3888
server.3=192.168.3.212: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

1.6.1 三台启动:zkServer.sh start

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

1.6.2 三台查看状态:zkServer.sh status

root@root1:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

root@root2:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

root@root3:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

1.6.3 三台关闭:zkServer.sh stop

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

2 Codis安装:

2.1 安装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

查看go语言版本

go version
go version go1.6.2 linux/386

2.2 创建需要的文件:

mkdir /opt/gowork

以上go的依赖环境已经安装完毕

2.3 安装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

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

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

2.3.2 再设置环境变量:

vim /etc/profile
#添加
# Codis
export CODIS_HOME=/usr/local/codis
export PATH=$PATH:$CODIS_HOME/bin


#应用环境变量
source /etc/profile

2.4 配置启动Codis

2.4.1 新建目录专门存放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

2.4.2 新建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.4.3 配置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.3.159:2181,192.168.3.212:2181,192.168.3.237: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.3.159: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

2.4.4 配置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.3.159:18080 --create-proxy -x 192.168.3.159:11080

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

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

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

  • 同步 slots 状态;

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

停止codis-proxy服务:

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

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

2.4.5 配置codis-fe(一台)

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

cd /etc/codis/codis-fe/

codis-admin --dashboard-list --zookeeper=192.168.3.159:2181 | tee codis.json

# 启动信息
2019/02/11 11:52:19 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 192.168.3.159:2181
2019/02/11 11:52:19 zkclient.go:23: [INFO] zookeeper - Connected to 192.168.3.159:2181
2019/02/11 11:52:19 zkclient.go:23: [INFO] zookeeper - Authenticated: id=72057932370608129, timeout=40000
2019/02/11 11:52:19 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect
[
    {
        "name": "codis-testX",        "dashboard": "192.168.3.159:18080"
    }
]
2019/02/11 11:52:19 zkclient.go:23: [INFO] zookeeper - Recv loop terminated: err=EOF
2019/02/11 11:52:19 zkclient.go:23: [INFO] zookeeper - Send loop terminated: err=<nil>

启动codis-fe:

codis-fe --ncpu=1 --dashboard-list=/etc/codis/codis-fe/codis.json --listen=192.168.3.159: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

2.5 通过codis-fe进行web操作管理(http://192.168.3.159:18090)

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

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

1.png

2.png

2.5.2 添加Group

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


Group
1 192.168.3.159:7021 192.168.3.159:7022

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


3.png

注意:点了PROMOTE之后,slave会被提升为master,但是老的master需要手动点(扳手)才能对新主进行同步。

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

4.png

4.png

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

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

6.png

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

7.png

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

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


同一


同一

codis-fe 管理界面

https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md

参考:

http://www.cnblogs.com/zhoujinyi/p/9249873.html

http://blog.51cto.com/arthur376/2051993



版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读1.3k次。在 Redis 中,键(Keys)是非常重要的概念,它们代表了存储在数据库中的数据的标识符。对键的有效管理和操作是使用 Redis 数据库的关键一环,它直接影响到数据的存取效率、系统的稳定性和开发的便利性。本文将深入探讨 Redis 中键的管理和操作,包括键的命名规范、常用的键操作命令以及一些最佳实践。我们将详细介绍如何合理命名键、如何使用键的过期和持久化特性、如何批量删除键等技巧,旨在帮助读者更好地理解并灵活运用 Redis 中的键,从而提高数据管理和操作的效率和可靠性。
文章浏览阅读3.3k次,点赞44次,收藏88次。本篇是对单节点的应用,但从中我们也能推断出一些关于集群的应用,不过大多数公司能搞个主从就已经是不错了,所以你能学会这个已经算是很有用了,关于ES,博主前面也讲过一些基础应用,创建一个工具类利用ES的数据模型进行存储就可以达到一个canal同时对Redis和ES的同步,如果担心出问题,可以把Canal搞成集群的形式,这个后续有时间博主再给大家做讲解。今天就到这里了,觉得不错就支持一下吧。_canal redis
文章浏览阅读8.4k次,点赞8次,收藏18次。Spring Boot 整合Redis实现消息队列,RedisMessageListenerContainer的使用,Pub/Sub模式的优缺点_springboot redis 消息队列
文章浏览阅读978次,点赞25次,收藏21次。在Centos上安装Redis5.0保姆级教程!_centos7 安装redis5.0服务器
文章浏览阅读1.2k次,点赞21次,收藏22次。Docker-Compose部署Redis(v7.2)主从模式首先需要有一个redis主从集群,才能接着做redis哨兵模式。_warning: sentinel was not able to save the new configuration on disk!!!: dev
文章浏览阅读2.2k次,点赞59次,收藏38次。合理的JedisPool资源池参数设置能为业务使用Redis保驾护航,本文将对JedisPool的使用、资源池的参数进行详细说明,最后给出“最合理”配置。_jedispool资源池优化
文章浏览阅读1.9k次。批量删除指定前缀的Key有两中方法,一种是借助 redis-cli,另一种是通过 SCAN命令来遍历所有匹配前缀的 key,并使用 DEL命令逐个删除它们。_redis删除前缀的key
文章浏览阅读890次,点赞18次,收藏20次。1. Redis时一个key-cakye的数据库,key一般是String类型,不过value类型有很多。eg.String Hash List Set SortedSet (基本) | GEO BitMap HyperLog (特殊)2.Redis为了方便学习,将操作不同类型的命令做了分组,在官网可以进行查询。
文章浏览阅读1.1k次,点赞19次,收藏26次。若不使用Redisson,而是用synchronized(this),此时会造成对服务器的加锁,若开始大量查询ID为1的商品,每台机器都会先跑一遍加个锁,然后在查询ID为2的数据,此时需要等待ID为1的锁释放,所以需要将this对象调整为全局商品ID。若在执行bgsave命令时,还有其他redis命令被执行(主线程数据修改),此时会对数据做个副本,然后bgsave命令执行这个副本数据写入rdb文件,此时主线程还可以继续修改数据。在当前redis目录下会生成aof文件,对redis修改数据的命令进行备份。
文章浏览阅读1.5k次,点赞39次,收藏24次。本文全面剖析Redis集群在分布式环境下的数据一致性问题,从基础原理到高级特性,涵盖主从复制、哨兵模式、持久化策略等关键点,同时也分享了关于监控、故障模拟与自适应写一致性策略的实践经验。_redis集群一致性
文章浏览阅读1k次。RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令。AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据。:在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF。
文章浏览阅读1k次,点赞24次,收藏21次。NoSQL(No only SQL)数据库,泛指非关系型数据库,实现对于传统数据库而言的。NoSQL 不依赖业务逻辑方式进行存储,而以简单的 key-value 模式存储。因此大大增加了数据库的扩展能力。不遵循SQL标准不支持ACID远超于SQL的性能Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。
文章浏览阅读988次,点赞17次,收藏19次。在上面的步骤中,我们已经开启了 MySQL 的远程访问功能,但是,如果使用 MySQL 管理工具 navicat 连接 MySQL 服务端时,还是可能会出现连接失败的情况。在实际工作中,如果我们需要从其他地方访问和管理 MySQL 数据库,就需要开启 MySQL 的远程访问功能并设置相应的权限。这对于我们的工作效率和数据安全都有很大的帮助。通过查看 MySQL 用户表,我们可以看到’host’为’%’,说明 root 用户登录 MySQL 的时候,可以允许任意的 IP 地址访问 MySQL 服务端。
文章浏览阅读956次。Redis Desktop Manager(RDM)是一款用于管理和操作Redis数据库的图形化界面工具。提供了简单易用的界面,使用户能够方便地执行各种Redis数据库操作,并且支持多个Redis服务器的连接_redisdesktopmanager安装包
文章浏览阅读1.9k次,点赞52次,收藏27次。缓存击穿指的是数据库有数据,缓存本应该也有数据,但是缓存过期了,Redis 这层流量防护屏障被击穿了,请求直奔数据库。缓存穿透指的是数据库本就没有这个数据,请求直奔数据库,缓存系统形同虚设。缓存雪崩指的是大量的热点数据无法在 Redis 缓存中处理(大面积热点数据缓存失效、Redis 宕机),流量全部打到数据库,导致数据库极大压力。
文章浏览阅读1.2k次。一次命令时间(borrow|return resource + Jedis执行命令(含网络) )的平均耗时约为1ms,一个连接的QPS大约是1000,业务期望的QPS是50000,那么理论上需要的资源池大小是50000 / 1000 = 50个,实际maxTotal可以根据理论值合理进行微调。JedisPool默认的maxTotal=8,下面的代码从JedisPool中借了8次Jedis,但是没有归还,当第9次(jedisPool.getResource().ping())3、发生异常可能的情况。_redis.clients.jedis.exceptions.jedisconnectionexception: could not get a res
文章浏览阅读1k次,点赞27次,收藏18次。在这篇文章中,你将了解到如何在 CentOS 系统上安装 Redis 服务,并且掌握通过自定义域名来访问 Redis 服务的技巧。通过使用自定义域名,你可以方便地管理和访问你的 Redis 数据库,提高工作效率。无论你是开发者、系统管理员还是对 Redis 感兴趣的读者,这篇文章都会为你提供清晰的指导和实用的技巧。阅读本文,轻松搭建自己的 Redis 服务,并体验自定义域名带来的便捷!_redis怎么自定义域名
文章浏览阅读1.1k次,点赞15次,收藏18次。我们post请求,拦截器要预先读取HtppServletRequest里面的body的数据,是通过io的方式,都知道io读取完毕之后,之前的数据是变为null的,但是,当我么后面的接口来委派的时候,也是通过io读取body。我们要考虑一个事情,就是我们要验证数据的重复提交: 首先第一次提交的数据肯定是要被存储的,当而第二次往后,每次提交数据都会与之前的数据产生比对从而验证数据重复提交,我们要具体判断数据是否重复提交的子类。发现数据是成功存入的,剩余7s过期,在10s之内,也就是数据没过期之前,在发送一次。_json.parseobject(str, clazz, auto_type_filter);
文章浏览阅读3.9k次,点赞3次,收藏7次。PHP使用Redis实战实录系列:我们首先检查$redis->connect()方法的返回值来确定是否成功连接到Redis服务器。如果连接失败,我们可以输出相应的错误信息。如果连接成功,我们再执行一些操作,如$redis->set()、$redis->get()等,并检查每个操作的返回结果来判断是否发生了异常。_php redis
文章浏览阅读1.5w次,点赞23次,收藏51次。Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis 是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。_redisdesktopmanager下载