设为首页 收藏本站
查看: 2522|回复: 0

[经验分享] codis集群搭建

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-7-7 09:32:27 | 显示全部楼层 |阅读模式
                      Codis简介

  Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 CodisProxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
Codis 由四部分组成:
Codis Proxy   (codis-proxy)
Codis Manager (codis-config)
Codis Redis   (codis-server)
ZooKeeper
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 交互才能正常运行.
Codis 依赖 ZooKeeper 来存放数据路由表和codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.
Codis 支持按照 Namespace 区分不同的产品, 拥有不同的 productname 的产品, 各项配置都不会冲突.
目前 Codis 已经是稳定阶段,目前豌豆荚已经在使用该系统。
架构:
QQ截图20160707093109.png
准备工作:
     下载安装包:可到官网下载最新版
jdk1.8.0_45
         Zookeeper-3.4.6
         Go1.6.2

创建目录:
    mkdir/data/packages

部署zookeeper

每个zookeeper节点上安装java环境
1
2
3
4
[iyunv@localhost ~]# cd /data/packages/
[iyunv@localhost packages]# tar xf jdk-8u91-linux-x64.tar.gz -C/usr/local/
[iyunv@localhost packages]# cd /usr/local/
[iyunv@localhost local]# ln -s jdk1.8.0_91 java



安装zookeeper
1
2
3
[iyunv@localhost packages]# tar xf zookeeper-3.4.6.tar.gz -C/usr/local/
[iyunv@localhost packages]# cd /usr/local/
[iyunv@localhost local]# ln -s zookeeper-3.4.6 zookeeper



设置java环境变量并生效
1
2
3
4
5
6
7
8
9
10
[iyunv@localhost local]# cat /etc/profile.d/java.sh
JAVA_HOME=/usr/local/java
JRE_HOME=$JAVA_HOME/jre
ZOOKEEPER_HOME=/usr/local/zookeeper
JAVA_FONTS=/usr/local/java/jre/lib/fonts
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ZOOKEEPER_HOME/bin
export JAVA_HOME PATH CLASSPATH JRE_HOME ZOOKEEPER_HOME

[iyunv@localhost local]# source /etc/profile.d/java.sh



修改zookeeper配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[iyunv@localhostlocal]#cp  /usr/local/zookeeper/conf/zoo_sample.cfg/usr/local/zookeeper/conf/zoo.cfg
[iyunv@localhost local]# vim /usr/local/zookeeper/conf/zoo.cfg
[iyunv@localhost local]# cat /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
server.1=192.168.0.152:2888:3888
server.2=192.168.0.154:2888:3888
server.3=192.168.0.155:2888:3888



按上面配置文件中设置创建数据目录和日志目录
1
2
mkdir –p /data/zookeeper/data
mkdir –p /data/zookeeper/logs



在每台zookeeper节点上创建myid,节点对应id
1
2
3
4
5
6
在第一台机上创建myid,对应配置文件中server.1
echo 1 > /data/zookeeper/data/myid
在第二台机上创建myid,对应配置文件中server.2
echo 2 > /data/zookeeper/data/myid
在第三台机上创建myid,对应配置文件中server.3
echo 3 > /data/zookeeper/data/myid



每台机器上面启动zookeeper;

1
2
3
4
[iyunv@node1 ~]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED



每台机上zookeeper启动后状态;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[iyunv@node1 ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

[iyunv@localhost local]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

[iyunv@localhost local]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower







部署codis集群
所有codis机器上安装go语言环境
1
2
3
4
5
6
7
8
9
cd /data/packages
[iyunv@node1 packages]# tar xf go1.6.2.linux-amd64.tar.gz -C/usr/local/
添加go环境变量并使用source读入使其生效;
[iyunv@node1 packages]# cat /etc/profile.d/go.sh
GOROOT=/usr/local/go
GOPATH=/usr/local/codis
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ZOOKEEPER_HOME/bin:$GOROOT/bin:$GOPATH/bin
export JAVA_HOME PATH CLASSPATH JRE_HOME ZOOKEEPER_HOME GOROOTGOPATH
[iyunv@node1 packages]# source /etc/profile.d/go.sh



所有codis节点安装codis(这里是使用go命令从git上下载然后执行make、make install操作,make时有点慢,不要着急!)
使用rpm –ql git来查看本机是否已安装git,如没有安装则使用yum命令自行安装即可;

1
2
3
4
[iyunv@node1 packages]# go get github.com/wandoulabs/codis
package github.com/wandoulabs/codis: no buildable Go source files in/usr/local/codis/src/github.com/wandoulabs/codis
[iyunv@localhost packages]# cd/usr/local/codis/src/github.com/wandoulabs/codis/
[iyunv@localhost codis]# make



注:如果make时报以下错误,说明是路径问题,使用下面方法解决;
QQ截图20160707093116.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[iyunv@node1 ~]# cd /usr/local/codis/src/github.com/
[iyunv@node1 github.com]# ln -s wandoulabs CodisLabs(如果不链接一个新路径,make时会报路径错误;曾经被误导好久,然后通过新路径进入)
[iyunv@node1 github.com]# cd CodisLabs/codis/
[iyunv@node1 codis]# make
[iyunv@node1 codis]# make gotest
安装完成后创建并复制文件;
[iyunv@node1 codis]# mkdir -p /usr/local/codis/{logs,conf,scripts}
[iyunv@node1 codis]# mkdir -p /data/codis_server/{logs,conf,data}
[iyunv@node1 codis]# cp -rf bin /usr/local/codis/
[iyunv@node1 codis]# cp config.ini /usr/local/codis/conf/
[iyunv@node1 codis]# cp extern/redis-2.8.21/redis.conf/data/codis_server/conf/
配置codis_proxy
[iyunv@node1 codis]# cat /usr/local/codis/conf/config.ini
coordinator=zookeeper
zk=192.168.0.152:2181,192.168.0.154:2181,192.168.0.155:2181
product=codis
dashboard_addr=192.168.0.152: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


[iyunv@localhost codis]# cat /usr/local/codis/conf/config.ini
coordinator=zookeeper
zk=192.168.0.152:2181,192.168.0.154:2181,192.168.0.155:2181
product=codis
dashboard_addr=192.168.0.152: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_2


[iyunv@localhost codis]# cat /usr/local/codis/conf/config.ini
coordinator=zookeeper
zk=192.168.0.152:2181,192.168.0.154:2181,192.168.0.155:2181
product=codis
dashboard_addr=192.168.0.152: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_3





所有codis机器修改配置文件并启动codis-server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[iyunv@node1packages]# cd /data/codis_server/conf/
[iyunv@node1 conf]# ls
redis.conf
[iyunv@node1 conf]# mv redis.conf 6379.conf
[iyunv@node1 conf]# vim 6379.conf
daemonize yes
pidfile /var/run/6379.pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/codis_server/logs/codis_6379.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename 6379.rdb
dir /data/codis_server/data
slave-serve-stale-data yes
slave-read-only yes




复制配置文件启动多实例
1
2
[iyunv@node1 conf]# cp 6379.conf 6380.conf
[iyunv@node1 conf]# sed -i 's/6379/6380/g' 6380.conf




启动codis服务
1
2
[iyunv@node1 conf]# /usr/local/codis/bin/codis-server/data/codis_server/conf/6379.conf
[iyunv@node1 conf]# /usr/local/codis/bin/codis-server/data/codis_server/conf/6380.conf







1
2
3
4
启动dashboard(可以写成脚本的形式)
/usr/local/codis/bin/codis-config /usr/local/codis/conf/config.inidashboard &
初始化solt(可以写成脚本的形式)
/usr/local/codis/bin/codis-config -c/usr/local/codis/conf/config.ini slot init –f





通过http://192.168.0.152:18087来打开网页
QQ截图20160707093123.png
添加servergroups,每一个server groups作为一个codis服务器组,且每一个组只有一个master多个slave;
1
2
3
4
5
6
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 1 192.168.0.152:6379 master
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 1 192.168.0.154:6380 slave
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 2 192.168.0.154:6379 master
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 2 192.168.0.155:6380 slave
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 3 192.168.0.155:6379 master
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini server add 3 192.168.0.152:6380 slave



QQ截图20160707093128.png
设置 servergroup 服务的 slot 范围 Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.
1
2
3
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini slot range-set 0 300 1 online
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini slot range-set 301 700 2 online
[iyunv@localhost scripts]# /usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini slot range-set 701 1023 3 online



QQ截图20160707093133.png
QQ截图20160707093138.png
配置codis-ha,实现codis-server的主从切换,主库挂了会提升一个从库为主库,从库挂了会将这个从库直接下线;注:任意一台配置即可;
1
2
3
4
5
6
7
8
9
10
[iyunv@localhost ~]# go get github.com/ngaut/codis-ha
[iyunv@localhost ~]# cd /usr/local/codis/src/github.com/ngaut/
[iyunv@localhost ngaut]# cp -r codis-ha /usr/local/
[iyunv@localhost ngaut]# cd /usr/local/codis
[iyunv@localhost codis]# cd ..
[iyunv@localhost local]# cd /usr/local/codis-ha/
[iyunv@localhost codis-ha]# go build
创建codis-ha启动脚本
[iyunv@localhost codis-ha]# vim /usr/local/codis-ha/start_codis_ha.sh
./codis-ha--codis-config=192.168.0.152:18087 -log-level="info" --productName=vmware-Codis&> ./logs/codis-ha.log &



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
创建日志目录
[iyunv@localhost codis-ha]# mkdir /usr/local/codis-ha/logs
启动codis-ha
[iyunv@localhost codis-ha]# sh start_codis_ha.sh
[iyunv@localhost codis-ha]# ps aux | grep codis-ha
root      51524  0.2 1.1 128584 11596 pts/1    Sl   00:15  0:00 ./codis-ha --codis-config=192.168.0.152:18087 -log-level=info--productName=vmware-Codis
root      51534  0.0 0.0 103252   836 pts/1    S+  00:20   0:00 grep codis-ha
现在把154机上codis主下线
[iyunv@localhost codis]# ps aux | grep codis
root      49177  0.1 1.1 141484 11684 ?        Ssl  20:47  0:20 /usr/local/codis/bin/codis-server *:6379                          
root      49181  0.1 0.9 137388  9624 ?        Ssl 20:47   0:18 /usr/local/codis/bin/codis-server*:6380                          
root      49295  0.0 0.0 103252   836 pts/0    S+  23:43   0:00 grep codis
[iyunv@localhost codis]# kill 49177
[iyunv@localhost codis]# ps aux | grep codis
root      49181  0.1 0.9 137388  9624 ?        Ssl  20:47  0:18 /usr/local/codis/bin/codis-server *:6380                          
root      49297  0.0 0.0 103252   832 pts/0    S+  23:43   0:00 grep codis



QQ截图20160707093145.png
现在codis就搭建好了,当然也可以部署keepalived+haproxy高可用负载,这里就不介绍了,有兴趣的可以自己找下相关文档;

                   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-240590-1-1.html 上篇帖子: Centos7上利用corosync+pacemaker+crmsh构建高可用集群 下篇帖子: 停更
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表