关闭

codis 3.0.3安装搭建

4749人阅读 评论(1) 收藏 举报
分类:

一.基本信息

三台机器:192.168.30.113          192.168.30.114       192.168.30.115
                       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.5.2.linux-amd64.tar.gz      https://golang.org/doc/install?download=go1.5.2.linux-amd64.tar.gz
jdk版本:jdk1.7.0_71     /codisapp/svr/jdk-7u71-linux-x64.tar.gz
zookeeper版本:zookeeper-3.4.8.tar.gz

日志目录:      /codisapp/logs/codis
配置文件目录: /codisapp/conf/codis
pid文件目录:  /codisapp/run/codis
相关启动脚本目录: /codisapp/sh/codis
codis-server数据目录: /codisapp/dbdat/redis_data_6379   /codisapp/dbdat/redis_data_6380      

二.相关组件安装配置           
1、安装编译环境前的一些依赖安装(三台主机上执行)
yum install -y gcc make gcc-c++ automake lrzsz openssl-devel zlib-* bzip2-* readline* zlib-* bzip2-* git
yum install -y nmap unzip wget lsof xz net-tools mercurial
修改:
vi /etc/sysctl.conf
vm.overcommit_memory = 1
sysctl vm.overcommit_memory=1

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


2.安装go(三台主机上执行)

下载:
https://golang.org/doc/install?download=go1.5.2.linux-amd64.tar.gz

解包:
cd /tmp/
tar -C /usr/local -xzf go1.5.2.linux-amd64.tar.gz
mkdir /root/gopkg     #  工作路径
#修改配置文件
vim /etc/profile
#profile文件修改如下:
export GOROOT=/usr/local/go
export GOPATH=/root/gopkg
export PATH=$GOROOT/bin:$PATH

刷新配置文件:
source /etc/profile

查看go版本:
[root@mvxl2579 tmp]# go version
go version go1.5.2 linux/amd64

配置dns解析:
vi /etc/resolv.conf
nameserver 10.16.0.100
nameserver 10.16.15.110

goderp安装
mkdir -p $GOPATH/src/github.com/tools
cd $GOPATH/src/github.com/tools
go get -u github.com/tools/godep
[root@mvxl2579 tools]# cd godep
[root@mvxl2579 godep]# go install ./  ---该命令会将 godep 生成到 $GOPATH/bin 下

将$GOPATH/bin加到/etc/profile中:
vim /etc/profile
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

source /etc/profile

[root@mvxl2579 godep]# which godep
/root/gopkg/bin/godep
[root@mvxl2579 godep]# godep version
godep v72 (linux/amd64/go1.5.2)


3.安装jdk(192.168.30.113/192.168.30.114/192.168.30.115)

  root 操作

  cd /tmp
  tar -C /codisapp/svr/ -xzf /tmp/jdk-7u71-linux-x64.gz
  chown -R codisapp:codisapp /codisapp/svr/jdk1.7.0_71
  alternatives  --install /usr/bin/java  java /codisapp/svr/jdk1.7.0_71/bin/java 300;alternatives --set java /codisapp/svr/jdk1.7.0_71/bin/java
  alternatives  --install /usr/bin/javac  javac /codisapp/svr/jdk1.7.0_71/bin/javac 300;alternatives --set javac /codisapp/svr/jdk1.7.0_71/bin/javac
  alternatives  --install /usr/bin/jstat  jstat /codisapp/svr/jdk1.7.0_71/bin/jstat 300;alternatives --set jstat /codisapp/svr/jdk1.7.0_71/bin/jstat


4.安装zookeeper(192.168.30.113/192.168.30.114/192.168.30.115)

codisapp 操作
cd /tmp
tar -C /codisapp/svr/ -xzf zookeeper-3.4.8.tar.gz
cd /codisapp/svr/
ln -s zookeeper-3.4.8 zookeeper
cd /codisapp/svr/zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg

