Linux下redis集群方案之codis集群的搭建部署(codis版本:codis3.2.1)

官方中文文档:https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md

对于Redis集群方案有好多种,基本常用的就是twemproxy,codis,redis  cluster这三种解决方案。

本博文介绍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的优缺点

  • 优点:实现高并发读写,数据一致性高。
  • 缺点:性能有较大损耗,故障切换无法保证不丢key。无法进行读写分离。

3.codis的架构介绍

<1>搭建codis集群所需的软件

(1)go

描述:codis依赖语言包

(2)codis

描述:codis集群套件,里面含有redis相关程序和集群专用程序。主要功能程序解析:

  • codis-server:属于redis-server优化版,基于 redis-3.2.9 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。
  • codis-proxy:客户端连接的 Redis 代理服务,实现了 Redis 协议。 除部分命令不支持以外(例如:keys *,flush ),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
  1. 对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
  2. 不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
  • codis-dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
  1. 对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
  2. 所有对集群的修改都必须通过 codis-dashboard 完成。
  • Codis-fe:集群web管理界面。
  1. 多个集群实例共享可以共享同一个前端展示页面;
  2. 通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
  • redis-sentinel:可以实现对Redis的监控、通知、自动故障转移。如果Master不能工作,则会自动启动故障转移进程,将其中的一个Slave提升为Master,其他的Slave重新设置新的Master服务。Sentinel的配置由 codis-dashboard和zookeeper一起控制,不需要手工填写。

(3)jdk

描述:zookeeper依赖语言包

(4)zookeeper

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

<2>逻辑架构如下:

访问层:访问方式可以是类似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实现故障切换功能。

二.实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机 ip
server1(codis-server) 172.25.83.1
server2(codis-server) 172.25.83.2
server3(zk,codis-dashboard,codis-proxy,codis-fe,codis-server) 172.25.83.3

三.codis集群的搭建部署(我这里只部署单个codis-proxy节点的环境)

配置server3:(因为server3之前只做过redis  cluster集群的,所以要停掉redis-server服务)

前期准备:

停掉redis-server服务

1.安装go:(这里选用的版本为go1.9.1)——因为codis3.2要求至少是1.7或1.8以上版本的,那干脆下最新版吧。

