Redis集群解决方案-Codis

    Codis由豌豆荚于2014年11月开源,基于go和c开发,是近期涌现的、国人开发的优秀开源软件之一,稳定性极高,性能更是改善了很多。


    Codis由四部分组成:

        codis-proxy:codis-proxy是客户端连接的Redis代理服务,codis-proxy本身实现了Redis协议,表现得和一个原生Redis没什么区别,对于一个业务来说,可以部署多个codis-proxy,codis-proxy本身是无状态的

        codis-config:codis-config是Codis的管理工具,支持添加/删除Redis节点,同时会启动一个dashboard的服务,可通过web界面来直接观察Redis集群运行的状态

        codis-server:codis-server是codis项目维护的一个Redis分支,基于2.8.13开发,加入了solt的支持原理的数据迁移指令。Codis上层的codis-proxy、codis-config只能和这个版本的Redis交互才能够正常运行

        zookeeper:Codis依赖zookeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过zookeeper同步到各个codis-proxy节点,zookeeper还维护codis-server group信息,并提供分布式锁等服务。


    Codis的特性:

        1、自动平衡

        2、使用非常简单,可通过web界面来管理

        3、图形化的面板和管理工具

        4、支持绝大多数Redis命令,完全兼容twemproxy

        5、支持Redis原生客户端

        6、安全而完全透明的数据移植,可根据需要轻松添加和删除节点

        7、提供命令行接口

    

                    IP/主机名
                 部署服务
               10.10.73.148/node1               codis+zookeeper
               10.10.73.149/node2               codis-zookeeper
               10.10.73.192/node3               codis+dashboard

    

一、提供java环境,Zookeeper以及Go依赖于java(node1、node2、node3)

[root@node1 ~]# mkdir -pv /opt/java
[root@node1 ~]# tar -xf /root/jdk-7u51-linux-x64.tar.gz -C /opt/java/


二、提供Go语言,Codis服务依赖Go语言(node1、node2、node3)

[root@node1 ~]# tar -xf /root/go1.6.linux-amd64.tar.gz -C /usr/local/


三、编辑"/etc/hosts"(node1、node2、node3)

[root@node1 ~]# vim /etc/hosts
10.10.73.148  node1
10.10.73.149  node2
10.10.73.192  node3

####node2、node3和node1一样


四、在node1、node2服务器上部署Zookeeper服务(node1、node2)

[root@node1 ~]# mkdir /opt/app/zookeeper -pv
[root@node1 ~]# cd /opt/app/zookeeper/
[root@node1 zookeeper]# wget  http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
[root@node1 zookeeper]# tar -xf zookeeper-3.4.8.tar.gz 
[root@node1 zookeeper]# cd zookeeper-3.4.8
[root@node1 zookeeper-3.4.8]# pwd
/opt/app/zookeeper/zookeeper-3.4.8
[root@node1 zookeeper-3.4.8]# cp conf/zoo_sample.cfg conf/zoo.cfg     ##"zoo.cfg"为"zookeeper"的配置文件
[root@node1 zookeeper-3.4.8]# vim conf/zoo.cfg
    tickTime=2000    ##指明服务端(Leader)和客户端(Follower)之间的心跳时间间隔,单位为ms
    initLimit=10    ##指定容忍心跳检测失败的最大次数
    syncLimit=5    ##指定Leader和Folloer之间发送消息,请求和应答的时常,不能大于’tickTime’的值
    dataDir=./data/    ##指定数据存储路径,需创建
    dataLogDir=./logs    ##指明日志存储路径,需创建
    server.148=node1:2888:3888    ##指明zookeeper节点,148表示每台zookeeper标号,2888表示zookeeper监听端口,3888表示leader选举端口
    server.149=node2:2888:3888
    clientPort=2181    ##指明客户端连接服务端的端口
[root@node1 zookeeper-3.4.8]# mkdir data logs
[root@node1 zookeeper-3.4.8]# cat data/myid 
148   ##指明zookeeper当前节点的标示符

#####以上操作均在node1节点上操作,node2节点同样如此,需要注意的是node2节点下的data/myid应为149