修改zoo.cfg:
vim /codisapp/svr/zookeeper/conf/zoo.cfg ##撰写zk的配置文件
maxClientCnxns=60
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/codisapp/svr/zookeeper/data
dataLogDir=/codisapp/svr/zookeeper/logs
clientPort=2181
server.1=192.168.30.113:2888:3888
server.2=192.168.30.114:2888:3888
server.3=192.168.30.115:2888:3888

2888表示zookeeper程序监听端口,3888表示zookeeper选举通信端口。

mkdir -p /codisapp/svr/zookeeper/data
mkdir -p /codisapp/svr/zookeeper/logs

echo "1" >/codisapp/svr/zookeeper/data/myid  ##生成ID,这里需要注意, myid对应的zoo.cfg的server.ID,比如第二台zookeeper主机对应的myid应该是2
# echo "2" >/codisapp/svr/zookeeper/data/myid
# echo "3" >/codisapp/svr/zookeeper/data/myid

#然后启动zookeeper
cd /codisapp/svr/zookeeper/bin
./zkServer.sh start        #
关闭:
cd /codisapp/svr/zookeeper/bin
./zkServer.sh stop

查看zk状态:
[codisapp@zabbix_testdb conf]$ /codisapp/svr/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /codisapp/svr/zookeeper/bin/../conf/zoo.cfg
Mode: follower

查看相关信息:
[codisapp@mvxl2579 bin]$ /codisapp/svr/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

编写启停脚本:
cd /codisapp/sh/codis
vi start_zookeeper.sh
cd /codisapp/svr/zookeeper/bin
./zkServer.sh start

vi stop_zookeeper.sh
cd /codisapp/svr/zookeeper/bin
./zkServer.sh stop

chmod u+x *

将脚本copy到其它主机上:
scp /codisapp/sh/codis/start_zookeeper.sh 192.168.30.114:/codisapp/sh/codis/
scp /codisapp/sh/codis/start_zookeeper.sh 192.168.30.115:/codisapp/sh/codis/

scp /codisapp/sh/codis/stop_zookeeper.sh 192.168.30.114:/codisapp/sh/codis/
scp /codisapp/sh/codis/stop_zookeeper.sh 192.168.30.115:/codisapp/sh/codis/

三.codis安装
 安装codis(在第一台机下载,然后编译后的二进制文件copy 到其他两台,然后三台主机上执行)
1.下载  https://github.com/CodisLabs/codis/archive/3.0.3.zip
unzip 解压:
cd /tmp
unzip codis-3.0.3.zip
##cd /root/gopkg/src/github.com/CodisLabs/
##mv codis codis_2.0.14         # 老的版本,rename
mkdir -p /root/gopkg/src/github.com/CodisLabs
cp -r /tmp/codis-3.0.3 /root/gopkg/src/github.com/CodisLabs/codis
cd /root/gopkg/src/github.com/CodisLabs/codis
执行make.
执行全部指令后,会在 bin 文件夹内生成 codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server 六个可执行文件。另外, bin/assets 文件夹是 codis-dashboard  http 服务需要的前端资
源, 需要和codis-dashboard 放置在同一文件夹下。
[root@mvxl2579 codis]# cd bin
[root@mvxl2579 bin]# ls -ltr
total 71156
-rwxr-xr-x 1 root root  6311067 May 31 09:02 codis-server
-rw-r--r-- 1 root root       96 May 31 09:02 version
-rwxr-xr-x 1 root root 18415720 May 31 09:10 codis-dashboard
-rwxr-xr-x 1 root root 11056192 May 31 09:10 codis-proxy
-rwxr-xr-x 1 root root 17600776 May 31 09:10 codis-admin
-rwxr-xr-x 1 root root  9957704 May 31 09:10 codis-ha
-rwxr-xr-x 1 root root  9498560 May 31 09:10 codis-fe
drwxr-xr-x 4 root root     4096 May 31 09:10 assets

