高性能内存对象缓存 Memcached

目录

一、案例分析

1.1、案例概述

1.2、案例前置知识点

1)数据存储方式与数据过期方式

[2)Memcached 缓存机制](#2)Memcached 缓存机制)

[3)Memcached 分布式](#3)Memcached 分布式)

[4)Memcached 路由算法](#4)Memcached 路由算法)

1.3、案例环境

1)本案例环境

2)案例拓扑

3)案例需求

4)案例实现思路

二、案例实施

[2.1、安装 Memcached 服务器](#2.1、安装 Memcached 服务器)

[1)安装 libevent](#1)安装 libevent)

[2)安装 Memcached](#2)安装 Memcached)

[3)设置 mamcached 服务脚本](#3)设置 mamcached 服务脚本)

[2.2、Memcached API 客户端](#2.2、Memcached API 客户端)

[1)编译安装 Libmemcached](#1)编译安装 Libmemcached)

[2)编译安装 Memcached 扩展](#2)编译安装 Memcached 扩展)

[3)配置 PHP 添加 Memcached 组件](#3)配置 PHP 添加 Memcached 组件)

[4)测试 memcached-API 功能](#4)测试 memcached-API 功能)

[2.3、Memcached 数据库操作与管理](#2.3、Memcached 数据库操作与管理)

[三、Memcached 实现主主复制和高可用的方式](#三、Memcached 实现主主复制和高可用的方式)

[3.1、Memcached 主主复制架构](#3.1、Memcached 主主复制架构)

[1)安装带有复制功能的 Memcached](#1)安装带有复制功能的 Memcached)

[2)启动 Memcached 服务](#2)启动 Memcached 服务)

[3)使用 telnet 进行简单验证复制功能](#3)使用 telnet 进行简单验证复制功能)

[3.2、Memcached 主主复制+Keepalived 高可用架构](#3.2、Memcached 主主复制+Keepalived 高可用架构)

[1)安装配置 keepalived](#1)安装配置 keepalived)

2)测试验证


一、案例分析

1.1、案例概述

Memcached 是一套开源的高性能分布式内存对象缓存系统,它将所有的数据都存储在内存中,因为内存中会统一维护一张巨大的 Hash 表,所以支持任意存储类型的数据。很多网站使用 Memcached 提高网站的访问速度,尤其是需要频繁访问数据的大型网站。

Memcached 是典型的 C/S 架构,因此需要构建 Memcached 服务器端与 Memcached API 客户端。Memcached 服务器端是用 C 语言编写的,而 Memcached API 客户端可用任何语言来编写(如 PHP、Python、Perl 等),并通过 Memcached 协议与 Memcached 服务器端进行通信。常用典型架构如下图示。

Memcache 常用架构

当Web客户端发出请求到Web服务器的应用程序时,应用程序会调用Memcached API 客户端程序库接口去连接 Memcached 服务器查询数据。如果 Web 客户端所请求的数据在 Memcached 服务端中已经缓存,则 Memcached 服务端会将数据返回给 Web 客户端;否 则,会将 Web 客户端请求发送至 MySQL 数据库,由数据库查询并返回请求的数据给 Memcached 以及 Web 客户端,与此同时 Memcached 服务器也会将数据进行保存,方便 下次用户请求使用。

1.2、案例前置知识点

1)数据存储方式与数据过期方式

Memcached 具有独特的数据存储方式和数据过期方式。

  • 数据存储方式:Slab Allocation

Slab Allocation 即按组分配内存,每次先分配一个 Slab,相当于一个大小为 1M的页。然后,在 1M 的空间里根据数据划分大小相同的 Chunk,如下图所示。该方法可以有效解决内存碎片问题,但也可能会使内存空间产生浪费。

Slab Allocation

  • 数据过期方式:LRU、Laxzy Expiration

LRU 和 Laxzy Expiration 是数据过期的两种方式:

  1. LUR 是指追加的数据空间不足时,会根据 LRU 的情况淘汰最近最少使用的记录;
  2. Laxzy Expiration 即惰性过期,是指使用 get 时查看记录时间,从而检查记录是否已经过期。

2)Memcached 缓存机制

缓存是常驻在内存的数据,能够快速进行读取,而 Memcached 就是这样一款非常出色的缓存软件。当程序写入缓存数据请求时,Memcached 的 API 接口将 Key 输入路由算法模块并路由到集群中的一台服务器,之后由 API 接口与服务器进行通信, 完成一次分布式缓存写入,如下图所示。

Memcached 缓存机制

3)Memcached 分布式

Memcached 分布式部署主要依赖于 Memcached 的客户来端实现 , 多个Memcached 服务器是独立的。分布式数据如何存储是由路由算法所决定。

当数据到达客户端程序库,客户端的算法就依据路由算法来决定保存的 Memcached 服务器。读取数据时,客户端依据使用保存数据时相同的路由算法选中和存储数据时相同的服务器来读取数据,如下图所示。

Memcached 分布式

4)Memcached 路由算法

  • 求余数的 hash 算法

求余数 hash 算法先用 key 做 hash 运算得到一个整数,再去做 hash 算法,根据余数进行路由,这种算法适合大多数据需求。但是不适合用在动态变化的环境中,比如有大量机器添加或者删除,这样会导致大量的对象存储位置失效。

  • 一致性 hash 算法

一致性 hash 算法适合在动态变化的环境中使用。原理是按照 hash 算法把对应 的 key 通过一定的 hash 算法处理后映射形成一个首尾相接闭合循环,然后通过使用与对象存储一样的 hash 算法将机器也映射到环中,顺时针方向计算将所有对象存储 到离自己最近的机器中,如下图所示。

一致性 hash 算法

1.3、案例环境

1)本案例环境

