通过网盘分享的文件:MD文档笔记
链接: https://pan.baidu.com/s/1ao2wfyLEdN50YmIqdzfGYQ?pwd=5w5z 提取码: 5w5z
–来自百度网盘超级会员v6的分享

一.MySQL安装

1.单机安装

1.1.拉取镜像

docker pull mysql:8.0.44

在这里插入图片描述

1.2.启动Mysql容器

以后台模式启动 MySQL 容器

docker run --name mysql -dp 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.0.44

在这里插入图片描述

该命令指定访问密码为root

1.3.目录授权

mkdir -p /var/run/mysqld

# 修改所有者为 mysql 用户 (UID 999)
chown -R 999:999 /var/run/mysqld

# 确保目录权限
chmod -R 755 /var/run/mysqld

在这里插入图片描述

1.4.重启容器

docker restart mysql

在这里插入图片描述

1.5.进入容器

(1).不使用密码登录
docker exec -it mysql /bin/bash

mysql -u root

在这里插入图片描述

修改root用户密码

ALTER  USER  'root'@'localhost'  IDENTIFIED BY 'root';

在这里插入图片描述

重新登录

exit

mysql -uroot -p

在这里插入图片描述

(2).使用密码登录
docker exec -it mysql /bin/bash

mysql -uroot -p

在这里插入图片描述

1.6.修改远程登录

  • 方式1

    将 root 用户的 host 从 localhost 改为 %(代表允许任何 IP 连接)

    -- 切换到 mysql 系统库
    USE mysql;
    
    -- 查看当前用户权限状态(可选)
    SELECT user, host FROM user;
    
    -- 修改 root 用户允许所有主机连接
    UPDATE user SET host = '%' WHERE user = 'root';
    
    -- 刷新权限使其立即生效
    FLUSH PRIVILEGES;
    
    -- 再次确认修改成功
    SELECT user, host FROM user;
    

    在这里插入图片描述

  • 方式2

    创建新用户或授权特定用户(更规范)

    如果你不想修改 root 的 host,或者想创建一个专门用于远程连接的用户

    -- 创建用户 'zhanghl',密码为 'your_password',允许从任何主机 (%) 连接
    CREATE USER 'zhanghl'@'%' IDENTIFIED BY 'zhanghl';
    
    -- 授予该用户所有数据库的所有权限
    GRANT ALL PRIVILEGES ON *.* TO 'zhanghl'@'%' WITH GRANT OPTION;
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    

    在这里插入图片描述

1.7.创建数据库与表

通过该客户端创建一个新的数据库 test,并在其中创建一个表 emp(id, name),用于测试该 MySQL 服务

show databases;

create database test;

use test;

create table emp(id int,name varchar(20),depart varchar(20));

insert into emp values(1,'zhangsan','market');

insert into emp values(2,'lisi','admin');

select * from emp;

在这里插入图片描述

1.8.Navicat 连接 mysql

在 window 系统中使用 Navicat 连接上这个 mysql 容器提供的 mysql 服务

在这里插入图片描述

然后就可以看到新建的 test 数据库与 emp 表了

在这里插入图片描述

1.9.字符编码问题

当前 mysql 容器好像可以正常运行了

但实际还存在字符编码问题(MySQL5中存在字符编码问题),在表中手工插入一条包含中文的记录,提交时会报错,原因就出现字符编码上

查看mysql 中的字符编码,发现大多数是 latin1,不是 utf8,问题就出在这里

show variables like 'character%';

在这里插入图片描述

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

# 编辑文件
vim /etc/mysql/conf.d/my.cnf
# 添加如下内容

[mysql]
default-character-set=utf8mb4

# 重启mysql
systemctl restart mysql

注意:容器中是没有vim命令、yum等命令的,可以挂载数据卷,然后再修改

1.10.数据安全问题

除了编码问题,还存在一个严重问题,就是数据安全问题

前面新建了 test 数据库与 emp 表存放在哪里

在容器系统中的/var/lib/mysql 目录中

  • 数据库存放路径

    ls -l /var/lib/mysql     
    

    在这里插入图片描述

  • 数据库表存放路径

    ls -l /var/lib/mysql/test
    

    在这里插入图片描述

  • 运行日志路径

    mysql 的运行错误日志存放在容器系统的"ls -l /var/log/"目录中

    ls -l /var/log/  
    

    在这里插入图片描述

如果容器被不小心删除了,那么无论是数据文件、日志文件,还是设置字符编码的 my.cnf文件,都将消失

在生产中,这是绝对不允许的,所以要保证数据的安全性

2.生产安装

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

2.1.拉取镜像

docker pull mysql:8.0.44

在这里插入图片描述