下面的mkdir 需三台机器都执行
mkdir /codisapp/svr/codis
mkdir -p /codisapp/conf/codis
mkdir -p /codisapp/logs/codis
mkdir -p /codisapp/sh/codis
mkdir -p /codisapp/run/codis/
mkdir -p /codisapp/dbdat/redis_data_6379
mkdir -p /codisapp/dbdat/redis_data_6380
cp -r /root/gopkg/src/github.com/CodisLabs/codis/bin /codisapp/svr/codis/

需三台机器都执行:
chown -R codisapp:codisapp /codisapp

由于codis 本身只有codis-server ,没有redis-cli,需要把redis 2.8.21 安装包里面的几个程序 redis-benchmark redis-check-aof redis-check-dump redis-cli copy到/codisapp/svr/codis/bin 下面:
[root@mvxl2579 redis-2.8.21]# cd /root/gopkg/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src
[root@mvxl2579 src]# cp {redis-benchmark,redis-check-aof,redis-check-dump,redis-cli} /codisapp/svr/codis/bin
chown -R codisapp:codisapp /codisapp/svr/codis/bin
codis copy 到其他机器:
scp -r /codisapp/svr/codis/bin 192.168.30.114:/codisapp/svr/codis/
scp -r /codisapp/svr/codis/bin 192.168.30.115:/codisapp/svr/codis/    

四 配置和启动各组件

1.配置和启动 Codis 的Redis
配置文件 : /codisapp/conf/codis/redis6379.conf    里面设置密码: xxxxx
考虑性能,主库关闭aof和rdp,从库只开启aof:
cd /root/gopkg/src/github.com/CodisLabs/codis/extern/redis-2.8.21/
cp redis.conf /codisapp/conf/codis/redis6379.conf
cp redis.conf /codisapp/conf/codis/redis6380.conf

将redis6379.conf更改以下参数(主库):
daemonize yes
pidfile /codisapp/run/codis/redis6379.pid
port 6379
timeout 86400
tcp-keepalive 60
loglevel notice
logfile /codisapp/logs/codis/redis6379.log
databases 16
save ""
#save 900 1    ----关闭aof
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
dbfilename dump6379.rdb
dir /codisapp/dbdat/redis_data_6379
masterauth "xxxxx"
slave-serve-stale-data yes
repl-disable-tcp-nodelay no
slave-priority 100
requirepass "xxxxx"
maxmemory 10gb
maxmemory-policy allkeys-lru
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
repl-backlog-size 33554432


将redis6380.conf更改以下参数(从库):
daemonize yes
pidfile /codisapp/run/codis/redis6380.pid
port 6380
timeout 86400
tcp-keepalive 60
loglevel notice
logfile /codisapp/logs/codis/redis6380.log
databases 16
save ""
#save 900 1    ----关闭aof
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
dbfilename dump6379.rdb
dir /codisapp/dbdat/redis_data_6380
masterauth "xxxxx"
slave-serve-stale-data yes
repl-disable-tcp-nodelay no
slave-priority 100
requirepass "xxxxx"
maxmemory 10gb
maxmemory-policy allkeys-lru
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
repl-backlog-size 33554432

cd /codisapp/conf/codis
scp -p * 192.168.30.114:/codisapp/conf/codis
scp -p * 192.168.30.115:/codisapp/conf/codis

三台机启动: /codisapp/svr/codis/bin/codis-server  /codisapp/conf/codis/redis6379.conf &
            /codisapp/svr/codis/bin/codis-server  /codisapp/conf/codis/redis6380.conf &
     
或者执行脚本来启动: sh /codisapp/sh/codis/start_codis_server.sh 

编写启停脚本:
vi /codisapp/sh/codis/start_codis_server.sh
#!/bin/sh
CODIS_HOME=/codisapp/svr/codis
$CODIS_HOME/bin/codis-server /codisapp/conf/codis/redis6379.conf &
$CODIS_HOME/bin/codis-server /codisapp/conf/codis/redis6380.conf &

vi /codisapp/sh/codis/stop_codis_server.sh
ps -ef|grep codis-server|grep -v grep|awk '{print $2}'|xargs kill