本案例使用三台 CentOS 7.3 系统完成,其中:两台是 Memcached 服务器,另一台是基于 LNMP 架构进行 Memcached 扩展的 Memcached API 客户端,案例环境如下表所示。 在实际生产环境中,具体需求可以根据企业需求进行架构调整。

|--------|-----------|------------------------------|-------------------------------------------------------------------------------------------------------------------------|
| 主机 | 操作系统 | 主机名/IP地址 | 主要软件及版本 |
| 服务器 | CentOS7.6 | mamcache1/192.168.23.201 | libevent-2.1.8-stable.tar.gz memcached-1.5.1.tar.gz memcached-1.2.8-repcached-2.2.tar.gz keepalived-1.2.13-8.el7.x86_64 |
| 服务器 | CentOS7.6 | mamcache2/192.168.23.202 | libevent-2.1.8-stable.tar.gz memcached-1.2.8-repcached-2.2.tar.gz keepalived-1.2.13-8.el7.x86_64 |
| 客户端 | CentOS7.6 | mamcached-API/192.168.23.203 | httpd-2.4.25.tar.gz php-5.5.38.tar.gz libmemcached-1.0.18.tar.gz memcached-2.2.0.tgz |

2)案例拓扑

因 Memcached 主主复制架构,在程序连接时并不知道哪个是主服务器,所以需要在前端添加 VIP 地址,来实现缓存服务器的高可用架构。网络拓扑如下图所示。

Memcached 高可用架构

3)案例需求

  • 安装部署 Memcached 服务;
  • 安装 Memcached API 客户端;
  • 实现 Memcached 主主复制+高可用。

4)案例实现思路

  • 首先安装 Memcached 服务器 及 Memcachd API 客户端;
  • 利用 Keepalived 构建 Memcached 高可用架构;
  • 测试并验证 Keepalived 高可用所带来的稳定性;

二、案例实施

2.1、安装 Memcached 服务器

1)安装 libevent

Libevent 是一款跨平台的事件处理接口的封装,可以兼容多个操作系统的事件访问。 Memcached 的安装依赖于 Libevent,因此需要先完成 Libevent 的安装。

bash 复制代码
[root@mamcache1 ~]# tar zxf libevent-2.1.8-stable.tar.gz -C /usr/src/
[root@mamcache1 ~]# cd /usr/src/libevent-2.1.8-stable/
[root@mamcache1 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
[root@mamcache1 libevent-2.1.8-stable]# make && make install

到此 Libevent 安装完毕,接下来就可以安装 Memcached。

2)安装 Memcached

