Kavita漫画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3.9'
services:
kavita:
image: kizaing/kavita:latest # Change latest to nightly for latest develop builds (can't go back to stable)
container_name: kavita
volumes:
- ./manga:/manga # Manga is just an example you can have the name you want. See the following
- ./comics:/comics # Use as many as you want
- ./books:/books #
- ./data:/kavita/config # Change './data if you want to have the config files in a different place.
# /kavita/config must not be changed
environment:
- TZ=Your/Timezone
ports:
- "5000:5000" # Change the public port (the first 5000) if you have conflicts with other services
restart: unless-stopped

lazydocker

lazydocker是一个TUI应用程序,可以帮助您在一个地方管理和监控所有的Docker容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3'
services:
lazydocker:
build:
context: https://github.com/jesseduffield/lazydocker.git
args:
BASE_IMAGE_BUILDER: golang
GOARCH: amd64
GOARM:
image: lazyteam/lazydocker
container_name: lazydocker
stdin_open: true
tty: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./config:/.config/jesseduffield/lazydocker

MySQL一主二从同步高可用集群

docker-compose文件配置

建立如下目录结构

1
2
3
4
5
6
7
mysql
├── master
│ └── docker-compose.yml
├── slave1
│ └── docker-compose.yml
└── slave2
└── docker-compose.yml

master/docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
version: '3'  # 使用docker-compose版本3
services: # 定义服务
mysql_master: # 定义一个名为mysql_master的服务
image: mysql:8.0.20 # 使用MySQL 8.0.20镜像
container_name: mysql-master # 指定容器名称为mysql_master
restart: unless-stopped # 在容器退出时自动重新启动
command: # 容器启动时执行的命令
- --server-id=1 # 设置MySQL服务器的ID为1,用于复制
- --relay_log=relay-log # 开启中继日志
- --binlog-ignore-db=mysql # 忽略在binlog中记录的数据库,这里为mysql
- --skip-name-resolve # 禁用DNS解析
- --innodb_flush_log_at_trx_commit=1 # 每个事务提交时将日志写入磁盘
- --sync-binlog=1 # 立即将binlog写入磁盘
- --innodb_flush_method=O_DIRECT # 使用直接IO刷新InnoDB缓冲区
- --log-bin=master-log # 开启二进制日志
- --log_bin-index=master-bin.index # 指定binlog索引文件名
- --max_connections=500 # 最大的并发连接数
- --max_connect_errors=100 # 连接错误的最大次数
- --character-set-server=utf8 # 设置服务器的字符集为UTF-8
- --default-storage-engine=INNODB # 设置默认存储引擎为InnoDB
- --default_authentication_plugin=mysql_native_password # 设置默认身份验证插件为mysql_native_password
- --expire-logs-days=7 # 设置binlog日志自动删除的天数为7天
- --binlog-ignore-db=information_schema # 忽略在binlog中记录的数据库,这里为information_schema
- --binlog-ignore-db=performance_schema # 忽略在binlog中记录的数据库,这里为performance_schema
- --binlog-ignore-db=sys # 忽略在binlog中记录的数据库,这里为sys
- --gtid_mode=on # 开启全局事务标识
- --enforce_gtid_consistency=on # 强制全局事务标识的一致性
- --binlog_format=mixed # 二进制日志的格式为混合模式
- --sync_binlog=1 # 立即将binlog写入磁盘
- --default_storage_engine=InnoDB # 默认的存储引擎是InnoDB
- --performance_schema_max_table_instances=400 # 性能模式中最大的表实例数
- --table_definition_cache=400 # 表定义缓存的大小
- --skip-external-locking # 跳过外部锁定
- --max_allowed_packet=100G # 数据包的最大大小
- --table_open_cache=512 # 表缓存的大小
- --sort_buffer_size=2M # 排序缓冲区的大小
- --net_buffer_length=4K # 网络缓冲区的长度
- --read_buffer_size=2M # 读缓冲区的大小
- --read_rnd_buffer_size=256K # 随机读缓冲区的大小
- --thread_cache_size=64 # 线程缓存的大小
- --tmp_table_size=64M # 临时表的大小
- --lower_case_table_names=1 # 表名是否区分大小写,1表示不区分大小写
- --sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # SQL模式
- --explicit_defaults_for_timestamp=true # 如果设置为true,则对于TIMESTAMP列,使用显式DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP定义
- --skip-name-resolve # 跳过DNS解析
- --open_files_limit=65535 # 可打开文件的数量限制
- --binlog_expire_logs_seconds=600000 # 当二进制日志文件超过指定秒数时,将被自动删除
- --slow_query_log=1 # 启用慢查询日志
- --long_query_time=3 # 超过指定秒数的查询将被认为是慢查询
- --log_queries_not_using_indexes=on # 记录未使用索引的查询
- --innodb_buffer_pool_size=512M # InnoDB缓冲池的大小
- --innodb_log_file_size=256M # InnoDB日志文件的大小
- --innodb_log_buffer_size=64M # InnoDB日志缓冲区的大小
- --innodb_flush_log_at_trx_commit=1 # 每次事务提交时,是否将日志缓冲区的内容刷新到磁盘
- --innodb_lock_wait_timeout=50 # InnoDB锁等待超时时间
- --innodb_max_dirty_pages_pct=90 # InnoDB脏页的最大百分比
- --innodb_read_io_threads=8 # InnoDB读线程的数量
- --innodb_write_io_threads=8 # InnoDB写线程的数量
ports: # 定义容器和主机之间的端口映射
- "33061:3306" # 将容器的3306端口映射到主机的33061端口
environment: # 定义环境变量
MYSQL_ROOT_PASSWORD: 1024 # 设置MySQL的root用户密码为1024
TZ: "Asia/Shanghai" #解决时区问题
volumes: # 定义数据卷
- ./mysql:/var/lib/mysql # 将本地的master目录挂载到容器的/var/lib/mysql目录中

