Docker——数据持久化(mysql、redis安装)

462 阅读17分钟

数据存储方案

容器层的 UnionFS(联合文件系统)对任何文件/目录的修改都会在该容器丢失或被删除全部丢失。如果container是一个数据库的服务,如果数据仅仅存储在container是非常不安全的,因此docker引入了数据持久化存储的机制.

  1. 定制镜像持久化:将这个修改过的容器生成一个新的镜像,让这些修改变为只读的镜像。
  2. 基于本地文件系统的Volume:可以在执行 docker create 或者 docker run 时, 通过 -v 参数将主机的目录作为容器的数据卷。这种持久化方式便于基于本地文件系统的volume管理。
  3. 基于plugin的Volume:支持第三方的存储方案, 比如 NAS, AWS。

image.png

定制镜像持久化

容器生成镜像:执行 docker commit 命令,以当前运行的容器为范本生成镜像。

  1. 运行容器、进入容器修改webapp目录

    docker run -dp 8080:8080 --name tomcat-8080 tomcat 
    docker exec -it tomcat-8080 /bin/bash
    

    将webapps.dist中的文件移动到webapps中 image.png

  2. 提交容器为新的镜像,并运行

     docker commit -a "dawn" -c "move webapps" -m "dawn-tomcat" tomcat-8080 dawn-tomcat:1.0
     docker run -dp 8081:8080 --name tomcat-8081 dawn-tomcat:1.0
    

    image.png

    image.png

Data Volume

数据卷是宿主机中的一个特殊的文件/目录,这个文件/目录与容器中的另一个文件/目录进行了直接关联,在任何一端对文件/目录的写操作,在另一端都会同时发生相应变化。在宿主中的这个文件/目录就称为数据卷,而容器中的这个关联文件/目录则称为该数据卷在该容器中的挂载点。 数据卷在容器启动时初始化,并且可以在容器之间共享和重用。数据卷的设计目的就是为了实现数据持久化,其完全独立于容器的生命周期,属于宿主机文件系统,但不属于 UnionFS。因此,容器被删除时,不会删除其挂载的数据卷。

  • Data Volume类型

    • data volume:受管理的data Volume,由docker自动创建,位置是固定的,名字是随机的
    • bind mounting:绑定挂载(Bind mounts)的Volume,具体挂载位置可以由用户指定
  • bind mounting 和 data volume 的区别?

    • data volume 需要在 Dockerfile 定义 Volume
    • bind mounting 只需要 -v 指明容器外部文件夹和容器映射文件夹的对应关系即可,将本地的文件映射到容器内其实就是宿主机的文件夹和容器内文件夹做的映射。

Bind mounts

  1. 创建读写数据卷(容器对挂载点具有读写权限)

    docker run时指定数据卷:docker run –it –v /宿主机目录绝对路径:/容器内目录绝对路径 镜像

    注:无论是宿主机中的数据卷还是容器中的挂载点,如果指定的目录不存在,那么 docker引擎都会自动创建。即使是多级目录不存在。

    示例:宿主机和虚拟机之间都是可读写的

    image.png

    通过 docker inspect [容器] 命令可以查看到当前容器中挂载点与数据卷的绑定关系。

    image.png image.png

  2. 创建只读数据卷

    只读数据卷,指的是容器对挂载点的操作是只读的。宿主机对数据卷的操作始终是读写的。有些情况下,为了防止容器在运行过程中对文件产生修改,就需要创建只读数据卷。该命令仅比之前的命令仅多了:ro体语法: docker run –it –v /宿主机目录绝对路径:/容器内目录绝对路径:ro 镜像

    示例: image.png

    使用命令查看:docker inspect centos:ro

    image.png

数据卷共享

当一个容器与另一个容器使用相同的数据卷时,就称这两个容器实现了“数据卷共享”。

数据卷容器:实现数据卷共享的一种非常有效的方案。当容器 C 启动运行时创建并挂载了数据卷,若其它容器也需要共享该容器 C 挂载的数据卷,这些容器只需在 docker run 启动时通过--volumes-from[容器 C] 选项即可实现数据卷共享。此时容器 C 就称为数据卷容器。

image.png

受管理的data Volume

