codis介绍

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

codis集群环境部署测试_第1张图片

codis组件

codis server:基于redis-3.2.8 分支开发。增加了额外的数据结构,以支持slot有关的操作以及数据迁移指令

codis proxy:客户端连接的redis代理服务,实现了redis协议。除部分命令不支持以外(不支持的命令列表),表现的和原生的redis没有区别。对于同一个业务集群而言,可以同时部署多个codis-proxy实例;不同codis-proxy之间由codis-dashboard保证状态同步。

codis dashboard:集群管理工具,支持codis-proxy、codis-server的添加、删除、以及数据迁移操作。在集群状态发生改变时,codis-dashboard维护集群下所有codis-proxy的状态一致性,对于同一个业务集群而言,同一时刻codis-dashboard只能有0个或者1个,所有对集群的修改都必须通过codis-dashboard完成。

codis FE:集群管理界面,多个集群实例共享可以共享同一个前端展示页面,通过配置文件管理后端codis-dashboard列表,配置文件可自动更新。

storage:提供namespace概念,不同集群会按照不同product name进行组织;目前仅提供了zookeeper、etcd、fs三种实现,但是提供了抽象的interface可自行扩展。

codis分片:Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024。

每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供。数据的迁移也是以slot为单位的。


codis 集群部署


机器环境分布

节点
IP
系统
测试配置
node1
192.168.0.198
centos7.2 (最小化安装)
2核2G --30G盘
node2
192.168.0.199 centos7.2 (最小化安装) 2核2G --30G盘
node3
192.168.0.200 centos7.2 (最小化安装) 2核2G --30G盘


codis部署架构图(来源网络-西门飞兵)

codis集群环境部署测试_第2张图片

codis 主从分布

codis集群环境部署测试_第3张图片


系统环境三台机器准备


安装centos7.2系统,最小化安装

设置好网络和防火墙  网络需要能访问外网,

下面关闭防火墙

setenforce 0

systemctl stop firewalld

systemctl disable firewalld

sed -i 's/enforcing/disabled/g' /etc/sysconfig/selinux


设置yum源

cd /etc/yum.repos.d/

wget http://mirrors.aliyun.com/repo/Centos-7.repo

wget http://mirrors.aliyun.com/repo/epel-7.repo

yum -y install epel-release 

yum -y install vim wget lrzsz net-tools

----------------------------------------------------------------------