cd /codisapp/sh/codis
chmod u+x *

将脚本copy到其它主机上:
scp /codisapp/sh/codis/start_codis_server.sh 192.168.30.114:/codisapp/sh/codis/
scp /codisapp/sh/codis/stop_codis_server.sh 192.168.30.114:/codisapp/sh/codis/
scp /codisapp/sh/codis/start_codis_server.sh 192.168.30.115:/codisapp/sh/codis/
scp /codisapp/sh/codis/stop_codis_server.sh 192.168.30.115:/codisapp/sh/codis/

等后面codis-fe和codis-admin 安装完后,可以通过 codis-fe 提供的界面或者 codis-admin 命令行工具添加到集群中。
redis-cli 连接:   /codisapp/svr/codis/bin/redis-cli -p 6379 -a "xxxxx"
    
2.启动 dashboard(192.168.30.113)
  
  生成默认的配置文件:
  /codisapp/svr/codis/bin/codis-dashboard --default-config | tee /codisapp/conf/codis/dashboard.toml
 
  vim  /codisapp/conf/codis/dashboard.toml
  修改如下:
 
  # Set Coordinator, only accept "zookeeper" & "etcd"
  coordinator_name = "zookeeper"
  coordinator_addr = "192.168.30.113:2181,192.168.30.114:2181,192.168.30.115:2181"

  # Set Codis Product {Name/Auth}.
  product_name = "hls_prod"
  product_auth = "xxxxx"
 
  # Set bind address for admin(rpc), tcp only.
  admin_addr = "192.168.30.113:18080"
 
  启动dashboard(只在192.168.30.113上启动):
 
  nohup /codisapp/svr/codis/bin/codis-dashboard --ncpu=4 --config=/codisapp/conf/codis/dashboard.toml \
    --log=/codisapp/logs/codis/dashboard.log --log-level=WARN &
   
  或者脚本来启动:sh /codisapp/sh/codis/start_codis_dashboard.sh
vim /codisapp/sh/codis/start_codis_dashboard.sh
#!/bin/sh
CODIS_HOME=/codisapp/svr/codis
nohup $CODIS_HOME/bin/codis-dashboard --ncpu=4 --config=/codisapp/conf/codis/dashboard.toml --log=/codisapp/logs/codis/dashboard.log --log-level=WARN &

将配置文件copy到其它主机上,并只有当192.168.30.113主机有问题时,才在其它主机上启动dashboard。
scp /codisapp/conf/codis/dashboard.toml codisapp@192.168.30.114:/codisapp/conf/codis
并将配置文件中下行进行更改:
admin_addr = "192.168.30.114:18080"

scp /codisapp/conf/codis/dashboard.toml codisapp@192.168.30.115:/codisapp/conf/codis
并将配置文件中下行进行更改:
admin_addr = "192.168.30.115:18080"

停止脚本:
vim /codisapp/sh/codis/stop_codis_dashboard.sh
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --shutdown

将启停脚本copy到其它主机上,并只有当192.168.30.113主机有问题时,才在其它主机上启动dashboard。
 scp /codisapp/sh/codis/start_codis_dashboard.sh 192.168.30.114:/codisapp/sh/codis
 scp /codisapp/sh/codis/start_codis_dashboard.sh 192.168.30.115:/codisapp/sh/codis
 scp /codisapp/sh/codis/stop_codis_dashboard.sh 192.168.30.114:/codisapp/sh/codis
 scp /codisapp/sh/codis/stop_codis_dashboard.sh 192.168.30.115:/codisapp/sh/codis
   
   
3.启动 codis-proxy (192.168.30.113、192.168.30.114、192.168.30.115)

生成默认的配置文件:
/codisapp/svr/codis/bin/codis-proxy --default-config | tee /codisapp/conf/codis/proxy.toml
vim /codisapp/conf/codis/proxy.toml
暂时只修改,其他默认
 product_name = "hls_prod"
 product_auth = "xxxxx"