通过使用 Dockerfile 的 VOLUME 指令指定数据卷方式实现的持久化。VOLUME 指令可以在容器中创建可以挂载数据卷的挂载点。其参数可以是字符串数组,也可以是使用空格隔开的多个纯字符串。例如,VOLUME ["/var/www", "/etc/apache"]VOLUME /var/www /etc/apache

  1. 创建dockerfile

    FROM centos:7
    VOLUME /docker/file /docker/config
    CMD /bin/bash
    
  2. 构建镜像并启动,启动后在容器对应的挂载点创建文件 image.png

  3. 验证 image.png image.png

常用的volume命令:

  • 列出volume:docker volume ls
  • 删除volume:docker volume rm [VOLUME NAME 上面 VOLUME 的全名]
  • 查看volume:docker volume inspect [VOLUME NAME 上面 VOLUME 的全名]

案例=>mysql、redis安装

mysql安装

  1. 拉取镜像,并启动mysql容器
docker pull mysql:5.7
docker run --name mysql -dp 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  1. 进入到mysql容器中并连接
docker exec -it mysql /bin/bash
mysql -uroot -p
  1. 建表测试
show databases;
create database test;
use test;
create table tuser(id int,name varchar(32),department varchar(32));

如果使用工具插入中文,报错: [HY000][1366] Incorrect string value: '\xE5\x94\x90\xE4\xB8\x89' for column 'name' at row 1

insert into tuser values(1,'唐三','昊天宗');
insert into tuser values(2,'小舞','星斗大森林');

但是如果插入英文,不会报错

insert into tuser values(3,'tanghao','hao tian zong');
select * from tuser;
  • 编码问题:select查询后发现大多数是 latin1,不是 utf8。再查看字符集show variables like 'character%';
    mysql> show variables like 'character%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    

解决这个问题,需要在容器系统的/etc/mysql/conf.d 中新建一个 my.cnf 文件,在其中指定字符编码。

    1. 在容器中创建文件,首先需要下载vim编辑器
    apt-get update
    apt-get install vim -y
    
    1. 在宿主机中创建文件,并复制mysql容器对应/etc/mysql/conf.d/目录中
     [root@dawn soft]# vim my.cnf
     [root@dawn soft]# cat my.cnf
     [client]
     default_character_set=utf8
    
     [mysql]
     default_character_set=utf8
    
     [mysqld]
     character_set_server=utf8
     
     [root@dawn soft]# docker cp /root/docker/soft/my.cnf mysql:/etc/mysql/conf.d/
     Successfully copied 2.05kB to mysql:/etc/mysql/conf.d/
     [root@dawn soft]# docker restart mysql
     mysql
     
     [root@dawn soft]# docker restart mysql
     mysql
     [root@dawn soft]# docker ps
     CONTAINER ID   IMAGE       COMMAND                  CREATED      STATUS         PORTS                                                  NAMES
     899cb4b2372f   mysql:5.7   "docker-entrypoint.s…"   3 days ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
    
  • 重新启动容器,查看字符集,插入中文数据验证

    1. 仍然报错。
    mysql> show variables like '%character%'
    -> ;
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    
    
    2. 重新创建数据库,创建表再次验证成功。
    
    mysql> drop database test;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> create database test;
    Query OK, 1 row affected (0.00 sec)
    
    # 查看字符集发现character_set_database变成了utf8
    mysql> show variables like '%character%'
        -> ; changed
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+ent varchar(32));
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    
    mysql> select * from tuser;
    +------+--------+-----------------+
    | id   | name   | department      |
    +------+--------+-----------------+
    |    1 |        |                 |
    |    1 | 唐三   | 史莱克          |
    |    2 | 小舞   | 史莱克          |
    +------+--------+-----------------+
    3 rows in set (0.00 sec)
    
  • 数据安全:

    • 新建的数据库和表存放在容器系统中的/var/lib/mysql 目录中
    • mysql 的运行错误日志对于工作中异常的判断非常重要,其存放在哪里?存放在容器系统的/var/log/mysql 目录中。
    • 如果容器被不小心删除了,那么无论是数据文件、日志文件,还是设置字符编码的 my.cnf文件,都将消失。在生产中,这是绝对不允许的,所以要保证数据的安全性。

为了保证数据的安全性,在生产环境下安装的 mysql 容器,在启动时都会使用数据卷来持久化数据。

