Redis分布式集群实战(六)——codis集群的搭建

一、Codis原理

1、什么是Codis?

Codis 是一个 分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别(不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作,所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
Codis是一套用go语言编写的,为了应对高并发环境下的redis集群软件,原理是对一个redis key操作前,先把这个key通过crc32算法,分配到不同redis的某一个slot上,实现并发读写功能.而且能通过zookeeper调用redis-sentinel来实现故障切换功能.现在最新版本是3.2.1,依托于redis3.2.9开发出来。

2、Codis组成

组成 介绍
Codis-proxy 实现redis协议,由于本身是无状态的,因此可以部署很多个节点
Codis-config 是codis的管理工具,包括添加/删除redis节点添加/删除proxy节点,发起数据迁移等操作,自带httpserver,支持管理后台方式管理配置
Codis-server 是codis维护的redis分支,基于2.8.21分支,加入了slot的支持和原子的数据迁移指令; codis-proxy和codis-config只能和这个版本的redis交互才能正常运行
Zookeeper 用于codis集群元数据的存储,维护codis集群节点

3、Codis的架构

codis采用一层无状态的proxy层,将分布式逻辑写在proxy上,底层的存储引擎还是Redis,数据的分布状态存储于zookeeper(etcd)中

在这里插入图片描述

4、Codis的优缺点

(1)优点
对客户端透明,与codis交互方式和redis本身交互一样
支持在线数据迁移,迁移过程对客户端透明有简单的管理和监控界面
支持高可用,无论是redis数据存储还是代理节点
自动进行数据的均衡分配
最大支持1024个redis实例,存储容量海量
高性能

(2)缺点
采用自有的redis分支,不能与原版的redis保持同步
如果codis的proxy只有一个的情况下, redis的性能会下降20%左右
某些命令不支持,比如事务命令muti
国内开源产品,活跃度相对弱一些

5、zookeeper

zookeeper依赖jdk语言包,描述:用于存放数据配置路由表。zookeeper简称zk。在生产环境中,zk部署越多,其可靠性越高。由于zk集群是以宕机个数过半才会让整个集群宕机,因此,奇数个zk更佳。

逻辑架构如下:

  • 访问层:

访问方式可以是类似keepalived集群的vip方式,或者是通过java代码调用jodis控件再连接上zookeeper集群,然后查找到可用的proxy端,进而连接调用不同的codis-proxy地址来实现高可用的LVS和HA功能。

  • 代理层:

中间层由codis-proxy和zookeeper处理数据走向和分配,通过crc32算法,把key平均分配在不同redis的某一个slot中。实现类似raid0的条带化,在旧版本的codis中,slot需要手工分配,在codis3.2之后,只要点一个按钮slot会自动分配,相当方便,但是也可以手动分配,需要另外调用codis-admin命令。

  • 数据层:

最后codis-proxy把数据存进真实的redis-server主服务器上,由于codis的作者黄东旭相当注重数据一致性,不允许有数据延时造成的数据不一致,所以架构从一开始就没考虑主从读写分离。从服务器仅仅是作为故障切换的冗余架构,由codis-dashboard监控各服务的状态,然后通过改写zookeeper数据和调用redis-sentinel实现故障切换功能。

二、codis集群的搭建部署

主机 服务
server1 zk,codis-dashboard,codis-proxy,codis-fe,codis-server
server2 codis-server
server3 codis-server

实验过程如下所示:
如果之前做过redis的服务,将redis服务停掉,因为会占用6379端口。

1、安装go,这里选用的版本为go1.9.1——因为codis3.2要求至少是1.7或1.8以上版本。

[root@server1 ~]# tar zxf go1.9.1.linux-amd64.tar.gz -C /usr/local/    #-C:指定解压目录
[root@server1 ~]# cd /usr/local 

在这里插入图片描述

在这里插入图片描述
2、配置环境变量

[root@server1 ~]# vim /etc/profile     #编辑环境变量的配置文件
 78 export GOROOT=/usr/local/go
 79 export GOPATH=/usr/local/codis
 80 export PATH=$PATH:/usr/local/go/bin
 [root@server1 ~]# source /etc/profile    #重新加载环境变量,使得刚刚配置的环境变量生效

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3、对codi进行源码编译,编译codis时依赖go,所以在安装codis先装好go。

[root@server1 ~]# mkdir -p $GOPATH/src/github.com/CodisLabs       #设置编译环境
[root@server1 ~]# yum install unzip -y    #安装unzip软件,以支持unzip命令
[root@server1 ~]# unzip codis-release3.2.zip -d  $GOPATH/src/github.com/CodisLabs
[root@server1 ~]# cd $GOPATH/src/github.com/CodisLabs
[root@server1 CodisLabs]# mv codis-release3.2/ codis     #为了方便,将名字该为codis
[root@server1 CodisLabs]# cd codis/
[root@server1 codis]# yum install gcc git autoconf -y 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4、进行编译安装

root@server3 codis]# pwd
/usr/local/codis/src/github.com/CodisLabs/codis
[root@server3 codis]# make MALLOC=libc      

在这里插入图片描述

在这里插入图片描述codis源码编译完成之后:组件的启动脚本$GOPATH/src/github.com/CodisLabs/codis/admin目录下;配置文件$GOPATH/src/github.com/CodisLabs/codis/config目录下

在这里插入图片描述

5、安装JDK

[root@server1 ~]# yum install jdk-8u121-linux-x64.rpm -y
[root@server1 ~]# java -version    

在这里插入图片描述
在这里插入图片描述

6、安装zookeeper

