搭建Codis

最近在通过搭建codis环境熟悉Linux命令的使用,虽然首次接触集群,搭建起来比较混乱,但感觉这种学习Linux命令的方式要比看书敲有效率。以下简单介绍下Codis简单环境的搭建。

1、豌豆荚Codis优点

codis-proxy基于GO和C语言,并发处理能力强劲。

后端基于solt概念,支持灵活、对用户透明的扩容和缩容操作,基于一键式auto-rebalance。

基于zookeeper提供了高可用的codis-proxy代理服务。

集群管理工具丰富:不仅有命令行工具集,也支持页面配置,十分方便。

2、Codis组成部分

2.1 codis-proxy:

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

2.2 codis-config

codis-config 是 Codis 的管理工具, 支持包括, 添加/删除 Redis 节点, 添加/删除 Proxy 节点, 发起数据迁移等操作. codis-config 本身还自带了一个 http server, 会启动一个 dashboard, 用户可以直接在浏览器上观察 Codis 集群的运行状态.

2.3 codis-server

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

2.4 zookeeper

codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.

3、codis架构图

codis-fe是集群管理界面,codis-dashboard是集群管理中心,Storage是外部存储(注册中心)例如FileSystem、ETCD、Zookeeper,redis-sentinel是redis类似的高可用机制,支持自动主从切换(HA),codis-proxy是底层codis-server集群代理,codis-group没有对应的组件,是一个虚拟的节点机制,通过槽位映射机制实现proxy与server的映射。

4、搭建简单codis

4.1 准备工作

测试版本

codis3.2
go1.6.2.Linux-amd64
zookeeper-3.4.6
jdk8

各组件安装目录

go:/usr/local/go
codis:/usr/local/codis
jdk:/usr/local/jdk
zk:/usr/local/zookeeper-3.4.6

安装gcc

sudo yum insatll gcc

检查是否安装成功

gcc --version

安装mercurial包

yum install mercurial

检查

hg --version

安装git包

yum install git

4.2 安装go运行环境

下载golang压缩包

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

解压至golang安装目录

tar -zxvf go1.6.2.linux-amd64.tar.gz 
cp -r go /usr/local/

添加go环境变量

vi /etc/profile

在首行加入以下配置,保存退出

(GOROOT就是go的安装目录,codis编译的时候,会根据这个目录来找go。 GOPATH就是codis的根目录,之后下载的时候会直接下载到这个目录。)

export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis
JAVA_HOME=/usr/local/jdk
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$GOROOT/bin:$JAVA_HOME/bin:$GOPATH/bin:$ZOOKEEPER_HOME/bin
export CODIS_HOME=$GOPATH/src/github.com/CodisLabs/codis
export GO15VENDOREXPERIMENT=0

刷新环境变量

source /etc/profile

验证是否安装成功

go version

写个helloword,go来运行,如果运行成功,那么没有问,并且go版本不能太低哈,不然codis编译要失败的。

vim hello.go

*************************
package main
    import "fmt"

    func main(){
        fmt.Printf("hello,world\n")
 }

 ****************************
 go run hello.go 

4.3安装jdk

主要是zk要使用

下载jdk1.8压缩包,本人下载的是jdk-8u131-linux-x64.tar.gz

解压至/usr/local/jdk目录,按照上述配置文件修改,使配置文件生效,检验是否安装成功。

java -version

4.4安装配置zk单机 zk地址:127.0.0.1:2181

下载至 /data/packages/

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

移动

cp /data/packages/zookeeper-3.4.6.tar.gz /usr/local/ 

解压

tar -zxvf zookeeper-3.4.6.tar.gz 

删除

rm -rf zookeeper-3.4.6.tar.gz 

修改配置文件中dataDir、dataLogDir等,可以是任意目录

cd /usr/local/zookeeper-3.4.6/conf 
cp zoo_sample.cfg zoo.cfg 
vim zoo.cfg 

这里是单机zk,就不修改配置文件了。

dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了)。创建dataDir目录,并在该目录下新建一个myid,写入1

cd /tmp/zookeeper
vim myid

启动zk

cd bin
./zkServer.sh start 

打开zk客户端,进入zk安装目录:

bin/zkCli.sh -server 127.0.0.1:2181
ls /jodis/codis-demo    查看zk中的proxy
get /jodis/codis-demo/proxy-a9f4e21313e8594eb512e5765033ca07  查看某一proxy的信息
*************************
proxy信息示例:
{
    "addr": "192.168.52.132:19001",
    "admin": "192.168.52.132:11081",
    "start": "2017-07-03 17:54:01.404156989 +0800 CST",
    "state": "online",
    "token": "a9f4e21313e8594eb512e5765033ca07"
}
cZxid = 0x282a
ctime = Tue Jul 04 14:28:20 CST 2017
mZxid = 0x282a
mtime = Tue Jul 04 14:28:20 CST 2017
pZxid = 0x282a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15cfd7822e20008
dataLength = 203
numChildren = 0

