Codis 是一个分布式 Redis 解决方案

Codis 是一个分布式 Redis 解决方案,第1张

Codis是一个分布式Redis解决方案


Codis源代码地址:https://github.com/wandoulabs/codis

可以参考:https://github.com/wandoulabs/Codis/blob/master/doc/tutorial_zh.MD。


今天分享的文章纯属个人理解和体会。如果有错误,请指出来。

更重要的是,认识一些正在使用或者将要使用Codis的朋友,多多少少是有帮助的。


官方文件关于Codis的整体结构和功能描述的太详细了,不想画蛇添足。


由于使用AWS的当前ec2主机,默认的当前用户是ec2-user,而不是root。


1.安装基本Go环境,所有节点都已安装。

# sudo yum -y install gcc gcc-c++ make git wget go  # sudo vim /etc/profile.d/go.sh export GOPATH=/opt/mygo export PATH=$GOPATH/bin:$JAVA_HOME/bin:$PATH # source /etc/profile


2.安装Codis。除ZooKeeper之外的所有节点都正常安装。

# sudo mkdir /opt/mygo # sudo chown -R ec2-user.ec2-user /opt/mygo/ # go get -u -d github.com/wandoulabs/codis # cd /opt/mygo/src/github.com/wandoulabs/codis/ # make # make gotest


3.要安装ZooKeeper,只需要在这个节点安装即可。

# yum -y install java-1.8.0 # wget https://www.apache.org/dist/zookeeper/zookeeper-3.4.7/zookeeper-3.4.7.tar.gz # tar -zxf zookeeper-3.4.7.tar.gz -C /opt # cd /opt/zookeeper-3.4.7 # cp conf/zoo_sample.cfg conf/zoo.cfg # mkdir /data/{zookeeper,logs} -p # sudo vim conf/zoo.cfg dataLogDir=/data/logs dataDir=/data/zookeeper server.1=localhost:2888:3888 # vim /data/zookeeper/myid 1 # vim /etc/profile.d/zookeeper.sh PATH=$PATH:/opt/zookeeper-3.4.7/bin # source /etc/profile # sudo /opt/zookeeper-3.4.7/bin/zkServer.sh start conf/zoo.cfg # netstat -alnut | grep 2181 # nc -v localhost 2181 # zkServer.sh status#查看ZooKeeper的角色(leader|follower|standalone) # zkCli.sh -server 127.0.0.1:2181 ls / create /Test hellozk get /Test set /Test hellozookeeper get /Test delete /Test get /Test quit


4.启动codis-redis服务。仅在redis节点中。

# sudo mkdir /etc/redis # cd /opt/mygo/src/github.com/wandoulabs/codis # sudo ./bin/codis-server /etc/redis/redis.conf # sudo netstat -tnlp |grep codis-se


5.在dashbaord节点上 *** 作。

1> 配置dashboard服务 # cd /opt/mygo/src/github.com/wandoulabs/codis/ # mkdir /etc/codis # cp config.ini /etc/codis/codis-config.ini # vim vim /etc/codis/codis-config.ini zk=172.31.16.33:2181 product=cn_release_codis dashboard_addr=localhost:18087 proxy_id=proxy_1 proto=tcp4 2> 启动dashboard服务 # cd /opt/mygo/src/github.com/wandoulabs/codis/ # ./bin/codis-config -c /etc/codis/codis-config.ini dashboard 3> 初始化 slots(该命令会在zookeeper上创建slot相关信息) # cd /opt/mygo/src/github.com/wandoulabs/codis/ # ./bin/codis-config -c /etc/codis/codis-config.ini slot init 4> 强制格式化slot # ./bin/codis-config -c /etc/codis/codis-config.ini slot init


6.添加codis-group-redis

>添加第一组编码

# ./bin/codis-config -c /etc/codis/codis-config.ini server add 1 172.31.51.119:6379 master # ./bin/codis-config -c /etc/codis/codis-config.ini server add 1 172.31.51.125:6379 slave

>添加第二组codis。

# ./bin/codis-config -c /etc/codis/codis-config.ini server add 2 172.31.51.126:6379 master # ./bin/codis-config -c /etc/codis/codis-config.ini server add 2 172.31.51.124:6379 slave

>打开切片

# ./bin/codis-config -c /etc/codis/codis-config.ini slot range-set 0 511 1 online # ./bin/codis-config -c /etc/codis/codis-config.ini slot range-set 512 1023 2 online

>在线扩展容量和添加新存储片。

# ./bin/codis-config -c codis-config.ini server add 3 192.168.10.131:6381 master # ./bin/codis-config -c codis-config.ini server add 3 192.168.10.132:6381 slave # ./bin/codis-config -c codis-config.ini slot migrate 256 511 3


7.启动codis-代理服务。

例如,有两个在线Codis代理服务。

# cd /opt/mygo/src/github.com/wandoulabs/codis/ # mkdir /etc/codis # cp config.ini /etc/codis/codis-proxy.ini  # vim /etc/codis/codis-proxy.ini  zk=172.31.51.123:2181 product=cn_release_codis dashboard_addr=172.31.51.120:18087 proxy_id=proxy_1 proto=tcp4 # ./bin/codis-proxy -c /etc/codis/codis-proxy.ini -L /var/log/codis_proxy.log --cpu=1 --addr=172.31.51.122:19000 --http-addr=172.31.51.122:11000 # cd /opt/mygo/src/github.com/wandoulabs/codis/ # mkdir /etc/codis # cp config.ini /etc/codis/codis-proxy.ini  # vim /etc/codis/codis-proxy.ini  zk=172.31.51.123:2181 product=cn_release_codis dashboard_addr=172.31.51.120:18087 proxy_id=proxy_2 proto=tcp4 # ./bin/codis-proxy -c /etc/codis/codis-proxy.ini -L /var/log/codis_proxy.log --cpu=1 --addr=172.31.51.121:19000 --http-addr=172.31.51.121:11000


8.仪表板监控页面

http://<;dashboard_ip>:18087/admin/


9.移除碎片化进程。

---假设将分片3移除--- 1. 设置codis-proxy为offline状态. ./bin/codis-config -c codis-config.ini proxy offline proxy_1 2. 迁移分片3上的数据到分片1 ./bin/codis-config -c codis-config.ini slot migrate 256 511 1 3. 彻底移除分片3 ./bin/codis-config -c codis-config.ini server remove-group 3


10.codis服务器的高可用性

# export GOPATH=/opt/mygo # go get github.com/ngaut/codis-ha # cp /opt/mygo/bin/codis-ha /opt/mygo/src/github.com/wandoulabs/codis/bin/ # cd /opt/mygo/src/github.com/wandoulabs/codis/ # ./bin/codis-ha -codis-config="localhost:18087" -log-level="info" -productName="cn_release_codis"


遇到的问题和解决方法,希望这部分对朋友有用。

(1)

2015/12/11 16:49:10 dashboard.go:160: [INFO] dashboard listening on addr: :18087 2015/12/11 16:49:10 dashboard.go:234: [PANIC] create zk node failed [error]: dashboard already exists: {"addr": "172.31.16.30:18087", "pid": 7762}

解决方法:

这种问题是由于使用kill-9导致dashboard服务非正常终止,而你在退出服务的时候没有清除自己在zk上的信息,所以出现了这种问题。

所以在停止codis集群的任何服务的时候都不要轻易使用kill-9,但是可以使用kill。

如果使用kill,服务终止时会自动清除自己在zk上的信息,下次重启时会立即注册。


临时解决方案是:

#rmr/ZK/codis/db_codis_proxy_test/仪表板


(2)

仪表板提供的api接口

http://debugAddr/setloglevel?级别=调试

Http://debugAddr/debug/vars#主要获取ops信息,也可以设置日志级别。

通过访问代理的debug_addr对应地址/debug/vars路径可以看到每个代理的qps信息。


(3)

codis-proxy服务日志中生成信息的解释。

退出:客户端发出的退出指令。

EOF:连接直接断开,即代理从客户端的tcp读取时,遇到EOF。


Codis会在每次主动关闭客户端的连接时进行记录。一般来说,可能有:

非法 *** 作,请求公司的底层redis死了,这个会话长时间没有请求触发了代理端的清理逻辑。

第三个可能更大。要看6点以后的时间。是因为你的访问量不大吗?


会话最大超时=1800

如果30分钟内没有ops,codis会主动关闭这个连接。

嗯,主要是有人反映,有时候客户端主动关闭了他们环境中的连接,但是代理端没有收到关闭消息,导致代理端最后积累了很多连接,把资源都吃光了。


(4)

NaNGB

因为redis配置文件中没有设置memorymaxmemory参数



(5)

codis中的所有读写 *** 作都在redis-master上进行,redis-master只负责数据冗余。当主设备出现故障时,可以切换主从设备。


(6)******

在codis聚类中,用乘积来区分是否是同一个聚类。因此,如果是同一个集群,那么仪表板和codis-proxy中的产品应该设置相同。否则,我们将面临以下问题。

zk:节点不存在

codis-proxy配置文件中的proxy_id用于区分同一集群中的不同成员,因此该参数应该是唯一的。


(7)

Codis-ha只负责在主设备挂起时自动选择一个从设备提升为主设备,而不会将剩余的从设备再次挂起到新的主设备上,也不保证选择的从设备是最优的。


(8)

打开的文件太多

用python多线程测试redis的压力,压力超过4000,就会出现这种问题。

两个codis-proxy支持并发2-3w没有太大问题。


(9)

即使dashboard服务停止,也不会影响app通过codis-proxy正常访问redis服务。

但是会影响codis-ha服务,所以主备不会自动切换。


也就是说,如果dashboard服务被停止,那么app仍然可以正常访问redis,但是codis-ha会终止运行期。


(10)

redis数据的主从复制可以在同一个组内实现,但不能在不同的组内实现。

如果同一个组的主从全部挂机,数据会丢失,但如果仍然查询挂机组中的键,会得到错误。并且该键也将被占用。

所有写 *** 作codis-proxy都不会发送到挂起组。


(11)

在同组的codis-server实例下,多个从机会分担主机的读请求吗?

codis的设计思想是更注重一致性,redis的主从同步不是强一致的,所以codis不支持读写分离。


(12)

一个集群中只能运行一个仪表板服务,同时可以运行多个但只能运行一个服务。



如果是正在使用Codis的朋友,肯定会遇到这样的问题,就是dashboard的登录认证。这里我做了一个基于nginx的用户登录认证,配置如下。

当时我在做这个登录认证的时候,也是2~3个小时才能解决。这不是因为它有多复杂,而是因为许多仪表板都是基于api来获取数据。如果配置中没有重写重定向,则只会显示页面,而不会获得任何数据。记住


下一篇Codis文章的补充:

  • 强烈建议Codis集群中的每个角色服务都是服务器风格的服务启动脚本。这个我已经做完了,但是还需要调整。

  • 关于Dashboard服务的监控,我觉得更多的是Redis主从。我也会在下一篇文章解释遇到Redis的坑。

    由于dashboard没有友好的登录认证机制,建议关闭dashboard服务,开发一个可以查看但没有 *** 作权限的可视化界面。




    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/779584.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-04
    下一篇 2022-05-04

    发表评论

    登录后才能评论

    评论列表(0条)

    保存