slave1/docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
version: '3'
services:
mysql_slave1:
image: mysql:8.0.20
container_name: mysql-slave1
restart: unless-stopped
command:
- --server-id=2 # 设置MySQL服务器的唯一标识
- --relay-log-index=slave-relay-bin.index # 设置中继日志索引的文件名
- --relay-log=relay-log # 开启中继日志
- --log-bin=master-log # 开启二进制日志
- --read_only=ON # 启用只读属性
- --relay_log_purge=0 # 是否自动清空不再需要中继日志
- --log-slave-updates=1 # 开启从服务器记录二进制日志更新的功能
- --max_connections=200 # 设置最大连接数
- --max_connect_errors=10 # 设置最大连接错误数
- --character-set-server=utf8 # 设置服务器默认字符集为utf8
- --default-storage-engine=INNODB # 设置默认的存储引擎为InnoDB
- --default_authentication_plugin=mysql_native_password # 设置默认的身份验证插件为mysql_native_password
- --log_slave_updates=1 # 开启从服务器记录二进制日志更新的功能
- --binlog-ignore-db=information_schema # 忽略复制的数据库
- --binlog-ignore-db=performance_schema # 忽略复制的数据库
- --binlog-ignore-db=sys # 忽略复制的数据库
- --binlog-ignore-db=mysql # 忽略复制的数据库
- --skip-name-resolve # 禁用主机名解析
- --innodb_flush_log_at_trx_commit=1 # 每次事务提交时刷新日志缓冲区内容到磁盘
- --sync-binlog=1 # 立即将binlog写入磁盘
- --innodb_flush_method=O_DIRECT # 设置InnoDB的日志刷新方式为直接刷新
- --gtid_mode=on # 开启全局事务标识
- --enforce_gtid_consistency=on # 强制全局事务标识的一致性
- --binlog_format=mixed # 设置二进制日志的格式为混合模式
- --sync_binlog=1 # 立即将binlog写入磁盘
- --default_storage_engine=InnoDB # 设置默认的存储引擎为InnoDB
- --performance_schema_max_table_instances=400 # 设置性能模式中最大的表实例数
- --table_definition_cache=400 # 设置表定义缓存的大小
- --skip-external-locking # 跳过外部锁定
- --max_allowed_packet=100G # 设置数据包的最大大小
- --table_open_cache=512 # 设置表缓存的大小
- --sort_buffer_size=2M # 设置排序缓冲区的大小
- --net_buffer_length=4K # 设置网络缓冲区的长度
- --read_buffer_size=2M # 设置读缓冲区的大小
- --read_rnd_buffer_size=256K # 设置随机读缓冲区的大小
- --thread_cache_size=64 # 设置线程缓存的大小
- --tmp_table_size=64M # 设置临时表的大小
- --lower_case_table_names=1 # 设置表名是否区分大小写,1表示不区分大小写
- --sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 设置SQL模式
- --explicit_defaults_for_timestamp=true # 如果设置为true,则对于TIMESTAMP列,使用显式DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP定义
- --skip-name-resolve # 跳过DNS解析
- --open_files_limit=65535 # 设置可打开文件的数量限制
- --binlog_expire_logs_seconds=600000 # 当二进制日志文件超过指定秒数时,将被自动删除
- --slow_query_log=1 # 启用慢查询日志
- --long_query_time=3 # 设置超过指定秒数的查询将被认为是慢查询
- --log_queries_not_using_indexes=on # 记录未使用索引的查询
- --innodb_buffer_pool_size=512M # 设置InnoDB缓冲池的大小
- --innodb_log_file_size=256M # 设置InnoDB日志文件的大小
- --innodb_log_buffer_size=64M # 设置InnoDB日志缓冲区的大小
- --innodb_flush_log_at_trx_commit=1 # 每次事务提交时,是否将日志缓冲区的内容刷新到磁盘
- --innodb_lock_wait_timeout=50 # 设置InnoDB锁等待超时时间
- --innodb_max_dirty_pages_pct=90 # 设置InnoDB脏页的最大百分比
- --innodb_read_io_threads=8 # 设置InnoDB读线程的数量
- --innodb_write_io_threads=8 # 设置InnoDB写线程的数量
- --master_info_repository=TABLE #指定存储主服务器信息的文件的类型
- --relay_log_info_repository=FILE
ports:
- "33062:3306" # 将容器的3306端口映射到主机的33062端口
environment:
MYSQL_ROOT_PASSWORD: 1024 # root用户密码
MYSQL_MASTER_HOST: 192.168.1.10 # 指定主服务器的地址
MYSQL_MASTER_PORT: 33061 # 指定主服务器的端口
MYSQL_MASTER_USER: root # 主服务器的root用户
MYSQL_MASTER_PASSWORD: 1024 # 主服务器的root密码
TZ: "Asia/Shanghai" # 设置时区
volumes:
- ./mysql:/var/lib/mysql # 将本地的slave1目录挂载到容器的/var/lib/mysql目录中