采用源码的方式进行 Memcached 的编译安装,安装时需要指定 Libevent 的安装路径。

bash 复制代码
[root@mamcache1 ~]# tar zxf memcached-1.5.1.tar.gz -C /usr/src/
[root@mamcache1 ~]# cd /usr/src/memcached-1.5.1/
[root@mamcache1 memcached-1.5.1]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
[root@mamcache1 memcached-1.5.1]# make && make install

3)设置 mamcached 服务脚本

Memcached 服器安装完成后,可以使用安装目录下的 bin/memcached 来启动服务。但是,为了更加方便地管理 Memcached 服务,可以编写脚本来管理 Memcached 服务。

bash 复制代码
[root@mamcache1 ~]# vim /usr/local/memcached/memcached_service.sh
#!/bin/bash
CMD="/usr/local/memcached/bin/memcached"
start(){
  $CMD -d -m 128 -u root
}
stop(){
killall memcached;
}
ACTION=$1
case $ACTION in
'start')
     start;;
'stop')
     stop;;
'restart')
     stop
     sleep 2
     start;;
*)
  echo 'Usage:{start | stop | restart}'
esac

其中启动 Memcached 服务时,-d 选项的作用是以守护进程的方式运行 Memcached 服务,-m 选项是为 Memcached 服务分配 128M 的内存(应根据企业需要调整),-u 选项指定运行的用户账号。

脚本编写完成之后即可设置脚本权限并启动 Memcached 服务。

bash 复制代码
[root@mamcache1 ~]# chmod 755 /usr/local/memcached/memcached_service.sh 
[root@mamcache1 ~]# /usr/local/memcached/memcached_service.sh start

Memcached 服务启动之后,监听 11211/tcp 端口。

bash 复制代码
[root@mamcache1 ~]# netstat -anpt | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      17559/memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      17559/memcached   

2.2、Memcached API 客户端

为了使得程序可以直接调用 Memcached 库和接口,可以使用 Memcached 扩展组件将 Memcache 添加为 PHP 的一个模块。此扩展使用了 Libmemcached 库提供的 API 与 Memcached 服务端进行交互。

客户端需要安装 Nginx 与 PHP 来测试 Memcache 客户端,对于 Nginx 与 PHP 的配置过程这里省略。

1)编译安装 Libmemcached

在编译 Memcached 扩展组件时,需要指定 Libmemcached 库的位置,所以先安装 Libmemcached 库。

bash 复制代码
[root@memcached-api ~]# tar zxf libmemcached-1.0.18.tar.gz -C /usr/src/
[root@memcached-api ~]# cd /usr/src/libmemcached-1.0.18/
[root@memcached-api libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached
[root@memcached-api libmemcached-1.0.18]# make && make install

2)编译安装 Memcached 扩展

安装 Libmemcached 库后,就可以进行 PHP 的 Memcached 扩展

bash 复制代码
[root@memcached-api ~]# tar zxf memcached-2.2.0.tgz -C /usr/src/
[root@memcached-api ~]# cd /usr/src/memcached-2.2.0/
[root@memcached-api memcached-2.2.0]#

需要注意的是,在配置 Memcached API 时,memcached-2.2.0.tgz 源码包中默认没有 configure 配置脚本,需要使用 PHP 的 phpize 脚本生成配置脚本 configure。

bash 复制代码
[root@memcached-api memcached-2.2.0]# /usr/local/php5/bin/phpize 
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@memcached-api memcached-2.2.0]# cp -r /usr/local/php5/include/php/ext/ ./
[root@memcached-api memcached-2.2.0]# ./configure --enable-memcached --with-php-config=/usr/local/php5/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl

配置时使用--disable-memcached-sasl 选项,关闭 Memcached 的 SASL 认证功能,否则会报错。

bash 复制代码
[root@memcached-api memcached-2.2.0]# make && make test && make install
Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/  //共享组件的位置

3)配置 PHP 添加 Memcached 组件

编辑 PHP 配置文件 php.ini,添加 Memcached 组件支持