[root@server1 ~]# tar zxf zookeeper-3.4.9.tar.gz -C /usr/local/    #-C:指定解压目录
[root@server1 ~]# cd /usr/local/
[root@server1 local]# mv zookeeper-3.4.9/ zookeeper

在这里插入图片描述
在这里插入图片描述

7、编辑环境变量

[root@server1 ~]# vim /etc/profile
 78 export GOROOT=/usr/local/go
 79 export GOPATH=/usr/local/codis
 80 export ZOOKEEPER_HOME=/usr/local/zookeeper
 81 export PATH=$PATH:/usr/local/go/bin:$ZOOKEEPER_HOME/bin
[root@server1 ~]# source /etc/profile    #重新加载环境变量

在这里插入图片描述

在这里插入图片描述

8、修改zookeeper的配置文件

[root@server1 ~]# cd /usr/local/zookeeper/conf/
[root@server1 ~]# cp  zoo_sample.cfg   zoo.cfg
[root@server1 conf]# vim zoo.cfg 
tickTime=2000      #一个周期(tick)的时长(单位:毫秒)
initLimit=10       #初始化同步阶段最多耗费tick个数
syncLimit=5        #等待应答的最大间隔tick个数 
dataDir=/data/zookeeper/data   #该目录需要手动建立。
clientPort=2181                #客户端连接server的端口,即对外服务端口,一般设置为 2181 
maxClientCnxns=60              #最大连接数设置(单ip限制). 注:默认60,设成0即无限制
autopurge.purgeInterval=24     #ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时
autopurge.snapRetainCount=500      #这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3

在这里插入图片描述注意:因为我这里只部署单个codis-proxy节点的环境,如果是多个,需要在zookeeper的配置文件里面写入:

server.1=codis-1:2888:3888
server.2=codis-2:2888:3888
server.3=codis-3:2888:3888

其中2888表示zookeeper程序监听端口,3888表示zookeeper选举通信端口

说明:

server.A=B:C:D
	A 是一个数字,表示这个是第几号服务器;
    B 是这个服务器的 ip 地址;
    C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
    D 表示的是万一集群中的 Leader 服务器挂 了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的 端口。

9、设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字(该数字的取值范围是1-255),用来标识当前主机,conf/zoo.cfg文件配置的server.X中的X是什么数字,则myid文件就输入这个数字,我只有一台zk,所以配置文件里可以不配置server.X,但还是要配置myid 的,echo一个数字1进去即可。如果有多台zk,则分别在zk服务器上echo对应的数字进对应的myid文件。

[root@server1 conf]# mkdir /data/zookeeper/data -p
[root@server1 conf]# echo "1" > /data/zookeeper/data/myid

在这里插入图片描述

10、启动zookeeper

[root@server1 conf]# cd /usr/local/zookeeper/bin
[root@server1 bin]# ./zkServer.sh start ##启动zookeeper
[root@server1 bin]# ./zkServer.sh status ##查看zookeeper的状态

在这里插入图片描述
在这里插入图片描述
11、对codis进行配置,并启动codis的各个组件。编辑/usr/local/codis/config.ini文件并启动codis-dashboard组件

  • 启动dashboard前,必须启动zookeeper服务,这是必须的
[root@server1 bin]# vim /usr/local/codis/config.ini
	zk=localhost:2181
	product=meng
	proxy_id=proxy_1 
	net_timeout=5 
	dashboard_addr=localhost:18087
	coordinator=zookeeper
[root@server1 bin]#  cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server1 admin]# ls
codis-dashboard-admin.sh  codis-fe-admin.sh  codis-proxy-admin.sh  codis-server-admin.sh
[root@server1 admin]#  ./codis-dashboard-admin.sh start  ##启动codis-dashboard组件
[root@server1 admin]# ./codis-proxy-admin.sh start		 ##启动codis-proxy组件
[root@server1 admin]# ./codis-fe-admin.sh start          ##启动codis-fe组件
[root@server1 admin]#  ./codis-server-admin.sh start     ##启动codis-server组件
[root@server1 admin]# netstat -antlp

在这里插入图片描述
在这里插入图片描述在这里插入图片描述查看端口
在这里插入图片描述
12、配置server3和server2,步骤完全相同。


vim /etc/profile	##编辑环境变量
	export GOROOT=/usr/local/go
	export GOPATH=/usr/local/codis
	export PATH=$PATH:/usr/local/go/bin
source /etc/profile

tar zxf go1.8.linux-amd64.tar.gz -C /usr/local/
mkdir -p $GOPATH/src/github.com/CodisLabs
unzip codis-release3.2.zip -d  $GOPATH/src/github.com/CodisLabs

 cd $GOPATH/src/github.com/CodisLabs
 mv codis-release3.2/ codis
 yum install gcc git autoconf -y
 cd codis/
 make MALLOC=libc
 
 cd /usr/local/codis/src/github.com/CodisLabs/codis/config/
 vim redis.conf 
 
 cd /usr/local/codis/src/github.com/CodisLabs/codis/admin
 ./codis-server-admin.sh start
 netstat -antlp

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

13、测试:172.25.2.1:9090,进入web管理界面
在这里插入图片描述
点击codis-demo并向下拉动界面

在这里插入图片描述

可以看到codis-proxy已经激活

在这里插入图片描述
可以新建组,也可以添加redis-server实例。

在这里插入图片描述

在这里插入图片描述

同理,可以添加172.25.2.2:6379和172.25.2.3:6379
在这里插入图片描述

发布了125 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ranrancc_/article/details/104321571
今日推荐