<1>下载安装包:go1.9.1.linux-amd64.tar.gz(下载地址为:https://studygolang.com/dl/golang/go1.9.1.linux-amd64.tar.gz

<2>下载后,解压就可以用了:

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

2.配置环境变量

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

3.对codi进行源码编译,编译codis时依赖go,所以在安装codis先装好go,上面已经装好:

<1>下载codis的源码包:codis-release3.2.zip

<2>设置编译环境

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

<3>对codis进行源码编译

[root@server3 codis]# yum install gcc git autoconf -y   #安装codis的依赖包
[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目录下

4.安装JDK:(这里选用的版本为jdk1.8),自己在官网下载一个安装即可,版本要求不严格,后面的zookeeper会用到JDK:

<1>下载安装包:jdk-8u201-linux-x64.rpm

<2>安装rpm包

[root@server3 ~]# yum install jdk-8u201-linux-x64.rpm -y

安装完成之后,查看java的版本

5.安装zookeeper:(这里选用的版本为zookeeper-3.4.13)

<1>下载安装包:zookeeper-3.4.13.tar.gz(下载地址为:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

<2>下载后,解压就可以用了

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

6.编辑环境变量对应的配置文件

[root@server3 ~]# 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@server3 ~]# source /etc/profile    #重新加载环境变量

7.对zookeeper进行配置,并启动zookeeper

<1>修改zookeeper的配置文件

[root@server3 ~]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg 
[root@server3 ~]# cd /usr/local/zookeeper/conf/
[root@server3 conf]# vim zoo.cfg 
tickTime=2000      
initLimit=10     
syncLimit=5        
dataDir=/data/zookeeper/data   #数据存储目录,一会需要手动建立
clientPort=2181    #通信端口
maxClientCnxns=60  
autopurge.purgeInterval=24
autopurge.snapRetainCount=500
#server.1=codis-1:2888:3888
#server.2=codis-2:2888:3888
#server.3=codis-3:2888:3888

#补充:
(1)tickTime=2000 
#一个周期(tick)的时长(单位:毫秒)
#ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime。
(2)initLimit=10 
#初始化同步阶段最多耗费tick个数
#Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了。
(3)syncLimit=5
#等待应答的最大间隔tick个数 
#在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题。
(4)maxClientCnxns=60  
#最大连接数设置(单ip限制). 注:默认60,设成0即无限制
#单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。指定客户端IP的限制策略
(5)autopurge.purgeInterval=24
#3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。
(6)autopurge.snapRetainCount=500
#3.4.0及之后版本,这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个


#zoo.cfg最后三行特别说明
说明:server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
#其中2888表示zookeeper程序监听端口,3888表示zookeeper选举通信端口。

<2>设置myid:

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

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

<3>启动zookeeper:因为环境变量里已经添加了路径,直接执行命令即可,执行zkServer.sh start后,然后可以执行"zkServer status"来查看zookeeper的状态。

[root@server3 ~]# zkServer.sh start         #启动zookeeper
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@server3 ~]# zkServer.sh status        #查看zookeeper的状态
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: standalone

在哪个目录下启动,就在那个目录下产生一个启动的日志zookeeper.out,查看这个日志可以查看是否正常启动了。由于单个zookeeper,所 以这里指示Mode: standalone,如果有多个zk节点,就只有一个Mode: leader的状态,别的都是Mode: follower状态。

8.对codis进行配置,并启动codis的各个组件

值的注意的是:启动dashboard前,必须启动zookeeper服务,这是必须的,后面有很多操作,都可以在web页面完成,例如添加/删除组,添加/删除redis实例等。

<1>编辑/usr/local/codis/config.ini文件

zk=localhost:2181
product=test
proxy_id=proxy_1
net_timeout=5
dashboard_addr=localhost:18087
coordinator=zookeeper


参数解释:
zk=localhost:2181  //zookeeper的地址, 如果是zookeeper集群,可以这么写: zk=hostname1:2181,hostname2:2181,hostname3:2181,hostname4:2181,hostname5:2181,如果是etcd,则写成http://hostname1:port,http://hostname2:port,http://hostname3:port
product=test     //产品名称, 这个codis集群的名字, 可以认为是命名空间, 不同命名空间的codis没有交集
proxy_id=proxy_1  //proxy会读取, 用于标记proxy的名字, 针对多个proxy的情况, 可以使用不同的config.ini, 只需要更改 proxy_id 即可
net_timeout=5     //检测状态时间间隔
dashboard_addr=localhost:18087  //dashboard 服务的地址,CLI 的所有命令都依赖于 dashboard 的 RESTful API,所以必须启动
coordinator=zookeeper   //如果用etcd,则将zookeeper替换为etcd

<2>启动codis的各个组件

(1)启动codis-dashboard组件

[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-dashboard-admin.sh start

 

(2)启动codis-proxy组件

[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-proxy-admin.sh start

(3)启动codis-fe组件

[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-fe-admin.sh start

 

Codis-fe的端口是9090

 

(4)启动codis-server组件
 

[root@server3 ~]# cd $GOPATH/src/github.com/CodisLabs/codis/admin
[root@server3 admin]# ./codis-server-admin.sh start

配置server1:

1.安装go(同server3)

2.配置环境变量(同server3)

3.对codis进行源码编译(同server3)

4.对codis进行配置,并启动codis-server这个组件

<1>对codis进行配置:

[root@server1 ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis/config/
[root@server1 config]# vim redis.conf
 61 bind 0.0.0.0

<2>启动codis-server组件

[root@server1 ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis/admin
[root@server1 admin]# ./codis-server-admin.sh start

配置server2:

配置过程同server1

测试:

在浏览器访问http://172.25.83.3:9090,即可进入web管理界面

点击codis-demo

向下拉动界面

可以看到codis-proxy已经激活

可以新建组,也可以添加redis-server实例。

先新建组:

点击New Group,使组创建成功

 

再添加redis-server实例:

点击Add Server,使实例127.0.0.1:6379添加成功

同理,可以添加172.25.83.1:6379和172.25.83.2:6379。

最终的效果图为:

猜你喜欢

转载自blog.csdn.net/qq_42303254/article/details/88238323
今日推荐