文档章节

Codis-3.x版本安装部署

韩氏集团
 韩氏集团
发布于 2017/02/14 13:28
字数 6330
阅读 288
收藏 0

3.0.3,3.1.4,3.1.5以及3.2版本统一安装搭建

.基本信息

三台机器:192.168.33.6               192.168.33.19                192.168.33.7
                       zk1                                    zk2                              zk3
            codis-dashboard
            codis-fe codis-ha
            codis-proxy1                         codis-proxy2                   codis-proxy3   
           codis_group1_M(6379)       codis_group2_M(6379)    codis_group3_M(6379)
           codis_group3_S(6380)        codis_group1_S(6380)      codis_group2_S(6380)

参考文档: https://github.com/CodisLabs/codis/blob/release3.0/doc/tutorial_zh.md (此官方文档安装前必须看)  。      
codis版本:3.0.3 版本   https://github.com/CodisLabs/codis/archive/3.0.3.zip
go使用版本:go1.6.linux-amd64.tar.gz     http://www.golangtc.com/download/

 jdk版本:jdk1.7.0_71   
zookeeper版本:zookeeper-3.4.8.tar.gz

Codis3.x 由以下组件组成:

Codis Server:基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令,具体的修改可以参考文档 redis的修改。 

Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。除部分命令不支持以外,表现的和原生的 Redis 没有区别(就像 Twemproxy)。 对于同一个业务集群而言,可以同时部署多个codis-proxy实例,不同 codis-proxy 之间由 codis-dashboard 保证状态同步。

Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除以及数据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态一致性。 对于同一个集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个,所有对集群的修改都必须通过 codis-dashboard 完成。

Codis Admin:集群管理的命令行工具,可用于控制codis-proxy、codis-dashboard状态以及访问外部存储。

Codis FE:集群管理界面。多个集群可以共享同一个前端展示页面,通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。

Codis HA:为集群提供高可用,依赖 codis-dashboard 实例,自动抓取集群各个组件的状态,会根据当前集群状态自动生成主从切换策略,并在需要时通过 codis-dashboard 完成主从切换。

Storage:为集群状态提供外部存储,提供Namespace概念,不同集群会按照不同product name进行组织;目前仅提供了Zookeeper 和Etcd两种实现,但是提供了抽象的interface可自行扩展。

相关组件安装配置            
#vim   /etc/sysctl.conf
vm.overcommit_memory = 1

手工执行:echo  never > /sys/kernel/mm/transparent_hugepage/enabled 并加到/etc/rc.local中。

注意: 公司的redis有时background save db不成功,通过log发现下面的警告,很可能由它引起的:

[13223] 17 Mar 13:18:02.207 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

内核参数overcommit_memory 

它是内存分配策略,可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否            则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存。

什么是Overcommit和OOM

       Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存,这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
        当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000),点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。

解决方法:

将vm.overcommit_memory 设为1即可,有三种方式修改内核参数,但要有root权限:

 (1)编辑/etc/sysctl.conf ,加入vm.overcommit_memory = 1,然后sysctl -p使配置文件生效

 (2)sysctl  vm.overcommit_memory = 1

 (3)echo 1 > /proc/sys/vm/overcommit_memory

二、环境准备

codis集群的搭建,需要zookeeper集群,可以参考zookeeper集群部署搭建。除了zookeeper集群之外,还需要安装go语言环境,因为codis是基于go语言开发的。

2.1 安装基础依赖
#yum   -y  install  gcc  make  gcc-c++  automake  lrzsz  openssl-devel  zlib-*  bzip2-*  readline* zlib-*  bzip2-*  git
#yum  -y  install  nmap  unzip  wget  lsof  xz   net-tools   mercurial

2.2 go语言环境搭建

下载go语言包,由于国内的网站对于一些网址是禁用的,所以还是要自行去网站下载,网址:http://www.golangtc.com/download/,下载完毕后解压到/usr/local如下:

