codis+redis 集群搭建管理

Posted 战神V祝福

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codis+redis 集群搭建管理相关的知识,希望对你有一定的参考价值。

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.

Codis 由四部分组成:

Codis Proxy (codis-proxy)
Codis Dashboard (codis-config)
Codis Redis (codis-server)
ZooKeeper/Etcd
codis-proxy 是客户端连接的 Redis 代理服务, codis-proxy 本身实现了 Redis 协议, 表现得和一个原生的 Redis 没什么区别 (就像 Twemproxy), 对于一个业务来说, 可以部署多个 codis-proxy, codis-proxy 本身是无状态的.

codis-config 是 Codis 的管理工具, 支持包括, 添加/删除 Redis 节点, 添加/删除 Proxy 节点, 发起数据迁移等操作. codis-config 本身还自带了一个 http server, 会启动一个 dashboard, 用户可以直接在浏览器上观察 Codis 集群的运行状态.

codis-server 是 Codis 项目维护的一个 Redis 分支, 基于 2.8.21 开发, 加入了 slot 的支持和原子的数据迁移指令. Codis 上层的 codis-proxy 和 codis-config 只能和这个版本的 Redis 交互才能正常运行.

Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.

Codis 支持按照 Namespace 区分不同的产品, 拥有不同的 product name 的产品, 各项配置都不会冲突.

————————————————————————————
(摘自:官方Github,https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md)

本文涉及到六台服务器,它们的IP规划与架构初览如下:

 

零、所有的服务器

关闭防火墙:
chkconfig iptables off

关闭SELinux:
sed -i “/SELINUX/enforcing/disabled/” /etc/selinux/config

开启YUM缓存:
sed -i “/keepcache/s/0/1/” /etc/yum.conf

网卡添加外网DNS:
echo “DNS1=114.114.114.114” >> /etc/sysconfig/network-scripts/ifcfg-eth0
service network restart
ping baidu.com -c 3

YUM生成库缓存:

 

Java支持:

 

一、部署:Zookeeper。

官方项目主页:
http://zookeeper.apache.org/

官方介质下载页:
http://zookeeper.apache.org/releases.html

这里我下载最新版本:3.5.2 alpha。
Download Link:
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.2-alpha/zookeeper-3.5.2-alpha.tar.gz

在98 / 99,两个IP上部署ZOOKEEPER。

(这里,仅演示在其中一台上搭建ZK的过程,第二台的方式类似)
上传软件介质到服务器:

 

解压:

 

移动到zookeeper的安装目录【/opt/zookeeper】:

 

配置zookeeper配置文件:

节点二【zookeeper2】的这个配置文件是:

 

创建上面配置文件中需要的目录结构:
mkdir -p /data/zookeeper/zk1/{data,log}

创建myid文件:
【zookeeper1】

【zookeeper2】

 

启动zookeeper:

可以看到,启动成功。

测试zookeeper的客户端程序:

【zookeeper1】

【zookeeper2】

 

这样,ZOOKEEPER,就部署好了。

二、部署:Codis。
(和上面一样,这里仅演示在一台节点上的操作详情,另一台也是类似的。在我的环境中,一共有两台Codis Server。)

1. Go语言支持。

官方网站:https://golang.org/

当前最新版本:1.7。

官方下载链接:
Linux:https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz
源码包:https://storage.googleapis.com/golang/go1.7.src.tar.gz
MS Windows:https://storage.googleapis.com/golang/go1.7.windows-amd64.msi

上传介质到服务器:

 

将go安装到/opt/golang。

创建目录:

将安装介质解压到安装目录:

 

配置GO的环境变量:

其中:
GOROOT,Go语言的软件根目录
GOPATH,Go语言的项目根目录

创建Go语言的项目目录:

 

测试Go的可用性:

 

2. 安装:Codis。
Codis项目主页:
https://github.com/CodisLabs/codis

开源中国的介绍:
http://www.oschina.net/p/codis/?fromerr=PIDoyfcY

GIT支持:

 

获得Codis代码(需要服务器有git软件包的支持):

官方建议通过“go get”来获取codis,该命令会下载master分支的最新版,而master分支则由codis作者维护。

这一步的执行过程可能会比较久,而命令行挂起,看不到进程。
你可以开启另一个会话,监控GOPATH目录的容量变化,如下:
watch -n .1 -d “du -sh /data/go_me”

