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,一经查实,立即删除!

相关文章

treeset java_Java TreeSet Higher()方法与示例

treeset javaTreeSet类Higher()方法 (TreeSet Class higher() method) higher() method is available in java.util package. Higher()方法在java.util包中可用。 higher() method is used to return the lowest element in this TreeSet that is higher than the specified el…

怎么解决MySQL死锁问题的?

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

strictmath_Java StrictMath cos()方法与示例

strictmathStrictMath类cos()方法 (StrictMath Class cos() method) cos() method is available in java.lang package. cos()方法在java.lang包中可用。 cos() method is used to return the trigonometric cosine of an angle of the given parameter in the method. Here, c…

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 服务器。有便宜不占王八蛋…

setseed_Java Random setSeed()方法与示例

setseed随机类setSeed()方法 (Random Class setSeed() method) setSeed() method is available in java.util package. setSeed()方法在java.util包中可用。 setSeed() method is used to set the given seed of this Random Number Generator. setSeed()方法用于设置此随机数生…

.Net 自己写个简单的 半 ORM (练手)

ORM 大家都知道&#xff0c; .Net 是EF 还有一些其他的ORM 从JAVA 中移植过来的 有 &#xff0c; 大神自己写的也有 不管ORM 提供什么附加的 乱七八糟的功能 但是 最主要的 还是 关系映射 的事情。 我自己一直在使用ORMDapper 这个很小的ORM 第一次看到这个ORM 是通过一…

synchronized和ReentrantLock的5个区别!

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

Java Random nextInt()方法与示例

随机类nextInt()方法 (Random Class nextInt() method) Syntax: 句法&#xff1a; public int nextInt();public int nextInt(int num);nextInt() method is available in java.util package. nextInt()方法在java.util包中可用。 nextInt() method is used to return the nex…

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

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

oppo后端16连问

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

java enummap_Java EnumMap values()方法与示例

java enummapEnumMap类values()方法 (EnumMap Class values() method) values() method is available in java.util package. values()方法在java.util包中可用。 values() method is used to get all the values in a Collection view of this enum map. values()方法用于获取…

django 1.8 官方文档翻译:2-1-1 模型语法

模型 模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常&#xff0c;每个模型对应数据库中唯一的一张表。 基础&#xff1a; 每个模型都是django.db.models.Model 的一个Python 子类。模型的每个属性都表示数据库中的一个字段。Django 提供一套…

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

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

Java Dictionary get()方法与示例

字典类的get()方法 (Dictionary Class get() method) get() method is available in java.util package. get()方法在java.util包中可用。 get() method is used to get the value on the specified key element (key_ele) in this dictionary. get()方法用于获取此字典中指定键…

[CareerCup] 8.10 Implement a Hash Table 实现一个哈希表

8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions. 这道题让我们实现一个简单的哈希表&#xff0c;我们采用了最简单的那种取余映射的方式来实现&#xff0c;我们使用Cell来保存一对对的key和value的映射关系&#xff0c;然后…

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

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

stl:queue 源码_C ++ STL中的queue :: empty()和queue :: size()

stl:queue 源码In C STL, Queue is a type of container that follows FIFO (First-in-First-out) elements arrangement i.e. the elements which inserts first will be removed first. In queue, elements are inserted at one end known as "back" and are delet…

术中导航_密码术中的计数器(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;好友可以发起评论、点赞等等。这种设计在微信和陌陌上大…