Redis-codis与Zookeeper的集群部署

所需文件

1. zookeeper-3.4.6
2. redis-3.0.1

1.安装zookeeper

#解压文件到指定目录/usr/local/下
tar xvzf zookeeper-3.4.6.tar.gz -C /usr/local/
#创建自己的zookeeper目录
mv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper
#给指定账户授权(可以省略)
chown -R vjifen.vjifen /usr/local/zookeeper

#zookeeper基础文件操作
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
cd /usr/local/zookeeper/conf/
mkdir -p /data/zookeeper/data/
mkdir -p /data/zookeeper/logs/
echo "1" > /data/zookeeper/myid (与配置文件zoo.cfg里面server.1对应)

#配置环境变量(和jdk环境变量配置类似)
vi /etc/profile
ZOOKEEPER_HOME=/usr/local/zookeeper
PATH=$PATH:$ZOOKEEPER_HOME/bin
export  ZOOKEEPER_HOME PATH 
source /etc/profile

#zookeeper的zoo.cfg配置
vim zoo.cfg 
tickTime=2000  //Zookeeper服务器之间或客户端与服务器之间的心跳时间
initLimit=10   //zookeeper集群中允许follower连接并同步到leader的初始化连接时间,tickTime的倍数来表示.当超过设置倍数的tickTime,则连接失败
syncLimit=5   //leader与follower之间发送消息,请求和应答时间长度.如果follower在设置的时间内不能与leader进行通信那么此follower将被丢弃
dataDir=/data/zookeeper1/data  //保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里
dataLogDir=/data/zookeeper1/logs  //存放日志目录
clientPort=2181  //监听客户端连接的端口
maxClientCnxns=60  //最大客户端并发连接数(通过IP来区分)
#autopurge.snapRetainCount=3  //垃圾清理频率,单位小时,默认0,表示不开启清理功能
#autopurge.purgeInterval=1   //垃圾清理需要保留的文件数目,默认是保留3个
#server.1=IP::2888:3888    
#server.2=slave-02:2888:3888    
#server.3=slave-03:2888:3888    

#启动zookeeper
#修改zookeeper启动内存:(可以不用)
vim /usr/local/zookeeper/bin/zkServer.sh
JVMPARAM="-Xms3072m -Xmx3072m"   //在49行加入
-cp "$CLASSPATH" $JVMPARAM $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &  //110行加入$JVMPARAM

#启动zookeeper:--/usr/local/zookeeper/bin/zkServer.sh
zkServer.sh start  
zkServer.sh status

针对zoo.cfg多个server说明:
//server.A=B:C:D:
//其中 A 是一个数字,表示这个是第几号服务器;
//B 是这个服务器的 ip 地址;
//C 表示的是这个服务器与集群中的Leader服务器交换信息的端口;
//D 表示的是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,
而这个端口就是用来执行选 举时服务器相互通信的端口。
//如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,
所以要给它们分配不同的端口号
//server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交
换消息所使用的端口.
//C配置选举leader时所使用的端口. 由于配置的是伪集群模式, 所以各个server的B, C参数必须不同.
参照 zookeeper0/conf/zoo.cfg,
//配置zookeeper1/conf/zoo.cfg, 和 zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir, clientPort参数即可.
//在之前设置的dataDir中新建myid文件, 写入一个数字, 该数字表示这是第几号server. 该数字必须和zoo.cfg文件中的server.X中的X一一对应.
//Users/apple/zookeeper0/data/myid文件中写入0, /Users/apple/zookeeper1/data/myid文件中写入1,
Users/apple/zookeeper2/data/myid文件中写入2.
//分别进入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin, /Users/apple/zookeeper2/bin三个目录, 启动server.
任意选择一个server目录, 启动客户端:

注意:
	dataDir,dataLogDir中的wwb是当前登录用户名,data,logs目录开始是不存在,需要使用mkdir命令创建相应的目录。
 	并且在该目录下创建文件myid;serve1,server2,server3指定的myid内容分别为1,2,3.
 	针对服务器server2,server3可以将server1复制到相应的目录,
 	不过需要注意dataDir,dataLogDir目录,并且文件myid内容分别为2,3
	zookeeper集群时,zookeeper要求半数以上的机器可用,zookeeper才能提供服务

2.安装配置Codis

Codis 并不太适合 key 少,但是 value 特别大的应用, 而且你的 key 越少, value 越大,最后就会退化成单个 redis 的
模型 (性能还不如 raw redis),所以 Codis 更适合海量 Key, value比较小 (<= 1 MB) 的应用。
codis-proxy 提供连接集群redis服务的入口
codis-redis-group 实现redis读写的水平扩展,高性能
codis-redis 实现redis实例服务,通过codis-ha实现服务的高可用

#安装go
su
tar -xvzf go1.4.1.linux-amd64.tar.gz -C /usr/local/
chown -R vjifen.vjifen /usr/local/go
mkdir /usr/local/codis

