作业描述】
1.cluster的故障转移操作,截图展示

2.部署codis,并写代码访问codis
==================================================
 
一、系统环境

二、cluster集群的故障转移
##集群的故障转移前提是集群复制,复制原理和单节点的主从复制一样。
##从节点也要运行在集群模式下,通过cluster meet命令将从节点添加到集群环境;
##在即将成为从节点的节点命令行执行cluster replicate <node-id>命令,即将此节点设置为<node-id>对应的从节点
 
1、需求描述:当前redis集群有redis6379、redis7379、redis8379三个主节点,现要对redis6379添加一个从节点redis9379
操作如下:
(1)redis9379节点以集群模式启动;
(2)将redis9379添加到集群:

(3)将redis9379节点设置为redis6379的从节点:

##进入redis9379节点命令行,执行cluster replicate <node-id>,<node-id>为redis6379节点的节点ID
先通过redis-trib.rb check命令查看集群状态:

将redis9379节点设置为redis6379的从节点:

或者通过redis-trib.rb chek命令查看:

(3)模拟故障,观察故障转移是否成功:
将redis6379进程杀掉,观看集群状态信息:

redi-trib.rb check命令,连接集群里任意个节点,集群状态信息如下:

第一次查看:
第二次查看:

###至此,集群故障转移模拟完成!

===========================================================================
 
 
三、codis安装部署(单机版本)
 
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
【Codis 由四部分组成】
Codis Proxy (codis-proxy)
Codis Manager (codis-config)
Codis Redis (codis-server)
ZooKeeper
(1)codis-proxy 是客户端连接的 Redis 代理服务, codis-proxy 本身实现了 Redis 协议, 表现得和一个原生的 Redis 没什么区别 (就像 Twemproxy), 对于一个业务来说, 可以部署多个 codis-proxy, codis-proxy 本身是无状态的。
(2)codis-config 是 Codis 的管理工具, 支持包括, 添加/删除 Redis 节点, 添加/删除 Proxy 节点, 发起数据迁移等操作. codis-config 本身还自带了一个 http server, 会启动一个 dashboard,用户可以直接在浏览器上观察 Codis 集群的运行状态。
(3)codis-server 是 Codis 项目维护的一个 Redis 分支, 基于 2.8.13 开发(因此redis3.0以后的新特性,codis没有), 加入了 slot 的支持和原子的数据迁移指令。Codis 上层的 codis-proxy 和 codis-config 只能和这个版本的 Redis 交互才能正常运行。
(4)Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy。
##Codis 支持按照 Namespace 区分不同的产品, 拥有不同的 product name 的产品, 各项配置都不会冲突。

------------------------------------------------------------------------------------------------------------------------------------------
 
以下是codis的安装部署过程(单机版本go+)
【说明】

codis下载地址:https://github.com/CodisLabs/codis

go下载地址: https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz

-----------------------------------------------------------------------------------------------------

【安装go环境】

1、下载地址:https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz

wget  https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz

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

2、配置环境变量

export GOROOT=/httx/run/go

export GOPATH=/httx/run/codis

export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

GOROOT参数定义的值是go解压的目录,go解压配置环境变量就行,不应安装;

GOPATH参数定义的值是go环境的扩展包目录,所有go环境公用,这里指的是codis;

注意!命令行export,是会话级别的,为了永久有效,可以在/etc/profile文件添加以上环境变量!

【安装依赖环境】

yum groupinstall "Development Tools"

【安装zookeeper

  1. 下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/

tar xvf zookeeper-3.3.6.tar.gz

  1. 配置zookeeper的环境变量

##Zookeeper是java语言开发的,所以系统里也必须有java环境,JDK的安装这里忽略

  1. 启动zookeeper服务

cd /httx/run/zookeeper-3.3.6/bin

./zkServer.sh start

【安装codis

1、执行go get –u –d github.com/CodisLabs/codis命令下载codis代码:

有如下报错:

解决:在线安装git命令,yum install git

2、切换到/httx/run/codis/src/github.com/CodisLabs/codis目录下,执行make命令编译代码:

3、执行make gotest来跑测试:

4、编译完成后,在bin目录下生成codis-config、codis-proxy、codis-server三个可执行文件:

##到此编译结束!

5、codis的配置
(1)默认配置文件是config.ini文件,在/httx/run/codis/src/github.com/CodisLabs/codis安装目录下,可以通过参数-c指定配置文件;

zk=10.7.12.98:2181