2.2.创建数据目录

# 创建数据目录
mkdir -p /root/software/mysql

# 修改所有者为 mysql 用户 (UID 999)
chown -R 999:999 /root/software/mysql

# 确保目录权限
chmod -R 755 /root/software/mysql

在这里插入图片描述

2.3.启动 MySQL 容器

这里指定了三个数据卷

  • -v /root/software/mysql/log:/var/log/mysql

    用来存储日志信息

  • -v /root/software/mysql/data:/var/lib

    用来存储数据信息

  • -v /root/software/mysql/conf:/etc/mysql/conf.d

    用来存储配置信息

docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-v /root/software/mysql/data:/var/lib/mysql \
-v /root/software/mysql/log:/var/log \
-v /root/software/mysql/conf:/etc/mysql/conf.d \
-dp 3306:3306 \
--restart=always \
mysql:8.0.44

在这里插入图片描述

2.4.新建 my.cnf

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

[root@docker~]# vim /root/software/mysql/conf/my.cnf
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4

2.5.重启 mysql 容器

由于修改了 mysql 配置,所以需要重启 mysql 容器,以使新配置生效

docker restart mysql

在这里插入图片描述

2.6.查看日志

docker logs mysql

在这里插入图片描述

2.7.进入容器连接 mysql

2.7.1.不使用密码方式
(1).进入mysql

有些版本需要先试用这种方式登录修改密码,然后才能使用密码登录

docker exec -it mysql /bin/bash

mysql -u root

在这里插入图片描述

(2).修改密码

修改root用户密码

ALTER  USER  'root'@'localhost'  IDENTIFIED BY 'root';

在这里插入图片描述

(3).重新登录
exit

mysql -uroot -p

在这里插入图片描述

2.7.2.使用密码登录
docker exec -it mysql /bin/bash

mysql -uroot -p

在这里插入图片描述

2.8.查看字符编码

此时查看当前 mysql 的字符编码,已经全变为了 utf8mb4

show variables like 'character%';

在这里插入图片描述

2.9.修改远程登录

  • 方式1

    将 root 用户的 host 从 localhost 改为 %(代表允许任何 IP 连接)

    -- 切换到 mysql 系统库
    USE mysql;
    
    -- 查看当前用户权限状态(可选)
    SELECT user, host FROM user;
    
    -- 修改 root 用户允许所有主机连接
    UPDATE user SET host = '%' WHERE user = 'root';
    
    -- 刷新权限使其立即生效
    FLUSH PRIVILEGES;
    
    -- 再次确认修改成功
    SELECT user, host FROM user;
    

    在这里插入图片描述

  • 方式2

    创建新用户或授权特定用户(更规范)

    如果你不想修改 root 的 host,或者想创建一个专门用于远程连接的用户

    -- 创建用户 'zhanghl',密码为 'your_password',允许从任何主机 (%) 连接
    CREATE USER 'zhanghl'@'%' IDENTIFIED BY 'zhanghl';
    
    -- 授予该用户所有数据库的所有权限
    GRANT ALL PRIVILEGES ON *.* TO 'zhanghl'@'%' WITH GRANT OPTION;
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    

    在这里插入图片描述

2.10.创建数据库与表

通过该客户端创建一个新的数据库 test,并在其中创建一个表 emp(id, name),用于测试该 MySQL 服务

show databases;

create database test;

use test;

create table emp(id int,name varchar(20),depart varchar(20));

insert into emp values(1,'zhangsan','market');

insert into emp values(2,'lisi','admin');

select * from emp;

在这里插入图片描述

2.11.Navicat 连接 mysql

在 window 系统中使用 Navicat 连接上这个 mysql 容器提供的 mysql 服务

然后就可以看到新建的 test 数据库与 emp 表了

在这里插入图片描述

2.12.Navicat 插入中文记录

此时再在表中插入中文记录就没有问题了

2.13.查看宿主机数据卷

此时再查看宿主机中数据卷目录,已经有了文件

  • -v /root/software/mysql/log:/var/log/mysql

  • -v /root/software/mysql/data:/var/lib

  • -v /root/software/mysql/conf:/etc/mysql/conf.d

【示例】

ll /root/software/mysql/
ll /root/software/mysql/conf/
ll /root/software/mysql/log/
ll /root/software/mysql/data/

在这里插入图片描述

3.集群安装

集群安装最好是在两个主机之间安装

单机版的 MySQL 存在单点问题,且在高并发场景下性能会急剧下降

所以生产中对于 MySQL 都是使用读写分离的主从集群,既保证了数据的安全性,又提升了性能

下面要使用 Docker 搭建一个"一主一从"的 MySQL 读写分离集群