五、提供环境环保,编辑"/etc/profile"(node1、node2、node3)

[root@node1 ~]# vim /etc/profile
export  PATH=$PATH:/usr/local/go/bin
export  JAVA_HOME=/opt/java/jdk1.7.0_51
export  PATH=$JAVA_HOME/bin:$PATH
export  GOPATH=/opt/app/product    ##codis的路径,下面由”$GOPATH”表示
export  PATH=$PATH:$GOPATH/bin
export  CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export  CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@node1 ~]# source /etc/profile    ##重载配置文件
[root@node1 ~]# go version      ##检测环境变量配置是否成功
go version go1.6 linux/amd64


六、安装codis服务(node1、node2、node3)

[root@node1 product]# pwd
/opt/app/product
[root@node1 codis]# cd $GOPATH/src/github.com/CodisLabs/codis/
[root@node1 codis]# go get -u -d github.com/CodisLabs/codis     ##下载codis
    package github.com/CodisLabs/codis: no buildable Go source files in /opt/app/product/src/github.com/CodisLabs/codis  ##正确
[root@node1 codis]# make
make[2]: Leaving directory `/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src'    
make[1]: Leaving directory `/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21'
[root@node1 codis]# make gotest
?       github.com/CodisLabs/codis/cmd/cconfig    [no test files]
?       github.com/CodisLabs/codis/cmd/proxy    [no test files]    ##出现以上内容表示codis安装成功
[root@node1 codis]# mkdir -pv logs data conf
[root@node1 codis]# vim config.ini
    zk=node1:2181,node2:2181   ##指明zookeeper节点的IP和端口
    product=ch_wtc   ##定义数据库
    dashboard_addr=10.10.73.192:18087   ##定义dashboard节点,监听端口为18087
    password=wtc.com     ##slave连接master的密码
    proxy_id=proxy_148   ##定义proxy节点的id
    
    
[root@node1 codis]# cd /conf
[root@node1 conf]# wget https://github.com/ijonas/dotfiles/raw/master/etc/redis.conf --no-check-certificate
[root@node1 conf]# ll
total 24
-rw-r--r-- 1 root root 23350 Aug 30 11:02 redis.conf
[root@node1 conf]# cp redis.conf redis_9736.conf 
[root@node1 conf]# cp redis.conf redis_9746.conf 
[root@node1 conf]# vim redis_9736.conf
    pidfile ./data/redis_9736.pid
    port 9736
    logfile ./logs/redis_9736.log
    dbfilename dump_9736.rdb
    dir ./data/redis_9736
    masterauth wtc.com   ##开启认证功能
    requirepass wtc.com   ##指定密码,必须与”config.ini’配置文件中的password值一样
[root@node1 conf]# vim redis_9746.conf
    pidfile ./data/redis_9746.pid
    port 9746
    logfile ./logs/redis_9746.log
    dbfilename dump_9746.rdb
    dir ./data/redis_9746
    masterauth wtc.com   
    requirepass wtc.com

####以上操作均在node1节点上运行,node2、node3节点操作方式和node1一样



七、上述操作完成后,分别启动zookeeper、codis-server、dashboard、codis-proxy

  1、启动zookeeper(node1、node2)

[root@node1 zookeeper-3.4.8]# pwd
/opt/app/zookeeper/zookeeper-3.4.8
[root@node1 zookeeper-3.4.8]# bin/zkServer.sh start     ##node1
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node2 zookeeper-3.4.8]# bin/zkServer.sh start     ##node2
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED


  2、启动codis-server(node1、node2、node3)

[root@node1 codis]# pwd
/opt/app/product/src/github.com/CodisLabs/codis
[root@node1 codis]# bin/codis-server conf/redis_9736.conf
[root@node1 codis]# bin/codis-server conf/redis_9746.conf
[root@node1 codis]# ps aux | grep codis
root      1597  0.0  0.1 137388  9432 ?        Ssl  11:58   0:00 bin/codis-server *:9736              
root      1601  0.0  0.1 137388  9432 ?        Ssl  11:59   0:00 bin/codis-server *:9746

