简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

Gentoo Linux数据库服务器搭建指南从零开始构建高性能数据库平台详解安装配置优化及安全防护措施

3万

主题

317

科技点

3万

积分

大区版主

木柜子打湿

积分
31893

财Doro三倍冰淇淋无人之境【一阶】立华奏小樱(小丑装)⑨的冰沙以外的星空【二阶】

发表于 2025-8-24 21:10:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Gentoo Linux以其高度的可定制性、优化性能和稳定性而闻名,是构建高性能数据库服务器的理想选择。与其他发行版不同,Gentoo采用源码包管理系统,允许系统管理员针对特定硬件进行深度优化,从而最大化数据库服务器的性能。本指南将详细介绍从零开始在Gentoo Linux上构建高性能数据库平台的完整过程,涵盖系统安装、数据库配置、性能优化以及安全防护措施。

第一部分:Gentoo Linux系统安装

1.1 准备工作

在开始安装之前,确保您有以下准备:

• 一台符合Gentoo Linux最低硬件要求的服务器(建议至少4GB RAM,双核CPU,40GB可用磁盘空间)
• 稳定的网络连接
• 另一台计算机用于访问安装文档(如果需要)

1.2 下载Gentoo安装介质

访问Gentoo官方网站(https://www.gentoo.org/downloads/)下载适合您架构的安装介质。对于大多数现代服务器,您应该选择`amd64`架构。
  1. # 示例:下载Gentoo安装介质
  2. wget https://bouncer.gentoo.org/fetch/root/all/releases/amd64/autobuilds/current-install-amd64-minimal/install-amd64-minimal-20231001T164657Z.iso
复制代码

1.3 启动安装程序

将下载的ISO文件刻录到USB或CD/DVD,然后从该介质启动服务器。启动后,您将看到一个命令行提示符。

1.4 磁盘分区

Gentoo Linux安装需要手动分区。对于数据库服务器,建议采用以下分区方案:
  1. # 查看可用磁盘
  2. fdisk -l
  3. # 开始分区(以/dev/sda为例)
  4. fdisk /dev/sda
  5. # 创建分区方案示例:
  6. # /boot 512M
  7. # swap 8G(或RAM的1-2倍)
  8. # / 剩余空间
复制代码

1.5 格式化分区并挂载
  1. # 格式化分区
  2. mkfs.ext4 /dev/sda1    # /boot
  3. mkswap /dev/sda2       # swap
  4. mkfs.ext4 /dev/sda3    # /
  5. # 挂载分区
  6. mount /dev/sda3 /mnt/gentoo
  7. mkdir /mnt/gentoo/boot
  8. mount /dev/sda1 /mnt/gentoo/boot
  9. swapon /dev/sda2
复制代码

1.6 安装Gentoo基础系统
  1. # 下载stage3包
  2. cd /mnt/gentoo
  3. links https://www.gentoo.org/downloads/mirrors/
  4. # 解压stage3包
  5. tar xvjpf stage3-*.tar.bz2 --xattrs-include='*.*' --numeric-owner
  6. # 配置编译选项
  7. nano -w /mnt/gentoo/etc/portage/make.conf
  8. # 示例make.conf配置:
  9. CFLAGS="-O2 -pipe -march=native"
  10. CXXFLAGS="${CFLAGS}"
  11. MAKEOPTS="-j4"  # 根据CPU核心数调整
  12. USE="bindist mmx sse sse2"
  13. # 配置镜像源
  14. mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
  15. mkdir /mnt/gentoo/etc/portage/repos.conf
  16. cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf
  17. # 复制DNS信息
  18. cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
  19. # 挂载必要文件系统
  20. mount -t proc /proc /mnt/gentoo/proc
  21. mount --rbind /sys /mnt/gentoo/sys
  22. mount --make-rslave /mnt/gentoo/sys
  23. mount --rbind /dev /mnt/gentoo/dev
  24. mount --make-rslave /mnt/gentoo/dev
  25. # 进入新系统
  26. chroot /mnt/gentoo /bin/bash
  27. source /etc/profile
  28. export PS1="(chroot) ${PS1}"
复制代码

1.7 完成基础安装
  1. # 同步Portage树
  2. emerge --sync
  3. # 选择profile
  4. eselect profile list
  5. eselect profile set default/linux/amd64/17.1/server
  6. # 更新系统
  7. emerge --update --deep --newuse @world
  8. # 设置时区
  9. echo "Asia/Shanghai" > /etc/timezone
  10. emerge --config sys-libs/timezone-data
  11. # 配置locale
  12. nano -w /etc/locale.gen
  13. # 取消注释 en_US.UTF-8 UTF-8 和 zh_CN.UTF-8 UTF-8
  14. locale-gen
  15. eselect locale set en_US.utf8
  16. env-update && source /etc/profile && export PS1="(chroot) ${PS1}"
  17. # 安装必要工具
  18. emerge app-admin/sysklogd app-admin/logrotate sys-process/cronie sys-fs/e2fsprogs sys-process/procps sys-apps/util-linux
  19. # 配置启动服务
  20. rc-update add sysklogd default
  21. rc-update add cronie default
  22. # 安装内核源码
  23. emerge sys-kernel/gentoo-sources
  24. # 配置并编译内核
  25. cd /usr/src/linux
  26. make menuconfig
  27. # 根据硬件配置选择合适的选项
  28. make && make modules_install
  29. make install
  30. # 配置/etc/fstab
  31. nano -w /etc/fstab
  32. # 示例fstab条目:
  33. /dev/sda1   /boot        ext4    defaults,noatime 0 2
  34. /dev/sda2   none         swap    sw               0 0
  35. /dev/sda3   /            ext4    noatime          0 1
  36. # 配置网络
  37. nano -w /etc/conf.d/net
  38. # 示例网络配置:
  39. config_eth0="192.168.1.100/24"
  40. routes_eth0="default via 192.168.1.1"
  41. # 创建网络符号链接并启动
  42. cd /etc/init.d
  43. ln -s net.lo net.eth0
  44. rc-update add net.eth0 default
  45. /etc/init.d/net.eth0 start
  46. # 设置root密码
  47. passwd
  48. # 安装引导程序
  49. emerge sys-boot/grub
  50. grub-install /dev/sda
  51. grub-mkconfig -o /boot/grub/grub.cfg
  52. # 退出chroot并重启
  53. exit
  54. cd
  55. umount -l /mnt/gentoo/dev{/shm,/pts,}
  56. umount -l /mnt/gentoo{/boot,/proc,}
  57. reboot
复制代码

第二部分:数据库选择与安装

2.1 数据库选择

在Gentoo Linux上,您可以选择多种数据库系统,包括:

• MySQL/MariaDB:适用于Web应用和传统企业应用
• PostgreSQL:适用于复杂查询和事务处理
• MongoDB:适用于文档存储和大数据应用
• Redis:适用于内存数据结构存储

本指南将以MySQL/MariaDB和PostgreSQL为例进行详细说明。

2.2 安装MariaDB

MariaDB是MySQL的一个分支,具有更好的性能和更多的功能。
  1. # 设置USE标志
  2. echo "dev-db/mariadb berkdb extraengine server" >> /etc/portage/package.use/mariadb
  3. # 安装MariaDB
  4. emerge dev-db/mariadb
  5. # 配置数据库
  6. emerge --config dev-db/mariadb
  7. # 启动MariaDB服务
  8. rc-update add mysql default
  9. /etc/init.d/mysql start
  10. # 安全初始化
  11. mysql_secure_installation
复制代码

2.3 安装PostgreSQL

PostgreSQL是一个功能强大的开源对象关系数据库系统。
  1. # 设置USE标志
  2. echo "dev-db/postgresql server" >> /etc/portage/package.use/postgresql
  3. # 安装PostgreSQL
  4. emerge dev-db/postgresql
  5. # 初始化数据库
  6. emerge --config dev-db/postgresql
  7. # 启动PostgreSQL服务
  8. rc-update add postgresql-13 default
  9. /etc/init.d/postgresql-13 start
  10. # 设置postgres用户密码
  11. passwd postgres
  12. # 切换到postgres用户并创建数据库用户
  13. su - postgres
  14. createuser --interactive -P
  15. # 按提示创建新用户
  16. createdb -O newuser mydatabase
  17. exit
复制代码

第三部分:基础配置

3.1 MariaDB基础配置

编辑MariaDB配置文件以优化基本设置:
  1. nano -w /etc/mysql/my.cnf
复制代码

示例配置:
  1. [mysqld]
  2. # 基本设置
  3. character-set-server  = utf8mb4
  4. collation-server      = utf8mb4_unicode_ci
  5. default-storage-engine = InnoDB
  6. # 内存设置
  7. innodb_buffer_pool_size = 2G  # 设置为可用RAM的50-70%
  8. innodb_log_file_size    = 256M
  9. innodb_log_buffer_size  = 8M
  10. key_buffer_size         = 64M
  11. max_connections         = 200
  12. thread_cache_size       = 8
  13. thread_stack            = 256K
  14. # 查询缓存
  15. query_cache_type        = 1
  16. query_cache_size        = 64M
  17. query_cache_limit       = 2M
  18. # 日志设置
  19. slow_query_log          = 1
  20. slow_query_log_file     = /var/log/mysql/slow.log
  21. long_query_time         = 2
  22. log-error               = /var/log/mysql/error.log
  23. # InnoDB设置
  24. innodb_flush_method     = O_DIRECT
  25. innodb_file_per_table   = 1
  26. innodb_flush_log_at_trx_commit = 2
  27. innodb_buffer_pool_instances = 4
  28. # 其他设置
  29. skip-name-resolve
  30. max_allowed_packet      = 16M
  31. [mysql]
  32. default-character-set = utf8mb4
  33. [client]
  34. default-character-set = utf8mb4
复制代码

重启MariaDB服务以应用更改:
  1. /etc/init.d/mysql restart
复制代码

3.2 PostgreSQL基础配置

编辑PostgreSQL配置文件:
  1. nano -w /etc/postgresql-13/main/postgresql.conf
复制代码

示例配置:
  1. # 连接设置
  2. listen_addresses = '*'    # 监听所有地址
  3. max_connections = 200
  4. superuser_reserved_connections = 3
  5. # 内存设置
  6. shared_buffers = 512MB   # 设置为可用RAM的25%
  7. effective_cache_size = 2GB  # 设置为可用RAM的50-70%
  8. work_mem = 8MB
  9. maintenance_work_mem = 64MB
  10. # 日志设置
  11. logging_collector = on
  12. log_directory = 'pg_log'
  13. log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
  14. log_statement = 'none'
  15. log_duration = on
  16. log_min_duration_statement = 2000  # 记录执行超过2秒的查询
  17. # 检查点设置
  18. checkpoint_segments = 32
  19. checkpoint_completion_target = 0.9
  20. checkpoint_timeout = 15min
  21. # 查询优化
  22. random_page_cost = 2.0
  23. effective_io_concurrency = 2
  24. # 其他设置
  25. datestyle = 'iso, mdy'
  26. default_text_search_config = 'pg_catalog.english'
复制代码

配置客户端认证:
  1. nano -w /etc/postgresql-13/main/pg_hba.conf
复制代码

示例配置:
  1. # TYPE  DATABASE        USER            ADDRESS                 METHOD
  2. local   all             all                                     trust
  3. host    all             all             127.0.0.1/32            md5
  4. host    all             all             ::1/128                 md5
  5. host    all             all             0.0.0.0/0               md5
复制代码

重启PostgreSQL服务以应用更改:
  1. /etc/init.d/postgresql-13 restart
复制代码

第四部分:性能优化

4.1 系统级优化

在开始数据库优化之前,首先对系统进行优化:
  1. # 编辑sysctl配置
  2. nano -w /etc/sysctl.conf
复制代码

示例配置:
  1. # 虚拟内存设置
  2. vm.swappiness = 10
  3. vm.dirty_ratio = 15
  4. vm.dirty_background_ratio = 5
  5. # 文件系统设置
  6. fs.file-max = 100000
  7. fs.inotify.max_user_watches = 100000
  8. # 网络设置
  9. net.core.rmem_max = 16777216
  10. net.core.wmem_max = 16777216
  11. net.ipv4.tcp_rmem = 4096 87380 16777216
  12. net.ipv4.tcp_wmem = 4096 65536 16777216
  13. net.ipv4.tcp_fin_timeout = 30
  14. net.ipv4.tcp_keepalive_time = 120
  15. net.ipv4.tcp_max_syn_backlog = 8192
  16. net.ipv4.tcp_max_tw_buckets = 200000
  17. net.ipv4.tcp_no_metrics_save = 1
  18. net.ipv4.tcp_moderate_rcvbuf = 1
  19. net.core.netdev_max_backlog = 5000
复制代码

应用sysctl设置:
  1. sysctl -p
复制代码

4.2 磁盘I/O优化

数据库服务器对磁盘I/O要求较高,以下是优化建议:
  1. # 检查当前I/O调度器
  2. cat /sys/block/sda/queue/scheduler
  3. # 临时设置I/O调度器为deadline
  4. echo deadline > /sys/block/sda/queue/scheduler
  5. # 永久设置I/O调度器
  6. echo 'echo deadline > /sys/block/sda/queue/scheduler' >> /etc/local.d/io-scheduler.start
  7. chmod +x /etc/local.d/io-scheduler.start
  8. rc-update add local default
  9. # 使用noatime选项挂载文件系统
  10. nano -w /etc/fstab
  11. # 修改相关行,添加noatime选项
  12. # 例如:/dev/sda3 / ext4 noatime 0 1
复制代码

4.3 MariaDB性能优化
  1. -- 启用慢查询日志并分析
  2. SET GLOBAL slow_query_log = 'ON';
  3. SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
  4. SET GLOBAL long_query_time = 2;
  5. -- 使用EXPLAIN分析查询
  6. EXPLAIN SELECT * FROM mytable WHERE column = 'value';
  7. -- 创建适当的索引
  8. CREATE INDEX idx_column ON mytable(column);
  9. -- 复合索引
  10. CREATE INDEX idx_column1_column2 ON mytable(column1, column2);
复制代码
  1. -- 优化表
  2. OPTIMIZE TABLE mytable;
  3. -- 分析表以更新索引统计信息
  4. ANALYZE TABLE mytable;
  5. -- 检查表错误
  6. CHECK TABLE mytable;
  7. -- 修复表
  8. REPAIR TABLE mytable;
复制代码

编辑MariaDB配置文件:
  1. nano -w /etc/mysql/my.cnf
复制代码

添加或调整以下参数:
  1. [mysqld]
  2. # InnoDB优化
  3. innodb_io_capacity = 2000
  4. innodb_io_capacity_max = 4000
  5. innodb_lru_scan_depth = 2000
  6. innodb_read_io_threads = 8
  7. innodb_write_io_threads = 8
  8. innodb_thread_concurrency = 0
  9. innodb_spin_wait_delay = 6
  10. # 连接池
  11. thread_pool_size = 16
  12. thread_pool_stall_limit = 30
  13. # 查询优化
  14. optimizer_search_depth = 0
  15. optimizer_prune_level = 1
  16. # 缓冲和缓存
  17. table_open_cache = 2000
  18. table_definition_cache = 2000
  19. innodb_open_files = 2000
  20. # 复制相关(如果使用复制)
  21. binlog_format = ROW
  22. sync_binlog = 0
  23. innodb_flush_log_at_trx_commit = 2
  24. slave_net_timeout = 60
复制代码

重启MariaDB服务:
  1. /etc/init.d/mysql restart
复制代码

4.4 PostgreSQL性能优化
  1. -- 启用查询日志
  2. ALTER DATABASE mydatabase SET log_min_duration_statement = 2000;
  3. -- 使用EXPLAIN分析查询
  4. EXPLAIN SELECT * FROM mytable WHERE column = 'value';
  5. -- 更详细的分析
  6. EXPLAIN ANALYZE SELECT * FROM mytable WHERE column = 'value';
  7. -- 创建索引
  8. CREATE INDEX idx_column ON mytable(column);
  9. -- 复合索引
  10. CREATE INDEX idx_column1_column2 ON mytable(column1, column2);
  11. -- 部分索引
  12. CREATE INDEX idx_partial ON mytable(column) WHERE condition;
  13. -- 更新表统计信息
  14. ANALYZE mytable;
  15. VACUUM ANALYZE mytable;
复制代码
  1. -- 清理表并更新统计信息
  2. VACUUM (VERBOSE, ANALYZE) mytable;
  3. -- 重建表(减少碎片和更新统计信息)
  4. REINDEX TABLE mytable;
  5. CLUSTER mytable;
  6. -- 使用pg_repack扩展(需要先安装)
  7. -- 安装扩展
  8. CREATE EXTENSION pg_repack;
  9. -- 在线重组表
  10. pg_repack -t mytable
复制代码

编辑PostgreSQL配置文件:
  1. nano -w /etc/postgresql-13/main/postgresql.conf
复制代码

添加或调整以下参数:
  1. # 内存设置
  2. shared_buffers = 1GB
  3. effective_cache_size = 3GB
  4. work_mem = 16MB
  5. maintenance_work_mem = 128MB
  6. wal_buffers = 16MB
  7. # 检查点设置
  8. max_wal_size = 2GB
  9. min_wal_size = 1GB
  10. checkpoint_completion_target = 0.9
  11. checkpoint_timeout = 15min
  12. checkpoint_warning = 30s
  13. # 查询优化
  14. random_page_cost = 1.1
  15. effective_io_concurrency = 200
  16. max_parallel_workers_per_gather = 4
  17. max_parallel_workers = 8
  18. max_parallel_maintenance_workers = 4
  19. # 连接设置
  20. max_connections = 300
  21. superuser_reserved_connections = 3
  22. # 日志设置
  23. log_checkpoints = on
  24. log_connections = on
  25. log_disconnections = on
  26. log_lock_waits = on
  27. log_temp_files = 0
  28. log_autovacuum_min_duration = 0
  29. # 自动清理
  30. autovacuum = on
  31. autovacuum_max_workers = 4
  32. autovacuum_naptime = 1min
  33. autovacuum_vacuum_threshold = 1000
  34. autovacuum_analyze_threshold = 500
  35. autovacuum_vacuum_scale_factor = 0.01
  36. autovacuum_analyze_scale_factor = 0.005
复制代码

重启PostgreSQL服务:
  1. /etc/init.d/postgresql-13 restart
复制代码

第五部分:安全防护措施

5.1 系统安全加固
  1. # 安装并配置防火墙
  2. emerge net-firewall/iptables
  3. # 创建防火墙规则
  4. nano -w /etc/iptables/rules-save
复制代码

示例防火墙规则:
  1. # 清除现有规则
  2. *filter
  3. :INPUT ACCEPT [0:0]
  4. :FORWARD ACCEPT [0:0]
  5. :OUTPUT ACCEPT [0:0]
  6. # 允许本地回环
  7. -A INPUT -i lo -j ACCEPT
  8. # 允许已建立的连接
  9. -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  10. # 允许SSH连接
  11. -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name ssh
  12. -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh -j ACCEPT
  13. # 允许数据库连接(仅限特定IP)
  14. -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
  15. -A INPUT -p tcp --dport 5432 -s 192.168.1.0/24 -j ACCEPT
  16. # 允许ICMP(有限制)
  17. -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/s -j ACCEPT
  18. -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
  19. # 拒绝所有其他入站连接
  20. -A INPUT -j DROP
  21. COMMIT
复制代码

应用防火墙规则:
  1. iptables-restore < /etc/iptables/rules-save
  2. rc-update add iptables default
  3. /etc/init.d/iptables save
复制代码

安装并配置fail2ban防止暴力破解:
  1. emerge net-analyzer/fail2ban
  2. # 配置fail2ban
  3. nano -w /etc/fail2ban/jail.conf
复制代码

示例fail2ban配置:
  1. [DEFAULT]
  2. bantime = 3600
  3. findtime = 600
  4. maxretry = 3
  5. backend = auto
  6. [sshd]
  7. enabled = true
  8. port = 22
  9. filter = sshd
  10. logpath = /var/log/auth.log
  11. maxretry = 3
  12. [mysql]
  13. enabled = true
  14. port = 3306
  15. filter = mysql-auth
  16. logpath = /var/log/mysql/error.log
  17. maxretry = 3
  18. [postgresql]
  19. enabled = true
  20. port = 5432
  21. filter = postgresql
  22. logpath = /var/log/postgresql/postgresql-*.log
  23. maxretry = 3
复制代码

启动fail2ban服务:
  1. rc-update add fail2ban default
  2. /etc/init.d/fail2ban start
复制代码

5.2 MariaDB安全配置
  1. -- 删除匿名用户
  2. DROP USER IF EXISTS ''@'localhost';
  3. DROP USER IF EXISTS ''@'%';
  4. -- 删除远程root用户
  5. DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
  6. -- 删除测试数据库
  7. DROP DATABASE IF EXISTS test;
  8. -- 刷新权限
  9. FLUSH PRIVILEGES;
  10. -- 为特定应用创建专用用户
  11. CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'strong_password';
  12. GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'appuser'@'192.168.1.%';
  13. FLUSH PRIVILEGES;
  14. -- 使用SSL连接(如果需要)
  15. CREATE USER 'ssluser'@'%' IDENTIFIED BY 'password' REQUIRE SSL;
  16. GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'ssluser'@'%';
  17. FLUSH PRIVILEGES;
复制代码

配置MariaDB SSL:
  1. # 创建SSL证书目录
  2. mkdir /etc/mysql/ssl
  3. cd /etc/mysql/ssl
  4. # 生成CA证书
  5. openssl genrsa 2048 > ca-key.pem
  6. openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
  7. # 创建服务器证书
  8. openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem
  9. openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
  10. # 创建客户端证书
  11. openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.pem -out client-req.pem
  12. openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
  13. # 设置权限
  14. chmod 600 *.pem
  15. chown mysql:mysql *.pem
复制代码

编辑MariaDB配置文件启用SSL:
  1. nano -w /etc/mysql/my.cnf
复制代码

添加以下配置:
  1. [mysqld]
  2. ssl-ca = /etc/mysql/ssl/ca-cert.pem
  3. ssl-cert = /etc/mysql/ssl/server-cert.pem
  4. ssl-key = /etc/mysql/ssl/server-key.pem
复制代码

重启MariaDB服务:
  1. /etc/init.d/mysql restart
复制代码

5.3 PostgreSQL安全配置
  1. -- 修改postgres用户密码
  2. ALTER USER postgres WITH PASSWORD 'strong_password';
  3. -- 创建专用用户
  4. CREATE USER appuser WITH PASSWORD 'strong_password';
  5. ALTER USER appuser CONNECTION LIMIT 20;
  6. GRANT CONNECT ON DATABASE mydatabase TO appuser;
  7. GRANT USAGE ON SCHEMA public TO appuser;
  8. GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO appuser;
  9. GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO appuser;
  10. -- 使用SSL连接
  11. ALTER SYSTEM SET ssl = on;
  12. ALTER SYSTEM SET ssl_cert_file = '/etc/postgresql/ssl/server-cert.pem';
  13. ALTER SYSTEM SET ssl_key_file = '/etc/postgresql/ssl/server-key.pem';
  14. ALTER SYSTEM SET ssl_ca_file = '/etc/postgresql/ssl/ca-cert.pem';
复制代码

配置PostgreSQL SSL:
  1. # 创建SSL证书目录
  2. mkdir /etc/postgresql/ssl
  3. cd /etc/postgresql/ssl
  4. # 生成CA证书
  5. openssl genrsa 2048 > ca-key.pem
  6. openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
  7. # 创建服务器证书
  8. openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem
  9. openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
  10. # 设置权限
  11. chmod 600 *.pem
  12. chown postgres:postgres *.pem
复制代码

编辑PostgreSQL配置文件启用SSL:
  1. nano -w /etc/postgresql-13/main/postgresql.conf
复制代码

添加以下配置:
  1. ssl = on
  2. ssl_cert_file = '/etc/postgresql/ssl/server-cert.pem'
  3. ssl_key_file = '/etc/postgresql/ssl/server-key.pem'
  4. ssl_ca_file = '/etc/postgresql/ssl/ca-cert.pem'
复制代码

编辑pg_hba.conf文件要求特定连接使用SSL:
  1. nano -w /etc/postgresql-13/main/pg_hba.conf
复制代码

添加以下规则:
  1. # 要求远程连接使用SSL
  2. hostssl all all 0.0.0.0/0 md5
复制代码

重启PostgreSQL服务:
  1. /etc/init.d/postgresql-13 restart
复制代码

第六部分:监控与维护

6.1 系统监控工具安装与配置
  1. # 安装系统监控工具
  2. emerge app-admin/sysstat app-admin/htop sys-process/iotop net-analyzer/nmap
  3. # 配置sysstat
  4. nano -w /etc/conf.d/sysstat
  5. # 设置收集间隔,例如:HISTORY=7 INTERVAL=10
  6. # 启动sysstat
  7. rc-update add sysstat default
  8. /etc/init.d/sysstat start
  9. # 安装Zabbix监控(可选)
  10. emerge net-analyzer/zabbix
复制代码

6.2 数据库监控
  1. -- 启用性能模式
  2. UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES';
  3. UPDATE performance_schema.setup_consumers SET ENABLED = 'YES';
  4. -- 查看全局状态
  5. SHOW GLOBAL STATUS;
  6. -- 查看变量设置
  7. SHOW GLOBAL VARIABLES;
  8. -- 查看进程列表
  9. SHOW FULL PROCESSLIST;
  10. -- 查看InnoDB状态
  11. SHOW ENGINE INNODB STATUS;
  12. -- 查看查询统计
  13. SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
复制代码

安装Percona Toolkit进行高级监控:
  1. # 安装Percona Toolkit
  2. emerge dev-db/percona-toolkit
  3. # 使用pt-query-digest分析慢查询日志
  4. pt-query-digest /var/log/mysql/slow.log
  5. # 使用pt-mysql-summary生成MySQL服务器摘要
  6. pt-mysql-summary --user=root --password=yourpassword
复制代码
  1. -- 查看活动查询
  2. SELECT * FROM pg_stat_activity;
  3. -- 查看数据库统计信息
  4. SELECT * FROM pg_stat_database;
  5. -- 查看表统计信息
  6. SELECT * FROM pg_stat_user_tables;
  7. -- 查看索引统计信息
  8. SELECT * FROM pg_stat_user_indexes;
  9. -- 查看表大小
  10. SELECT
  11.     schemaname,
  12.     tablename,
  13.     pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
  14. FROM pg_tables
  15. ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
  16. -- 查看长时间运行的查询
  17. SELECT
  18.     pid,
  19.     now() - pg_stat_activity.query_start AS duration,
  20.     query,
  21.     state
  22. FROM pg_stat_activity
  23. WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';
复制代码

安装pgBadger进行日志分析:
  1. # 安装pgBadger
  2. emerge app-admin/pgbadger
  3. # 生成HTML报告
  4. pgbadger /var/log/postgresql/postgresql-*.log -o /var/www/localhost/htdocs/reports/pgbadger.html
复制代码

6.3 备份策略

使用mysqldump进行逻辑备份:
  1. # 创建完整备份
  2. mysqldump --user=root --password=yourpassword --single-transaction --routines --triggers --all-databases > /backup/mysql/mysql-full-backup.sql
  3. # 压缩备份
  4. gzip /backup/mysql/mysql-full-backup.sql
  5. # 仅备份特定数据库
  6. mysqldump --user=root --password=yourpassword --single-transaction --routines --triggers mydatabase > /backup/mysql/mydatabase-backup.sql
  7. # 创建备份脚本
  8. nano -w /usr/local/bin/mysql-backup.sh
复制代码

示例备份脚本:
  1. #!/bin/bash
  2. # 设置变量
  3. DATE=$(date +%Y%m%d)
  4. BACKUP_DIR="/backup/mysql"
  5. MYSQL_USER="root"
  6. MYSQL_PASSWORD="yourpassword"
  7. RETENTION=7  # 保留7天的备份
  8. # 创建备份目录
  9. mkdir -p $BACKUP_DIR/$DATE
  10. # 执行备份
  11. mysqldump --user=$MYSQL_USER --password=$MYSQL_PASSWORD --single-transaction --routines --triggers --all-databases | gzip > $BACKUP_DIR/$DATE/mysql-full-backup.sql.gz
  12. # 删除旧备份
  13. find $BACKUP_DIR -type d -mtime +$RETENTION -exec rm -rf {} \;
  14. # 记录日志
  15. echo "MySQL backup completed on $(date)" >> /var/log/mysql-backup.log
复制代码

设置可执行权限并添加到crontab:
  1. chmod +x /usr/local/bin/mysql-backup.sh
  2. crontab -e
  3. # 添加:0 2 * * * /usr/local/bin/mysql-backup.sh
复制代码

使用Percona XtraBackup进行物理备份(适用于大型数据库):
  1. # 安装Percona XtraBackup
  2. emerge dev-db/percona-xtrabackup
  3. # 创建完整备份
  4. xtrabackup --backup --user=root --password=yourpassword --target-dir=/backup/mysql/xtrabackup/
  5. # 准备备份
  6. xtrabackup --prepare --target-dir=/backup/mysql/xtrabackup/
  7. # 创建增量备份(基于完整备份)
  8. xtrabackup --backup --user=root --password=yourpassword --target-dir=/backup/mysql/xtrabackup-inc1 --incremental-basedir=/backup/mysql/xtrabackup/
复制代码

使用pg_dump进行逻辑备份:
  1. # 创建完整备份
  2. pg_dumpall -U postgres > /backup/postgresql/pg_dumpall_$(date +%Y%m%d).sql
  3. # 压缩备份
  4. gzip /backup/postgresql/pg_dumpall_$(date +%Y%m%d).sql
  5. # 仅备份特定数据库
  6. pg_dump -U postgres mydatabase > /backup/postgresql/mydatabase_$(date +%Y%m%d).sql
  7. # 创建备份脚本
  8. nano -w /usr/local/bin/postgresql-backup.sh
复制代码

示例备份脚本:
  1. #!/bin/bash
  2. # 设置变量
  3. DATE=$(date +%Y%m%d)
  4. BACKUP_DIR="/backup/postgresql"
  5. RETENTION=7  # 保留7天的备份
  6. # 创建备份目录
  7. mkdir -p $BACKUP_DIR/$DATE
  8. # 执行备份
  9. pg_dumpall -U postgres | gzip > $BACKUP_DIR/$DATE/pg_dumpall.sql.gz
  10. # 删除旧备份
  11. find $BACKUP_DIR -type d -mtime +$RETENTION -exec rm -rf {} \;
  12. # 记录日志
  13. echo "PostgreSQL backup completed on $(date)" >> /var/log/postgresql-backup.log
复制代码

设置可执行权限并添加到crontab:
  1. chmod +x /usr/local/bin/postgresql-backup.sh
  2. crontab -e
  3. # 添加:0 3 * * * /usr/local/bin/postgresql-backup.sh
复制代码

使用pgBackRest进行高级备份:
  1. # 安装pgBackRest
  2. emerge app-admin/pgbackrest
  3. # 配置pgBackRest
  4. mkdir -p /etc/pgbackrest
  5. mkdir -p /var/log/pgbackrest
  6. mkdir -p /backup/pgbackrest
  7. # 创建配置文件
  8. nano -w /etc/pgbackrest/pgbackrest.conf
复制代码

示例pgBackRest配置:
  1. [global]
  2. repo1-path=/backup/pgbackrest
  3. repo1-retention-full=2
  4. repo1-retention-diff=2
  5. process-max=2
  6. log-level-console=info
  7. log-level-file=debug
  8. [mycluster]
  9. db-path=/var/lib/postgresql/13/data
  10. db-user=postgres
  11. db-port=5432
复制代码

执行备份:
  1. # 创建完整备份
  2. pgBackRest --stanza=mycluster --type=full backup
  3. # 创建增量备份
  4. pgBackRest --stanza=mycluster --type=incr backup
  5. # 查看备份信息
  6. pgBackRest info
复制代码

第七部分:高可用与复制

7.1 MariaDB主从复制

编辑主服务器配置文件:
  1. nano -w /etc/mysql/my.cnf
复制代码

添加以下配置:
  1. [mysqld]
  2. # 服务器ID
  3. server-id = 1
  4. # 启用二进制日志
  5. log-bin = mysql-bin
  6. binlog_format = ROW
  7. binlog_row_image = FULL
  8. # 设置需要复制的数据库(可选)
  9. binlog-do-db = mydatabase
  10. # 设置忽略的数据库(可选)
  11. binlog-ignore-db = mysql
  12. binlog-ignore-db = information_schema
  13. binlog-ignore-db = performance_schema
复制代码

重启MariaDB服务:
  1. /etc/init.d/mysql restart
复制代码

创建复制用户:
  1. CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
  2. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  3. FLUSH PRIVILEGES;
复制代码

锁定数据库并获取二进制日志坐标:
  1. FLUSH TABLES WITH READ LOCK;
  2. SHOW MASTER STATUS;
复制代码

记录File和Position的值,然后解锁:
  1. UNLOCK TABLES;
复制代码

编辑从服务器配置文件:
  1. nano -w /etc/mysql/my.cnf
复制代码

添加以下配置:
  1. [mysqld]
  2. # 服务器ID(必须与主服务器不同)
  3. server-id = 2
  4. # 启用中继日志
  5. relay-log = mysql-relay-bin
  6. relay-log-index = mysql-relay-bin.index
  7. # 设置只读(可选)
  8. read-only = 1
复制代码

重启MariaDB服务:
  1. /etc/init.d/mysql restart
复制代码

配置复制:
  1. CHANGE MASTER TO
  2.     MASTER_HOST='master_ip',
  3.     MASTER_USER='repl',
  4.     MASTER_PASSWORD='repl_password',
  5.     MASTER_LOG_FILE='mysql-bin.000001',
  6.     MASTER_LOG_POS=154;
  7. START SLAVE;
复制代码

检查复制状态:
  1. SHOW SLAVE STATUS\G
复制代码

7.2 PostgreSQL流复制

编辑主服务器配置文件:
  1. nano -w /etc/postgresql-13/main/postgresql.conf
复制代码

添加以下配置:
  1. # 连接和认证设置
  2. listen_addresses = '*'
  3. max_wal_senders = 3
  4. max_replication_slots = 3
  5. wal_level = replica
  6. wal_keep_segments = 100
  7. # 归档设置(可选)
  8. archive_mode = on
  9. archive_command = 'cp %p /backup/postgresql/archive/%f'
复制代码

编辑pg_hba.conf文件允许复制连接:
  1. nano -w /etc/postgresql-13/main/pg_hba.conf
复制代码

添加以下规则:
  1. # 允许复制连接
  2. host replication replicator 192.168.1.0/24 md5
复制代码

创建复制用户:
  1. CREATE USER replicator REPLICATION LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD 'replicator_password';
复制代码

重启PostgreSQL服务:
  1. /etc/init.d/postgresql-13 restart
复制代码

停止从服务器上的PostgreSQL服务:
  1. /etc/init.d/postgresql-13 stop
复制代码

备份主服务器数据并恢复到从服务器:
  1. # 使用pg_basebackup创建基础备份
  2. pg_basebackup -h master_ip -U replicator -D /var/lib/postgresql/13/data -Fp -Xs -P -R
  3. # 设置正确的权限
  4. chown -R postgres:postgres /var/lib/postgresql/13/data
复制代码

编辑从服务器配置文件:
  1. nano -w /etc/postgresql-13/main/postgresql.conf
复制代码

添加以下配置:
  1. # 设置服务器ID(必须与主服务器不同)
  2. hot_standby = on
复制代码

编辑standby.signal文件(由pg_basebackup创建):
  1. nano -w /var/lib/postgresql/13/data/standby.signal
复制代码

确保包含:
  1. standby_mode = 'on'
复制代码

启动从服务器:
  1. /etc/init.d/postgresql-13 start
复制代码

检查复制状态:
  1. -- 在主服务器上
  2. SELECT * FROM pg_stat_replication;
  3. -- 在从服务器上
  4. SELECT * FROM pg_stat_wal_receiver;
复制代码

第八部分:故障排除与最佳实践

8.1 常见问题与解决方案

问题1:服务器启动失败
  1. # 检查错误日志
  2. tail -f /var/log/mysql/error.log
  3. # 检查配置文件语法
  4. mysqld --help --verbose
  5. # 检查权限
  6. chown -R mysql:mysql /var/lib/mysql
复制代码

问题2:连接超时
  1. # 检查网络连接
  2. telnet server_ip 3306
  3. # 检查防火墙规则
  4. iptables -L -n
  5. # 检查MySQL用户权限
  6. SELECT host, user FROM mysql.user;
复制代码

问题3:性能下降
  1. -- 检查慢查询
  2. SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
  3. -- 检查锁争用
  4. SHOW ENGINE INNODB STATUS;
  5. -- 检查资源使用
  6. SHOW GLOBAL STATUS LIKE 'Threads%';
  7. SHOW GLOBAL STATUS LIKE 'Connections%';
  8. SHOW GLOBAL STATUS LIKE 'Key%';
  9. SHOW GLOBAL STATUS LIKE 'Innodb%';
复制代码

问题1:服务器启动失败
  1. # 检查日志
  2. tail -f /var/log/postgresql/postgresql-13.log
  3. # 检查配置文件
  4. sudo -u postgres postgres -D /var/lib/postgresql/13/data -C
  5. # 检查权限
  6. chown -R postgres:postgres /var/lib/postgresql/13/data
复制代码

问题2:连接被拒绝
  1. # 检查服务状态
  2. /etc/init.d/postgresql-13 status
  3. # 检查监听地址
  4. netstat -tuln | grep 5432
  5. # 检查pg_hba.conf
  6. cat /etc/postgresql-13/main/pg_hba.conf
复制代码

问题3:查询性能差
  1. -- 检查活动查询
  2. SELECT * FROM pg_stat_activity WHERE state != 'idle';
  3. -- 检查表统计信息
  4. SELECT schemaname, tablename, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables;
  5. -- 检查索引使用情况
  6. SELECT schemaname, tablename, indexname, idx_scan FROM pg_stat_user_indexes ORDER BY idx_scan;
复制代码

8.2 最佳实践

1. 定期更新系统emerge --sync
emerge -uavDN @world
2. 监控系统资源“`bash使用top命令监控CPU和内存top

定期更新系统
  1. emerge --sync
  2. emerge -uavDN @world
复制代码

监控系统资源“`bash

top

# 使用iotop监控磁盘I/O
   iotop

# 使用nload监控网络流量
   emerge net-analyzer/nload
   nload
  1. 3. **实施日志轮转**
  2.    ```bash
  3.    # 配置logrotate
  4.    nano -w /etc/logrotate.d/mysql
  5.    
  6.    # 示例配置
  7.    /var/log/mysql/*.log {
  8.        daily
  9.        rotate 7
  10.        missingok
  11.        notifempty
  12.        compress
  13.        sharedscripts
  14.        postrotate
  15.            test -x /usr/bin/mysqladmin && /usr/bin/mysqladmin flush-logs
  16.        endscript
  17.    }
复制代码

MariaDB最佳实践

1.
  1. 定期优化表“`sql
  2. – 创建优化事件
  3. CREATE EVENT optimize_tables
  4. ON SCHEDULE EVERY 1 WEEK
  5. STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  6. DO
  7. CALL optimize_tables();
复制代码

– 创建存储过程
   DELIMITER //
   CREATE PROCEDURE optimize_tables()
   BEGIN
  1. DECLARE done INT DEFAULT FALSE;
  2. DECLARE db_name VARCHAR(64);
  3. DECLARE tbl_name VARCHAR(64);
  4. DECLARE cur CURSOR FOR
  5.    SELECT table_schema, table_name
  6.    FROM information_schema.tables
  7.    WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema');
  8. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  9. OPEN cur;
  10. read_loop: LOOP
  11.    FETCH cur INTO db_name, tbl_name;
  12.    IF done THEN
  13.      LEAVE read_loop;
  14.    END IF;
  15.    SET @sql = CONCAT('OPTIMIZE TABLE `', db_name, '`.`', tbl_name, '`');
  16.    PREPARE stmt FROM @sql;
  17.    EXECUTE stmt;
  18.    DEALLOCATE PREPARE stmt;
  19. END LOOP;
  20. CLOSE cur;
复制代码

END //
   DELIMITER ;
  1. 2. **定期备份**
  2.    ```bash
  3.    # 设置cron任务
  4.    crontab -e
  5.    # 0 2 * * * /usr/local/bin/mysql-backup.sh
复制代码

1.
  1. 监控慢查询-- 启用慢查询日志
  2. SET GLOBAL slow_query_log = 'ON';
  3. SET GLOBAL long_query_time = 1;
  4. SET GLOBAL log_queries_not_using_indexes = 'ON';
复制代码
  1. -- 启用慢查询日志
  2. SET GLOBAL slow_query_log = 'ON';
  3. SET GLOBAL long_query_time = 1;
  4. SET GLOBAL log_queries_not_using_indexes = 'ON';
复制代码

PostgreSQL最佳实践

1.
  1. 定期维护“`sql
  2. – 创建维护函数
  3. CREATE OR REPLACE FUNCTION maintenance() RETURNS void AS $\(
  4. DECLARE
  5. rec RECORD;
  6. BEGIN
  7. FOR rec IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' LOOP
  8.    EXECUTE 'VACUUM (ANALYZE, VERBOSE) ' || quote_ident(rec.tablename);
  9. END LOOP;
  10. END;
  11. \)$ LANGUAGE plpgsql;
复制代码

– 设置定期维护
   CREATE EXTENSION IF NOT EXISTS pg_cron;
   SELECT cron.schedule(‘0 3 * * 0’, ‘SELECT maintenance()’);
  1. 2. **定期备份**
  2.    ```bash
  3.    # 设置cron任务
  4.    crontab -e
  5.    # 0 3 * * * /usr/local/bin/postgresql-backup.sh
复制代码

1.
  1. 监控长事务-- 查找长事务
  2. SELECT
  3. pid,
  4. now() - pg_stat_activity.query_start AS duration,
  5. query,
  6. state
  7. FROM pg_stat_activity
  8. WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';
复制代码
  1. -- 查找长事务
  2. SELECT
  3. pid,
  4. now() - pg_stat_activity.query_start AS duration,
  5. query,
  6. state
  7. FROM pg_stat_activity
  8. WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';
复制代码

总结

本指南详细介绍了在Gentoo Linux上构建高性能数据库平台的完整过程,从系统安装、数据库配置到性能优化和安全防护。Gentoo Linux的源码包管理系统为数据库服务器提供了无与伦比的优化潜力,通过适当的配置和调整,可以构建出性能卓越、安全可靠的数据库平台。

关键要点包括:

1. 系统安装与优化:Gentoo Linux的安装虽然复杂,但提供了高度定制化的可能性,允许针对特定硬件进行优化。
2. 数据库选择与配置:根据应用需求选择合适的数据库系统(MariaDB或PostgreSQL),并进行适当的配置。
3. 性能优化:从系统级别到数据库级别进行全面优化,包括内存配置、I/O优化和查询优化。
4. 安全防护:实施多层次的安全措施,包括系统防火墙、数据库用户权限管理和SSL加密。
5. 监控与维护:建立完善的监控体系和备份策略,确保数据库服务器的稳定运行。
6. 高可用性:通过主从复制或流复制实现数据库的高可用性,提高系统的可靠性。

系统安装与优化:Gentoo Linux的安装虽然复杂,但提供了高度定制化的可能性,允许针对特定硬件进行优化。

数据库选择与配置:根据应用需求选择合适的数据库系统(MariaDB或PostgreSQL),并进行适当的配置。

性能优化:从系统级别到数据库级别进行全面优化,包括内存配置、I/O优化和查询优化。

安全防护:实施多层次的安全措施,包括系统防火墙、数据库用户权限管理和SSL加密。

监控与维护:建立完善的监控体系和备份策略,确保数据库服务器的稳定运行。

高可用性:通过主从复制或流复制实现数据库的高可用性,提高系统的可靠性。

通过遵循本指南中的步骤和建议,您可以构建一个高性能、安全可靠的数据库服务器,满足企业级应用的需求。记住,数据库管理是一个持续的过程,需要定期监控、优化和维护,以确保系统始终保持最佳状态。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.