# Set jodis address & session timeout.
jodis_addr = "192.168.30.103:2181,192.168.30.104:2181,192.168.30.105:2181" 

192.168.30.113:
nohup /codisapp/svr/codis/bin/codis-proxy --ncpu=4 --config=/codisapp/conf/codis/proxy.toml --log=/codisapp/logs/codis/proxy.log --log-level=WARN &
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --create-proxy -x 192.168.30.113:11080

或者脚本来启动:
sh /codisapp/sh/codis/start_codis_proxy.sh

启动脚本(192.168.30.113):
vi /codisapp/sh/codis/start_codis_proxy.sh
#!/bin/sh
CODIS_HOME=/codisapp/svr/codis
# start codis-proxy
nohup $CODIS_HOME/bin/codis-proxy --ncpu=4 --config=/codisapp/conf/codis/proxy.toml --log=/codisapp/logs/codis/proxy.log --log-level=WARN &
sleep 3s
# set codis-proxy online
$CODIS_HOME/bin/codis-admin --dashboard=192.168.30.113:18080 --create-proxy -x 192.168.30.113:11080

停止脚本:
vi /codisapp/sh/codis/stop_codis_proxy.sh
/codisapp/svr/codis/bin/codis-admin --proxy=192.168.30.113:11080 --auth="xxxxx" --shutdown

将配置文件和脚本复制到其它主机上:
scp /codisapp/conf/codis/proxy.toml 192.168.30.114:/codisapp/conf/codis/
scp /codisapp/conf/codis/proxy.toml 192.168.30.115:/codisapp/conf/codis/

scp /codisapp/sh/codis/start_codis_proxy.sh 192.168.30.114:/codisapp/sh/codis/
scp /codisapp/sh/codis/start_codis_proxy.sh 192.168.30.115:/codisapp/sh/codis/
scp /codisapp/sh/codis/stop_codis_proxy.sh 192.168.30.114:/codisapp/sh/codis/
scp /codisapp/sh/codis/stop_codis_proxy.sh 192.168.30.115:/codisapp/sh/codis/

192.168.30.114:
修改start_codis_proxy.sh脚本里的 LOCAL_PROXY_IP=192.168.30.114
启动proxy:
sh /codisapp/sh/codis/start_codis_proxy.sh

192.168.30.115:
修改start_codis_proxy.sh脚本里的 LOCAL_PROXY_IP=192.168.30.115
启动proxy:
sh /codisapp/sh/codis/start_codis_proxy.sh

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

通过 codis-fe 添加:通过 Add Proxy 按钮,将 admin_addr 加入到集群中;
通过 codis-admin 命令行工具添加,方法如下:
$ ./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 连接并开始提供服务;


4. 配置启动Codis FE

生成配置文件:
配置文件 codis.json 可以手动编辑,也可以通过 codis-admin 从外部存储中拉取:
/codisapp/svr/codis/bin/codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee /codisapp/conf/codis/codis.json

启动命令:
$ nohup /codisapp/svr/codis/bin/codis-fe --ncpu=4 --log=/codisapp/logs/codis/fe.log --log-level=WARN --dashboard-list=/codisapp/conf/codis/codis.json --listen=0.0.0.0:8080 &

或者启动脚本启动 :
sh /codisapp/sh/codis/start_codis_fe.sh

编写启动脚本:
vim /codisapp/sh/codis/start_codis_fe.sh
#!/bin/sh
CODIS_HOME=/codisapp/svr/codis
nohup $CODIS_HOME/bin/codis-fe --ncpu=4 --log=/codisapp/logs/codis/fe.log --log-level=WARN --dashboard-list=/codisapp/conf/codis/codis.json --listen=0.0.0.0:8080 &

停止脚本:
vim /codisapp/sh/codis/stop_codis_fe.sh
ps -ef|grep codis-fe|grep -v grep|awk '{print $2}'|xargs kill
chmod u+x *

web管理台地址:  http://192.168.30.113:8080/