#tar  -C  /usr/local -xf  go1.6.linux-amd64.tar.gz

把go加入到系统的环境变量如下:

#vim  /etc/profile

export   PATH=$PATH:/usr/local/go/bin

export   GOPATH=/usr/local/go

让刚刚加入的环境变量生效,并查看go是否配置成功,如下:

#source   /etc/profile

#go   version

3.  安装codis

在/usr/local/go/src/下创建codis的编译安装目录github.com/CodisLabs,并将下载的codis包解压到这个目录下。

#mkdir  -pv   /usr/local/go/src/github.com/CodisLabs/

#tar  -C   /usr/local/go/src/github.com/CodisLabs/     -xf    /usr/local/src/codis-3.1.tar.gz

#cd    /usr/local/go/src/github.com/CodisLabs/

#mv  codis-3.1   codis

#cd   codis

#make

编译成功后在codis下面的bin目录下会有assets  codis-admin  codis-dashboard  codis-fe  codis-ha  codis-proxy  codis-server   redis-benchmark  redis-cli  version等文件,assets是codis-dashboard http服务需要的前端资源,需要和codis-dashboard放置在同一目录下。

4.1 编辑redis配置文件

每台codis服务器上,要启动两个redis实例(也可以启动多个redis实例),先配置两个实例,从redis实例的配置文件中找到下列参数选项并按如下进行修改:

创建几个数据目录

#mkdir   /usr/local/codis

#mkdir  /var/log/redis

#vim  /usr/local/go/src/github.com/CodisLabs/codis/extern/redis-test/conf /6379.conf

daemonize  yes

pidfile  /var/run/redis6379.pid

port  6379

logfile  /var/log/redis/6379.log

dbfilename  dump6379.rdb

dir  /usr/local/codis/

配置第二个redis实例6380.conf同上设置。

每台codis服务器上redis配置完毕后,启动redis实例,如下:

#cd   /usr/local/go/src/github.com/CodisLabs/codis/bin

#./codis-server    ../extern/redis-test/conf/6379.conf   &

#./codis-server    ../extern/redis-test/conf/6380.conf   &

#ps  -ef |grep  codis-server

4.2      Codis Dashboard

Coddis3.0的dashboard与codis 2.0有所不同,作为集群管理工具,它支持codis-proxy,codis-server的添加、删除以及数据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态一致性。有以下两点注意事项:

l  对于同一个业务集群而言,同一个时刻codis-dashboard只能有0个或者1个;

l  所有对集群的修改都必须通过codis-dashboard完成。

4.2.1      配置dashboard

默认配置文件dashboard.toml可由codis-dashboard生成。

#bin/codis-dashboard  --default-config | tee  dashboard.toml(就是dashboard.conf)

 生成dashboard.toml文件,可自行配置。

# Set Coordinator, only accept"zookeeper"&"etcd"

coordinator_name = "zookeeper"

coordinator_addr = "192.168.33.6:2181"        #zookeeper是集群的话就写多个ip和端口用逗号隔开

# Set Codis Product {Name/Auth}

product_name = "codis-demo"

product_auth = ""

# Set bind address for admin(rpc), tcp only.

admin_addr = "0.0.0.0:18080"

coordinator_name              外部存储类型,接受 zookeeper/etcd

coordinator_addr                外部存储地址

product_name                    集群名称,满足正则 \w[\w\.\-]*

product_auth                      集群密码,默认为空

admin_addr                        RESTful API 端口

4.2.2      启动dashboard

#nohup   bin/codis-dashboard   --ncpu=4    --config=dashboard.toml(这里指定dashboard.conf也可以)   --log=dashboard.log      --log-level=WARN  &

#bin/codis-dashboard   -h

Usage:

codis-dashboard [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR]

codis-dashboard  --default-config

codis-dashboard  --version

说明:

 --ncpu=N                               最大使用 CPU 个数

 -c  CONF, --config=CONF      指定启动配置文件

 -l   FILE, --log=FILE                 设置 log 输出文件

