参考:https://blog.csdn.net/mnasd/article/details/80568003
环境:Centos7
机器:10.2.10.108,10.2.10.109,10.2.10.120
规划:
zookeeper | codis-server(主/从) | codis-sentinel | codis-proxy | codis-dashboard | codis-fe | |
10.2.10.108 | √ | √ | √ | √ | ||
10.2.10.109 | √ | √ | √ | √ | √ | √ |
10.2.10.120 | √ | √ | √ | √ |
部署:
目录
1.安装golang
2.安装jdk
3.安装配置zookeeper集群
4.下载配置codis-3.2.2
1)下载
2)配置启动codis-server(三台同样操作)
3)配置redis-sentinel(三台)
4)配置codis-proxy(三台)
5)配置codis-dashboard(一台,我这里在10.2.10.109上)
6)配置codis-fe(一台,我这里在10.2.10.109上)
5.界面使用
1)添加proxy
2)添加group和server
3)添加sentinels
6.报错与解决
7.测试
8.管理界面添加用户认证
1)安装nginx
2)启动nginx
3)设置账号密码
4)重启nginx
先查看本地是否有go环境,go version,如果出现版本,则说明有,跳过该步骤;如果没有,显示command not found,则说明没有安装,需进行以下操作:
yum install golang
go version
rpm -qa|grep java
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
yum install jdk-8u152-linux-x64.rpm
javac -version
百度安装
启动:bin/zkServer.sh start(三台均启动)
https://github.com/CodisLabs/codis/releases/download/3.2.2/codis3.2.2-go1.9.2-linux.tar.gz
解压:tar –zxf codis3.2.2-go1.9.2-linux.tar.gz –C /usr/local/software/
将解压后的codis3.2.2发送到其他机器上:scp -r codis3.2.2-go1.9.2-linux/ 10.2.10.108:/usr/local/software/
scp -r codis3.2.2-go1.9.2-linux/ 10.2.10.120:/usr/local/software/
A.配置
在10.2.10.109上执行
mkdir -p /redis/data/config/
mkdir -p /redis/data/logs/
#master的配置文件
vim /redis/data/config/redis_6379.conf
#允许后台运行
daemonize yes
#设置端口,最好是非默认端口
port 6379
#绑定登录IP,安全考虑,最好是内网
bind *
#命名并指定当前redis的PID路径,用以区分多个redis
pidfile "/redis/data/config/redis_6379.pid"
#命名并指定当前redis日志文件路径
logfile "/redis/data/logs/redis_6379.log"
#指定RDB文件名,用以备份数据到硬盘并区分不同redis,当使用内存超过可用内存的45%时触发快照功能
dbfilename "dump_6379.rdb"
#指定当前redis的根目录,用来存放RDB/AOF文件
dir "/redis/data"
#当前redis的认证密钥,redis运行速度非常快,这个密码要足够强大,
#所有codis-proxy集群相关的redis-server认证密码必须全部一致
requirepass "codisqwer"
#当前redis的最大容量限制,建议设置为可用内存的45%内,最高能设置为系统可用内存的95%,
#可用config set maxmemory 去在线修改,但重启失效,需要使用config rewrite命令去刷新配置文件
#注意,使用codis集群,必须配置容量大小限制,不然无法启动
maxmemory 100000kb
#LRU的策略,有四种,看情况选择
maxmemory-policy allkeys-lru
#如果做故障切换,不论主从节点都要填写密码且要保持一致
masterauth "codisqwer"
#修改库个数,默认为16
databases 64
#创建slave的配置文件,暂时只配置这些,其他先默认
vim /redis/data/config/redis_6380.conf
#允许后台运行
daemonize yes
#设置端口,最好是非默认端口
port 6380
#绑定登录IP,安全考虑,最好是内网
bind *
#命名并指定当前redis的PID路径,用以区分多个redis
pidfile "/redis/data/config/redis_6380.pid"
#命名并指定当前redis日志文件路径
logfile "/redis/data/logs/redis_6380.log"
#指定RDB文件名,用以备份数据到硬盘并区分不同redis,当使用内存超过可用内存的45%时触发快照功能
dbfilename "dump_6380.rdb"
#指定当前redis的根目录,用来存放RDB/AOF文件
dir "/redis/data"
#当前redis的认证密钥,redis运行速度非常快,这个密码要足够强大
#所有codis-proxy集群相关的redis-server认证密码必须全部一致
requirepass "codisqwer"
#当前redis的最大容量限制,建议设置为可用内存的45%内,最高能设置为系统可用内存的95%,
#可用config set maxmemory 去在线修改,但重启失效,需要使用config rewrite命令去刷新配置文件
#注意,使用codis集群,必须配置容量大小限制,不然无法启动
maxmemory 100000kb
#LRU的策略,有四种,看情况选择
maxmemory-policy allkeys-lru
#如果做故障切换,不论主从节点都要填写密码且要保持一致
masterauth "codisqwer"
#配置主节点信息
slaveof 10.2.10.109 6379
#修改库个数,默认为16
databases 64
将master和slave的配置文件发送到其他机器:scp –r /redis/ 10.2.10.108:/
scp –r /redis/ 10.2.10.120:/
修改slave配置文件中的主节点信息:slaveof 10.2.10.108 6379
slaveof 10.2.10.120 6379
B.启动(三台均执行)
#然后就可以启动了, codis-server就是redis-server
/usr/local/software/codis3.2.2-go1.9.2-linux/codis-server /redis/data/config/redis_6379.conf
/usr/local/software/codis3.2.2-go1.9.2-linux/codis-server /redis/data/config/redis_6380.conf
#验证一下
ss -ntplu |grep codis-server
redis-sentinel是要配置主从架构才能生效,但是在codis集群中并不一样,因为他的配置由zookeeper来维护,所以,这里codis使用 的redis-sentinel只需要配置一些基本配置就可以了。
在10.2.10.109上执行
vim /redis/data/config/sentinel.conf
bind 0.0.0.0
protected-mode no
port 26379
dir "/redis/data"
pidfile "/redis/data/config/sentinel_26379.pid"
logfile "/redis/data/logs/sentinel_26379.log"
daemonize yes
将sentinel的配置文件发送到其他机器上:
scp /redis/data/config/sentinel.conf 10.2.10.108:/redis/data/config/
scp /redis/data/config/sentinel.conf 10.2.10.120:/redis/data/config/
#然后就可以启动了
/usr/local/software/codis3.2.2-go1.9.2-linux/redis-sentinel /redis/data/config/sentinel.conf
#验证一下
/usr/local/software/codis3.2.2-go1.9.2-linux/redis-cli -p 26379 -c info Sentinel
#在10.2.10.109上执行,先生成一下默认的配置文件
/usr/local/software/codis3.2.2-go1.9.2-linux/codis-proxy --default-config | tee ./proxy.conf
#然后把配置放到redis数据目录的配置文件目录,再更改关键位置,其他默认即可。同样,参数的设置也可参照源码codis- 3.2.2/pkg/proxy/config.go
vim /redis/data/config/proxy.conf
#项目名称,会登记在zookeeper里,如果你想一套zookeeper管理多套codis,就必须区分好
product_name = "codis-test1"
# 设置登录dashboard的密码(与真实redis中requirepass一致)
product_auth = "codisqwer"
#客户端(redis-cli)的登录密码(与真实redis中requirepass不一致),是登录codis的密码
session_auth = "qwer!23"
#管理的端口,0.0.0.0即对所有ip开放,基于安全考虑,可以限制内网
admin_addr = "0.0.0.0:11080"
#用哪种方式通信,假如你的网络支持tcp6的话就可以设别的
proto_type = "tcp4"
#客户端(redis-cli)访问代理的端口,0.0.0.0即对所有ip开放
proxy_addr = "0.0.0.0:19000"
#外部配置存储类型,我们用的就是zookeeper,当然也是还有其他可以支持,这里不展开说
jodis_name = "zookeeper"
#配置zookeeper的连接地址,这里是三台就填三台
jodis_addr = "10.2.10.108:2181,10.2.10.109:2181,10.2.10.120:2181"
#zookeeper的密码,假如有的话
jodis_auth = ""
#codis代理的最大连接数,默认是1000,并发大要调大
proxy_max_clients = 1000
#假如并发太大,你可能需要调这个pipeline参数,大多数情况默认就够了
session_max_pipeline = 10000
# 修改库的个数,默认是16,这里与上面redis.conf保持一致
backend_number_databases = 64
拷贝到其他机器上:
scp /redis/data/config/proxy.conf 10.2.10.108:/redis/data/config/
scp /redis/data/config/proxy.conf 10.2.10.120:/redis/data/config/
#然后就可以启动了(三台),
/usr/local/software/codis3.2.2-go1.9.2-linux/codis-proxy --ncpu=4 --config=/redis/data/config/proxy.conf --log=/redis/data/logs/proxy.log &
#验证一下
ss -ntplu |grep codis-proxy
说明:
--ncpu 指定使用多少个cpu,(lscpu)
--config 指定配置文件,就是刚才的配置文件
--log 指定输出日志文件
#我们也可以用程序来生成一下默认配置文件
/usr/local/software/codis3.2.2-go1.9.2-linux/codis-dashboard --default-config | tee ./dashboard.conf
#然后我们把配置放到redis数据目录的配置文件目录,再更改关键位置,其他默认即可
vim /redis/data/config/dashboard.conf
#外部配置存储类型,我们用的就是zookeeper,当然也是还有其他可以支持,这里不展开说
coordinator_name="zookeeper"
coordinator_addr = "10.2.10.108:2181,10.2.10.109:2181,10.2.10.120:2181"
coordinator_auth = ""
#项目名称,会登记在zookeeper里,如果你想一套zookeeper管理多套codis,就必须区分好
product_name = "codis-test1"
#所有redis的登录密码(与真实redis中requirepass一致),因为要登录进去修改数据
product_auth = "codisqwer"
#codis-dashboard的通信端口,0.0.0.0表示对所有开放,最好使用内网地址
admin_addr = "0.0.0.0:18080"
# Set arguments for data migration (only accept 'sync' & 'semi-async').
migration_method = "semi-async"
migration_parallel_slots = 100
migration_async_maxbulks = 200
migration_async_maxbytes = "32mb"
migration_async_numkeys = 500
migration_timeout = "30s"
# Set configs for redis sentinel.
sentinel_client_timeout = "10s"
sentinel_quorum = 2
sentinel_parallel_syncs = 1
sentinel_down_after = "30s"
sentinel_failover_timeout = "5m"
#如果想要在codis集群在故障切换功能上执行一些脚本,可以配置以下两个配置
sentinel_notification_script = ""
sentinel_client_reconfig_script = ""
#然后就可以启动了,
/usr/local/software/codis/codis-dashboard --ncpu=4 --config=/redis/data/config/dashboard.conf -- log=/redis/data/logs/codis_dashboard.log --log-level=WARN &
#验证一下
ss -ntplu |grep codis-dashboard
这个工具本身不需要配置文件就能启动,只需要指定codis-dashboard的ip和端口就可以了,但是我为了方便管理,还是生成一个配置文件的好.
vi /redis/data/config/codis.json
[
{
"name": "codis-test1",
"dashboard": "10.2.10.109:18080"
}
]
#然后就可以启动了,
/usr/local/software/codis/codis-fe --ncpu=4 --log=/redis/data/logs/fe.log --log-level=WARN --dashboard-list=/redis/data/config/codis.json --listen=0.0.0.0:8090 &
打开网址:http://10.2.10.109:8090/
因为10.2.10.109,10.2.10.108,10.2.10.120上均配置proxy,因此需要添加三个proxy.
因为在10.2.10.109,10.2.10.108,10.2.10.120上均配置server,每个机器上有一个master,一个slave,因此需要添加三组,每组添加主从服务的地址。
因为在10.2.10.109,10.2.10.108,10.2.10.120上均配置sentinels,因此需要添加三个sentinels。
1)[email protected]:11080 check xauth failed, Get http://devopssvr.localhost.com:11080/api/proxy/xping/f26f4d92d86a056c49b9914fa99d1359: dial tcp: lookup devopssvr.localhost.com on 10.1.1.223:53: no such host",
解决:需要在109机器上的/etc/hosts中添加10.2.10.108,10.2.10.120的host
2)dashboard启动失败,或者dashboard界面打不开。日志文件中显示listen tcp 0.0.0.0:18080: bind: address already in use
解决:netstat -nap | grep 18080
kill pid
3) codis-proxy:backend conn failure, set tcp 10.2.10.120:50053: use of closed network connection(删除错误)
解决:在机器109上操作:/usr/local/software/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy --addr=127.0.0.1:11080 --force #选项 --force 表示,无论 offline 操作是否成功,都从外部存储中将该节点删除。所以操作前,一定要确认该 codis-proxy 进程已经退出。
4)codis-proxy:[email protected]:11080fetch model failed, Get http://10.2.10.108:11080/api/proxy/model: dial tcp 10.2.10.108:11080: getsockopt: connection refused(添加报错)
解决:10.2.10.108需要先启动proxy,才能在面板上进行添加操作。
5)codis-proxy总是莫名其妙地挂掉,codis-server正常
解决:三个机器上均关闭seniux防火墙,setenforce 06)客户端如何通过proxy实现keys类似模糊操作
解答:https://github.com/CodisLabs/codis/issues/1152,借助proxy的slotsscan命令遍历1024个slot实现类似keys效果。
在其中一个机器上执行(这里选10.2.10.109):
/usr/local/software/codis/redis-cli -h 10.2.10.109 -p 19000 -a qwer!23
因为codis-fe集群管理界面打开后没有用户认证,存在一定的风险性,这里借助nginx为该集群管理界面添加用户认证功能。
yum install nginx
ps –ef | grep nginx
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
sudo yum install -y httpd-tools
htpasswd -b -c /etc/nginx/passwd.db admin codis*#pwd
vi /etc/nginx/conf.d/codis.conf
server {
listen 80;
server_name codis.example.com;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/passwd.db;
location /{
proxy_pass http://10.2.10.109:8090;
}
}
setenforce 0
sudo systemctl restart nginx.service