一、环境准备
软件版本:
centos 6.6
jdk 1.7.0_65(OS自带)
codis 3.0.3
Go1.4.2
zookeeper-3.4.8
机器信息:
zookeeper集群:
10.16.2.138
10.10.2.139
codis-config:
10.16.2.138
10.16.2.139
codis-proxy:
10.16.2.138:19000
10.10.2.139:19000
codis-server:
10.16.2.138:6379、10.16.2.139:6380(主、从)
10.10.2.139:6379、10.16.2.138:6380(主、从)
软件存放目录:/apps/software
1.需要用yum install 安装的基本包如下:
yum install xfs*
2.xfs文件系统挂载
建立xfs文件系统:
mkfs.xfs -f -i attr=2 -l lazy-count=1,sectsize=4096 -b size=4096 -d sectsize=4096 -L data /dev/sdb1
挂盘:
[root@mvxl2530 ~]# mkdir /apps
[root@mvxl2530 ~]# mount -o rw,noatime,nodiratime,noikeep,nobarrier,allocsize=100M,attr2,largeio,inode64,swalloc /dev/sdb1 /apps
3.禁用selinux和iptables
查看并禁用SELINUX:
cat /etc/selinux/config是有设置:SELINUX=disabled
若没有设置,需修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
禁用iptables
chkconfig iptables off
service iptables stop
4.内核参数设置:
vi /etc/sysctl.conf,参考下面参数增加或修改:
net.core.rmem_max = 4194304 #最大的TCP数据接收缓冲
net.core.wmem_max = 2097152 #最大的TCP数据发送缓冲
net.core.wmem_default = 262144 #表示接收套接字缓冲区大小的缺省值(以字节为单位)
net.core.rmem_default = 262144 #表示发送套接字缓冲区大小的缺省值(以字节为单位)
kernel.shmmni = 4096 #这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。通常不需要更改
kernel.sem = 250 32000 100 142
kernel.shmall = 2097152 #该参数表示系统一次可以使用的共享内存总量(以页为单位)。缺省值就是2097152,通常不需要修改
kernel.shmmax = 8589934592 #该参数定义了共享内存段的最大尺寸(以字节为单位),此值默认为物理内存的一半 (8G)
kernel.sysrq = 0 #如无需调试系统排查问题,这个必须为0
fs.file-max = 6815744 #该参数表示文件句柄的最大数量。文件句柄设置表示在Linux系统中可以打开的文件数量
fs.aio-max-nr = 1048576 # 该参数表示同时可以拥有的的异步IO请求数目
#Network
net.ipv4.tcp_syncookies = 1 #当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭。
net.ipv4.tcp_tw_reuse = 1 #允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1 #TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭,注意如果是nat-nat网络,并与net.ipv4.tcp_timestamps = 1组合使用,则会出现时断时续
的情况
net.ipv4.tcp_fin_timeout = 30 #修改系統默认的 TIMEOUT 时间
#避免服务器被大量的TIME_WAIT拖死
net.ipv4.tcp_keepalive_time = 1200 #当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.ip_local_port_range = 9000 65000 #如果连接数本身就很多,可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力,默认值是32768到61000
net.ipv4.tcp_max_syn_backlog = 8192 #SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数
net.ipv4.tcp_max_tw_buckets = 5000 #系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息,默认为180000
#net.ipv4.conf.all.rp_filter = 0
#net.ipv4.conf.all.arp_filter = 0
#net.ipv4.conf.default.rp_filter = 0
#net.ipv4.conf.default.arp_filter = 0
#net.ipv4.conf.lo.rp_filter = 0
#net.ipv4.conf.lo.arp_filter = 0
#net.ipv4.conf.em1.rp_filter = 0
#net.ipv4.conf.em1.arp_filter = 0
#net.ipv4.conf.em2.rp_filter = 0
#net.ipv4.conf.em2.arp_filter = 0
vm.swappiness=10
vm.overcommit_memory = 1
echo never > /sys/kernel/mm/transparent_hugepage/enabled --并加到/etc/rc.local中
echo "511">/proc/sys/net/core/somaxconn --并加到/etc/rc.local中
执行sysctl -p
不报错表示已有生效。
5.limit参数设置
vi /etc/security/limits.conf
root soft nofile 131072 #如果文件多,打开的文件句柄很多的话,可适当调大
root hard nofile 131072 #如果文件多,打开的文件句柄很多的话,可适当调大
root hard memlock 128849018880 #可选,如需设置大内存页,根据系统内存而定
root soft memlock 128849018880 #可选,如需设置大内存页,根据系统内存而定
root soft core unlimited
root hard core unlimited
root hard nproc unlimited
root soft nproc unlimited
root hard stack unlimited
root soft stack unlimited
6.配置DNS解析
vi /etc/resolv.conf
nameserver 10.16.0.100
nameserver 10.16.15.110
7.修改主机host
vi /etc/hosts
10.16.2.139 mvxl2531
10.16.2.138 mvxl2530
二、依赖环境安装
1、安装编译环境前的一些依赖安装(两台主机上执行)
yum install -y gcc make gcc-c++ automake lrzsz openssl-devel zlib-* bzip2-* readline* zlib-* bzip2-*Gitmercurial
2.安装go(两台主机上执行)
下载:
https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
解包:
cd /apps/software
tar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz
mkdir /apps/svr # 工作路径
#修改配置文件
vi /etc/profile
#profile文件修改如下:
export GOROOT=/usr/local/go
export GOPATH=/apps/svr
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$GOROOT/bin:$PATH
刷新配置文件:
source /etc/profile
查看go版本:
[root@mvxl2530 go]# go version
go version go1.4.2 linux/amd64
3.安装zookeeper(两台主机上执行)
下载:http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
cp /apps/software
tar -C /usr/local -xzf zookeeper-3.4.6.tar.gz
cd /usr/local/
mv zookeeper-3.4.6 zookeeper
cd /usr/local/zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
mkdir -p /apps/zookeeper/
修改zoo.cfg:
vim /usr/local/zookeeper/conf/zoo.cfg ##撰写zk的配置文件
maxClientCnxns=50
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/apps/zookeeper/
clientPort=2181
server.1=mvxl2530:2888:3888
server.2=mvxl2531:2888:3888
2888表示zookeeper程序监听端口,3888表示zookeeper选举通信端口。
echo "1" >/apps/zookeeper/myid ##生成ID,这里需要注意, myid对应的zoo.cfg的server.ID,比如第二台zookeeper主机对应的myid应该是2
#然后启动zookeeper
cd /usr/local/zookeeper/bin
./zkServer.sh start # 关闭 ./zkServer.sh stop
安装到这里,依赖环境已经全部完成。
若需停止,执行:
cd /usr/local/zookeeper/bin
./zkServer.sh stop
查看zk状态:
[root@mvxl2530 codis]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
查看相关信息:
[root@mvxl2530 zookeeper]# cd /usr/local/zookeeper
[root@mvxl2530 zookeeper]# ./bin/zkCli.sh -server 127.0.0.1:2181
4.goderp安装(两台主机上执行)
mkdir -p $GOPATH/src/github.com/tools
cd $GOPATH/src/github.com/tools
go get -u github.com/tools/godep
cd godep
[root@mvxl2530 godep]# go install ./ ---该命令会将 godep 生成到 $GOPATH/bin 下
which godep
将$GOPATH/bin加到/etc/profile中:
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
source /etc/profile
[root@mvxl2530 bin]# godep version
godep v66 (linux/amd64/go1.4.2)
三、安装codis(除包是在第一台机下载外,其它两台主机上执行)
1.下载和安装前准备(https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md)
执行:go get -u -d github.com/CodisLabs/codis
[root@mvxl2530 codis]# go get -u -d github.com/CodisLabs/codis
package github.com/CodisLabs/codis: no buildable Go source files in /apps/svr/src/github.com/CodisLabs/codis
将下载包copy到10.6.2.139主机上:
scp -r CodisLabs 10.16.2.139:/apps/svr/src/github.com/
cd /apps/svr/src/github.com/CodisLabs/codis
执行make
make时间比较长,当看到最后显示如下时,表示make完成:
Hint: It's a good idea to run 'make test' ;)
make[2]: Leaving directory `/apps/svr/src/github.com/CodisLabs/codis/extern/Redis-2.8.21/src'
make[1]: Leaving directory `/apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21'
再执行make gotest来跑下测试。
执行全部指令后,会在 bin 文件夹内生成 codis-config、codis-proxy、codis-server三个可执行文件。另外,bin/assets 文件夹是 codis-config 的 dashboard http 服务需要的前端资
源,需要和 codis-config 放置在同一文件夹下。
cd /apps/svr/src/github.com/CodisLabs/codis/bin
[root@mvxl2530 bin]# ls -ltr
total 39840
-rwxr-xr-x 1 root root 17151112 May 11 15:53 codis-proxy
-rwxr-xr-x 1 root root 17329080 May 11 15:53 codis-config
drwxr-xr-x 4 root root 35 May 11 15:53 assets
-rwxr-xr-x 1 root root 6311067 May 11 15:53 codis-server
配置:
codis-config 和 codis-proxy 在不加 -c 参数的时候,默认会读取当前目录下的 config.ini 文件
cd /apps/svr/src/github.com/CodisLabs/codis
cp config.ini config_138.ini
vi config_138.ini ##撰写配置文件
zk=10.16.2.138:2181,10.16.2.139:2181
product=gls
password=123456
proxy_id=codis-proxy_138
dashboard_addr=10.16.2.138:18087
vi config_139.ini ##撰写配置文件
zk=10.16.2.138:2181,10.16.2.139:2181
product=gls
password=123456
proxy_id=codis-proxy_139
dashboard_addr=10.16.2.138:18087
四、配置和启动各组件
1.启动 dashboard(两台机,只需启动一台机上的dashboard)
cd /apps/svr/src/github.com/CodisLabs/codis
执行./bin/codis-config -c ./config_138.ini dashboard &,该命令会启动 dashboard
以下是启动信息:
[1] 7177
2016/05/13 17:01:56 dashboard.go:160: [INFO] dashboard listening on addr: :18087
[root@mvxl2530 codis]# 2016/05/13 17:01:56 dashboard.go:143: [INFO] dashboard node created: /zk/codis/db_gls/dashboard,{"addr": "10.16.2.138:18087","pid": 7177}
2016/05/13 17:01:56 dashboard.go:144: [WARN] ********** Attention **********
2016/05/13 17:01:56 dashboard.go:145: [WARN] You should use `kill {pid}` rather than `kill -9 {pid}` to stop me,
2016/05/13 17:01:56 dashboard.go:146: [WARN] or the node resisted on zk will not be cleaned when I'm quiting and you must remove it manually
2016/05/13 17:01:56 dashboard.go:147: [WARN] *******************************
从上面信息可看到:
a.关闭dashboard的操作要用kil pid,不要用kill -9 pid
b.若关闭异常,下次启动时,会报错提示zk已有建立,此时需要删除 :/zk/codis/db_gls/dashboard,参考最后问题处理。
访问管理页面:http://10.16.2.138:18087,可以进行server group的增删操作、slot操作等。
2.配置和启动 Codis 的Redis(除配置文件scp外,其它两台机上都要操作)
mkdir -p /apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21/logs
考虑性能,主库关闭aof和rdp,从库只开启aof:
cd /apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21
cp redis.conf 6379.conf
cp redis.conf 6380.conf
将6379.conf更改以下参数(主库):
logfile "/apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21/logs/6379.log"
#save 900 1 ----关闭aof
#save 300 10
#save 60 10000
maxmemory 3g
dbfilename dump6379.rdb
appendfilename "appendonly6379.aof"
requirepass 123456
masterauth 123456
scp 6379.conf 10.16.2.139:/apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21/
将6380.conf更改以下参数(从库):
logfile "/apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21/logs/6380.log"
maxmemory 3g
#save 900 1 ----关闭aof
#save 300 10
#save 60 10000
port 6380
dbfilename dump6380.rdb
appendfilename "appendonly6380.aof"
appendonly yes
requirepass 123456
masterauth 123456
scp 6380.conf 10.16.2.139:/apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21/
检查并修改/etc/profile:
export GOROOT=/usr/local/go
export GOPATH=/apps/svr
export PATH=$GOROOT/bin:$PATH:$GOPATH/bin:/apps/svr/src/github.com/CodisLabs/codis/bin:/apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src
export CODIS_HOME=/apps/svr/src/github.com/CodisLabs/codis
export REDIS_HOME=/apps/svr/src/github.com/CodisLabs/codis/extern/redis-2.8.21
执行source /etc/profile
cd $CODIS_HOME
nohup codis-server $REDIS_HOME/6379.conf &
nohup codis-server $REDIS_HOME/6380.conf &
[root@mvxl2530 redis-2.8.21]# ps -ef|grep codis
root 14977 1 0 May11 ? 00:01:16 bin/codis-config dashboard
root 20344 1 0 09:48 ? 00:00:00 codis-server *:6379
root 20364 1 0 09:48 ? 00:00:00 codis-server *:6380
3.添加 Redis Server Group(只在一台上操作,也可以在面板图形界面操作)
cd $CODIS_HOME
./bin/codis-config -c ./config_138.ini server add 1 10.16.2.138:6379 master
./bin/codis-config -c ./config_138.ini server add 1 10.16.2.139:6380 slave
./bin/codis-config -c ./config_138.ini server add 2 10.16.2.139:6379 master
./bin/codis-config -c ./config_138.ini server add 2 10.16.2.138:6380 slave
4.初始化 slots(只在一节点执行一次)
执行 ./bin/codis-config -c ./config_138.ini slot init,该命令会在zookeeper上创建slot相关信息
5.设置 server group 服务的 slot 范围(只在一台执行)
Codis 采用 Pre-sharding 的技术来实现数据的分片,默认分成 1024 个 slots (0-1023),对于每个key来说,通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个
slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.
cd $CODIS_HOME
./bin/codis-config -c ./config_138.ini slot range-set 0 511 1 online
./bin/codis-config -c ./config_138.ini slot range-set 512 1023 2 online
6.启动 codis-proxy
节点一:
cd $CODIS_HOME
mkdir -p /apps/svr/src/github.com/CodisLabs/codis/log
nohup ./bin/codis-proxy -c ./config_138.ini -L ./log/proxy.log --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
节点二:
cd $CODIS_HOME
mkdir -p /apps/svr/src/github.com/CodisLabs/codis/log
nohup ./bin/codis-proxy -c ./config_139.ini -L ./log/proxy.log --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
刚启动的 codis-proxy 默认是处于 offline状态的,然后设置 proxy 为 online 状态,只有处于 online 状态的 proxy 才会对外提供服务(codis 3..0.3之前版本需要online操作)
节点一:
./bin/codis-config -c ./config_138.ini proxy online codis-proxy_138
节点二:
./bin/codis-config -c ./config_139.ini proxy online codis-proxy_139
五.遇到的问题
[root@mvxl2530 codis]# bin/codis-config dashboard &
[1] 14429
2016/05/11 17:45:30 dashboard.go:160: [INFO] dashboard listening on addr: :18087
[root@mvxl2530 codis]# 2016/05/11 17:45:30 dashboard.go:234: [PANIC] create zk node Failed
[error]: dashboard already exists: {"addr": "10.16.2.138:18087","pid": 13819}
[stack]:
3 /apps/svr/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard.go:234
main.runDashboard
2 /apps/svr/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard.go:54
main.cmdDashboard
1 /apps/svr/src/github.com/CodisLabs/codis/cmd/cconfig/main.go:85
main.runCommand
0 /apps/svr/src/github.com/CodisLabs/codis/cmd/cconfig/main.go:152
main.main
... ...
[1]+ Exit 1 bin/codis-config dashboard
原因:由于在停dashboard时,采用kill -9强杀进程方法引起,应采用kill pid方法来关闭dashboard.
临时处理:
[root@mvxl2530 zookeeper]# cd /usr/local/zookeeper
[root@mvxl2530 zookeeper]# ./bin/zkCli.sh -server 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTED) 1]
[zk: 127.0.0.1:2181(CONNECTED) 6] ls /zk/codis/db_zh_news/dashboard --其中zh_news为codis配置文件中的product
[fence,servers,slots,proxy,migrate_tasks,dashboard,LOCK,actions,ActionResponse]
[migrate_tasks,ActionResponse]
[zk: 127.0.0.1:2181(CONNECTED) 2] rmr /zk/codis/db_zh_news/dashboard
[zk: 127.0.0.1:2181(CONNECTED) 3]
六.相关命令和参数用法:
1.codis-config使用
[root@mvxl2530 bin]# ./codis-config -h
usage: codis-config [-c <config_file>] [-L <log_file>] [--log-level=<loglevel>]
<command> [<args>...]
options:
-c set config file
-L set output log file,default is stdout
--log-level=<loglevel> set log level: info,warn,error,debug [default: info]
commands:
server
slot
dashboard
action
proxy
[root@mvxl2530 bin]# ./codis-proxy -h
2.codis proxy使用
usage: proxy [-c <config_file>] [-L <log_file>] [--log-level=<loglevel>] [--log-filesize=<filesize>] [--cpu=<cpu_num>] [--addr=<proxy_listen_addr>] [--http-
addr=<debug_http_server_addr>]
options:
-c set config file
-L set output log file,debug [default: info]
--log-filesize=<maxsize> set max log file size,suffixes "KB","MB","GB" are allowed,1KB=1024 bytes,etc. Default is 1GB.
--cpu=<cpu_num> num of cpu cores that proxy can use
--addr=<proxy_listen_addr> proxy listen address,example: 0.0.0.0:9000
--http-addr=<debug_http_server_addr> debug vars http server
3.codis-config用于增删server组
每一个 Server Group 作为一个 Redis 服务器组存在,只允许有一个 master,可以有多个 slave,group id 仅支持大于等于1的整数。
命令说明:
$ bin/codis-config server -h
usage:
codis-config server list
codis-config server add <group_id> <redis_addr> <role>
codis-config server remove <group_id> <redis_addr>
codis-config server promote <group_id> <redis_addr>
codis-config server add-group <group_id>
codis-config server remove-group <group_id>
如: 添加两个 server group,每个 group 有两个 redis 实例,group的id分别为1和2, redis实例为一主一从。
添加一个group,group的id为1, 并添加一个redis master到该group
$ bin/codis-config server add 1 localhost:6379 master
添加一个redis slave到该group
$ bin/codis-config server add 1 localhost:6380 slave
类似的,再添加group,group的id为2
$ bin/codis-config server add 2 localhost:6479 master
$ bin/codis-config server add 2 localhost:6480 slave
若需要移除,参考如下:
./bin/codis-config -c ./config_139.ini server remove 1 10.16.2.139:6380
./bin/codis-config -c ./config_139.ini server remove 2 10.16.2.138:6380
./bin/codis-config -c ./config_139.ini server remove-group 1
./bin/codis-config -c ./config_139.ini server remove-group 2
redis-benchmark -h codis1 -p 19000 -n 1000000 -c 300 -r 1048576 -d 256 -t lpush ---压测
4.codis-config用于slot操作
命令说明:
$ bin/codis-config slot -h
usage:
codis-config slot init
codis-config slot info <slot_id>
codis-config slot set <slot_id> <group_id> <status>
codis-config slot range-set <slot_from> <slot_to> <group_id> <status>
codis-config slot migrate <slot_from> <slot_to> <group_id> [--delay=<delay_time_in_ms>]
如: 设置编号为[0,511]的 slot 由 server group 1 提供服务,编号 [512,1023] 的 slot 由 server group 2 提供服务
5.移除分片流程
---假设将分片3移除---
1. 设置codis-proxy为offline状态.
./bin/codis-config -c codis-config.ini proxy offline proxy_1
2. 迁移分片3上的数据到分片1
./bin/codis-config -c codis-config.ini slot migrate 256 511 1
3. 彻底移除分片3
./bin/codis-config -c codis-config.ini server remove-group 3
6.zk的查看操作 查看slot: ls /zk/codis/db_gls/slots proxy: ls /zk/codis/db_gls/proxy server: ls /zk/codis/db_gls/servers dashboard: ls /zk/codis/db_gls/dashboard 查看迁移任务: ls /zk/codis/db_gls/migrate_tasks