安装libevent:
cd /tmp
wget http://downloads.sourceforge.net/levent/libevent-2.0.22-stable.tar.gz
tar zxvf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure --prefix=/usr/
make && make install
将libevent的库文件添加到动态库中:
vi /etc/ld.so.conf
在最后添加如下行:
/usr/ //此处为要添加的libevent库目录
重新加载动态lib库
ldconfig
注意:如果无此步骤,在启动memcached时,会提示看不到libevent的库文件。
测试libevent是否安装成功:
ll /usr/lib/libevent*
3. 创建启动帐号:
groupadd memcached
useradd -g memcached memcached
4. 创建PID进程目录并修改所有者:
mkdir /var/run/memcached
chown -R memcached.memcached /var/run/memcached
5. 安装整合memcached-repcached包:
wget https://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz
mv memcached-1.2.8-repcached-2.2.1 memcached
cd memcached
./configure --prefix=/usr/local/memcached --with-libevent=/usr/ --enable-replication --enable-64bit
注意:默认memcached单个进程只支持到2G内存,需要更大内存支持的话,需要打开64位支持,编译的时候加参数:
--enable-64bit
make && make install
提示编译出错:
make all-recursive
make[1]: Entering directory `/usr/local/memcached'
Making all in doc
make[2]: Entering directory `/usr/local/memcached/doc'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/usr/local/memcached/doc'
make[2]: Entering directory `/usr/local/memcached'
gcc -DHAVE_CONFIG_H -I. -DNDEBUG -m64 -g -O2 -MT memcached-memcached.o -MD
MP -MF .deps/memcached-memcached.Tpo -c -o memcached-memcached.o `test -f
memcached.c' || echo './'`memcached.c
memcached.c: In function ‘add_iov’:
memcached.c:697: error: ‘IOV_MAX’ undeclared (first use in this function)
memcached.c:697: error: (Each undeclared> memcached.c:697: error: for each function it appears in.)
make[2]: *** [memcached-memcached.o] Error 1
make[2]: Leaving directory `/usr/local/memcached'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/memcached'
make: *** [all] Error 2
解决方案:
vi memcached.c
将下面的几行
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif
修改为
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
重新编译和安装:
make && make install
修改memcached目录所有者:
cd ..
chown -R memcached.memcached memcached
配置主从复制
参数说明:
-x 设置从哪个IP上进行同步。
-X 指定数据同步的端口。
Memcached默认服务端口是11211,默认同步监听端口是11212。
启动Master:
/usr/local/memcached/bin/memcached -d -m 100 192.168.11.51 -p 11211 -u memcached -c 1024 -x 192.168.11.52 -X 11212 -P /var/run/memcached/memcached-rep.pid
查看监听端口:
netstat -tupln | grep memcached
tcp 0 0 192.168.11.51:11211 0.0.0.0:* LISTEN 18634/memcached
tcp 0 0 192.168.11.51:11212 0.0.0.0:* LISTEN 18634/memcached
udp 0 0 192.168.11.51:11211 0.0.0.0:* 18634/memcached
启动Slave:
/usr/local/memcached/bin/memcached -d -m 100 -l 192.168.11.52 -p 11211 -u memcached -c 1024 -x 192.168.11.51 -X 11212 -P /var/run/memcached/memcached-rep.pid
说明:-x 192.168.11.51用于同步的Master的IP地址。
查看监听端口:
netstat -tupln | grep memcached
tcp 0 0 192.168.11.52:11211 0.0.0.0:* LISTEN 24262/memcached
udp 0 0 192.168.11.52:11211 0.0.0.0:* 24262/memcached
验证数据同步
在Master创建数据:
[root@test01 bin]# telnet 192.168.1.10 11211
Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
get key1
END
set key1 0 0 2
aa
STORED
quit
Connection closed by foreign host.
在Slave获取数据:
[root@test02 bin]# telnet 192.168.1.11 11211
Trying 192.168.1.11…
Connected to 192.168.1.11.
Escape character is ‘^]’.
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.
在Slave创建数据:
[root@test02 bin]# telnet 192.168.1.11 11211
Trying 192.168.1.11…
Connected to 192.168.1.11.
Escape character is ‘^]’.
get key2
END
set key2 0 0 3
bbb
STORED
get key2
VALUE key2 0 3
bbb
END
quit
Connection closed by foreign host.
在Master获取数据:
[root@test01 bin]# telnet 192.168.1.10 11211
Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
get key2
VALUE key2 0 3
bbb
END
quit
Connection closed by foreign host.
Memcached高可用
启动Master和Slave时不要加-l参数指定监听地址,否则keepalived无法监听VIP的地址。
/usr/local/memcached/bin/memcached -d -m 100 192.168.82.91 -p 11211 -u memcached -c 1024 -x 192.168.82.92 -X 11212 -P /var/run/memcached/memcached-rep.pid
然后配置上keepalived就可以作为高可用了。
以下是keppalived配置信息,在此就不多数了,相信大家都熟悉keepalived的作用了
MASTER 主机 配置信息
! Configuration File for keepalived
global_defs {
notification_email {
happy.yin@qq.com
}
notification_email_from zqtsx@email.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 101 主机 为 101
advert_int 1
authentication {
auth_type PASS 验证类型
auth_pass 1111 验证密码自己修改即可,记得主备机上的密码要一致
}
virtual_ipaddress {
192.168.1.120 虚拟IP 地址
}
}
SLAVE 从机 配置信息
! Configuration File for keepalived
global_defs {
notification_email {
happy.yin@qq.com
}
notification_email_from zqtsx@email.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100 从机 为 100
advert_int 1
authentication {
auth_type PASS 验证类型
auth_pass 1111 验证密码自己修改即可,记得主备机上的密码要一致
}
virtual_ipaddress {
192.168.1.120 虚拟IP 地址
}
}
通过虚拟IP进行memcached 存取操作
要用这个VIP启动memcached
[root@localhost happy]# telnet 192.168.1.120 11211
Trying 192.168.1.120…
Connected to 192.168.1.120.
Escape character is ‘^]’.
set key 0 0 6
123456
STORED
get key
VALUE key 0 6
123456
END
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.
OK keepalived + memcached主备模式到此设置完成了,下面我们来停止一台机器上的keepalived模拟down机,然后再用虚拟IP 192.168.1.120链接memcached并对其进行读写,看下能否正常访问到memcached数据就知道了主备模式是否健全了
[root@localhost happy]# telnet 192.168.1.120 11211
Trying 192.168.1.120…
Connected to 192.168.1.120.
Escape character is ‘^]’.
get key
VALUE key 0 6
123456
END
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.
OK MEMCACHED一切正常,不仅memcached实现了内存复制,而且keepalived运行也一切正常,至此一个完整可靠的memcached主备模式构建完成了。。。