Rubin's Blog

  • 首页
  • 关于作者
  • 隐私政策
享受恬静与美好~~~
分享生活的点点滴滴~~~
  1. 首页
  2. Redis
  3. 正文

Redis之Codis集群搭建

2021年 11月 18日 859点热度 0人点赞 0条评论

集群搭建

下载软件

#下载golang1.8.3 不好下载可以从本地上传 rz
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
#解压
tar zxvf go1.8.3.linux-amd64.tar.gz
#下载jdk
#采用rz上传 jdk-linux-x64.tar.gz
tar -zxvf jdk-linux-x64.tar.gz
#下载zookeeper
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-
3.4.14/zookeeper-3.4.14.tar.gz
#解压
tar -zxvf zookeeper-3.4.14.tar.gz

设置配置文件

vim /etc/profile
#golang
export GOROOT=/usr/go
#codis编译路径
export GOPATH=/usr/codis
#java
export JAVA_HOME=/usr/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
#zookeeper
export ZOOKEEPER_HOME=/usr/zookeeper-3.4.14/
#path
export PATH=$PATH:${GOROOT}/bin:${JAVA_PATH}:${ZOOKEEPER_HOME}/bin
source /etc/profile

设置编译环境

#编译目录
mkdir -p $GOPATH/src/github.com/CodisLabs
# 在编译目录下下载codis codis-release3.2.zip
cd $GOPATH/src/github.com/CodisLabs
unzip codis-release3.2.zip
mv codis-release3.2 codis
cd codis

编译Codis源码

yum install -y gcc git autoconf
make MALLOC=libc

Codis-Proxy配置(zookeeper)

#复制zoo.cfg
cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
#配置zoo.cfg
vim $ZOOKEEPER_HOME/conf/zoo.cfg
#修改
dataDir=/data/zookeeper/data
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
#一台zk可以不配置
#server.1=codis-1:2888:3888
#创建数据目录
mkdir -p /data/zookeeper/data
#创建myid
echo "1" > /data/zookeeper/data/myid
#编写codis的配置文件
vim /usr/codis/config.ini
#zookeeper的地址, 如果是zookeeper集群,可以这么写:
zk=hostname1:2181,hostname2:2181,hostname3:2181,hostname4:2181,hostname5:2181,如
果是etcd,则写成http://hostname1:port,http://hostname2:port,http://hostname3:port
zk=localhost:2181 
#产品名称, 这个codis集群的名字, 可以认为是命名空间, 不同命名空间的codis没有交集
product=test
#proxy会读取, 用于标记proxy的名字, 针对多个proxy的情况, 可以使用不同的config.ini, 只需要
更改 proxy_id 即可
proxy_id=proxy_1 
#检测状态时间间隔
net_timeout=5
#dashboard 服务的地址,CLI 的所有命令都依赖于 dashboard 的 RESTful API,所以必须启动
dashboard_addr=localhost:18087 
#如果用etcd,则将zookeeper替换为etcd
coordinator=zookeeper

Codis-Server配置(Redis)

启动codis中的redis-3.2.8实例

利用admin/codis-server-admin.sh 启动

如果配置多个需要修改config/redis.conf (redis.conf 默认6379)

以一主一从为例

主机,端口6379

#拷贝生成redis-6379.conf
cp redis.conf redis-6379.conf
vim redis-6379.conf
pidfile /tmp/redis_6379.pid
logfile "/tmp/redis_6379.log"
dbfilename dump_6379.rdb
appendfilename "appendonly_6379.aof"

从机,端口6380

#拷贝生成redis-6380.conf
cp redis.conf redis-6380.conf
vim redis-6380.conf
port 6380
slaveof 127.0.0.1 6379
pidfile /tmp/redis_6380.pid
logfile "/tmp/redis_6380.log"
dbfilename dump_6380.rdb
appendfilename "appendonly_6380.aof"

修改codis-server-admin.sh

#拷贝生成codis-server-admin-6379.sh
cp codis-server-admin.sh codis-server-admin-6379.sh
vim codis-server-admin-6379.sh
CODIS_SERVER_PID_FILE=/tmp/redis_6379.pid
CODIS_SERVER_LOG_FILE=/tmp/redis_6379.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server-6379.out
CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis-6379.conf
#拷贝生成codis-server-admin-6380.sh
cp codis-server-admin.sh codis-server-admin-6380.sh
vim codis-server-admin-6380.sh
CODIS_SERVER_PID_FILE=/tmp/redis_6380.pid
CODIS_SERVER_LOG_FILE=/tmp/redis_6380.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server-6380.out
CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis-6380.conf