--log-level=LEVEL             设置log输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

正常关闭dashboard命令:     bin/codis-admin   --dashboard=192.168.33.6:18080   --shutdown

4.3      Codis Proxy

l  对于同一个业务集群而言,可以同时部署多个codis-proxy 实例;

l  不同 codis-proxy 之间由 codis-dashboard 保证状态同步。

4.3.1      配置proxy

默认配置文件 proxy.toml 可由 codis-proxy 生成。

#bin/codis-proxy   --default-config | tee  proxy.toml(proxy.conf)

生成proxy.toml可自行配置。

# Set Codis Product {Name/Auth}.

product_name = "codis-demo"

product_auth = ""

# Set bind address for admin(rpc), tcp only.

admin_addr = "0.0.0.0:11080"

# Set bind address for proxy, proto_type can be "tcp","tcp4", "tcp6", "unix" or "unixpacket".

proto_type = "tcp4"

proxy_addr = "0.0.0.0:19000"

 # Set jodis address & session timeout.

jodis_addr = ""

jodis_timeout = 10

# Proxy will ping-pong backend redis periodly to keep-alive

backend_ping_period = 5

# If there is no request from client for a long time, the connectionwill be droped. Set 0 to disable.

session_max_timeout = 1800

# Buffer size for each client connection.

session_max_bufsize = 131072

# Number of buffered requests for each client connection.

# Make sure this is higher than the max number of requests for eachpipeline request, or your client may be blocked.

session_max_pipeline = 1024

# Set period between keep alives. Set 0 to disable.

session_keepalive_period = 60

product_name                                 集群名称,参考dashboard参数说明

product_auth                                   集群密码,默认为空

admin_addr                                     RESTfulAPI 端口

proto_type                                       Redis 端口类型,接受tcp/tcp4/tcp6/unix/unixpacket

proxy_addr                                      Redis 端口地址或者路径

jodis_addr                                       Jodis注册zookeeper地址

jodis_timeout                                  Jodis注册sessiontimeout时间,单位second

jodis_compatible                             Jodis注册 zookeeper 的路径

backend_ping_period                     与codis-server 探活周期,单位second,0表示禁止

session_max_timeout                     与client 连接最大读超时,单位second,0表示禁止

session_max_bufsize                      与client 连接读写缓冲区大小,单位byte

session_max_pipeline                     与client 连接最大的pipeline大小

session_keepalive_period               与client 的 tcp keepalive周期,仅tcp有效,0表示禁止

4.3.2      启动proxy

#nohup   bin/codis-proxy   --ncpu=4   --config=proxy.toml \

--log=proxy.log   --log-level=WARN  &

codis-proxy启动后,处于 waiting 状态,监听proxy_addr 地址,但是不会accept连接。添加到集群并完成集群状态的同步,才能改变状态为online。添加的方法有以下两种:

l 通过codis-fe添加:通过Add Proxy按钮,将admin_addr加入到集群中;

l 通过codis-admin命令行工具添加,方法如下:

#bin/codis-admin  --dashboard=192.168.33.6:18080   --create-proxy   -x   192.168.33.6:11080

其中192.168.33.6:18080 以及192.168.33.6:11080 分别为dashboard和proxy的admin_addr 地址。

添加过程中,dashboard会完成如下一系列动作:

① 获取 proxy 信息,对集群name以及auth进行验证,并将其信息写入到外部存储中;

② 同步slots状态;

③ 标记proxy状态为online,此后proxy开始accept连接并开始提供服务。

#./codis-admin  --proxy=192.168.33.6:11080  --auth="xxxxx"(有就加,没有就不加)   --shutdown

#bin/codis-proxy   -h

Usage:

codis-proxy [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR]

[--host-proxy=ADDR] [--ulimit=NLIMIT]

codis-proxy   --default-config

