背景
关于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 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:
配置文件说明:
- 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 配置文件中, 可以按照如下格式进行配置, 每一行代表一台服务器配置:
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
② 新建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实例,端口为: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(一台)
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 &
waiting
proxy_addr
accept
online
。添加的方法有以下两种:
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
admin_addr
添加过程中,dashboard 会完成如下一系列动作:
- 获取 proxy 信息,对集群 name 以及 auth 进行验证,并将其信息写入到外部存储中(zookeeper);
- 同步 slots 状态;
online
accept
停止codis-proxy服务:
codis-admin --proxy=192.168.163.131:11080 --shutdown
⑤:配置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相关参数里添加密码。
总结
到这里,redis codis 的高可用集群已经搭建完毕,从文中的介绍说明来看,Codis实现了Redis的高可用、动态扩展、对业务层透明以及如何连接。后续进行相关的测试说明。
原文:https://www.cnblogs.com/zhoujinyi/p/9249873.html