欢迎您, 来到 宁时修博客.^_^

Codis 3.x集群搭建与使用_04

2018/07/09 言则行 Codis 893
Codis 3.x集群管理与HA

一、Codis 3.x集群管理命令

    codis-admin命令,很多工作都可以通过这个命令进行操作,如添加proxy、添加Redis Server Group、初始化slots等等

[root@codis-redis ~]# /usr/local/codis/bin/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


    简单举几个例子:

    1、添加proxy到集群中:

codis-admin --dashboard=192.168.2.24:18080 --create-proxy -x 192.168.2.24:11080
codis-admin --dashboard=192.168.2.24:18080 --create-proxy -x 192.168.2.25:11080
codis-admin --dashboard=192.168.2.24:18080 --create-proxy -x 192.168.2.26:11080

    

    --dashboard=ADDR:指定codis-dashboard管理地址

    --create-proxy:创建proxy

    -x ADDR 等同于 --addr=ADDR:codis-proxy的admin_addr地址



    2、添加redis server group

    首先创建group:

codis-admin --dashboard=192.168.2.24:18080 --create-group --gid=1

    

    然后给group里添加redis主机:

codis-admin --dashboard=192.168.2.24:18080 --group-add --gid=1 --addr=192.168.2.25:6379
codis-admin --dashboard=192.168.2.24:18080 --group-add --gid=1 --addr=192.168.2.24:6379
codis-admin --dashboard=192.168.2.24:18080 --group-add --gid=1 --addr=192.168.2.26:6379


    然后redis从库同步主库:

codis-admin --dashboard=192.168.2.24:18080 --sync-action --create --addr=192.168.2.24:6379
codis-admin --dashboard=192.168.2.24:18080 --sync-action --create --addr=192.168.2.26:6379

    codis集群默认第一个添加进group的redis主机为master,后面添加进相同group的redis主机为slave。


    当然,也可以将后面添加的redis-slave提升为master:

codis-admin --dashboard=192.168.2.24:18080 --promote-server --gid=1 --addr=192.168.2.24:6379

    但是,需要人为干预将从库同步于新的主库,这是因为没有做自动主从切换。后面再讲。


    3、初始化slots并设置server group服务的slot范围

    Codis采用Pre-sharding的技术来实现数据的分片,,默认分成1024个slots (0-1023),对于每个key来说,通过以下公式确定所属的Slot ID : Slot ID= CRC32(key) %1024。每一个slot都会有一个且必须有一个特定的Server Group ID来表示这个slot的数据由哪个Server Group来提供。

codis-admin --dashboard=192.168.2.24:18080 --slot-action --create-range --beg=0 --end=1023 --gid=1



    4、codis-proxy相关

    proxy开启关闭:

codis-admin --proxy=192.168.2.24:11080 --auth="xxxxx" --start
codis-admin --proxy=192.168.2.24:11080 --auth="xxxxx" --shutdown

    有验证就加验证,没有就不用写。

    

    查看proxy状态:

codis-admin --proxy=192.168.2.24:11080 --proxy-status
codis-admin --proxy=192.168.2.24:11080 --list-proxy


    删除proxy:

codis-admin --dashboard=192.168.2.24:18080 --remove-proxy --token=6a2db3c9ac07ba8857d4bc79ca6d191c  --force
codis-admin --dashboard=192.168.2.24:18080 --remove-proxy --addr=192.168.2.25:11080 --force




二、Codis HA

    以往的Codis版本自带HA组件(codis-ha),但新版本已经将其删除,用sentinel替代。我现在使用的是Codis 3.2,虽然有codis-ha这个命令,启用后能将slave提升为master,但也会将除新master之外的slave全部关闭,重启后也不能加入codis集群,重新同步与新master。需要关闭codis-ha才能同步与新master。如有失误,请看到这篇文章的指出不足。

    使用sentinel来测试,保障集群的高可用。


    1、redis-sentinel配置

    在codis集群中配置sentinel.conf文件:

[root@codis-redis ~]# cd /usr/local/codis/conf
[root@codis-redis conf]# vim sentinel.conf
# sentinel节点的端口
port 26379
# 后台运行
daemonize yes
# 日志
logfile "/usr/local/codis/log/sentinel.log"

# sentinel工作目录
dir "/tmp/redis"


    当你把sentinel加到codis集群中,这个sentinel就会监控所有主机了,而不是监控它所在主机的一主一从。所以建议要使用sentinel的时候,就不要预先配置监控组了。当你加到codis集群之后,codis会自动添加的。而且如果你原来配置了组,还有可能会造成混乱。



    配置完Redis和Sentinel之后,按顺序启动各个角色。启动顺序如下:Master->Slave->Sentinel,要确保按照这个顺序依次启动。

    

        启动:

/usr/local/codis/bin/codis-server /usr/local/codis/conf/sentinel.conf --sentinel



   2、将sentinel加入codis集群中:

    在codis管理界面把三个sentinel添加进去:

20180710182357.png



    3、故障转移实验

    当前Codis集群状态:

710165311.png


    让redis-master主动休眠60秒来观察failover过程:

[root@codis-redis02 ~]# /usr/local/codis/bin/redis-cli -p 6379 -h 192.168.2.26 DEBUG sleep 60

    

    日志输出:

1563:X 11 Jul 11:03:15.880 # Sentinel ID is d985579ceac4b3d1fbe9c5288c9120732403e8d1
1563:X 11 Jul 11:11:29.305 # +monitor master codis-demo-1 192.168.2.26 6379 quorum 2
1563:X 11 Jul 11:11:29.305 # +set master codis-demo-1 192.168.2.26 6379 parallel-syncs 1
1563:X 11 Jul 11:11:29.305 # +set master codis-demo-1 192.168.2.26 6379 down-after-milliseconds 30000
1563:X 11 Jul 11:11:29.305 # +set master codis-demo-1 192.168.2.26 6379 failover-timeout 300000
1563:X 11 Jul 11:11:29.310 * +slave slave 192.168.2.25:6379 192.168.2.25 6379 @ codis-demo-1 192.168.2.26 6379
1563:X 11 Jul 11:11:29.311 * +slave slave 192.168.2.24:6379 192.168.2.24 6379 @ codis-demo-1 192.168.2.26 6379
1563:X 11 Jul 11:11:31.313 * +sentinel sentinel fe7034977e694209a79d151022bff1afcc8004fa 192.168.2.26 26379 @ codis-demo-1 192.168.2.26 6379
1563:X 11 Jul 11:11:31.314 * +sentinel sentinel c370ea808406bb4886da874094f28fba37f5828f 192.168.2.24 26379 @ codis-demo-1 192.168.2.26 6379
1563:X 11 Jul 11:15:02.230 # +sdown master codis-demo-1 192.168.2.26 6379
1563:X 11 Jul 11:15:02.913 # +new-epoch 1
1563:X 11 Jul 11:15:02.913 # +vote-for-leader fe7034977e694209a79d151022bff1afcc8004fa 1
1563:X 11 Jul 11:15:03.337 # +odown master codis-demo-1 192.168.2.26 6379 #quorum 3/2
1563:X 11 Jul 11:15:03.337 # Next failover delay: I will not start a failover before Wed Jul 11 11:25:03 2018
1563:X 11 Jul 11:15:04.039 # +config-update-from sentinel fe7034977e694209a79d151022bff1afcc8004fa 192.168.2.26 26379 @ codis-demo-1 192.168.2.26 6379
1563:X 11 Jul 11:15:04.039 # +switch-master codis-demo-1 192.168.2.26 6379 192.168.2.25 6379
1563:X 11 Jul 11:15:04.039 * +slave slave 192.168.2.24:6379 192.168.2.24 6379 @ codis-demo-1 192.168.2.25 6379
1563:X 11 Jul 11:15:04.039 * +slave slave 192.168.2.26:6379 192.168.2.26 6379 @ codis-demo-1 192.168.2.25 6379
1563:X 11 Jul 11:15:41.958 * +convert-to-slave slave 192.168.2.26:6379 192.168.2.26 6379 @ codis-demo-1 192.168.2.25 6379

    可以看到每个Sentinel进程都监控到Master挂掉,从sdown状态进入odown,然后选举了一个leader来进行failover,最终192.168.2.25成为新的Master。



    过程:Redis Sentinel对主节点进行客观下线(Objectively Down, 简称 ODOWN)的判断,确认主节点不可达,则通知从节点中止复制主节点的操作。当主节点下线时长超过配置的下线时长30000毫秒,Redis Sentinel执行故障转移操作。


    最终结果:

20180711115619.png

    我们测试下:

# 在192.168.2.25上写
[root@codis-redis01 ~]# /usr/local/codis/bin/redis-cli 
127.0.0.1:6379> set redis codis
OK
127.0.0.1:6379> get redis
"codis"


# 在192.168.2.24和192.168.2.26上读
[root@codis-redis ~]# /usr/local/codis/bin/redis-cli
127.0.0.1:6379> get redis
"codis"

[root@codis-redis02 ~]# /usr/local/codis/bin/redis-cli
127.0.0.1:6379> get redis
"codis"


    


    4、日志中几个主要事件

+reset-master :主服务器已被重置。
+slave :一个新的从服务器已经被 Sentinel 识别并关联。
+failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
+failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
+slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 [SLAVEOF](/commands/slaveof.html) 命令,为实例设置新的主服务器。
+slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
+slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
-dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
+sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
+sdown :给定的实例现在处于主观下线状态。
-sdown :给定的实例已经不再处于主观下线状态。
+odown :给定的实例现在处于客观下线状态。
-odown :给定的实例已经不再处于客观下线状态。
+new-epoch :当前的纪元(epoch)已经被更新。
+try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
+elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
+failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
+switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
+tilt :进入 tilt 模式。
-tilt :退出 tilt 模式。



三、codis-proxy高可用问题

    codis-proxy是无状态的,可以比较容易的搭多个实例,达到高可用性和横向扩展。对Java用户来说,可以使用Jodis来实现proxy层的HA:

  • 通过监控zookeeper上的注册信息来实时获得当前可用的proxy列表,既可以保证高可用性;也可以通过轮流请求所有的proxy实现负载均衡。

    对于其他语言,可以使用haproxy代理到后端的多个codis-proxy,达到负载均衡的作用。而haproxy的单点问题可以使用keepalive做HA,这样就可以实现一个高可用高并发的codis-proxy了。


四、codis-dashboard高可用问题

    Codis Dashboard:集群管理工具,支持codis-proxy、codis-serve的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有codis-proxy的状态的一致性。

    对于同一个业务集群而言,同一个时刻codis-dashboard只能有0个或者1个。所有对集群的修改都必须通过codis-dashboard完成。由于本身的限制,codis-dashboard无法做到高可用。也就是说如果你集群中的codis-dashboard挂掉了,那么你将无法对集群做出更改操作,另外你的codis-fe界面也会异常(获取不到数据),但此时你的codis集群对外服务不会出现任何问题。需要做的只是去其他节点开启codis-dashboard即可,此时会重新去zookeeper中注册信息,集群操作不会有任何问题,所以也不必太担心codis-dashboard挂掉了,只需要做好监控及时报警即可。

    另外codis-fe需要更改一下配置文件,把codis-dashboard的地址更换为新的codis-dashboard主机;重新启动codis-fe,会使整个codis集群恢复了最初的完整性,期间不会对客户端连接造成任何影响。


五、codis-fe安全性

    默认情况下,codis-fe图形化界面没有任何安全措施,任何人只要知道地址都可以登录操作codis集群。此时你可以借助nginx/Apache的访问控制来进行codis-fe访问控制。提高codis-fe安全性。


    摘抄:

    http://www.ywnds.com/?p=6646

    https://segmentfault.com/a/1190000010905025

  

 


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群