slave2/docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
version: '3'
services:
mysql_slave2:
image: mysql:8.0.20
container_name: mysql-slave2
restart: unless-stopped
command:
- --server-id=3 # 设置MySQL服务器的唯一标识
- --relay-log-index=slave-relay-bin.index # 设置中继日志索引的文件名
- --relay-log=relay-log # 开启中继日志
- --log-bin=master-log # 开启二进制日志
- --read_only=ON # 启用只读属性
- --relay_log_purge=0 # 是否自动清空不再需要中继日志
- --log-slave-updates=1 # 开启从服务器记录二进制日志更新的功能
- --max_connections=200 # 设置最大连接数
- --max_connect_errors=10 # 设置最大连接错误数
- --character-set-server=utf8 # 设置服务器默认字符集为utf8
- --default-storage-engine=INNODB # 设置默认的存储引擎为InnoDB
- --default_authentication_plugin=mysql_native_password # 设置默认的身份验证插件为mysql_native_password
- --log_slave_updates=1 # 开启从服务器记录二进制日志更新的功能
- --binlog-ignore-db=information_schema # 忽略复制的数据库
- --binlog-ignore-db=performance_schema # 忽略复制的数据库
- --binlog-ignore-db=sys # 忽略复制的数据库
- --binlog-ignore-db=mysql # 忽略复制的数据库
- --skip-name-resolve # 禁用主机名解析
- --innodb_flush_log_at_trx_commit=1 # 每次事务提交时刷新日志缓冲区内容到磁盘
- --sync-binlog=1 # 立即将binlog写入磁盘
- --innodb_flush_method=O_DIRECT # 设置InnoDB的日志刷新方式为直接刷新
- --gtid_mode=on # 开启全局事务标识
- --enforce_gtid_consistency=on # 强制全局事务标识的一致性
- --binlog_format=mixed # 设置二进制日志的格式为混合模式
- --sync_binlog=1 # 立即将binlog写入磁盘
- --default_storage_engine=InnoDB # 设置默认的存储引擎为InnoDB
- --performance_schema_max_table_instances=400 # 设置性能模式中最大的表实例数
- --table_definition_cache=400 # 设置表定义缓存的大小
- --skip-external-locking # 跳过外部锁定
- --max_allowed_packet=100G # 设置数据包的最大大小
- --table_open_cache=512 # 设置表缓存的大小
- --sort_buffer_size=2M # 设置排序缓冲区的大小
- --net_buffer_length=4K # 设置网络缓冲区的长度
- --read_buffer_size=2M # 设置读缓冲区的大小
- --read_rnd_buffer_size=256K # 设置随机读缓冲区的大小
- --thread_cache_size=64 # 设置线程缓存的大小
- --tmp_table_size=64M # 设置临时表的大小
- --lower_case_table_names=1 # 设置表名是否区分大小写,1表示不区分大小写
- --sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 设置SQL模式
- --explicit_defaults_for_timestamp=true # 如果设置为true,则对于TIMESTAMP列,使用显式DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP定义
- --skip-name-resolve # 跳过DNS解析
- --open_files_limit=65535 # 设置可打开文件的数量限制
- --binlog_expire_logs_seconds=600000 # 当二进制日志文件超过指定秒数时,将被自动删除
- --slow_query_log=1 # 启用慢查询日志
- --long_query_time=3 # 设置超过指定秒数的查询将被认为是慢查询
- --log_queries_not_using_indexes=on # 记录未使用索引的查询
- --innodb_buffer_pool_size=512M # 设置InnoDB缓冲池的大小
- --innodb_log_file_size=256M # 设置InnoDB日志文件的大小
- --innodb_log_buffer_size=64M # 设置InnoDB日志缓冲区的大小
- --innodb_flush_log_at_trx_commit=1 # 每次事务提交时,是否将日志缓冲区的内容刷新到磁盘
- --innodb_lock_wait_timeout=50 # 设置InnoDB锁等待超时时间
- --innodb_max_dirty_pages_pct=90 # 设置InnoDB脏页的最大百分比
- --innodb_read_io_threads=8 # 设置InnoDB读线程的数量
- --innodb_write_io_threads=8 # 设置InnoDB写线程的数量
- --master_info_repository=TABLE #指定存储主服务器信息的文件的类型
- --relay_log_info_repository=FILE
ports:
- "33063:3306" # 将容器的3306端口映射到主机的33062端口
environment:
MYSQL_ROOT_PASSWORD: 1024 # root用户密码
MYSQL_MASTER_HOST: 192.168.1.10 # 指定主服务器的地址
MYSQL_MASTER_PORT: 33061 # 指定主服务器的端口
MYSQL_MASTER_USER: root # 主服务器的root用户
MYSQL_MASTER_PASSWORD: 1024 # 主服务器的root密码
TZ: "Asia/Shanghai" # 设置时区
volumes:
- ./mysql:/var/lib/mysql # 将本地的slave1目录挂载到容器的/var/lib/mysql目录中