[root@dawn mysql]# docker run --name mysql \
> -e MYSQL_ROOT_PASSWORD=a123456 \
> -v /root/docker/mysql/log:/var/log/mysql \
> -v /root/docker/mysql/data:/var/lib/mysql \
> -v /root/docker/mysql/conf:/etc/mysql/conf.d \
> -dp 3306:3306 mysql:5.7
d7ad527f85bc7a6312671dcf37fe4a811cd69ad1c5c7b05e3b4d6f37e8f19728

在宿主机的/root/docker/mysql/conf 目录(数据卷目录)中新建 my.cnf 文件,内容如下:

[client]
default_character_set=utf8

[mysql]
default_character_set=utf8

[mysqld]
character_set_server=utf8

重启Mysql容器使配置生效

docker restart mysql

进入并连接mysql,并查看字符集

docker exec -it mysql /bin/bash

mysql -uroot -p
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql> create database test;
mysql> use test;
Database changed
mysql> create table tuser(id int,name varchar(32),department varchar(64));
Query OK, 0 rows affected (0.01 sec)
mysql> use test;
# 客户端插入中文记录
mysql> insert into tuser(3,'戴沐白','星罗帝国'); 
mysql> select * from tuser;

查看宿主机数据卷,已经存在文件了

[root@dawn mysql]# ls
conf  data  log
[root@dawn mysql]# cd data
[root@dawn data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem  test

mysql集群的安装

生产中对于 MySQL 都是使用读写分离的主从集群。既保证了数据的安全性,又提升了性能。下面要使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群。

  1. mysql master 搭建
[root@dawn mysql]# docker run --name mysql-master \
> -e MYSQL_ROOT_PASSWORD=a123456 \
> -v /root/docker/mysql-cluster/master/mysql/log:/var/log/mysql \
> -v /root/docker/mysql-cluster/master/mysql/data:/var/lib/mysql \
> -v /root/docker/mysql-cluster/master/mysql/conf:/etc/mysql/conf.d \
> -dp 3316:3306 mysql:5.7
9012d0a75aac9367a8fe8903716575a92b70f81a914c76220958d1fe6677670c

[root@dawn /root/docker/mysql-cluster/master/mysql/conf]# vim my.cnf

[client]
default_character_set=utf8

[mysql]
default_character_set=utf8

[mysqld]
character_set_server=utf8
server_id=01
binlog-ignore-db=mysql
log-bin=master-log-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

[root@dawn conf]# docker mysql-master restart

[root@dawn conf]# docker exec -it mysql-master /bin/bash
root@9012d0a75aac:/# mysql -uroot -p

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

# 创建用户并授权
mysql> create user 'slave'@'%' identified by 'a123456';
Query OK, 0 rows affected (0.01 sec)
mysql> grant replication slave, replication client on *.* to 'slave'@'%';
Query OK, 0 rows affected (0.01 sec)

  1. mysql-slave 搭建
[root@dawn mysql-cluster]# docker run --name mysql-slave \
> -e MYSQL_ROOT_PASSWORD=a123456 \
> -v /root/docker/mysql-cluster/slave/mysql/log:/var/log/mysql \
> -v /root/docker/mysql-cluster/slave/mysql/data:/var/lib/mysql \
> -v /root/docker/mysql-cluster/slave/mysql/conf:/etc/mysql/conf.d \
> -dp 3326:3306 mysql:5.7
fe101f0f8609e653450a7bd322d246a9ecde5c619e2a0d589c3f6a0982c4382e
[root@dawn conf]# vim my.cnf
[root@dawn conf]# cat my.cnf
[client]
default_character_set=utf8
[mysql]
default_character_set=utf8
[mysqld]
character_set_server=utf8
server_id=02
binlog-ignore-db=mysql
log-bin=slave-log-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

relay_log=relay-log-bin
log_slave_updates=1
read_only=1


[root@dawn conf]# docker restart mysql-slave
mysql-slave
[root@dawn conf]# docker exec -it mysql-slave /bin/bash
root@fe101f0f8609:/# mysql -uroot -p

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| slave-log-bin.000001 |      154 |              | mysql            |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  1. slave 指定 master

    • 进入master查看master状态
    [root@dawn vagrant]# docker exec -it mysql-master /bin/bash
    root@6ece67391763:/# mysql -uroot -p
    mysql> show master status;
    +-----------------------+----------+--------------+------------------+-------------------+
    | File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-----------------------+----------+--------------+------------------+-------------------+
    | master-log-bin.000003 |     617 |              | mysql            |                   |
    +-----------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    • slave指定master
    [root@dawn vagrant]# docker exec -it mysql-slave /bin/bash
    root@6ece67391763:/# mysql -uroot -p
    mysql> change master to master_host='192.168.10.200',master_user='slave',master_password='a123456',master_port=3316,master_log_file='master-log-bin.000003',master_log_pos=617,master_connect_retry=30,master_retry_count=3;
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    • 查看slave状态,发现Slave_IO_Running和Slave_SQL_Running状态为No
    mysql> show slave status \G;
    *************************** 1. row ***************************
                   Slave_IO_State:
                      Master_Host: 192.168.10.200
                      Master_User: slave
                      Master_Port: 3316
                    Connect_Retry: 30
                  Master_Log_File: master-log-bin.000003
              Read_Master_Log_Pos: 617
                   Relay_Log_File: relay-log-bin.000001
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: master-log-bin.000003
                 Slave_IO_Running: No
                Slave_SQL_Running: No
                ... ...
    
    • 开启slave,再次查看slave状态
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show slave status \G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.10.200
                      Master_User: slave
                      Master_Port: 3316
                    Connect_Retry: 30
                  Master_Log_File: master-log-bin.000003
              Read_Master_Log_Pos: 617
                   Relay_Log_File: relay-log-bin.000002
                    Relay_Log_Pos: 325
            Relay_Master_Log_File: master-log-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                ... ...
    
    • 进入master,创建数据库和表
    mysql> create database test;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use test;
    Database changed
    mysql> create table tuser(id int,name varchar(32));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into tuser values(1,'dawn');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into tuser values(1,'bl');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from tuser;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | dawn |
    |    1 | bl   |
    +------+------+
    2 rows in set (0.00 sec)
    
    • 进入slave查看,发现master中的数据库和表已经同步
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> use test;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from tuser;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | dawn |
    |    1 | bl   |
    +------+------+
    2 rows in set (0.00 sec)
    
    

redis单机版安装

  1. 拉取redis:7.0镜像
docker pull redis:7.0
  1. 创建数据卷目录用于外挂文件 redis.conf, redis配置文件获取地址:redis.io/docs/latest…
[root@dawn conf]# ll
total 108
-rwxr-xr-x. 1 root root 106549 Jul 21 16:04 redis.conf
  • redis.conf配置文件的更改

    1. 解除redis对访问者IP的绑定

    image.png 2. 关闭保护模式,否则只能本机访问

    image.png 3. 关闭守护模式,对于 Redis 容器安装来说非常重要。docker 本身就是以分离模式运行的,如果 Redis 再以该模式运行,则将无法启动

    image.png 4. 指定持久化目录,RDB 或 AOF 的持久化目录都为/data,启动时可指定 /data 目录为数据卷挂载点目录。

    image.png

  1. 启动redis

    [root@dawn conf]# docker run --name redis \
    > -v /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
    > -v /root/docker/redis/data:/data \
    > -dp 6379:6379 \
    > redis:7.0 redis-server /etc/redis/redis.conf
    47405ee5291a85cf3873f1866593c58cab6037db1b3cdca9af4e0ccf4b37b618
    

    命令说明:

    • -v /root/redis/redis.conf:/etc/redis/redis.conf
    • -v /root/redis/data:/data
    • redis-server 容器的运行命令其加载的配置文件为挂载点目录/etc/redis 中的 redis.conf。

    image.png

redis主从搭建

  1. 一主两从配置
roleexpose portconfig
master6380redis80.conf
slave16381redis81.conf
slave26382redis82.conf

复制redis配置文件,修改文件名称、修改bind、protected-mode、daemon等配置、同时还需在文件最后添加如下配置,以对外宣布当前 redis 的 IP 与端口。注意,该 IP 为 docker 宿主机的 IP,端口号为当前 redis 对外暴露的端口号。

image.png

image.png

image.png

  1. 启动集群容器

    • 启动master
    [root@dawn conf]# docker run --name redis-master \
    > -v /root/docker/redis/conf/redis80.conf:/etc/redis/redis.conf \
    > -v /root/docker/redis/data/6380:/data \
    > -dp 6380:6379 \
    > redis:7.0 \
    > redis-server /etc/redis/redis.conf
    93f79e23f4346ece189f5753cfcbae382bfe0b2b0bc9191ce7ed2314be4d0f99
    [root@dawn conf]#
    
    • 启动slave,必须指出其 slaveof 于谁
    [root@dawn conf]# docker run --name redis-slave81 \
    > -v /root/docker/redis/conf/redis81.conf:/etc/redis/redis.conf \
    > -v /root/docker/redis/data/6381:/data \
    > -dp 6381:6379 redis:7.0 \
    > redis-server /etc/redis/redis.conf \
    > --slaveof 192.168.10.200 6380
    5f9359a2790bacac9e7d1aabfbed5cc4a46ee30d947e1d71f77d3def2fcf7c29
    
    [root@dawn conf]# docker run --name redis-slave82 \
    > -v /root/docker/redis/conf/redis82.conf:/etc/redis/redis.conf \
    > -v /root/docker/redis/data/6382:/data \
    > -dp 6382:6379 redis:7.0 \
    > redis-server /etc/redis/redis.conf \
    > --slaveof 192.168.10.200 6380
    420612b59f03f7df2c66663ae6a3b6b48054086749f54cd700182475a5dcee5f
    [root@dawn conf]#
    
  2. redis-cli info replication命令查看 image.png

    image.png

    image.png

  3. 测试 image.png

redis高可用集群搭建

主从集群存在的问题是其容灾方式只能采用冷处理方案,无法在生产中使用。而“一主两从三哨兵”的高可用集群,以达到热处理的容灾方案。对于“一主两从”集群,仍使用前面的主从架构即可。下面直接搭建三个 Sentinel 节点的集群。

这三个容器的端口号都保持默认,但对外暴露出的端口号分别为 26380、26381、26382。

nodeexpose portconfig
node026380sentinel80.conf
node126381sentinel81.conf
node226382sentinel82.conf
  1. 修改配置,并启动容器验证
sentinel80.conf
sentinel monitor mymaster 192.168.10.200 6380 2
sentinel announce-ip 192.168.10.200
sentinel announce-port 26380

sentinel81.conf
sentinel monitor mymaster 192.168.10.200 6380 2
sentinel announce-ip 192.168.10.200
sentinel announce-port 26380

sentinel82.conf
sentinel monitor mymaster 192.168.10.200 6380 2
sentinel announce-ip 192.168.10.200
sentinel announce-port 26380

image.png

[root@dawn conf]# docker exec -it redis-sentinel80 redis-cli -h 192.168.10.200 -p 26380 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.10.200:6380,slaves=2,sentinels=2
  1. 故障转移

    • 停止redis-master后,redis-slave81成为了master节点 image.png
    • 此时再次启动redis-master后,发现其成为了slave节点 image.png

redis分布式搭建

  • Redis 集群:每个节点中的保存的数据都是相同的。
  • Redis 分布式:每个节点中存放的数据可以是不同的。当有数据写入请求到达分布式系统后,系统会采用虚拟槽分区算法将数据写入到相应节点。
  1. 部署方案

    rolenameportconfig
    masterredis-cluster16391redis91.conf
    masterredis-cluster26392redis92.conf
    masterredis-cluster36393redis93.conf
    slaveredis-cluster16394redis94.conf
    slaveredis-cluster26395redis95.conf
    slaveredis-cluster36396redis96.conf
  2. 复制6份redis.conf,并且都开启集群配置 image.png
    image.png

  3. 启动Redis,注意启动后各个节点之间仍然是相互独立的

    image.png

  4. 通过 redis-cli --cluster create 命令可将 6个节点创建为一个分布式系统。--cluster replicas 1 指定每个 master 会带有一个 slave 副本。

    docker exec -it redis-cluster1 redis-cli --cluster create --cluster-replicas 1 \
    192.168.10.200:6391 \
    192.168.10.200:6392 \
    192.168.10.200:6393 \
    192.168.10.200:6394 \
    192.168.10.200:6395 \
    192.168.10.200:6396 
    

    image.png

  5. 查看节点信息:cluster nodes,如果节点给出 connected,就说明分布式系统已经成功搭建。 docker exec -it redis-cluster1 redis-cli -c -p 6392 cluster nodes image.png