bash 复制代码
[root@memcached-api memcached-2.2.0]# cd /usr/local/php5/
[root@memcached-api php5]# vim php.ini 
......省略部分内容
extension_dir="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/"
extension=memcached.so
//添加以上两行

通过 PHPinfo 查看是否已经添加 Memcached 扩展模块

bash 复制代码
[root@memcached-api ~]# cat /usr/local/nginx/html/index.php 
<?php
phpinfo();
?>
[root@memcached-api ~]# 

使用浏览器进行访问,结果如下图所示,即表示已经成功。

phpinfo 信息

4)测试 memcached-API 功能

通过编写简单的 PHP 测试代码调用 Memcache 程序接口来测试是否与 Memcached 服 务器协同工作,代码如下所示。

bash 复制代码
[root@memcached-api ~]# cat /usr/local/nginx/html/test.php 
<?php
 $memcache=new Memcached();
 $memcache->addServer('192.168.23.201',11211);
 $memcache->set('key','Memcache test successful!',0,60);
 $result=$memcache->get('key');
 unset($memcache);
echo $result;
?>

//重启php-fpm
[root@memcached-api ~]# killall -9 php-fpm  
[root@memcached-api ~]# /usr/local/sbin/php-fpm

此段代码的作用是在客户端连接 Memcached 服务器,设置名为'key'的键、值为 'Memcache test successful!',并读取显示,成功表示服务器与客户端协同工作正常。使用浏览器进行访问,测试结果如下图所示。

测试页面

2.3、Memcached 数据库操作与管理

直接使用telnet连接Memcached的11211端口对Memcached数据库进行操作与管理。

bash 复制代码
[root@memcache1 ~]# yum -y install telnet*
[root@mamcache1 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
//输入操作指令

操作命令格式为<command name><key><flags><exptime><bytes><data block>,下面是 Memcached 数据库的常见操作指令。

  • 添加一条键值数据

下面的操作指令中,add username 0 0 7 表示键值名为 username,标记位表示自定义信息为 0,过期时间为 0(永不过期,单位为秒),字节数为 7; example 为键值,这里 需要注意输入长度为 7 字节,与设定值符合。

bash 复制代码
add username 0 0 7
example
STORED
  • 查询键值数据

下面的操作指令中,get 后跟键名。如果检查最近是否更新,可以使用 gets,最后一位显示的是更新因子,每更新一次更新因子数会加一。

bash 复制代码
get username
VALUE username 0 7
example
END
gets username 
VALUE username 0 7 2
example
END
  • 更新一条键值数据

下面的操作指令中,set 后跟需要更新的键名、标记位、过期时间、字节数。如果键名不存在,set 相当于 add 添加。

bash 复制代码
set username 0 0 10
everything
STORED
get username
VALUE username 0 10
everything
END

如果仅仅是想单纯的更新没有添加功能,使用 replace,此时更新的键名必须存在,如果键名不存在会报 NOT_STORED 的错误,具体操作如下所示。

bash 复制代码
replace username 0 0 7
lodging
STORED
gets username
VALUE username 0 7 4
lodging
END
replace username1 0 0 7
example
NOT_STORED
  • 清除一条缓存数据

下面的操作指令表示使用 delete 删除一条键值为 usernmame 的缓存数据,使用 get 查看没有内容存在。

bash 复制代码
delete username
DELETED
get username
END

三、Memcached 实现主主复制和高可用的方式

3.1、Memcached 主主复制架构

Memcached 的复制功能支持多个 Memcached 之间相互复制(双向复制,主备都是可读可写的),可以解决 Memcached 的容灾问题

要使用 Memcached 复制架构,需要卸载之前 memcache1 机器上的 1.5.1 版本的 memcached,重新下载支持复制功能的 Memcached 安装包。

bash 复制代码
[root@mamcache1 ~]# /usr/local/memcached/memcached_service.sh stop
[root@mamcache1 ~]# netstat -anpt | grep memcached

安装过程与之前安装的 Memcached 方法相同,这里做简略介

1)安装带有复制功能的 Memcached

安装完成 libevent 之后,将下载的 memcached-1.2.8-repcached-2.2.tar.gz 进行解压,之后完成配置编译安装。