redis-sentinel配置

#修改sentinel.conf
protected-mode no
daemonize yes

注: 不需要配置监控信息,在将sentinel加入到codis集群后,同步到要监控的集群里。

启动admin下的组件

#启动zookeeper
zkServer.sh start
#启动Codis Dashboard
./admin/codis-dashboard-admin.sh start
#启动Codis Proxy
./admin/codis-proxy-admin.sh start
#启动Codis Server
./admin/codis-server-admin-6379.sh start
./admin/codis-server-admin-6380.sh start
#启动 Codis Fe
./admin/codis-fe-admin.sh start
#启动sentinel
./bin/redis-sentinel ../config/sentinel.conf

web界面管理

查看启动状态

[root@localhost bin]# ps -ef |grep codis
root    6719    1  0 01:00 pts/0   00:00:11
/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-server *:6379
root    6893    1  0 01:06 pts/0   00:00:39
/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-dashboard --
config=/usr/codis/src/github.com/CodisLabs/codis/admin/../config/dashboard.toml
--log=/usr/codis/src/github.com/CodisLabs/codis/admin/../log/codis-dashboard.log
--log-level=INFO --
pidfile=/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-
dashboard.pid
root    6911    1  0 01:06 pts/0   00:00:16
/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-proxy --
config=/usr/codis/src/github.com/CodisLabs/codis/admin/../config/proxy.toml --
dashboard=127.0.0.1:18080 --
log=/usr/codis/src/github.com/CodisLabs/codis/admin/../log/codis-proxy.log --
log-level=INFO --ncpu=4 --
pidfile=/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-proxy.pid
root    6924    1  0 01:06 pts/0   00:00:02
/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-fe --assets-
dir=/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/assets --
filesystem=/tmp/codis --
log=/usr/codis/src/github.com/CodisLabs/codis/admin/../log/codis-fe.log --
pidfile=/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-fe.pid --
log-level=INFO --listen=0.0.0.0:9090
root    7116    1  0 01:19 pts/0   00:00:09
/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-server *:6380
root    8392  2200  0 03:06 pts/0   00:00:00 grep --color=auto codis
[root@localhost bin]# ps -ef |grep redis
root    7404    1  0 01:40 ?     00:00:13 ./redis-sentinel *:26379
[sentinel]
root    8477  2200  0 03:07 pts/0   00:00:00 grep --color=auto redis

web管理,输入:http://127.0.0.1:9090/

组添加

New Group

主机添加

从机添加

自动均衡slot

哨兵添加

点击“SYNC”后,codis将哨兵自动添加到集群中

可以通过codis客户端查看集群状态

[root@localhost bin]# ./redis-cli -p 19000
127.0.0.1:19000> info
# Server
redis_version:3.2.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:f7113f5fae59990d
redis_mode:standalone
os:Linux 3.10.0-229.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:6719
run_id:1092e2ee66a31c04e680ce64f7ef43c415515ee2
tcp_port:6379
uptime_in_seconds:8608
uptime_in_days:0
hz:10
lru_clock:14812711
executable:/usr/codis/src/github.com/CodisLabs/codis/admin/../bin/codis-server
config_file:/usr/codis/src/github.com/CodisLabs/codis/admin/../config/redis-
6379.conf
# Clients
connected_clients:19
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:4140984
used_memory_human:3.95M
used_memory_rss:5636096
used_memory_rss_human:5.38M
used_memory_peak:4698040
used_memory_peak_human:4.48M
total_system_memory:1027235840
total_system_memory_human:979.65M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.36
mem_allocator:libc
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1591863565
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:56
total_commands_processed:51157
instantaneous_ops_per_sec:15
total_net_input_bytes:1448589
total_net_output_bytes:20140160
instantaneous_input_kbps:0.35
instantaneous_output_kbps:11.05
rejected_connections:0
sync_full:1
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:1
pubsub_patterns:0
latest_fork_usec:700
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=408626,lag=0
master_repl_offset:408626
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:408625
# CPU
used_cpu_sys:6.45
used_cpu_user:6.72
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0

分片原理

Codis 将所有的 key 默认划分为 1024 个槽位(slot),它首先对客户端传过来的 key 进行 crc32 运算计算哈希值,再将 hash 后的整数值对 1024 这个整数进行取模得到一个余数,这个余数就是对应 key 的槽位。

Codis的槽位和分组的映射关系就保存在codis proxy当中。