主节点配置

进入主节点

1
2
3
4
5
6
7
docker exec -it mysql-master bash

mysql -uroot -p #登录mysql
#安装semisync_master模块,通过扩展库来安装半同步复制模块,需要指定扩展库的文件名,命令如下:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
#查看系统全局参数,命令如下:
show global variables like 'rpl_semi%';

image-20240128210159629

rpl_semi_sync_master_timeout就是半同步复制时等待应答的最长等待时间,默认是10秒,可以根据情况自行调整。rpl_semi_sync_master_wait_point其实表示一种半同步复制的方式。半同步复制有两种方式,一种是我们现在看到的这种默认的AFTER_SYNC方式。这种方式下,主库把日志写入binlog,并且复制给从库,然后开始等待从库的响应。从库返回成功后,主库再提交事务,接着给客户端返回一个成功响应。而另一种方式是叫做AFTER_COMMIT方式。他不是默认的。这种方式,在主库写入binlog后,等待binlog复制到从库,主库就提交自己的本地事务,再等待从库返回给自己一个成功响应,然后主库再给客户端返回响应。

1
2
3
4
#打开半同步复制的开关,命令如下:
set global rpl_semi_sync_master_enabled=ON;
#查看系统全局参数,命令如下:
show global variables like 'rpl_semi%';