这样会比较显而易见:
技术分享
大概25M左右。

如果这一步没有git支持,则你会遇到如下错误:

 

最终下载成功后:

 

编译前,需要安装的软件包
yum install -y gcc
yum groupinstall “Development Tools” # 很重要!

安装:jemalloc支持

下载jemalloc:
http://www.canonware.com/download/jemalloc/jemalloc-4.2.1.tar.bz2

上传服务器,并安装:

 

如果没有jemalloc,则编译的时候会出错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    CC adlist.o
    CC ae.o
    CC anet.o
    CC dict.o
In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[2]: *** [adlist.o] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from ae.c:44:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
In file included from dict.c:47:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[2]: *** [ae.o] Error 1
make[2]: *** [dict.o] Error 1

注意:如果依旧报错,编译时采用:
make MALLOC=libc

Codis,编译:make MALLOC=libc。

执行成功后,会在当前路径下的bin目录中生成可执行文件。
如下:

生成的可执行文件:
codis-config
codis-proxy
codis-server

assents,存放了codis-config的Dashboard Http需要的资源,需要与codis-config放在同一个目录下。

二、部署:Codis集群。
(这里应该是对Codis Proxy的配置。)

确认zookeeper状态是否运行:
【98】

 

【99】

 

配置Codis Dashboard的配置文件:
【94】

【95】的配置:

 

启动Codis dashboard:

 

开另一个会话,你可以查看:

 

访问Dashboard:
http://10.158.1.94:18087/admin/
技术分享

初始化slots:

 

通过管理WEB页面,查看SLOT信息:
http://10.158.1.94:18087/slots
技术分享
可以看到,当前,状态都是:OFF。

启动Codis Server。

配置redis配置文件:

(以上配置为默认配置,并没有做出什么改动。)

启动Redis:

 

检查状态:

 

添加Redis Server Group。

编辑配置文件:

 

启动多个服务:
/data/go_me/src/github.com/CodisLabs/codis/bin/codis-server /config/codis/redis_server_group_1.conf
/data/go_me/src/github.com/CodisLabs/codis/bin/codis-server /config/codis/redis_server_group_2.conf
/data/go_me/src/github.com/CodisLabs/codis/bin/codis-server /config/codis/redis_server_group_3.conf

运行后,服务状态:

【codis-server1】与【codis-server2】都需要如上配置。

添加到server group:

组一:
主 – codis-server1:6379
辅 – codis-server2:6381

组二:
主 – codis-server2:6379
辅 – codis-server2:6382 / codis-server1:6382

组三:
主 – codis-server1:6383
辅 – codis-server2:6383 / codis-server1:6381

开始配置:
配置前:

 

组一:

 

组二:

 

组三:

 

配置好后,查看状态:
【codis-server1】

【codis-server2】

 

在zookeeper端,也会有关于server group的配置信息:

 

通过Codis Dashboard查看:
技术分享

技术分享

设置Server Group的slot范围。

可以先初始化slot信息,如果以前做过初始化,则需要强制初始化:

 

初始化完成后,就可以访问dashboard查看了:
http://10.158.1.94:18087/slots
技术分享

技术分享
注意上图中,红框高亮部分的编号信息。

slot默认初始化1024个,即:0~1023。(有时候也会有所不同。)

开始划分范围:

 

范围划分好后,dashboard的呈现有所变化:
技术分享

如果选中其中某个范围,会在该页顶端显示其对应server group的详细信息:
技术分享

启动:Codis Proxy。
命令:
bin/codis-proxy -c config.ini -L /var/log/codis-proxy.log –cpu=2 –addr=0.0.0.0:19000 –http-addr=0.0.0.0:11000 &

 

查看Proxy的状态:

 

这时候,通过dashboard也能够看到Proxy的状态:
http://10.158.1.94:18087/admin/
技术分享

Proxy Debug:
http://10.158.1.94:11000/debug/vars
技术分享

这样,Codis集群,就搭建完成了。

三、测试。

可以看到,数据自动同步。

——————————
Done。








































































以上是关于codis+redis 集群搭建管理的主要内容,如果未能解决你的问题,请参考以下文章

codis集群搭建

使用Codis搭建redis集群服务

codis3.2.1集群搭建与测试

Zookeeper集群搭建

Zookeeper集群搭建

Zookeeper集群搭建