redis+主从+持久化+分片+集群+spring集成

作者: 云计算机网 分类: 云计算知识 发布时间: 2016-04-05 10:58

Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型。所以得到很多开发者的青睐。加之其支持主从、持久化等功能,3.0版本开始正式提供分片技术、让其在大型互联网应用中大显身手,本文通过实际操作和理论相配合,对redis进行详细地阐述。

一、redis的安装与使用

下载直接去redis的官网http://redis.io/进行不同操作系统对应的版本。本文中采用的redis的版本为3.2.5、linux平台,安装过程如下

[root@hbase usr]# tar -zxf redis-3.2.5.tar.gz [root@hbase usr]# cd redis-3.2.5[root@hbase redis-3.2.5]# ll[root@hbase redis-3.2.5]# make[root@hbase redis-3.2.5]# cd src[root@hbase src]# ll

之后我们会发现其中redis-server和redis-cli,这两个文件分别对应启动redis的服务端和客户端,启动服务端

[root@hbase src]# ./redis-server 11579:M 13 Nov 15:07:01.399 # Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.                _._                                                             _.-``__ ''-._                                                   _.-``    `.  `_.  ''-._           Redis 3.2.5 (00000000/0) 32 bit  .-`` .-```.  ```/    _.,_ ''-._                                    (    '      ,       .-`  | `,    )     Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379 |    `-._   `._    /     _.-'    |     PID: 11579  `-._    `-._  `-./  _.-'    _.-'                                    |`-._`-._    `-.__.-'    _.-'_.-'|                                   |    `-._`-._        _.-'_.-'    |           http://redis.io          `-._    `-._`-.__.-'_.-'    _.-'                                    |`-._`-._    `-.__.-'    _.-'_.-'|                                   |    `-._`-._        _.-'_.-'    |                                    `-._    `-._`-.__.-'_.-'    _.-'                                         `-._    `-.__.-'    _.-'                                                 `-._        _.-'                                                         `-.__.-'                                               11579:M 13 Nov 15:07:01.404 # Server started, Redis version 3.2.511579:M 13 Nov 15:07:01.409 * The server is now ready to accept connections on port 6379

可以看到,redis正常启动,6379 是 redis 服务端口,这个端口在redis.conf中可以进行配置,稍后我们讲解配置文件的时候会提到。不要关闭这个窗口,因为当前redis-server不是在后台运行,我们另起一个窗口,在当前目录下进行客户端连接服务端。

