codis介绍前端
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来讲, 链接到 Codis Proxy 和链接原生的 Redis Server 没有显著区别 , 上层应用能够像使用单机的 Redis 同样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工做, 全部后边的一切事情, 对于前面的客户端来讲是透明的, 能够简单的认为后边链接的是一个内存无限大的 Redis 服务。java
codis组件node
codis server:基于redis-3.2.8 分支开发。增长了额外的数据结构,以支持slot有关的操做以及数据迁移指令linux
codis proxy:客户端链接的redis代理服务,实现了redis协议。除部分命令不支持之外(不支持的命令列表),表现的和原生的redis没有区别。对于同一个业务集群而言,能够同时部署多个codis-proxy实例;不一样codis-proxy之间由codis-dashboard保证状态同步。git
codis dashboard:集群管理工具,支持codis-proxy、codis-server的添加、删除、以及数据迁移操做。在集群状态发生改变时,codis-dashboard维护集群下全部codis-proxy的状态一致性,对于同一个业务集群而言,同一时刻codis-dashboard只能有0个或者1个,全部对集群的修改都必须经过codis-dashboard完成。github
codis FE:集群管理界面,多个集群实例共享能够共享同一个前端展现页面,经过配置文件管理后端codis-dashboard列表,配置文件可自动更新。golang
storage:提供namespace概念,不一样集群会按照不一样product name进行组织;目前仅提供了zookeeper、etcd、fs三种实现,可是提供了抽象的interface可自行扩展。web
codis分片:Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分红 1024 个 slots (0-1023), 对于每一个key来讲, 经过如下公式肯定所属的 Slot Id : SlotId = crc32(key) % 1024。redis
每个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪一个 server group 来提供。数据的迁移也是以slot为单位的。apache
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的数据均衡状况
修改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等文章