Codis高可用部署篇

内容参考:

技术博客:http://blog.csdn.net/wang_sir_90/article/details/51839109

官方说明:https://github.com/CodisLabs/codis/blob/release3.1/doc/tutorial_zh.md

 

操作系统: CentOS 6.5 x86_64

亲测,可用

 

目录

Codis部署安装手册... 1

1.        安装codis. 1

2.        配置codis-dashboard. 5

3.        配置codis-proxy. 6

4.        配置codis-fe集群管理界面... 8

5.        图形界面创建组和solt节点... 9

附录: Codis HA(可选组件)... 12

FAQ:. 13

 

 

 

1. 安装codis

1.1  下载golang安装包

# wget -c -o /opt/packages/go1.6.tar.gz

  http://golangtc.com/static/go/1.6/go1.6.linux-amd64.tar.gz

# cd /opt/packages

# tar -zvxf go1.6.tar.gz -c /usr/local

 

1.2  Zookeeper集群搭建

部署zookeeper(可部署1个,建议部署多台[奇数]提供集群服务,须安装JDK)

# tar zxvf zookeeper-3.4.8.tar.gz -c /home

# mv /home/zookeeper-3.4.8  /home/zookeeper

# cd /home/zookeeper/conf (建议使用3.4.6以上版本)

# vim zoo.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/home/zookeeper/2181

dataLogDir=/home/zookeeper/2181/logs

clientPort=2181

maxClientCnxns=0

server.1=zookeeper-1:2888:3888

server.2=zookeeper-2:2888:3888

server.3=zookeeper-3:2888:3888

 

配置host  注意下面ip是zk的实际IP地址

# vim /ect/hosts

172.3.4.246  zookeeper-1

172.3.4.245  zookeeper-2

172.3.4.242  zookeeper-3

 

# vim /home/zookeeper/2181/myid

在此文件内编辑自己对应的serverID. serverID见上述红色标记的数字

# sh /home/zookeeper/bin/zkServer.sh start

             

# ./zookeeper_setup.sh -d /home -z 2181

# service zookeeperd start (详见脚本)

 

# zkCli.sh -server ip:2181 能正确访问 则说明zk部署成功zk启动成功(依次将zk集群启动)

 

配置环境变量

cat >> /etc/profile << EOF

ZK_HOME=/app/hhy/devops/zookeeper

PATH=$PATH:$ZK_HOME/bin

export PATH

EOF

echo -e "ZK_HOME=/app/hhy/devops/zookeeper\nPATH=$PATH:$ZK_HOME/bin\nexport PATH" >> /etc/profile

 

1.3 设置环境变量

cat >> /etc/profile.d/go.sh << EOF

export GOROOT=/usr/local/go

export GOPATH=/opt/codis

export ZOOKEEPER_HOME=/home/zookeeper

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

EOF

 

source /etc/profile

 

1.4  Codis源码安装

# mkdir -p /opt/codis/src/github.com/CodisLabs

# cd /opt/codis

# yum install git -y

# go get -u -d github.com/CodisLabs/codis(这个方法我没有采用,不知道为什么执行之后不出结果,我是直接在官网下载的包)

# wget -c https://github.com/CodisLabs/codis-3.1.0.zip

# unzip codis-3.1.0.zip -d /opt/codis/src/github.com/CodisLabs

# cd /opt/codis/src/github.com/CodisLabs

# mv codis-3.1.0 codis

#cd codis

#make

#make gotest(测试编译是否成功)

执行成功后进入bin目录,会新增几个文件,如下表示编译成功

 

 

软链接:

ln -sf  /opt/codis/bin/codis-admin  /usr/local/sbin/codis-admin

ln -sf  /opt/codis/bin/codis-dashboard  /usr/local/sbin/codis-dashboard

ln -sf  /opt/codis/bin/codis-fe  /usr/local/sbin/codis-fe

ln -sf  /opt/codis/bin/codis-proxy  /usr/local/sbin/codis-proxy

ln -sf  /opt/codis/bin/codis-ha  /usr/local/sbin/codis-ha

ln -sf  /opt/codis/bin/codis-server  /usr/local/sbin/codis-server

ln -sf  /opt/codis/bin/codis-server-2.8.21  /usr/local/sbin/codis-server-2.8.21

ln -sf  /opt/codis/bin/redis-benchmark  /usr/local/sbin/redis-benchmark