注意:如果启动失败,可查看错误日志
[root@mysql_01 codis]# pwd
/opt/app/product/src/github.com/CodisLabs/codis
[root@mysql_01 codis]# cat logs/redis_9736.log
[28181] 29 Aug 16:44:17.121 # Can't chdir to './data/redis_9736': No such file or directory
解决办法:在相应的目录下创建相应的文件即可--./data/redis_9736


  3、启动dashboard(node3),并经行初始化

[root@node3 codis]# nohup bin/codis-config dashboard >./logs/dashboard.log 2>&1 &
[1] 4891
[root@node3 codis]# ps aux | grep dashboard
root      4891  0.5  0.1 281876  8296 pts/1    Sl   11:59   0:00 bin/codis-config dashboard
[root@node3 codis]# bin/codis-config slot init   ##进行初始化,之后建立组关系
{
  "msg": "OK",
  "ret": 0
}


 

八、对各个节点建立组关系(node3)

[root@node3 codis]# bin/codis-config server add 1 node1:9736 master
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config server add 1 node2:9746 slave
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config server add 2 node2:9736 master
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config server add 2 node3:9746 slave
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config server add 3 node3:9736 master
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config server add 3 node1:9746 slave
{
  "msg": "OK",
  "ret": 0
}

##总共分了三个组
    1、node1为主、node2为从
    2、node2为主、node3为从
    3、node3为主、node1为从

 


九、对每个组进行solt范围划分,并启动proxy,设置为online(node3)

[root@node3 codis]# bin/codis-config slot range-set 0 340 1 online
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config slot range-set 341 681 2 online
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config slot range-set 682 1023 3 online
{
  "msg": "OK",
  "ret": 0
}
[root@node1 codis]# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 &   
[root@node2 codis]# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 &
[root@node3 codis]# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 & 
[root@node1 codis]#  bin/codis-config -c config.ini proxy online proxy_148    ##node1
{
  "msg": "OK",
  "ret": 0
}
[root@node2 codis]# bin/codis-config -c config.ini proxy online proxy_149     ##node2
{
  "msg": "OK",
  "ret": 0
}
[root@node3 codis]# bin/codis-config -c config.ini proxy online proxy_192     ##node3
{
  "msg": "OK",
  "ret": 0
}

wKiom1fFWx7ywWr7AAEKIrgZRdk773.jpg-wh_50

wKiom1fFW4njw3bRAACdKQMP64Y991.jpg


问题总结:

    1、在搭建Redis集群时,一定要配置"/etc/hosts",否则启动dashboard时失败

    2、"config.ini"和"redis_97(3|4)6"中的"password"一样

    3、通过dashboard对Redis集群进行分组所使用的solt范围为"0-1023"

    4、dashboard启动成功后,一定要进行初始化,查看是否初始化可通过zookeeper节点来查看

[root@node1 zookeeper-3.4.8]# pwd     ##node1
/opt/app/zookeeper/zookeeper-3.4.8
[root@node1 zookeeper-3.4.8]# sh bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /zk/codis
[db_wtc]
[zk: localhost:2181(CONNECTED) 1] ls /zk/codis/db_wtc
[fence, servers, slots, proxy, migrate_tasks, dashboard, LOCK, actions, ActionResponse]

####若出现了"slots",则说明进行了初始化(用于定义solt范围)



本文出自 “wtc” 博客,请务必保留此出处http://wangtianci.blog.51cto.com/11265133/1844424

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
grep是linux下一个重要的文本处理工具之一,全称是 Globel Search Regular Expression and Printing out the line( 全面搜索正则表达式并把行打印出来 ) 是一种强大的文本搜索工具,是一个对行进行操作的搜索工作,它能使用正则表达式搜索文本,并把匹配的行打印出来。 grep家族包括grep、egrep和fgrep。 egrep表示扩展的grep,相比grep支持更多的元字符,"grep -E"相当于egrep。fgrep是fast grep,不支持

OpenLDAP 加密传输 - 2016-09-05 17:09:08

