欢迎您, 来到 宁时修博客.^_^

Codis 3.x集群搭建与使用_03

2018/07/04 言则行 Codis 956
Codis 3.x集群命令与异常修复

一、Codis另一种启动及参数

    请按照顺序逐步完成操作。生产环境需要修改dashboard coordinator_name配置,使用 zookeeper 或etctd作为外部存储。

    注:Codis 3.x 支持 AUTH,但是要求所有组件使用的 AUTH 必须完全相同。


    (1) Codis Dashboard

        1、启动命令

nohup /usr/local/codis/bin/codis-dashboard --ncpu=4 --config=/usr/local/codis/conf/dashboard.toml --log=/usr/local/codis/src/github.com/CodisLabs/codis/log/codis-dashboard.log.2018-07-04 --log-level=WARN &

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


        2、启动参数说明

/usr/local/codis/bin/codis-dashboard -h
Usage:
    codis-dashboard [--ncpu=N] [--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR] [--pidfile=FILE] [--zookeeper=ADDR|--etcd=ADDR|--filesystem=ROOT] [--product_name=NAME] [--product_auth=AUTH] [--remove-lock]
    codis-dashboard  --default-config
    codis-dashboard  --version

Options:
    --ncpu=N                    最大使用 CPU 个数
    -c CONF, --config=CONF      指定启动配置文件
    -l FILE, --log=FILE         设置 log 输出文件
    --log-level=LEVEL           设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN


        3、默认配置文件

[root@codis-redis ~]# /usr/local/codis/bin/codis-dashboard --default-config | tee dashboard.toml 

##################################################
#                                                #
#                  Codis-Dashboard               #
#                                                #
##################################################

# Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".
# for zookeeper/etcd, coorinator_auth accept "user:password" 
# Quick Start
coordinator_name = "filesystem"
coordinator_addr = "/tmp/codis"
#coordinator_name = "zookeeper"
#coordinator_addr = "127.0.0.1:2181"
#coordinator_auth = ""

# 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_addrRESTful API 端口



    (2)Codis Proxy

        1、启动命令

nohup /usr/local/codis/bin/codis-proxy --ncpu=4 --config=/usr/local/codis/conf/proxy.toml --log=/usr/local/codis/src/github.com/CodisLabs/codis/log/codis-proxy.log.2018-07-04 --log-level=WARN &

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


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

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

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

/usr/local/codis/bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080

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

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

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

    • 同步 slots 状态;

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


        2、启动参数说明

/usr/local/codis/bin/codis-proxy -h
Usage:
	codis-proxy [--ncpu=N [--max-ncpu=MAX]] [--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR] [--host-proxy=ADDR] [--dashboard=ADDR|--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT|--fillslots=FILE] [--ulimit=NLIMIT] [--pidfile=FILE] [--product_name=NAME] [--product_auth=AUTH] [--session_auth=AUTH]
	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


        3、默认配置文件

[root@codis-redis ~]# /usr/local/codis/bin/codis-proxy --default-config | tee proxy.toml

##################################################
#                                                #
#                  Codis-Proxy                   #
#                                                #
##################################################

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

session_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"

jodis_name = ""
jodis_addr = ""
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = false

...............................................

# Make sure this is higher than the max number of requests for each pipeline request, or your client may be blocked.
# Set session pipeline buffer size.
session_max_pipeline = 10000

# Set session tcp keepalive period. (0 to disable)
session_keepalive_period = "75s"

................................................
参数说明
product_name集群名称,参考 dashboard 参数说明
product_auth集群密码,默认为空
admin_addrRESTful API 端口
proto_typeRedis 端口类型,接受 tcp/tcp4/tcp6/unix/unixpacket
proxy_addrRedis 端口地址或者路径
jodis_addrJodis 注册 zookeeper 地址
jodis_timeoutJodis 注册 session timeout 时间,单位 second
jodis_compatibleJodis 注册 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 表示禁止

        注:Codis3 会将 jodis 节点注册在 /jodis/{PRODUCT_NAME} 下,这点与 Codis2 不太兼容,所以为了兼容性,可以考虑将 jodis_compatible 设置成 true


    (3) Codis Server 

    • 启动 /usr/local/codis/bin/codis-server,与启动普通 redis 的方法一致。

    • 启动完成后,可以通过 codis-fe 提供的界面或者 codis-admin 命令行工具添加到集群中。


    (4) Codis FE(可选组件)

        1、启动命令

nohup /usr/local/codis/bin/codis-fe --ncpu=4 --log=usr/local/codis/src/github.com/CodisLabs/codis/log/codis-fe.log.2018-07-04 --log-level=WARN \
    --zookeeper=127.0.0.1:2181 --listen=127.0.0.1:8080 &

    

        2、启动参数说明

/usr/local/codis/bin/codis-fe -h
Usage:
	codis-fe [--ncpu=N] [--log=FILE] [--log-level=LEVEL] [--assets-dir=PATH] [--pidfile=FILE] (--dashboard-list=FILE|--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) --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 服务端口

配置文件 codis.json 可以手动编辑,也可以通过 codis-admin 从外部存储中拉取,例如:

/usr/local/codis/bin/codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee codis.json
[
    {        "name": "codis-demo",        "dashboard": "127.0.0.1:18080"
    },
    {        "name": "codis-demo2",        "dashboard": "127.0.0.1:28080"
    }
]



    (5)Codis Admin(命令行工具)

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

        1、codis-dashboard异常退出的修复

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

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

        B.运行 codis-admin 删除 LOCK:

/usr/local/codis/bin/codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181

        

        显示以下信息:

2018/07/11 09:03:37 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:2181
2018/07/11 09:03:37 zkclient.go:23: [INFO] zookeeper - Connected to 127.0.0.1:2181
2018/07/11 09:03:37 zkclient.go:23: [INFO] zookeeper - Authenticated: id=100353371659829249, timeout=40000
2018/07/11 09:03:37 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect
2018/07/11 09:03:37 zkclient.go:23: [INFO] zookeeper - Recv loop terminated: err=EOF
2018/07/11 09:03:37 zkclient.go:23: [INFO] zookeeper - Send loop terminated: err=<nil>



        2、codis-proxy异常退出的修复

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

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

        B.运行 codis-admin 删除 proxy:

/usr/local/codis/bin/codis-admin --dashboard=192.168.2.24:18080 --remove-proxy --addr=192.168.2.25:11080 --force

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


        3、如果非正常关闭dashboard和proxy,并且启动不了,请尝试以上修复

        比如我没有关闭dashboard就关闭服务器了,再次开启服务器时,发现启动dashboard报错,日志显示:

2018/07/05 11:51:24 main.go:171: [WARN] [0xc4200b4ea0] dashboard online failed [15]
2018/07/05 11:51:26 topom.go:189: [ERROR] store: acquire lock of codis-demo failed
[error]: zk: node already exists
    6   /usr/local/codis/src/github.com/CodisLabs/codis/pkg/models/zk/zkclient.go:247
            github.com/CodisLabs/codis/pkg/models/zk.(*Client).create
    5   /usr/local/codis/src/github.com/CodisLabs/codis/pkg/models/zk/zkclient.go:196
            github.com/CodisLabs/codis/pkg/models/zk.(*Client).Create.func1
    4   /usr/local/codis/src/github.com/CodisLabs/codis/pkg/models/zk/zkclient.go:129
            github.com/CodisLabs/codis/pkg/models/zk.(*Client).shell
.....................

        这时就可以使用 dashboard异常修复命令:

[root@codis-redis ~]# /usr/local/codis/bin/codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181



        然后再次启动dashboard就成功了。

        原因就是:      

        codis-dashboard没有正常关闭,会造成zookeeper里面的状态没有更新,最终新启动的codis-dashboard不能注册进zookeeper,一直提示已存在而被强制关闭。

        修复方法就是删除这个lock的状态键值。


二、Jodis与HA

        因为 codis-proxy 是无状态的,可以比较容易的搭多个实例,达到高可用性和横向扩展。

        对 Java 用户来说,可以使用基于 Jedis 的实现 Jodis ,来实现 proxy 层的 HA:

    • 它会通过监控 zookeeper 上的注册信息来实时获得当前可用的 proxy 列表,既可以保证高可用性;

    • 也可以通过轮流请求所有的proxy实现负载均衡。

        如果需要异步请求,可以使用我们基于Netty开发的 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 不提供自动操作的工具,因为这样太不安全了)。


        注:以上抄录官方文档:https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md



三、注

        我觉得这样启动很麻烦,我是不推荐。当然还是看个人,喜欢那种启动就怎么启动。

        用脚本快速启动,注意修改脚本/配置文件。

        用命令后台运行,也要注意配置。


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群