ln -sf  /opt/codis/bin/redis-cli  /usr/local/sbin/redis-cli

 

 

1.5  修改配置文件

使用GOPATH做为安装目录:

# mkdir -p /opt/codis/{conf,run,logs,data}

# cd /opt/codis/src/github.com/CodisLabs/codis

# cp extern/redis-2.8.21/redis.conf /opt/codis/conf/redis7000.conf

# cat /opt/codis/conf/redis7000.conf |grep -vE '^#|^$'

考虑性能,主库关闭aof和rdp,从库只开启aof:

######################  2.8.21版本配置  #########################

daemonize yes

pidfile /opt/codis/run/redis7000.pid

port 7000

timeout 86400

tcp-keepalive 60

loglevel notice

logfile /opt/codis/logs/redis7000.log

databases 16

#### 关闭rdb ####

save ""

#### 开启rdb ####

#save 900 1   

#save 300 10

#save 60 10000

stop-writes-on-bgsave-error no

rdbcompression yes

dbfilename dump7000.rdb

dir /opt/codis/data

masterauth "hhy@2016"

slave-serve-stale-data yes

repl-disable-tcp-nodelay no

slave-priority 100

requirepass "hhy@2016"

maxmemory 10gb

maxmemory-policy allkeys-lru

#### 关闭aof ####

appendonly no

appendfsync everysec

no-appendfsync-on-rewrite yes

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 0 0 0

client-output-buffer-limit pubsub 0 0 0

hz 10

aof-rewrite-incremental-fsync yes

 

#################################################################

说明:执行之前注意将run, logs和data的文件生成目录建好,不然会启动失败

 

启动redis

codis-server /opt/codis/conf/redis7000.conf &

codis-server /opt/codis/conf/redis7001.conf &

 

停止redis

redis-cli -h 127.0.0.1 -p 7000 -a hhy@2016 shutdown

redis-cli -h 127.0.0.1 -p 7001 -a hhy@2016 shutdown

###############################################################

 

2. 配置codis-dashboard

 

生成默认配置

# codis-dashboard --default-config | tee /opt/codis/conf/dashboard.conf

vim /opt/codis/conf/dashboard.conf

 

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

coordinator_addr            # 外部存储地址, 格式IP:port,多个地址之间用逗号分割

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

product_auth                # 集群密码,默认为空

admin_addr                  # RESTful API 端口

 

后台启动

# cd  /opt/codis/bin

# nohup codis-dashboard --ncpu=1 --config=/opt/codis/conf/dashboard.conf --log=/opt/codis/logs/dashboard.log --log-level=WARN &

 

执行完成后出现以下内容说明成功

#more dashboard.log日期

 

 

停止dashboard服务

# codis-admin --dashboard=0.0.0.0:18080 --shutdown

 

参数说明:

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

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

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

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

 

备注:

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

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

 

 

 

3. 配置codis-proxy

 

生成默认配置

# codis-proxy --default-config | tee /opt/codis/conf/proxy.conf

vim /opt/codis/conf/proxy.conf

 

配置文件解析:

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

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表示禁止

 

后台启动

# cd  /opt/codis/bin

# nohup codis-proxy --ncpu=1 --config=/opt/codis/conf/proxy.conf --log=/opt/codis/logs/proxy.log --log-level=WARN &

执行完成后出现以下内容说明成功

#more proxy.log日期

 

停止 proxy 服务

# codis-admin --proxy=172.3.4.246:11080 --auth="hhy@2016" --shutdown

 

描述:

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

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

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

 

# codis-admin --dashboard=172.3.4.246:18080  --create-proxy -x 172.3.4.246:11080

 

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

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

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

② 同步 slots 状态;

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

 

 

查看 proxy 工具用法

# 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. 配置codis-fe集群管理界面

生成配置文件

# codis-admin --dashboard-list --zookeeper=172.3.4.246 | tee /opt/codis/conf/codis.json

 

启动codis-fe

# cd  /opt/codis/bin

# nohup codis-fe --ncpu=1 --log=/opt/codis/logs/fe.log --log-level=WARN --dashboard-list=/opt/codis/conf/codis.json --assets-dir=/opt/codis/bin/assets --listen=0.0.0.0:18090 &

 

看生成的日志出现如下情况说明没问题

 

至此codis的图形界面已经能够显示

 

 

5. 图形界面创建组和solt节点

 

1)   打开浏览器访问http://ip:18090, 通过管理界面操作codis