一、自建证书颁发机构 关于证书发布机构的大家,请查看我的博文 《CentOS 6使用openssl搭建根CA》 。 我下面所操作的是根据前面几篇博文配置好的LDAP,在那上面来进行改动。服务端的IP是192.168.2.10,客户端的IP是192.168.2.11。 二、OpenLDAP 服务端设置 假设我们的CA自建证书和服务器证书都创建好了,CA的公钥是cacert.pem,服务端的证书名称是ldap.crt,私钥文件是ldap.key,所有的文件放到/etc/openldap/certs。 注意 ,
区别: 1. 两个文件都是设置环境变量文件的,/etc/profile是永久性的环境变量,是全局变量,/etc/profile.d/设置所有用户生效 2. /etc/profile.d/比/etc/profile好维护,不想要什么变量直接删除/etc/profile.d/下对应的shell脚本即可,不用像/etc/profile需要改动此文件 用法: CentOS 中每个用户都要指定各自的环境变量,其中包括可执行的 path路径,这些路径决定了每个用户在执行时的命令工具。 一般情况下,可以再每个用户的环境
原因: 有些情况下服务器系统不是自己装的,raid也不是自己配置的,或者当你接收一个岗位,远程登录系统后可能就不知道系统是否有做raid,raid级别?因此在这里博主总结一下Linux下查看软、硬raid信息的方法,分享一下。 软件raid:( 只能通过Linux系统本身来查看) 1)查看阵列状态: cat /proc/mdstat [root@ test ~] #cat/proc/mdstat 1 2 3 4 Personalities:[raid6][raid5][raid4] md0:activer
环境准备:( Nginx,tomcat 的安装部署本例不赘述。) 192.168.1.13 nginx 192.168.1.225 tomcat7 , terracotta 192.168.1.226 tomcat7 部署 terracotta+tomcat 集群: 一:安装 java 程序至系统,配置 java 环境。 #vi/etc/profileexportJAVA_HOME=/usr/local/javaexportPATH=/usr/local/java/bin:$PATH 二:部署单 terr
一、企业网络安全管理面临的新问题 现在计算机和移动智能设备越来越普及,有一些企业网用户不再满足于只让实名登记的、有实际办公用途的计算机上网,他们把家中的笔记本、智能手机、平板电脑带到单位,通过非法架设SOHO路由器、随身WIFI、安装免费WIFI软件等,绕过网络管理员的检测,实现非法接入企业网,然后就可以通过他们自己的设备实现一些移动平台的网络应用。这些SOHO路由器、随身WIFI的一个大卖点:“就是可以绕过检测,隐匿接入”,因为这些设备都可以关闭信号的广播发送,通过信号检测的方法也搜不到。 非法接入问题
什么是逻辑卷? LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。 LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,
========================================================== 一:MySQL主从复制规划 主库:(MySQLmaster)IP:10.0.0.52PROT:3306从库1:(MySQLslave)IP:10.0.0.52PORT:3307从库2:(MySQLslave)IP:10.0.0.52PORT:3308 ========================================================== 二:检查环境 (1)检

openstack-M版安装部署 - 2016-08-29 22:08:06

[openstack 信息简介 ] Openstack 项目是一个开源的云计算平台,它为广大云平台提供了可大规模扩展的平台,全世界的云计算技术人员创造了这个项目,通过一组相互关联的服务来提供了 Iaas 基础解决方案,每一个服务都通过提供自身的 API 来提供服务,个人或者企业完全可以根据自身的需求来安装一部分或者全部的服务。 通过下面一张表格来描述一下当前 openstack 的各个组件及功能。 Service Project name Description Dashboard Horizon 通过提
一、前言 Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据库,有不少自己独特的功能,例如提供wiki、新闻台等,还可以集成其他版本管理系统和BUG跟踪系统,例如 Perforce 、SVN、CVS、TD等等。这种 Web 形式的项目管理系统通过“项目(Project)”的形式把成员、任务(问题)、文档、讨论以及各种形式的资源组织在一起,大家参与更新任务、文档等内容来推动项目的进度,同时系统利用时间线