关于codis的安装请看上篇文章:https://blog.csdn.net/Hudonyo/article/details/88740726
本次搭建所使用的各组件版本说明:
codis-3.2
zookeeper-3.4.12
jdk1.8.0_181
go1.9.1
codis 3.x 相比之前的版本,重构了整个集群组件通信方式,废弃了codis-config,所以基于codis 3.x 的集群搭建方式相比之前版本也有些不同。
因为这里使用zookeeper作为集群元数据的外部存储,所以需要启动zookeeper,默认使用filesystem
修改配置文件:
[root@iZwz977ogd6jecq7rowvtsZ conf]# cp zoo_sample.cfg zoo.cfg
[root@iZwz977ogd6jecq7rowvtsZ conf]# vim zoo.cfg
这里是单机zk
在dataDir配置的目录下新建一个myid文件,并写入1,用来标志当前主机,至于为什么,后面补充
[root@iZwz977ogd6jecq7rowvtsZ zookeeper]# vim myid
[root@iZwz977ogd6jecq7rowvtsZ conf]# echo "1" > /data/zookeeper/myid
启动zk:
[root@iZwz977ogd6jecq7rowvtsZ ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
查看启动的zk启动状态:
[root@iZwz977ogd6jecq7rowvtsZ config]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: standalone
在哪个目录启动,就会在哪个目录下生成zk启动日志zookeeper.out
因为这里只启动了单机zk,所以Mode为standalone,如果是多台,最先启动的为leader,其他为follower
修改dashboard.toml配置:
[root@iZwz977ogd6jecq7rowvtsZ config]# cd /apps/codis/src/github.com/CodisLabs/codis/config
[root@iZwz977ogd6jecq7rowvtsZ config]# ls
dashboard.toml proxy.toml redis.conf sentinel.conf
[root@iZwz977ogd6jecq7rowvtsZ config]# vim dashboard.toml
启动codis-dashboard:
[root@iZwz977ogd6jecq7rowvtsZ CodisLabs]# cd codis/
[root@iZwz977ogd6jecq7rowvtsZ codis]# ls
admin cmd deploy example kubernetes nohup.out scripts wandoujia_license.txt
ansible config doc extern Makefile pkg vendor
bin dashboard.log.2019-03-26 Dockerfile Godeps MIT-LICENSE.txt README.md version
[root@iZwz977ogd6jecq7rowvtsZ codis]# nohup ./bin/codis-dashboard --ncpu=1 --config=./config/dashboard.toml --log=dashboard.log --log-level=debug &
nohup: ignoring input and appending output to ‘nohup.out’
#或者
[root@iZwz977ogd6jecq7rowvtsZ codis]# nohup ./bin/codis-dashboard -c ./config/dashboard.toml -l dashboard.log --log-level=debug &
nohup命令:忽略挂断信号,&命令:后台运行,两者结合使用使该进程在后台永久执行。
--ncpu:最大使用cpu个数
--config/-c:启动的配置文件
--log/-l:日志输出文件,配置文件在哪里,日志文件输出到哪里
--log-level:日志级别,默认INFO,推荐WARN
[root@iZwz977ogd6jecq7rowvtsZ bin]# zkCli.sh
[zk: localhost:2181(CONNECTED) 5] ls /codis3/codis-demo/topom
[]
[zk: localhost:2181(CONNECTED) 6]
可见,当 codis-dashboard启动时,会在外部存储(这里是zk)上存放一条数据,用于存储dashboard信息,同时作为LOCK存在,当codis-dashboard安全退出时,会主动删除该数据。但当异常退出时,这些数据有可能不会被删除,会导致下次重启失败,解决办法见下面的codis-dashboard异常退出的修复
停止codis-dashboard:
[root@iZwz977ogd6jecq7rowvtsZ codis]# ./bin/codis-admin --dashboard=0.0.0.0:18080 --shutdown
codis-dashboard异常退出的修复,有两种办法:
1.使用codis-admin命令行工具强制删除LOCK(推荐):
首先确认codis-dashboard进程已经退出(很重要):ps -ef|grep codis
然后执行codis-admin命令:
[root@iZwz977ogd6jecq7rowvtsZ codis]# ./bin/codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181
2.直接到zk中删除对应节点信息
#删除整个节点信息
[root@iZwz977ogd6jecq7rowvtsZ src]# rmr /codis3
修改proxy.toml配置:
[root@iZwz977ogd6jecq7rowvtsZ codis]# vim ./config/proxy.toml
注:从配置文件里的注释可以看出,如果配置了jodis信息,默认Codis 3会将jodis节点注册在/jodis/{product_name}下,所以如果想兼容Codis 2的格式的话,可以考虑将jodis_compatible设置成true
启动codis-proxy:
[root@iZwz977ogd6jecq7rowvtsZ codis]# nohup ./bin/codis-proxy --ncpu=1 -c ./config/proxy.toml -l /apps/logs/codis/proxy.log --log-level=
debug &
可以看出,codis-proxy启动后,处于waiting状态,监听proxy-addr地址,但是不会accept连接,添加到集群并完成集群状态的同步后,才能改变状态为online状态。添加到集群的方法有以下两种:
1.通过codis-fe集群管理界面添加,将admin_addr加入到集群中,下面会详细讲如何添加。
2.通过codis-admin命令行工具添加,方法如下:
[root@iZwz977ogd6jecq7rowvtsZ codis]# ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080
其中--dashboard=127.0.0.1:18080和--create-proxy -x 127.0.0.1:11080分别为dashboard和proxy的admin_addr地址。
proxy启动日志:
可以看出,proxy状态由waiting online状态变成online状态了 。
dashboard读取proxy信息,并在zk中创建proxy节点信息,如果配置了jodis且使用zk做外部存储时,还会创建jodis节点:
添加proxy节点到集群过程中,dashboard会完成如下一系列动作:
1.获取proxy信息,对集群name以及auth进行验证,并将其信息写入到外部存储(这里是zk)中
2.同步slots状态
3.标记proxy状态为online,此后proxy开始accept连接并开始提供服务。
停止codis-proxy:
[root@iZwz977ogd6jecq7rowvtsZ codis]# ./bin/codis-admin --proxy=0.0.0.0:11080 --shutdown
codis-proxy异常退出修复:
通常codis-proxy都是通过codis-dashboard进行移除, 移除过程中codis-dashboard为了安全会向codis-proxy发送offline指令,成功后才会将proxy信息从外部存储中移除。如果codis-proxy异常退出,该操作会失败,。此时可以通过codis-admin命令行工具进行移除:
首先确认codis-proxy进程已经退出(很重要):ps -ef | grep codis
然后运行codis-admin命令删除proxy:
./bin/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy --addr=127.0.0.1:11080 --force
##选项--force表示,无论offline操作是否成功,都从外部存储中将该节点删除。
修改redis.conf配置文件,我这里主要设置redis绑定ip、日志输出目录:
[root@iZwz977ogd6jecq7rowvtsZ codis]# vim ./config/proxy.toml
启动codis-redis:
[root@iZwz977ogd6jecq7rowvtsZ codis]# ./bin/codis-server ./config/redis.conf
启动成功日志:
通过redis-cli连接codis-server,并set一个值进去进行测试:
注意,此时的codis-redis并未加入到集群,可通过codis-fe集群管理界面将该codis-redis加入到GROUP中,下面介绍如何添加group
codis-fe组件主要提供集群管理界面的。启动命令:
[root@iZwz977ogd6jecq7rowvtsZ codis]# nohup ./bin/codis-fe --ncpu=1 -l /apps/logs/codis/fe.log --log-level=debug --zookeeper=127.0.0.1:2181 --listen=0.0.0.0:8080 &
如果开启了防火墙,需检查启动的端口是否开放:
#查看所有开放的端口
[root@iZwz977ogd6jecq7rowvtsZ zookeeper-3.4.12]# firewall-cmd --zone=public --list-ports
#查看某一个端口是否开放
[root@iZwz977ogd6jecq7rowvtsZ zookeeper-3.4.12]# firewall-cmd --zone=public --query-port=80/tcp
yes
#添加一个开放端口
[root@iZwz977ogd6jecq7rowvtsZ zookeeper-3.4.12]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
#添加完后重新载入使其生效
[root@iZwz977ogd6jecq7rowvtsZ zookeeper-3.4.12]# firewall-cmd --reload
success
浏览器访问codis-fe集群管理界面:
管理proxy节点:
管理Group、codis-server节点:
初始化slots:
新增的集群slots状态是offline,因此我们需要对它进行初始化(将1024个slot分配到各个Group)
至此,一个简单的单机版(一个codis-proxy节点、一个codis-server、一台zk)的codis集群就搭建好了,后续有时间会搭一个多节点的codis集群,并做一个可用性、数据一致性、压力测试。
下篇笔记写如何使用jodis连接codis-proxy