Codis3.x有如下特点:
通过rpm -qa|grep yum检查包是否安装
配置本地yum源,安装过程中可能需要安装一些依赖组件。
检查点:
gcc
机器是本地虚拟机
IP | 配置 | 机器名 | 安装服务 |
---|---|---|---|
192.168.113.131 | 处理器1CPU 内存2G 硬盘20G | redis1 | Zookeeper,codis-server, codis-dashboard, codis-fe,codis-proxy, redis-sentinel |
192.168.113.132 | 处理器1CPU 内存1G 硬盘20G | redis2 | Zookeeper,codis-server, redis-sentinel |
192.168.113.133 | 处理器1CPU 内存1G硬盘20G | redis3 | Zookeeper,codis-server, redis-sentinel |
rpm -e java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64 --nodeps
rpm -e java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64 –nodeps
tar –zxvf jdk-8u161-linux-x64.tar.gz –C /usr/local/java
export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export JRE_HOME=/usr/local/java/jdk1.8.0_161/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
PS:此种修改方式是系统级,即对所有用户生效,请在专属服务器上采用这种配置。
如果能正常打印版本信息说明安装正常,恭喜你完成了第一步。
使用vim /etc/hosts,修改HOSTS文件,增加:
192.168.113.131 redis1
192.168.113.132 redis2
192.168.113.133 redis3
下载地址https://www.apache.org/dyn/closer.cgi/zookeeper/
选用zookeeper-3.4.10.tar.gz版本
将zookeeper安装包上传至192.168.113.132的 /home/zookeeper 路径下。
使用远程拷贝命令,拷贝至其他两台ZK机器。
scp ./zookeeper-3.4.10.tar.gz root@192.168.113.132:/home/zookeeper
scp ./zookeeper-3.4.10.tar.gz root@192.168.113.133:/home/zookeeper
以下命令需要在全部ZK节点执行
解压zookeeper至/usr/local 执行命令:
tar -zxvf /home/zookeeper/zookeeper-3.4.10.tar.gz -C /usr/local/
此步骤的目的是:每次启动服务就不需要定位到Zookeeper的bin目录了
使用vim /etc/profile 将以下语句写入全局配置文件中
#zookeeper
export ZK_HOME=/usr/local/zookeeper-3.4.10
export PATH=$ZK_HOME/bin:$PATH
进入配置文件路径
cd $ZK_HOME/conf
拷贝安装包里面的示例配置:
cp zoo_sample.cfg zoo.cfg
编辑zoo.cfg文件,具体配置如下:
dataDir=/usr/local/zookeeper-3.4.10/data
clientPort=2181
server.0=192.168.113.131:2888:3888
server.1=192.168.113.132:2888:3888
server.2=192.168.113.133:2888:3888
创建临时文件夹
在$ZK_HOME下创建data目录,并创建myid文件写入对应server的ID。
拿192.168.113.131举例来说,执行以下步骤:
进入目录cd $ZK_HOME
创建文件夹mkdir data
创建myid文件,vim myid
然后写入0保存退出即可(其他服务器重复以上步骤,填入对应的serverid即可)
启动ZK
确认防火墙已经关闭
关闭防火墙
确认防火墙已关闭
#命令:
service iptables status
#输出:
iptables: Firewall is not running.
如果防火墙处于安全上的考量不能关闭,请配置ZK相关端口可以通过防火墙(以下命令供参考)
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=3888/tcp –permanent
systemctl restart firewalld
确认防火墙关闭后
可以在任意目录运行(前提是配置了$ZK_HOME):zkServer.sh start,三台机器启动完成以后,运行zkServer.sh status,检查ZK服务是否正常。
判断服务器平台,下载对应的GO语言包,本地使用X86平台,下载“go1.9.2.linux-amd64.tar.gz”包点此下载,将压缩包上传至/home/go/go1.9.2.linux-amd64.tar.gz
在/usr/local/路径下创建go目录,mkdir /usr/local/go,然后执行解压命令
tar -zxvf /home/go/go1.9.2.linux-amd64.tar.gz -C /usr/local/go
创建GO工作目录:mkdir $HOME/godir
配置环境变量,修改/etc/profile,添加如下语句:
#GO相关环境变量
export GOROOT=/usr/local/go
export GOPATH=$HOME/godir
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin
注意检查/usr/local/go路径下是否嵌套一层go目录,将文件转移到上一层目录。
检查GO是否安装成功,执行命令: go version
如果出现如下所示:
原因是安装错了二进制编译包,64位系统不能安装32位编译包。
如下结果表示安装正确
接下来将GO语言环境安装到全部的Codis集群节点。
只需要在一台机器上编译,将编译完的文件拷贝至其他节点即可。
下载地址:https://github.com/CodisLabs/codis/releases
上传至:/home/go 执行解压命令:
unzip -o codis-release3.2.zip -d ./codis-release3.2
进入解压后的目录,执行make
没有安装git,下载地址https://mirrors.edge.kernel.org/pub/software/scm/git/
$ tar -zxvf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
如果配置了本地yum源可直接使用:yum install git 安装,自动解析依赖关系,可以避免很多莫名其妙的问题。
下载Codis源码,执行:
Git命令:git clone https://github.com/CodisLabs/codis.git
或者:go get github.com/CodisLabs/codis,
会将文件下载至$GOPATH中,必须是这个路径$GOPATH/src/github.com/CodisLabs/,不然会编译失败。
codis-release-src-fromgit.zip是我本地基于x86_64平台编译完成的文件,建议读者自行编译。
编译完成后,将源码目录下bin和config文件夹拷贝至/usr/local/codis下的bin和config文件夹。
Codis3.2是基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.113.131 | redis1 | codis-server:(6379&6380) |
02 | 192.168.113.132 | redis2 | codis-server:(6379&6380) |
03 | 192.168.113.133 | redis3 | codis-server:(6379&6380) |
修改主配置
#cd /usr/local/codis/config/
#cp redis.conf redis-6379.conf # 主配置
#vim redis-6379.conf # 修改配置
#以下为修改项,配置文件较长,请看仔细。
#bind 127.0.0.1 #一定要注释掉这行,表示redis只接受本地访问无法远程访问
protected-mode no
port 6379 # 绑定端口
pidfile /usr/local/codis/proc/redis_6379.pid # 进程ID文件路径
loglevel warning#可选修改只打印warn及以上的日志
logfile "/usr/local/codis/log/redis_6379.log" # 日志文件路径
dbfilename dump_6379.rdb # dump文件
dir /usr/local/codis/data/redis_data_6379 # dump路径
masterauth "123456" #可选配置 Master密码(从主同步密码)
requirepass "123456" # 可选配置,鉴权密码(客户端连接密码)
修改从配置
#cd /usr/local/codis/config/
#cp redis.conf redis-6380.conf # 主配置
#vim redis-6380.conf # 修改配置
#以下为修改项,配置文件较长,请看仔细。
#bind 127.0.0.1 #一定要注释掉这行,表示redis只接受本地访问无法远程访问
protected-mode no # 关闭保护模式
port 6380 # 绑定端口
pidfile /usr/local/codis/proc/redis_6380.pid # 进程ID文件路径
loglevel warning #可选配置,只打印warning及以上的日志
logfile "/usr/local/codis/log/redis_6380.log" # 日志文件路径
dbfilename dump_6380.rdb # dump文件
dir /usr/local/codis/data/redis_data_6380 # dump路径
masterauth "123456" # 建议配置 Master密码(从主同步密码)
requirepass "123456" # 建议配置,鉴权密码(客户端连接密码)
所需目录logfile和dir对应文件夹需要自行创建
mkdir /usr/local/codis/proc
mkdir /usr/local/codis/log
mkdir /usr/local/codis/data
mkdir /usr/local/codis/data/redis_data_6379
mkdir /usr/local/codis/data/redis_data_6380
配置完成后,将codis文件夹拷贝至其他两台机器。
scp /usr/local/codis/* root@192.168.113.132:/usr/local/codis
scp /usr/local/codis/* root@192.168.113.133:/usr/local/codis
然后启动
cd /usr/local/codis
./bin/codis-server ./config/redis-6379.conf
./bin/codis-server ./config/redis-6380.conf
cd /usr/local/codis/log目录查看启动日志,是否正常启动。
ps –ef|grep codis,可以看到有两个codis进程如图:
#启动 Codis-Server 以后后续使用 Codis-fe 或者 Codis-admin 将节点添加到集群
作用:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
1.对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
2.所有对集群的修改都必须通过 codis-dashboard 完成。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.113.131 | redis1 | codis-dashborad:18080、codis-fe:18090 |
修改配置
使用codis工具生成配置
#cd /usr/local/codis/bin/
./codis-dashboard --default-conifg | tee ../config/dashboard.conf #生成配置
修改配置vim …/conf/dashboard.conf # 修改配置
coordinator_name = "zookeeper" # 外部存储类型
coordinator_addr = "redis1:2181, redis2:2181, redis3:2181" # 外部存储IP列表
product_name = "mot-codis" # 项目名称
product_auth = "123456" # 集群密码(注意:需要与redis配置中的requirepass保持一致)
admin_addr = "0.0.0.0:18080" # RESTful API 端口
启动程序
cd /usr/local/codis/bin
#--ncpu=24表示dashboard可以使用的CPU个数
#--config表示dashboard使用的配置文件
nohup ./codis-dashboard --ncpu=24 --config=/usr/local/codis/config/dashboard.conf --log=/usr/local/codis/log/dashboard.log --log-level=WARN & #启动程序(注意:使用绝对路径)
验证一下:ss -ntplu |grep codis-dashboard,结果如图:
启动参数描述如下:
序号 | 参数 | 描述 | 备注 |
---|---|---|---|
01 | –ncpu | 最大使用CPU个数 | 建议给当前服务器最大CPU数量 |
02 | –config | 指定加载的配置文件路径 | 使用绝对路径 |
03 | –log | 指定日志输出路径 | 使用绝对路径 |
02 | –log-level | 指定日志级别 | 取值:INFO、WARN、DEBUG、ERROR,推荐使用WRAN. |
完成以上2个步骤后,便完成了对codis-config的安装。
关闭程序
如果想关闭dashboard服务,可执行:
cd /usr/local/codis/bin
./codis-admin --dashboard=192.168.113.131:18080 --shutdown
作用:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
1.对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
2.不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
部署:按照2.1中的用途规划,将在如下机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.113.131 | redis1 | codis-proxy |
使用codis-proxy生成一份默认配置
cd /usr/local/codis/bin/
./codis-proxy --default-config | tee ../config/proxy.conf #生成配置
修改默认配置
#vim ../proxy.conf #修改配置
product_name = "mot-codis" # 设置项目名
product_auth = "" # 设置登录dashboard的密码(注意:与redis中requirepass一致)
# Set auth for client session
# 1. product_auth is used for auth validation among codis-dashboard,
# codis-proxy and codis-server.
# 2. session_auth is different from product_auth, it requires clients
# to issue AUTH before processing any other commands.
session_auth = "" # codis客户端通过codis-proxy登录密码(注意:与redis中requirepass不一致)
# Set bind address for admin(rpc), tcp only.dashboard.conf文件中admin_addr
admin_addr = "0.0.0.0:11080"
# Set bind address for proxy, proto_type can be “tcp”,”tcp4”, “tcp6”, “unix” or “unixpacket”.
proto_type = "tcp4"
proxy_addr = "0.0.0.0:19000" #绑定端口(codis客户端连接此端口)
# 外部存储
jodis_name = "zookeeper" # 外部存储类型
jodis_addr = "redis1:2181,redis2:2181,redis3:2181" # 外部存储列表(Zookeeper地址列表)
jodis_timeout = "20s"
#会话设置
session_recv_timeout = "0s" #如果不为0可能导致应用程序出现”write: broken pipe”的问题
#备注:其他参数使用默认配置….
nohup ./codis-proxy --ncpu=24 --config=../config/proxy.conf --log=../log/proxy.log --log-level=WARN &
程序codis-proxy启动后,仍然处于waiting状态,虽然侦听了proxy_addr端口,但是不会accept连接请求。只有将codis-proxy加入到集群并完成集群状态的同步,才能将状态改为online。最终才能accept连接请求。
作用:Redis官方推荐的高可用性(HA)解决方案。它可以实现对Redis的监控、通知、自动故障转移。如果Master不能工作,则会自动启动故障转移进程,将其中的一个Slave提升为Master,其他的Slave重新设置新的Master服务。
部署:按照2.1中的部署规划,将在如下机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.113.131 | redis1 | redis-sentinel:26379 |
02 | 192.168.113.132 | redis2 | redis-sentinel:26379 |
03 | 192.168.113.133 | redis3 | redis-sentinel:26379 |
cd /usr/local/codis/
vim ./config/sentinel.conf
修改为如下所示:
bind 0.0.0.0
protected-mode no
port 26379
dir /usr/local/codis/data
备注:其他结点的配置与此一致。
cd /usr/local/codis/bin/
nohup ./redis-sentinel ../config/sentinel.conf &
作用:集群管理界面。
1.多个集群实例共享可以共享同一个前端展示页面;
2.通过配置文件管理后端codis-dashboard列表,配置文件可自动更新。
部署:按照2.1中的用途规划,将在如下机器上部署该程序。
序号 | IP | 主机名 | 部署程序 |
---|---|---|---|
01 | 192.168.113.131 | redis1 | codis-fe:18090 |
生成配置
然后使用codis-admin工具生成一份配置文件
cd /usr/local/codis/bin
./codis-admin --dashboard-list --zookeeper=redis1:2181 | tee ../config/codis.json
将在/usr/local/codis/config下生成一个codis.json的文件
[
{
"name": "mot-codis",
"dashboard": "redis1:18080"
}
]
nohup ./codis-fe --ncpu=4 --log=../log/fe.log --log-level=WARN --dashboard-list=../config/codis.json --listen=0.0.0.0:18090 &
打开浏览器,输入192.168.113.131:18090便可看到codis集群的监控界面 ,如图:
输入codis-proxy的地址和端口,点击New Proxy
输入代理proxy服务器的IP和admin_addr端口,配置路径:/usr/local/codis/proxy.conf
添加完成后,效果如下图:
三台机器配置,主从分别配置在不同的服务器上,避免主备同时宕机造成数据丢失,示例图:
1,添加真实的sentinel地址和端口
2,点击按钮添加
3,查看状态,这里有点不一样,他会自动添加当前主从组架构由多少台,控制切换
也正如我之前说的,他们自动去改配置文件,可以去看看sentinel的配置文件证实一下
执行usr/local/bin/redis-cli -h 192.168.113.131 -p 19000
进入Codis客户端,执行info
# Server
redis_version:3.2.11
redis_git_sha1:7191a280
redis_git_dirty:0
redis_build_id:fc848ed525d4f8ff
redis_mode:standalone
os:Linux 2.6.32-696.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:7453
run_id:606985fc0b57673f45b64d8b51cc8981ab0f4c91
tcp_port:6379
uptime_in_seconds:2797
uptime_in_days:0
hz:10
lru_clock:6751495
executable:/usr/local/codis/bin/./codis-server
config_file:/usr/local/codis/config/redis-6379.conf
# Clients
connected_clients:23
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:4224208
used_memory_human:4.03M
used_memory_rss:16338944
used_memory_rss_human:15.58M
used_memory_peak:4919344
used_memory_peak_human:4.69M
total_system_memory:1028214784
total_system_memory_human:980.58M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:3.87
mem_allocator:jemalloc-4.0.3
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1533477784
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:67
total_commands_processed:1390981
instantaneous_ops_per_sec:6
total_net_input_bytes:63407284
total_net_output_bytes:74666125
instantaneous_input_kbps:0.30
instantaneous_output_kbps:3.59
rejected_connections:0
sync_full:1
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:100000
keyspace_misses:1
pubsub_channels:1
pubsub_patterns:0
latest_fork_usec:945
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.113.132,port=6380,state=online,offset=58456605,lag=0
master_repl_offset:58456753
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57408178
repl_backlog_histlen:1048576
# CPU
used_cpu_sys:9.57
used_cpu_user:3.92
used_cpu_sys_children:0.01
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=2,expires=0,avg_ttl=0
在codis-proxy之上部署HAProxy,可以做到codis-proxy高可用。
需安装HAProxy或者Nginx等可以支持tcp协议负载工具。
配置完成后即可使用代理服务器访问Codis集群。本地虚拟机服务器测试性能大概提升30%。
为了提高存储集群的安全性,就需要为集群配置数据存取密码和集群管理密码。
序号 | 密码类型 | 描述 |
---|---|---|
01 | 数据存取密码 | 可通过修改proxy配置中session_auth调整数据存取密码。当使用redis-cli存取数据时,auth密码需要与session_auth一致。 |
02 | 集群管理密码 | 在proxy配置中的product_auth、codis-dashbroad配置中的product_auth需要与codis-server配置中的requirepass保持一致。 |
修复异常退出的 Codis-dashboard
# 修复异常退出的 Codis-dashboard
# dashboard 非正常退出,或者 kill -9 时使用
/usr/local/bin/codis-admin --remove-lock --product=mot-codis --zookeeper=redis1:2181
修复异常退出的 Codis-proxy
# 修复异常退出的 Codis-proxy
# proxy 非正常退出,或者 kill -9 时使用
/usr/local/bin/codis-admin --dashboard=dashboard_serverip:18080 --remove-proxy --addr=127.0.0.1:11080 –force
用自带的redis-benchmark来压测性能,模拟500个并发和100万个请求.注意区分好登录的地址和端口,还有密码
压测codis-proxy的性能
/usr/local/codis/bin/redis-benchmark -h redis1 -p 19000 -a "你的session_auth" -c 500 -n 1000000 -q
压测单节点的性能
/usr/local/codis/bin/redis-benchmark -h redis1 -p 6379 -a "你的requirepass" -c 500 -n 1000000 -q
redis-benchmark参数解析:
-h ip地址
-p redis端口
-a 认证密码
-c 设定多少个并发连接
-n 总共多少个请求
-q 显示模式:简要模式
codis不支持命令列表:
Command Type | Command Name |
---|---|
Keys | KEYS |
- | MIGRATE |
- | MOVE |
- | OBJECT |
- | RANDOMKEY |
- | RENAME |
- | RENAMENX |
- | SCAN |
Strings | BITOP |
- | MSETNX |
Lists | BLPOP |
- | BRPOP |
- | BRPOPLPUSH |
Pub/Sub | PSUBSCRIBE |
- | PUBLISH |
- | PUNSUBSCRIBE |
- | SUBSCRIBE |
- | UNSUBSCRIBE |
Transactions | DISCARD |
- | EXEC |
- | MULTI |
- | UNWATCH |
- | WATCH |
Scripting | SCRIPT |
Server | BGREWRITEAOF |
- | BGSAVE |
- | CLIENT |
- | CONFIG |
- | DBSIZE |
- | DEBUG |
- | FLUSHALL |
- | FLUSHDB |
- | LASTSAVE |
- | MONITOR |
- | RESTORE |
- | SAVE |
- | SHUTDOWN |
- | SLAVEOF |
- | SLOWLOG |
- | SYNC |
- | TIME |
Codis Slot | SLOTSCHECK |
- | SLOTSDEL |
- | SLOTSINFO |
- | SLOTSMGRTONE |
- | SLOTSMGRTSLOT |
- | SLOTSMGRTTAGONE |
- | SLOTSMGRTTAGSLOT |
以下属于半支持命令, Codis不支持跨节点操作,因此您必须使用散列标签将可能显示在一个请求中的所有密钥放入同一个插槽中,然后您可以使用这些命令。 Codis不检查密钥是否有相同的标签,所以如果你不使用标签,client会得到错误的回应。
Command Type | Command Name |
---|---|
Lists | RPOPLPUSH |
Sets | SDIFF |
- | SINTER |
- | SINTERSTORE |
- | SMOVE |
- | SUNION |
- | SUNIONSTORE |
Sorted Sets | ZINTERSTORE |
- | ZUNIONSTORE |
HyperLogLog | PFMERGE |
Scripting | EVAL |
- | EVALSHA |