#配置环境变量
su vjifen
vi /etc/profile
GOROOT=/usr/local/go
GOPATH=/usr/local/codis
export PATH=$PATH:$GOROOT/bin GOROOT GOPATH
source /etc/profile 
#安装codis
su
yum install -y git make gcc gcc-c++
go get github.com/wandoulabs/codis
chown -R vjifen.vjifen /usr/local/codis/

cd /usr/local/codis/src/github.com/wandoulabs/codis
make MALLOC=libc //如果执行下一步报错,需要执行这一步
sh bootstrap.sh
mkdir -p /usr/local/codis/{log,start}

#注意:在github.com/wandoulabs/codis上下载的codis源码没有sample文件,在codis-2.0.2.tar.gz解压后发现sample存在,但bin不存在,相互中和使用下。(针对下面cp的命令)
cp -rf bin/ /usr/local/codis/
cp sample/config.ini /usr/local/codis/bin/
cp -rf sample/*.sh /usr/local/codis/start
cp -rf sample/config.ini /usr/local/codis/start
cp -rf sample/usage.md /usr/local/codis/start
cp sample/redis_conf/6381.conf /data/redis/7000/redis.conf
cp sample/redis_conf/6381.conf /data/redis/7001/redis.conf

#配置redis.conf (以7000端口为例)
vim /data/redis/7000/redis.conf
daemonize yes   //开启守护进程

#注意区分pidfile
pidfile /var/run/redis_7000.pid   //当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
port 7000   //redis监听端口
tcp-backlog 511   //TCP监听传输的最大队列长度
bind 127.0.0.1   //绑定客户端连接的网络接口地址
timeout 0   //当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
tcp-keepalive 60   //TCP通信的探测频率
loglevel notice   //定义日志级别

#注意区分logfile
logfile /data/redis/logs/redis_7000.log  //日志输出格式及目录
databases 16   //设置数据库的数目.默认数据库是 DB 0,你可以在每个连接上使用 select <dbid> 命令选择一个不同的数据库
save 900 1     //指定数据持久化策略,例如:900秒内至少有一个key值变化就写入.也可关闭持久化
save 300 10
save 60 10000
stop-writes-on-bgsave-error no //默认情况下,如果redis最后一次的后台保存失败,redis将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,否则就会没人注意到灾难的发生。如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了.
rdbcompression yes   //是否在dump.rdb数据库的时候使用LZF压缩字符串
rdbchecksum yes    //是否校验rdb文件

#注意区分dbfilename
dbfilename dump_7000.rdb   //指定数据库快照存储文件名
dir /data/redis/data   //指定dump.rdb存放位置
maxmemory 4096MB   //最大使用内存
maxmemory-policy volatile-lru   //使用LRU算法移除包含过期设置的key
appendonly no   //默认不开启AOF

配置codis-config和codis-proxy:
cd /usr/local/codis
vim config.ini
zk=localhost:2181  //zookeeper地址,如果是zookeeper集群可以这么写:zk=hostname1:2181,hostname2:2181,hostname3:2181.如果是etcd,则写成http://hostname1:port,http://hostname2:port,http://hostname3:port
product=vjifen  //产品名称,这个codis集群的名字,可以认为是命名空间,不同命名空间的codis没有交集
proxy_id=proxy_1  //proxy会读取,用于标记proxy的名字,针对多个proxy的情况,可以使用不同的config.ini,只需要更改proxy_id即可
net_timeout=5  //检测状态时间间隔	
dashboard_addr=localhost:18087  //dashboard服务地址,CLI的所有命令都依赖于dashboard的RESTful API,所以必须启动
coordinator=zookeeper  //说明使用的分布式服务器是zookeeper,如果用etcd则直接修改成etcd即可
#启动codis-redis服务
/usr/local/codis/bin/codis-server /data/redis/7000/redis.conf
/usr/local/codis/bin/codis-server /data/redis/7001/redis.conf
cat usage.md  //查看启动流程文档
0. start zookeeper       //启动zookeeper服务
1. change config items in config.ini  //修改codis配置文件
2. ./start_dashboard.sh  //启动 dashboard
3. ./start_redis.sh      //启动redis实例
4. ./add_group.sh        //添加redis组,一个redis组只能有一个master
5. ./initslot.sh         //初始化slot,会在zookeeper上创建slot相关信息
6. ./start_proxy.sh      //启动proxy
7. ./set_proxy_online.sh  //上线proxy项目
8. open browser to http://IP(123.57.211.100):18087/admin //访问web进入控制台

注意:有些顺序不是必须的,但启动dashboard前,必须启动zookeeper服务,这是必须的,后面有很多操作,都可以在web页面完成,例如添加/删除组,添加/删除redis实例等
除了web页面可以操作外,也可以使用一下命令添加/删除组,添加/删除redis实例

首先进入:/usr/local/codis/bin
#查看当前集群中组,redis实例的列表
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>  
#启动dashboard.sh
cd /usr/local/codis/start  
mv ../log/ start/     //log文件夹可以放到非系统盘,做软连接即可
./start_dashboard.sh

#看一下是否启动成功
ps -ef | grep dashboard   

注意:
1.在关闭start_dashboard.sh时需要使用kill pid语法,没有-9命令,否则再次启动时会出现无法启动;
如果误用了kill -9 的命令,解决方法是:进入zk的客户端,ls /zk/codis/db_vjifen,
然后删除rmr /zk/codis/db_vjifen/dashboard即可;
如果缓存数据未使用情况下也可以把整个db_vjifen删除掉即可,启动zookeeper后会自动再次创建。
2. ./initslot.sh //执行这一步时会提示找不到group,是因为还没有配置redies
注意:如果初始化槽失败(错误:500错误,多个代理需要停止清理),此时把配置文件中的127.0.0.1或者localhost修改成本机的IP

./start_proxy.sh   //启动codis-proxy.可修改start_proxy.sh文件,自定义启动参数
./set_proxy_online.sh  //让proxy上线,或点击页面上Proxy Status里的Mark Online.可修改set_proxy_online.sh文件,自定义启动参数

注意:由于codis-config启动的http server没有验证规则,所以如果从外网访问会很不安全,现有的方法是在服务器配置iptales规则做限制

配置codis-ha服务,主从自动切换。( 此环境在安装codis中的211.100机器上配置 )
[root@vmware-131 ~]# go get github.com/ngaut/codis-ha
[root@vmware-131 ~]# cd /usr/local/codis/src/github.com/ngaut
[root@vmware-131 ~]# cp -r codis-ha /usr/local/
[root@vmware-131 ~]# cd /usr/local/codis-ha
[root@vmware-131 codis-ha ]# go build
 
创建启动脚本,启动codis-ha服务(有时候go build后可能没有start_codis_ha.sh,
如果没有则需要直接使用命令:./codis-ha --codis-config=123.57.211.100<此IP要写对>:18087 -log-level="info" --productName=vjifen &> ./logs/codis-ha.log & 启动即可)
[root@vmware-131 ~]# vim /usr/local/codis-ha/start_codis_ha.sh
#!/bin/sh
./codis-ha --codis-config=123.57.211.100:18087 -log-level="info" --productName=vjifen &> ./logs/codis-ha.log &
 
创建日志目录
[root@vmware-131 ~]# mkdir /usr/local/codis-ha/logs
[root@vmware-131 ~]# cd /usr/local/codis-ha/
[root@vmware-131 codis-ha ]# sh start_codis_ha.sh

3.安装配置redis

如果不安装也可以使用codis中的codis-redis代替
其他服务器上装的redis,通过codis 的 dashboard 关联主从来使用

su
pwd
/home/vjifen
tar xvzf redis-3.0.1.tar.gz -C /usr/local/
mv /usr/local/redis-3.0.1/ /usr/local/redis 
chown -R vjifen.vjifen /usr/local/redis/
su vjifen
mkdir -p /data/redis/data ; mkdir /data/redis/logs
cd /usr/local/redis/

make
#make命令执行完成后,会在/usr/local/bin(bin下没有去看/usr/local/redis/src下)目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump,它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具.也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具

cp -a /usr/local/redis/redis.conf /data/redis/7000/redis.conf 
cp -a /usr/local/redis/redis.conf /data/redis/7001/redis.conf


#配置redis.conf (以7000端口为例)
vim /data/redis/7000/redis.conf
daemonize yes   //开启守护进程
pidfile /var/run/redis_7000.pid   //当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
port 7000   //redis监听端口
tcp-backlog 511   //TCP监听传输的最大队列长度
bind 127.0.0.1   //绑定客户端连接的网络接口地址
timeout 0   //当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
tcp-keepalive 60   //TCP通信的探测频率
loglevel notice   //定义日志级别
logfile /data/redis/logs/redis.log  //日志输出格式及目录
databases 16   //设置数据库的数目.默认数据库是 DB 0,你可以在每个连接上使用 select <dbid> 命令选择一个不同的数据库
save 900 1     //指定数据持久化策略,例如:900秒内至少有一个key值变化就写入.也可关闭持久化
save 300 10
save 60 10000
stop-writes-on-bgsave-error no //默认情况下,如果redis最后一次的后台保存失败,redis将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,否则就会没人注意到灾难的发生。如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了.
rdbcompression yes   //是否在dump.rdb数据库的时候使用LZF压缩字符串
rdbchecksum yes    //是否校验rdb文件
dbfilename dump.rdb   //指定数据库快照存储文件名
dir /data/redis/data   //指定dump.rdb存放位置
maxmemory 4096MB   //最大使用内存
maxmemory-policy volatile-lru   //使用LRU算法移除包含过期设置的key
appendonly no   //默认不开启AOF

#启动redis
/usr/local/redis/src/redis-server /data/redis/7000/redis.conf   
/usr/local/redis/src/redis-server /data/redis/7001/redis.conf 

以上分享纯属个人观点,欢迎大家来探讨!

如需转载,请注明作者出处
作者:hanshimeng
出处:https://blog.csdn.net/hanshimeng

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值