codis-proxy   --version

 Options:

    --ncpu=N                              最大使用 CPU 个数

    -c CONF, --config=CONF      指定启动配置文件

    -l FILE, --log=FILE                 设置 log 输出文件

    --log-level=LEVEL         设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

    --ulimit=NLIMIT            检查ulimit -n的结果,确保运行时最大文件描述不少于NLIMIT

4.4      Codis FE

4.4.1      集群管理界面

l 多个集群实例可以共享同一个前端展示页面;

l 通过配置文件管理后端codis-dashboard列表,配置文件可自动更新。

4.4.2      配置codis-fe

配置文件codis.json(fe.conf)可以手动编辑,也可以通过codis-admin从外部存储中拉取。

#bin/codis-admin   --dashboard-list   --zookeeper=192.168.33.6:2181 | tee   codis.json

[

    {

"name": "codis-demo",

"dashboard": "127.0.0.1:18080"

    }

]

4.4.3  启动codis-fe

#nohup    bin/codis-fe   --ncpu=4   --log=fe.log   --log-level=WARN \

--dashboard-list=codis.json   --listen=0.0.0.0:18090   &       #(这里指定端口号为18090是为了防止和codis-dashboard的端口号18080冲突)

#bin/codis-fe  -h

Usage:

    codis-fe [--ncpu=N][--log=FILE] [--log-level=LEVEL] --dashboard-list=LIST --listen=ADDR

    codis-fe  --version

Options:

--ncpu=N                                  最大使用 CPU 个数

-d LIST,--dashboard-list=LIST   配置文件,能够自动刷新

-l FILE, --log=FILE                     设置 log 输出文件

--log-level=LEVEL        设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

--listen=ADDR                         HTTP 服务端口

打开浏览器,在地址栏里输入http://192.168.33.6:18090,通过管理界面操作Codis。

1、创建组:

输入编号1,点击New Group,第一组创建完成。

2、添加实例

在后面输入组的id号,然后在后面框内输入redis实例所在机器的ip地址和redis实例的端口号,点击Add Server即可添加完成,再添加第二个实例完成后G-1那一列会有向上的箭头,点击后可升为master,点击第二个redis实例中master那一列的 图标即可将此实例设置为slave, 此图标可以将对应的实例从该组中删除,如下两图:

3、对slots进行分组

如下图所示,输入所要分组的slots的起和止的范围,然后输入组ID,点击后面按钮即可。

4、添加管理proxy

如下图所示,在框内输入proxy所对应的ip地址和端口号点击Add proxy即可。

5、数据迁移,写好需要迁移数据的起和止的范围以及组ID,点击后面按钮即可数据迁移;当点击Action Disabled 的Disable Migration后,出现Enable Migration,并勾选Show Actions后,后面显示迁移状态,以及所迁移的slots会显示在 slots图上,如下图:

除了图形界面进行如上操作外,还可以通过命令进行操作。

创建组:

#bin/codis-admin   --dashboard=192.168.33.6:18080   --create-group    --gid=1
#bin/codis-admin   --dashboard=192.168.33.6:18080   --create-group    --gid=2

组添加服务器:

#bin/codis-admin  --dashboard=192.168.33.6:18080  --group-add  --gid=1 \

--addr=192.168.33.6:6379
#bin/codis-admin   --dashboard=192.168.33.6:18080  --group-add  --gid=1  \

--addr=192.168.33.6:6380

把从库跟主库同步(同一组的两个实例都要执行):
#bin/codis-admin  --dashboard=192.168.33.6:18080   --sync-action  --create \

 --addr=192.168.33.6:6379

#bin/codis-admin  --dashboard=192.168.33.6:18080   --sync-action  --create  \

--addr=192.168.33.6:6380

若从库需要提升为master,操作如下:
#bin/codis-admin  --dashboard=192.168.33.6:18080   --promote-server  --gid=1   \

--addr=192.168.33.6:6380(从库ip和端口)

