环境说明
hostname | 主机 | pika | codis |
---|---|---|---|
zookeeper1 | 192.168.20.105 | - | - |
pika1 | 192.168.20.112 | master | codis-server |
pika2 | 192.168.20.113 | slave | codis-server |
pika3 | 192.168.20.121 | master | codis-server |
pika4 | 192.168.20.122 | slave | codis-server |
codis1 | 192.168.20.123 | - | codis-dashboard、codis-proxy、codis-fe |
codis2 | 192.168.20.126 | - | codis-dashboard、codis-proxy |
pika安装
执行主机:【pika1,pika2,pika3,pika4】
1. 下载pika安装包
# 切换到/usr/local目录
cd /usr/local/
# 下载pika二进制安装包
wget https://github.com/Qihoo360/pika/releases/download/v3.3.5/pika-linux-x86_64-v3.3.5.tar.bz2
2. 解压
# 解压
tar -jxvf pika-linux-x86_64-v3.3.5.tar.bz2
# 重命名文件夹
mv ./output pika
3. 修改pika.conf
# Pika作为codis的数据节点时,需要开启slotmigrate模式以支持转移slot。
slotmigrate : yes
# 分为经典模式和分片模式,[classic | sharding]。默认是classic,因需要支持转移slot这里必须设置sharding模式。
instance-mode : sharding
# 在从slave[pika2,pika4]主机中配置主节点,master不需要配置。使用sharding+codis不建议配置slaveof,后面会通过pkcluster来配置主从同步
#slaveof : {master ip}:9221
4. 分配slot
由于pika没有提供client,这一步可以等安装codis后再执行。分配slot可以选一台codis
5. 启动pika
nohup ./bin/pika -c ./conf/pika.conf > /dev/null 2>& 1 &
go安装
执行主机:【codis1,codis2】
1. 下载go安装包
# 切换到/usr/local/
cd /usr/local
# 下载
wget https://golang.org/dl/go1.9.2.linux-amd64.tar.gz
2. 解压
tar -zxvf go1.9.2.linux-amd64.tar.gz
3. 配置环境
# 安装目录
export GOROOT=/usr/local/go
# 工作目录
export GOPATH=/usr/data/gowork
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin:
执行命令:
# 使配置环境变量生效
source /etc/profile
4. 创建go工作目录
# bin 目录可执行文件目录
# pkg 目录打包程序目录
# src 源代码
mkdir -p /usr/data/gowork/{bin,pkg,src}
codis安装
安装godep
codis是基于go语言进行开发的,必须先安装好go开发环境。
1.查看go工种目录
go env GOPATH
2.下载/安装go依赖支持库
# 创建godep源码目录
mkdir -p $GOPATH/src/github.com/tools
# 进入目录
cd $GOPATH/src/github.com/tools
# 下载源码
git clone https://github.com/tools/godep.git
# 进入godep目录
cd $GOPATH/src/github.com/tools/godep
# 安装godep,命令执行后会在$GOPATH/bin生成可执行文件
go install ./
这里是通过git来下载源码的,如果主机没有git命令这执行:
yum install -y git
codis下载/编译/安装
1.下载codis源码
# 创建codis源码目录
mkdir -p $GOPATH/src/github.com/CodisLabs
# 进入目录
cd $GOPATH/src/github.com/CodisLabs
# 下载codis源码
git clone https://github.com/CodisLabs/codis.git -b release3.2
2.编译codis
# 进入源码目录
cd $GOPATH/src/github.com/CodisLabs/codis
# 编译
make
3.修改codis源码
由于pika不支持MULTI和CLIENT KILL TYPE需要需改以下codis源码。这里采用直接替换方式
1.修改hosts
因国内有墙需要在hosts新增配置:
vim /etc/hosts
# 新增内容
199.232.68.133 raw.githubusercontent.com
2.替换main.go
wget https://raw.githubusercontent.com/kernelai/codis/773776fbf7667dedbe4503ef9eb2e5a0f600c265/cmd/ha/main.go -O $GOPATH/src/github.com/CodisLabs/codis/cmd/ha/main.go
3.替换client.go
wget https://raw.githubusercontent.com/kernelai/codis/773776fbf7667dedbe4503ef9eb2e5a0f600c265/pkg/utils/redis/client.go -O $GOPATH/src/github.com/CodisLabs/codis/pkg/utils/redis/client.go
修改参考:https://github.com/kernelai/codis/commit/773776fbf7667dedbe4503ef9eb2e5a0f600c265
4.安装codis
# admin保存命令脚本
# bin保存codis可执行命令
# config保存配置文件
mkdir -p /usr/local/codis/{admin,bin,config}
# 将codis所需文件copy到/usr/local/codis目录中
cp -r $GOPATH/src/github.com/CodisLabs/codis/bin/ /usr/local/codis/
cp -r $GOPATH/src/github.com/CodisLabs/codis/admin/ /usr/local/codis/
cp -r $GOPATH/src/github.com/CodisLabs/codis/config/ /usr/local/codis/
codis-dashboard
codis-dashboard是对codis配置时必要服务。
# 进入codis安装目录
cd /usr/local/codis
1.配置dashboard.tomlvim config/dashboard.toml
修改内容:
# 协调者(zookeeper|filesystem|etcd)
coordinator_name = "zookeeper"
# 协调者地址
coordinator_addr = "zookeeper1:2181"
# 设置当前整个一套codis的标记名称
product_name = "codis-pika"
# 设置连接的密码
product_auth = ""
# 设置后台管理路经的地址和端口(codis-dashboard服务主机地址),如果设置为“0.0.0.0”表示匹配当前主机
admin_addr = "0.0.0.0:18080"
2.启动dashboard:
./admin/codis-dashboard-admin.sh start
codis-fe
1.修改codis-fe-admin脚本
vim ./admin/codis-fe-admin.sh
修改内容
# 使用zookeeper
COORDINATOR_NAME="zookeeper"
# 配置zookeeper地址
COORDINATOR_ADDR="zookeeper1:2181"
2.启动codis-fe
./admin/codis-fe-admin.sh start
3.浏览器访问codis-fe
访问地址:http://codis1:9090/
codis-proxy
1. 修改codis-proxy-admin脚本
vim ./admin/codis-proxy-admin.sh
修改内容:
# dashboard访问地址
CODIS_DASHBOARD_ADDR="0.0.0.0:18080"
2. 修改proxy.toml
vim config/proxy.toml
修改内容
# 与codis-dashboard名称配置相同
product_name = "codis-pika"
# 设置连接密码
product_auth = ""
# 连接地址
admin_addr = "0.0.0.0:11080"
# 设置为zookeeper
jodis_name = "zookeeper"
# 设置zookeeper地址
jodis_addr = "zookeeper1:2181"
3.启动codis-proxy
./admin/codis-proxy-admin.sh start
pika+codis配合使用
新增Group
1. 命令行方式
dashboard:表示dashboard地址
create-group:表示创建组
gid:组ID,必须是数字
./bin/codis-admin --dashboard=codis1:18080 --create-group --gid=1
./bin/codis-admin --dashboard=codis1:18080 --create-group --gid=2
2. codis-fe方式
输入Group ID
→点击New Group
新增主机
1.命令行方式
dashboard:表示dashboard地址
group-add:表示向group中添加主机
gid:表示向哪个group添加
./bin/codis-admin --dashboard=codis1:18080 --group-add --gid=1 --addr=pika1:9221
./bin/codis-admin --dashboard=codis1:18080 --group-add --gid=1 --addr=pika2:9221
./bin/codis-admin --dashboard=codis1:18080 --group-add --gid=2 --addr=pika3:9221
./bin/codis-admin --dashboard=codis1:18080 --group-add --gid=2 --addr=pika4:9221
2.codis-fe方式
填写pika地址(ip:port)
→填写Group Id
→点击Add Server
按钮
3.结果列表
添加后每组第一条是master,虽然在pika中指定了主从关系,但是还需要在codis中指明。见下一章节
pika划分slots
pika和codis都支持slot,但两者slot是互不干扰的,所以在变更slot时pika和codis两边都要操作。在pika中自身是没有提供client的,这里可以通过codis的redis-cli
命令进入pika。需要注意的是pika和codis的slot划分区间必须要一致。
进入pika命令:
./bin/redis-cli -h ${pika_ip} -p ${pika_port}
1. 在pika1执行
进入pika1(group 1的master节点)
./bin/redis-cli -h pika1 -p 9221
添加slots
pkcluster addslots 0-511
2.在pika2执行
进入pika2(group 1的slave节点)
./bin/redis-cli -h pika2 -p 9221
添加slots
pkcluster addslots 0-511
指定master
pkcluster slotsslaveof pika1 9221 0-511
3. 在pika3执行
进入pika3(group 2的master节点)
./bin/redis-cli -h pika3 -p 9221
添加slots
pkcluster addslots 512-1023
4.在pika4执行
进入pika4(group 2的slave节点)
./bin/redis-cli -h pika4 -p 9221
添加slots
pkcluster addslots 512-1023
指定master
pkcluster slotsslaveof pika3 9221 512-1023
执行后效果:
codis划分slots
方法一:均衡划分:
点击Rebalance All Slots
按钮→再点击OK
方法二:自定义划分:
输入Start Slot
→输入End Slot
→输入Group Id
→再点击Migrate Range
按钮
方法三:codis-admin划分
./bin/codis-admin --dashboard=192.168.20.123:18080 --slot-action --create-range --beg=0 --end=511 --gid=1
./bin/codis-admin --dashboard=192.168.20.123:18080 --slot-action --create-range --beg=512 --end=1023 --gid=2
划分结果:
jodis使用
1.maven引入jodis
<dependency>
<groupId>io.codis.jodis</groupId>
<artifactId>jodis</artifactId>
<version>0.5.1</version>
</dependency>
2.编写Java测试类
public class JodisTest {
public static void main(String[] args) {
String zkAddr = "192.168.20.105:2181";
String zkProxyDir = "/jodis/codis-pika";
int timeout = 30000;
JedisResourcePool jedisPool = RoundRobinJedisPool.create()
.curatorClient(zkAddr, timeout)
.zkProxyDir(zkProxyDir)
.build();
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("key", "value");
String value = jedis.get("key");
System.out.println(value);
}
}
}
进阶
主从切换
步骤:
1、使用redis-cli
登录slave(pika2) pika→执行set k1 value
→提示(error) ERR Server in read-only
2、进入codis-fe→点击slave节点上的PROMOTE
按钮
发现主从调用过来了,但显示是红色的?
3、在登录master(pika2)→执行set k1 value
→提示(error) ERR Server in read-only
,$color{#FF0000}{由此可以说明codis和pika主从切换是独立的,pika2在 group 1中并没有成为master}$。
4、登录到pika2执行命令:pkcluster slotsslaveof no one 0-511
切换主
5、登录到pika1执行命令:pkcluster slotsslaveof 192.168.20.113 9221 0-511
6、验证主从切换。
①在pika1上执行`set k1 value`提示`(error) ERR Server in read-only`
②在pika2上执行`set k1 value`提示`ok`
满足以上条件表示主从切换是成功的
水平扩容
1.新主机说明
hostname | 主机 | pika | group id | |
---|---|---|---|---|
pika5 | 192.168.20.123 | master | 3 | |
pika6 | 192.168.20.126 | slave | 3 |
要将group2中的slot 512-600迁移到group3中
2.步骤
①准备机器并启动pika...
②在pika5中执行
pkcluster addslots 512-600
# 把512-600的slot同步到pika5
pkcluster slotsslaveof pika3 9221 512-600
③在pika3中观察lag至是否为0
观察命令:
pkcluster info slot 51-600
...(有空再写)
codis高可用
略
常见问题
清理zookeeper上的codis残留
删除zookeepercodis-demo
节点
#进入zk:
./zookeeper-client.sh
#删除codis-demo
rmr /codis3
rmr /zk/codis
codis删除master节点
如果codis中有为主机分配slot,那么必须要先下线主机中的slot再进行删除主机。
./bin/codis-admin --dashboard=192.168.20.123:18080 --slots-assign --beg=513 --end=1023 --offline --confirm
版权属于:版权归 bbmax.cc 所有,转载请注明出处
本文链接:https://www.bbmax.cc/index.php/archives/82/
转载时须注明出处及本声明