本文档风哥主要介绍Podman集群主从,包括集群的概念、主从架构、集群组件以及集群的部署、主从设置和集群管理等内容。风哥教程参考Podman官方文档Cluster部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 集群概念
集群是指由多个服务器组成的一个整体,共同提供服务。Podman集群是指使用Podman容器技术部署和管理的集群系统,包括多个容器节点,共同提供服务。集群可以提高系统的可用性、可靠性和扩展性。更多视频教程www.fgedu.net.cn
- 高可用性:当一个节点失败时,其他节点可以继续提供服务
- 可扩展性:可以根据需求添加或删除节点
- 负载均衡:将请求分发到多个节点,提高系统性能
- 容错性:能够容忍节点故障,确保系统正常运行
1.2 主从架构
主从架构是一种常见的集群架构,其中一个节点作为主节点(Master),负责处理写操作和管理集群,其他节点作为从节点(Slave),负责处理读操作和复制主节点的数据。主从架构可以提高系统的可用性和读写性能。
1.3 集群组件
Podman集群的组件主要包括:
- 主节点:负责处理写操作和管理集群
- 从节点:负责处理读操作和复制主节点的数据
- 负载均衡器:将请求分发到多个节点
- 监控系统:监控集群的运行状态
- 存储系统:提供共享存储
Part02-生产环境规划与建议
2.1 集群策略
生产环境中Podman集群的策略:
## 高可用性策略
– 多节点部署:部署多个节点,确保服务可用性
– 故障转移:当主节点失败时,自动切换到从节点
– 数据复制:确保数据在多个节点之间同步
## 负载均衡策略
– 轮询:按顺序分发请求
– 最少连接:将请求分发到连接数最少的节点
– IP哈希:根据客户端IP分发请求
– 权重:根据节点性能设置权重
## 数据一致性策略
– 同步复制:主节点等待从节点确认后再返回
– 异步复制:主节点不等待从节点确认
– 半同步复制:至少一个从节点确认后再返回
## 扩容策略
– 水平扩容:添加更多节点
– 垂直扩容:增加节点的资源
– 自动扩容:根据负载自动添加节点
2.2 集群需求
生产环境中Podman集群的需求:
## 功能需求
– 高可用性:确保服务持续可用
– 负载均衡:分发请求,提高性能
– 数据一致性:确保数据在多个节点之间同步
– 故障转移:当节点失败时,自动切换
## 性能需求
– 响应时间:快速响应请求
– 吞吐量:处理大量请求
– 可扩展性:支持业务增长
– 可靠性:确保系统稳定运行
## 技术需求
– 容器化:使用Podman容器技术
– 网络:高速网络连接
– 存储:共享存储或分布式存储
– 监控:监控集群状态
## 非功能需求
– 安全性:数据安全和访问控制
– 可维护性:易于管理和维护
– 成本效益:合理的资源利用
– 合规性:满足法规要求
2.3 集群设计
生产环境中Podman集群的设计:
- 节点数量:根据业务需求和可用性要求确定节点数量
- 网络设计:配置高速网络连接,确保节点之间的通信
- 存储设计:选择合适的存储方案,确保数据一致性
- 负载均衡设计:选择合适的负载均衡策略
- 监控设计:建立完善的监控系统,及时发现和解决问题
Part03-生产环境项目实施方案
3.1 集群部署
3.1.1 部署MySQL主从集群
# 主节点服务器:192.168.1.10
# 从节点服务器:192.168.1.11
# 在主节点上运行MySQL容器
$ podman run -d –name fgedu-mysql-master \
–cpus 4 \
–memory 8g \
-v /Podman/fgdata/mysql/master/data:/var/lib/mysql:z \
-v /Podman/fgdata/mysql/master/conf:/etc/mysql/conf.d:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-e MYSQL_DATABASE=fgedudb \
-e MYSQL_USER=fgedu \
-e MYSQL_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 配置主节点
$ cat > /Podman/fgdata/mysql/master/conf/my.cnf << EOF
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = fgedudb
EOF
# 重启主节点
$ podman restart fgedu-mysql-master
# 在从节点上运行MySQL容器
$ podman run -d --name fgedu-mysql-slave \
--cpus 4 \
--memory 8g \
-v /Podman/fgdata/mysql/slave/data:/var/lib/mysql:z \
-v /Podman/fgdata/mysql/slave/conf:/etc/mysql/conf.d:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-e MYSQL_DATABASE=fgedudb \
-e MYSQL_USER=fgedu \
-e MYSQL_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 配置从节点
$ cat > /Podman/fgdata/mysql/slave/conf/my.cnf << EOF
[mysqld]
server-id = 2
relay-log = slave-relay-bin
read-only = 1
EOF
# 重启从节点
$ podman restart fgedu-mysql-slave
3.2 主从设置
3.2.1 配置MySQL主从复制
# 在主节点上创建复制用户
$ podman exec -it fgedu-mysql-master mysql -u root -p
# 输出日志
Enter password:
mysql> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘repl123’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;
# 输出日志
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000001 | 156 | fgedudb | | |
+——————+———-+————–+——————+——————-+
# 退出MySQL
mysql> exit
# 在从节点上配置主从复制
$ podman exec -it fgedu-mysql-slave mysql -u root -p
# 输出日志
Enter password:
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.10′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’repl123′,
-> MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=156;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
# 输出日志
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.10
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 156
Relay_Log_File: slave-relay-bin.000001
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 156
Relay_Log_Space: 524
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 12345678-1234-1234-1234-1234567890ab
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
# 退出MySQL
mysql> exit
3.3 集群管理
3.3.1 部署HAProxy负载均衡
# 运行HAProxy容器
$ podman run -d –name fgedu-haproxy \
–cpus 2 \
–memory 2g \
-v /Podman/fgdata/haproxy/conf:/usr/local/etc/haproxy:z \
-p 80:80 \
-p 3306:3306 \
-p 8404:8404 \
docker.io/library/haproxy:2.8
# 配置HAProxy
$ cat > /Podman/fgdata/haproxy/conf/haproxy.cfg << EOF
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 30s
listen mysql-cluster
bind *:3306
mode tcp
balance roundrobin
server master 192.168.1.10:3306 check
server slave 192.168.1.11:3306 check
EOF
# 重启HAProxy
$ podman restart fgedu-haproxy
# 查看HAProxy状态
$ curl http://localhost:8404/stats
Part04-生产案例与实战讲解
4.1 数据库集群
4.1.1 部署PostgreSQL主从集群
# 主节点服务器:192.168.1.10
# 从节点服务器:192.168.1.11
# 在主节点上运行PostgreSQL容器
$ podman run -d –name fgedu-postgres-master \
–cpus 4 \
–memory 8g \
-v /Podman/fgdata/postgres/master/data:/var/lib/postgresql/data:z \
-v /Podman/fgdata/postgres/master/conf:/etc/postgresql/postgresql.conf.d:z \
-e POSTGRES_USER=fgedu \
-e POSTGRES_PASSWORD=fgedu123 \
-e POSTGRES_DB=fgedudb \
-p 5432:5432 \
docker.io/library/postgres:15
# 配置主节点
$ cat > /Podman/fgdata/postgres/master/conf/replication.conf << EOF
listen_addresses = '*'
max_wal_senders = 10
wal_level = replica
hot_standby = on
max_replication_slots = 10
EOF
# 重启主节点
$ podman restart fgedu-postgres-master
# 在主节点上创建复制用户
$ podman exec -it fgedu-postgres-master psql -U fgedu -d fgedudb
# 输出日志
psql (15.0 (Debian 15.0-1.pgdg110+1))
Type "help" for help.
fgedudb=# CREATE ROLE repl WITH REPLICATION LOGIN PASSWORD 'repl123';
fgedudb=# exit
# 在从节点上运行PostgreSQL容器
$ podman run -d --name fgedu-postgres-slave \
--cpus 4 \
--memory 8g \
-v /Podman/fgdata/postgres/slave/data:/var/lib/postgresql/data:z \
-v /Podman/fgdata/postgres/slave/conf:/etc/postgresql/postgresql.conf.d:z \
-e POSTGRES_USER=fgedu \
-e POSTGRES_PASSWORD=fgedu123 \
-e POSTGRES_DB=fgedudb \
-p 5432:5432 \
docker.io/library/postgres:15
# 停止从节点
$ podman stop fgedu-postgres-slave
# 清空从节点数据目录
$ rm -rf /Podman/fgdata/postgres/slave/data/*
# 从主节点复制数据
$ podman exec -it fgedu-postgres-master pg_basebackup -h 192.168.1.10 -U repl -D /var/lib/postgresql/data -Fp -Xs -P
# 配置从节点
$ cat > /Podman/fgdata/postgres/slave/conf/recovery.conf << EOF
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=repl123'
standby_mode = 'on'
EOF
# 启动从节点
$ podman start fgedu-postgres-slave
# 验证主从复制
$ podman exec -it fgedu-postgres-master psql -U fgedu -d fgedudb
# 输出日志
psql (15.0 (Debian 15.0-1.pgdg110+1))
Type "help" for help.
fgedudb=# CREATE TABLE test (id serial primary key, name varchar(255));
fgedudb=# INSERT INTO test (name) VALUES ('test1'), ('test2');
fgedudb=# SELECT * FROM test;
# 输出日志
id | name
----+------
1 | test1
2 | test2
(2 rows)
fgedudb=# exit
# 在从节点上验证数据
$ podman exec -it fgedu-postgres-slave psql -U fgedu -d fgedudb
# 输出日志
psql (15.0 (Debian 15.0-1.pgdg110+1))
Type "help" for help.
fgedudb=# SELECT * FROM test;
# 输出日志
id | name
----+------
1 | test1
2 | test2
(2 rows)
fgedudb=# exit
4.2 Web应用集群
4.2.1 部署Nginx负载均衡集群
# 节点1:192.168.1.10
# 节点2:192.168.1.11
# 负载均衡器:192.168.1.12
# 在节点1上运行Nginx容器
$ podman run -d –name fgedu-nginx-1 \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/nginx/1/html:/usr/share/nginx/html:z \
-v /Podman/fgdata/nginx/1/conf:/etc/nginx/conf.d:z \
-p 80:80 \
docker.io/library/nginx
# 在节点2上运行Nginx容器
$ podman run -d –name fgedu-nginx-2 \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/nginx/2/html:/usr/share/nginx/html:z \
-v /Podman/fgdata/nginx/2/conf:/etc/nginx/conf.d:z \
-p 80:80 \
docker.io/library/nginx
# 在负载均衡器上运行HAProxy容器
$ podman run -d –name fgedu-haproxy \
–cpus 2 \
–memory 2g \
-v /Podman/fgdata/haproxy/conf:/usr/local/etc/haproxy:z \
-p 80:80 \
-p 8404:8404 \
docker.io/library/haproxy:2.8
# 配置HAProxy
$ cat > /Podman/fgdata/haproxy/conf/haproxy.cfg << EOF
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 30s
listen web-cluster
bind *:80
mode http
balance roundrobin
server nginx-1 192.168.1.10:80 check
server nginx-2 192.168.1.11:80 check
EOF
# 重启HAProxy
$ podman restart fgedu-haproxy
# 测试负载均衡
$ curl http://192.168.1.12
# 输出日志
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
4.3 容器编排
4.3.1 使用Podman Compose部署集群
# 创建docker-compose.yml文件
$ cat > /Podman/fgdata/compose/docker-compose.yml << EOF
version: '3'
services:
mysql-master:
image: docker.io/library/mysql:8.0
container_name: fgedu-mysql-master
ports:
- "3306:3306"
volumes:
- /Podman/fgdata/mysql/master/data:/var/lib/mysql:z
- /Podman/fgdata/mysql/master/conf:/etc/mysql/conf.d:z
environment:
- MYSQL_ROOT_PASSWORD=fgedu123
- MYSQL_DATABASE=fgedudb
- MYSQL_USER=fgedu
- MYSQL_PASSWORD=fgedu123
restart: always
mysql-slave:
image: docker.io/library/mysql:8.0
container_name: fgedu-mysql-slave
ports:
- "3307:3306"
volumes:
- /Podman/fgdata/mysql/slave/data:/var/lib/mysql:z
- /Podman/fgdata/mysql/slave/conf:/etc/mysql/conf.d:z
environment:
- MYSQL_ROOT_PASSWORD=fgedu123
- MYSQL_DATABASE=fgedudb
- MYSQL_USER=fgedu
- MYSQL_PASSWORD=fgedu123
restart: always
haproxy:
image: docker.io/library/haproxy:2.8
container_name: fgedu-haproxy
ports:
- "80:80"
- "3306:3306"
- "8404:8404"
volumes:
- /Podman/fgdata/haproxy/conf:/usr/local/etc/haproxy:z
restart: always
EOF
# 启动集群
$ podman-compose -f /Podman/fgdata/compose/docker-compose.yml up -d
# 查看容器状态
$ podman-compose -f /Podman/fgdata/compose/docker-compose.yml ps
# 输出日志
NAME COMMAND SERVICE STATUS PORTS
fgedu-haproxy /docker-entrypoint.… haproxy running 0.0.0.0:80->80/tcp, 0.0.0.0:3306->3306/tcp, 0.0.0.0:8404->8404/tcp
fgedu-mysql-master docker-entrypoint.s… mysql-master running 0.0.0.0:3306->3306/tcp
fgedu-mysql-slave docker-entrypoint.s… mysql-slave running 0.0.0.0:3307->3306/tcp
Part05-风哥经验总结与分享
5.1 集群最佳实践
Podman集群的最佳实践:
- 容器化部署:使用Podman容器技术部署集群组件,提高部署效率和一致性
- 高可用性设计:部署多个节点,确保服务持续可用
- 负载均衡:使用负载均衡器分发请求,提高系统性能
- 数据一致性:确保数据在多个节点之间同步
- 监控管理:建立完善的监控系统,及时发现和解决问题
- 备份恢复:定期备份数据和配置,确保数据安全
- 安全管理:加强数据安全和访问控制,保护敏感数据
- 定期维护:定期检查和维护集群,确保系统正常运行
5.2 集群性能优化
Podman集群的性能优化:
## 网络优化
– 使用高速网络连接:10Gbps或更高
– 配置网络参数:优化TCP/IP参数
– 使用主机网络模式:减少网络开销
– 网络隔离:使用VLAN或VXLAN
## 存储优化
– 使用SSD存储:提高I/O性能
– 配置存储驱动:overlay2
– 使用共享存储:NFS或iSCSI
– 数据分区:按业务主题分区
## 资源优化
– 合理分配CPU和内存:根据节点角色分配资源
– 配置容器资源限制:–cpus, –memory
– 使用多核处理:充分利用多核CPU
– 优化数据库参数:根据硬件配置调整
## 负载均衡优化
– 选择合适的负载均衡策略:轮询、最少连接
– 配置健康检查:及时发现和剔除故障节点
– 会话保持:确保会话一致性
– 动态负载均衡:根据节点负载调整
5.3 集群维护
Podman集群的维护:
## 定期备份
– 数据库备份:使用pg_dump或mysqldump
– 配置备份:备份容器配置和Compose文件
– 数据备份:备份数据文件和卷
## 定期更新
– 更新容器镜像:使用最新版本
– 更新Podman:保持最新版本
– 更新配置:根据业务需求调整
## 监控管理
– 监控系统性能:CPU、内存、磁盘、网络
– 监控服务状态:检查服务是否正常运行
– 监控数据一致性:确保数据在节点之间同步
– 监控故障转移:测试故障转移功能
## 故障处理
– 建立故障处理流程:快速响应和解决故障
– 制定应急预案:应对各种故障情况
– 定期演练:测试故障恢复流程
– 持续改进:总结故障处理经验
## 性能调优
– 监控性能指标:识别性能瓶颈
– 优化配置:调整系统和应用配置
– 负载测试:测试系统在高负载下的表现
– 持续优化:根据测试结果调整
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
