8.Docker安装常用服务器
通过网盘分享的文件: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,端口号为其对外暴露的端口号。
-
修改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
-
修改 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
-
修改 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 分布式系统
| 序号 | 角色 | 容器名 | 网络模式 | 暴露地址 |
|---|---|---|---|---|
| 1 | master | myredis-1 | host | 192.168.1.11:6381 |
| 2 | master | myredis-2 | host | 192.168.1.11:6382 |
| 3 | master | myredis-3 | host | 192.168.1.11:6383 |
| 4 | slave | myredis-4 | host | 192.168.1.11:6384 |
| 5 | slave | myredis-5 | host | 192.168.1.11:6385 |
| 6 | slave | myredis-6 | host | 192.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
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
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
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
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
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
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 副本
【示例】
-
进入其中一个redis环境
docker exec -it myredis-1 /bin/bash
-
创建集群环境
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

更多推荐

所有评论(0)