codis介绍
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 , 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
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 主从分布
系统环境三台机器准备
安装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等文章