bash 复制代码
[root@mamcache1 ~]# tar zxf memcached-1.2.8-repcached-2.2.tar.gz -C /usr/src
[root@mamcache1 ~]# cd /usr/src/memcached-1.2.8-repcached-2.2/
[root@mamcache1 memcached-1.2.8-repcached-2.2]# ./configure --prefix=/usr/local/memcached_replication --enable-replication --with-libevent=/usr/local/libevent
[root@mamcache1 memcached-1.2.8-repcached-2.2]# vim memcached.c  //修改memcached.c 配置文件  
  55 /* FreeBSD 4.x doesn't have IOV_MAX exposed. */
  56 #ifndef IOV_MAX
  57 /* #if defined(__FreeBSD__) || defined(__APPLE__) */  //注释此行
  58 # define IOV_MAX 1024
  59 /* #endif */  //注释此行
  60 #endif
[root@mamcache1 memcached-1.2.8-repcached-2.2]# make && make install

2)启动 Memcached 服务

复制功能的 Memcached 安装完成之后,需要将编译安装的 libevent-2.1.so.6 模块复制到/usr/lib64 目录下,否则在启动带有复制功能的 Memcached 服务时会报错。 启动服务时,使用-x 选项指向对端。

bash 复制代码
[root@mamcache1 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
[root@mamcache1 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.23.202
[root@mamcache1 ~]# netstat -anpt | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      75384/memcached     
tcp        0      0 0.0.0.0:11212           0.0.0.0:*               LISTEN      75384/memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      75384/memcached 

同样启动 memcached2 服务器,注意启动 Memcached 服务时指向对端。

memcache2服务器配置如下

bash 复制代码
[root@memcache2 ~]# tar zxf libevent-2.1.8-stable.tar.gz -C /usr/src/
[root@memcache2 ~]# cd /usr/src/libevent-2.1.8-stable/
[root@memcache2 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
[root@memcache2 libevent-2.1.8-stable]# make && make install
[root@memcache2 libevent-2.1.8-stable]# cd
[root@memcache2 ~]# tar zxf memcached-1.2.8-repcached-2.2.tar.gz -C /usr/src/
[root@memcache2 ~]# cd /usr/src/memcached-1.2.8-repcached-2.2/
[root@memcache2 memcached-1.2.8-repcached-2.2]# ./configure --prefix=/usr/local/memcached_replication --enable-replication --with-libevent=/usr/local/libevent
[root@mamcache2 memcached-1.2.8-repcached-2.2]# vim memcached.c  //修改memcached.c 配置文件  
  55 /* FreeBSD 4.x doesn't have IOV_MAX exposed. */
  56 #ifndef IOV_MAX
  57 /* #if defined(__FreeBSD__) || defined(__APPLE__) */  //注释此行
  58 # define IOV_MAX 1024
  59 /* #endif */  //注释此行
  60 #endif
[root@mamcache2 memcached-1.2.8-repcached-2.2]# make && make install
[root@memcache2 memcached-1.2.8-repcached-2.2]# cd
[root@memcache2 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
[root@memcache2 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.23.201
[root@memcache2 ~]# netstat -anpt | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      75754/memcached     
tcp        0      0 192.168.23.202:37092    192.168.23.201:11212    ESTABLISHED 75754/memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      75754/memcached 
[root@memcache2 ~]# yum -y install telnet*

3)使用 telnet 进行简单验证复制功能

  • 在 Memcached1 上插入一条具有特点的键值
bash 复制代码
[root@mamcache1 ~]# telnet 192.168.23.201 11211
Trying 192.168.23.201...
Connected to 192.168.23.201.
Escape character is '^]'.
set username 0 0 8
20240319
STORED
get username
VALUE username 0 8
20240319
END
quit
Connection closed by foreign host.
  • 在 Memcached2 上进行查看刚刚插入的键值
bash 复制代码
[root@memcache2 ~]# telnet 192.168.23.202 11211
Trying 192.168.23.202...
Connected to 192.168.23.202.
Escape character is '^]'.
get username
VALUE username 0 8
20240319
END
get username2
END
quit
Connection closed by foreign host.

同理,在 Memcached2 上插入的数据,在 Memcached1 也可以查看到。这就是 Memcached 的主主复制。

3.2、Memcached 主主复制+Keepalived 高可用架构

Keepalived 不断检测 Memcached 主服务器的 11211 端 口 , 如果检测到 Memcached 服务发生宕机或者死机等,就会将 VIP 从主服务器移至从服务器,从而 实现 Memcached 的高可用性。

1)安装配置 keepalived

bash 复制代码
[root@mamcache1 ~]# yum -y install keepalived
  • 配置主 keepalived
bash 复制代码
[root@mamcache1 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.23.100
    }
}

virtual_server 192.168.23.100 11211 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    
    sorry_server 192.168.23.202 11211
    real_server 192.168.23.201 11211 {
        weight 1
        notify_down /root/memcached.sh
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 11211
        }
    }
}