image-20240128210337964

1
2
3
4
#授权,命令如下:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1024'; #1024替换为你主节点设置的密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1024';
FLUSH PRIVILEGES;
1
show master status;#查看master的binlog信息

image-20240128211024997

需要注意的是File和Position的值,在配置从节点时需要对应上。

从节点配置

进入每个slave节点操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker exec -it mysql-slave1 bash
docker exec -it mysql-slave2 bash

mysql -uroot -p #登录mysql
#配置主从同步,命令如下:
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_PORT=33061,
MASTER_USER='root',
MASTER_PASSWORD='1024',
MASTER_LOG_FILE='master-log.000003',
MASTER_LOG_POS=895;
set global read_only=1; #设置只读
set global relay_log_purge=0; #不自动删除中继日志
#安装semisync_master模块,通过扩展库来安装半同步复制模块,需要指定扩展库的文件名,命令如下:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
#打开半同步复制的开关,命令如下:
set global rpl_semi_sync_master_enabled=ON;
#开启主从配置,查看从节点状态,命令如下:
START SLAVE;
show slave status\G;

image-20240128212507992

最后授权就可以使用navicat连接了

1
2
3
4
#授权,命令如下:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1024'; #1024替换为你从节点设置的密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1024';
FLUSH PRIVILEGES;

redis高可用一主二从三哨兵集群

建立如下目录结构

1
2
3
4
5
6
7
8
redis-sentinel
├── redis
│ ├── docker-compose.yml
└── sentinel
├── docker-compose.yml
├── sentinel1.conf
├── sentinel2.conf
└── sentinel3.conf

一主二从

其中redis目录下docker-compose.yml文件内容如下:

protected-mode no:关闭就可以其他地方连接使用了

slave-announce-ip:使用宿主机的ip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '4.1'
services:
master:
image: redis
container_name: redis-master
restart: always
command: redis-server --requirepass 1024 --protected-mode no --slave-announce-ip 192.168.1.10 --slave-announce-port 6379 --masterauth 1024 --appendonly yes
ports:
- 6379:6379
volumes:
- ./master_data:/data
slave1:
image: redis
container_name: redis-slave-1
restart: always
command: redis-server --slaveof redis-master 6379 --requirepass 1024 --protected-mode no --slave-announce-ip 192.168.1.10 --masterauth 1024 --slave-announce-port 6380 --appendonly yes
ports:
- 6380:6379
volumes:
- ./slave-1_data:/data
slave2:
image: redis
container_name: redis-slave-2
restart: always
command: redis-server --slaveof redis-master 6379 --requirepass 1024 --protected-mode no --slave-announce-ip 192.168.1.10 --masterauth 1024 --slave-announce-port 6381 --appendonly yes
ports:
- 6381:6379
volumes:
- ./slave-2_data:/data

Redis启用密码认证

