Codis 分布式缓存部署

为什么80%的码农都做不了架构师?>>>   hot3.png

环境介绍:

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集群的服务部署如图:

121707_ODhj_734134.png

服务的部署

第一步: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么解决MySQL死锁问题的?

咱们使用 MySQL 大概率上都会遇到死锁问题,这实在是个令人非常头痛的问题。本文将会对死锁进行相应介绍,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议。话不多说,开整!什么是死锁死锁是并…

Apache cxf JaxRs基本应用

2019独角兽企业重金招聘Python工程师标准>>> 在前一篇中&#xff0c;我们完成了《Apache cxf JaxWs基本应用》 的编写&#xff0c;我们现在实现一个Restful风格的Cxf 。 一、我们首先依旧是基于Maven project配置pom.xml的依赖 [html] view plaincopyprint? <pr…

白嫖1年阿里云,反手就搭一个Java环境

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;早上收到阿里云小姐姐的消息&#xff0c;阿里云有搞事情了&#xff0c;这次是送一年的阿里云 ECS 服务器。有便宜不占王八蛋…

synchronized和ReentrantLock的5个区别!

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 中&#xff0c;常用的锁有两种&#xff1a;synchronized&#xff08;内置锁&#xff09;和 ReentrantLock&a…

《小强升职记》读后感和思维导图

语言幽默轻松&#xff0c;寓教于乐&#xff0c;看完之后有挽起袖子大干一场的冲动&#xff0c;但是诚如书中所言&#xff0c;“不做收藏家&#xff0c;要做建筑工”&#xff0c;实践和坚持才能有所收获。第一次画思维导图(′▽〃)Xmind格式文件转载于:https://www.cnblogs.com/…

oppo后端16连问

前言 大家好&#xff0c;我是磊哥。最近有位读者去面试了oppo&#xff0c;给大家整理了面试真题的答案。希望对大家有帮助哈&#xff0c;一起学习&#xff0c;一起进步。聊聊你印象最深刻的项目&#xff0c;或者做了什么优化。你项目提到分布式锁&#xff0c;你们是怎么使用分布…

实战!阿里神器 Seata 实现 TCC 模式解决分布式事务

今天这篇文章介绍一下Seata如何实现TCC事务模式&#xff0c;文章目录如下&#xff1a;目录什么是TCC模式&#xff1f;TCC&#xff08;Try Confirm Cancel&#xff09;方案是一种应用层面侵入业务的两阶段提交。是目前最火的一种柔性事务方案&#xff0c;其核心思想是&#xff1…

Spring Boot 中实现跨域的 5 种方式,你一定要知道!

一、为什么会出现跨域问题出于浏览器的同源策略限制。同源策略&#xff08;Sameoriginpolicy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略…

术中导航_密码术中的计数器(CTR)模式

术中导航The Counter Mode or CTR is a simple counter based block cipher implementation in cryptography. Each or every time a counter initiated value is encrypted and given as input to XOR with plaintext or original text which results in ciphertext block. Th…

Android社交类APP动态详情代码实现通用模板

&#xfeff;&#xfeff;Android社交类APP动态详情代码实现通用模板 Android平台上一些比较流行的社交类APP比如微信、陌陌等&#xff0c;都有动态详情页&#xff0c;在该页面&#xff0c;用户发表的动态详情&#xff0c;好友可以发起评论、点赞等等。这种设计在微信和陌陌上大…

聊聊并发编程的12种业务场景

前言并发编程是一项非常重要的技术&#xff0c;无论在面试&#xff0c;还是工作中出现的频率非常高。并发编程说白了就是多线程编程&#xff0c;但多线程一定比单线程效率更高&#xff1f;答&#xff1a;不一定&#xff0c;要看具体业务场景。毕竟如果使用了多线程&#xff0c;…

梳理50道经典计算机网络面试题

我梳理了50道计算机网络面试题&#xff0c;每一道题目都特别经典&#xff0c;大厂也非常喜欢问。相信大家看完&#xff0c;会有新的收获滴~1. 说说HTTP常用的状态码及其含义&#xff1f;思路: 这道面试题主要考察候选人&#xff0c;是否掌握HTTP状态码这个基础知识点。不管是不…

A successful Git branching model

原文&#xff1a;http://nvie.com/posts/a-successful-git-branching-model/ In this post I present the development model that I’ve introduced for all of my projects (both at work and private) about a year ago, and which has turned out to be very successful. I…

一文详解读写锁

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;读写锁&#xff08;Readers-Writer Lock&#xff09;顾名思义是一把锁分为两部分&#xff1a;读锁和写锁&#xff0c…

[实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

写在前面 上篇文章简单介绍了项目的结构&#xff0c;这篇文章将实现用户的注册。当然关于漂亮的ui&#xff0c;这在追后再去添加了&#xff0c;先将功能实现。也许代码中有不合适的地方&#xff0c;也只有在之后慢慢去优化了。 系列文章 [EF]vs15ef6mysql code first方式 [实战…

下个十年高性能 JSON 库来了:fastjson2!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;fastjson2 是 fastjson 项目的重要升级&#xff0c;目标是为下一个十年提供一个高性能的 JSON 库&#xff0c;同一套 API 支…

THEOS的第一个TWeak的成功创建

THEOS的第一个TWeak的成功创建THEOS的第一个TWeak的成功创建参考资料:成功的创建一个TWeak的弹出步骤1:安装Xcode和Xcode command line步骤2:安装theosa:下载theos前,设置保存的路径:环境变量b:下载theosc:下载头文件d:下载ldid签名工具e:配置MoblieSubstrate环境f:安装dpkg步骤…

查询中,有没有可能多个索引一起用呢?

其实我们之前所讲的回表&#xff0c;就是两个索引树同时使用&#xff0c;先在二级索引树中搜索到对应的主键值&#xff0c;然后在再去主键索引树中查询完整的记录。但是我今天的问题是&#xff0c;两个不同的二级索引树&#xff0c;会同时生效吗&#xff1f;理论上来说&#xf…

ThreadLocal夺命11连问

前言前一段时间&#xff0c;有同事使用ThreadLocal踩坑了&#xff0c;正好引起了我的兴趣。所以近期&#xff0c;我抽空把ThreadLocal的源码再研究了一下&#xff0c;越看越有意思&#xff0c;发现里面的东西还真不少。我把精华浓缩了一下&#xff0c;汇集成了下面11个问题&…

Spring Boot 优雅配置多数据源

大约在19年的这个时候&#xff0c;老同事公司在做医疗系统&#xff0c;需要和HIS系统对接一些信息&#xff0c;比如患者、医护、医嘱、科室等信息。但是起初并不知道如何与HIS无缝对接&#xff0c;于是向我取经。最终经过讨论采用了视图对接的方式&#xff0c;大致就是HIS系统提…