启动参数说明:
$ ./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 服务端口  
   
   
5. 配置启动codis-ha

启动命令:
$ nohup /codisapp/svr/codis/bin/codis-ha --log=/codisapp/logs/codis/ha.log --log-level=WARN --dashboard=192.168.30.113:18080 &

或者启动脚本启动 :
sh /codisapp/sh/codis/start_codis_ha.sh
vi /codisapp/sh/codis/start_codis_ha.sh
#!/bin/sh
CODIS_HOME=/codisapp/svr/codis
nohup $CODIS_HOME/bin/codis-ha --log=/codisapp/logs/codis/ha.log --log-level=WARN --dashboard=192.168.30.113:18080 &

vi /codisapp/sh/codis/stop_codis_ha.sh
ps -ef|grep codis-ha|grep -v grep|awk '{print $2}'|xargs kill


6. Codis Admin(命令行工具)

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

a.  codis-dashboard 异常退出的修复

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

确认 codis-dashboard 进程已经退出(很重要);
运行 codis-admin 删除 LOCK:

/codisapp/svr/codis/bin/codis-admin --remove-lock --product=codis_test --zookeeper=127.0.0.1:2181

正常关闭:
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --shutdown

b. codis-proxy 异常退出的修复

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

确认 codis-proxy 进程已经退出(很重要);
运行 codis-admin 删除 proxy:
查看proxy状态:
[codisapp@mvxl2579 codis]$ /codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --proxy-status
[E] proxy-1 [T] f7ae9f07abc9b1e84b97697dffdfb8c8 [A] 192.168.30.113:11080 [P] 192.168.30.113:19000
[ ] proxy-2 [T] a286a410cd2fd31128fa12ed239881ed [A] 192.168.30.114:11080 [P] 192.168.30.114:19000
[ ] proxy-3 [T] 98f199c17e2679009905be3b94405bd9 [A] 192.168.30.115:11080 [P] 192.168.30.115:19000
[ ] proxy-4 [T] 5cc31d3d4906287bd791190bbfeb01d5 [A] 192.168.30.113:11080 [P] 192.168.30.113:19000

或用: /codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --list-proxy

强制删除报错的proxy:
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --remove-proxy --token=6a2db3c9ac07ba8857d4bc79ca6d191c  --force

[codisapp@mvxl2579 codis]$ /codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --proxy-status
[ ] proxy-2 [T] a286a410cd2fd31128fa12ed239881ed [A] 192.168.30.114:11080 [P] 192.168.30.114:19000
[ ] proxy-3 [T] 98f199c17e2679009905be3b94405bd9 [A] 192.168.30.115:11080 [P] 192.168.30.115:19000
[ ] proxy-4 [T] 5cc31d3d4906287bd791190bbfeb01d5 [A] 192.168.30.113:11080 [P] 192.168.30.113:19000

  codis-admin [-v] --dashboard=ADDR            --reinit-proxy  (--addr=ADDR|--token=TOKEN|--pid=ID|--all)

/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --reinit-proxy -all


/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --remove-proxy --addr=127.0.0.1:11080 --force

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

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

/codisapp/svr/codis/bin/codis-admin --proxy=192.168.30.113:11080 --auth="xxxxx" --shutdown

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


7.添加 Redis Server Group(只在一台上操作192.168.30.113,也可以在面板图形界面操作)

创建组:

/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080  --create-group   --gid=1
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080  --create-group   --gid=2
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080  --create-group   --gid=3

组添加服务器:

/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --group-add --gid=1 --addr=192.168.30.113:6379
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --group-add --gid=1 --addr=192.168.30.115:6380
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --group-add --gid=2 --addr=192.168.30.114:6379
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --group-add --gid=2 --addr=192.168.30.113:6380
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --group-add --gid=3 --addr=192.168.30.115:6379
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --group-add --gid=3 --addr=192.168.30.114:6380


把从库跟主库同步:
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --sync-action --create --addr=192.168.30.115:6380
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --sync-action --create --addr=192.168.30.114:6380
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --sync-action --create --addr=192.168.30.113:6380