初始化 slots并设置 server group服务的slot范围((只在一节点执行一次)sid是slot的编号。Codis采用Pre-sharding技术来实现数据的分片, 默认分成1024个slots (0-1023), 对于每个key来说,通过以下公式确定所属的Slot Id : SlotId = crc32(key) % 1024每一个slot都会有一个且必须有一个特定的server group id来表示这个slot的数据由哪个server group来提供。

#bin/codis-admin   --dashboard=192.168.33.6:18080   --slot-action   --create-range   --beg=0  \

 --end=300   --gid=1
#bin/codis-admin   --dashboard=192.168.33.6:18080   --slot-action   --create-range   --beg=301  \

--end=601   --gid=2

4.5      Codis HA(可选组件,codis新版本已经将其删除,转而用sentinel替代)

注意:Codis HA工具仅仅是Codis 集群HA 的一部分,单独工作能力有限。

l 默认以 5s为周期,codis-ha会从codis-dashboard中拉取集群状态,并进行主从切换;

l codis-ha 在以下状态下会退出:

i.从 codis-dashboard 获取集群状态失败时;

ii.向codis-dashboard发送主从切换指令失败时。

l codis-ha在以下状态下不会进行主从切换:

i.存在proxy状态异常:因为提升主从需要得到所有proxy的确认,因此必须确保操作时所有proxy都能正常响应操作指令;

ii.网络原因造成的master异常:若存在slave满足slave.master_link_status == up,通常可以认为master并没有真的退出,而是由于网络原因或者响应延迟造成的master状态获取失败,此时codis-ha不会对该group进行操作;

n没有满足条件的slave时。提升过程会选择满足slave.master_link_status == down,并且slave.master_link_down_since_seconds最小的进行操作。这就要求被选择的slave至少在过去一段时间内与master是成功同步状态,这个时间间隔是2d+5,其中d是codis-ha检查周期默认5秒。

注意:应用codis-ha时还需要结合对codis-proxy和codis-server的可用性监控,否则codis-ha无法保证可靠性。

需要注意:codis-ha将其中一个slave升级为master时,该组内其他slave是不会自动改变状态的,这些slave仍将试图从旧的master上同步数据,因而会导致组内新的master和其他slave之间的数据不一致。因为redis的slaveof命令切换master时会丢弃slave上的全部数据,从新master完整同步,会消耗资源。因此,当出现主从切换时,需要管理员手动创建新的sync action来完成新master与slave之间的数据同步。

4.5.1   启动codis-ha

#nohup   bin/codis-ha   --log=ha.log  --log-level=WARN   --dashboard=192.168.33.6:18080  &

4.5.2  参数说明

#bin/codis-ha   -h

Usage:

    codis-ha [--log=FILE][--log-level=LEVEL] --dashboard=ADDR

    codis-ha  --version

 Options:

-l FILE, --log=FILE          设置 log 输出文件

--log-level=LEVEL          设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

4.6      Codis Admin(命令行工具)

注意:使用 codis-admin 是十分危险的

4.6.1 codis-dashboard异常退出的修复

当codis-dashboard启动时,会在外部存储上存放一条数据,用于存储dashboard信息,同时作为LOCK 存在。当codis-dashboard安全退出时,会主动删除该数据。当codis-dashboard异常退出时,由于之前 LOCK 未安全删除,重启往往会失败。因此codis-admin提供了强制删除工具:

1.确认codis-dashboard进程已经退出(很重要);

2.运行codis-admin删除LOCK:

#bin/codis-admin   --remove-lock   --product=codis-demo   --zookeeper=192.168.33.6:2181

通常codis-proxy都是通过codis-dashboard进行移除,移除过程中codis-dashboard为了安全会向 codis-proxy 发送 offline 指令,成功后才会将proxy信息从外部存储中移除。如果codis-proxy异常退出,该操作会失败。此时可以使用codis-admin工具进行移除:

1.确认 codis-proxy 进程已经退出(很重要);

2.运行 codis-admin 删除 proxy:

先查看proxy状态:
#bin/codis-admin   --dashboard=192.168.33.6:18080   --proxy-status

#bin/codis-admin   --dashboard=192.168.33.6:18080   --remove-proxy  \

--token=6a2db3c9ac07ba8857d4bc79ca6d191c   --force

选项--force 表示,无论offline操作是否成功,都从外部存储中将该节点删除。所以操作前,一定要确认该 codis-proxy 进程已经退出。

proxy正常关闭:
 codis-admin [-v] --proxy=ADDR [--auth=AUTH]  --shutdown
#bin/codis-admin   --proxy=192.168.33.6:11080   --shutdown

#bin/codis-admin   --proxy=192.168.33.6:11080   --auth="xxxxx"   --shutdown

若proxy id在FE上搞乱了,可以找时间从FE上移除所有proxy,然后全部按顺序启动,就会产生正常顺序的proxy id。

Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]

 -h <hostname>      Server hostname (default 127.0.0.1)           --主机ip地址

 -p <port>          Server port (default 6379)                                --端口

 -s <socket>        Server socket (overrides host and port)          --如果测试在服务器上可以用socket方式

 -a <password>      Password for Redis Auth                              --redis的认证密码

 -c <clients>       Number of parallel connections (default 50)   --客户端连接数

 -n <requests>      Total number of requests (default 100000)  --总请求数

 -d <size>          Data size of SET/GET value in bytes (default 2) --set、get的value大小

 -dbnum <db>        SELECT the specified db number (default 0) --选择哪个数据库测试(一般0-15)

 -k <boolean>       1=keep alive 0=reconnect (default 1)            --是否采用keep alive模式

 -r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD --随机产生键值时的随机数范围

 -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline). --pipeline的个数(如果使用pipeline会把多个命令封装在一起提高效率)

 -q                 Quiet. Just show query/sec values                                                   --仅仅查看每秒的查询数

 --csv              Output in CSV format                                                                     --用csv方式输出

 -l                 Loop. Run the tests forever                                                               --循环次数

 -t <tests>         Only run the comma separated list of tests. The test                 --指定命令

                    names are the same as the ones produced as output.

 -I                 Idle mode. Just open N idle connections and wait.                          --仅打开n个空闲链接

