Redis——redis集群方案之codis集群的搭建部署

news/2024/7/4 12:58:34

一.什么是codis集群

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开发出来。

codis的优缺点

  • 优点:实现高并发读写,数据一致性高。

  • 缺点:性能有较大损耗,故障切换无法保证不丢key。无法进行读写分离。

codis的架构介绍

go

描述:codis依赖语言包

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的状态的一致性。

    对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
    
    所有对集群的修改都必须通过 codis-dashboard 完成。
    
  • Codis-fe:集群web管理界面。

    多个集群实例共享可以共享同一个前端展示页面;
    通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
    
  • redis-sentinel:可以实现对Redis的监控、通知、自动故障转移。如果Master不能工作,则会自动启动故障转移进程,将其中的一个Slave提升为Master,其他的Slave重新设置新的Master服务。Sentinel的配置由codis-dashboard和zookeeper一起控制,不需要手工填写。

jdk

描述:zookeeper依赖语言包

zookeeper

描述:用于存放数据配置路由表。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集群的搭建部署

主机服务
server1codis-server
server2codis-server
server3zk,codis-dashboard,codis-proxy,codis-fe,codis-server

实验过程如下所示:

如果之前做过redis的服务,将redis服务停掉,因为会占用6379端口

第一步:配置server3

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

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

在这里插入图片描述

配置环境变量

[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    #重新加载环境变量,使得刚刚配置的环境变量生效

在这里插入图片描述

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

[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
[root@server3 CodisLabs]# cd codis/
[root@server3 codis]# yum install gcc git autoconf -y 

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

[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目录下

在这里插入图片描述

安装JDK (版本要求不严格)

[root@server3 ~]# yum install jdk-8u201-linux-x64.rpm -y
[root@server3 ~]# java -version    查看版本

在这里插入图片描述

在这里插入图片描述

安装zookeeper

[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

在这里插入图片描述

编辑环境变量

[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    #重新加载环境变量

在这里插入图片描述

修改zookeeper的配置文件

[root@server3 ~]# cd /usr/local/zookeeper/conf/
[root@server3 ~]# cp   zoo_sample.cfg   zoo.cfg
[root@server3 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

说明

server.A=B:C:D

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

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

设置myid

设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字(该数字的取值范围是1-255),用来标识当前主机,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

在这里插入图片描述

启动zookeeper

[root@server3 ~]# zkServer.sh start         #启动zookeeper
[root@server3 ~]# zkServer.sh status        #查看zookeeper的状态

在这里插入图片描述
对codis进行配置,并启动codis的各个组件

注意:启动dashboard前,必须启动zookeeper服务,这是必须的。

编辑/usr/local/codis/config.ini文件并启动codis-dashboard组件

[root@server3 ~]#   vim /usr/local/codis/config.ini
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=meng              //产品名称, 这个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

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

在这里插入图片描述

启动codis-proxy组件和启动codis-fe组件

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

在这里插入图片描述

启动codis-server组件并查看端口

[root@server3 admin]# ./codis-server-admin.sh start
 [root@server3 admin]  netstat -antlp

在这里插入图片描述

第二步:配置server1和server2(步骤完全相同)

  • server1(基本步骤与server3相同)

注意:先编辑环境变量(这一步我当时在创建目录后面做,解压生成的目录路径不对,所以删除重新创建了,所以环境变量要在创建目录之前做)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
编译完成界面:
在这里插入图片描述
对codis进行配置:

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

在这里插入图片描述

在这里插入图片描述
启动codis-server组件

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

在这里插入图片描述

  • server2,配置过程同server1

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第三步:测试

在浏览器访问172.25.27.3:9090,进入web管理界面

在这里插入图片描述

点击codis-demo并向下拉动界面

在这里插入图片描述

在这里插入图片描述

可以看到codis-proxy已经激活

在这里插入图片描述

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

  • 新建组

在这里插入图片描述

如下所示:
在这里插入图片描述

  • 添加redis-server实例

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

在这里插入图片描述

如下所示:

在这里插入图片描述

同理,可以添加172.25.27.1:6379和172.25.27.2:6379

在这里插入图片描述


http://www.niftyadmin.cn/n/2864059.html

相关文章

hibernate学习之第十一篇(2)

《二》每个子类映射到一张表&#xff08;joined-subclass&#xff09; 配置文件修改为&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" &qu…

MFS——分布式文件系统的安装与部署

一.什么是MFS MFS简介 分布式文件系统是指文件系统管理的物理存储资源通过计算机网络与各节点相连。简单讲&#xff0c;就是把一些分散的共享文件夹&#xff0c;集合到一个文件夹内。对于用户来说&#xff0c;只需要打开该虚拟文件夹&#xff0c;就可以使用这些分散的文件夹进…

hibernate学习之第十二篇

《三》混合使用“一个类继承体系一张表”和“每个子类一张表” 比如上面的例子&#xff0c;worker类可能属性很少&#xff0c;而farmer属性却很多&#xff0c;把两者都与person放在同一张表中&#xff0c;则显得表的 结构不是很合理&#xff0c;会有很多字段是null。所以我们可…

MFS——如何恢复挂掉的mfsmaster服务

需要了解的知识&#xff1a; 在正常关闭的时候&#xff0c;/var/lib/mfs目录中会产生metadata.mfs这个文件&#xff0c;这个文件是开启mfsmaster服务时必备的文件。如果没有该文件,那么mfsmaster服务也就起不来。在正常开启的时候&#xff0c;/var/lib/mfs目录中就会产生metad…

hibernate学习之第十二篇(续)

《四》每个具体类映射一张独立的表&#xff08;union-subclass&#xff09;&#xff0c;即表与子类之间的独立一对一关系 所有的子类的表中的信息都是完整的&#xff0c;不需要对表进行关联了。 person.hbm.xml的配置如下&#xff1a; <?xml version"1.0" enco…

MFS ——利用pacemaker+corosync+pcs实现mfsmaster的高可用

一.什么是mfsmaster的高可用 我们知道mfsmaster是调度器&#xff0c;是mfs最核心的地方&#xff0c;如果mfsmaster挂了&#xff0c;整个mfs架构会挂掉&#xff0c;对此我们要对mfsmaster进行高可用冗余操作。 MFS文件系统中&#xff0c;master负责各个数据存储服务器的管理&am…

hibernate学习之第十三篇

load方法的懒加载及原理分析 懒加载的目的&#xff0c;减少不必要的数据库查询&#xff0c;提升性能。 借用前面组件映射中的user类&#xff0c;对测试代码做写改变&#xff1a; public class Main {public static void main(String[] args) {User user new User();user.set…

hibernate学习之第十四篇

hibernate的内部缓存 hibernate的缓存分为两级&#xff1a;一级缓存&#xff08;session级)和二级缓存(sessionFactory级) 缓存的作用主要用来提高性能&#xff0c;可以简单的理解成一个Map&#xff1b;使用缓存涉及到三个操作&#xff1a;把数据放入缓存&#xff0c;从缓存中…