安装JDK (zk需要jdk(三台机器)

yum install java-1.8.0-openjdk.x86_64 -y

yum install java-1.8.0-openjdk*-y


安装zookeeper集群(三台机器)


下载zk包(三台机器)

cd /usr/local/src

wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.14.tar.gz   ##zk版本在变化,连接可能失效

tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/


配置环境变量(三台机器)

vim /etc/profile

ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin

source /etc/profile  ##生效


创建zk的数据日志目录及配置文件(三台机器)

mkdir -p /data/zookeeper/{data,log}

cp /usr/local/zookeeper-3.4.14/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.14/conf/zoo.cfg

vim /usr/local/zookeeper-3.4.14/conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
maxClientCnxns=300
server.1=192.168.0.198:2888:3888
server.2=192.168.0.199:2888:3888
server.3=192.168.0.200:2888:3888

创建myid文件(三台机器)

三台机器分别为:

echo 1 > /data/zookeeper/data/myid       ##198机器

echo 2 > /data/zookeeper/data/myid       ##199机器

echo 3 > /data/zookeeper/data/myid       ##200机器


启动zk服务

/usr/local/zookeeper-3.4.14/bin/zkServer.sh start   ##启动
/usr/local/zookeeper-3.4.14/bin/zkServer.sh status   ##查看状态

[root@localhost ]# /usr/local/zookeeper-3.4.14/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
[root@localhost ]# /usr/local/zookeeper-3.4.14/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader

======================================

安装go环境(三台机器)

yum -y install golang

配置go环境

mkdir /data/go -p

vim /etc/profile

export GOPATH=/data/go
export PATH=$PATH:$GOPATH/bin

source /etc/profile  ##生效

安装godep

yum -y install git

go get -u github.com/tools/godep && which godep

#/data/go/bin/godep


安装codis3.2 (三台机器)


下载编译安装

yum install gcc autoconf automake libtool -y

cd /data/go/src/github.com/CodisLabs

git clone https://github.com/CodisLabs/codis.git -b release3.2
cd codis/
make


修改配置

dashboard配置修改(三台机器)

vim config/dashboard.toml

coordinator_name = "zookeeper"
coordinator_addr = "192.168.0.200:2181,192.168.0.199:2181,192.168.0.198:2181"
product_name = "test-codis"

codis-proxy配置修改(三台机器)

vim config/proxy.toml

product_name = "test-codis"

jodis_name = "zookeeper"
jodis_addr = "192.168.0.200:2181,192.168.0.199:2181,192.168.0.198:2181"
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = true

codis-server配置 (三台机器)

cd /data/go/src/github.com/CodisLabs/codis/extern/redis-3.2.11


创建配置目录(三台机器)

mkdir /data/redis

mkdir /data/redis/redis_6379 -p
mkdir /data/redis/redis_6380 -p
mkdir /data/redis/redis_6381 -p


先在198上修改三个配置文件,后面复制到其他机器

创建配置文件

cp redis.conf /data/redis/redis-6379.conf
cp redis.conf /data/redis/redis-6380.conf
cp redis.conf /data/redis/redis-6381.conf


修改配置文件

vim /data/redis/redis-6379.conf

bind 0.0.0.0
port 6379
pidfile "/tmp/redis_6379.pid"
logfile "/tmp/redis_6379.log"
dbfilename "dump_6379.rdb"
dir "/data/redis/redis_6379"

vim /data/redis/redis-6380.conf
bind 0.0.0.0
port 6380
pidfile "/tmp/redis_6380.pid"
logfile "/tmp/redis_6380.log"
dbfilename "dump_6380.rdb"
dir "/data/redis/redis_6380"

vim /data/redis/redis-6381.conf
bind 0.0.0.0
port 6381
pidfile "/tmp/redis_6381.pid"
logfile "/tmp/redis_6381.log"
dbfilename "dump_6381.rdb"
dir "/data/redis/redis_6381"


复制配置文件到其他两个机器

scp /data/redis/*.conf 192.168.0.199:/data/redis/

scp /data/redis/*.conf 192.168.0.200:/data/redis/


服务启动及集群初始化


cd /data/go/src/github.com/CodisLabs/codis


启动codis-dashboard  (选一台机器198)

nohup ./bin/codis-dashboard --ncpu=1 --config=config/dashboard.toml --log=dashboard.log --log-level=WARN >> /var/log/codis_dashboard.log &

启动codis-proxy (三台机器)

nohup ./bin/codis-proxy --ncpu=1 --config=config/proxy.toml --log=proxy.log --log-level=WARN >> /var/log/codis_proxy.log &

启动codis-server(三台机器)

nohup ./bin/codis-server /data/redis/redis-6379.conf &
nohup ./bin/codis-server /data/redis/redis-6380.conf &
nohup ./bin/codis-server /data/redis/redis-6381.conf &

启动codis-fe (选一台机器198)

nohup ./bin/codis-fe --ncpu=1 --log=fe.log --log-level=WARN --zookeeper=192.168.0.198:2181,192.168.0.199:2181,192.168.0.200:2181 --listen=192.168.0.198:8090 &


访问管理界面并配置

浏览器打开192.168.0.198:8090

选择test-codis,并增加三个proxy,(填写11080端口才可以增加)

接着添加 group和server

先添加123group  然后把server加入到group中


然后初始化solt

新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group),而初始化最快的方法可通过 fe 提供的 rebalance all slots 按钮来做,点击按钮,我们即可快速完成了一个集群的搭建。也可以填写不同的solt范围进行分配,本例将逐一分配solt)点migrate range按钮

上图已经将solt分配到三个group了



通过连接codis-proxy进行验证

[root@localhost codis]# ./bin/redis-cli -h 192.168.0.199 -p 19000
192.168.0.199:19000> info
可以查看集群代理信息
192.168.0.199:19000> set test 999
OK
192.168.0.199:19000> get test
"999"

压力测试

./bin/redis-benchmark -h 192.168.0.200 -p 19000 -c 100 -d 100 -t set -n 10000 -r 10000
上述命令的意思是,使用redis-benchmark压力测试命令连接codis集群,
同时并发10000个(-c),测试set操作(-t),每个测试数据集是100字节(-d),
请求数是100000(-n),使用使用随机数插入数值(-r)


压测后可以看到分到后端group的数据均衡情况



基于redis-sentinel实现HA

修改sentinel配置文件(三台机器)

mkdir /data/redis/logs/
mkdir /data/redis/db/

cd /data/go/src/github.com/CodisLabs/codis

cp extern/redis-3.2.11/sentinel.conf  /data/redis/


先在一台机器上修改配置,然后复制到其他机器

vim /data/redis/sentinel.conf
bind 0.0.0.0
port 26379
pidfile "/data/redis/logs/sentinel.pid"
logfile "/data/redis/logs/sentinel.log"
dir "/data/redis/db"
sentinel monitor codis-server-01 192.168.0.198 6379 2
sentinel down-after-milliseconds codis-server-01 5000
sentinel failover-timeout codis-server-01 60000
sentinel parallel-syncs codis-server-01 2
 
sentinel monitor codis-server-02 192.168.0.199 6380 2
sentinel down-after-milliseconds codis-server-02 5000
sentinel failover-timeout codis-server-02 60000
sentinel parallel-syncs codis-server-02 2
 
sentinel monitor codis-server-03 192.168.0.200 6381 2
sentinel down-after-milliseconds codis-server-03 5000
sentinel failover-timeout codis-server-03 60000
sentinel parallel-syncs codis-server-03 2


复制配置到其他机器

scp /data/redis/sentinel.conf 192.168.0.199:/data/redis/
scp /data/redis/sentinel.conf 192.168.0.200:/data/redis/


启动sentinel(三台机器)

cd /data/go/src/github.com/CodisLabs/codis

nohup ./bin/redis-sentinel /data/redis/sentinel.conf &


然后回到web管理界面添加sentinel,添加时的端口为26379


配置完成后可以在group中看到明显的HA标志


到此基本完成了codis集群搭建

更多内容可参考Codis的github:https://github.com/CodisLabs/codis

以及http://www.fblinux.com/?p=1463   https://blog.51cto.com/brucewang/2159131等文章