Examples:

 Run the benchmark with the default configuration against 127.0.0.1:6379:

   $redis-benchmark

 Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1:

   $redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20 --测试set、get、mset、sadd等场景下的性能

 Fill 127.0.0.1:6379 with about 1 million keys only using the SET test:

   $redis-benchmark -t set -n 1000000 -r 100000000                     --测试set随机数的性能

 Benchmark 127.0.0.1:6379 for a few commands producing CSV output:

   $redis-benchmark -t ping,set,get -n 100000 --csv                    --使用csv的输出方式测试

 Benchmark a specific command line:

   $ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0       --测试基本命令的速度

 Fill a list with 10000 random elements:

   $ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__                 --测试list入队的速度

zk的查看操作

slot:
ls   /codis3/codis_test/slots

或者连接redis的实例执行slotshashkey ($key)可以查看此键值在哪个slot上。

proxy:

ls   /codis3/codis_test/proxy
get   /codis3/codis_test/proxy/proxy-ca78ed6ba0d07b86e7f0c1e346f79cba

server:
ls  /codis3/codis_test/group/group-0001

查询zk中的proxy状态:
[zk: 127.0.0.1:2181(CONNECTED) 4] ls  /zk/codis/db_hls_prod/proxy
[815867a35f921bcc3abb02109cca1f75, 6dd30d40f676564495d56ab16211e039]
[zk: 127.0.0.1:2181(CONNECTED) 5] get  /zk/codis/db_hls_prod/proxy/9f04676d4e82b2ba7e8f8c3a3faeee28
{
      "id": 1,

"token": "9f04676d4e82b2ba7e8f8c3a3faeee28"
     "start_at": "2016-07-01 16:42:39.219656807 +0800 CST",

"admin_addr": "192.168.33.6:11080",

  "proto_type": "tcp4",

  "proxy_addr": "192.168.33.6:19000",

  "product_name": "codis-demo",

  "pid": 2572,

  "pwd": "/usr/local/go/src/github.com/CodisLabs/codis/bin",

  "sys": "Linux linuxcast.net 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux"
}
cZxid = 0x2000c432b
ctime = Fri Jul 01 16:42:42 CST 2016
mZxid = 0x2000c432b
mtime = Fri Jul 01 16:42:42 CST 2016
pZxid = 0x2000c432b
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x2550b2029dbbccd
dataLength = 167
numChildren = 0