product=codis

dashboard_addr=10.7.12.98:18087

##也可以将config.ini配置文件放到/etc/下,便于统一管理

(2)启动管理控制台:启动dashboard,在后面追加&表示后台启动

cd /httx/run/codis/src/github.com/CodisLabs/codis/bin/

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

以上表示启动codis的管理端口启动成功!

可以通过IP:端口方式访问管理端口!

###期间有报错:Failed to connect to 10.7.12.98:2181: dial tcp 10.7.12.98:2181: connection refused,是因为zookeeper服务器没启动成功,重启zookeeper服务即可!

###期间有报错[error]: dashboard already exists: {"addr": "10.7.12.98:18087", "pid": 5828},需要到zookeeper里面清理这个节点:

无论是proxy还是dashboard,都会在zk上注册自己的节点,同时在程序正常退出的时候会删掉对应的节点,但如果异常退出或试用kill -9 {pid}就会导致zk的节点无法删除,在下一次启动的时候会报“zk: node already exists”的错误。

因此关闭服务的时候直接用kill {pid}不要-9,同时如果无法启动并且确认没有其他运行中的进程占用zk上的节点,可以在zk上手动删除未啊删除干净的codis节点:/zk/codis/db_codis/dashoard,这个目录可以在codis的管理控制台dashboard启动成功时输出信息看到!

创建zk节点的目的: zk节点的目的是防止起两个dashboard

【解决如下:】

进入zk客户端,手动删除

cd /httx/run/zookeeper-3.3.6/bin/

./zkCli.sh     ##进入zk客户端

delete /zk/codis/db_codis/dashboard

可以从浏览器打开http://192.168.16.239:18087/admin/

(3)初始化slots

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

(4)启动codis-server服务

##redis-2.8.21是codis依赖的第三方软件版,在前面go环境的搭建部署时已经指定/usr/local/codis/目录,redis-2.8.21包就下载到此目录下,可以其配置文件配置到/etc目录下统一管理,如下:

mkdir /etc/codis

cd /usr/local/codis/codis-master/extern/redis-2.8.21

cp redis.conf /etc/codis/6379.conf

cp redis.conf /etc/codis/7379.conf

cp redis.conf /etc/codis/8379.conf

cp redis.conf /etc/codis/9379.conf

并修改各个配置文件的端口分别为6379、7379、8379、9379端口

接下来启动codis-server

cd /httx/run/codis/src/github.com/CodisLabs/codis/bin

./codis-server /etc/codis/6379.conf

./codis-server /etc/codis/7379.conf

./codis-server /etc/codis/8379.conf

./codis-server /etc/codis/9379.conf

##codis-server的启动方式和单机redis启动方式一样

(5)添加server group(命令行添加或者通过dashboard界面2种方式添加组)

可以通过命令codis-config server添加或者通过dashboard添加;

每个server group作为一个redis服务器存在,只允许有一个master,可以有多个slave,group id仅支持大于等于1个整数;

需求:新增2组构成codis集群环境,其中group_1的成员redis实例是redis6379、redis7379;group_2的成员redis实例是redis8379、redis9379;小组内的2个成员一主一从;

——4.1 进入http://192.168.16.239:18087/admin/,通过管理界面配置group_1和group_2,如下:

——4.2 添加codis组内成员

配置好如下:

 
##需要注意,选择其他成员为新master,老的master就会offline
 
(6)slots槽位分配(命令行添加或者通过dashboard界面2种方式添加组)
需求:对codis集群做槽位分片,也就是将1024个槽位分配给group_1组和group_2组,1024个槽必须全部分配完。做槽位分配,如下:
##注意,redis集群的槽位默认是16384个虚拟节点;codis的槽位是默认1024个,只对组为单位做槽位分配

解决如下:

或者./codis-config -c ../config.ini slot init -f,带上-f参数表示强制重新初始化!
 

###Migrate Status部分是逻辑迁移,也就是缓存迁移,做槽位重分配

###逻辑方式重新配置槽位,有报错:[WARN] rollback premigrate failedSome proxies may not stop cleanly: 10.7.12.98:11000,这个是因为在槽位迁移过程中,codis-proxy没有关闭,将dashboard上Proxy Status改为offline即可,停止proxy也即是停止外部读redis的访问,才能正确做槽位重新分配;
 
6、启动codis-proxy代理

./codis-proxy -c ../config.ini -L /httx/logs/codis-proxy.log  --cpu=4 --addr=10.7.12.98:11000 &

