Redis集群解决方案-Codis
Codis由豌豆荚于2014年11月开源,基于go和c开发,是近期涌现的、国人开发的优秀开源软件之一,稳定性极高,性能更是改善了很多。Codis由四部分组成:
codis-proxy:codis-proxy是客户端连接的Redis代理服务,codis-proxy本身实现了Redis协议,表现得和一个原生Redis没什么区别,对于一个业务来说,可以部署多个codis-proxy,codis-proxy本身是无状态的
codis-config:codis-config是Codis的管理工具,支持添加/删除Redis节点,同时会启动一个dashboard的服务,可通过web界面来直接观察Redis集群运行的状态
codis-server:codis-server是codis项目维护的一个Redis分支,基于2.8.13开发,加入了solt的支持原理的数据迁移指令。Codis上层的codis-proxy、codis-config只能和这个版本的Redis交互才能够正常运行
zookeeper:Codis依赖zookeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过zookeeper同步到各个codis-proxy节点,zookeeper还维护codis-server group信息,并提供分布式锁等服务。
Codis的特性:
1、自动平衡
2、使用非常简单,可通过web界面来管理
3、图形化的面板和管理工具
4、支持绝大多数Redis命令,完全兼容twemproxy
5、支持Redis原生客户端
6、安全而完全透明的数据移植,可根据需要轻松添加和删除节点
7、提供命令行接口
IP/主机名
部署服务
10.10.73.148/node1 codis+zookeeper
10.10.73.149/node2 codis-zookeeper
10.10.73.192/node3 codis+dashboard
一、提供java环境,Zookeeper以及Go依赖于java(node1、node2、node3)
1
2
# mkdir -pv /opt/java
# tar -xf /root/jdk-7u51-linux-x64.tar.gz -C /opt/java/
二、提供Go语言,Codis服务依赖Go语言(node1、node2、node3)
1
# tar -xf /root/go1.6.linux-amd64.tar.gz -C /usr/local/
三、编辑"/etc/hosts"(node1、node2、node3)
1
2
3
4
5
6
# vim /etc/hosts
10.10.73.148node1
10.10.73.149node2
10.10.73.192node3
####node2、node3和node1一样
四、在node1、node2服务器上部署Zookeeper服务(node1、node2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# mkdir /opt/app/zookeeper -pv
# cd /opt/app/zookeeper/
# wget
# tar -xf zookeeper-3.4.8.tar.gz
# cd zookeeper-3.4.8
# pwd
/opt/app/zookeeper/zookeeper-3.4.8
# cp conf/zoo_sample.cfg conf/zoo.cfg ##"zoo.cfg"为"zookeeper"的配置文件
# vim conf/zoo.cfg
tickTime=2000 ##指明服务端(Leader)和客户端(Follower)之间的心跳时间间隔,单位为ms
initLimit=10 ##指定容忍心跳检测失败的最大次数
syncLimit=5 ##指定Leader和Folloer之间发送消息,请求和应答的时常,不能大于’tickTime’的值
dataDir=./data/ ##指定数据存储路径,需创建
dataLogDir=./logs ##指明日志存储路径,需创建
server.148=node1:2888:3888 ##指明zookeeper节点,148表示每台zookeeper标号,2888表示zookeeper监听端口,3888表示leader选举端口
server.149=node2:2888:3888
clientPort=2181 ##指明客户端连接服务端的端口
# mkdir data logs
# cat data/myid
148 ##指明zookeeper当前节点的标示符
#####以上操作均在node1节点上操作,node2节点同样如此,需要注意的是node2节点下的data/myid应为149
五、提供环境环保,编辑"/etc/profile"(node1、node2、node3)
1
2
3
4
5
6
7
8
9
10
11
# vim /etc/profile
exportPATH=$PATH:/usr/local/go/bin
exportJAVA_HOME=/opt/java/jdk1.7.0_51
exportPATH=$JAVA_HOME/bin:$PATH
exportGOPATH=/opt/app/product ##codis的路径,下面由”$GOPATH”表示
exportPATH=$PATH:$GOPATH/bin
exportCLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
exportCLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
# source /etc/profile ##重载配置文件
# go version ##检测环境变量配置是否成功
go version go1.6 linux/amd64
六、安装codis服务(node1、node2、node3)
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
# pwd
/opt/app/product
# cd $GOPATH/src/github.com/CodisLabs/codis/
# make
make: Leaving directory `/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src'
make: Leaving directory `/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21'
# make gotest
? github.com/CodisLabs/codis/cmd/cconfig
? github.com/CodisLabs/codis/cmd/proxy ##出现以上内容表示codis安装成功
# mkdir -pv logs data conf
# vim config.ini
zk=node1:2181,node2:2181 ##指明zookeeper节点的IP和端口
product=ch_wtc ##定义数据库
dashboard_addr=10.10.73.192:18087 ##定义dashboard节点,监听端口为18087
password=wtc.com ##slave连接master的密码
proxy_id=proxy_148 ##定义proxy节点的id
# cd /conf
# wget https://github.com/ijonas/dotfiles/raw/master/etc/redis.conf --no-check-certificate
# ll
total 24
-rw-r--r-- 1 root root 23350 Aug 30 11:02 redis.conf
# cp redis.conf redis_9736.conf
# cp redis.conf redis_9746.conf
# vim redis_9736.conf
pidfile ./data/redis_9736.pid
port 9736
logfile ./logs/redis_9736.log
dbfilename dump_9736.rdb
dir ./data/redis_9736
masterauth wtc.com ##开启认证功能
requirepass wtc.com ##指定密码,必须与”config.ini’配置文件中的password值一样
# vim redis_9746.conf
pidfile ./data/redis_9746.pid
port 9746
logfile ./logs/redis_9746.log
dbfilename dump_9746.rdb
dir ./data/redis_9746
masterauth wtc.com
requirepass wtc.com
####以上操作均在node1节点上运行,node2、node3节点操作方式和node1一样
七、上述操作完成后,分别启动zookeeper、codis-server、dashboard、codis-proxy
1、启动zookeeper(node1、node2)
1
2
3
4
5
6
7
8
9
10
# pwd
/opt/app/zookeeper/zookeeper-3.4.8
# bin/zkServer.sh start ##node1
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# bin/zkServer.sh start ##node2
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2、启动codis-server(node1、node2、node3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# pwd
/opt/app/product/src/github.com/CodisLabs/codis
# bin/codis-server conf/redis_9736.conf
# bin/codis-server conf/redis_9746.conf
# ps aux | grep codis
root 15970.00.1 1373889432 ? Ssl11:58 0:00 bin/codis-server *:9736
root 16010.00.1 1373889432 ? Ssl11:59 0:00 bin/codis-server *:9746
注意:如果启动失败,可查看错误日志
# pwd
/opt/app/product/src/github.com/CodisLabs/codis
# cat logs/redis_9736.log
29 Aug 16:44:17.121 # Can't chdir to './data/redis_9736': No such file or directory
解决办法:在相应的目录下创建相应的文件即可--./data/redis_9736
3、启动dashboard(node3),并经行初始化
1
2
3
4
5
6
7
8
9
# nohup bin/codis-config dashboard >./logs/dashboard.log 2>&1 &
4891
# ps aux | grep dashboard
root 48910.50.1 2818768296 pts/1 Sl 11:59 0:00 bin/codis-config dashboard
# bin/codis-config slot init ##进行初始化,之后建立组关系
{
"msg": "OK",
"ret": 0
}
八、对各个节点建立组关系(node3)
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
# bin/codis-config server add 1 node1:9736 master
{
"msg": "OK",
"ret": 0
}
# bin/codis-config server add 1 node2:9746 slave
{
"msg": "OK",
"ret": 0
}
# bin/codis-config server add 2 node2:9736 master
{
"msg": "OK",
"ret": 0
}
# bin/codis-config server add 2 node3:9746 slave
{
"msg": "OK",
"ret": 0
}
# bin/codis-config server add 3 node3:9736 master
{
"msg": "OK",
"ret": 0
}
# bin/codis-config server add 3 node1:9746 slave
{
"msg": "OK",
"ret": 0
}
##总共分了三个组
1、node1为主、node2为从
2、node2为主、node3为从
3、node3为主、node1为从
九、对每个组进行solt范围划分,并启动proxy,设置为online(node3)
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
# bin/codis-config slot range-set 0 340 1 online
{
"msg": "OK",
"ret": 0
}
# bin/codis-config slot range-set 341 681 2 online
{
"msg": "OK",
"ret": 0
}
# bin/codis-config slot range-set 682 1023 3 online
{
"msg": "OK",
"ret": 0
}
# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 &
# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 &
# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 &
#bin/codis-config -c config.ini proxy online proxy_148 ##node1
{
"msg": "OK",
"ret": 0
}
# bin/codis-config -c config.ini proxy online proxy_149 ##node2
{
"msg": "OK",
"ret": 0
}
# bin/codis-config -c config.ini proxy online proxy_192 ##node3
{
"msg": "OK",
"ret": 0
}
问题总结:
1、在搭建Redis集群时,一定要配置"/etc/hosts",否则启动dashboard时失败
2、"config.ini"和"redis_97(3|4)6"中的"password"一样
3、通过dashboard对Redis集群进行分组所使用的solt范围为"0-1023"
4、dashboard启动成功后,一定要进行初始化,查看是否初始化可通过zookeeper节点来查看
1
2
3
4
5
6
7
8
9
# pwd ##node1
/opt/app/zookeeper/zookeeper-3.4.8
# sh bin/zkCli.sh
ls /zk/codis
ls /zk/codis/db_wtc
####若出现了"slots",则说明进行了初始化(用于定义solt范围)
您好,我有个问题想请教一下,为什么我 go get github.com/wandoulabs/codis make 执行完成以后bin/目录里面没有 codis-config 这个文件呢,谢谢
页:
[1]