codis配置
codis集群配置
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
Codis 由四部分组成:
- Codis Proxy (codis-proxy)
- Codis Dashboard (codis-config)
- Codis Redis (codis-server)
- ZooKeeper/Etcd
- codis-proxy : 是客户端连接的Redis代理服务,codis-proxy 本身实现了Redis协议,表现得和一个原生的Redis没什么区别(就像Twemproxy),对于一个业务来说,可以部署多个codis-proxy,codis-proxy本身是没状态的。
- codis-config :是Codis的管理工具,支持包括,添加/删除Redis节点,添加/删除Proxy节点,发起数据迁移等操作,codis-config本身还自带了一个http server,会启动一个dashboard,用户可以直接在浏览器上观察Codis集群的状态。
- codis-server:是Codis项目维护的一个Redis分支,基于2.8.13开发,加入了slot的支持和原子的数据迁移指令,Codis上层的codis-proxy和codis-config只能和这个版本的Redis交互才能正常运行。
- ZooKeeper :用来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过ZooKeeper同步到各个存活的codis-proxy
a) 在codisproxy1 上部署编译环境
codis集群 |
|||
codisproxy1:19000 |
192.168.20.157 |
codisproxy1 |
|
codisproxy2 |
192.168.20.158 |
codisproxy2 |
|
redis1:6379 |
192.168.20.159 |
redis1 |
|
redis2:6379 |
192.168.20.160 |
redis2 |
|
redis3:6379 |
192.168.20.163 |
redis3 |
|
redis4:6379 |
192.168.20.164 |
redis4 |
[root@codisproxy1~]# wget https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz
[root@codisproxy1~]# tar -zxvf go1.6.2.linux-amd64.tar.gz
[root@codisproxy1~]# mv go /usr/local/
[root@codisproxy1~]# vim /etc/profile
在/etc/profile 文件中加入go的环境变量
export
GOROOT=/usr/local/go
export GOPATH=/data/gopath
export PATH=$GOROOT/bin:$PATH
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
[root@codisproxy1~]# source /etc/profile
[root@codisproxy1 ~]# go get -u -d github.com/CodisLabs/codis
[root@codisproxy1 ~]# go get github.com/tools/godep
切换到$GOPATH/src/github.com/CodisLabs/codis目录执行make命令编译代码,并执行make gotest来跑测试
[root@codisproxy1~]# cd /data/gopath/src/github.com/CodisLabs/codis
[root@codisproxy1 codis]# ls
[root@codisproxy1~]# make
[root@codisproxy1~]# make gotest
[root@codisproxy1~]# cd bin
执行全部指令后,会在 bin 文件夹内生成
codis-config、codis-proxy、codis-server三个可执行文件。另外, bin/assets 文件夹是
codis-config
的 dashboard http 服务需要的前端资源, 需要和 codis-config 放置在同一文件夹下)
对codis.tar.gz 目录进行打包,拷贝到其他服务器上
[root@codisproxy1
CodisLabs]# tar -zcvf codis.tar.gz codis/
[root@codisproxy1
CodisLabs]# scp codis.tar.gz codis_config:/data/
[root@codisproxy1
CodisLabs]# scp codis.tar.gz codisproxy1:/data/
[root@codisproxy1
CodisLabs]# scp codis.tar.gz codisproxy1:/data/
[root@codisproxy1
CodisLabs]# scp codis.tar.gz redis1:/data/
[root@codisproxy1
CodisLabs]# scp codis.tar.gz redis2:/data/
[root@codisproxy1
CodisLabs]# scp codis.tar.gz redis3:/data/
[root@codisproxy1
CodisLabs]# scp codis.tar.gz redis4:/data/
配置启动redis服务器192.168.20.159、160、163、164
b)
[root@redis1 data]# tar -zxvf codis.tar.gz
[root@redis1 extern]# cd /data/codis/extern/redis-2.8.21
[root@redis1 redis-2.8.21]# make PREFIX=/data/redis install
[root@redis1 redis-2.8.21]# mkdir /etc/redis/
[root@redis1 redis-2.8.21]# cp redis.conf /etc/redis/
[root@redis1 redis-2.8.21]# cp utils/redis_init_script
/etc/init.d/redis
[root@redis1 redis-2.8.21]# chmod +x /etc/init.d/redis
修改/etc/init.d/redis 文件
[root@redis1 redis-2.8.21]# mkdir /data/redis/run
[root@redis1 redis-2.8.21]# mkdir /data/redis/data/
[root@redis1
redis-2.8.21]# grep ^[a-z] /etc/redis/redis.conf
daemonize
yes
pidfile
/data/redis/run/redis.pid
maxmemory 2048mb 设置maxmeory可以在管理页面进行自动平衡。
port 6379
tcp-backlog
511
bind
0.0.0.0
timeout 0
tcp-keepalive
0
loglevel
notice
logfile
"/data/redis/logs"
databases
16
save 900
1
save 300
10
save 60
10000
stop-writes-on-bgsave-error
yes
rdbcompression
yes
rdbchecksum
yes
dbfilename
dump.rdb
dir
/data/redis/data
slave-serve-stale-data
yes
slave-read-only
yes
repl-diskless-sync
no
repl-diskless-sync-delay
5
repl-disable-tcp-nodelay
no
slave-priority
100
appendonly
no
appendfilename
"appendonly.aof"
appendfsync
everysec
no-appendfsync-on-rewrite
no
auto-aof-rewrite-percentage
100
auto-aof-rewrite-min-size
64mb
aof-load-truncated
yes
lua-time-limit
5000
slowlog-log-slower-than
10000
slowlog-max-len
128
latency-monitor-threshold
0
notify-keyspace-events
""
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
hll-sparse-max-bytes
3000
activerehashing
yes
client-output-buffer-limit
normal 0 0 0
client-output-buffer-limit
slave 256mb 64mb 60
client-output-buffer-limit
pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
[root@redis1 redis-2.8.21]# /etc/init.d/redis start
c)
condis_config服务配置,并启动dashboard
- [root@codis_config ~ ]# cd
/data - [root@codis_config data]# tar
-zxvf codis.tar.gz - [root@codis_config data]# cd
codis - 修改config.ini 配置文件
[root@codis_config
codis]# grep ^[a-z] config.ini
coordinator=zookeeper
zk=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
product=test
dashboard_addr=192.168.20.130:18087
password=
backend_ping_period=5
session_max_timeout=1800
session_max_bufsize=131072
session_max_pipeline=1024
zk_session_timeout=30000
proxy_id=proxy_1
启动codis-config dashboard,
[root@codis_config bin]# ./codis-config -c
../config.ini dashboard
2015/12/11 16:49:10 dashboard.go:160: [INFO] dashboard listening on addr: :18087
2015/12/11 16:49:10 dashboard.go:234: [PANIC] create zk node failed
[error]: dashboard already exists: {"addr": "172.31.16.30:18087", "pid": 7762}
解决办法:
这种问题是由于使用了kill -9导致了dashboard服务异常终止,而退出服务的时候没有在zk上清除自已的信息,所以就出现了这种问题。
所以我们在停止codis集群的任何服务的时候都不要轻易使用kill -9,可以使用kill.
如果使用kill,那么服务在终止的时候也会自动的到zk上清除自已的信息,下次再启动的时候会立刻注册。
临时性的解决办法就是:
登录到zookeeper服务器上
[root@zookeeper1 ~]#
/data/zookeeper/bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 3]
ls /
[zk, zookeeper]
# rmr
/zk/codis/db_codis_proxy_test/dashboard
访问地址为:http://192.168.20.130:18087/admin/
初始化 slots,该命令会在zookeeper上创建slot相关信息
[root@codis_config bin]# ./codis-config -c
../config.ini slot init
添加redis server group
每一个 Server Group 作为一个 Redis 服务器组存在, 只允许有一个 master, 可以有多个 slave, group id 仅支持大于等于1的整数
$
bin/codis-config -c ../config.ini 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
添加一个redis slave到该group
类似的,再添加group,group的id为2
把192.168.20.159 redis1 添加到
组id为1中,并设置为master
[root@codis_config bin]# ./codis-config -c
../config.ini server add 1 192.168.20.158:6379 master
把192.168.20.153 redis3 添加到
组id为1中,并设置为slave
[root@codis_config bin]# ./codis-config -c
../config.ini server add 1 192.168.20.163:6379 slave
把192.168.20.160 redis2 添加到
组id为2中,并设置为master
[root@codis_config bin]# ./codis-config -c
../config.ini server add 2 192.168.20.160:6379 master
把192.168.20.164 redis4 添加到
组id为2中,并设置为slave
[root@codis_config bin]# ./codis-config -c
../config.ini server add 2 192.168.20.164:6379 slave
查看group为1的内容
[root@codis_config bin]# ./codis-config -c
../config.ini server list
设置 server group 服务的 slot 范围
Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.
设置编号为[0, 511]的 slot 由 server group 1 提供服务
[root@codis_config bin]# ./codis-config -c ../config.ini slot range-set 0 511 1 online
{
"msg": "OK",
"ret": 0
}
[root@codis_config bin]# ./codis-config -c config.ini slot range-set 512 1023 2 online
启动 codis-proxy
[root@codisproxy1 bin]# nohup ./codis-proxy -c ../config.ini --log-level=info -L ../log/proxy.log --cpu=4 --add=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
[root@codisproxy2 bin]# nohup ./codis-proxy -c ../config.ini --log-level=info -L ../log/proxy.log --cpu=4 --add=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
codisproxy1 proxy_id = proxy_1
codisproxy2 proxy_id = proxy_2
刚启动的 codis-proxy 默认是处于 offline状态的, 然后设置 proxy 为 online 状态, 只有处于 online 状态的 proxy 才会对外提供服务
在 codisproxy1 192.168.20.157服务器上让proxy 启动,注意每给proxy 的 proxy_id不同
[root@codisproxy1 bin]# ./codis-config -c ../config.ini proxy on proxy_1
[root@codisproxy1 bin]# ./codis-config -c ../config.ini proxy on proxy_2
查看使用的codis_proxy代理列表
[root@codis_config bin]# ./codis-config -c ../config.ini proxy list
数据迁移
安全和透明的数据迁移是 Codis 提供的一个重要的功能, 也是 Codis 区别于 Twemproxy 等静态的分布式 Redis 解决方案的地方。
数据迁移的最小单位是 key, 我们在 codis redis 中添加了一些指令, 实现基于key的迁移, 如 SLOTSMGRT等 (命令列表), 每次会将特定 slot 一个随机的 key 发送给另外一个 codis redis 实例, 这个命令会确认对方已经接收, 同时删除本地的这个 k-v 键值, 返回这个 slot 的剩余 key 的数量, 整个操作是原子的.
在 codis-config 管理工具中, 每次迁移任务的最小单位是 slot
如: 将slot id 为 [0-511] 的slot的数据, 迁移到 server group 2上, --delay 参数表示每迁移一个 key 后 sleep 的毫秒数, 默认是 0, 用于限速.
$ bin/codis-config slot migrate 0 511 2 --delay=10
迁移的过程对于上层业务来说是安全且透明的, 数据不会丢失, 上层不会中止服务.
注意, 迁移的过程中打断是可以的, 但是如果中断了一个正在迁移某个slot的任务, 下次需要先迁移掉正处于迁移状态的 slot, 否则无法继续 (即迁移程序会检查同一时刻只能有一个 slot 处于迁移状态).
Auto Rebalance
Codis 支持动态的根据实例内存, 自动对slot进行迁移, 以均衡数据分布.
$ bin/codis-config slot rebalance
要求:
- 所有的codis-server都必须设置了maxmemory参数
- 所有的 slots 都应该处于 online 状态, 即没有迁移任务正在执行
- 所有 server group 都必须有 Master
HA
六、codis-server的HA
codis-ha实现codis-server的主从切换,codis-server主库挂了会提升一个从库为主库,从库挂了会设置这个从库从集群下线
1、安装
export GOPATH=/root/workspace
/go get github.com/ngaut/codis-ha
cd /root/workspace/src/github.com/ngaut/codis-ha
go build
cp codis-ha /data/codis/bin/
使用方法:
codis-ha --codis-config=192.168.20.157:18087(dashboard地址:18087) --productName=test(集群项目名称)
2、使用supervisord管理codis-ha进程
yum -y install supervisord
/etc/supervisord.conf中添加如下内容:
[program:codis-ha]
autorestart = True
stopwaitsecs = 10
startsecs = 1
stopsignal = QUIT
command = /data/codis/bin/codis-ha --codis-config=192.168.20.157:18087 --productName=test
user = root
startretries = 3
autostart = True
exitcodes = 0,2
3、启动 supervisord服务
systemctl start supervisord.service
systemctl enable supervisord.service
此时,ps -ef |grep codis-ha 你回发现codis-ha进程已经启动,这个时候你去停掉一个codis-server的master,看看slave会不会提升为master呢
codis配置的更多相关文章
- codis 配置
#修改dashboard.toml: coordinator_name = "zookeeper" coordinator_addr = "192.168.56.101: ...
- codis集群安装
在网上找了很多codis的集群安装方法,看起来都是大同小异,本人结合了大多种方法完成了一套自己使用的codis的集群安装,可以供大家学习使用,如果有什么问题或者不懂的地方欢迎指正 1.集群规划: 三台 ...
- Codis 集群搭建
Codis 集群搭建 1 安装go1.3.1 CentOS 7.0 安装go 1.3.1 1.1 下载go安装包 golang中国上下载 下载到Downloads下 1.2 解压 tar -zxf g ...
- 配置codis-dashboard
codis-dashboard主要用来codis配置使用,也就是说所有的相关的配置项必须通过此进程完成,本演习在60服务上配置测试. 利用codis本身提供的命令自动生成配置文件:1.生成dashbo ...
- codis+redis 集群搭建管理
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使 ...
- codis 使用
1:Jedis与Redisson对比 2.1. 概况对比 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持:Redisson实现了分布式和可扩展的Java数据 ...
- Codis的安装配置
codis是分布式redis解决方案 centos系统下安装codis需要安装相关的依赖,将图中的依赖上传至centos系统中 依次进行安装: 一.go环境的安装配置 解压到install目录下: . ...
- 烂泥:redis3.2.3安装与配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自 ...
- Codis——分布式Redis服务的解决方案
Codis——分布式Redis服务的解决方案 之前介绍过的 Twemproxy 是一种Redis代理,但它不支持集群的动态伸缩,而codis则支持动态的增减Redis节点:另外,官方的redis 3. ...
随机推荐
- 一些有用的HTML5 pattern属性
最近在做手机页面时,遇到数字输入的键盘的问题,之前的做法只是一刀切的使用 type="tel",不过一直觉得九宫格的电话号码键盘上的英文字母太碍事了.于是想要尝试其它的实现方案,最 ...
- OpenResy+Lua 利用百度识图 将图片地址解析成文字
LUA代码:(注:LUA里有一个调用百度识图的接口IP:123.125.115.189(stu.baidu.com),不知为什么我的虚拟机无法解析stu.baidu.com,所以我只能PING出IP来 ...
- 2015 CTSC & APIO滚粗记
o诶人太弱..... 记一发滚粗记以便治疗我的健忘症= = //文章会不定时修改,添加一些内容什么的...因此最好看一下刷新一下(因为有可能你正在看= =我正在写... 5.2 早上9点坐上长达11小 ...
- Android -- shape 定义控件的属性
<shape> <!-- 实心 --> <solid android:color="#ff9d77"/> <!-- 渐变 --> & ...
- Android -- EditText方法
1. 选择需要的内容 final EditText myEditText=(EditText)findViewById(R.id.editText1); //编辑框对象 myEditText.setT ...
- Notification Once
Notification Once 前段时间整理项目中的AppDelegate,发现很多写在- application:didFinishLaunchingWithOptions:中的代码都只是为了在 ...
- 20145330第五周《Java学习笔记》
20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...
- nodeJS代码实现计算交社保是否合适
本文通过nodejs的一个具体示例来对比分析现阶段我们交社保合不合适, 主要是对nodejs的一个小的应用,当然大家也可以改成其他语言的,程序猿们,来算算吧. 按一个普通程序员8000的月收入算就是1 ...
- 这世上倒底有没有神仙——说“Excel不是数据库,是不是犯了白马非马论的错误??
这问题是这样引出来的: 我上计算机应用基础课,讲到Excel,因为一直以来,很多新生对Word中的表格和Excel中的表格总是分不清,甚至有老师也问过我,Excel中的表格和Word中的表格有什么区别 ...
- hdu Sudoku Killer
简单的dfs,主要就是每个?处填的值是否满足条件的判断.这道题感觉考察的是输出格式的控制. #include"iostream" #include"stdio.h&quo ...