Codis+redis 集群测试
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务
组件说明:
Codis 3.x 由以下组件组成:
Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
redis-sentinel:可以实现对Redis的监控、通知、自动故障转移。如果Master不能工作,则会自动启动故障转移进程,将其中的一个Slave提升为Master,其他的Slave重新设置新的Master服务。Sentinel的配置由 codis-dashboard和zookeeper一起控制,不需要手工填写.
codis-fe:集群web管理界面。
对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
所有对集群的修改都必须通过 codis-dashboard 完成。
Codis Admin:集群管理的命令行工具。
可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
Codis FE:集群管理界面。
多个集群实例共享可以共享同一个前端展示页面;
通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
Storage:为集群状态提供外部存储。
提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
目前仅提供了 Zookeeper、Etcd、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。
整体架构 如下
1、测试环境如下
zookeeper-3.4.10 第一台部署两个 zookeeper,第二台部署一台
Codis-3.2
Centos6.8
2、安装go运行环境
yum install -y gcc glibc gcc-c++ make git mercurial
wget https://dl.google.com/go/go1.9.2.linux-amd64.tar.gz
3、设置编译环境
tar xf go1.9.2.linux-amd64.tar.gz
mv go /usr/local/
[root@open-falcon-server tools]# mv go /usr/local/
[root@open-falcon-server tools]# mkdir /usr/local/go/work
[root@open-falcon-server tools]# vim /root/.bash_profile
PATH=$PATH:$HOME/bin
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=/usr/local/go/work
path=$PATH:$HOME/bin:$GOROOT/bin:$GOPATH/bin
[root@open-falcon-server tools]# source /root/.bash_profile
[root@open-falcon-server tools]# echo $GOPATH
/usr/local/go/work
[root@open-falcon-server tools]# go version
go version go1.9.4 linux/amd64
4、设置java环境变量
[root@open-falcon-server tools]# tar xf jdk-8u171-linux-x64.tar.gz
[root@open-falcon-server tools]# mv jdk1.8.0_171/ /usr/local/
[root@open-falcon-server appadmin]# source /etc/profile
[root@open-falcon-server appadmin]# tail -2 /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_171
export PATH=$JAVA_HOME/bin:$PATH
[root@open-falcon-server appadmin]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
5、部署zookeeper
[root@open-falcon-server tools]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
[root@open-falcon-server tools]# tar xf zookeeper-3.4..tar.gz
[root@open-falcon-server tools]# mv zookeeper-3.4. /usr/local/
[root@open-falcon-server tools]# ln -s /usr/local/zookeeper-3.4./ /usr/local/zookeeper [root@open-falcon-server data]# cd /data/
[root@open-falcon-server data]# mkdir zk1 zk2
[root@open-falcon-server data]# echo >zk1/myid
[root@open-falcon-server data]# echo >zk2/myid
cp /usr/local/zookeeper-3.4./conf/zoo_sample.cfg /data/zk1/zk1.cfg
[root@open-falcon-server zk1]# grep "^[a-z]" zk1.cfg
tickTime=
initLimit=
syncLimit=
dataDir=/data/zk1
clientPort=
server.=10.8.18.120::
server.=10.8.18.120::
server.=10.8.18.121:: [root@open-falcon-server zk1]# grep "^[a-z]" ../zk2/zk2.cfg
tickTime=
initLimit=
syncLimit=
dataDir=/data/zk2
clientPort=
server.=10.8.18.120::
server.=10.8.18.120::
server.=10.8.18.121:: #第二台
[root@Yeahka- tools]# cd /data/
[root@Yeahka- data]# ll
总用量
[root@Yeahka- data]# mkdir zk3
[root@Yeahka- data]# echo > zk3/myid
[root@codis- data]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /data/zk3/zk3.cfg
[root@codis- data]# grep "^[a-z]" zk3/zk3.cfg
tickTime=
initLimit=
syncLimit=
dataDir=/data/zk3
clientPort=
server.=10.8.18.120::
server.=10.8.18.120::
server.=10.8.18.121::
6、启动两台机器的zookeeper
[root@open-falcon-server zk1]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk1/zk1.cfg
ZooKeeper JMX enabled by default
Using config: /data/zk1/zk1.cfg
Starting zookeeper ... STARTED
[root@open-falcon-server zk1]#
[root@open-falcon-server zk1]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk2/zk2.cfg
[root@codis-2 data]# /usr/local/zookeeper/bin/zkServer.sh start /data/zk3/
3.2查看状态
[root@codis-2 data]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk3/zk3.cfg
ZooKeeper JMX enabled by default
Using config: /data/zk3/zk3.cfg
Mode: leader
[root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk1/zk1.cfg
ZooKeeper JMX enabled by default
Using config: /data/zk1/zk1.cfg
Mode: follower
[root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkServer.sh status /data/zk2/zk2.cfg
ZooKeeper JMX enabled by default
Using config: /data/zk2/zk2.cfg
Mode: follower
7、测试连接到zookeeper节点
[root@open-falcon-server appadmin]# /usr/local/zookeeper/bin/zkCli.sh -server 10.8.18.121:2183
8、部署codis3.2
[root@open-falcon-server appadmin]# mkdir -p $GOPATH/src/github.com/CodisLabs
[root@open-falcon-server appadmin]# cd /usr/local/go/work/src/github.com/CodisLabs
[root@open-falcon-server CodisLabs]# git clone https://github.com/CodisLabs/codis.git -b release3.2
[root@open-falcon-server CodisLabs]# cd $GOPATH/src/github.com/CodisLabs/codis
[root@open-falcon-server codis]# pwd
/usr/local/go/work/src/github.com/CodisLabs/codis [root@open-falcon-server codis]#yum install autoconf automake libtool -y
[root@open-falcon-server codis]# make
[root@open-falcon-server codis]# make
make -j4 -C extern/redis-3.2./
make[]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.'
cd src && make all
make[]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2./src' Hint: It's a good idea to run 'make test' ;) make[]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2./src'
make[]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.'
go build -i -o bin/codis-dashboard ./cmd/dashboard
go build -i -tags "cgo_jemalloc" -o bin/codis-proxy ./cmd/proxy
go build -i -o bin/codis-admin ./cmd/admin
go build -i -o bin/codis-ha ./cmd/ha
go build -i -o bin/codis-fe ./cmd/fe
9、配置dashboard
[root@codis- codis]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/config/
[root@codis- config]# cp dashboard.toml dashboard.toml.ori
[root@codis- config]# vim dashboard.toml
coordinator_name = "zookeeper"
coordinator_addr = "10.8.18.120:2181,10.8.18.120:2182,10.8.18.121:2183"
product_auth = "hello123" 启动dashboard
./admin/codis-dashboard-admin.sh start 启动proxy
[root@codis- codis]# ./admin/codis-proxy-admin.sh start Proxy
product_name = "codis-fengkong"
product_auth = "hello123" jodis_name = "zookeeper"
jodis_addr = "192.168.11.225:2181,192.168.11.225:2182,192.168.11.226:2183"
jodis_timeout = "20s"
jodis_compatible = true
、 部署redis
[root@open-falcon-server codis]# mkdir -pv /var/lib/redis_638{..}
[root@codis- codis]# mkdir -pv /var/lib/redis_638{..} [root@open-falcon-server codis]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2./
[root@open-falcon-server redis-3.2.]# cp redis.conf /usr/local/go/work/src/github.com/CodisLabs/codis/
[root@open-falcon-server redis-3.2.]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/ 修改redis.conf
pidfile /var/run/redis_6381.pid
port
bind 10.8.18.120
requirepass hello123
dbfilename dump_6381.rdb
dir /var/lib/redis_6381
logfile "/tmp/redis_6381.log"
maxmemory 256M
[root@open-falcon-server codis]# cp redis.conf redis_6381.conf
[root@open-falcon-server codis]# cp redis_6381.conf redis_6382.conf
[root@open-falcon-server codis]# vim redis_6382.conf
[root@open-falcon-server codis]# sed -i 's/6381/6382/g' redis_6382.conf [root@open-falcon-server codis]# ./bin/codis-server ./redis_6381.conf
[root@open-falcon-server codis]# ./bin/codis-server ./redis_6382.conf
[root@codis- codis]# cp redis_6381.conf redis_6383.conf
[root@codis- codis]# cp redis_6381.conf redis_6384.conf
[root@codis- codis]# sed -i 's/6381/6383/g' redis_6383.conf
[root@codis- codis]# sed -i 's/6381/6384/g' redis_6384.conf [root@codis- codis]# ./bin/codis-server ./redis_6383.conf
[root@codis- codis]# ./bin/codis-server ./redis_6384.conf
启动codis-fe,Listen监听端口不要为8080,指定8090
[root@codis- codis]# nohup ./bin/codis-fe --ncpu= --log=fe.log --log-level=WARN --zookeeper=10.8.18.121: --listen=10.8.18.121: &
通过网页访问:http://10.8.18.121:8090 可以看到codis的管理页面
通过fe添加group
通过web浏览器访问集群管理页面(fe地址:10.8.18.121:8090) 选择我们刚搭建的集群 codis-demo,在 Proxy 栏可看到我们已经启动的 Proxy, 但是 Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加 NEW GROUP,NEW GROUP 行输入 1,再点击 NEW GROUP 即可 添加 Codis Server,
对slots进行分组
如下图所示,输入所要分组的slots的起和止的范围,然后输入组ID,点击后面按钮即可。
通过proxy 连接redis测试
Web界面查看key是否添加成功
生产环境下,为了使整体架构更加完整 我们在codis-proxy前面 加个 haproxy+keepalived ,codis-server(即redis) 我们采用 redis-sentinel 来进行组内的主备切换
10、haproxy+keepalived
###haproxy 配置 主上面配置
global
log 127.0.0.1 local0
maxconn
#chroot /usr/share/haproxy
user haproxy
group haproxy
nbproc
daemon
pidfile /var/run/haproxy.pid
#debug
#quiet defaults
log global
mode tcp
option tcplog
retries
#maxconn
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
#martin add
listen channel_posp_socket_1 0.0.0.0:
balance roundrobin
server codis_proxy_server_1 192.168.11.225: weight check
server codis_proxy_server_2 192.168.11.226: weight check ###keepalived 配置
[root@ config]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
martin@qq.com
}
notification_email_from keepalived@domain.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#LAN virtual IP
vrrp_instance VI_12 {
state MASTER
interface bond0
virtual_router_id 111
mcast_src_ip 192.168.11.226
priority 101
advert_int 5
authentication {
auth_type PASS
auth_pass 1210
}
virtual_ipaddress {
192.168.11.8/24 dev bond0 scope global
}
}
从上面配置
global
log 127.0.0.1 local0
maxconn 40960
#chroot /usr/share/haproxy
user haproxy
group haproxy
nbproc 4
daemon
pidfile /var/run/haproxy.pid
#debug
#quiet
defaults
log global
mode tcp
option tcplog
retries 3
#maxconn 2000
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
#martin add 20180831
listen channel_posp_socket_1 0.0.0.0:10000
balance roundrobin
server codis_proxy_server_1 192.168.11.225:19000 weight 50 check
server codis_proxy_server_2 192.168.11.226:19000 weight 50 check
#keepalived
global_defs {
notification_email {
martin@qq.com
}
notification_email_from keepalived@domain.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#LAN virtual IP
vrrp_instance VI_12 {
state BACKUP
interface bond0
virtual_router_id 111
mcast_src_ip 192.168.11.225
priority 110
advert_int 5
authentication {
auth_type PASS
auth_pass 1210
}
virtual_ipaddress {
192.168.11.8/24 dev bond0 scope global
}
}
11、redis-sentinel 配置如下
正确来说,redis-sentinel是要配置主从架构才能生效,但是在codis集群中并不一样,因为他的配置由zookeeper来维护,所以,这里codis使用的redis-sentinel只需要配置一些基本配置就可以了. bind 0.0.0.0
protected-mode no
port
dir "/var/lib/redis_sentinel"
pidfile "/var/run/redis_sentinel_26379.pid"
logfile "/tmp/redis_sentinel_26379.log"
daemonize yes
#然后就可以启动了
/usr/local/codis/redis-sentinel sentinel.conf
#验证一下
redis-cli -p -c info Sentinel
# Sentinel
sentinel_masters:8
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=codis-fengkong-8,status=ok,address=192.168.11.226:6370,slaves=1,sentinels=2
master1:name=codis-fengkong-3,status=ok,address=192.168.11.225:6385,slaves=1,sentinels=2
master2:name=codis-fengkong-5,status=ok,address=192.168.11.226:6387,slaves=1,sentinels=2
master3:name=codis-fengkong-4,status=ok,address=192.168.11.226:6386,slaves=1,sentinels=2
master4:name=codis-fengkong-2,status=ok,address=192.168.11.226:6384,slaves=1,sentinels=2
master5:name=codis-fengkong-7,status=ok,address=192.168.11.226:6389,slaves=1,sentinels=2
master6:name=codis-fengkong-6,status=ok,address=192.168.11.226:6388,slaves=1,sentinels=2
master7:name=codis-fengkong-1,status=ok,address=192.168.11.225:6383,slaves=1,sentinels=2
Codis+redis 集群测试的更多相关文章
- codis+redis 集群搭建管理
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使 ...
- codis+redis集群学习整理(待续)
Codis 由四部分组成: Codis Proxy (codis-proxy) Codis Manager (codis-config) Codis Redis (codis-server) ZooK ...
- Dubbo入门到精通学习笔记(十五):Redis集群的安装(Redis3+CentOS)、Redis集群的高可用测试(含Jedis客户端的使用)、Redis集群的扩展测试
文章目录 Redis集群的安装(Redis3+CentOS) 参考文档 Redis 集群介绍.特性.规范等(可看提供的参考文档+视频解说) Redis 集群的安装(Redis3.0.3 + CentO ...
- redis集群配置
客户端分片 程序端实现 代理proxy,访问proxy,proxy指定redis保存位置. Twemproxy Redis cluster ,会造成一部分数据丢失,无中心化1.将数据自动切分(spli ...
- Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)
一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网 ...
- Linux离线安装redis集群
一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,联网环境安装较为简单,这里只说脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网,服务 ...
- Redis集群创建和配置
1.检查GCC是否安装,可以看看版本号 gcc -v 安装命令:yum install gcc-c++ 2.安装Ruby和Rubygems 如果有网的话,则通过yum命令进行安装,自动将关联的依赖包全 ...
- 为什么Redis集群要使用反向代理?
为什么要使用反向代理? 如果没有方向代理,一台Redis可能需要跟很多个客户端连接: 看着是不是很慌?看没关系,主要是连接需要消耗线程资源,没有代理的话,Redis要将很大一部分的资源用在与客户端建立 ...
- redis集群部署之codis 维护脚本
搞了几天redis cluster codis 的部署安装,测试,架构优化,配合研发应用整合,这里记一些心得! 背景需求: 之前多个业务都在应用到redis库,各业务独立占用主从两台服务器,硬件资源利 ...
随机推荐
- SapScript
* [OPEN_FORM] SAPscript: フォーム印刷の開始 * [START_FORM] SAPscript: 書式を開始 * [WRITE_FORM] SAPscript: 書式ウィンドウ ...
- Sql Server 游标概念与实例
引言 先不讲游标的什么概念,看如下Sql Server2008 图例: 需求:两张表的O_ID是一一对应的,现在求将加薪的工资+原来的工资=现在的工资,也就是O_Salary=O_Salary+A_S ...
- PHP.37-TP框架商城应用实例-后台13-商品管理-扩展分类的添加、显示【数据分组】、搜索分类【多对多】
商品扩展分类 需求:一件商品能有多个扩展分类,搜索任何一个分类都能搜出该商品 建表[扩展分类表] drop table if exists p39_goods_cat; create table p3 ...
- 线上环境HBASE-1.2.0出现oldWALs无法自动回收情况;
正常情况下,hmaster会定期清理oldWALs文件夹,一般该文件大小也就几百兆,但是我们线上 环境出现了该文件没有自动回收情况,如图: 该目录占用hdfs空间多达7.6T,浪费空间: 后来经过多番 ...
- idea离线安装lombock插件
技术交流群:233513714 安装过程 1.首先找到插件包 插件包可以在两个地方下载,分别是IDEA的官方插件仓库和GitHub里lombok-intellij-plugin仓库中的release包 ...
- Linux下启动Oracle服务和监听程序步骤
Linux下启动Oracle服务和监听程序启动和关闭步骤整理如下: 1.安装oracle: 2.创建oracle系统用户: 3./home/oracle下面的.bash_profile添加几个环境变量 ...
- c++ list_iterator demo
#include <iostream> #include <list> using namespace std; typedef list<int> Integer ...
- TortoiseSVN的安装使用
下面分享一篇关于TortoiseSVN的安装以及使用 1.运行TortoiseSVN-1.6.6.17493-win32-svn-1.6.6.msi程序, 开始安装 2.点击Next, 下一步 3.选 ...
- 1087 All Roads Lead to Rome (30 分)(最短路径)
直接用Dijkstra做 #include<bits/stdc++.h> using namespace std; int n,m; map<string,int>si; ma ...
- C++中的默认参数规则
C++中的默认参数规则 C++的默认参数规则其实是一个非常容易掉坑的规则,尤其是当一个函数拥有多个声明的时候,每个声明的默认参数可以各不相同,在调用时又可能与每个声明都不同:这篇博客稍微列举一下C++ ...