1. 首页 > Podman教程 > 正文

Podman教程FG020-Podman集群主从

本文档风哥主要介绍Podman集群主从,包括集群的概念、主从架构、集群组件以及集群的部署、主从设置和集群管理等内容。风哥教程参考Podman官方文档Cluster部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 集群概念

集群是指由多个服务器组成的一个整体,共同提供服务。Podman集群是指使用Podman容器技术部署和管理的集群系统,包括多个容器节点,共同提供服务。集群可以提高系统的可用性、可靠性和扩展性。更多视频教程www.fgedu.net.cn

集群的特点:

  • 高可用性:当一个节点失败时,其他节点可以继续提供服务
  • 可扩展性:可以根据需求添加或删除节点
  • 负载均衡:将请求分发到多个节点,提高系统性能
  • 容错性:能够容忍节点故障,确保系统正常运行

1.2 主从架构

主从架构是一种常见的集群架构,其中一个节点作为主节点(Master),负责处理写操作和管理集群,其他节点作为从节点(Slave),负责处理读操作和复制主节点的数据。主从架构可以提高系统的可用性和读写性能。

1.3 集群组件

Podman集群的组件主要包括:

  • 主节点:负责处理写操作和管理集群
  • 从节点:负责处理读操作和复制主节点的数据
  • 负载均衡器:将请求分发到多个节点
  • 监控系统:监控集群的运行状态
  • 存储系统:提供共享存储
风哥提示:集群主从架构是提高系统可用性和可靠性的重要方式,通过Podman容器技术部署和管理集群,可以提高部署效率、降低运维成本,实现集群的快速扩展和迁移。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 集群策略

生产环境中Podman集群的策略:

# 集群策略

## 高可用性策略
– 多节点部署:部署多个节点,确保服务可用性
– 故障转移:当主节点失败时,自动切换到从节点
– 数据复制:确保数据在多个节点之间同步

## 负载均衡策略
– 轮询:按顺序分发请求
– 最少连接:将请求分发到连接数最少的节点
– IP哈希:根据客户端IP分发请求
– 权重:根据节点性能设置权重

## 数据一致性策略
– 同步复制:主节点等待从节点确认后再返回
– 异步复制:主节点不等待从节点确认
– 半同步复制:至少一个从节点确认后再返回

## 扩容策略
– 水平扩容:添加更多节点
– 垂直扩容:增加节点的资源
– 自动扩容:根据负载自动添加节点

2.2 集群需求

生产环境中Podman集群的需求:

# 集群需求

## 功能需求
– 高可用性:确保服务持续可用
– 负载均衡:分发请求,提高性能
– 数据一致性:确保数据在多个节点之间同步
– 故障转移:当节点失败时,自动切换

## 性能需求
– 响应时间:快速响应请求
– 吞吐量:处理大量请求
– 可扩展性:支持业务增长
– 可靠性:确保系统稳定运行

## 技术需求
– 容器化:使用Podman容器技术
– 网络:高速网络连接
– 存储:共享存储或分布式存储
– 监控:监控集群状态

## 非功能需求
– 安全性:数据安全和访问控制
– 可维护性:易于管理和维护
– 成本效益:合理的资源利用
– 合规性:满足法规要求

2.3 集群设计

生产环境中Podman集群的设计:

  • 节点数量:根据业务需求和可用性要求确定节点数量
  • 网络设计:配置高速网络连接,确保节点之间的通信
  • 存储设计:选择合适的存储方案,确保数据一致性
  • 负载均衡设计:选择合适的负载均衡策略
  • 监控设计:建立完善的监控系统,及时发现和解决问题
生产环境建议:合理设计集群架构,选择合适的组件,确保集群的高可用性、可靠性和扩展性,满足业务需求。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 集群部署

3.1.1 部署MySQL主从集群

# 部署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主从复制

# 配置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负载均衡

# 运行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

风哥提示:集群管理是确保集群正常运行的重要环节,通过部署负载均衡器,可以分发请求,提高系统性能和可用性。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 数据库集群

4.1.1 部署PostgreSQL主从集群

# 部署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负载均衡集群

# 部署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部署集群

# 使用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

生产环境建议:在生产环境中,应建立完善的集群架构,选择合适的组件,确保集群的高可用性、可靠性和扩展性,满足业务需求。from Podman视频:www.itpux.com

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、内存、磁盘、网络
– 监控服务状态:检查服务是否正常运行
– 监控数据一致性:确保数据在节点之间同步
– 监控故障转移:测试故障转移功能

## 故障处理
– 建立故障处理流程:快速响应和解决故障
– 制定应急预案:应对各种故障情况
– 定期演练:测试故障恢复流程
– 持续改进:总结故障处理经验

## 性能调优
– 监控性能指标:识别性能瓶颈
– 优化配置:调整系统和应用配置
– 负载测试:测试系统在高负载下的表现
– 持续优化:根据测试结果调整

风哥提示:集群主从架构是提高系统可用性和可靠性的重要方式,通过Podman容器技术部署和管理集群,可以提高部署效率、降低运维成本,实现集群的快速扩展和迁移。建议建立完善的集群架构,选择合适的组件,确保集群的高可用性、可靠性和扩展性,满足业务需求。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息