值得注意的是,要想在zk中查询到proxy的信息,需要在coids目录下的config文件夹中的proxy.toml配置文件中加入以下配置:

##################################################
#                                                #
#                  Codis-Proxy                   #
#                                                #
##################################################
# Set Codis Product Name/Auth.
product_name = "codis-demo"
product_auth = ""

# Set bind address for admin(rpc), tcp only.
admin_addr = "192.168.52.132:11080"

# Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
proto_type = "tcp4"
proxy_addr = "192.168.52.132:19000"

# Set jodis address & session timeout, only accept "zookeeper" & "etcd".
jodis_name = "zookeeper"    #  添加zookeeper名称
jodis_addr = "127.0.0.1:2181"    # zookeeper地址
jodis_timeout = "20s"
jodis_compatible = false
...

4.5 下载codis源代码并编译

mkdir -p $GOPATH/src/github.com/CodisLabs

注意的是,目录结构一定要是GOPATH自己的定义,但后面的目录需要新建,必须和官网一样,不一样,要报错。

mkdir -p  /usr/local/codis/src/github.com/CodisLabs 

下载codis源码 ,make命令编译

git clone https://github.com/CodisLabs/codis.git -b release3.2
make

如果报错:autoconf not found

yum install autoconf

编译成功后,codis会自动创建一些组件,如上图。

4.6 codis快速启动

源码中提供了admin文件夹,含有四个可执行脚本 便于快速启动

./codis-dashboard-admin.sh start
./codis-proxy-admin.sh start
./codis-server-admin.sh start
./codis-fe-admin.sh start

全部启动成功后即可通过web浏览器访问集群管理页面(http://127.0.0.1:9090)选择 codis-demo,在 Proxy 栏可看到已经启动的 Proxy,然后在页面上添加 NEW GROUP,NEW GROUP 行输入 1,再点击 NEW GROUP 即可添加 Codis Server。同样,可以通过Add Server按钮把codis-server注册到codis-dashboard,默认地址是127.0.0.1:6379,然后点击“rebalance all slots”自动给分组分配槽位。

至此,单机的codis搭建完毕,可以通过redis客户端连接指定的proxy。(但是这样并没有搭建一个集群,因为只有单一的proxy,单一的server,没有多个分组,没有使用zookeeper,没有实现高可用等,后面的知识还没研究透,本文后续再补充。)

4.7 codis组件启动

首先进入zookeeper安装目录bin文件夹下,检查zookeeper是否启动:

./zkServer.sh status
*******************
./zkServer.sh start  启动 (上面有指定地址的启动示例)

然后进入codis安装目录/config目录下

vim dashboard.toml

将admin_addr 修改为 本机ip地址 :192.168.52.132:18080

使用命令启动dashboard

nohup ./bin/codis-dashboard --ncpu=4 --config=./config/dashboard.toml --log=./log/dashboard.log --log-level=WARN &

查看日志文件,dashboard是否已成功启动。

启动proxy

首先修改配置文件,改为本机ip地址(若是多个代理,修改每个文件的端口号)

# Set bind address for admin(rpc), tcp only.
admin_addr = "192.168.52.132:11080"

# Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
proto_type = "tcp4"
proxy_addr = "192.168.52.132:19000"

使用nohub命令启动:

nohup ./bin/codis-proxy --ncpu=4 --config=./config/proxy.toml --log=./log/proxy.log --log-level=WARN &

以上操作启动了codis-proxy,但是它还是游离的,没有加入codis-dashboard管理,也没有与任何codis-server建立联系,可以通过下面的方法加入codas-dashboard(codis-proxy是通过codis-dashboard来获取codis-server相关的信息,大致是客户端向proxy发起请求,proxy通过slotId=crc32(key)%1024来获取槽位,从而知道groupId,确定分组之后就知道需要连接的master server):

./bin/codis-admin --dashboard=192.168.52.132:18080 --create-proxy -x 192.168.52.132:11080  

启动server

codis3.1在config文件夹下没有redis.conf配置文件,我从3.2的版本中复制了一份。

修改redis.conf配置文件:

vim ./config/redis.conf

bind 192.168.52.132

启动server服务

./bin/codis-server ./config/redis.conf

以上为启动默认的127.0.0.1:6379的redis实例的方法。

单机redis启动多实例的方法如下:

redis安装目录下操作:

进入src目录,将redis-server和上一级目录下的redis.conf文件一起复制到/usr/local/redis文件夹下,

cd /usr/local/redis
cp redis.conf redis_6380.conf
cp redis.conf redis_6381.conf

然后修改每个配置文件,主要修改端口及文件命名:

6379配置文件 redis.conf:

bind 192.168.52.132   # 单机redis的话地址不用改
port 6379  #  分别改为  6380 端口和  6381端口
pidfile /var/run/redis/redis_6379.pid
logfile "/var/log/redis/redis_6379.log"
dbfilename dump_6379.rdb
# slaveof <masterip> <masterport>

6380配置文件redis_6380.conf:

bind 192.168.52.132   # 单机redis的话地址不用改
port 6380  
pidfile /var/run/redis/redis_6380.pid
logfile "/var/log/redis/redis_6380.log"
dbfilename dump_6380.rdb

6381端口实例配置文件 redis_6381.conf:

bind 192.168.52.132   # 单机redis的话地址不用改
port 6381  
pidfile /var/run/redis/redis_6381.pid
logfile "/var/log/redis/redis_6381.log"
dbfilename dump_6381.rdb

若要配置从redis 的话修改配置文件中的slaveof,加入主redis的地址和端口:

slaveof 127.0.0.1 6379

配置文件修改完毕后就可以启动三个端口的redis服务了(若提示权限不够时可以在前面加上sudo):

[sudo] ./redis-server redis.conf
[sudo] ./redis-server redis_6380.conf
[sudo] ./redis-server redis_6381.conf

启动三个服务后可以通过客户端连接进行测试:

# 进入redis安装目录下
cd src
./redis-cli -h 192.168.52.132 -p 6379
./redis-cli -h 192.168.52.132 -p 6380
./redis-cli -h 192.168.52.132 -p 6381

至此,redis多实例成功启动

也可以通过grep命令查看redis启动情况:

ps -ef|grep redis

创建group

./bin/codis-admin --dashboard=192.168.52.132:18080 --create-group --gid=1         
#新建group 1  相当于fe页面“NEW GROUP”按钮  
./bin/codis-admin --dashboard=192.168.52.132:18080 --group-add     --gid=1   --addr=127.0.0.1:6379   
#把server192.168.52.132:6379加入集群
./bin/codis-admin --dashboard=192.168.52.132:18080 --group-add     --gid=1   --addr=127.0.0.1:6380
...

group槽位自动分配

./bin/codis-admin  --dashboard=192.168.52.132:18080 --rebalance --confirm  
# 相当于fe页面“Rebalance All Slots”按钮  
# 也可以定制化的分配槽位
./bin/codis-admin  --dashboard=192.168.52.132:18080 --slot-action --create-range --beg=0 --end=300   --gid=1  

JODIS连接集群

要实现虚拟机之间的通信,需要关闭防火墙:

# 查看防火墙状态
firewall-cmd --state
# 关闭防火墙
systemctl stop firewalld.service

在windows系统中使用idea开发环境连接codis

新建一个maven项目,在pom.xml文件中加入如下依赖:

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.wandoulabs.jodis</groupId>
            <artifactId>jodis</artifactId>
            <version>0.2.2</version>
        </dependency>

新建java类文件执行连接程序,展示代码:

package codis;

import redis.clients.jedis.Jedis;
import com.wandoulabs.jodis.JedisResourcePool;
import com.wandoulabs.jodis.RoundRobinJedisPool;

public class connectCodis {
    public static void main(String args[]){
        System.out.println("hello world!");
        JedisResourcePool jedisPool = RoundRobinJedisPool.create()   
                .curatorClient("192.168.52.132:2181", 30000).zkProxyDir("/jodis/codis-demo").build();
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.set("aaaa", "bbbb");
            String value = jedis.get("aaaa");
            System.out.println(value);
        }catch (Exception e){
            System.out.println("exception: " + e.getMessage());
        }
    }
}