Redis主从和clsuter支持密码认证的。redis启用密码认证一定要requirepass和masterauth同时设置。如果主节点设置了requirepass登录验证,在主从切换,slave在和master做数据同步的时候首先需要发送一个ping的消息给主节点判断主节点是否存活,再监听主节点的端口是否联通,发送数据同步等都会用到master的登录密码,否则无法登录,log会出现响应的报错。也就是说slave的masterauth和master的requirepass是对应的,所以建议redis启用密码时将各个节点的masterauth和requirepass设置为相同的密码,降低运维成本。当然设置为不同也是可以的,注意slave节点masterauth和master节点requirepass的对应关系就行。

  • masterauth作用:主要是针对master对应的slave节点设置的,在slave节点数据同步的时候用到。
  • requirepass作用:对登录权限做限制,redis每个节点的requirepass可以是独立、不同的。

Redis Sentinel

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossipprotocols) 来接收关于主服务器是否下线的信息, 并使用投票协议(agreementprotocols) 来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。 虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。

sentinel哨兵目录下docker-compose.yml文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '4.1'
services:
sentinel1:
image: redis
container_name: redis-sentinel-1
restart: always
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
restart: always
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
default:
name: redis_default
external: true

sentinel1.conf、sentinel2.conf、sentinel3.conf中内容如下:

1
2
3
4
5
6
7
protected-mode no
# 自定义集群名,其中192.168.1.10 为 宿主机 的 ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
sentinel monitor mymaster 192.168.1.10 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 1024
sentinel failover-timeout mymaster 180000

分别在redis和sentinel目录下使用docker compose up -d运行,加参数 -d 可以实现后台运行

看到如下打印输出说明集群已经启动起来了

image-20240128155338122

验证

主节点

docker exec -it redis-master redis-cli进入主机器

1
2
# info之前先进行授权 auth redis_pwd(requirepass的值)
info replication

可以看到当前redis的角色和从节点数以及从节点信息:

image-20240128161339299

从节点

docker exec -it redis-slave-1 redis-cli进入从机器

1
2
# info之前先进行授权 auth redis_pwd(requirepass的值)
info replication

image-20240128161910647

哨兵节点

docker exec -it redis-sentinel-1 bash查看哨兵信息

1
2
redis-cli -p 26379 #连接客户端,注意端口号为26379
info sentinel

image-20240128163827930

在sentinel目录下docker compose logs -f查看日志

此时我们停掉redis-master

1
docker stop redis-master

查看哨兵日志可以发现哨兵经过投票将新的master节点赋予了redis-slave-1(你的可能跟我的不一样,根据你的从节点容器ip确定)

image-20240128174740836

进入redis-slave-1查看信息

1
2
3
docker exec -it redis-slave-1 redis-cli #进入redis-slave-1
# info之前先进行授权 auth redis_pwd(requirepass的值)
info replication

发现redis-slave-1的角色变为了master

image-20240128164834009

主观下线和客观下线

由上述配置知down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。 如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN)

  • 主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断。
  • 客观下线(Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)客观下线条件只适用于主服务器

如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复[+PONG 、 -LOADING 或者 -MASTERDOWN 。], 那么 Sentinel 就会将这个服务器标记为主观下线。

Sentinel 命令

  • PING :返回 PONG 。
  • SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态。
  • SENTINEL slaves :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。 SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个命令返回新的主服务器的 IP 地址和端口号。
  • SENTINEL reset : 重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。
  • SENTINEL failover : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移 (不过发起故障转移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新)。

RocketMQ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: '3.8'
services:
namesrv:
image: apache/rocketmq:5.3.0
container_name: rmqnamesrv
ports:
- 9876:9876
networks:
- rocketmq
command: sh mqnamesrv
broker:
image: apache/rocketmq:5.3.0
container_name: rmqbroker
ports:
- 10909:10909
- 10911:10911
- 10912:10912
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
depends_on:
- namesrv
networks:
- rocketmq
command: sh mqbroker
proxy:
image: apache/rocketmq:5.3.0
container_name: rmqproxy
networks:
- rocketmq
depends_on:
- broker
- namesrv
ports:
- 8080:8080
- 8081:8081
restart: on-failure
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
command: sh mqproxy
networks:
rocketmq:
driver: bridge

