Redis 迁移 Codis 集群

Redis集群主要有五种方案:

官方cluster方案、twemproxy代理方案、哨兵模式、Codis、客户端分片。

其中以豌豆荚的Codis使用最多,本文主要介绍Codis。


一、Codis 安装

1. 安装最新版 3.2

1) java 环境

yum -y  install java-1.8.0

2)go环境

tar zxvf /root/go1.8.3.linux-amd64.tar.gz -C /usr/local/

/usr/local/go/bin/go version

mkdir -p /data/go

echo 'export PATH=$PATH:/usr/local/go/bin:/usr/local/codis/bin'  >>/etc/profile

echo 'export GOPATH=/data/go'  >>/etc/profile

source /etc/profile

go env GOPATH

3) 安装codis

4)安装zookeeper

zookeeper 至少部署 3台


二、集群配置

1. 角色划分

192.168.180.120 codis120 codis-server  zookeeper

192.168.180.121 codis121 codis-server  zookeeper

192.168.180.122 codis122 codis-server  zookeeper

192.168.180.123 codis123 codis-server  codis-proxy  nginx-tcp  lvs

192.168.180.124 codis124 codis-server  codis-proxy  nginx-tcp  lvs

192.168.180.125 codis125  codis-server  codis-dashboard codis-fe

2. 启动codis-dashobard(codis125上操作)

修改dashboard.toml配置文件:

coordinator_name = "zookeeper"

coordinator_addr = "192.168.180.120:2181,192.168.180.121:2181,192.168.180.122:2181"

product_name = "codis-product1"

product_auth = ""

admin_addr = "0.0.0.0:18080"

启动命令:

./admin/codis-dashboard-admin.sh start

3. 启动codis-proxy(codis123与codis124上操作)

修改codis-proxy启动脚本:

cat admin/codis-proxy-admin.sh | grep DASH

CODIS_DASHBOARD_ADDR="192.168.180.125:18080"

修改proxy.toml配置:

cat config/proxy.toml|grep -Ev "^#|^$"

product_name = "codis-product1"

product_auth = ""

session_auth = ""

admin_addr = "0.0.0.0:11080"

proto_type = "tcp4"

proxy_addr = "0.0.0.0:19000"

启动codis-proxy脚本:

./admin/codis-proxy-admin.sh start

检查日志和端口:

cat log/codis-proxy.log

netstat -tulpn | grep codis-proxy

4. 启动codis-server(需要在所有上操作)

1)修改启动脚本

vim /usr/local/codis/admin/codis-server-admin-6379.sh start

vim /usr/local/codis/admin/codis-server-admin-6380.sh start

主要注意以下几点

[root@codis125 codis]# cat /usr/local/codis/admin/codis-server-admin-6379.sh |grep -Ev "^#|^$"|grep 6379

CODIS_SERVER_PID_FILE=/data/codis/6379/redis_6379.pid

CODIS_SERVER_LOG_FILE=/data/codis/6379/redis_6379.log

CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis-6379.conf

2)修改服务配置

[root@codis120 codis]# mkdir -p /data/redis/6379

[root@codis120 codis]# mkdir -p /data/redis/6380

[root@codis120 codis]# vim /usr/local/codis/config/redis-6379.conf

[root@codis120 codis]# vim /usr/local/codis/config/redis-6380.conf

主要是注意以下几点

[root@codis120 codis]# cat /usr/local/codis/config/redis-6379.conf |grep -Ev "^#|^$"|grep 6379

port 6379

pidfile /data/redis/6379/redis_6379.pid

logfile "/data/redis/6379/redis_6379.log"

dir /data/redis/6379

3)启动codis-server服务

[root@codis120 codis]# ./admin/codis-server-admin-6379.sh start

/usr/local/codis/admin/../config/redis-6379.conf

starting codis-server ...

[root@codis120 codis]# ./admin/codis-server-admin-6380.sh start

/usr/local/codis/admin/../config/redis-6380.conf

starting codis-server ...

5. 启动codis-fe(codis125上操作)

1)修改codis-fe启动脚本

[root@codis125 codis]# cat admin/codis-fe-admin.sh

主要修改这几行

#!/usr/bin/env bash

#COORDINATOR_NAME="filesystem"

#COORDINATOR_ADDR="/tmp/codis"

COORDINATOR_NAME="zookeeper"

COORDINATOR_ADDR="192.168.180.120:2181,192.168.180.121:2181,192.168.180.122:2181"

2)启动codis-fe脚本

[root@codis125 codis]#  ./admin/codis-fe-admin.sh start

3)访问面板

http://192.168.188.125:9090/#codis-product1

6. codis-fe面板操作

1)通过codis-fe添加group

通过web浏览器访问集群管理页面(fe地址:http://192.168.188.125:9090/#codis-product1) 选择我们刚搭建的集群 codis-product1,在 Proxy 栏可看到我们已经启动的 Proxy, 但是

Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加 NEW GROUP,NEW GROUP 行输入 1,再点击 NEW GROUP 即可 添加 Codis Server,Add Server 行输入我们刚刚启动的

codis-server 地址,添加到我们刚新建的 Group,然后再点击 Add Server 按钮即可。

如上依次添加6个group,12个codis-server,默认每组里面第一个添加的为主,第二个添加的设置为从,同一个节点2个实例不能设置为同一group。

2)通过codis-fe初始化solt

