- phpredisadmin工具
- rdbtools管理工具
- saltstack管理redis
- 通过codis完成redis管理
一:phpredisadmin工具:类似于mysqladmin管理mysql一样
安装环境:
[root@node5 ~]# yum install httpd php php-redis -y
下载管理包:
[root@node5 html]# git clone https://github.com/erikdubbelboer/phpRedisAdmin.git
更改名称并解决依赖:
[root@node5 html]# mv phpRedisAdmin admin [root@node5 html]# cd admin [root@node5 admin]# git clone https://github.com/nrk/predis.git vendor #解决依赖包
启动http,启动前确认80端口没有被占用,如果被占用可以修改监听的默认端口为80以为的其他端口:
[root@node5 html]# /etc/init.d/httpd restart Stopping httpd: [FAILED] Starting httpd: [ OK ]
[root@node5 html]# chkconfig httpd on
访问http://ServerIP/admin:
报错,无法打开,查看apache错误日志如下:
[Mon Mar 21 21:24:47 2016] [error] [client 192.168.10.1] PHP Fatal error: require(): Failed opening required '/var/www/html/admin/includes/../vendor/autoload.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/html/admin/includes/common.inc.php on line 2
解决过程:
[root@node5 admin]# cd includes/ [root@node5 includes]# ls config.sample.inc.php config.inc.php [root@node5 includes]# vim config.inc.php $config = array( 'servers' => array( array( 'name' => 'local server', // Optional name. 'host' => '192.168.10.205', #配置为自己的主机IP 'port' => 6379, 'filter' => '*', // Optional Redis authentication. //'auth' => 'redispasswordhere' // Warning: The password is sent in plain-text to the Redis server. ),
保存退出后重新启动httpd:
[root@node5 includes]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
再次测试还是不能访问,报错如下:
[Mon Mar 21 21:55:27 2016] [error] [client 192.168.10.1] PHP Fatal error: Call to undefined function mb_internal_encoding() in /var/www/html/admin/includes/common.inc.php on line 59
解决办法:
[root@node5 admin]# vim /var/www/html/admin/includes/common.inc.php mb_internal_encoding('utf-8'); 将此行改为注释,如下: #mb_internal_encoding('utf-8');
访问:
配置管理多个reids Server:
[root@node5 includes]# pwd /var/www/html/admin/includes [root@node5 includes]# vim config.inc.php $config = array( 'servers' => array( array( 'name' => '182.168.10.205', // Optional name. 'host' => '192.168.10.205', 'port' => 6379, 'filter' => '*', // Optional Redis authentication. //'auth' => 'redispasswordhere' // Warning: The password is sent in plain-text to the Redis server. ), array( #一个主机一个配置,名称自定义,IP和端口是Redis的IP和端口 'name' => '7001', // Optional name.name支持中文 'host' => '192.168.10.205', 'port' => 7001, ), array( 'name' => '7002', // Optional name. 'host' => '192.168.10.205', 'port' => 7002, ), array( 'name' => '7003', // Optional name. 'host' => '192.168.10.205', 'port' => 7003, ),
更改完成以后无需重启apache,如果浏览器已经打开管理地址,刷新一下即可:
二:rdbtools管理工具:
使用pip命令安装,如果没有pip命令则先安装pip:
[root@node5 ~]# yum install python-pip
使用pip安装rdbtools: pip install rdbtools
[root@node5 ~]# pip install rdbtools /usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning You are using pip version 7.1.0, however version 8.1.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. Collecting rdbtools /usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning Downloading rdbtools-0.1.6.tar.gz Installing collected packages: rdbtools Running setup.py install for rdbtools Successfully installed rdbtools-0.1.6
导出rdb中的key信息:
[root@node5 7001]# rdb -c memory dump_7001.rdb > memory.csv #然后将memory.csv文件下载到本地,即可用excel打开分析了,格式如下图:
三:通过saltstack管理redis:
模块名称:redismod
官方文档地址:https://docs.saltstack.com/en/latest/ref/modules/all/index.html
四:通过codis完成redis管理:
1.codis简介:
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.其架构如下:
Codis 由四部分组成:
- Codis Proxy (codis-proxy) #负责对redis server 的代理,可以在前端使用haproxy做负载均衡,负责调度redis-client的请求。
- Codis Dashboard (codis-config) #codis的管理工具,可以添加删除redis节点,发起数据迁移,还自带一个http server,提供一个dashboard可以在浏览器进行观察和配置。
- Codis Redis (codis-server) #基于redis 2.8做了一个分支,只能运行codis-server
- ZooKeeper/Etcd #Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.
codis-proxy 是客户端连接的 Redis 代理服务, codis-proxy 本身实现了 Redis 协议, 表现得和一个原生的 Redis 没什么区别 (就像 Twemproxy), 对于一个业务来说, 可以部署多个 codis-proxy, codis-proxy 本身是无状态的.
codis-config 是 Codis 的管理工具, 支持包括, 添加/删除 Redis 节点, 添加/删除 Proxy 节点, 发起数据迁移等操作. codis-config 本身还自带了一个 http server, 会启动一个 dashboard, 用户可以直接在浏览器上观察 Codis 集群的运行状态.
2.准备基础环境:
安装go语言并设置环境变量:
[root@node5 opt]# yum install golang -y #codis是基于go语言编写的,因此要安装go语言环境 [root@node5 opt]# mkdir /opt/gopath #保存go环境的路径 [root@node5 opt]# vim /etc/profile export GOPATH=/opt/gopath
[root@node5 opt]# source /etc/profile
安装配置zookeeper,需要有java环境:
[root@node5 ~]# wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz [root@node5 ~]# mv zookeeper-3.4.6 /usr/local/zookeeper #移动到目录 [root@node5 ~]# cd /usr/local/zookeeper/conf/ #进入到目录 [root@node5 conf]# cp zoo_sample.cfg /opt/zoo.cfg #复制配置文件 [root@node5 conf]# cd /opt/ [root@node5 opt]# mkdir zk1 zk2 zk3 #准备zookeeper 服务ID,每个服务器的ID是不同的 [root@node5 opt]# echo 1 > zk1/myid [root@node5 opt]# echo 2 > zk2/myid [root@node5 opt]# echo 3 > zk3/myid [root@node5 opt]# vim zoo.cfg #编辑配置文件 dataDir=/opt/zk1 #保存数据的命令 clientPort=2181 #客户端连接的端口 server.1 = 192.168.10.205:2887:3887 server.2 = 192.168.10.205:2888:3888 server.3 = 192.168.10.205:2889:3889 [root@node5 opt]# cp zoo.cfg zk1/zk1.cfg [root@node5 opt]# cp zoo.cfg zk2/zk2.cfg [root@node5 opt]# cp zoo.cfg zk3/zk3.cfg [root@node5 opt]# vim zk2/zk2.cfg #每个服务对应不同的目录 dataDir=/opt/zk2
clientPort=2182 [root@node5 opt]# vim zk3/zk3.cfg dataDir=/opt/zk3
clientPort=2183
详细配置:
[root@node5 opt]# grep '^[a-z]' zk3/zk3.cfg tickTime=2000 #服务器和客户端的心跳维持间隔,间隔多久发送心跳 initLimit=10 #选举的时候的时间间隔是10次,10次 * 2000微秒 syncLimit=5 # Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度 dataDir=/opt/zk3 #数据保存目录 clientPort=2181 #客户端连接的端口 server.1 = 192.168.10.205:2887:3887 #集群端口和ID配置 server.2 = 192.168.10.205:2888:3888 server.3 = 192.168.10.205:2889:3889 详细解释: tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。 dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。 clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。 initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒 syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒 server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
启动每个zookeeper 服务:
[root@node5 opt]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk1/zk1.cfg JMX enabled by default Using config: /opt/zk1/zk1.cfg Starting zookeeper ... STARTED [root@node5 opt]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk2/zk2.cfg JMX enabled by default Using config: /opt/zk2/zk2.cfg Starting zookeeper ... STARTED [root@node5 opt]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk3/zk3.cfg JMX enabled by default Using config: /opt/zk3/zk3.cfg Starting zookeeper ... STARTED
确认端口启动成功:
[root@node5 opt]# ss -tnl | grep 2181 LISTEN 0 50 :::2181 :::* [root@node5 opt]# ss -tnl | grep 2182 LISTEN 0 50 :::2182 :::* [root@node5 opt]# ss -tnl | grep 2183 LISTEN 0 50 :::2183 :::* [root@node5 opt]#
查看每个节点的状态:
[root@node5 opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk1/zk1.cfg JMX enabled by default Using config: /opt/zk1/zk1.cfg Mode: follower [root@node5 opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk2/zk2.cfg JMX enabled by default Using config: /opt/zk2/zk2.cfg Mode: leader #这是主的,另外两个是从的,表示已经启动完成 [root@node5 opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk3/zk3.cfg JMX enabled by default Using config: /opt/zk3/zk3.cfg Mode: follower
连接到zookeeper节点:
[root@node5 opt]# /usr/local/zookeeper/bin/zkCli.sh -server 192.168.10.205:2181
[root@node5 opt]# /usr/local/zookeeper/bin/zkCli.sh -server 192.168.10.205:2181Connecting to 192.168.10.205:2181 2016-03-22 01:27:48,325 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT 2016-03-22 01:27:48,331 [myid:] - INFO [main:Environment@100] - Client environment:host.name=node5.a.com 2016-03-22 01:27:48,332 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_45 2016-03-22 01:27:48,334 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation 2016-03-22 01:27:48,334 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.45.x86_64/jre 2016-03-22 01:27:48,334 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper/bin/../build/classes:/usr/local/zookeeper/bin/../build/lib/*.jar:/usr/local/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper/bin/../src/java/lib/*.jar:/usr/local/zookeeper/bin/../conf: 2016-03-22 01:27:48,334 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 2016-03-22 01:27:48,335 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp 2016-03-22 01:27:48,335 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA> 2016-03-22 01:27:48,335 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux 2016-03-22 01:27:48,335 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64 2016-03-22 01:27:48,335 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-431.el6.x86_64 2016-03-22 01:27:48,335 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root 2016-03-22 01:27:48,335 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root 2016-03-22 01:27:48,336 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/opt 2016-03-22 01:27:48,337 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.10.205:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@6ade299f Welcome to ZooKeeper! 2016-03-22 01:27:48,393 [myid:] - INFO [main-SendThread(192.168.10.205:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.10.205/192.168.10.205:2181. Will not attempt to authenticate using SASL (unknown error) 2016-03-22 01:27:48,424 [myid:] - INFO [main-SendThread(192.168.10.205:2181):ClientCnxn$SendThread@852] - Socket connection established to 192.168.10.205/192.168.10.205:2181, initiating session JLine support is enabled 2016-03-22 01:27:48,621 [myid:] - INFO [main-SendThread(192.168.10.205:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 192.168.10.205/192.168.10.205:2181, sessionid = 0x1539a349fc40000, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null