若从库需要提升为master,操作如下:
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --promote-server --gid=1 --addr=192.168.30.115:6380


8.初始化 slots,并 设置 server group 服务的 slot 范围((只在一节点执行一次,192.168.30.113)    sid 是slot的编号

Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个
slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.

/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --slot-action --create-range --beg=0 --end=300 --gid=1
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --slot-action --create-range --beg=301 --end=601 --gid=2
/codisapp/svr/codis/bin/codis-admin --dashboard=192.168.30.113:18080 --slot-action --create-range --beg=602 --end=1023 --gid=3

五.相关命令和参数用法:
1.Codis Dashboard使用
启动参数说明:
$ ./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

Options:
    --ncpu=N                    最大使用 CPU 个数
    -c CONF, --config=CONF      指定启动配置文件
    -l FILE, --log=FILE         设置 log 输出文件
    --log-level=LEVEL           设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN
   
   
配置文件  参数 说明
coordinator_name 外部存储类型,接受 zookeeper/etcd
coordinator_addr 外部存储地址
product_name 集群名称,满足正则 \w[\w\.\-]*
product_auth 集群密码,默认为空
admin_addr RESTful API 端口


2.codis proxy使用

启动参数说明:
$ ./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
   
 配置文件参数说明:
 
 
product_name 集群名称,参考 dashboard 参数说明
product_auth 集群密码,默认为空
admin_addr RESTful API 端口
proto_type Redis 端口类型,接受 tcp/tcp4/tcp6/unix/unixpacket
proxy_addr Redis 端口地址或者路径
jodis_addr Jodis 注册 zookeeper 地址
jodis_timeout Jodis 注册 session timeout 时间,单位 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 表示禁止


3.codis-ha 说明

$ ./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
2.5.3 工作原理:

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

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

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

从 codis-dashboard 获取集群状态失败时;
向 codis-dashboard 发送主从切换指令失败时;
codis-ha 在以下状态下不会进行主从切换:

存在 proxy 状态异常:
因为提升主从需要得到所有 proxy 的确认,因此必须确保操作时所有 proxy 都能正常响应操作指令;
网络原因造成的 master 异常:
若存在 slave 满足 slave.master_link_status == up,通常可以认为 master 并没有真的退出,而是由于网络原因或者响应延迟造成的 master 状态获取失败,此时 codis-ha 不会对该 group 进行操作;
没有满足条件的 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 无法保证可靠性。

4.zk的查看操作

/codisapp/svr/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

zookeeper 查看  路径在/codis3/codis_test

删除所有数据  rmr /codis3/codis_test

slot:
ls /codis3/codis_test/slots

 前面initslots初始化的所有Slot都保存在slots路径下,每个Slot是一个结点。
 随便选取一个Slot结点,用get命令能够查看结点上附着的数据:get /codis3/codis_test/slots/slot-0208
 
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, 9f04676d4e82b2ba7e8f8c3a3faeee28]
[zk: 127.0.0.1:2181(CONNECTED) 5] get /zk/codis/db_hls_prod/proxy/9f04676d4e82b2ba7e8f8c3a3faeee28
{
    "addr": "10.16.30.104:19000",
    "start_at": "2016-07-01 16:42:39.219656807 +0800 CST",
    "state": "online",
    "token": "9f04676d4e82b2ba7e8f8c3a3faeee28"
}
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


7. 删除server group组的方法
 1.迁移其上面的slots
 2.删除即可


----------------------------------------------------------------------------------------------------------------------
其他参考:

(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这边的清理逻辑。
第三个可能更大些,看时间是6点多,是不是你们的访问量不大?

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服务出于运行状态,可以有多个 但是同时只能有一个服务出于running状态。

 


 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:171432次
    • 积分:3562
    • 等级:
    • 排名:第10314名
    • 原创:191篇
    • 转载:2篇
    • 译文:1篇
    • 评论:26条
    最新评论