执行以上程序,若出现如下异常:

Exception in thread "main" redis.clients.jedis.exceptions.JedisException: Proxy list empty
at com.wandoulabs.jodis.RoundRobinJedisPool.getResource(RoundRobinJedisPool.java:286)
    at codis.connectCodis.main(connectCodis.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

则说明在proxy.toml配置文件中zookeeper的配置有问题,注意将所有proxy的配置文件的一下字段填写正确:

jodis_name = "zookeeper"    #  添加zookeeper名称
jodis_addr = "127.0.0.1:2181"    # zookeeper地址
jodis_timeout = "20s"
jodis_compatible = false

重新运行,即可连接成功。

hello world!
bbbb

Process finished with exit code 0

附(redis的一些用法):

redis启动方式

下载

官网下载:http://Redis.io/download

安装

tar zxvf redis-2.8.9.tar.gz

cd redis-2.8.9

直接make 编译

make

可使用root用户执行make install,将可执行文件拷贝到/usr/local/bin目录下。这样就可以直接敲名字运行程序了。

make install

启动

加上&号使redis以后台程序方式运行

./redis-server &

检测

检测后台进程是否存在

ps -ef |grep redis

检测6379端口是否在监听

netstat -lntp | grep 6379

使用redis-cli客户端检测连接是否正常

./redis-cli

./redis-cli -p 6379

如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis

./redis-server stop

./redis-server start

./redis-server restart

停止使用客户端

./redis-cli shutdown

因为Redis可以妥善处理SIGTERM信号,所以直接kill -9也是可以的

./redis-cli shutdown 注释:这里关闭默认端口号
./redis-cli -h 127.0.0.1 -p 7001 shutdown 注释:关闭指定端口号
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值