实例之间槽位同步

codis proxy存在单点问题,需要做集群。不同proxy之间需要同步映射关系。在Codis中使用的是Zookeeper(Etcd)来保存映射关系:

Codis 将槽位关系存储在zk中,并且提供了一个Dashboard 可以用来观察和修改槽位关系,当槽位关系变化时,Codis Proxy 会监听到变化并重新同步槽位关系,从而实现多个 Codis Proxy 之间共享相同的槽位关系配置。

扩容&自动均衡

新增一组redis(一主一从)

Codis-Server配置(Redis)

启动codis中的redis-3.2.8实例

利用admin/codis-server-admin.sh 启动

如果配置多个需要修改config/redis.conf (redis.conf 默认6379)

以一主一从为例

主机,端口6381

#拷贝生成redis-6381.conf
cp redis.conf redis-6381.conf
vim redis-6381.conf
pidfile /tmp/redis_6381.pid
logfile "/tmp/redis_6381.log"
dbfilename dump_6381.rdb
appendfilename "appendonly_6381.aof"

从机,端口6382

#拷贝生成redis-6382.conf
cp redis.conf redis-6382.conf
vim redis-6382.conf
port 6382
slaveof 127.0.0.1 6381
pidfile /tmp/redis_6382.pid
logfile "/tmp/redis_6382.log"
dbfilename dump_6382.rdb
appendfilename "appendonly_6382.aof"

修改codis-server-admin.sh

#拷贝生成codis-server-admin-6381.sh
cp codis-server-admin.sh codis-server-admin-6381.sh
vim codis-server-admin-6381.sh
CODIS_SERVER_PID_FILE=/tmp/redis_6381.pid
CODIS_SERVER_LOG_FILE=/tmp/redis_6381.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server-6381.out
CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis-6381.conf
#拷贝生成codis-server-admin-6382.sh
cp codis-server-admin.sh codis-server-admin-6382.sh
vim codis-server-admin-6382.sh
CODIS_SERVER_PID_FILE=/tmp/redis_6382.pid
CODIS_SERVER_LOG_FILE=/tmp/redis_6382.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server-6382.out
CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis-6382.conf

启动Codis Server

#启动Codis Server
./admin/codis-server-admin-6381.sh start
./admin/codis-server-admin-6382.sh start

通过web管理

添加新组、添加主机、添加从机后

点击“Rebalance All Slots”

通过codis客户端添加数据

[root@localhost bin]# ./redis-cli -p 19000
127.0.0.1:19000> set cn3 zhaoyun3
OK
127.0.0.1:19000> set name:001 zhaoyun3
OK
127.0.0.1:19000> set name:002 zhaoyun3
OK

可以看到数据分区

优点&缺点

优点

  • 对客户端透明,与codis交互方式和redis本身交互一样
  • 支持在线数据迁移,迁移过程对客户端透明有简单的管理和监控界面
  • 支持高可用,无论是redis数据存储还是代理节点
  • 自动进行数据的均衡分配
  • 最大支持1024个redis实例,存储容量海量
  • 高性能

缺点

  • 采用自有的redis分支,不能与原版的redis保持同步
  • 如果codis的proxy只有一个的情况下, redis的性能会下降20%左右
  • 某些命令不支持
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Redis
最后更新:2022年 6月 9日

RubinChu

一个快乐的小逗比~~~

打赏 点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 集群搭建
    • 下载软件
    • 设置配置文件
    • 设置编译环境
    • 编译Codis源码
    • Codis-Proxy配置(zookeeper)
    • Codis-Server配置(Redis)
    • redis-sentinel配置
    • 启动admin下的组件
    • web界面管理
    • 组添加
    • 主机添加
    • 从机添加
    • 自动均衡slot
    • 哨兵添加
  • 分片原理
  • 实例之间槽位同步
  • 扩容&自动均衡
    • Codis-Server配置(Redis)
    • 启动Codis Server
  • 优点&缺点
    • 优点
    • 缺点
最新 热点 随机
最新 热点 随机
问题记录之Chrome设置屏蔽Https禁止调用Http行为 问题记录之Mac设置软链接 问题记录之JDK8连接MySQL数据库失败 面试系列之自我介绍 面试总结 算法思维
MongoDB之集群高可用 SpringCloud之Stream消息驱动组件 SpringBoot之内嵌Tomcat java面试系列之Linux MySQL之Sharding-JDBC编排治理剖析 Docker之常用命令

COPYRIGHT © 2021 rubinchu.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备19039146号-1