[hadoop@hbase src]$ ./redis-cli 127.0.0.1:6379>  
  • 需求架构

    wKioL1NaiXqTBOgtAAGdUZq9ZDA040.jpg

    准备工作

    主从服务器时间同步

    # 主从服务器同时配置crontab任务,与NTP服务器同步时间即可*/5 * * * * ntpdate 172.16.0.1 &>/dev/null

    MariaDB的安装

    详见博客“MySQL初识-架构-安装-初始化-连接-管理工具-数据文件”

    部署配置

    主库配置

    vi /etc/my.cnf    server-id = 1 # 在复制架构中,需保持全局唯一    log-bin = mysql-bin # 默认在数据目录下    sync_binlog = 1 # 设置mariadb每次在提交事务前会将二进制日志同步到磁盘,保证服务器崩溃时不会丢失事件=====service mysqld start # 启动mariadb10=====mysql -hlocalhost -uroot -p # 登录mysqlMariaDB [mysql]> grant replication slave,replication client on *.* to 'repluser'@'172.16.%.%' identified by 'replpass'; # 创建最小权限的复制账号MariaDB [mysql]> flush privileges;MariaDB [mysql]> show master status; # 查看主库的状态信息

    wKioL1Nai5fgVvYsAAHQjGQ3S7A342.jpg

    从库配置

    vi /etc/my.cnf    server-id = 11 # 在复制架构中,需保持全局唯一    log-bin = mysql-bin # 也可设置为none,即关闭从库的二进制日志    relay-log=/data/relaylogs/relay-bin # 设置中继日志文件    log-slave-updates = 1 # 允许从库将其重放的事件也记录到自身的二进制日志中    read_only = 1 # 从库设置为只读=====service mysqld start # 启动mariadb10=====mysql -hlocalhost -uroot -p # 登录mysqlMariaDB [mysql]> change master to master_host='172.16.251.123',master_user='repluser',master_password='replpass',master_log_file='master-bin.000005',master_log_pos=379; # 连接主库MariaDB [mysql]> start slave;MariaDB [mysql]> show slave status\G 查看从库状态

    wKiom1NajRjgqUcpAAQK7ziCark469.jpg

    验证

    # 在主库上新建数据库并创建数据MariaDB [(none)]> create database test_for_replication;MariaDB [(none)]> create table test_for_replication.user(id int not null primary key auto_increment,name char(20) not null,year int not null,classid int not null);MariaDB [(none)]> insert into test_for_replication.user(name,year,classid) values('Jason Kk',23,2),('Hello Kitty',18,1);# 查看从库能否正常同步数据MariaDB [(none)]> select * from test_for_replication.user; # 见下图1MariaDB [(none)]> show slave status\G # 见下图2#p#分页标题#e#

    图1

    wKioL1NajbuT5Z4mAAFp74FsT9w733.jpg

    图2

    wKioL1NajqGCubCsAAQpXb_BfJE097.jpg

    可以看出主从同步正常,数据无误!

    基于SSL进行安全复制

    生成SSL证书及私钥

    主从服务器都需要获得各自的证书,具体步骤详见“图解openssl实现私有CA”

    主库和从库各需的证书文件有:

    wKiom1NamouCh79IAAFZXip6VAQ897.jpg

    主库配置

    SSL支持状态检查:

    wKiom1NakfSy1e9LAAHZf2OCumE450.jpg

    若have_ssl的值为YES,则表明SSL功能已开启使用;

    若have_ssl的值为NO,则说明SSL功能并未编译进目前的Mariadb,需要重新编译程序;

    若have_ssl的值为DISABLED,则表示mariadb编译时加载了SSL功能,但未启用,一般以通用二进制程序安装的Mariadb都是此值;

    查看库文件:

    ldd `which mysqld` | grep ssl # 还需查看是否存在libssl.so文件,若不存在,则说明缺少库文件# 麻烦的是若要安装此缺少的库文件,则需安装libopenssl.1.0.0的程序包,但这个包的安装依赖于glibc2.14版本,而CentOS6.5系统上原生的是glibc2.12版本的,这下就又涉及glibc的升级了,过于麻烦了,而且也很危险,故放弃之# 那么就只能重新编译安装mariadb10了,从官网下载最新版的源码包安装吧(www.mariadb.com)

    Mariadb编译安装完成后,就可以配置基于SSL的安全复制了

    chown -R mysql.mysql /etc/master/ssl/ # 注意修改认证相关文件的权限=====vi /etc/my.cnf # 在mysqld段下添加如下内容[mysqld]ssl_ca= /etc/master/ssl/cacert.pem # 配置CA证书ssl_cert = /etc/master/ssl/master.crt # 配置主库证书ssl_key = /etc/master/ssl/master.key # 配置主库私钥ssl_cipher = DHE-RSA-AES256-SHA # 指定支持的加密算法=====service mysqld reload # 重载配置=====# 再次查看相关变量:MariaDB [(none)]> show variables like '%ssl%' # 见下图# 创建复制账户:MariaDB [mysql]> grant replication slave,replication client on *.* to 'repluser'@'172.16.%.%' identified by 'replpass' reuire ssl; # 特别明确必须通过SSL才能复制#p#分页标题#e#

    wKioL1Nak4Sxf5k0AALjW953ZL4200.jpg

    从库配置

    chown -R mysql.mysql /etc/slave/ssl/=====MariaDB [mysql]> change master to master_host='172.16.251.123',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000010',master_log_pos=776,master_ssl=1,master_ssl_ca='/etc/slave/ssl/cacert.pem',master_ssl_cert='/etc/slave/ssl/slave.crt',master_ssl_key='/etc/slave/ssl/slave.key'; # 在连接主库时直接指定本地从库的证书文件等信息MariaDB [mysql]> start slave;MariaDB [mysql]> show slave status\G # 查看从库状态

    wKiom1NalQDQLV_bAAfjqT5VsdY496.jpg

    从库的另一种配置方法

    vi /root/.my.cnf # 在client段下配置从库证书信息[client]ssl_ca = /etc/slave/ssl/cacert.pemssl_cert = /etc/slave/ssl/slave.crtssl_key = /etc/slave/ssl/slave.keyssl_cipher = DHE-RSA-AES256-SHA=====MariaDB [mysql]> change master to master_host='172.16.251.123',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000010',master_log_pos=776,master_ssl=1; # 只需指定master_ssl=1即可

    验证

    # 主库写入:create test.table t1(name char(20) not null,age int not null);# 从库读取;show tables for test;# 验证结果见下图

    wKioL1NalULhDfW5AAH56fosqLY890.jpg