在定位问题、测试等时候经常需要对memcache的数据进行一些操作,但是其本身没有自带的客户端,所以只能通过telnet来进行操作,下面对操作memcache指令进行详细解释。
主要是三个存储数据的命令:set,add,replace
"set" 命令是保存一个叫做key的数据到服务器上;
"add" 命令是添加一个数据到服务器,但是服务器必须保证这个key是不存在的,能够保证数据不会被覆盖;
"replace" 命令是替换一个已经存在的的数据,如果数据不存在,就是类似于set功能;
//追加命令:
"append":向前追加,对存在的键进行追加
"prepend":向后追加,对存在的键进行追加
保存在服务器上唯一的一个表示符,必须是跟其他的key不冲突,否则会覆盖掉原来的数据,这个key是为了能够准确的存取一个数据的项目。
标记是一个16位的无符号整型数据,用来设置服务器端跟客户端一些交互操作。
是数据在服务器上的有效期限,如果是0,则数据永远有效,单位是秒,memcache服务器端会把一个数据的有效期设置为当前unix时间+设置的有效时间
数据的长度,block data块数据的长度,一般在这个长度结束以后下一行跟着block data数据内容,发送完数据以后,客户端一般等待服务器端的返回。
注意:存储的字节数一定要与实际存储值得字节数对应,否则无法存入报错“CLIENT_ERROR bad data chunk”
memcached的响应结果:
当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:
数据保存成功:STORED
数据保存失败:NOT_STORED
数据保存失败,一般是因为服务器端这个数据key已经存在了,或者是命令的语法错误。
1,memcached 连接
2,set命令
3,add命令
4,replace 命令
5,append 命令
6,prepend 命令
7,CAS命令
8,get 命令
9,gets 命令
10,delete 命令
11,incr与decr 命令
12,stats 命令
13,stats items 命令
14,stats slabs 命令
15,stats sizes 命令
16,flush_all 命令
语法格式:
telnet HOST PORT
//HOST: 为memcached服务的ip
//PORT:为memcached服务的端口
实例:
[root@nginx-server ~]# telnet 172.16.1.130 11211
Trying 172.16.1.130...
Connected to 172.16.1.130.
Escape character is '^]'.
##如果想结束当前连接,使用quit指令:
[root@nginx-server ~]# telnet 172.16.1.130 11211
Trying 172.16.1.130...
Connected to 172.16.1.130.
Escape character is '^]'.
quit #退出终端
Connection closed by foreign host.
[root@nginx-server ~]#
set命令用于将 value存储在指定的key中;
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
set命令是add命令和replace命令的集合体
语法格式:
set key flags exptime bytes [noreply] value
参数解释:
- key:键值key-value 结构中的key,用于查找缓存值。
- flags:可以包括键值的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选):该参数告知服务器不需要返回数据。
- value:存储的值(始终位于第二行,可直接理解为key-value结构中的value)
实例:
set test1 0 900 9 #设置键名为test1,flag为0,缓存时间900秒,存储字节数9
memcached #存储的值为memcached
STORED
get test1 #获取该key的数据值
VALUE test1 0 9
memcached #返回刚刚存储key的数据值
END
set test1 0 9000 13 #对已存在的key进行set
new-memcached
STORED
get test1 #获得该key新的数据值
VALUE test1 0 13
new-memcached #可以看到如果set的key已存在,会实现更新的作用
END
输出信息说明:
add 命令用于将 value存储在指定的key中。
如果add 的 key已经存在,则不会更新数据(过期的key会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
语法格式:
add key flags exptime bytes [noreply] value
参数解释:
- key:键值key-value结构中的key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选):该参数告知服务器不需要返回数据。
- value:存储等的值(始终位于第二行,可直接理解为键值结构中的value)
实例:
add test2 0 900 10 #添加的键名为test2,flag为0,缓存时间900秒,存储字节10
date_value #存储的值为date_value
STORED
get test2 #获得该键的数据值
VALUE test2 0 10
date_value
END
add test2 0 900 9 #如果添加的key已存在,不会更新数据,将获得响应NOT_STORED
new_value
NOT_STORED
get test2 #之前的存储的值保持不变
VALUE test2 0 10
date_value
END
输出信息说明:
replace命令用于替换已存在的key的value。如果key不存在,则替换失败,并且将获得响应 NOT_STORED。
语法格式:
replace key flags exptime bytes [noreply] value
参数解释:
- key:键值key-value结构中的key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选):该参数告知服务器不需要返回数据。
- value:存储等的值(始终位于第二行,可直接理解为键值结构中的value)
实例:
#添加一个新的key(test3),并存储对应的值为date_value
add test3 0 900 10
date_value
STORED
get test3
VALUE test3 0 10
date_value
END
#替换已存在的key的值为new_date_value
replace test3 0 900 14
new_date_value
STORED
get test3
VALUE test3 0 14
new_date_value #key的value替换成功
END
输出信息说明:
append命令用于向已存在key的value后面追加数据。
语法格式:
append key flags exptime bytes [noreply] value
参数解释:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。• exptime:在缓存中保存键值对的时间长度(以秒为单位, 0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为 key-value 结构中的 value)
实例:
#添加一个新的key(键名为test4),并存储对应的值为abc
add test4 0 900 3
abc
STORED
get test4
VALUE test4 0 3
abc
END
#使用append命令在key为test4的值后面追加“1234”
append test4 0 900 4
1234
STORED
get test4 #使用get命令获得该值
VALUE test4 0 7
abc1234 #追加value成功
END
输出信息说明:
与append命令相反,prepend命令用于向已存在的key的value前面追加数据。
语法格式:
prepend key flags exptime bytes [noreply] value
参数解释:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位, 0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为 key-value 结构中的 value)
实例:
get test4 #还是基于上个实例存储的key
VALUE test4 0 7
abc1234
END
#使用prepend命令在key(test4)的值前面追加“new”
prepend test4 0 900 3
new
STORED
get test4
VALUE test4 0 10
newabc1234
END
输出信息说明:
CAS命令用于执行一个“检查并设置”的操作,它仅在当前客户端最后一次取值后,该key对应的值没有被其他客户端修改的情况下,才能够将值写入。
检查使用过cas_token参数进行的,这个参数是memcache指定给已经存在的元素的一个唯一的64位值。
CAS命令的作用:使用CAS命令的目的就是保证当前只有一个client对memcache进行操作。如果没有操作成功,那就说明有其他的client对这个key-value进行了操作。那么需要重新利用gets取到当前的cas_token,然后继续进行cas操作。主要是为了分布式环境中更新的一致性问题。
语法格式:
cas key flags exptime bytes unique_cas_token [noreply] value
参数解释:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位, 0 表示永远)
- bytes:在缓存中存储的字节数
- unique_cas_token 通过 gets 命令获取的一个唯一的 64 位值。
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为 key-value 结构中的 value)
实例:
要在memcached上使用CAS命令,需要从memcached服务商通过gets命令获取令牌(token)。
#如果没有设置唯一令牌,则cas命令执行错误
cas test5 0 900 9
ERROR
#如果key不存在,执行失败
cas test5 0 900 9 2
memcached
NOT_FOUND
#添加一个key-value
set test5 0 900 9
memcached
STORED
#使用gets命令获取唯一令牌(12)
gets test5
VALUE test5 0 9 12
memcached
END
#使用cas命令更新数据
cas test5 0 900 5 12
abcde
STORED
#查看数据更新成功
get test5
VALUE test5 0 5
abcde
END
输出信息说明:
get命令获取存储在key中的value,如果key不存在,则返回空。
基本语法格式:
get key
多个key使用空格隔开:
get key1 key2 key3
参数说明:
key:键值key-value结构中的key,用于查找缓存值
实例:
set test6 0 900 9
memcached
STORED
get test6
VALUE test6 0 9
memcached
END
gets命令获取带有CAS令牌存储的value,如果key不存在,则返回空。
基本语法格式:
gets key
多个key使用空格隔开:
gets key1 key2 key3
实例:
gets test6
VALUE test6 0 9 15
memcached
END
#在使用gets命令的输出结果中,在最后一列的数字15 代表了key(test6)的CAS令牌。
扩:gets命令的功能类似于基本的get命令;两个命令之间的差异在于:gets返回的信息稍微多一些:64 位的整型值非常像名称/值对的 "版本" 标识符。
delete命令用于删除已存在的key键。
语法格式:
delete key [noreply]
参数解释:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- noreply(可选): 该参数告知服务器不需要返回数据
实例:
delete test6
DELETED
get test6
END
#以上个实例为例,使用delete命令删除该key(test6)
输出信息说明:
incr与decr命令用于对已存在的key(键)的数据值进行自增或自减操作。incr与decr命令操作的数据必须是十进制的32为无符号整数。
如果key不存在返回NOT_FOUND,如果键的值不为数字,则返回CLIENT_ERROR,其他错误返回ERROR。
incr 命令:
语法格式:
incr key increment_value
参数解释:
key:键值key-value结构中的key,用于查找缓存值。
increment_value:增加的数值。
实例:
#创建一个键(test7),数据初始值为10
set test7 0 900 2
10
STORED
get test7
VALUE test7 0 2
10
END
#使用incr命令进行自增的操作(加5)
incr test7 5
15
get test7
VALUE test7 0 2
15 #最后返回的数据值为15
END
decr 命令
语法格式:
decr key decrement_value
参数解释:
key:键值key-value结构中的key,用于查找缓存值。
decrement_value:减少的数值。
实例:
get test7
VALUE test7 0 2
15
END
decr test7 10
5
get test7
VALUE test7 0 2
5
END
#以上个实例中的key(test7)初始值为15,使用decr命令进行自减操作(减10),最后返回的数据值为5
stats命令用于返回统计信息例如PID,版本号,连接数等。
语法格式:
stats
实例:
在以下实例中,使用stats命令来输出memcached服务信息。这里显示了很多状态信息,下边详细解释每个状态项:
stats
STAT pid 1332 #memcache 服务器进程 ID
STAT uptime 25950 #服务器已运行秒数
STAT time 1583711222 #服务器当前unix时间戳
STAT version 1.4.33 #memcache版本
STAT libevent 2.0.22-stable #memcahe libevent版本信息
STAT pointer_size 64 #操作系统指针代销
STAT rusage_user 1.257281 #进程累计用户时间
STAT rusage_system 3.981391 #进程累计系统时间
STAT curr_connections 5 #当前连接数量
STAT total_connections 36 #memcached运行以来连接总数
STAT connection_structures 6 #memcached分配的连接结构数量
STAT reserved_fds 20
STAT cmd_get 33 #get命令请求次数
STAT cmd_set 27 #set命令请求次数
STAT cmd_flush 0 #fulsuh命令请求次数
STAT cmd_touch 0
STAT get_hits 23 #get命令命中次数
STAT get_misses 10 #get命令未命中次数
STAT get_expired 4
STAT get_flushed 0
STAT delete_misses 0 #delete命令未命中次数
STAT delete_hits 2 #delete命令命中次数
STAT incr_misses 0 #incr命令未命中次数
STAT incr_hits 1 #incr命令命中次数
STAT decr_misses 0 #decr命令未命中次数
STAT decr_hits 1 #decr命令命中次数
STAT cas_misses 2 #cas命令为命中次数
STAT ca*_hits 1 #cas命令命中次数
STAT cas_badval 0 #使用擦拭次数
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0 #认证命令处理的次数
STAT auth_errors 0 #认证失败数目
STAT bytes_read 1893 #读取总字节数
STAT bytes_written 1636 #发送总字节数
STAT limit_maxbytes 2147483648 #分配的内存总大小(字节)
STAT accepting_conns 1 #服务器是否达到过最大连接(0/1)
STAT listen_disabled_num 0 #失效的监听数
STAT time_in_listen_disabled_us 0
STAT threads 4 #当前线程数
STAT conn_yields 0 #连接操作主动放弃数目
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 241 #当前存储占用的字节数
STAT curr_items 3 #当前存储的数据总数
STAT total_items 16 #启动以来存储的数据总数
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0 #LRU释放的对象数目
STAT reclaimed 1 #已过期的数据条目来存储新数据的数目
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
END
stats items Ingles用于显示各个slab中item 的数目和存储时长(最后一次访问距离现在的秒数)。
语法格式:
stats items
例如:
stats items
STAT items:1:number 3
STAT items:1:age 7875
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 1
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
STAT items:1:crawler_reclaimed 0
STAT items:1:crawler_items_checked 0
STAT items:1:lrutail_reflocked 0
END
stats slabs 命令用于显示各个slab的信息,包括chunk的大小,数目,使用情况等。
语法格式:
stats slabs
例如:
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 3
STAT 1:free_chunks 10919
STAT 1:free_chunks_end 0
STAT 1:mem_requested 241
STAT 1:get_hits 23
STAT 1:cmd_set 27
STAT 1:delete_hits 2
STAT 1:incr_hits 1
STAT 1:decr_hits 1
STAT 1:ca*_hits 1
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
stats sizes命令用于显示所有item的大小和个数。
该信息返回两列:第一列是item的大小,第二列是item的个数。
语法:
stats sizes
实例:
stats sizes
STAT sizes_status disabled #统计大小\状态已禁用
END
Memcached 1.4.27 及以后的版本自动开启了 stats sizes 功能 这之前的版本需要在 Memcached 启动时带上 -o track_sizes 则来开启 。
如果只是想单独了解当前版本信息,可以使用version指令。
语法格式:
version
例子:
version
VERSION 1.4.33 #当前memcached的版本号
flush_all 命令用于清理缓存中的所有key-value(键-值)对。
该命令提供了一个可选参数 time:用于在制定的时间后执行清理缓存操作。
语法格式:
flush_all [time] [noreply]
实例:
set test 0 900 9
memcached
STORED
get test
VALUE test 0 9
memcached
END
flush_all
OK
get test
END
#在制定的时间后执行清理,操作如下:
flush_all 10 //单位秒,表示在10秒后执行清理操作
注:这个指令一般不要轻易使,除非你确实想把所有数据都干掉,删除后是无法恢复的。
memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。他通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态,数据库驱动网站的速度。memcached基于一个存储键值对的hashmap。其守护进程(daemon)是用C语言写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
memcache分布式集群搭建环境如下:
主机 | ip地址 | 操作系统 | |
---|---|---|---|
magent1+keepalived-master | 172.16.1.100 | CentOS 7.3 | VIP地址:172.16.1.200 |
magent2+keepalived-slave | 172.16.1.110 | CentOS 7.3 | |
memcached1 | 172.16.1.120 | CentOS 7.3 | |
memcached2 | 172.16.1.130 | CentOS 7.3 | |
client | 172.16.1.30 | CentOS 7.3 |
1,首先安装依赖库libevent(四台服务器都安装)
libevent安装包官网下载:http://libevent.org/
[root@magent1-master ~]# tar zxf libevent-2.0.22-stable.tar.gz -C /usr/src/
[root@magent1-master ~]# cd /usr/src/libevent-2.0.22-stable/
[root@magent1-master libevent-2.0.22-stable]# ./configure --prefix=/usr/ && make && make install
2,安装memcached软件(后两台memcached服务器安装)
memcached官网下载:https://memcached.org/downloads
[root@memcached1 ~]# tar zxf memcached-1.4.33.tar.gz -C /usr/src/
[root@memcached1 ~]# cd /usr/src/memcached-1.4.33/
[root@memcached1 memcached-1.4.33]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/
[root@memcached1 memcached-1.4.33]# make && make install
#启动memcached服务
主缓存:
[root@memcache1 memcached-1.4.33]#ln -s /usr/local/memcached/bin/memcached /usr/local/sbin/
[root@memcached1 ~]# memcached -d -m 1024 -u root -l 172.16.1.120 -p 11211
[root@memcached1 ~]# netstat -anput | grep memcached
tcp 0 0 172.16.1.120:11211 0.0.0.0:* LISTEN 9678/memcached
#设置防火墙:
[root@memcached1 ~]# firewall-cmd --add-port=11211/tcp --permanent
success
[root@memcached1 ~]# firewall-cmd --reload
success
备缓存:
[root@memcached2 memcached-1.4.33]# ln -s /usr/local/memcached/bin/memcached /usr/local/sbin/
[root@memcached2 memcached-1.4.33]# memcached -d -m 1024 -u root -l 172.16.1.130 -p 11211
[root@memcached2 memcached-1.4.33]# netstat -anput | grep memcached
tcp 0 0 172.16.1.130:11211 0.0.0.0:* LISTEN 8551/memcached
#设置防火墙:
[root@memcached2 ~]# firewall-cmd --add-port=11211/tcp --permanent
success
[root@memcached2 ~]# firewall-cmd --reload
success
3,安装magent代理软件(2台Magent服务器安装)
Magent 是一款开源的 Memcached 代理服务器软件,使用它可以搭建高可用性的集群应用的 Memcached 服务 ,备份 Memcached 数据,尽管 Memcached 服务挂掉,前端也能获取到数据,客户端先连到 Magent 代理服务器 ,然后Magent 代理服务器 在可以连接多台 Memcached 服务器,然后可以进行数据的保存和备份数据。这样数据就不会丢失,保存了数据完整性。
magent安装包下载地址:https://code.google.com/archive/p/memagent/downloads
#例如安装当前最新版本magent-0.6:
[root@magent1-master ~]# mkdir /usr/magent
[root@magent1-master ~]# tar zxf magent-0.6.tar.gz -C /usr/magent/
[root@magent1-master ~]# cd /usr/magent/
[root@magent1-master magent]# ls
ketama.c ketama.h magent.c Makefile
#解决报错问题
[root@magent1-master magent]# vim ketama.h
修改头部信息(最大值),修改内容如下:
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
[root@magent1-master magent]# ln -s /usr/lib64/libm.so /usr/lib64/libm.a
[root@magent1-master magent]# ln -s /usr/lib64/libevent-1.4.so.2 /usr/lib64/libevent.a
[root@magent1-master magent]# /sbin/ldconfig
[root@magent1-master magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c
gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a
gcc: error: /usr/lib64/libevent.a: No such file or directory
make: *** [magent] Error 1
#如果还出现以上错误,修改Makefile文件:
[root@magent1-master magent]# vim Makefile
找到 LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a
修改为LIBS = /usr/lib/libevent.a /usr/lib64/libm.a
#重新编译:
[root@magent1-master magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib/libevent.a /usr/lib64/libm.a
[root@magent1-master magent]# ls
ketama.c ketama.h ketama.o magent magent.c magent.o Makefile
[root@magent1-master magent]# cp magent /usr/bin/
主缓存和备缓存一样的启动命令,需要通过“-l” 参数指定漂移IP,因为还没有搭建keepalived,所以暂时不要启动Magent服务。
4,安装keepalived高可用软件(安装在2台Magent服务器上)
安装包官网下载:https://www.keepalived.org/download.html
#安装依赖:
[root@magent1-master ~]# yum -y install openssl-devel
#安装keepalived
[root@magent1-master ~]# tar zxf keepalived-1.2.13.tar.gz -C /usr/src/
[root@magent1-master ~]# cd /usr/src/keepalived-1.2.13/
[root@magent1-master keepalived-1.2.13]# ./configure --prefix=/ && make && make install
#配置主缓存服务器:
[root@magent1-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL_R1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.1.200 #指定漂移地址
}
}
#启动keepalived:
[root@magent1-master ~]# service keepalived start
Unit keepalived.service could not be found.
Reloading systemd: [ OK ]
Starting keepalived (via systemctl): [ OK ]
配置备缓存服务器:
[root@magent2-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL_R2 #路由id保持不同
}
vrrp_instance VI_1 {
state BACKUP #状态为BACKUP
interface ens33
virtual_router_id 51
priority 99 #优先级保持比master低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.1.200 #漂移地址保持一致
}
}
#启动服务:
[root@magent2-slave ~]# service keepalived start
Reloading systemd: [ OK ]
Starting keepalived (via systemctl): [ OK ]
#解决脑裂问题:
由于防火墙会将vrrp 广播给过滤掉了,导致backup接受不到master的广播,然后自己去争抢了vip,我们称这种为脑裂现象,为了防止脑裂的发生,在不关闭防火墙的情况下,我们需要开启防火墙vrrp规则:
#注意:主和备服务器都需开启:
[root@magent1-master ~]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
success //注释:ens33为设备网卡,224.0.0.18为vrrp主播地址
[root@magent1-master ~]# firewall-cmd --reload
success
#重启keepalived服务:
[root@magent1-master ~]# service keepalived restart
Restarting keepalived (via systemctl): [ OK ]
#查看vip地址(确保只漂移在master主机上)
[root@magent1-master ~]# ip add show dev ens33
inet 172.16.1.200/32 scope global ens33
#启动magent服务:(主备启动命令相同)
[root@magent1-master ~]# magent -u root -n 51200 -l 172.16.1.200 -p 12000 -s 172.16.1.120:11211 -b 172.16.1.130:11211
[root@magent1-master ~]# netstat -anput | grep 12000
tcp 0 0 172.16.1.200:12000 0.0.0.0:* LISTEN 23877/magent
//注意:备缓存启动后是查看不到12000的监听端口的,因为现在是备用的状态。
#开放防火墙的12000端口(主备都需开启)
[root@magent1-master ~]# firewall-cmd --add-port=12000/tcp --permanent
success
[root@magent1-master ~]# firewall-cmd --reload
success
参数解释:
-u:用户
-n:最大连接数
-l:magent对外监听的ip地址
-p:magent对外监听的端口
-s:magent主缓存ip地址和端口
-b:magent备缓存ip地址和端口
#确保能够ping通vip地址:
[root@sunqiuming-3 ~]# ping 172.16.1.200 -c 5
PING 172.16.1.200 (172.16.1.200) 56(84) bytes of data.
64 bytes from 172.16.1.200: icmp_seq=1 ttl=64 time=0.266 ms
64 bytes from 172.16.1.200: icmp_seq=2 ttl=64 time=0.417 ms
64 bytes from 172.16.1.200: icmp_seq=3 ttl=64 time=0.458 ms
64 bytes from 172.16.1.200: icmp_seq=4 ttl=64 time=0.443 ms
64 bytes from 172.16.1.200: icmp_seq=5 ttl=64 time=0.403 ms
--- 172.16.1.200 ping statistics ---
1)连接上主缓存的12000端口并插入数据:
#安装telnet工具
[root@sunqiuming-3 ~]# yum -y install telnet
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000 #远程连接的地址为VIP地址
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
set test 0 0 9 #存储一个key(test)- value(memcached)
memcached
STORED
get test
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.
2)连接主memcacehd节点的11211端口进行查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.120 11211
Trying 172.16.1.120...
Connected to 172.16.1.120.
Escape character is '^]'.
get test #获得该key的数据值
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.
3)连接备memcached节点的11211端口进行查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.130 11211
Trying 172.16.1.130...
Connected to 172.16.1.130.
Escape character is '^]'.
get test
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.
说明主备memcacehd节点都有数据。
模拟故障,宕掉主memcached缓存节点
#停止memcacehd进程(或者断开主缓存节点的网卡)
[root@memcached1 ~]# killall memcached
[root@memcached1 ~]# netstat -anput | grep memcached
#客户端查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
get test #通过访问vip地址,能够正常获得数据
VALUE test 0 9
memcached
END
模拟keepalived故障(master服务器宕机)
#停止主keepalived的服务:
[root@magent1-master ~]# service keepalived stop
Stopping keepalived (via systemctl): [ OK ]
[root@magent1-master ~]# service keepalived status
● keepalived.service - SYSV: Start and stop Keepalived
Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
#并且停止12000端口:
[root@magent1-master ~]# killall magent
[root@magent1-master ~]# netstat -anput | grep magent
#查看vip地址是否漂移到slave服务器上:
[root@magent2-slave ~]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a6:d1:22 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.110/24 brd 172.16.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet 172.16.1.200/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::b0fb:5a7d:7c85:4b98/64 scope link
valid_lft forever preferred_lft forever
#启动备缓存服务器的magent服务(12000端口)
[root@magent2-slave ~]# magent -u root -n 51200 -l 172.16.1.200 -p 12000 -s 172.16.1.120:11211 -b 172.16.1.130:11211
[root@magent2-slave ~]# netstat -anput | grep 12000
tcp 0 0 172.16.1.200:12000 0.0.0.0:* LISTEN 23052/magent
#这是个缺陷,在生产环境中,一般会编写触发式脚本,当master宕掉后,自动开启12000端口服务
#客户端再次查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
get test #通过vip地址,正常访问缓存中的数据
VALUE test 0 9
memcached
END
总结:
memcache的优点:可以做多主或者多从;
memcache的缺点:当主缓存节点宕掉又恢复,之前的缓存数据会丢失,通过magent取到的值就会为Null。
解决方法:
1、在每次memcache宕机修复后可以写一个程序把集群中的其他memcache的所有信息全给拷贝到当前宕机修复后的memcache中。
2、自己写代理,当从一个memcached服务上取到的值为null时再去其他memcached上取值。
注意事项:
magent的调用方式同memcached一样,客户端可以不用改代码即可实现切换到magent模式下。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。