Codis 分布式缓存部署
为什么80%的码农都做不了架构师?>>>
环境介绍:
1:机器三台 ,IP/hostname 如下, hostname的设置很重要zookeeper / codis的通信都会用到,所以要配置好三台机器的hosts文件.
10.221.8.220 机器的hostname为 Redis1
10.221.8.221 机器的hostname为 Redis2
10.221.8.222 机器的hostname为 Redis3
三台机器的/etc/hosts 文件添加如下解析
10.221.8.220 Redis1
10.221.8.1.221 Redis2
10.221.8.1.222 Redis3
2: 三台机器的系统都是centos 6.5 已经安装基本服务.
yum -y install gcc gcc-c++ make glibc glibc-devel glib2 glib2-devel patch autoconf automake(安装基本编译工具)
yum -y install ntp wget unzip vixie-cron ntsysv openssh-clients sysstat irqbalance subversion(安装常用系统软件,按需)
yum update -y (更新软件包)
3:使用三台机器做codis集群的服务部署如图:
服务的部署
第一步: zookeeper的安装
zookeeper的安装请参考 http://my.oschina.net/denglz/blog/503912
注意: 三台机器上的zookeeper都已启动
第二步:golang环境的部署
1: 下载golang
wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz
2: 解压go1.4.1.linux-amd64.tar.gz移动go目录到/usr/local/ 目录下.
3:进入 /usr/local/go/src 目录执行下面的命令
bash
all.
bash
4:配置golang的环境变量, 修改/etc/profile (我的jdk与golang的环境变量如下)
ZOOKEEPER_HOME=/usr/local/zookeeper-3.3.6
GOROOT=/usr/local/go
JAVA_HOME=/usr/local/jdk1.8
CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export GOPATH=/usr/local/codis
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ZOOKEEPER_HOME/bin:$GOROOT/bin
5:下载codis
go get github.com/wandoulabs/codis
如果报错: go: missing Git command. See http://golang.org/s/gogetcmd
安装git即可解决: yum install git
第三步:codis的部署域服务的启动
1:codis的安装与配置
cd /usr/local/codis/src/github.com/wandoulabs/codis
执行 bootstrap.sh脚本进行codis的安装 (需要等一下)
sh bootstrap.sh
安装结束后会在 codis/bin 文件夹生成 codis-config, codis-proxy 两个可执行文件, (另外, bin/assets 文件夹是 codis-config 的 dashboard http 服务需要的前端资源, 需要和 codis-config 放置在同一文件夹下)
mkdir -p /usr/local/codis/{logs,conf,scripts} #log目录存放日志,conf 目录存放codis-server的配置文件与config.ini配置文件,scripts目录存放codis服务的启动脚本.
cp -rf bin /usr/local/codis/ #bin目录里面是一些可执行文件与dashboard http 服务需要的前端资源.
cp config.ini /usr/local/codis/conf/ #config.ini 是codis的配置文件
cp ./extern/redis-test/conf/6379.conf /usr/local/codis/conf/ #6379.conf 是codis-server的配置文件
修改config.ini文件,修改好的config.ini文件内容如下
[root@Redis1 codis]# cat bin/config.ini | grep -v "^#" | grep -v "^$"
coordinator=zookeeper
zk=10.221.8.220:2181,10.221.8.221:2181,10.221.8.222:2181 #三台机器的zookeeper的ip域端口
product=codis
dashboard_addr=10.221.8.220:18087 #codis 架构中提供web操作界面服务的机器的ip与端口,(Redis1中的redis-config服务提供的web操作界面)所以是Redis1机器的ip
password=
backend_ping_period=5
session_max_timeout=1800
session_max_bufsize=131072
session_max_pipeline=1024
zk_session_timeout=30
proxy_id=Redis1_proxy #codis启动代理服务的代理ID,这个代理id不能与其他机器的代理id一样.
net_timeout=5
2:创建脚本启动codis服务的启动
创建 codis web操作界面的启动脚本(只需要在Redis1 机器上创建这个脚本,因为dashboard http 服务只在这个机器上启动)
[root@Redis1 codis]# vi /usr/local/codis/scripts/start_dashboard.sh
#!/bin/sh
CODIS_HOME=/usr/local/codis
nohup $CODIS_HOME/bin/codis-config -c $CODIS_HOME/conf/config.ini -L $CODIS_HOME/logs/dashboard.log dashboard --addr=:18087 --http-log=$CODIS_HOME/logs/requests.log &>/dev/null &
创建slots的初始化脚本(只需要在Redis1 机器上创建这个脚本,因为codis的slot只需要初始化一次)
[root@RedisA codis]# vi /usr/local/codis/scripts/initslot.sh
#!/bin/sh
CODIS_HOME=/usr/local/codis
echo "slots initializing..."
$CODIS_HOME/bin/codis-config -c $CODIS_HOME/conf/config.ini slot init -f
echo "done"
创建codis-proxy的启动脚本 (只需在Redis2和Redis3上面创建这个脚本,因为codis-proxy服务只在这两个机器上启动)
注意: 在Redis3上把下面脚本里面的Redis2全部改成Redis3.这个代理id是在各个机器codis的config.ini文件里面配置的
注意:运行服务之前先创建proxy的日志文件,不然会报错. touch /usr/local/codis/logs/Redis2_proxy.log
vi /usr/local/codis/scripts/start_proxy.sh
#!/bin/sh
CODIS_HOME=/usr/local/codis
echo "shut down Redis2_proxy..."
$CODIS_HOME/bin/codis-config -c $CODIS_HOME/conf/config.ini proxy offline Redis2_proxy
echo "done"
echo "start new Redis2_proxy..."
nohup $CODIS_HOME/bin/codis-proxy --log-level error -c $CODIS_HOME/conf/config.ini -L $CODIS_HOME/logs/Redis2_proxy.log --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
echo "done"
echo "sleep 3s"
sleep 3
tail -n 30 $CODIS_HOME/logs/Redis2_proxy.log
修改Redis2和Redis3的codis-server的配置文件 /usr/local/codis/conf/6379.conf (我修改了三个地方,可以安装自己的需要修改)
logfile "/usr/local/codis/logs/codis_server.log"
dir /usr/local/codis/data
maxmemory 1G
按照上面的服务部署如图来启动机器上启动
Redis1 上需要运行的服务:
sh /usr/local/codis/scripts/start_dashboard.sh
sh /usr/local/codis/scripts/initslot.sh (这个初始化slot的脚本在哪台机器执行都可以我就放到Redis1上执行了,)
Redis1 上面需要启动一个codis-server的HA服务,用来自动切换codis-server的主从.这一步放到后面这里先不实现.
Redis2 上需要运行的服务:
sh /usr/local/codis/scripts/start_proxy.sh
/usr/local/codis/bin/codis-server /usr/local/codis/conf/6379.conf &
Redis3 上需要运行的服务:
sh /usr/local/codis/scripts/start_proxy.sh
/usr/local/codis/bin/codis-server /usr/local/codis/conf/6379.conf &
codis 的 HA (codisHA只需要在Redis1上部署)
codis的HA 分为 codis-prosy层的 HA 和 codis-server成的 HA
codis-server 层的HA的实现:
获取codis-server HA .
go get github.com/ngaut/codis-ha
编译codis-server HA
cd /data/go/src/github.com/ngaut/codis-ha
go build
移动编译后的codis-ha文件到 /usr/local/codis/bin
cp codis-ha /usr/local/codis/bin
codis-server HA 的启动方法
codis-ha --codis-config=dashboard地址:18087 --productName=集群项目名称
codis-ha 启动以后 ,任何一个组里面的codis-server master 挂掉以后,都会自动切换一个slave为master.
codis-proxy 层的HA的实现:
proxy本身是无状态的,所以proxy本身的HA是比较好做的,因为连接到任何一个活着的proxy上都是一样的,我们可以使用LVS和HA Proxy来做负载均衡.
豌豆荚针对java客户端开发了一个jodis, jodis是jedis的一个连接池,很简单,就是监听zk上面的存活proxy列表,挨个返回jedis对象,达到负载均衡和HA的效果.
使用joids需要从zookeeper获取存活的proxy列表,所以需要配置zookeeper的IP与端口. zookeeper的ip:端口是可以配置多个的,使用逗号隔开就可以了..这样整个架构就没有单点问题了...
具体的链接代码:
JedisResourcePool jedisPool = new RoundRobinJedisPool("Redis1:2181,Redis2:2181,Redis3:2181", 30000, "/zk/codis/db_codis/proxy", new JedisPoolConfig());
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("foo", "bar");
String value = jedis.get("foo");
System.out.println(value);
}
}
注释:
"Redis1:2181,Redis2:2181,Redis3:2181" #zookeeper主机的hostname与zookeeper服务开启的客户端链接端口,多个zookeeper主机之间用逗号分割,这样就解决了单点问题。
30000 #超时时间的设定
"/zk/codis/db_codis/proxy" #zookeeper中存储 codis代理的位置。
Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑
http://database.51cto.com/art/201507/483314_all.htm
codis 与 zookeeper 所在服务器重启需要做的一些事情?
删除fence节点下的所有内容
delete /zk/codis/db_redis/fence
删除 dashboard 节点
delete /zk/codis/db_redis/dashboard
然后在启动codis的各个服务
转载于:https://my.oschina.net/denglz/blog/505442
Codis 分布式缓存部署相关推荐
- 大厂都拿捏的缓存方案,平台级分布式缓存,什么业务才合适?
所有程序猿都对那缓存并不陌生,好似那风一样的女子只为你独自而舞.只见那回眸一笑百媚生,让你甚是吝惜,惹人怜爱. 但随着项目规模不断增大变强,光是单个缓存就难以招架,优而显得力不从心. 这时伴随着多级缓 ...
- 一致性哈希算法在分布式缓存中的应用
一.应用场景 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Redis作为缓存机制.现在我们一共有三台机器可以作为Redis服务器,如 ...
- 大厂都咋用平台、分布式缓存?起码你要懂技术,高级还得懂业务
所有程序猿都对那缓存并不陌生,好似那风一样的女子只为你独自而舞.只见那回眸一笑百媚生,让你甚是吝惜,惹人怜爱. 但随着项目规模不断增大变强,光是单个缓存就难以招架,优而显得力不从心. 这时伴随着多级缓 ...
- java 分布式 redis缓存技术_JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载...
课程名称 JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载 课程目标 本课程从0基础开始,对redis的方方面面进行细粒度的讲解:包括基础操作.高级命令.各种集群模式.动态增减节点 ...
- 技术前沿:分布式缓存Redis Cluster在华泰证券的探索与实践
关注↑↑↑我们获得更多精彩内容! 本文选自<交易技术前沿>总第三十期文章(2018年3月) 作者:樊建 陈营 葛宝磊/华泰证券股份有限公司 Redis Cluster作为最热门的开源分布式 ...
- 第02课:主流分布式缓存方案的解读及比较
分布式缓存一般被定义为一个数据集合,它将数据分布(或分区)于任意数目的集群节点上.集群中的一个具体节点负责缓存中的一部分数据,整体对外提供统一的访问接口.分布式缓存一般基于冗余备份机制实现数据高可用, ...
- 分布式技术与实战第六课 分布式缓存设计
第33讲:不止业务缓存,分布式系统中还有哪些缓存? 缓存是分布式系统开发中的常见技术,在分布式系统中的缓存,不止 Redis.Memcached 等后端存储:在前端页面.浏览器.网络 CDN 中也都有 ...
- (转自微博) 分布式缓存架构基础
文章不错,与大家共享之 文章转自点击打开链接 对于构建高性能.高可用的大型互联网系统,缓存是不可或缺的组成部分,微博的架构体系也是构建于缓存之上.本次课程介绍分布式缓存的相关知识,希望通过本次课程大家 ...
- 分布式-分布式缓存笔记
分布式系统缓存 缓存分类 前端缓存 前端缓存包括页面和浏览器缓存,如果是 App,那么在 App 端也会有缓存.当你打开商品详情页,除了首次打开以外,后面重复刷新时,页面上加载的信息来自多种缓存. 页 ...
最新文章
- 如何获取并操作listview中的控件
- 工控随笔_09_西门子_S7-200 Smart与V20 USS通信USS_RPM_R利用轮询的方式通讯异常
- Java 打飞机(小游戏)[版权非本人 本人制作收藏整理]
- BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
- pb 动态改变DW的WHERE子句
- windows 安装openssh服务端_Git神器| SourceTree安装使用教程
- 一家化纤工厂的数字化转型之路
- Verizon的SDN策略:不鸣则已,一鸣惊人?
- mac下查看redis安装路径_干货!win10环境下Redis安装、启动教程
- Could not create local repository at /home/yizhenn/.m、IDEA倒入maven项目无法导报问题
- _stdcall与_cdecl的区别
- 几种深度学习框架的使用和对比
- 蓝桥杯练习 杨辉三角形
- python 贪吃蛇小游戏代码
- # Codeforces Round #722(div2)D. Kavi on Pairing Duty
- html多行注释正则表达式,RegEx用于匹配/替换JavaScript注释(多行和内联)
- win7截屏快捷键未在计算机上运行,修复win7“截图工具当前未在计算机上运行”的方法...
- 怎样用N多小图片拼成一张大图?(数字图像处理)
- 【云原生】RPC技术选型
- 游戏3D美术设计师是什么?
热门文章
- c语言tmplink,为了便于阅读,偿试把BLHeli的汇编源程序改成C语言格式
- 计算机原理转移指令题,转移指令计算机原理.pdf
- python动态映射_Python Django框架url反向解析实现动态生成对应的url链接示例
- html加粗字体打印失效_论文格式要求及字体大小
- java web 集成dom4j_[JavaWeb基础] 031.dom4j写入xml的方法
- 单片机串口通信学号显示_触摸屏与单片机串口通信测试
- 《软件需求分析(第二版)》第 13 章——需求开发面临的特殊难题 重点部分总结
- Eclipse 答疑:如何使用 Eclipse 进行断点(Breakpoints)调试?
- s2sh框架搭建(辅助工具:MyEclipse)及解决一些遇到的问题
- python import 路径_python import 上级目录的导入