集群搭建
下载软件
#下载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%左右
- 某些命令不支持
文章评论