新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group),而初始化最快的方法可通过 fe 提供的 rebalance all slots 按钮来做,如下图

所示,点击此按钮,我们即快速完成了一个集群的搭建。

自动分配1024个solt到6个group,reblance all solts会自动分配完所以solt到6个group。

7. 代理HA

1)在codis123与codis124上安装lvs与nginx-tcp

2)配置好VIP+19000端口为第一个codis-dashboard业务线使用,其他类推


三、数据迁移

做好平滑的数据同步迁移,不影响业务正常使用。

redis-port 工具做数据迁移

参考:https://www.cnblogs.com/yotone/p/6556480.html

使用redis-port:

 [www redis-port]$  nohup ./bin/redis-port sync --ncpu=1 --from=192.168.10.10:6001 --password=whyredis --target=192.168.10.12:19002 --auth=codiswyt >> /opt/codis/redis-port/log/redis-to-codis.log  2>&1 &

1. 如何做到不停机,数据迁移?

数据迁移过程中,如果不停机,新集群 和 旧集群 数据只能是趋近于相等,但不可能绝对相等。

我们需要考虑的是,切流量那一会新打入旧集群的缓存信息,在新集群不存在,是否会影响业务?是否可以接受?

2. 如果有影响,那么就需要考虑影响范围最小化,如何最小化?

因为缓存一旦没有信息,势必会穿透到DB, 这样DB压力会上升。

我们可以通过流量控制,开始只切5% 的流量(甚至更小 1%) 到 Codis, 观察情况,没问题逐步切流量到新集群。

3. 梳理旧集群 redis key, 分析哪些key 是必不可少的。检查迁移是否有遗漏。

4. 故障回滚方式:灰度 和线上 两份,连接新旧集群,进行切换。


四、Codis 客户端高可用

使用jodis做codis的连接,在项目中封装多代理ip 轮询负载均衡,实现高可用。

pom.xml配置:

<dependency>

       <groupId>io.codis.jodis</groupId>

      <artifactId>jodis</artifactId>

      <version>0.5.1</version>

</dependency>

properties 文件:

codis.zkAddr=127.0.0.1:2181,127.0.0.1:2181,127.0.0.1:2181

codis.zk.proxy.dir=/jodis/codis

codis.password=

1. 代码实现

@Bean

public JedisResourcePool getPool() {

JedisPoolConfig poolConfig = new JedisPoolConfig();

poolConfig.setMaxIdle(max_idle);

poolConfig.setMaxTotal(max_active);

poolConfig.setTestOnBorrow(true); //在borrow一个jedis实例的时候,是否要进行验证操作,如果赋值true。则得到的jedis实例肯定是可以用的。

poolConfig.setTestOnReturn(true); //在return一个jedis实例的时候,是否要进行验证操作,如果赋值true。则放回jedispool的jedis实例肯定是可以用的。

poolConfig.setMaxWaitMillis(max_wait);

poolConfig.setBlockWhenExhausted(false); //连接耗尽的时候,是否阻塞,false 会抛出异常,true 阻塞直到超时。默认为true。

JedisResourcePool pool = RoundRobinJedisPool.create().poolConfig(poolConfig)

.curatorClient(zkAddr, timeout)

.password(password).zkProxyDir(zkProxyDir).build();

return pool;

}

注意:如果没有设置密码,以上代码去掉password。

封装以上jedisPool为启动时加载,注入bean,其他服务使用时,注入即可。

线上环境使用时,将127.0.0.1 换成自己的真实ip即可,这里只是范例。

2. Spring 配置方式接入

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">

<!--最大分配的对象树 -->

<property name="maxTotal" value="1024"></property>

<!--最大能够保持idle状态的对象数 -->

<property name="maxIdle" value="0"></property>

<!--当缓存池内没有返回数据时,最大等待时间 -->

<property name="maxWaitMillis" value="1000"></property>

<!-- 当调用borrow Object方法时,是否进行有效性检查 -->

<property name="testOnBorrow" value="false"></property>

<!--当调用return Object方法时,是否进行有效性检查 -->

<property name="testOnReturn" value="false"></property>

</bean>

<bean id="jedisPool" class="com.deppon.cache.store.RedisClient">

<property name="host" value="127.0.0.1:2181,127.0.0.1:2181,127.0.0.1:2181"></property>

<property name="timeout" value="30000"></property>

<property name="zkProxyDir" value="/jodis/codis"></property>

<property name="poolConfig" ref="poolConfig"></property>

</bean>


五、踩坑

报错: JedisException- Proxy list empty

解决:

1. 检查proxy是否已经成功的添加到集群中,在zk中就可以查看。/jodis/productName路径下,看是否有对应的proxy。如:

jodis在zk下的配置信息

2. 修改codis3的proxy.toml文件

# Set jodis address & session timeout.

jodis_addr = "127.0.0.1:2181,127.0.0.1:2181,127.0.0.1:2181" 

jodis_addr必须设置


报错: Could not get a resource from the pool

查询异常详情,发现 cause by ERR Client sent AUTH, but no password is set

这里意思是服务端没有设置password,客户端链接是确使用了password ,就会报这个错误。去掉password 即可。


-----------------------------------------------------------------------------------------------

作者:CleverApe

来源:CSDN

原文:https://blog.csdn.net/qq_27641935/article/details/90774449

版权声明:本文为博主原创文章,转载请附上博文链接!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342