3. Codis实现Redis的集群
最后更新于:2022-04-02 07:38:53
#### [原文地址](http://www.cnblogs.com/reblue520/p/6874925.html "原文地址"),非常感谢郑子明的分享。
#### Codis简介
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表https://github.com/CodisLabs/codis/blob/release3.2/doc/unsupported_cmds.md), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务:
Codis是豌豆荚的开源方案,目前在redis集群实现方式对比,codis集群比较稳定的方案,并且客户端不需要做任何修改,相对redis cluster兼容性更强,可节约大量开发成本并减少大量后期维护成本, 主要由以下特点:
- 可以无缝迁移到codis,自带迁移工具,并且案例较多
- 可以动态扩容和缩容
- 多业务完全透明,业务不知道运行的是codis
- 支持多核心CPU,twemproxy只能单核
- codis是中心基于proxy的设计,是客户端像连接单机一样操作proxy
- 有部分命令不能支持,比如keys *等
- 支持group划分,组内可以设置一个主多个从,通过sentinel 监控redis主从,当主down了自动将从切换为主
- 设置的进程要最大等于CPU的核心,不能超过CPU的核心数
- 其依赖于zookeeper,里面保存的是key保存的redis主机位置,因此zookeeper要做高可用
- 监控可以使用接口和dashboard
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/7d723b4ad0d167ef41595986c165fd36_2614x1302.png)
#### 环境介绍
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/91ed171d4993680f2574b25775a2f91d_713x400.png)
#### 环境初始化
##### Go语言环境安装
```shell
cd /opt/
wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz
tar xzf go1.8.1.linux-amd64.tar.gz
mv go /usr/local/
mkdir /usr/local/go/work
cat >> /etc/profile < before processing any other commands.
session_auth = "codis6m4zGKYz"
admin_addr = "192.168.0.110:11080"
proto_type = "tcp4"
proxy_addr = "192.168.0.110:19000"
jodis_name = "zookeeper"
jodis_addr = "192.168.0.112:2181,192.168.0.112:2182,192.168.0.112:2183"
jodis_timeout = "20s"
jodis_compatible = false
```
#### 疑问?proxy_addr配置所有proxy还是自己?
##### 启动服务
```shell
nohup /usr/local/codis-proxy/codis-proxy --ncpu=1 -c /usr/local/codis-proxy/config/proxy.toml -l /usr/local/codis-proxy/logs/proxy.log --log-level=WARN >> /usr/local/codis-proxy/logs/nohup_proxy.log &
```
#### 配置codis-dashboard
##### 基础环境
|主机名|管理端口|product_auth|IP地址|
| :------------: | :------------: | :------------: | :------------: |:------------: |
|dashboard| 18080 | dashfpyYmglC|192.168.0.111|
|fe| 8888 | -|192.168.0.111|
##### 配置修改
修改存储为zookeeper并修改product_name名称
```shell
# Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".
# Quick Start
#coordinator_name = "filesystem"
#coordinator_addr = "/tmp/codis"
coordinator_name = "zookeeper"
coordinator_addr = "192.168.0.112:2181,192.168.0.112:2182,192.168.0.112:2183"
# Set Codis Product Name/Auth.
product_name = "codis-cluster"
product_auth = "dashfpyYmglC"
# Set bind address for admin(rpc), tcp only.
admin_addr = "192.168.0.111:18080"
```
启动Dashboard
```shell
nohup /usr/local/codis/codis-dashboard --ncpu=1 -c /usr/local/codis/config/dashboard.toml -l /usr/local/codis/logs/dashboard.log --log-level=WARN >> /usr/local/codis/logs/nohup_dashboard.log &
```
查看端口和zookeeper是否有数据
```shell
[zk: 192.168.0.112:2181,192.168.0.112:2181,192.168.0.112,2183(CONNECTED) 2] get /codis3/codis-cluster/topom
{
"token": "a3eefb8d4762addf12265a5c6f847ea8",
"start_time": "2017-08-23 13:01:44.961022186 +0800 CST",
"admin_addr": "192.168.0.111:18080",
"product_name": "codis-cluster",
"pid": 13773,
"pwd": "/usr/local/codis-dashboard/config",
"sys": "Linux dashboard.prod.ding 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux"
}
c
```
#### 启动codis-fe
```shell
nohup /usr/local/codis-dashboard/codis-fe --ncpu=1 -l /usr/local/codis-dashboard/logs/fe.log --log-level=WARN --zookeeper=192.168.0.112:2181,192.168.0.112:2182,192.168.0.112:2183 --listen=192.168.0.111:8888 >> /usr/local/codis-dashboard/logs/nohup_fe.log &
```
#### 配置哨兵,通过codis-fe添加到集群中
##### 注意,配置文件只添加如下内容,剩下的系统自动添加
```shell
#cat 26379_sentinel.conf
bind 192.168.0.110
port 26379
daemonize yes
protected-mode yes
dir "/tmp"
loglevel notice
logfile "/data/setinel-26379.log"
```
##### 启动哨兵
/usr/local/codis-proxy/codis-server /usr/local/codis-server/config/26379_sentinel.conf --sentinel
##### 在codis-fe中增加哨兵
#### 最终图形界面
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/dabd2559652ff9d0c1c3c5a1c06f9ae2_1594x2294.png)
#### 疑问
图形界面按钮含义
内部运行机制
#### 后续工作
完成故障测试切换
了解分片技术
';