创建组

 

输入编号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)   通过命令行进行操作

创建组:

# codis-admin  --dashboard=172.3.4.246:18080  --create-group   --gid=1
# codis-admin  --dashboard=172.3.4.246:18080  --create-group   --gid=2

 

组添加服务器

# codis-admin  --dashboard=172.3.4.246:18080  --group-add  --gid=1 \

--addr=172.3.4.246:7000
# codis-admin  --dashboard=172.3.4.246:18080  --group-add  --gid=1  \

--addr=172.3.4.246:7001

 

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

 --addr=172.3.4.246:7000

# codis-admin  --dashboard=172.3.4.246:18080   --sync-action  --create  \

--addr=172.3.4.246:7001

 

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

--addr=172.3.4.246:7001(从库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来提供.

 

# codis-admin

--dashboard=172.3.4.246:18080  --slot-action  --create-range  --beg=0  --end=300  --gid=1
# codis-admin

--dashboard=172.3.4.246:18080  --slot-action  --create-range  --beg=301 --end=601  --gid=2

 

附录: Codis HA(可选组件)

工作原理

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

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

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

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

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

 

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

i.       存在 proxy 状态异常:

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

ii.      网络原因造成的 master 异常:

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

iii.    没有满足条件的 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将其中一个slave升级为master时,该组内其他slave实例是不会自动改变状态的,这些slave仍将试图从旧的master上同步数据,因而会导致组内新的master和其他slave之间的数据不一致。因为redis的slaveof命令切换master时会丢弃slave上的全部数据,从新master完整同步,会消耗资源。因此,当出现主从切换时,需要管理员手动创建新的sync action来完成新master与slave之间的数据同步。Codis-ha不会自动刷新其他slave的状态。

 

启动codis-ha

# cd /opt/codis/bin

# nohup codis-ha --log=/opt/codis/logs/ha.log --log-level=WARN --dashboard=127.0.0.1:18080 &

 

参数说明

# codis-ha -h

Usage:

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

    codis-ha  --version

 

 

Options:

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

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

 

FAQ:

异常关机后,无法启动dashboard,日志报下错:

2016/11/15 21:41:05 topom.Go:121: [ERROR] store: acquire lock of codis_gls_prd failed

[error]: zk: node already exists

解决方法:

# codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181

重启dashboard

 

启动codis-ha报错:

2017/01/10 09:40:52 main.go:110: [PANIC] rpc stats failed

[error]: [Remote Error] topom is not online

原因: dashboard的没有被解锁

解决方法:执行如上操作,并重启dashboard即可

 

删除server节点的分组报错:

原因:已经分配slot的group无法删除, 且server-master不能删除

解决:重新分配slot,或者想办法迁移slot后,再尝试删除

 

防止意外丢失数据

主从切换后,原主恢复后,先导出一份原从的数据,再进行主从同步数据

导出导入工具介绍:redis-port

 

1. DUMP rdb file from master redis

redis-port dump     [--ncpu=N]   --from=MASTER   [--password=PASSWORD]  [--output=OUTPUT]

 

2. SYNC data from master to slave

redis-port sync     [--ncpu=N]   --from=MASTER   [--password=PASSWORD]  --target=TARGET

 

参数介绍:

Options

-n N, --ncpu=N

set runtime.GOMAXPROCS to N

-i INPUT, --input=INPUT

use INPUT as input file, or if it is not given, redis-port reads from stdin (means '/dev/stdin')

-o OUTPUT, --output=OUTPUT

use OUTPUT as output file, or if it is not given, redis-port writes to stdout (means '/dev/stdout')

-m MASTER, --master=MASTER

specify the master redis

-t TARGET, --target=TARGET

specify the slave redis (or target redis)

-P PASSWORD, --password=PASSWORD

specify the redis auth password

-A AUTH, --auth=AUTH

specify the auth password for target

-e, --extra

dump or restore following redis backlog commands

--filterdb=DB

filter specifed db number, default value is '*'

 

一组codis-server全部异常会导致proxy代理无法连接后端

报错:ERR handle response, backend conn reset

解决:每个GROUP做成master-slave模式,确保至少有一个server可以提供服务。

 

Migrate Slots任务异常

报错:再执行Migrate任务,提示已经有任务在进行

尝试:

# codis-admin --proxy=172.3.4.246:11080 --reset-stats

 

转载于:https://my.oschina.net/u/3376103/blog/864513

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值