要删除的话:rmr /codis3/codis_test

其他参考:

(2)dashboard提供的api接口
http://debugAddr/setloglevel?level=debug
http://debugAddr/debug/vars #主要是获取ops信息还可以设置日志级别,浏览器访问proxy的debug_addr对应地址/debug/vars路径,可以看到每个proxy的qps信息。

(3)codis-proxy的服务日志中产生的信息解释
quit : client主动发的quit指令
EOF : 连接直接断开了,就是proxy从client的tcp读的时候遇到EOF了

codis每次主动关闭client的连接都会打log的,一般来说主要可能有:非法操作、该请求连的底层redis挂了、这个session很久没请求触发了proxy这边的清理逻辑。

session_max_timeout=1800
如果30分钟内没有任何ops 那么codis就主动关闭这个连接。嗯,主要是有人反馈说有时候client主动关了连接,但是proxy这边没收到close的消息,导致proxy最后积累了一大堆连接把资源吃满了。

(4)NaN GB因为redis配置文件中没有设置内存maxmemory参数。

(5)codis中所有的读写操作都是在redis-master上执行的,redis-slave只负责数据的冗余,当master出现down之后可以进行master和slave的切换。

(6)在codis集群中product是用来区分是否为同一个集群的。所以如果是同一个集群,那么dashboard和codis-proxy中的product要设置的一样,否则就面临下面这个问题zk: node does not exist。
codis-proxy配置文件中的proxy_id 是用来区分同一个集群下的不同成员,所以这个参数要唯一。

(7)codis-ha只负责在master挂掉的时候自动选择一个slave提升为master,但没有把剩余的slave重新挂在新的master上,而且也没有确保选择的slave是最优的。

(8)Too many open files:在用python多线程对redis进行压力测试的时候,压力超过4000的时候就出现这种问题。2台codis-proxy支持并发2-3w没有太大的问题。

(10)同一个group中可以实现redis数据的主从复制,但是不同的group中无法实现。如果同一个group中所有的master和slave都挂掉了,那么数据就丢失了,但是如果还查询挂掉的group中的key就会提示错误,并且那个key也就会占用啦,所有的写操作codis-proxy就不会发送到挂掉的group上去了。

(11)同一个Group中的codis-server 实例下,多个slave 是否会分担master的读请求?codis的设计理念是更注重一致性,redis的主从同步不是强一致的,因此codis不支持读写分离。

(12)一个集群中只能有一个dashboard服务处于运行状态,可以有多个dashboard但是同时只能有一个服务处于running状态。

Jodis 与 HA

