Redis分布式解决方案-Coids

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 CodisProxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.

 

Codis 由四部分组成:

  • Codis Proxy   (codis-proxy)  实现redis协议,由于本身是无状态的,因此可以部署很多个节点
  • Codis Manager (codis-config) codis的管理工具,包括添加/删除redis节点添加删除proxy节点,发起数据迁移等操作,自带httpserver,支持管理后台方式管理配置
  • Codis Redis   (codis-server) codis维护的redis分支,基于2.8.21分支,加入了slot的支持和原子的数据迁移命令;codis-proxy codis-config只能和这个版本的redis交互才能正常运行
  • ZooKeeper 用于codis集群元数据的存储,维护codis集群节点

Codis优缺点

优点

对客户端透明,与codis交互方式和redis本身交互一样

支持在线数据迁移,迁移过程对客户端透明

有简单的管理和监控界面

支持高可用,无论是redis数据存储还是代理节点

自动进行数据的均衡分配

最大支持1024个redis实例,存储容量海量

高性能

缺点
采用自有的redis分支,不能与原版的redis保持同࠵

如果codis的proxy只有一个的情况下,redis的性能会下降20%左右

某些命令不支持,比如事务命令muti

国内开源产品,活跃度相对弱一些

Codis架构

Redis分布式解决方案-Coids_第1张图片

Codis的性能(代理+两个redis节点
Redis分布式解决方案-Coids_第2张图片


首先需要安装go环境

wget http://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz

解压

tar -zxvf go1.4.1.linux-amd64.tar.gz 

下载zookeeper

wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

解压

vi ~/.bash_profile

配置go环境变量还有zk home

vi ~/.bash_profile
Redis分布式解决方案-Coids_第3张图片

PATH=$PATH:$HOME/bin

export PATH
JAVA_HOME=/java/jdk1.7.0_76
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export CLASSPATH

ZOOKEEPER_HOME=/java/zookeeper-3.4.6


GOROOT=/java/go
export GOPATH=/java/codis
PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$ZOOKEEPER_HOME/bin
export PATH

令环境变量生效

source ~/.bash_profile

创建codis目录

mkdir codis

下载codis代码

go get -u -d github.com/CodisLabs/codis

进入到coids里面执行make 编译代码



编译完成后会在bin目录下面产生3个可执行文件


修改config.ini文件

vi config.ini

Redis分布式解决方案-Coids_第4张图片

进入zk目录启动zk

cd /java/zookeeper-3.4.6/bin
./zkServer.sh start

通过jps命令查看zk是否启动

Redis分布式解决方案-Coids_第5张图片

codis启动步骤

./codis-config -c ../config.ini dashboard

你也可以在后面加上 & 表示后台启动


可以查看zk里面的数据

Redis分布式解决方案-Coids_第6张图片

然后初始化slots

./codis-config -c ../config.ini slot init

这些slot的信息都会保存在zk里面

Redis分布式解决方案-Coids_第7张图片

首先可以启动一个codis-server

复制一份redis的配置文件过来 ,然后启动

Redis分布式解决方案-Coids_第8张图片

./codis-server  ./redis.6379.conf

 

 

然后添加一个group server

每一个Servicegroup 作为一个Redis服务器组存在,只允许有一个master,可以有多个slave,group id 仅支持大于1的整数

Redis分布式解决方案-Coids_第9张图片


Redis分布式解决方案-Coids_第10张图片

添加成功

Redis分布式解决方案-Coids_第11张图片

分配slot

Redis分布式解决方案-Coids_第12张图片

启动codis-proxy

./codis-proxy -c ../config.ini -L ./proxy.log --cpu=1 --addr=192.168.247.103:19000 --http-addr=192.168.247.103:11000

Addr为代理绑定的ip和端口

--cpu为代理使用的cpu核数,与虚拟机的配置有关,一般跟核数相同

http-addr用于测试的地址
-L 指定代理的日志文件


刚启动的时候,默认是offline状态,处于此状态不能对外提供服务

把代理状态修改为online

访问11000端口

Redis分布式解决方案-Coids_第13张图片

查看到proxy的id,然后修改codis proxy的状态

./codis-config -c ../config.ini proxy online proxy_1


也可以通过dashboard 查看


连接proxy

./redis-cli -p 19000 -h 192.168.247.103


通过java 客户端连接 codis 

Pom.xml


			redis.clients
			jedis
			2.8.0
			jar
			compile
		
		
			io.codis.jodis
			jodis
			0.3.1
		
		
			com.wandoulabs.jodis
			jodis
			0.2.2
		
		
			junit
			junit
			4.11
			jar
			test
		
Redis分布式解决方案-Coids_第14张图片

Java代码:

JedisResourcePool jedisPool = RoundRobinJedisPool.create()
				        .curatorClient("192.168.247.103:2181", 30000).zkProxyDir("/zk/codis/db_test/proxy").build();
				try (Jedis jedis = jedisPool.getResource()) {
				    jedis.set("foo", "bar");
				    String value = jedis.get("foo");
				    System.out.println(value);
				}

删除刚刚设置的key

Redis分布式解决方案-Coids_第15张图片

运行程序查看结果


Codis高可用 codis-ha

Codis-ha 需要单独安装 codis-ha 

go get github.com/ngaut/codis-ha

进入codis-ha目录

Redis分布式解决方案-Coids_第16张图片

执行build命令

go build


启动codis-ha 

nohup ./codis-ha --codis-config=192.168.247.103:18087 --productName=test

– codis-config:指定配置服务地址
– productName
:产品
– nohup
是把日志输出重定向到nohup文件

 

一共启动了2个codis 

Redis分布式解决方案-Coids_第17张图片

Redis分布式解决方案-Coids_第18张图片

Kill掉其中一个codis

kill -9 16914

nohup.out 输出日志

Redis分布式解决方案-Coids_第19张图片

刷新 dashboard 页面

Redis分布式解决方案-Coids_第20张图片

原来的master 的状态被改变为 offine , slave 被提升为 master

然后重新启动 6379


日志信息

Redis分布式解决方案-Coids_第21张图片

原来的6379变为了 slave

Redis分布式解决方案-Coids_第22张图片

虽然可以高可用是可以自动切换,但是在实际应用场景还是要注意下应用场景

因为redis本身的主从复制是异步方式, 异步方式就没有办法保证数据的完整性,数据没有最终的保证.

如果并发高了,每秒的操作多了,执行的很快,在master宕掉的话,slave可能跟不上,导致slave可能会抛弃一些数据.数据就会出现不一致

 

一般的话,我们使用redis来存储数据,如果出现这种情况,也会在redis中获取不到的时候重新在存储数据到redis里面,所以一般是不用担心主从复制导致数据不一致所产生的问题

Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

你可能感兴趣的:(nosql,Redis)