xxl-job

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 命令执行 docker-compose up -d
version: '3.9'
services:
# http://127.0.0.1:9090/xxl-job-admin admin/123456 - 安装后稍等会访问即可
xxl-job-admin:
image: xuxueli/xxl-job-admin:2.4.1
container_name: xxl-job-admin
restart: always
depends_on:
- mysql
ports:
- "9090:9090"
links:
- mysql
volumes:
- ./data/logs:/data/applogs
- ./data/xxl-job/:/xxl-job
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/xxl_job?serverTimezone=UTC&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=1024
- SERVER_PORT=9090

mysql:
image: mysql:8.0.30
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
TZ: Asia/Shanghai
# MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 可配置无密码,注意配置 SPRING_DATASOURCE_PASSWORD=
MYSQL_ROOT_PASSWORD: 1024
MYSQL_USER: yuanyuan
MYSQL_PASSWORD: 1024
depends_on:
- mysql-job-dbdata
ports:
- "13306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
volumes_from:
- mysql-job-dbdata

# 自动加载数据
mysql-job-dbdata:
image: alpine:3.18.2
container_name: mysql-job-dbdata
volumes:
- /var/lib/mysql

新建 sql/xxl-job.sql

文件目录如下:

image-20240810190637392

xxl-job.sql内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# 获取地址:https://github.com/xuxueli/xxl-job/tree/master/doc/db
# XXL-JOB v2.4.1-SNAPSHOT
# Copyright (c) 2015-present, xuxueli.

CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `xxl_job`;

SET NAMES utf8mb4;

CREATE TABLE `xxl_job_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_desc` varchar(255) NOT NULL,
`add_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`author` varchar(64) DEFAULT NULL COMMENT '作者',
`alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
`schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
`schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
`misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
`executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
`executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
`executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
`glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
`glue_source` mediumtext COMMENT 'GLUE源代码',
`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
`glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
`child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
`trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
`trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
`trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
`executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
`trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
`trigger_code` int(11) NOT NULL COMMENT '调度-结果',
`trigger_msg` text COMMENT '调度-日志',
`handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
`handle_code` int(11) NOT NULL COMMENT '执行-状态',
`handle_msg` text COMMENT '执行-日志',
`alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
PRIMARY KEY (`id`),
KEY `I_trigger_time` (`trigger_time`),
KEY `I_handle_code` (`handle_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_log_report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
`fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_logglue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
`glue_source` mediumtext COMMENT 'GLUE源代码',
`glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
`add_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_registry` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`registry_group` varchar(50) NOT NULL,
`registry_key` varchar(255) NOT NULL,
`registry_value` varchar(255) NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
`title` varchar(12) NOT NULL COMMENT '执行器名称',
`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
`address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '账号',
`password` varchar(50) NOT NULL COMMENT '密码',
`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
`permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
PRIMARY KEY (`id`),
UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_lock` (
`lock_name` varchar(50) NOT NULL COMMENT '锁名称',
PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' );
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');

commit;

Jenkins

CI/CD工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3.9'
# 执行脚本;docker-compose -f docker-compose-v1.0.yml up -d
services:
jenkins:
image: jenkins/jenkins:2.471-jdk17
container_name: jenkins
privileged: true
user: root
ports:
- "9090:8080"
- "50001:50000"
volumes:
- ./jenkins_home:/var/jenkins_home # 如果不配置到云服务器路径下,则可以配置 jenkins_home 会创建一个数据卷使用
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/local/bin/docker
environment:
- JAVA_OPTS=-Djenkins.install.runSetupWizard=false # 禁止安装向导「如果需要密码则不要配置」docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
restart: unless-stopped

volumes:
jenkins_home:

zookeeper

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.9'
services:
zoo1:
image: zookeeper:3.9.2
container_name: zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181

Ignite

内存数据库

1
2
3
4
5
6
7
8
version: '3.9'
# https://hub.docker.com/r/apacheignite/ignite/tags
services:
ignite:
image: apacheignite/ignite:2.16.0
container_name: ignite
ports:
- 10800:10800