有如下报错:

解决:

是因为前一步骤没有将1024个槽位指定完,将剩余的尚未指定的槽位再次指定给group_1组
 

7、登录客户端测试,连接codis-proxy的IP和端口,如下:


8、测试codis-server的高可用
——8.1 当前group_2组的主节点是redis8379:
 

——8.2 将redis8379进程杀死,观察变化:

9、实现codi-server的高可用——
 
 
 
 

第十课——cluster故障转移操作,codis部署的更多相关文章

  1. MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录

    Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...

  2. Oracle Dataguard故障转移(failover)操作

    注意:故障转移会破坏DG的主从关系,使其变为互不相关的2个数据库,谨慎使用. (一)故障转移操作流程图 (二)故障转移操作流程 备注:以下操作步骤与上面流程图步骤一一对应 STEP1:刷新所有未发送到 ...

  3. 部署AlwaysOn第三步:集群资源组的健康检测和故障转移

    资源组是由一个或多个资源组成的组,WSFC的故障转移是以资源组为单位的,资源组中的资源是相互依赖的.一个资源所依赖的其他资源必须和该资源处于同一个资源组,跨资源组的依赖关系是不存在的.在任何时刻,每个 ...

  4. redis集群复制和故障转移

    #### 一.集群的问题- 1.当某个主节点宕机后,对应的槽位没有节点承担,整个集群处于失败状态,不可用,怎么办- 2.如何判断某个主节点是否真正的岩机?- 3.如果从某个主节点的所有从节点中选举出一 ...

  5. 【Hadoop 分布式部署 十 一: NameNode HA 自动故障转移】

    问题描述:    上一篇就是NameNode 的HA 部署完成,但是存在问题,问题是如果 主NameNode的节点宕机了,还是需要人工去使用命令来切换NameNode的Acitve 这样很不方便,所以 ...

  6. 第7章 性能和可靠性模式 Failover Cluster(故障转移群集)

    上下文 您已经决定在设计或修改基础结构层时使用群集以提供高度可用的服务. 问题 您应该如何设计一个高度可用的基础结构层,来防止因单台服务器或它所运行的软件出现故障而导致的服务丢失? 影响因素 在设计高 ...

  7. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  8. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

  9. 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群

    需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...

随机推荐

  1. Atitit.mysql oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server..

    Atitit.mysql  oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server.. 1. with ... as (...) 在mys ...

  2. Nginx - Windows下Nginx初入门,附CentOS下Nginx的安装

    公司刚使用nginx,预先学习下.鉴于机器没有Linux环境,在Windows熟悉下. 下载 目前(2015-07-11),nginx的稳定版本是1.8.0,在官网下载先,windows版的nginx ...

  3. web.py+fastcgi+nginx 502错误解决

    用web.py照着官网在服务器上搭好了后台.这次很奇怪地出现了一个Nginx 502 Bad Gateway的错误. 执行上面的kill `pgrep -f "python /path/to ...

  4. Juqery 定时器 settimeout setInterval

    setTimeout 只执行一次 setTimeout(loading_tree,2000); function loading_tree(){ $('body').mLoading("hi ...

  5. Java调用doNet webService方法

    doNet的webService 浏览器访问测试地址:http://192.168.4.17/JLWWS/sendCommand.asmx,出现 点击getDeviceValue方法,出现 上图的xm ...

  6. lnmp服务器的目录信息

    LNMP状态管理命令: LNMP状态管理: /root/lnmp {start|stop|reload|restart|kill|status}Nginx状态管理:/etc/init.d/nginx ...

  7. C++中数字和字符串的转换

    1.字符串数字之间的转换 (1)string --> char *   string str("OK");   char * p = str.c_str(); (2)char ...

  8. [转]第2台Tomcat端口变更失败解决办法

    原文链接:http://blog.csdn.net/preterhuman_peak/article/details/41803361 今天在服务器上部署了两个Tomcat.于是将其中一个的serve ...

  9. Android基础总结(十)ContentProvider

    内容提供者(掌握) 应用的数据库是不允许其他应用访问的 内容提供者的作用就是让别的应用访问到你的私有数据 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数 ...

  10. 关于对象序列化json 说说

    下面一个json格式图(说一下,json 其实就是js 数组和对象的一种字符串表现形式 var obj=[] 或者var obj={}  ) var json= {} 如下 从图中看 json中有两个 ...