3.1.拉取镜像

docker pull mysql:8.0.44

在这里插入图片描述

3.2.创建集群目录

(1).数据卷规划
  • master数据卷规划

    在这里插入图片描述

  • slave数据卷规划

    在这里插入图片描述

(2).创建目录并授权
mkdir -p /usr/local/mysql_cluster

# chmod 777 /usr/local/mysql_cluster

# 修改所有者为 mysql 用户 (UID 999)
chown -R 999:999 /usr/local/mysql_cluster

# 确保目录权限
chmod -R 755 /usr/local/mysql_cluster

在这里插入图片描述

3.3.Master 的安装与配置

3.3.1.创建容器
docker run -d -p 3316:3306 --name mysql_master --privileged=true \
--restart unless-stopped --restart always \
-e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/mysql_cluster/master/log:/var/log/mysql \
-v /usr/local/mysql_cluster/master/data:/var/lib/mysql \
-v /usr/local/mysql_cluster/master/conf:/etc/mysql/conf.d \
 mysql:8.0.44

在这里插入图片描述

说明

  • docker run

    表示创建并运行容器

  • –restart=always

    docker 开机启动,失败也会一直重启

  • –privileged=true

    开启目录挂载权限,让容器可以访问宿主机的所有设备

  • –restart unless-stopped

    这个选项意味着除非你手动停止了容器,否则Docker会尝试重启它

    这个选项在你需要一个始终运行的后台服务时非常有用

  • -p 3316:3306

    把宿主机的3316端口映射到容器的3306端口

  • –name mysql_master

    表示给这个容器取个名字叫 mysql_master

  • -e MYSQL_ROOT_PASSWORD=root

    设置 root 用户的密码

  • -d mysql

    字母d是detach的首字母,表示后台静默运行

3.3.2.新建 my.cnf

在宿主机的"/usr/local/mysql_cluster/master/conf"目录下新建my.cnf 文件,并在其中键入如下内容

  • –server-id=01

    设置唯一id

  • –log-bin=bin-log

    设置binlog日志文件名,因为主从复制是通过这个日志来传输

[root@docker ~]# vim /usr/local/mysql_cluster/master/conf/my.cnf

