|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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`架构。
- # 示例:下载Gentoo安装介质
- 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安装需要手动分区。对于数据库服务器,建议采用以下分区方案:
- # 查看可用磁盘
- fdisk -l
- # 开始分区(以/dev/sda为例)
- fdisk /dev/sda
- # 创建分区方案示例:
- # /boot 512M
- # swap 8G(或RAM的1-2倍)
- # / 剩余空间
复制代码
1.5 格式化分区并挂载
- # 格式化分区
- mkfs.ext4 /dev/sda1 # /boot
- mkswap /dev/sda2 # swap
- mkfs.ext4 /dev/sda3 # /
- # 挂载分区
- mount /dev/sda3 /mnt/gentoo
- mkdir /mnt/gentoo/boot
- mount /dev/sda1 /mnt/gentoo/boot
- swapon /dev/sda2
复制代码
1.6 安装Gentoo基础系统
- # 下载stage3包
- cd /mnt/gentoo
- links https://www.gentoo.org/downloads/mirrors/
- # 解压stage3包
- tar xvjpf stage3-*.tar.bz2 --xattrs-include='*.*' --numeric-owner
- # 配置编译选项
- nano -w /mnt/gentoo/etc/portage/make.conf
- # 示例make.conf配置:
- CFLAGS="-O2 -pipe -march=native"
- CXXFLAGS="${CFLAGS}"
- MAKEOPTS="-j4" # 根据CPU核心数调整
- USE="bindist mmx sse sse2"
- # 配置镜像源
- mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
- mkdir /mnt/gentoo/etc/portage/repos.conf
- cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf
- # 复制DNS信息
- cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
- # 挂载必要文件系统
- mount -t proc /proc /mnt/gentoo/proc
- mount --rbind /sys /mnt/gentoo/sys
- mount --make-rslave /mnt/gentoo/sys
- mount --rbind /dev /mnt/gentoo/dev
- mount --make-rslave /mnt/gentoo/dev
- # 进入新系统
- chroot /mnt/gentoo /bin/bash
- source /etc/profile
- export PS1="(chroot) ${PS1}"
复制代码
1.7 完成基础安装
- # 同步Portage树
- emerge --sync
- # 选择profile
- eselect profile list
- eselect profile set default/linux/amd64/17.1/server
- # 更新系统
- emerge --update --deep --newuse @world
- # 设置时区
- echo "Asia/Shanghai" > /etc/timezone
- emerge --config sys-libs/timezone-data
- # 配置locale
- nano -w /etc/locale.gen
- # 取消注释 en_US.UTF-8 UTF-8 和 zh_CN.UTF-8 UTF-8
- locale-gen
- eselect locale set en_US.utf8
- env-update && source /etc/profile && export PS1="(chroot) ${PS1}"
- # 安装必要工具
- emerge app-admin/sysklogd app-admin/logrotate sys-process/cronie sys-fs/e2fsprogs sys-process/procps sys-apps/util-linux
- # 配置启动服务
- rc-update add sysklogd default
- rc-update add cronie default
- # 安装内核源码
- emerge sys-kernel/gentoo-sources
- # 配置并编译内核
- cd /usr/src/linux
- make menuconfig
- # 根据硬件配置选择合适的选项
- make && make modules_install
- make install
- # 配置/etc/fstab
- nano -w /etc/fstab
- # 示例fstab条目:
- /dev/sda1 /boot ext4 defaults,noatime 0 2
- /dev/sda2 none swap sw 0 0
- /dev/sda3 / ext4 noatime 0 1
- # 配置网络
- nano -w /etc/conf.d/net
- # 示例网络配置:
- config_eth0="192.168.1.100/24"
- routes_eth0="default via 192.168.1.1"
- # 创建网络符号链接并启动
- cd /etc/init.d
- ln -s net.lo net.eth0
- rc-update add net.eth0 default
- /etc/init.d/net.eth0 start
- # 设置root密码
- passwd
- # 安装引导程序
- emerge sys-boot/grub
- grub-install /dev/sda
- grub-mkconfig -o /boot/grub/grub.cfg
- # 退出chroot并重启
- exit
- cd
- umount -l /mnt/gentoo/dev{/shm,/pts,}
- umount -l /mnt/gentoo{/boot,/proc,}
- reboot
复制代码
第二部分:数据库选择与安装
2.1 数据库选择
在Gentoo Linux上,您可以选择多种数据库系统,包括:
• MySQL/MariaDB:适用于Web应用和传统企业应用
• PostgreSQL:适用于复杂查询和事务处理
• MongoDB:适用于文档存储和大数据应用
• Redis:适用于内存数据结构存储
本指南将以MySQL/MariaDB和PostgreSQL为例进行详细说明。
2.2 安装MariaDB
MariaDB是MySQL的一个分支,具有更好的性能和更多的功能。
- # 设置USE标志
- echo "dev-db/mariadb berkdb extraengine server" >> /etc/portage/package.use/mariadb
- # 安装MariaDB
- emerge dev-db/mariadb
- # 配置数据库
- emerge --config dev-db/mariadb
- # 启动MariaDB服务
- rc-update add mysql default
- /etc/init.d/mysql start
- # 安全初始化
- mysql_secure_installation
复制代码
2.3 安装PostgreSQL
PostgreSQL是一个功能强大的开源对象关系数据库系统。
- # 设置USE标志
- echo "dev-db/postgresql server" >> /etc/portage/package.use/postgresql
- # 安装PostgreSQL
- emerge dev-db/postgresql
- # 初始化数据库
- emerge --config dev-db/postgresql
- # 启动PostgreSQL服务
- rc-update add postgresql-13 default
- /etc/init.d/postgresql-13 start
- # 设置postgres用户密码
- passwd postgres
- # 切换到postgres用户并创建数据库用户
- su - postgres
- createuser --interactive -P
- # 按提示创建新用户
- createdb -O newuser mydatabase
- exit
复制代码
第三部分:基础配置
3.1 MariaDB基础配置
编辑MariaDB配置文件以优化基本设置:
- nano -w /etc/mysql/my.cnf
复制代码
示例配置:
- [mysqld]
- # 基本设置
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
- default-storage-engine = InnoDB
- # 内存设置
- innodb_buffer_pool_size = 2G # 设置为可用RAM的50-70%
- innodb_log_file_size = 256M
- innodb_log_buffer_size = 8M
- key_buffer_size = 64M
- max_connections = 200
- thread_cache_size = 8
- thread_stack = 256K
- # 查询缓存
- query_cache_type = 1
- query_cache_size = 64M
- query_cache_limit = 2M
- # 日志设置
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 2
- log-error = /var/log/mysql/error.log
- # InnoDB设置
- innodb_flush_method = O_DIRECT
- innodb_file_per_table = 1
- innodb_flush_log_at_trx_commit = 2
- innodb_buffer_pool_instances = 4
- # 其他设置
- skip-name-resolve
- max_allowed_packet = 16M
- [mysql]
- default-character-set = utf8mb4
- [client]
- default-character-set = utf8mb4
复制代码
重启MariaDB服务以应用更改:
- /etc/init.d/mysql restart
复制代码
3.2 PostgreSQL基础配置
编辑PostgreSQL配置文件:
- nano -w /etc/postgresql-13/main/postgresql.conf
复制代码
示例配置:
- # 连接设置
- listen_addresses = '*' # 监听所有地址
- max_connections = 200
- superuser_reserved_connections = 3
- # 内存设置
- shared_buffers = 512MB # 设置为可用RAM的25%
- effective_cache_size = 2GB # 设置为可用RAM的50-70%
- work_mem = 8MB
- maintenance_work_mem = 64MB
- # 日志设置
- logging_collector = on
- log_directory = 'pg_log'
- log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
- log_statement = 'none'
- log_duration = on
- log_min_duration_statement = 2000 # 记录执行超过2秒的查询
- # 检查点设置
- checkpoint_segments = 32
- checkpoint_completion_target = 0.9
- checkpoint_timeout = 15min
- # 查询优化
- random_page_cost = 2.0
- effective_io_concurrency = 2
- # 其他设置
- datestyle = 'iso, mdy'
- default_text_search_config = 'pg_catalog.english'
复制代码
配置客户端认证:
- nano -w /etc/postgresql-13/main/pg_hba.conf
复制代码
示例配置:
- # TYPE DATABASE USER ADDRESS METHOD
- local all all trust
- host all all 127.0.0.1/32 md5
- host all all ::1/128 md5
- host all all 0.0.0.0/0 md5
复制代码
重启PostgreSQL服务以应用更改:
- /etc/init.d/postgresql-13 restart
复制代码
第四部分:性能优化
4.1 系统级优化
在开始数据库优化之前,首先对系统进行优化:
- # 编辑sysctl配置
- nano -w /etc/sysctl.conf
复制代码
示例配置:
- # 虚拟内存设置
- vm.swappiness = 10
- vm.dirty_ratio = 15
- vm.dirty_background_ratio = 5
- # 文件系统设置
- fs.file-max = 100000
- fs.inotify.max_user_watches = 100000
- # 网络设置
- net.core.rmem_max = 16777216
- net.core.wmem_max = 16777216
- net.ipv4.tcp_rmem = 4096 87380 16777216
- net.ipv4.tcp_wmem = 4096 65536 16777216
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_keepalive_time = 120
- net.ipv4.tcp_max_syn_backlog = 8192
- net.ipv4.tcp_max_tw_buckets = 200000
- net.ipv4.tcp_no_metrics_save = 1
- net.ipv4.tcp_moderate_rcvbuf = 1
- net.core.netdev_max_backlog = 5000
复制代码
应用sysctl设置:
4.2 磁盘I/O优化
数据库服务器对磁盘I/O要求较高,以下是优化建议:
- # 检查当前I/O调度器
- cat /sys/block/sda/queue/scheduler
- # 临时设置I/O调度器为deadline
- echo deadline > /sys/block/sda/queue/scheduler
- # 永久设置I/O调度器
- echo 'echo deadline > /sys/block/sda/queue/scheduler' >> /etc/local.d/io-scheduler.start
- chmod +x /etc/local.d/io-scheduler.start
- rc-update add local default
- # 使用noatime选项挂载文件系统
- nano -w /etc/fstab
- # 修改相关行,添加noatime选项
- # 例如:/dev/sda3 / ext4 noatime 0 1
复制代码
4.3 MariaDB性能优化
- -- 启用慢查询日志并分析
- SET GLOBAL slow_query_log = 'ON';
- SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
- SET GLOBAL long_query_time = 2;
- -- 使用EXPLAIN分析查询
- EXPLAIN SELECT * FROM mytable WHERE column = 'value';
- -- 创建适当的索引
- CREATE INDEX idx_column ON mytable(column);
- -- 复合索引
- CREATE INDEX idx_column1_column2 ON mytable(column1, column2);
复制代码- -- 优化表
- OPTIMIZE TABLE mytable;
- -- 分析表以更新索引统计信息
- ANALYZE TABLE mytable;
- -- 检查表错误
- CHECK TABLE mytable;
- -- 修复表
- REPAIR TABLE mytable;
复制代码
编辑MariaDB配置文件:
- nano -w /etc/mysql/my.cnf
复制代码
添加或调整以下参数:
- [mysqld]
- # InnoDB优化
- innodb_io_capacity = 2000
- innodb_io_capacity_max = 4000
- innodb_lru_scan_depth = 2000
- innodb_read_io_threads = 8
- innodb_write_io_threads = 8
- innodb_thread_concurrency = 0
- innodb_spin_wait_delay = 6
- # 连接池
- thread_pool_size = 16
- thread_pool_stall_limit = 30
- # 查询优化
- optimizer_search_depth = 0
- optimizer_prune_level = 1
- # 缓冲和缓存
- table_open_cache = 2000
- table_definition_cache = 2000
- innodb_open_files = 2000
- # 复制相关(如果使用复制)
- binlog_format = ROW
- sync_binlog = 0
- innodb_flush_log_at_trx_commit = 2
- slave_net_timeout = 60
复制代码
重启MariaDB服务:
- /etc/init.d/mysql restart
复制代码
4.4 PostgreSQL性能优化
- -- 启用查询日志
- ALTER DATABASE mydatabase SET log_min_duration_statement = 2000;
- -- 使用EXPLAIN分析查询
- EXPLAIN SELECT * FROM mytable WHERE column = 'value';
- -- 更详细的分析
- EXPLAIN ANALYZE SELECT * FROM mytable WHERE column = 'value';
- -- 创建索引
- CREATE INDEX idx_column ON mytable(column);
- -- 复合索引
- CREATE INDEX idx_column1_column2 ON mytable(column1, column2);
- -- 部分索引
- CREATE INDEX idx_partial ON mytable(column) WHERE condition;
- -- 更新表统计信息
- ANALYZE mytable;
- VACUUM ANALYZE mytable;
复制代码- -- 清理表并更新统计信息
- VACUUM (VERBOSE, ANALYZE) mytable;
- -- 重建表(减少碎片和更新统计信息)
- REINDEX TABLE mytable;
- CLUSTER mytable;
- -- 使用pg_repack扩展(需要先安装)
- -- 安装扩展
- CREATE EXTENSION pg_repack;
- -- 在线重组表
- pg_repack -t mytable
复制代码
编辑PostgreSQL配置文件:
- nano -w /etc/postgresql-13/main/postgresql.conf
复制代码
添加或调整以下参数:
- # 内存设置
- shared_buffers = 1GB
- effective_cache_size = 3GB
- work_mem = 16MB
- maintenance_work_mem = 128MB
- wal_buffers = 16MB
- # 检查点设置
- max_wal_size = 2GB
- min_wal_size = 1GB
- checkpoint_completion_target = 0.9
- checkpoint_timeout = 15min
- checkpoint_warning = 30s
- # 查询优化
- random_page_cost = 1.1
- effective_io_concurrency = 200
- max_parallel_workers_per_gather = 4
- max_parallel_workers = 8
- max_parallel_maintenance_workers = 4
- # 连接设置
- max_connections = 300
- superuser_reserved_connections = 3
- # 日志设置
- log_checkpoints = on
- log_connections = on
- log_disconnections = on
- log_lock_waits = on
- log_temp_files = 0
- log_autovacuum_min_duration = 0
- # 自动清理
- autovacuum = on
- autovacuum_max_workers = 4
- autovacuum_naptime = 1min
- autovacuum_vacuum_threshold = 1000
- autovacuum_analyze_threshold = 500
- autovacuum_vacuum_scale_factor = 0.01
- autovacuum_analyze_scale_factor = 0.005
复制代码
重启PostgreSQL服务:
- /etc/init.d/postgresql-13 restart
复制代码
第五部分:安全防护措施
5.1 系统安全加固
- # 安装并配置防火墙
- emerge net-firewall/iptables
- # 创建防火墙规则
- nano -w /etc/iptables/rules-save
复制代码
示例防火墙规则:
- # 清除现有规则
- *filter
- :INPUT ACCEPT [0:0]
- :FORWARD ACCEPT [0:0]
- :OUTPUT ACCEPT [0:0]
- # 允许本地回环
- -A INPUT -i lo -j ACCEPT
- # 允许已建立的连接
- -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- # 允许SSH连接
- -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name ssh
- -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh -j ACCEPT
- # 允许数据库连接(仅限特定IP)
- -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
- -A INPUT -p tcp --dport 5432 -s 192.168.1.0/24 -j ACCEPT
- # 允许ICMP(有限制)
- -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/s -j ACCEPT
- -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
- # 拒绝所有其他入站连接
- -A INPUT -j DROP
- COMMIT
复制代码
应用防火墙规则:
- iptables-restore < /etc/iptables/rules-save
- rc-update add iptables default
- /etc/init.d/iptables save
复制代码
安装并配置fail2ban防止暴力破解:
- emerge net-analyzer/fail2ban
- # 配置fail2ban
- nano -w /etc/fail2ban/jail.conf
复制代码
示例fail2ban配置:
- [DEFAULT]
- bantime = 3600
- findtime = 600
- maxretry = 3
- backend = auto
- [sshd]
- enabled = true
- port = 22
- filter = sshd
- logpath = /var/log/auth.log
- maxretry = 3
- [mysql]
- enabled = true
- port = 3306
- filter = mysql-auth
- logpath = /var/log/mysql/error.log
- maxretry = 3
- [postgresql]
- enabled = true
- port = 5432
- filter = postgresql
- logpath = /var/log/postgresql/postgresql-*.log
- maxretry = 3
复制代码
启动fail2ban服务:
- rc-update add fail2ban default
- /etc/init.d/fail2ban start
复制代码
5.2 MariaDB安全配置
- -- 删除匿名用户
- DROP USER IF EXISTS ''@'localhost';
- DROP USER IF EXISTS ''@'%';
- -- 删除远程root用户
- DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
- -- 删除测试数据库
- DROP DATABASE IF EXISTS test;
- -- 刷新权限
- FLUSH PRIVILEGES;
- -- 为特定应用创建专用用户
- CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'strong_password';
- GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'appuser'@'192.168.1.%';
- FLUSH PRIVILEGES;
- -- 使用SSL连接(如果需要)
- CREATE USER 'ssluser'@'%' IDENTIFIED BY 'password' REQUIRE SSL;
- GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'ssluser'@'%';
- FLUSH PRIVILEGES;
复制代码
配置MariaDB SSL:
复制代码
编辑MariaDB配置文件启用SSL:
- nano -w /etc/mysql/my.cnf
复制代码
添加以下配置:
- [mysqld]
- ssl-ca = /etc/mysql/ssl/ca-cert.pem
- ssl-cert = /etc/mysql/ssl/server-cert.pem
- ssl-key = /etc/mysql/ssl/server-key.pem
复制代码
重启MariaDB服务:
- /etc/init.d/mysql restart
复制代码
5.3 PostgreSQL安全配置
- -- 修改postgres用户密码
- ALTER USER postgres WITH PASSWORD 'strong_password';
- -- 创建专用用户
- CREATE USER appuser WITH PASSWORD 'strong_password';
- ALTER USER appuser CONNECTION LIMIT 20;
- GRANT CONNECT ON DATABASE mydatabase TO appuser;
- GRANT USAGE ON SCHEMA public TO appuser;
- GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO appuser;
- GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO appuser;
- -- 使用SSL连接
- ALTER SYSTEM SET ssl = on;
- ALTER SYSTEM SET ssl_cert_file = '/etc/postgresql/ssl/server-cert.pem';
- ALTER SYSTEM SET ssl_key_file = '/etc/postgresql/ssl/server-key.pem';
- ALTER SYSTEM SET ssl_ca_file = '/etc/postgresql/ssl/ca-cert.pem';
复制代码
配置PostgreSQL SSL:
- # 创建SSL证书目录
- mkdir /etc/postgresql/ssl
- cd /etc/postgresql/ssl
- # 生成CA证书
- openssl genrsa 2048 > ca-key.pem
- openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
- # 创建服务器证书
- openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem
- openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
- # 设置权限
- chmod 600 *.pem
- chown postgres:postgres *.pem
复制代码
编辑PostgreSQL配置文件启用SSL:
- nano -w /etc/postgresql-13/main/postgresql.conf
复制代码
添加以下配置:
- ssl = on
- ssl_cert_file = '/etc/postgresql/ssl/server-cert.pem'
- ssl_key_file = '/etc/postgresql/ssl/server-key.pem'
- ssl_ca_file = '/etc/postgresql/ssl/ca-cert.pem'
复制代码
编辑pg_hba.conf文件要求特定连接使用SSL:
- nano -w /etc/postgresql-13/main/pg_hba.conf
复制代码
添加以下规则:
- # 要求远程连接使用SSL
- hostssl all all 0.0.0.0/0 md5
复制代码
重启PostgreSQL服务:
- /etc/init.d/postgresql-13 restart
复制代码
第六部分:监控与维护
6.1 系统监控工具安装与配置
- # 安装系统监控工具
- emerge app-admin/sysstat app-admin/htop sys-process/iotop net-analyzer/nmap
- # 配置sysstat
- nano -w /etc/conf.d/sysstat
- # 设置收集间隔,例如:HISTORY=7 INTERVAL=10
- # 启动sysstat
- rc-update add sysstat default
- /etc/init.d/sysstat start
- # 安装Zabbix监控(可选)
- emerge net-analyzer/zabbix
复制代码
6.2 数据库监控
- -- 启用性能模式
- UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES';
- UPDATE performance_schema.setup_consumers SET ENABLED = 'YES';
- -- 查看全局状态
- SHOW GLOBAL STATUS;
- -- 查看变量设置
- SHOW GLOBAL VARIABLES;
- -- 查看进程列表
- SHOW FULL PROCESSLIST;
- -- 查看InnoDB状态
- SHOW ENGINE INNODB STATUS;
- -- 查看查询统计
- SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
复制代码
安装Percona Toolkit进行高级监控:
- # 安装Percona Toolkit
- emerge dev-db/percona-toolkit
- # 使用pt-query-digest分析慢查询日志
- pt-query-digest /var/log/mysql/slow.log
- # 使用pt-mysql-summary生成MySQL服务器摘要
- pt-mysql-summary --user=root --password=yourpassword
复制代码- -- 查看活动查询
- SELECT * FROM pg_stat_activity;
- -- 查看数据库统计信息
- SELECT * FROM pg_stat_database;
- -- 查看表统计信息
- SELECT * FROM pg_stat_user_tables;
- -- 查看索引统计信息
- SELECT * FROM pg_stat_user_indexes;
- -- 查看表大小
- SELECT
- schemaname,
- tablename,
- pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
- FROM pg_tables
- ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
- -- 查看长时间运行的查询
- SELECT
- pid,
- now() - pg_stat_activity.query_start AS duration,
- query,
- state
- FROM pg_stat_activity
- WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';
复制代码
安装pgBadger进行日志分析:
- # 安装pgBadger
- emerge app-admin/pgbadger
- # 生成HTML报告
- pgbadger /var/log/postgresql/postgresql-*.log -o /var/www/localhost/htdocs/reports/pgbadger.html
复制代码
6.3 备份策略
使用mysqldump进行逻辑备份:
- # 创建完整备份
- mysqldump --user=root --password=yourpassword --single-transaction --routines --triggers --all-databases > /backup/mysql/mysql-full-backup.sql
- # 压缩备份
- gzip /backup/mysql/mysql-full-backup.sql
- # 仅备份特定数据库
- mysqldump --user=root --password=yourpassword --single-transaction --routines --triggers mydatabase > /backup/mysql/mydatabase-backup.sql
- # 创建备份脚本
- nano -w /usr/local/bin/mysql-backup.sh
复制代码
示例备份脚本:
- #!/bin/bash
- # 设置变量
- DATE=$(date +%Y%m%d)
- BACKUP_DIR="/backup/mysql"
- MYSQL_USER="root"
- MYSQL_PASSWORD="yourpassword"
- RETENTION=7 # 保留7天的备份
- # 创建备份目录
- mkdir -p $BACKUP_DIR/$DATE
- # 执行备份
- mysqldump --user=$MYSQL_USER --password=$MYSQL_PASSWORD --single-transaction --routines --triggers --all-databases | gzip > $BACKUP_DIR/$DATE/mysql-full-backup.sql.gz
- # 删除旧备份
- find $BACKUP_DIR -type d -mtime +$RETENTION -exec rm -rf {} \;
- # 记录日志
- echo "MySQL backup completed on $(date)" >> /var/log/mysql-backup.log
复制代码
设置可执行权限并添加到crontab:
- chmod +x /usr/local/bin/mysql-backup.sh
- crontab -e
- # 添加:0 2 * * * /usr/local/bin/mysql-backup.sh
复制代码
使用Percona XtraBackup进行物理备份(适用于大型数据库):
- # 安装Percona XtraBackup
- emerge dev-db/percona-xtrabackup
- # 创建完整备份
- xtrabackup --backup --user=root --password=yourpassword --target-dir=/backup/mysql/xtrabackup/
- # 准备备份
- xtrabackup --prepare --target-dir=/backup/mysql/xtrabackup/
- # 创建增量备份(基于完整备份)
- xtrabackup --backup --user=root --password=yourpassword --target-dir=/backup/mysql/xtrabackup-inc1 --incremental-basedir=/backup/mysql/xtrabackup/
复制代码
使用pg_dump进行逻辑备份:
- # 创建完整备份
- pg_dumpall -U postgres > /backup/postgresql/pg_dumpall_$(date +%Y%m%d).sql
- # 压缩备份
- gzip /backup/postgresql/pg_dumpall_$(date +%Y%m%d).sql
- # 仅备份特定数据库
- pg_dump -U postgres mydatabase > /backup/postgresql/mydatabase_$(date +%Y%m%d).sql
- # 创建备份脚本
- nano -w /usr/local/bin/postgresql-backup.sh
复制代码
示例备份脚本:
- #!/bin/bash
- # 设置变量
- DATE=$(date +%Y%m%d)
- BACKUP_DIR="/backup/postgresql"
- RETENTION=7 # 保留7天的备份
- # 创建备份目录
- mkdir -p $BACKUP_DIR/$DATE
- # 执行备份
- pg_dumpall -U postgres | gzip > $BACKUP_DIR/$DATE/pg_dumpall.sql.gz
- # 删除旧备份
- find $BACKUP_DIR -type d -mtime +$RETENTION -exec rm -rf {} \;
- # 记录日志
- echo "PostgreSQL backup completed on $(date)" >> /var/log/postgresql-backup.log
复制代码
设置可执行权限并添加到crontab:
- chmod +x /usr/local/bin/postgresql-backup.sh
- crontab -e
- # 添加:0 3 * * * /usr/local/bin/postgresql-backup.sh
复制代码
使用pgBackRest进行高级备份:
- # 安装pgBackRest
- emerge app-admin/pgbackrest
- # 配置pgBackRest
- mkdir -p /etc/pgbackrest
- mkdir -p /var/log/pgbackrest
- mkdir -p /backup/pgbackrest
- # 创建配置文件
- nano -w /etc/pgbackrest/pgbackrest.conf
复制代码
示例pgBackRest配置:
- [global]
- repo1-path=/backup/pgbackrest
- repo1-retention-full=2
- repo1-retention-diff=2
- process-max=2
- log-level-console=info
- log-level-file=debug
- [mycluster]
- db-path=/var/lib/postgresql/13/data
- db-user=postgres
- db-port=5432
复制代码
执行备份:
- # 创建完整备份
- pgBackRest --stanza=mycluster --type=full backup
- # 创建增量备份
- pgBackRest --stanza=mycluster --type=incr backup
- # 查看备份信息
- pgBackRest info
复制代码
第七部分:高可用与复制
7.1 MariaDB主从复制
编辑主服务器配置文件:
- nano -w /etc/mysql/my.cnf
复制代码
添加以下配置:
- [mysqld]
- # 服务器ID
- server-id = 1
- # 启用二进制日志
- log-bin = mysql-bin
- binlog_format = ROW
- binlog_row_image = FULL
- # 设置需要复制的数据库(可选)
- binlog-do-db = mydatabase
- # 设置忽略的数据库(可选)
- binlog-ignore-db = mysql
- binlog-ignore-db = information_schema
- binlog-ignore-db = performance_schema
复制代码
重启MariaDB服务:
- /etc/init.d/mysql restart
复制代码
创建复制用户:
- CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
- GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
- FLUSH PRIVILEGES;
复制代码
锁定数据库并获取二进制日志坐标:
- FLUSH TABLES WITH READ LOCK;
- SHOW MASTER STATUS;
复制代码
记录File和Position的值,然后解锁:
编辑从服务器配置文件:
- nano -w /etc/mysql/my.cnf
复制代码
添加以下配置:
- [mysqld]
- # 服务器ID(必须与主服务器不同)
- server-id = 2
- # 启用中继日志
- relay-log = mysql-relay-bin
- relay-log-index = mysql-relay-bin.index
- # 设置只读(可选)
- read-only = 1
复制代码
重启MariaDB服务:
- /etc/init.d/mysql restart
复制代码
配置复制:
- CHANGE MASTER TO
- MASTER_HOST='master_ip',
- MASTER_USER='repl',
- MASTER_PASSWORD='repl_password',
- MASTER_LOG_FILE='mysql-bin.000001',
- MASTER_LOG_POS=154;
- START SLAVE;
复制代码
检查复制状态:
7.2 PostgreSQL流复制
编辑主服务器配置文件:
- nano -w /etc/postgresql-13/main/postgresql.conf
复制代码
添加以下配置:
- # 连接和认证设置
- listen_addresses = '*'
- max_wal_senders = 3
- max_replication_slots = 3
- wal_level = replica
- wal_keep_segments = 100
- # 归档设置(可选)
- archive_mode = on
- archive_command = 'cp %p /backup/postgresql/archive/%f'
复制代码
编辑pg_hba.conf文件允许复制连接:
- nano -w /etc/postgresql-13/main/pg_hba.conf
复制代码
添加以下规则:
- # 允许复制连接
- host replication replicator 192.168.1.0/24 md5
复制代码
创建复制用户:
- CREATE USER replicator REPLICATION LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD 'replicator_password';
复制代码
重启PostgreSQL服务:
- /etc/init.d/postgresql-13 restart
复制代码
停止从服务器上的PostgreSQL服务:
- /etc/init.d/postgresql-13 stop
复制代码
备份主服务器数据并恢复到从服务器:
- # 使用pg_basebackup创建基础备份
- pg_basebackup -h master_ip -U replicator -D /var/lib/postgresql/13/data -Fp -Xs -P -R
- # 设置正确的权限
- chown -R postgres:postgres /var/lib/postgresql/13/data
复制代码
编辑从服务器配置文件:
- nano -w /etc/postgresql-13/main/postgresql.conf
复制代码
添加以下配置:
- # 设置服务器ID(必须与主服务器不同)
- hot_standby = on
复制代码
编辑standby.signal文件(由pg_basebackup创建):
- nano -w /var/lib/postgresql/13/data/standby.signal
复制代码
确保包含:
启动从服务器:
- /etc/init.d/postgresql-13 start
复制代码
检查复制状态:
- -- 在主服务器上
- SELECT * FROM pg_stat_replication;
- -- 在从服务器上
- SELECT * FROM pg_stat_wal_receiver;
复制代码
第八部分:故障排除与最佳实践
8.1 常见问题与解决方案
问题1:服务器启动失败
- # 检查错误日志
- tail -f /var/log/mysql/error.log
- # 检查配置文件语法
- mysqld --help --verbose
- # 检查权限
- chown -R mysql:mysql /var/lib/mysql
复制代码
问题2:连接超时
- # 检查网络连接
- telnet server_ip 3306
- # 检查防火墙规则
- iptables -L -n
- # 检查MySQL用户权限
- SELECT host, user FROM mysql.user;
复制代码
问题3:性能下降
- -- 检查慢查询
- SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
- -- 检查锁争用
- SHOW ENGINE INNODB STATUS;
- -- 检查资源使用
- SHOW GLOBAL STATUS LIKE 'Threads%';
- SHOW GLOBAL STATUS LIKE 'Connections%';
- SHOW GLOBAL STATUS LIKE 'Key%';
- SHOW GLOBAL STATUS LIKE 'Innodb%';
复制代码
问题1:服务器启动失败
- # 检查日志
- tail -f /var/log/postgresql/postgresql-13.log
- # 检查配置文件
- sudo -u postgres postgres -D /var/lib/postgresql/13/data -C
- # 检查权限
- chown -R postgres:postgres /var/lib/postgresql/13/data
复制代码
问题2:连接被拒绝
- # 检查服务状态
- /etc/init.d/postgresql-13 status
- # 检查监听地址
- netstat -tuln | grep 5432
- # 检查pg_hba.conf
- cat /etc/postgresql-13/main/pg_hba.conf
复制代码
问题3:查询性能差
- -- 检查活动查询
- SELECT * FROM pg_stat_activity WHERE state != 'idle';
- -- 检查表统计信息
- SELECT schemaname, tablename, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables;
- -- 检查索引使用情况
- 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
定期更新系统
- emerge --sync
- emerge -uavDN @world
复制代码
监控系统资源“`bash
top
# 使用iotop监控磁盘I/O
iotop
# 使用nload监控网络流量
emerge net-analyzer/nload
nload
- 3. **实施日志轮转**
- ```bash
- # 配置logrotate
- nano -w /etc/logrotate.d/mysql
-
- # 示例配置
- /var/log/mysql/*.log {
- daily
- rotate 7
- missingok
- notifempty
- compress
- sharedscripts
- postrotate
- test -x /usr/bin/mysqladmin && /usr/bin/mysqladmin flush-logs
- endscript
- }
复制代码
MariaDB最佳实践
1. - 定期优化表“`sql
- – 创建优化事件
- CREATE EVENT optimize_tables
- ON SCHEDULE EVERY 1 WEEK
- STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
- DO
- CALL optimize_tables();
复制代码
– 创建存储过程
DELIMITER //
CREATE PROCEDURE optimize_tables()
BEGIN
- DECLARE done INT DEFAULT FALSE;
- DECLARE db_name VARCHAR(64);
- DECLARE tbl_name VARCHAR(64);
- DECLARE cur CURSOR FOR
- SELECT table_schema, table_name
- FROM information_schema.tables
- WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema');
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
- OPEN cur;
- read_loop: LOOP
- FETCH cur INTO db_name, tbl_name;
- IF done THEN
- LEAVE read_loop;
- END IF;
- SET @sql = CONCAT('OPTIMIZE TABLE `', db_name, '`.`', tbl_name, '`');
- PREPARE stmt FROM @sql;
- EXECUTE stmt;
- DEALLOCATE PREPARE stmt;
- END LOOP;
- CLOSE cur;
复制代码
END //
DELIMITER ;
- 2. **定期备份**
- ```bash
- # 设置cron任务
- crontab -e
- # 0 2 * * * /usr/local/bin/mysql-backup.sh
复制代码
1. - 监控慢查询-- 启用慢查询日志
- SET GLOBAL slow_query_log = 'ON';
- SET GLOBAL long_query_time = 1;
- SET GLOBAL log_queries_not_using_indexes = 'ON';
复制代码- -- 启用慢查询日志
- SET GLOBAL slow_query_log = 'ON';
- SET GLOBAL long_query_time = 1;
- SET GLOBAL log_queries_not_using_indexes = 'ON';
复制代码
PostgreSQL最佳实践
1. - 定期维护“`sql
- – 创建维护函数
- CREATE OR REPLACE FUNCTION maintenance() RETURNS void AS $\(
- DECLARE
- rec RECORD;
- BEGIN
- FOR rec IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' LOOP
- EXECUTE 'VACUUM (ANALYZE, VERBOSE) ' || quote_ident(rec.tablename);
- END LOOP;
- END;
- \)$ LANGUAGE plpgsql;
复制代码
– 设置定期维护
CREATE EXTENSION IF NOT EXISTS pg_cron;
SELECT cron.schedule(‘0 3 * * 0’, ‘SELECT maintenance()’);
- 2. **定期备份**
- ```bash
- # 设置cron任务
- crontab -e
- # 0 3 * * * /usr/local/bin/postgresql-backup.sh
复制代码
1. - 监控长事务-- 查找长事务
- SELECT
- pid,
- now() - pg_stat_activity.query_start AS duration,
- query,
- state
- FROM pg_stat_activity
- WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';
复制代码- -- 查找长事务
- SELECT
- pid,
- now() - pg_stat_activity.query_start AS duration,
- query,
- state
- FROM pg_stat_activity
- 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加密。
监控与维护:建立完善的监控体系和备份策略,确保数据库服务器的稳定运行。
高可用性:通过主从复制或流复制实现数据库的高可用性,提高系统的可靠性。
通过遵循本指南中的步骤和建议,您可以构建一个高性能、安全可靠的数据库服务器,满足企业级应用的需求。记住,数据库管理是一个持续的过程,需要定期监控、优化和维护,以确保系统始终保持最佳状态。
版权声明
1、转载或引用本网站内容(Gentoo Linux数据库服务器搭建指南从零开始构建高性能数据库平台详解安装配置优化及安全防护措施)须注明原网址及作者(威震华夏关云长),并标明本网站网址(https://www.pixtech.cc/)。
2、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任。
3、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利。
本文地址: https://www.pixtech.cc/thread-31432-1-1.html
|
|