[root@mamcache1 ~]# echo "/usr/bin/systemctl stop keepalived" > /root/memcached.sh
[root@mamcache1 ~]# chmod +x memcached.sh 
  • 配置备 keepalived

主从 keepalived 配置文件内容差不多,直接复制进行修改,以下只把不一样的地方整理出来。

bash 复制代码
[root@mamcache1 ~]# scp /etc/keepalived/keepalived.conf 192.168.23.202:/etc/keepalived/
The authenticity of host '192.168.23.202 (192.168.23.202)' can't be established.
ECDSA key fingerprint is SHA256:M5TK0bMSy5pMWJKgryvD8pa8iMCrS0to6csxeug8nvE.
ECDSA key fingerprint is MD5:4b:9c:f1:62:bb:8c:2c:0b:43:1f:b5:8d:ee:90:46:02.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.23.202' (ECDSA) to the list of known hosts.
root@192.168.23.202's password: 
keepalived.conf 
bash 复制代码
[root@memcache2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.23.100
    }
}

virtual_server 192.168.23.100 11211 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    
    sorry_server 192.168.23.201 11211
    real_server 192.168.23.202 11211 {
        weight 1
        notify_down /root/memcached.sh
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 11211
        }
    }
}


[root@memcache2 ~]# echo "/usr/bin/systemctl stop keepalived" > /root/memcached.sh
[root@memcache2 ~]# chmod +x memcached.sh 

2)测试验证

分别启动主从的 keepalived 服务。

bash 复制代码
[root@mamcache1 ~]# systemctl start keepalived
[root@mamcache2 ~]# systemctl start keepalived
  • 验证主 keepalived 获取 VIP 地址

使用 ip address show 命令查看 VIP 地址(使用 ifconfig 无法查看)

bash 复制代码
[root@mamcache1 ~]# ip addr | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.23.201/24 brd 192.168.23.255 scope global noprefixroute ens32
    inet 192.168.23.100/32 scope global ens32
  • 验证高可用性

关闭 Memcached1 服务器的 Memcached 服务,在 Memcached2 服务器上查看地址信息。

注意:一定要关闭两台机器的 selinux。

bash 复制代码
[root@mamcache1 ~]# killall memcached
[root@mamcache1 ~]# ip addr | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.23.201/24 brd 192.168.23.255 scope global noprefixroute ens32
bash 复制代码
[root@memcache2 ~]# ip addr | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.23.202/24 brd 192.168.23.255 scope global noprefixroute ens32
    inet 192.168.23.100/32 scope global ens32

Keepalived 能够在主 Memcached 数据库上产生一个 VIP 地址,程序连接这个固定的 VIP 地址到主 Memcached 数据库,即使后端数据库主从切换,也不需要进行修改地址。因为当主 Memcached 数据库上 Memcached 服务停止时,keepalived 能在从 Memcached 服务器重新获取原来的 VIP 地址,从而实现主从的切换,这个过程叫做 VIP 地址漂移。

相关推荐
Karoku06625 分钟前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
小技与小术2 小时前
数据库表设计范式
数据库·mysql
刘九灵2 小时前
Redis ⽀持哪⼏种数据类型?适⽤场景,底层结构
redis·缓存
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer2 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪2 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿2 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员
无敌岩雀2 小时前
MySQL中的索引
数据库·mysql