[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4

pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
datadir= /var/lib/mysql

secure-file-priv= NULL
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 可选要同步的数据库名,不配置此参数代表所有的库
#binlog-do-db=
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 设置默认时区
default-time_zone='+8:00'
3.3.3.重启 master 容器

由于修改了 mysql 配置,所以需要重启 master 容器,以使新配置生效

使用"docker restart mysql_master"重启命令

docker restart mysql_master

在这里插入图片描述

或者

docker stop mysql_master
docker start mysql_master
docker ps
3.3.4.进入容器连接 mysql
(1).不使用密码登录
docker exec -it mysql_master /bin/bash

mysql -u root

在这里插入图片描述

修改root用户密码

ALTER  USER  'root'@'localhost'  IDENTIFIED BY 'root';

在这里插入图片描述

重新登录

exit

mysql -uroot -p

在这里插入图片描述

(2).使用密码登录
docker exec -it mysql_master /bin/bash

mysql -uroot -p

在这里插入图片描述

3.3.5.查看字符编码

此时查看当前 mysql 的字符编码,已经全变为了 utf8mb4

show variables like 'character%';

在这里插入图片描述

3.3.6.修改远程登录
  • 方式1

    将 root 用户的 host 从 localhost 改为 %(代表允许任何 IP 连接)

    -- 切换到 mysql 系统库
    USE mysql;
    
    -- 查看当前用户权限状态(可选)
    SELECT user, host FROM user;
    
    -- 修改 root 用户允许所有主机连接
    UPDATE user SET host = '%' WHERE user = 'root';
    
    -- 刷新权限使其立即生效
    FLUSH PRIVILEGES;
    
    -- 再次确认修改成功
    SELECT user, host FROM user;
    

    在这里插入图片描述

  • 方式2

    创建新用户或授权特定用户(更规范)

    如果你不想修改 root 的 host,或者想创建一个专门用于远程连接的用户

    -- 创建用户 'zhanghl',密码为 'your_password',允许从任何主机 (%) 连接
    CREATE USER 'zhanghl'@'%' IDENTIFIED BY 'zhanghl';
    
    -- 授予该用户所有数据库的所有权限
    GRANT ALL PRIVILEGES ON *.* TO 'zhanghl'@'%' WITH GRANT OPTION;
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    

    在这里插入图片描述

3.3.7.创建同步用户

为当前 MySQL 创建一个用户,用户名与密码均设置成"slave"

该账户用于同步数据

  • 不加密密码方式

    create user 'slave'@'%' identified by 'slave';
    
    #刷新用户权限
    FLUSH PRIVILEGES;
    

    在这里插入图片描述

  • 加密密码方式创建(建议加密)

    CREATE USER 'testslave'@'%' IDENTIFIED WITH mysql_native_password BY 'testslave';
    

    在这里插入图片描述

3.3.8.授权用户

为新创建的用户授权

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
#以下方式也可以
# grant all on *.* to 'slave'@'%';

在这里插入图片描述

3.3.9.重启mysql

退出数据库,输入 exit;

再退出容器,输入exit;

重启数据库

exit

exit

docker restart mysql_master;

在这里插入图片描述

可以通过命令查看启动情况

docker logs -f mysql_master

在这里插入图片描述

3.4.Slave 的安装与配置

(1).启动 Slave 容器

再打开一个会话窗口,在其中启动 Slave 容器

docker run --name mysql_slave --restart=always \
--restart unless-stopped --privileged=true \
-e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/mysql_cluster/slave/log:/var/log/mysql \
-v /usr/local/mysql_cluster/slave/data:/var/lib/mysql \
-v /usr/local/mysql_cluster/slave/conf:/etc/mysql/conf.d \
-dp 3326:3306 \
mysql:8.0.44

在这里插入图片描述

(2).新建 my.cnf

在宿主机的"/usr/local/mysql_cluster/slave/conf"目录下新建my.cnf 文件,并在其中键入如下内容

[root@docker ~]# vim /usr/local/mysql_cluster/slave/conf/my.cnf
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
datadir= /var/lib/mysql
secure-file-priv= NULL
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1
# 设置超级管理员用户也只有可读权限
# super_read_only=1
# 设置默认时区
default-time_zone='+8:00'
(3).设置目录权限
mkdir -p /var/run/mysqld

# 修改所有者为 mysql 用户 (UID 999)
chown -R 999:999 /var/run/mysqld

# 确保目录权限
chmod -R 755 /var/run/mysqld

在这里插入图片描述

(4).重启 slave 容器

由于修改了 mysql 配置,所以需要重启 slave 容器,以使新配置生效

docker restart mysql_slave

在这里插入图片描述

可以通过命令查看启动情况

docker logs -f mysql_slave

在这里插入图片描述

(5).进入容器连接 mysql

进入容器并连接上 mysql 后,查看其字符编码,可以看到其是支持中文的

docker exec -it mysql_slave /bin/bash

mysql -uroot -proot

在这里插入图片描述

(6).查看字符编码

此时查看当前 mysql 的字符编码,已经全变为了 utf8

show variables like 'character%';

在这里插入图片描述

3.5.配置主从复制

(1).查看 master 状态

在 master 中运行"show master status;"命令,查看二进制日志文件名及要开始的位置

#进入容器:
docker exec -it mysql_master /bin/bash

#执行登录命令
mysql -u root -p 

# 输入密码root

#在主库中查看状态
show master status;

在这里插入图片描述

该命令中mysql9中不能使用

(2).slave 指定 master

语法

change master to 
master_host='主库主机ip地址',
master_user='2.1在主库创建的账号',
master_password='2.1在主库创建的密码',
master_port=3307,
master_log_file='mall-mysql-bin.000001',
master_log_pos=157,
master_connect_retry=30;

登录从库,登录过程同上

在 slave 中通过运行 change master to 命令来指定其要连接的 master 相关信息

change master to 
master_host='192.168.217.137',
master_user='slave',
master_password='slave',
master_port=3316,
master_log_file='mall-mysql-bin.000002',
master_log_pos=157,
master_connect_retry=30;

在这里插入图片描述

  • master_host

    需要复制的主机名称

    docker可以容器间通信就填成了容器名称,也可以填ip地址

  • master_user

    在主数据库创建的用于同步数据的用户账号

  • MASTER_PASSWORD

    在主数据库创建的用于同步数据的用户密码

  • MASTER_PORT

    主数据库的运行端口

  • master_log_file

    指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数

  • master_log_pos

    指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;

  • master_connect_retry

    连接失败重试的时间间隔,单位为秒

  • MASTER_RETRY_COUNT=master_retry_count

  • MASTER_HEARTBEAT_PERIOD=master_heartbeat_period

  • MASTER_RETRY_COUNT=master_retry_count

  • MASTER_HEARTBEAT_PERIOD=master_heartbeat_period

  • MASTER_SSL=ssl_option

  • MASTER_SSL_CA=‘ca_file_name’

  • MASTER_SSL_CAPATH=‘ca_directory_name’

  • MASTER_SSL_CERT=‘cert_file_name’

  • MASTER_SSL_CRL=‘crl_file_name’

  • MASTER_SSL_CRLPATH=‘crl_directory_name’

  • MASTER_SSL_KEY=‘key_file_name’

  • MASTER_SSL_CIPHER=‘cipher_list’

  • MASTER_SSL_VERIFY_SERVER_CERT=verify_option

确保替换 master_host_name、replication_user_name、replication_password、master_host_port、recorded_log_file_name 和 recorded_log_position 为你的实际复制主服务器信息

注意:从 MySQL 5.7.7 开始,默认的复制通道名为 group_replication_applier(如果你使用的是默认配置,则需要指定通道名)

(3).查看 slave 状态

在 slave 中查看 slave 状态发现,当前 slave 与 master 的同步复制还没有开始

当前 Slave_IO_Running与Slave_SQL_Running为 NO状态

show slave status \G;

在这里插入图片描述

(4).slave 开启同步

在 slave 中使用 start slave 命令开启 slave 的数据同步

start slave;

在这里插入图片描述

此时再次查看 slave 的状态,发现同步已经开始

show slave status \G;

在这里插入图片描述

3.6.测试

到这里,一主一从的读写分离集群就搭建完毕了

下面在 master 中创建一个数据库与表,在 slave 中如果可以查看到,则说明搭建成功

(1).在 master 中写入
show databases;

create database test01;

use test01;

create table emp(id int,name varchar(20),depart varchar(20));

insert into emp values(1,'zhangsan','market');

insert into emp values(2,'lisi','admin');

select * from emp;

在这里插入图片描述

(2).在 slave 中读取

在 slave 中可以查看到在 master 中写入的数据,说明集群搭建成功

show databases;

use test01;

select * from emp;

在这里插入图片描述

二.Redis

1.单机安装

(1).拉取 Redis

首先从 docker hub 拉取 Redis 镜像

docker pull redis:7

在这里插入图片描述

(2).创建数据卷目录

首先要在宿主机"/root/software"目录中创建一个目录 redis,将来用于存放外挂文件 redis.conf

mkdir -p /root/software/redis

(3).复制 redis.conf 文件

上传一份 redis 核心配置文件 redis.conf 到宿主机目录"/root/software/redis"中

在这里插入图片描述

(4).修改 redis.conf

编辑配置文件

cd  /root/software/redis/  

vim  redis.conf        

做如下修改

  • 解除 IP 绑定

    将 bind 行注释掉,以解除 Redis 对访问者 IP 的绑定

    在这里插入图片描述

  • 关闭保护模式

    关闭保护模式,否则只能本机访问自己

    在这里插入图片描述

  • 关闭守护模

    关闭守护模式对于 Redis 容器安装来说非常重要

    由于 docker 本身就是以分离模式运行的,如果 Redis 再以该模式运行,则 Redis 无法启动

    在这里插入图片描述

  • 指定持久化目录

    这里要指定 RDB 或 AOF 的持久化目录为/data,这样无论是哪种持久化文件,均会保存到该目录

    后面会指定容器中的/data 目录为数据卷挂载点目录

    在这里插入图片描述

​

(5).启动 Redis 容器

docker run --name myredis \
-v /root/software/redis/redis.conf:/etc/redis/redis.conf \
-v /root/software/redis/data:/data \
-dp 6379:6379 \
redis:7 \
redis-server /etc/redis/redis.conf

在这里插入图片描述

这里指定了两个数据卷,其中一个是文件,一个是目录

  • -v /root/software/redis/redis.conf:/etc/redis/redis.conf

    Redis配置文件

  • -v /root/software/redis/data:/data

    Redis持久化目录

对于该启动命令需要注意的是,其后面运行的命令为 redis-server,且加载的配置文件为挂载点目录/etc/redis 中的 redis.conf

(6).进入容器连接 Redis

通过 docker exec 命令进入 Redis 容器后,就可通过 redis-cli 客户端连接上这个 Redis,然后执行 Redis 命令了

docker exec -it myredis /bin/bash

redis-cli

在这里插入图片描述

2.主从安装

现要搭建一个"一主两从"的 Redis 集群

这三个容器的端口号都保持默认,但对外暴露出的端口号分别为 6381、 6382、 6383(其中 6381 的为 master,另外两个为 slave)

(1).拉取 Redis

首先从 docker hub 拉取 Redis 镜像

docker pull redis:7

在这里插入图片描述

(2).创建数据卷目录

首先要在宿主机"/root/software"目录中创建一个目录 redis,将来用于存放外挂文件 redis.conf

mkdir -p /root/software/redis

在这里插入图片描述

(3).复制 redis.conf 文件

上传一份 redis 核心配置文件 redis.conf 到宿主机目录"/root/software/redis"中

cd /root/software/redis/

ll

在这里插入图片描述

(4).修改 redis.conf

编辑配置文件

cd  /root/software/redis/  

vim  redis.conf      

修改如下配置

  • 解除 IP 绑定

    将 bind 行注释掉,以解除 Redis 对访问者 IP 的绑定

    在这里插入图片描述

  • 关闭保护模式

    关闭保护模式,否则只能本机访问自己

    在这里插入图片描述

  • 关闭守护模

    关闭守护模式对于 Redis 容器安装来说非常重要

    由于 docker 本身就是以分离模式运行的,如果 Redis 再以该模式运行,则 Redis 无法启动

    在这里插入图片描述

  • 指定持久化目录

    这里要指定 RDB 或 AOF 的持久化目录为/data,这样无论是哪种持久化文件,均会保存到该目录

    后面会指定容器中的/data 目录为数据卷挂载点目录

    在这里插入图片描述

(5).复制三份 redis.conf

复制 三份redis.conf 并重命名为 redis1.conf、redis2.conf、redis3.conf,并在文件最后添加如下配置以对外宣布当前 redis 的 IP 与端口

注意该 IP 为 docker 宿主机的 IP,端口号为当前 redis 对外暴露的端口号

cp /root/software/redis/redis.conf /root/software/redis/redis1.conf

cp /root/software/redis/redis.conf /root/software/redis/redis2.conf

cp /root/software/redis/redis.conf /root/software/redis/redis3.conf

在这里插入图片描述

  • Redis1.conf文件末尾添加如下配置

    [root@docker ~]# vim  /root/software/redis/redis1.conf  
    ##文件末尾添加如下命令  
    # ip地址为宿主机的IP地址  
    slave-announce-ip 192.168.1.11  
    slave-announce-port  6381       
    

    在这里插入图片描述

  • Redis2.conf文件末尾添加如下配置

    [root@docker ~]# vim  /root/software/redis/redis2.conf  
    ##文件末尾添加如下命令  
    # ip地址为宿主机的IP地址     
    slave-announce-ip 192.168.1.11 
    slave-announce-port 6382          
    

    在这里插入图片描述

  • Redis3.conf文件末尾添加如下配置

    [root@docker ~]# vim  /root/software/redis/redis3.conf  
    ##文件末尾添加如下命令  
    # ip地址为宿主机的IP地址     
    slave-announce-ip 192.168.1.11
    slave-announce-port 6383       
    

    在这里插入图片描述

(6).启动 master

首先启动 master,即启动 myredis-1 容器

docker run --name myredis-1 \
-v /root/software/redis/redis1.conf:/etc/redis/redis.conf \
-v /root/software/redis/data/6381:/data \
-dp 6381:6379 \
redis:7 \
redis-server /etc/redis/redis.conf

在这里插入图片描述

(7).启动 slave

在启动 slave 的命令中需要指出其 slaveof 于谁

docker run --name myredis-2 \
-v /root/software/redis/redis2.conf:/etc/redis/redis.conf \
-v /root/software/redis/data/6382:/data \
-dp 6382:6379 \
redis:7 \
redis-server /etc/redis/redis.conf --slaveof 192.168.1.11 6381

在这里插入图片描述

docker run --name myredis-3 \
-v /root/software/redis/redis3.conf:/etc/redis/redis.conf \
-v /root/software/redis/data/6383:/data \
-dp 6383:6379 \
redis:7 \
redis-server /etc/redis/redis.conf --slaveof 192.168.1.11 6381

在这里插入图片描述

(8).关系查看

查看这三个容器节点的 info replication,可以看到它们间的主从关系已经建立

docker exec -it myredis-1 redis-cli info replication

在这里插入图片描述

docker exec -it myredis-2 redis-cli info replication

在这里插入图片描述

docker exec -it myredis-3 redis-cli info replication

在这里插入图片描述

(9).数据测试

在 master 节点 myredis-1 中写入数据

docker exec -it myredis-1 redis-cli

set name Tom

get name

在这里插入图片描述

在 slave 节点 myredis-2 与 myredis-3 节点中可读出数据

docker exec -it myredis-2 redis-cli

get name

在这里插入图片描述

docker exec -it myredis-3 redis-cli  

get name

在这里插入图片描述

3.哨兵集群安装

主从集群存在的问题是,其容灾方式只能采用冷处理方案(即主节点挂掉之后只能手动重启),无法在生产中使用

所以这里要搭建一个"一主两从三哨兵"的高可用集群,以达到热处理的容灾方案

对于"一主两从"集群,仍使用前面的即可

下面直接搭建三个 Sentinel 节点的集群

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

(1).上传sentinel.conf

上传sentinel.conf到"/root/software/redis"目录下

在这里插入图片描述

(2).复制三份 sentinel.conf

复制 sentinel.conf 文件并重命名为 sentinel1.conf、sentinel2.conf、sentinel3.conf

cp /root/software/redis/sentinel.conf /root/software/redis/sentinel1.conf

cp /root/software/redis/sentinel.conf /root/software/redis/sentinel2.conf

cp /root/software/redis/sentinel.conf /root/software/redis/sentinel3.conf

在这里插入图片描述

仅修改两处

  • 指定其要监视的 master 及

  • 指定当前 sentinel 对外宣布的 IP 与端口号

    其中 IP 为 docker 宿主机的 IP,端口号为其对外暴露的端口号。

  1. 修改sentinel1.conf

    [root@docker redis]# vim sentinel1.conf
    
    sentinel monitor mymaster 192.168.1.11 6381 2
    sentinel announce-ip 192.168.1.11
    sentinel announce-port 26381 
    
    

    在这里插入图片描述

  2. 修改 sentinel2.conf

    [root@docker redis]# vim sentinel2.conf
    sentinel monitor mymaster 192.168.1.11 6381 2
    sentinel announce-ip 192.168.1.11 
    sentinel announce-port 26382
    
    

    在这里插入图片描述

  3. 修改 sentinel3.conf

    [root@docker redis]# vim sentinel3.conf
    sentinel monitor mymaster 192.168.1.11 6381 2
    sentinel announce-ip 192.168.1.11 
    sentinel announce-port 26383
    

    在这里插入图片描述

(3).启动 sentinel

启动三个 sentinel 容器

  • Sentinel1

    docker run --name mysentinel-1 \
    -v /root/software/redis/sentinel1.conf:/etc/redis/sentinel.conf \
    -dp 26381:26379 \
    redis:7 \
    redis-sentinel /etc/redis/sentinel.conf
       
    

    在这里插入图片描述

  • Sentinel2

    docker run --name mysentinel-2 \
    -v /root/software/redis/sentinel2.conf:/etc/redis/sentine2.conf \
    -dp 26382:26379 \
    redis:7 \
    redis-sentinel /etc/redis/sentine2.conf
      
    

    在这里插入图片描述

  • Sentinel3

    docker run --name mysentinel-3 \
    -v /root/software/redis/sentinel3.conf:/etc/redis/sentine3.conf \
    -dp 26383:26379 \
    redis:7 \
    redis-sentinel /etc/redis/sentine3.conf
        
    

    在这里插入图片描述

(4).关系查看

docker exec -it mysentinel-1 redis-cli -h 192.168.1.11 -p 26381 info sentinel

在这里插入图片描述

以上命令的查看结果说明 sentinel 对 master 的监视成功,说明高可用集群搭建成功

连接任何一个 sentinel 容器节点查看到的信息与上面的都是相同的

(5).故障转移测试

为了验证高可用性,现将充当 master 的容器 myredis-1 停掉

docker stop myredis-1

在这里插入图片描述

此时再查看另外两个 redis 容器的状态数据,发现 myredis-2 成为了 myredis-3 的 master,即 myredis-2 成为了新的 master

docker exec -it myredis-2 redis-cli info replication

在这里插入图片描述

查看myredis-3

docker exec -it myredis-3 redis-cli info replication

在这里插入图片描述

此时再次 myredis-1 容器启动

docker start myredis-1

在这里插入图片描述

再查看 myredis-1 的状态数据,发现其成为了 myredis-2 的 slave

docker exec -it myredis-1 redis-cli info replication

在这里插入图片描述

4.分布式搭建

Redis 集群的每个节点中的保存的数据都是相同的,而 Redis 分布式系统的节点中存放的数据可以是不同的

当有数据写入请求到达分布式系统后,系统会采用虚拟槽分区算法将数据写入到相应节点

下面要搭建一个三主三从的 Redis 分布式系统

序号角色容器名网络模式暴露地址
1mastermyredis-1host192.168.1.11:6381
2mastermyredis-2host192.168.1.11:6382
3mastermyredis-3host192.168.1.11:6383
4slavemyredis-4host192.168.1.11:6384
5slavemyredis-5host192.168.1.11:6385
6slavemyredis-6host192.168.1.11:6386

(1).准备目录与配置文件

在/root/software 中 mkdir 一个名称为 cluster 的目录,并将配置文件redis.conf上传到"/root/cluter"下

mkdir -p /root/software/cluster
cd /root/software/cluster/
ll

在这里插入图片描述

(2).复制一份redis.conf

复制 redis.conf 为 redis1.conf

[root@docker cluster]# cp /root/software/cluster/redis.conf /root/software/cluster/redis1.conf

修改如下位置

[root@docker cluster]# vim /root/software/cluster/redis1.conf
  • 解除 IP 绑定

    将 bind 行注释掉,以解除 Redis 对访问者 IP 的绑定

    在这里插入图片描述

  • 关闭保护模式

    关闭保护模式,否则只能本机访问自己

    在这里插入图片描述

  • 关闭守护模

    关闭守护模式对于 Redis 容器安装来说非常重要

    由于 docker 本身就是以分离模式运行的,如果 Redis 再以该模式运行,则 Redis 无法启动

    在这里插入图片描述

  • 指定持久化目录

    这里要指定 RDB 或 AOF 的持久化目录为/data,这样无论是哪种持久化文件,均会保存到该目录

    后面会指定容器中的/data 目录为数据卷挂载点目录

    在这里插入图片描述

  • cluster-enabled yes

    用于开启 cluster 功能,即分布式系统功能

    在这里插入图片描述

  • cluster-config-file nodes-6379.conf

    指定其需要的配置文件名称

    在这里插入图片描述

  • 设置密码

    • masterauth 123456

      在这里插入图片描述

    • requirepass 123456

      在这里插入图片描述

(3).复制5分配置

然后再以 redis1.conf 为模板复制出 5 份,分别为 redis2.conf、 redis3.conf、 redis4.conf、redis5.conf、 redis6.conf

这 6 份配置文件内容完全相同

cp /root/software/cluster/redis1.conf /root/software/cluster/redis2.conf

cp /root/software/cluster/redis1.conf /root/software/cluster/redis3.conf

cp /root/software/cluster/redis1.conf /root/software/cluster/redis4.conf

cp /root/software/cluster/redis1.conf /root/software/cluster/redis5.conf

cp /root/software/cluster/redis1.conf /root/software/cluster/redis6.conf

在这里插入图片描述

(4).启动 redis

启动 6 个 Redis 容器

  1. 容器1

    docker run --name myredis-1 \
    --network host \
    -v /root/software/cluster/redis1.conf:/etc/redis/redis.conf \
    -v /root/software/cluster/data/6381:/data \
    -d redis:7 \
    redis-server /etc/redis/redis.conf --port 6381
    
  2. 容器2

    docker run --name myredis-2 \
    --network host \
    -v /root/software/cluster/redis2.conf:/etc/redis/redis.conf \
    -v /root/software/cluster/data/6382:/data \
    -d redis:7 \
    redis-server /etc/redis/redis.conf --port 6382
    
  3. 容器3

    docker run --name myredis-3 \
    --network host \
    -v /root/software/cluster/redis3.conf:/etc/redis/redis.conf \
    -v /root/software/cluster/data/6383:/data \
    -d redis:7 \
    redis-server /etc/redis/redis.conf --port 6383
    
  4. 容器4

    docker run --name myredis-4 \
    --network host \
    -v /root/software/cluster/redis4.conf:/etc/redis/redis.conf \
    -v /root/software/cluster/data/6384:/data \
    -d redis:7 \
    redis-server /etc/redis/redis.conf --port 6384
    
    
  5. 容器5

    docker run --name myredis-5 \
    --network host \
    -v /root/software/cluster/redis5.conf:/etc/redis/redis.conf \
    -v /root/software/cluster/data/6385:/data \
    -d redis:7 \
    redis-server /etc/redis/redis.conf --port 6385
    
  6. 容器6

    docker run --name myredis-6 \
    --network host \
    -v /root/software/cluster/redis6.conf:/etc/redis/redis.conf \
    -v /root/software/cluster/data/6386:/data \
    -d redis:7 \
    redis-server /etc/redis/redis.conf --port 6386
    

(5).创建系统

6 个节点启动后它们仍是 6 个独立的 Redis

  • 通过 redis-cli --cluster create 命令可将 6个节点创建为一个分布式系统

  • –cluster replicas 1 指定每个 master 会带有一个 slave 副本

【示例】

  1. 进入其中一个redis环境

    docker exec -it myredis-1 /bin/bash
    

    在这里插入图片描述

  2. 创建集群环境

    redis-cli  --cluster create 192.168.1.11:6381 192.168.1.11:6382 192.168.1.11:6383  192.168.1.11:6384 192.168.1.11:6385 192.168.1.11:6386 --cluster-replicas 1  -a 123456 
    

    在这里插入图片描述

(6).查看节点信息

通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况

只要能看到每个节点给出 connected,就说明分布式系统已经成功搭建

docker exec -it myredis-1 redis-cli -c -a 123456 -p 6383 cluster nodes

在这里插入图片描述

更多推荐