环境说明

hostname主机pikacodis
zookeeper1192.168.20.105--
pika1192.168.20.112mastercodis-server
pika2192.168.20.113slavecodis-server
pika3192.168.20.121mastercodis-server
pika4192.168.20.122slavecodis-server
codis1192.168.20.123-codis-dashboard、codis-proxy、codis-fe
codis2192.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.toml
vim 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
create 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按钮
add Server

3.结果列表
添加后每组第一条是master,虽然在pika中指定了主从关系,但是还需要在codis中指明。见下一章节
enter description here

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

执行后效果:
pika slots

codis划分slots

方法一:均衡划分:
点击Rebalance All Slots按钮→再点击OK
Rebalance All Slots

方法二:自定义划分:
输入Start Slot→输入End Slot→输入Group Id→再点击Migrate Range按钮
custom slot

方法三: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

划分结果:
slots info

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按钮
发现主从调用过来了,但显示是红色的?
enter description here
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切换主
enter description here
5、登录到pika1执行命令:pkcluster slotsslaveof 192.168.20.113 9221 0-511
enter description here
6、验证主从切换。

①在pika1上执行`set k1 value`提示`(error) ERR Server in read-only`
②在pika2上执行`set k1 value`提示`ok`
满足以上条件表示主从切换是成功的

水平扩容

1.新主机说明

hostname主机pikagroup id
pika5192.168.20.123master3
pika6192.168.20.126slave3

要将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
如果觉得我的文章对你有用,请随意赞赏