因为 codis-proxy 是无状态的,可以比较容易的搭多个实例,达到高可用性和横向扩展。对Java 用户来说,可以使用基于Jedis的实现 [Jodis](https://github.com/CodisLabs/jodis) ,来实现 proxy层的HA,它会通过监控zookeeper上的注册信息来实时获得当前可用的proxy列表,既可以保证高可用性,也可以通过轮流请求所有的proxy实现负载均衡。如果需要异步请求,可以使用基于Netty开发的 [Nedis](https://github.com/CodisLabs/nedis)。

对下层的 redis 实例来说,当一个 group 的 master 挂掉的时候,应该让管理员清楚,并手动操作,因为这涉及到了数据一致性等问题(redis的主从同步是最终一致性的)。因此codis不会自动的将某个slave 升级成 master。关于外部 codis-ha工具,这是一个通过codis-dashboard开放的RESTful API实现自动切换主从的工具,该工具会在检测到master挂掉的时候主动应用主从切换策略,提升单个slave成为新的master。

需要注意codis 将其中一个slave升级为master时,该组内其他slave实例是不会自动改变状态的,这些slave仍将试图从旧的master上同步数据,因而会导致组内新的master和其他slave之间的数据不一致。因此当出现主从切换时,需要管理员手动创建新的sync action来完成新master与slave之间的数据同(codis-ha 不提供自动操作的工具,因为这样太不安全了)。新版本的codis-3.1.x已经将codis-ha去掉,转而用哨兵替代!

Docker 部署

Codis 3.x 起,开始正式支持Docker部署。这就需要codis-dashboard以及codis-proxy能够外部的 `listen` 地址暴露出来并保存在外部存储中。

+ codis-proxy 增加了 `--host-admin` 以及 `--host-proxy` 参数;

+ codis-dashboard 增加了 `--host-admin` 参数。

以 codis-proxy 的 Docker 为例:

#docker   run  --name  "Codis-Proxy"  -d  -p  29000:19000  -p  21080:11080  codis-image \

codis-proxy  -c  proxy.toml  --host-admin  100.0.1.100:29000  --host-proxy  100.0.1.100:21080

codis-proxy 在启动后,会使用 `--host-admin` 和 `--host-proxy` 参数所指定的实际地址替换Docker内监听的地址,向codis-dashboard注册。例如使用Jodis 的过程中,客户端就能够通过 `100.0.1.100:29000` 来访问 proxy 实例。codis-dashboard 也是相同的道理,会使用`--host-admin`地址向外部存储注册,这样codis-fe也能通过该地址正确的对codis-dashboard进行操作。

欢迎加入 343595434 codis技术交流群,这里有codis作者以及各位技术大牛为你详解最前沿的技术,这里是技术的峰会,我们要让每个人都成为技术霸!

© 著作权归作者所有

韩氏集团
粉丝 0
博文 3
码字总数 9539
作品 0
运维
私信 提问
Codis 3.2 部署配置汇总

Codis 3.2 部署配置汇总 概念总结 集群配置前需要了解架构,集群分片主要分三种: 客户端分片:这个需要自己开发,对客户端要求严格,集群很难扩容 代理端分片:如codis,对客户端几乎无要求...

minminmsn
2017/09/11
0
0
redis codis 安装部署

codis 的整个安装还是比较简单,详细的步骤参考官方说明: https://github.com/CodisLabs/codis/blob/master/doc/tutorialzh.md 依赖环境安装 go + zookeeper 先安装go环境 $ wget https://s...

walle-Liao
2016/05/02
949
1
Centos6.5+Codis3.1集群搭建

codis 3.1 安装搭建 一.基本信息 1.服务器基本信息 本次测试只使用了一台服务器10.20.23.249 2. 环境信息 2.1 codis版本:3.1 版本 git clone https://github.com/CodisLabs/codis.git -b re...

dan0820
2017/03/08
0
0
安装codis 以及遇到的一些问题

redis集群安装用的是codis ,由豌豆荚开源,相比较twemproxy的好处有很多,参考http://blog.csdn.net/hunci/article/details/51799468 不废话,搞起 下面的安装文档抄袭了小炒肉的,连接如下...

wks97
2017/05/16
0
0
Redis 集群解决方案-Codis

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, C...

goroutine
2014/11/09
95.6K
18

没有更多内容

加载失败,请刷新页面

加载更多

【0918】正则介绍_grep

【0918】正则介绍_grep 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 一、正则介绍 正则是一串有规律的字符串,它使用单个字符串来描述或匹配一系列符合某个语法规则的字符串。 二、grep工具 ...

飞翔的竹蜻蜓
14分钟前
4
0
为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
52分钟前
8
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
今天
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
今天
4
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部