ubuntu 安装codis详细教程
背景 关于Redis的高可用除了只身的Sentinel和Cluster之外,还有一个用的比较多的是Codis,由于公司的Redis大部分都使用Codis,本文就针对Codis进行相关的安装部署进行说明,来好好的认识Codis。 介绍 Codis 是一个分布式 Redis 解决方案,对于上层的应用来说,连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 (不支持的命令列表),上层应用可以像使用单机的 Redis 一样使用,Codis 底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的 Redis 服务。与Twemproxy 和 Redis Cluster 对比:?
环境
Codis 组件说明
?各个组件之间的关系: 客户端通过zk提供的信息访问Proxy,Proxy是无状态的,按照需要可以部署多个。通过Proxy访问多个Group(Server),Server的HA通过Sentinel来保证。更多的信息可以参考官方文档。 Codis主要由以下特点
安装环境 安装包下载: #go: wget?https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz #zookeeper: wget?http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz #codis: git?clone?https://github.com/CodisLabs/codis.git?-b?release3.2 安装依赖包: apt-get?install?gcc?make?autoconf?libtool?automake 1. zookeeper安装 zookeeper依赖JDK,需要先安装JDK: sudo?apt-get?update sudo?apt-get?install?openjdk-8-jdk #?或者jdk: sudo?add-apt-repository?ppa:webupd8team/java sudo?apt-get?update sudo?apt-get?install?oracle-java8-installer 1.1 解压文件 1:解压: tar?-xf?zookeeper-3.4.14.tar.gz? mv?zookeeper-3.4.14?/usr/local/zookeeper 2:编辑配置文件: cd?/usr/local/zookeeper/conf cp?zoo_sample.cfg?zoo.cfg 1.2?配置文件(zoo.cfg)见下面 #?The?number?of?milliseconds?of?each?tick tickTime=2000 #?The?number?of?ticks?that?the?initial? #?synchronization?phase?can?take initLimit=10 #?The?number?of?ticks?that?can?pass?between? #?sending?a?request?and?getting?an?acknowledgement syncLimit=5 #?the?directory?where?the?snapshot?is?stored. #?do?not?use?/tmp?for?storage,?/tmp?here?is?just? #?example?sakes. dataDir=/tmp/zookeeper #?the?port?at?which?the?clients?will?connect clientPort=2181 #?the?maximum?number?of?client?connections. #?increase?this?if?you?need?to?handle?more?clients #maxClientCnxns=60 # #?Be?sure?to?read?the?maintenance?section?of?the? #?administrator?guide?before?turning?on?autopurge. # #?http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # #?The?number?of?snapshots?to?retain?in?dataDir #autopurge.snapRetainCount=3 #?Purge?task?interval?in?hours #?Set?to?"0"?to?disable?auto?purge?feature #autopurge.purgeInterval=1 配置文件说明:
1.3 创建需要的目录: mkdir?-p?/data/zookeeper/data mkdir?-p?/data/zookeeper/log 1.4?设置环境变量 vim?/etc/profile #添加 #?ZooKeeper?Env export?ZOOKEEPER_HOME=/usr/local/zookeeper export?PATH=$PATH:$ZOOKEEPER_HOME/bin #应用环境变量 source?/etc/profile 1.5?单机模式 cd?/usr/local/zookeeper/conf vim?zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/log clientPort=2181 1.5.1?启动:zkServer.sh start root@root:~#?zkServer.sh?start ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Starting?zookeeper?...?STARTED 1.5.2?查看状态:zkServer.sh status root@root:~#?zkServer.sh?status ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Mode:?standalone 1.5.3?关闭:zkServer.sh stop root@root:~#?zkServer.sh?stop ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Stopping?zookeeper?...?STOPPED 注意:在单机模式中,Mode 的值是 "standalone"。 1.6.1?集群模式(3台) cd?/usr/local/zookeeper/conf vim?zoo.cfg #?内容 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/log clientPort=2181 #要是一台装三个zk,可以按照端口区分 server.1=192.168.3.159:2888:3888 server.2=192.168.3.237:2888:3888 server.3=192.168.3.212:2888:3888 注意:2888表示zookeeper监听端口,3888表示zookeeper选举通信端口;以上server.1 server.2 server.3都要配置到三台zookeeper的zoo.cfg文件。 配置说明:
创建myid文件:设置zookeeper的id,和server.ID对应。 在 dataDir 指定的目录下 (即 /data/zookeeper/data 目录) 创建名为 myid 的文件,文件内容和 zoo.cfg 中当前机器的 id 一致。根据上述配置,master 的 myid 文件内容为 1。 按照相同步骤,为 132 和 133 配置 zoo.cfg 和 myid 文件。zoo.cfg文件内容相同,132 的 myid 文件内容为 2,133 的 myid 文件内容为 3。 #在第1台zookeeper(192.168.163.131)上设置id=1 echo?"1"?>/data/zookeeper/data/myid #在第2台zookeeper(192.168.163.132)上设置id=2? echo?"2"?>/data/zookeeper/data/myid #在第3台zookeeper(192.168.163.133)上设置id=3 echo?"3"?>/data/zookeeper/data/myid 1.6.1?三台启动:zkServer.sh start root@root:~#?zkServer.sh?start ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Starting?zookeeper?...?STARTED 1.6.2?三台查看状态:zkServer.sh status root@root1:~#?zkServer.sh?status ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Mode:?leader root@root2:~#?zkServer.sh?status ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Mode:?follower root@root3:~#?zkServer.sh?status ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Mode:?follower 1.6.3?三台关闭:zkServer.sh stop root@root1:~#?zkServer.sh?stop ZooKeeper?JMX?enabled?by?default Using?config:?/usr/local/zookeeper/bin/../conf/zoo.cfg Stopping?zookeeper?...?STOPPED 2 Codis安装: 2.1 安装go语言环境?codis基于go开发: #解压: sudo?tar?-C?/usr/local?-xzf?go1.10.3.linux-amd64.tar.gz? #设置环境变量: vim?/etc/profile #添加: ##go export?GOROOT=/usr/local/go export?PATH=$PATH:$GOROOT/bin #用于安装codis的目录 export?GOPATH=/opt/gowork?##mkdir?-p?/opt/gowork #生效环境变量: source?/etc/profile 查看go语言版本 go?version go?version?go1.6.2?linux/386 2.2?创建需要的文件: mkdir?/opt/gowork 以上go的依赖环境已经安装完毕 2.3 安装Codis #创建目录 mkdir?-p?/opt/gowork/src/github.com/CodisLabs #git?clone迁移 mv?codis?/opt/gowork/src/github.com/CodisLabs/ #进入目录 cd?/opt/gowork/src/github.com/CodisLabs/codis #编译 make make?gotest 2.3.1?编译安装完毕之后先设置一个软连接: ln?-s?/opt/gowork/src/github.com/CodisLabs/codis/?/usr/local/codis 2.3.2?再设置环境变量: vim?/etc/profile #添加 #?Codis export?CODIS_HOME=/usr/local/codis export?PATH=$PATH:$CODIS_HOME/bin #应用环境变量 source?/etc/profile 2.4?配置启动Codis 2.4.1?新建目录专门存放codis的配置(包括在一台上安装(131)dashboard、proxy、fe等相关服务进程的配置) mkdir?-p?/etc/codis/codis-dashboard mkdir?-p?/etc/codis/codis-proxy?(三台) mkdir?-p?/etc/codis/codis-server?(一台) mkdir?-p?/etc/codis/codis-fe mkdir?–p?/etc/codis/codis-ha 2.4.2?新建codis-server(redis):三台上都安装 cp?/usr/local/codis/extern/redis-3.2.11/redis.conf?/etc/codis/codis-server/redis7021.conf 修改redis7021.conf: #?bind?127.0.0.1 protected-mode?no port?7021 daemonize?yes pidfile?/var/lib/redis_7021/redis_7021.pid logfile?"/var/lib/redis_7021/redis_7021.log" dbfilename?7021dump.rdb dir?/var/lib/redis_7021/ appendfilename?"7021appendonly.aof" 创建配置文件里所需的目录: mkdir?/var/lib/redis_7021 再新建一个codis-server: cd?/etc/codis/codis-server cp?redis7021.conf?redis7022.conf? sed?-i?"s/7021/7022/g"?redis7022.conf? mkdir?/var/lib/redis_7022 开启codis-server: codis-server?/etc/codis/codis-server/redis7021.conf? codis-server?/etc/codis/codis-server/redis7022.conf 2.4.3?配置codis-dashboard(一台) cd?/etc/codis/codis-dashboard/ cp?/usr/local/codis/config/dashboard.toml?/etc/codis/codis-dashboard/ 修改配置:vim /etc/codis/codis-dashboard/dashboard.toml ################################################## #????????????????????????????????????????????????# #??????????????????Codis-Dashboard???????????????# #????????????????????????????????????????????????# ################################################## #?Set?Coordinator,?only?accept?"zookeeper"?&?"etcd"?&?"filesystem". #?for?zookeeper/etcd,?coorinator_auth?accept?"user:password"? #?Quick?Start #coordinator_name?=?"filesystem" #coordinator_addr?=?"/tmp/codis" coordinator_name?=?"zookeeper" coordinator_addr?=?"192.168.3.159:2181,192.168.3.212:2181,192.168.3.237:2181"??#zk地址,多个逗号隔开 #coordinator_auth?=?"" #?Set?Codis?Product?Name/Auth. product_name?=?"codis-testX"?#集群名称 product_auth?=?""??#集群密码 #?Set?bind?address?for?admin(rpc),?tcp?only. admin_addr?=?"192.168.3.159:18080"?restful?api地址, #?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" sentinel_notification_script?=?"" sentinel_client_reconfig_script?=?"" 参数说明:
创建codis日志目录(存放codis所有log): mkdir?/usr/local/codis/logs 启动codis-dashboard服务:(一台) codis-dashboard?--ncpu=1?--config=/etc/codis/codis-dashboard/dashboard.toml?--log=/usr/local/codis/logs/dashboard.log?--log-level=warn?& 参数说明: ##--ncpu=N?最大使用?CPU?个数; ##-c??CONF,?--config=CONF?指定启动配置文件; ##-l???FILE,?--log=FILE?设置?log?输出文件; ##--log-level=LEVEL?设置?log?输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN; ##对于同一个业务集群而言,可以同时部署多个codis-proxy?实例; ##不同?codis-proxy?之间由?codis-dashboard?保证状态同步。 关闭codis-dashboard服务: codis-admin?--dashboard=192.168.163.131:18080?--shutdown 2.4.4 配置codis-proxy(三台):每台配置一个Proxy,也可以一台配置多个Proxy。 注意参数:proxy_max_clients cd?/etc/codis/codis-proxy/ cp?/usr/local/codis/config/proxy.toml?/etc/codis/codis-proxy/ 修改配置:vim /etc/codis/codis-proxy/proxy.toml ################################################## #????????????????????????????????????????????????# #??????????????????Codis-Proxy???????????????????# #????????????????????????????????????????????????# ################################################## #?Set?Codis?Product?Name/Auth. product_name?=?"codis-testX"??#和dashboard对应 product_auth?=?"" #?Set?auth?for?client?session #???1.?product_auth?is?used?for?auth?validation?among?codis-dashboard,#??????codis-proxy?and?codis-server. #???2.?session_auth?is?different?from?product_auth,?it?requires?clients #??????to?issue?AUTH?<PASSWORD>?before?processing?any?other?commands. session_auth?=?"" #?Set?bind?address?for?admin(rpc),?tcp?only. admin_addr?=?"192.168.163.131:11080"??#同一台服务器可以根据端口创建多个Proxy #?Set?bind?address?for?proxy,?proto_type?can?be?"tcp",?"tcp4",?"tcp6",?"unix"?or?"unixpacket". proto_type?=?"tcp4" proxy_addr?=?"192.168.163.131:19000"??#同一台服务器可以根据端口创建多个Proxy #?Set?jodis?address?&?session?timeout #???1.?jodis_name?is?short?for?jodis_coordinator_name,?only?accept?"zookeeper"?&?"etcd". #???2.?jodis_addr?is?short?for?jodis_coordinator_addr #???3.?jodis_auth?is?short?for?jodis_coordinator_auth,?for?zookeeper/etcd,?"user:password"?is?accepted. #???4.?proxy?will?be?registered?as?node: #????????if?jodis_compatible?=?true?(not?suggested): #??????????/zk/codis/db_{PRODUCT_NAME}/proxy-{HASHID}?(compatible?with?Codis2.0) #????????or?else #??????????/jodis/{PRODUCT_NAME}/proxy-{HASHID} jodis_name?=?"zookeeper" jodis_addr?=?"192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181" jodis_auth?=?"" jodis_timeout?=?"20s" jodis_compatible?=?false ... ... 参数说明:
启动codis-proxy服务(三台): codis-proxy?--ncpu=1?--config=/etc/codis/codis-proxy/proxy.toml?--log=/usr/local/codis/logs/proxy.log?--log-level=warn?& codis-proxy 启动后,处于 waiting online 状态(日志查询),监听 proxy_addr 地址,但是不会 accept 连接,添加到集群并完成集群状态的同步,才能改变状态为 online。添加的方法有以下两种:
codis-admin?--dashboard=192.168.3.159:18080?--create-proxy?-x?192.168.3.159:11080 其中 192.168.3.159:18080 以及 192.168.3.159:11080 分别为 dashboard 和 proxy 的 admin_addr 地址;可以在后面的codis-fe里看到 添加过程中,dashboard 会完成如下一系列动作:
停止codis-proxy服务: ?codis-admin?--proxy=192.168.3.159:11080?--shutdown 注意:直接kill Proxy进程zk的codis3里会有残留数据,建议codis-admin方式停codis-proxy服务? 2.4.5?配置codis-fe(一台) 配置文件 codis.json 可以手动编辑,也可以通过 codis-admin 从外部存储中拉取: cd?/etc/codis/codis-fe/ codis-admin?--dashboard-list?--zookeeper=192.168.3.159:2181?|?tee?codis.json #?启动信息 2019/02/11?11:52:19?zkclient.go:23:?[INFO]?zookeeper?-?zkclient?setup?new?connection?to?192.168.3.159:2181 2019/02/11?11:52:19?zkclient.go:23:?[INFO]?zookeeper?-?Connected?to?192.168.3.159:2181 2019/02/11?11:52:19?zkclient.go:23:?[INFO]?zookeeper?-?Authenticated:?id=72057932370608129,?timeout=40000 2019/02/11?11:52:19?zkclient.go:23:?[INFO]?zookeeper?-?Re-submitting?`0`?credentials?after?reconnect [ ????{ ????????"name":?"codis-testX",????????"dashboard":?"192.168.3.159:18080" ????} ] 2019/02/11?11:52:19?zkclient.go:23:?[INFO]?zookeeper?-?Recv?loop?terminated:?err=EOF 2019/02/11?11:52:19?zkclient.go:23:?[INFO]?zookeeper?-?Send?loop?terminated:?err=<nil> 启动codis-fe: codis-fe?--ncpu=1?--dashboard-list=/etc/codis/codis-fe/codis.json?--listen=192.168.3.159:18090?--log=/usr/local/codis/logs/fe.log?--log-level=warn?--assets-dir=/usr/local/codis/bin/assets/?& 关闭codis-fe: ps?-ef|grep?codis-fe|grep?-v?grep|awk?'{print?$2}'|xargs?kill 2.5 通过codis-fe进行web操作管理(http://192.168.3.159:18090) 注意在fe上添加的时候需要保证这些进程存在,fe不会自动开启,只是对这些已有进程进行相关操作。 2.5.1 添加proxy:地址是配置文件中配置的admin_addr信息,需要先开启codis-proxy(处于waiting online)。 2.5.2?添加Group 本文说明的Group就是一主一从的环境,当然也可以一主多从。在上面介绍codis-server中,只是开启了实例,没有做主从关系。现在通过codis-fe来进行主从关系的创建,添加group:
需要注意的是在fe上添加,组内默认第一个Server是master。 注意:点了PROMOTE之后,slave会被提升为master,但是老的master需要手动点(扳手)才能对新主进行同步。 按照上面继续添加GROUP 2和3,最终图的结果为:
3)初始化Slots:进行到这步的时候整个codis集群已经搭建完毕,最后只需要把Slots初始和分配下就可以使用了。 把0~300的slots分配给Group1,301~800的slots分配给Group2,801~1023的slots分配给Group3,最终结果图如下: 上面的图可以看到slots的分布信息,也可以通过condis-admin进行查询: codis-admin?--dashboard=192.168.163.131:18080?--slots-status 同一 同一 codis-fe?管理界面 https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md http://www.cnblogs.com/zhoujinyi/p/9249873.html http://blog.51cto.com/arthur376/2051993 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |